毛坯库存同步功能,毛坯库存盘点功能,物料清单毛坯号查询功能,版本不稳定,需要一定时间测试

This commit is contained in:
赵正易 2024-07-11 10:41:17 +08:00
parent 13cf1be5a7
commit 5ca9d57566
9 changed files with 352 additions and 60 deletions

View File

@ -109,7 +109,7 @@ namespace ZR.Admin.WebApi.Controllers
}
catch (Exception ex)
{
return ToResponse(new ApiResult(500, ex.Message, "添加记录失败"));
return ToResponse(new ApiResult(500, ex.Message, "添加入库记录失败"));
}
}
@ -153,7 +153,76 @@ namespace ZR.Admin.WebApi.Controllers
}
catch (Exception ex)
{
return ToResponse(new ApiResult(500, ex.Message, "添加记录失败"));
return ToResponse(new ApiResult(500, ex.Message, "添加出库记录失败"));
}
}
/// <summary>
/// 3.盘点库存
/// </summary>
/// <param name="fkBlankInventoryId">库存id</param>
/// <param name="blankNum">毛坯号</param>
/// <param name="changeQuantity">变动量</param>
/// <param name="actionTime">操作时间(出库时间)</param>
/// <param name="remark">备注</param>
/// <returns></returns>
[HttpGet("doStocktakingBlankInventory")]
public IActionResult DoStocktakingBlankInventory(
string fkBlankInventoryId,
string blankNum,
int changeQuantity,
string remark,
DateTime? actionTime
)
{
try
{
if (string.IsNullOrEmpty(fkBlankInventoryId))
{
return ToResponse(new ApiResult(500, "库存id为空!", "库存id为空!"));
}
if (string.IsNullOrEmpty(blankNum))
{
return ToResponse(new ApiResult(500, "毛坯号为空!", "毛坯号为空!"));
}
var response = _WmBlankRecordService.DoStocktakingBlankInventory(
fkBlankInventoryId,
blankNum,
changeQuantity,
HttpContext.GetName(),
remark,
actionTime
);
return SUCCESS(response);
}
catch (Exception ex)
{
return ToResponse(new ApiResult(500, ex.Message, "添加盘点记录失败"));
}
}
/// <summary>
/// 4.根据工单号出库毛坯
/// </summary>
[HttpGet("doOutboundByWorkOrderId")]
public IActionResult DoOutboundByWorkOrderId(string workOrderId)
{
try
{
if (string.IsNullOrEmpty(workOrderId))
{
return ToResponse(new ApiResult(500, "工单id为空!", "工单id为空!"));
}
var response = _WmBlankRecordService.DoOutboundByWorkOrderId(
workOrderId,
0,
HttpContext.GetName()
);
return SUCCESS(response);
}
catch (Exception ex)
{
return ToResponse(new ApiResult(500, ex.Message, "根据工单号出库毛坯失败"));
}
}

View File

@ -16,6 +16,7 @@ namespace ZR.Service.mes.wms.IService
WmBlankInventory AddWmBlankInventory(WmBlankInventory parm);
int UpdateWmBlankInventory(WmBlankInventory parm);
/// <summary>
/// 数据与物料清单同步
/// </summary>

View File

@ -17,6 +17,7 @@ namespace ZR.Service.mes.wms.IService
WmBlankRecord AddWmBlankRecord(WmBlankRecord parm);
int UpdateWmBlankRecord(WmBlankRecord parm);
/// <summary>
/// 入库
/// </summary>
@ -35,6 +36,7 @@ namespace ZR.Service.mes.wms.IService
string remark,
DateTime? actionTime
);
/// <summary>
/// 出库
/// </summary>
@ -53,5 +55,26 @@ namespace ZR.Service.mes.wms.IService
string remark,
DateTime? actionTime
);
/// <summary>
/// 库存盘点
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
int DoStocktakingBlankInventory(
string fkBlankInventoryId,
string blankNum,
int changeQuantity,
string username,
string remark,
DateTime? actionTime
);
/// <summary>
/// 根据工单出库毛坯
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
int DoOutboundByWorkOrderId(string workOrderId, int changeQuantity, string username);
}
}

View File

@ -1,7 +1,8 @@
using Infrastructure.Attribute;
using SqlSugar;
using System;
using System.Linq;
using Infrastructure.Attribute;
using JinianNet.JNTemplate;
using SqlSugar;
using ZR.Model;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms.Dto;
@ -13,7 +14,10 @@ namespace ZR.Service.mes.wms
/// <summary>
/// 毛坯库存表Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IWmBlankInventoryService), ServiceLifetime = LifeTime.Transient)]
[AppService(
ServiceType = typeof(IWmBlankInventoryService),
ServiceLifetime = LifeTime.Transient
)]
public class WmBlankInventoryService : BaseService<WmBlankInventory>, IWmBlankInventoryService
{
/// <summary>
@ -23,11 +27,14 @@ namespace ZR.Service.mes.wms
/// <returns></returns>
public PagedInfo<WmBlankInventoryDto> GetList(WmBlankInventoryQueryDto parm)
{
var predicate = Expressionable.Create<WmBlankInventory>()
.AndIF(!string.IsNullOrEmpty(parm.BlankNum), it => it.BlankNum.Contains(parm.BlankNum))
var predicate = Expressionable
.Create<WmBlankInventory>()
.AndIF(
!string.IsNullOrEmpty(parm.BlankNum),
it => it.BlankNum.Contains(parm.BlankNum)
)
.AndIF(parm.Status > -1, it => it.Status == parm.Status)
.AndIF(parm.Type > 0, it => it.Type == parm.Type)
;
.AndIF(parm.Type > 0, it => it.Type == parm.Type);
var response = Queryable()
.Where(predicate.ToExpression())
@ -37,10 +44,11 @@ namespace ZR.Service.mes.wms
{
foreach (WmBlankInventoryDto item in response.Result)
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.BlankNum == item.BlankNum)
.Where(it => it.Type == 2)
.First();
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.BlankNum == item.BlankNum)
.Where(it => it.Type == 2)
.First();
if (material == null)
{
item.Description = "此毛坯号不在物料清单内!";
@ -50,13 +58,14 @@ namespace ZR.Service.mes.wms
item.Unit = material.Unit;
item.Version = material.Version;
item.Specification = material.Specification;
item.Description = !string.IsNullOrEmpty(material.Description) ? material.Description : material.ProductName;
item.Description = !string.IsNullOrEmpty(material.Description)
? material.Description
: material.ProductName;
}
}
return response;
}
/// <summary>
/// 获取详情
/// </summary>
@ -64,9 +73,7 @@ namespace ZR.Service.mes.wms
/// <returns></returns>
public WmBlankInventory GetInfo(string Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
var response = Queryable().Where(x => x.Id == Id).First();
return response;
}
@ -78,10 +85,11 @@ namespace ZR.Service.mes.wms
/// <returns></returns>
public WmBlankInventory AddWmBlankInventory(WmBlankInventory model)
{
bool hasRecord = Context.Queryable<WmBlankInventory>()
.Where(it => it.BlankNum == model.BlankNum)
.Where(it => it.Type == model.Type)
.Any();
bool hasRecord = Context
.Queryable<WmBlankInventory>()
.Where(it => it.BlankNum == model.BlankNum)
.Where(it => it.Type == model.Type)
.Any();
if (hasRecord)
{
throw new Exception("毛坯仓库已有相同类别的毛坯号记录");
@ -121,13 +129,15 @@ namespace ZR.Service.mes.wms
try
{
int num = 0;
List<WmMaterial> materials = Context.Queryable<WmMaterial>()
.Where(it => it.Type == 2)
.Where(it => !string.IsNullOrEmpty(it.BlankNum))
.OrderBy(it => it.BlankNum)
.ToList();
List<WmMaterial> materials = Context
.Queryable<WmMaterial>()
.Where(it => it.Type == 2)
.Where(it => !string.IsNullOrEmpty(it.BlankNum))
.OrderBy(it => it.BlankNum)
.ToList();
var uniqueBlankNums = materials.Select(m => m.BlankNum).Distinct().ToList();
var wmBlankInventories = Context.Queryable<WmBlankInventory>()
var wmBlankInventories = Context
.Queryable<WmBlankInventory>()
.Where(it => uniqueBlankNums.Contains(it.BlankNum))
.ToList()
.GroupBy(it => it.BlankNum)
@ -135,22 +145,44 @@ namespace ZR.Service.mes.wms
foreach (WmMaterial item in materials)
{
int result = 0;
if (!wmBlankInventories.TryGetValue(item.BlankNum, out WmBlankInventory wmBlank))
if (
!wmBlankInventories.TryGetValue(item.BlankNum, out WmBlankInventory wmBlank)
)
{
// 没有找到匹配的BlankNum添加两种类型的库存
result += AddBlankInventory(item.BlankNum, 1, parm.CreatedBy, parm.CreatedTime);
result += AddBlankInventory(item.BlankNum, 2, parm.CreatedBy, parm.CreatedTime);
// 没有找到匹配的BlankNum添加两种类型的库存
result += AddBlankInventory(
item.BlankNum,
1,
parm.CreatedBy,
parm.CreatedTime
);
result += AddBlankInventory(
item.BlankNum,
2,
parm.CreatedBy,
parm.CreatedTime
);
}
else
{
// 找到了匹配的BlankNum根据Type添加库存
// 找到了匹配的BlankNum根据Type添加库存
if (wmBlank.Type == 1)
{
result = AddBlankInventory(item.BlankNum, 2, parm.CreatedBy, parm.CreatedTime);
result = AddBlankInventory(
item.BlankNum,
2,
parm.CreatedBy,
parm.CreatedTime
);
}
else
{
result = AddBlankInventory(item.BlankNum, 1, parm.CreatedBy, parm.CreatedTime);
result = AddBlankInventory(
item.BlankNum,
1,
parm.CreatedBy,
parm.CreatedTime
);
}
}
if (result > 0)
@ -164,43 +196,50 @@ namespace ZR.Service.mes.wms
{
throw new Exception("同步异常:" + ex.Message);
}
}
/// <summary>
/// 自动添加毛坯库存记录
/// </summary>
/// <param name="blankNum"></param>
/// <param name="type"></param>
/// <returns></returns>
public int AddBlankInventory(string blankNum, int type, string createBy = "", DateTime? createTime = null)
public int AddBlankInventory(
string blankNum,
int type,
string createBy = "",
DateTime? createTime = null
)
{
bool hasRecord = Context.Queryable<WmBlankInventory>()
.Where(it => it.BlankNum == blankNum)
.Where(it => it.Type == type)
.Any();
bool hasRecord = Context
.Queryable<WmBlankInventory>()
.Where(it => it.BlankNum == blankNum)
.Where(it => it.Type == type)
.Any();
if (hasRecord)
{
return 0;
}
WmBlankInventory wmBlank = new()
{
Id = SnowFlakeSingle.Instance.NextId().ToString(),
FkPaintId = string.Empty,
BlankNum = blankNum,
Quantity = 0,
MaxNum = 0,
MinNum = 0,
WarnNum = 0,
Type = type,
Status = 1,
Remark = string.Empty,
CreatedBy = createBy,
CreatedTime = createTime,
UpdatedBy = createBy,
UpdatedTime = createTime,
};
WmBlankInventory wmBlank =
new()
{
Id = SnowFlakeSingle.Instance.NextId().ToString(),
FkPaintId = string.Empty,
BlankNum = blankNum,
Quantity = 0,
MaxNum = 0,
MinNum = 0,
WarnNum = 0,
Type = type,
Status = 1,
Remark = string.Empty,
CreatedBy = createBy,
CreatedTime = createTime,
UpdatedBy = createBy,
UpdatedTime = createTime,
};
return Context.Insertable(wmBlank).ExecuteCommand();
}
}
}
}

View File

@ -1,7 +1,9 @@
using System;
using Infrastructure.Attribute;
using Model.DBModel;
using SqlSugar;
using ZR.Model;
using ZR.Model.MES.pro;
using ZR.Model.MES.wms;
using ZR.Model.MES.wms.Dto;
using ZR.Repository;
@ -56,7 +58,7 @@ namespace ZR.Service.mes.wms
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.BlankNum == item.BlankNum)
.Where(it => it.Remarks == "毛坯")
.Where(it => it.Type == 2)
.First();
if (material == null)
{
@ -239,5 +241,151 @@ namespace ZR.Service.mes.wms
}
return resut;
}
/// <summary>
/// 盘点库存
/// </summary>
/// <param name="fkBlankInventoryId"></param>
/// <param name="blankNum"></param>
/// <param name="changeQuantity"></param>
/// <param name="username"></param>
/// <param name="remark"></param>
/// <param name="actionTime"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public int DoStocktakingBlankInventory(
string fkBlankInventoryId,
string blankNum,
int changeQuantity,
string username,
string remark,
DateTime? actionTime
)
{
try
{
Context.Ado.BeginTran();
DateTime nowTime = DateTime.Now.ToLocalTime();
// 原始数据记录
WmBlankInventory oldInfo = Context
.Queryable<WmBlankInventory>()
.Where(it => it.Id == fkBlankInventoryId)
.First();
if (oldInfo == null)
{
throw new Exception("毛坯记录不存在!");
}
WmBlankInventory updateInfo =
new()
{
Id = fkBlankInventoryId,
Quantity = changeQuantity,
UpdatedBy = username,
UpdatedTime = nowTime
};
int res1 = Context
.Updateable(updateInfo)
.IgnoreColumns(ignoreAllNullColumns: true)
.ExecuteCommand();
WmBlankRecord res =
new()
{
Id = SnowFlakeSingle.Instance.NextId().ToString(),
FkBlankInventoryId = fkBlankInventoryId,
BlankNum = blankNum,
ChangeQuantity = changeQuantity,
Type = 4,
Status = 1,
ActionTime = actionTime,
Remark =
remark + "\n自动添加备注盘点原箱数" + oldInfo.Quantity + ",新箱数" + changeQuantity,
CreatedBy = username,
CreatedTime = nowTime
};
//填写库存记录
Context.Insertable(res).ExecuteCommand();
Context.Ado.CommitTran();
return res1;
}
catch (Exception e)
{
Context.Ado.RollbackTran();
throw new Exception(e.Message);
}
}
public int DoOutboundByWorkOrderId(string workOrderId, int changeQuantity, string username)
{
try
{
Context.Ado.BeginTran();
int type = 1;
DateTime nowTime = DateTime.Now.ToLocalTime();
// 提出工单
ProWorkorder_v2 workOrderInfo = Context
.Queryable<ProWorkorder_v2>()
.Where(it => it.ClientWorkorder == workOrderId)
.First();
if (workOrderInfo == null)
{
throw new Exception("工单记录不存在!" + workOrderId);
}
if (workOrderInfo.Remark1.Contains("返工"))
{
type = 2;
}
// 根据工单查看毛坯库存数据记录
WmBlankInventory blankInventory = Context
.Queryable<WmBlankInventory>()
.Where(it => it.BlankNum == workOrderInfo.BlankNumber)
.Where(it => it.Status == 1)
.Where(it => it.Type == type)
.First();
if (blankInventory == null)
{
throw new Exception("毛坯记录不存在!请检查毛坯仓库,毛坯号:" + workOrderInfo.BlankNumber);
}
WmBlankInventory updateInfo =
new()
{
Id = blankInventory.Id,
Quantity = blankInventory.Quantity - workOrderInfo.PreviousNumber,
UpdatedBy = username,
UpdatedTime = nowTime
};
int res1 = Context
.Updateable(updateInfo)
.IgnoreColumns(ignoreAllNullColumns: true)
.ExecuteCommand();
WmBlankRecord res =
new()
{
Id = SnowFlakeSingle.Instance.NextId().ToString(),
FkBlankInventoryId = blankInventory.Id,
BlankNum = blankInventory.BlankNum,
ChangeQuantity = workOrderInfo.PreviousNumber,
Type = 2,
Status = 1,
ActionTime = nowTime,
Remark =
"自动添加备注:工单号"
+ workOrderId
+ ",上件数"
+ workOrderInfo.PreviousNumber
+ "包装完成自动出库。",
CreatedBy = username,
CreatedTime = nowTime
};
//添加库存记录
Context.Insertable(res).ExecuteCommand();
Context.Ado.CommitTran();
return res1;
}
catch (Exception e)
{
Context.Ado.RollbackTran();
throw new Exception(e.Message);
}
}
}
}

View File

@ -54,6 +54,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -100,6 +101,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -155,6 +157,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -201,6 +204,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -258,6 +262,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -306,6 +311,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -361,6 +367,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -406,6 +413,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{
@ -499,6 +507,7 @@ namespace ZR.Service.Business
{
WmMaterial material = Context.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{

View File

@ -78,6 +78,7 @@ namespace ZR.Service.mes.wms
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.Partnumber == item.Partnumber)
.Where(it => it.Type == 1)
.First();
if (material == null)
{

View File

@ -32,6 +32,7 @@ namespace ZR.Service.mes.wms
partnumberByDescription = Context
.Queryable<WmMaterial>()
.Where(it => it.Description.Contains(parm.Description))
.Where(it => it.Type == 1)
.Select(it => it.Partnumber)
.ToList();
}

View File

@ -25,6 +25,7 @@ namespace ZR.Service.mes.wms
var predicate = Expressionable.Create<WmMaterial>()
.AndIF(parm.Partnumber != null, it => it.Partnumber.Contains(parm.Partnumber))
.AndIF(parm.U8InventoryCode != null, it => it.U8InventoryCode.Contains(parm.U8InventoryCode))
.AndIF(parm.BlankNum != null, it => it.BlankNum.Contains(parm.BlankNum))
.AndIF(parm.ProductName != null, it => it.ProductName.Contains(parm.ProductName))
.AndIF(parm.Color != null, it => it.Color.Contains(parm.Color))
.AndIF(parm.Specification != null, it => it.Specification.Contains(parm.Specification))