分拣、工位bom、现场问题处理

This commit is contained in:
2024-09-29 10:20:22 +08:00
parent cd06d414bc
commit b44b349544
26 changed files with 701 additions and 288 deletions

View File

@@ -0,0 +1,8 @@
using JNPF.Common.Filter;
namespace Tnb.ProductionMgr.Entities.Dto.PrdManage
{
public class WmsSortingtaskListOutput : PageInputBase
{
}
}

View File

@@ -1167,7 +1167,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
target = targetConfigs.First();
// 计算当前料架区的满托数量
int? maxnum = ckdRemainBindRackNum > target.maxracknum ? ckdRemainBindRackNum % target.maxracknum : ckdRemainBindRackNum;
int? maxnum = ckdRemainBindRackNum > target.maxracknum ? target.maxracknum : ckdRemainBindRackNum;
// 更新 转库单、满托数量
LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】为条码 {barcode} 所在的转库单 {ckdCode} 占用了一个空闲料架");
@@ -2724,6 +2724,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
stopwatch.Start();
try
{
var WmsMaterialkit = await db_WmsMaterialkit.Queryable<BasFactoryConfig>().Where(p => p.key == "WmsMaterialkit").FirstAsync();
// 0则不进行移转
if (WmsMaterialkit != null && WmsMaterialkit.value == "0")
{
return;
}
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行生成物料齐套配送记录");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行生成物料齐套配送记录");
@@ -2743,7 +2749,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
}
await db_WmsMaterialkit.Ado.BeginTranAsync();
WmsMaterialkitRecordH wmsMaterialkitRecordH = await db_WmsMaterialkit.Queryable<WmsMaterialkitRecordH>().Where(r => (r.status == WmsWareHouseConst.BILLSTATUS_ADD_ID || r.status == WmsWareHouseConst.BILLSTATUS_ON_ID)
WmsMaterialkitRecordH wmsMaterialkitRecordH = await db_WmsMaterialkit.Queryable<WmsMaterialkitRecordH>().Where(r => (r.status == WmsWareHouseConst.BILLSTATUS_ADD_ID || r.status == WmsWareHouseConst.BILLSTATUS_ON_ID || r.status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID)
&& r.workstation_id == prdMoTask.workstation_id).FirstAsync();
LoggerWmsMaterialkit.LogInformation($"查找任务单{prdMoTask.mo_task_code}的物料配送记录:{JsonConvert.SerializeObject(wmsMaterialkitRecordH)}");
@@ -2779,23 +2785,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
wmsMaterialkitRecordH.times = 0;
wmsMaterialkitRecordH.total_time = 0;
BasMbom basMbom = await db_WmsMaterialkit.Queryable<BasMbom>().Where(r => r.id == prdMoTask.bom_id).FirstAsync();
if (basMbom == null)
WmsStationBom wmsStationBom = await db_WmsMaterialkit.Queryable<WmsStationBom>().Where(r => r.product_id == prdMoTask.material_id
&& r.station_id == prdMoTask.workstation_id).FirstAsync();
if (wmsStationBom == null)
{
LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的生产Bom id{prdMoTask.bom_id}找不到对应的生产Bom资料");
LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的工位{workstaiondic[prdMoTask.workstation_id]}以及物料id{prdMoTask.material_id}找不到对应的工位Bom资料");
continue;
}
List<BasMbomInput> basMbomInputs = await db_WmsMaterialkit.Queryable<BasMbomInput>().Where(r => r.mbom_id == basMbom.id).ToListAsync();
List<BasMaterial> materials = await db_WmsMaterialkit.Queryable<BasMaterial>().Where(r => basMbomInputs.Select(x => x.material_id).Contains(r.id)).ToListAsync();
LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的生产Bom{prdMoTask.bom_id}找到对应的生产Bom清单{string.Join(',', basMbomInputs.Select(r => r.material_id))}");
List<WmsStationBomD> wmsStationBomD = await db_WmsMaterialkit.Queryable<WmsStationBomD>().Where(r => r.p_id == wmsStationBom.id).ToListAsync();
List<BasMaterial> materials = await db_WmsMaterialkit.Queryable<BasMaterial>().Where(r => wmsStationBomD.Select(x => x.material_id).Contains(r.id)).ToListAsync();
LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的工位{workstaiondic[prdMoTask.workstation_id]}找到对应的工位Bom清单{string.Join(',', wmsStationBomD.Select(r => r.material_id))}");
List<WmsMaterialkitRecordD> wmsMaterialkitRecordDs = new List<WmsMaterialkitRecordD>();
foreach (BasMbomInput input in basMbomInputs)
foreach (WmsStationBomD input in wmsStationBomD)
{
BasMaterial material = materials.Where(r => r.id == input.material_id).First();
if (material == null)
{
LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的生产Bom id{prdMoTask.bom_id}下的物料id{input.material_id}在物料档案中不存在");
LoggerWmsMaterialkit.LogWarning($"任务单{prdMoTask.mo_task_code}绑定的工位Bom 产品{wmsStationBom.product_code} 工位 {wmsStationBom.station_code} 下的明细物料id{input.material_id}在物料档案中不存在");
continue;
}
@@ -2874,7 +2881,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
return newinventory;
});
// 查询已有库存 (多工单情况下要考虑库存是否被其它工单预留 暂定)
decimal? exists_qty = inventory.Sum(r => r.codeqty);
@@ -2925,6 +2931,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
.Where(r => wmsMaterialTransfers.Select(x => x.id).Contains(r.bill_id) && r.station_code == workstaiondic[wmsMaterialkitRecord.workstation_id].ToString()).OrderBy(r => r.id).ToListAsync();
List<WmsMaterialkitRecordD> wmsMaterialkitRecordDs = await db_WmsMaterialkit.Queryable<WmsMaterialkitRecordD>()
.Where(r => r.bill_id == wmsMaterialkitRecord.id && r.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID && r.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID).ToListAsync();
List<WmsMaterialkitRecordT> wmsMaterialkitRecordTs = new List<WmsMaterialkitRecordT>();
foreach (WmsMaterialkitRecordD wmsMaterialkitRecordD in wmsMaterialkitRecordDs)
{
Stopwatch stopwatch2 = new Stopwatch();
@@ -2936,10 +2944,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
List<WmsMaterialTransferD> _wmsMaterialTransferDs = wmsMaterialTransferDs.Where(r => r.material_id == wmsMaterialkitRecordD.material_id).ToList();
await db_WmsMaterialkit.Ado.BeginTranAsync();
decimal? xf_qty = 0;
LoggerWmsMaterialkit.LogWarning($"物料齐套计划{wmsMaterialkitRecord.bill_code} 绑定工位{workstaiondic[wmsMaterialkitRecord.workstation_id].ToString()}的料箱物料{wmsMaterialkitRecordD.material_code} 可使用转库单明细为{string.Join(',', _wmsMaterialTransferDs.Select(r => r.id))}");
foreach (WmsMaterialTransferD _wmsMaterialTransferD in _wmsMaterialTransferDs)
{
if (need_qty <= 0)
break;
DateTime startTime = DateTime.Now;
// 转库单可以下发的数量
decimal? zkcan_qty = _wmsMaterialTransferD.qty - _wmsMaterialTransferD.yxfqty;
// 可以下发的数量
@@ -2948,21 +2958,37 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
can_qty = zkcan_qty < need_qty ? zkcan_qty : need_qty;
// 查询库存是否有可以下发数量的库存(同批次)
// 中储仓库存
OutStockStrategyQuery outStockStrategyInput = new()
OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new()
{
warehouse_id = WmsWareHouseConst.WAREHOUSE_ZC_ID,
material_id = _wmsMaterialTransferD.material_id,
code_batch = _wmsMaterialTransferD.code_batch
code_batch = _wmsMaterialTransferD.code_batch,
needOut = can_qty,
material_code = _wmsMaterialTransferD.material_code,
endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 }
};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
List<WmsCarryCode> wmsCarryCodes = await db_WmsMaterialkit.Queryable<WmsCarryCode>()
.Where(r => r.material_id == _wmsMaterialTransferD.material_id && r.code_batch == _wmsMaterialTransferD.code_batch
List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = null;
try
{
carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
}
catch(Exception ex)
{
LoggerWmsMaterialkit.LogWarning($"物料齐套计划{wmsMaterialkitRecord.bill_code} 绑定工位{workstaiondic[wmsMaterialkitRecord.workstation_id].ToString()}的料箱{ex.Message}");
continue;
}
List<WmsCarryH> items = carrys.Select(r => r.Item1).ToList();
List<WmsCarryCode> wmsCarryCodes = await db_WmsMaterialkit.Queryable<WmsCarryCode>()
.Where(r => r.material_id == _wmsMaterialTransferD.material_id && r.code_batch == _wmsMaterialTransferD.code_batch
&& items.Select(x => x.id).Contains(r.carry_id)).ToListAsync();
decimal? inv_qty = wmsCarryCodes.Sum(r => r.codeqty);
decimal? inv_qty = carrys.Sum(r => r.Item2);
can_qty = inv_qty > can_qty ? can_qty : inv_qty;
LoggerWmsMaterialkit.LogWarning($"转库单id{_wmsMaterialTransferD.bill_id} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库时可出数量为{can_qty}");
WmsMaterialTransfer wmsMaterialTransfer = await db_WmsMaterialkit.Queryable<WmsMaterialTransfer>().Where(r => r.id == _wmsMaterialTransferD.bill_id).FirstAsync();
LoggerWmsMaterialkit.LogWarning($"转库单{wmsMaterialTransfer.bill_code} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库时出库的物料数量为{carrys.Sum(r => r.Item2)}其中需要的数量为{inv_qty}");
if (can_qty <= 0)
{
LoggerWmsMaterialkit.LogWarning($"物料齐套计划{wmsMaterialkitRecord.bill_code} 绑定工位{workstaiondic[wmsMaterialkitRecord.workstation_id].ToString()}的料箱物料{_wmsMaterialTransferD.material_code} 可下发数量为0");
continue;
}
MaterialTransferDDistributeToZCCInput input = new MaterialTransferDDistributeToZCCInput();
@@ -2972,15 +2998,45 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
WarehouseMgr.Entities.Dto.Outputs.Result result = await _wmsMaterialTransferService.DistributeDetailToZCC(input);
if (result.code.ToString() != "OK")
{
LoggerWmsMaterialkit.LogWarning($"转库单id{_wmsMaterialTransferD.bill_id} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库时数量不匹配!");
LoggerWmsMaterialkit.LogWarning($"转库单{wmsMaterialTransfer.bill_code} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库时数量不匹配!");
continue;
}
LoggerWmsMaterialkit.LogWarning($"转库单{wmsMaterialTransfer.bill_code} 明细id{_wmsMaterialTransferD.id} 物料{_wmsMaterialTransferD.material_code} 批次{_wmsMaterialTransferD.code_batch} 中储仓出库料箱为{string.Join(',', items.Select(x => x.carry_code))}");
DateTime endTime = DateTime.Now;
WmsMaterialkitRecordT wmsMaterialkitRecordT = new WmsMaterialkitRecordT();
wmsMaterialkitRecordT.create_id = WmsWareHouseConst.AdministratorUserId;
wmsMaterialkitRecordT.create_time = DateTime.Now;
wmsMaterialkitRecordT.bill_id = wmsMaterialkitRecord.id;
wmsMaterialkitRecordT.bill_d_id = _wmsMaterialTransferD.id;
wmsMaterialkitRecordT.materialtransfer_id = wmsMaterialTransfer.id;
wmsMaterialkitRecordT.materialtransfer_billcode = wmsMaterialTransfer.bill_code;
wmsMaterialkitRecordT.materialtransfer_d_id = _wmsMaterialTransferD.id;
wmsMaterialkitRecordT.oldqty = wmsMaterialkitRecordD.yxf_qty;
wmsMaterialkitRecordT.newqty = wmsMaterialkitRecordD.yxf_qty + can_qty;
wmsMaterialkitRecordT.material_id = _wmsMaterialTransferD.material_id;
wmsMaterialkitRecordT.material_code = _wmsMaterialTransferD.material_code;
wmsMaterialkitRecordT.material_name = _wmsMaterialTransferD.material_ex;
wmsMaterialkitRecordT.material_specification = _wmsMaterialTransferD.material_specification;
wmsMaterialkitRecordT.code_batch = _wmsMaterialTransferD.code_batch;
wmsMaterialkitRecordT.unit_code = _wmsMaterialTransferD.unit_code;
wmsMaterialkitRecordT.xf_qty = can_qty;
wmsMaterialkitRecordT.start_time = startTime;
wmsMaterialkitRecordT.end_time = endTime;
wmsMaterialkitRecordT.total_time = (int)(endTime - startTime).TotalMilliseconds;
wmsMaterialkitRecordTs.Add(wmsMaterialkitRecordT);
xf_qty += can_qty;
need_qty = need_qty - can_qty;
}
await db_WmsMaterialkit.Insertable(wmsMaterialkitRecordTs).ExecuteCommandAsync();
stopwatch2.Stop();
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordD>().SetColumns(r => new WmsMaterialkitRecordD
{
yxf_qty = r.yxf_qty + xf_qty,
@@ -3077,7 +3133,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
//WmsMaterialkittimer = new Timer(WmsMaterialkit, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(20));
WmsMaterialkittimer = new Timer(WmsMaterialkit, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(300));
return Task.CompletedTask;
}