齐套
This commit is contained in:
@@ -37,6 +37,7 @@ using Qiniu.Util;
|
||||
using Senparc.CO2NET.Helpers.Serializers;
|
||||
using SqlSugar;
|
||||
using Tnb.BasicData;
|
||||
using Tnb.WarehouseMgr.Entities.Dto;
|
||||
|
||||
//using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
using Tnb.BasicData.Entities;
|
||||
@@ -52,7 +53,6 @@ using Tnb.WarehouseMgr;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Configs;
|
||||
using Tnb.WarehouseMgr.Entities.Consts;
|
||||
using Tnb.WarehouseMgr.Entities.Dto;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Queries;
|
||||
using Tnb.WarehouseMgr.Entities.Entity;
|
||||
@@ -162,6 +162,8 @@ namespace Tnb.ProductionMgr
|
||||
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
|
||||
private readonly IWmsEmptyOutstockService _wmsEmptyOutstockService;
|
||||
private readonly IWmsPackOutstockService _wmsPackOutstockService;
|
||||
private readonly IWmsMaterialTransferService _wmsMaterialTransferService;
|
||||
|
||||
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
|
||||
@@ -178,7 +180,8 @@ namespace Tnb.ProductionMgr
|
||||
#region 构造函数
|
||||
public RedisBackGround(StackExRedisHelper redisData, IPrdInstockService prdInstockService, ISqlSugarRepository<RedisReadConfig> repository, IWmsPDAScanInStockService wmsPDAScanInStock
|
||||
, IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService,
|
||||
IWmsCarryUnbindService wmsCarryUnbindService, IWmsEmptyOutstockService wmsEmptyOutstockService, IWmsPackOutstockService wmsPackOutstockService)
|
||||
IWmsCarryUnbindService wmsCarryUnbindService, IWmsEmptyOutstockService wmsEmptyOutstockService, IWmsPackOutstockService wmsPackOutstockService,
|
||||
IWmsMaterialTransferService wmsMaterialTransferService)
|
||||
{
|
||||
_redisData = redisData;
|
||||
_prdInstockService = prdInstockService;
|
||||
@@ -191,6 +194,7 @@ namespace Tnb.ProductionMgr
|
||||
_wmsEmptyOutstockService = wmsEmptyOutstockService;
|
||||
_wmsCarryUnbindService = wmsCarryUnbindService;
|
||||
_wmsPackOutstockService = wmsPackOutstockService;
|
||||
_wmsMaterialTransferService = wmsMaterialTransferService;
|
||||
|
||||
db_CheckGettimer = repository.CopyNew();
|
||||
db_Scantimer = repository.CopyNew();
|
||||
@@ -2726,16 +2730,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
LoggerWmsMaterialkit.LogInformation($"查找到进行中的任务单:{string.Join(',', prdMoTasks.Select(r => r.mo_task_code))}");
|
||||
foreach (PrdMoTask prdMoTask in prdMoTasks)
|
||||
{
|
||||
List<PrdMoTask> rep_prdMoTasks = prdMoTasks.Where(r => r.workline_id == prdMoTask.workline_id && r.id != prdMoTask.id).ToList();
|
||||
List<PrdMoTask> rep_prdMoTasks = prdMoTasks.Where(r => r.workstation_id == prdMoTask.workstation_id && r.id != prdMoTask.id).ToList();
|
||||
if (rep_prdMoTasks.Count() > 0)
|
||||
{
|
||||
LoggerWmsMaterialkit.LogWarning($"存在与任务单{prdMoTask.mo_task_code}相同产线的状态为进行中的任务单{string.Join(',', rep_prdMoTasks.Select(r => r.mo_task_code))}");
|
||||
LoggerWmsMaterialkit.LogWarning($"存在与任务单{prdMoTask.mo_task_code}相同工位的状态为进行中的任务单{string.Join(',', rep_prdMoTasks.Select(r => r.mo_task_code))}");
|
||||
continue;
|
||||
}
|
||||
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)
|
||||
&& r.workline_id == prdMoTask.workline_id).FirstAsync();
|
||||
&& r.workstation_id == prdMoTask.workstation_id).FirstAsync();
|
||||
LoggerWmsMaterialkit.LogInformation($"查找任务单{prdMoTask.mo_task_code}的物料配送记录:{JsonConvert.SerializeObject(wmsMaterialkitRecordH)}");
|
||||
|
||||
if (wmsMaterialkitRecordH == null || (wmsMaterialkitRecordH != null && prdMoTask.id != wmsMaterialkitRecordH.mo_task_id))
|
||||
@@ -2765,7 +2769,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
wmsMaterialkitRecordH.material_specification = basMaterial.material_specification;
|
||||
wmsMaterialkitRecordH.unit_code = prdMoTask.unit_id;
|
||||
wmsMaterialkitRecordH.qty = prdMoTask.scheduled_qty;
|
||||
wmsMaterialkitRecordH.workline_id = prdMoTask.workline_id;
|
||||
wmsMaterialkitRecordH.workstation_id = prdMoTask.workstation_id;
|
||||
wmsMaterialkitRecordH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
|
||||
wmsMaterialkitRecordH.times = 0;
|
||||
wmsMaterialkitRecordH.total_time = 0;
|
||||
@@ -2823,90 +2827,157 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
if (wmsMaterialkitRecordHs.Count == 0)
|
||||
return;
|
||||
|
||||
Stopwatch stopwatch_inv = new Stopwatch();
|
||||
stopwatch_inv.Start();
|
||||
// 暂存仓库存
|
||||
var zccinventory = await db_WmsMaterialkit.Queryable<WmsCarryH>()
|
||||
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
|
||||
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
|
||||
.InnerJoin<BasMaterial>((a, b, c, d, e) => d.material_id == e.id)
|
||||
.Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZCC_ID)
|
||||
.Select((a, b, c, d, e) => new customInventoryEntity
|
||||
{
|
||||
material_id = e.id,
|
||||
material_code = e.code,
|
||||
material_name = e.name,
|
||||
material_specification = e.material_specification,
|
||||
codeqty = d.codeqty,
|
||||
unit_code = d.unit_id
|
||||
}).ToListAsync();
|
||||
|
||||
// 正在配送
|
||||
var inroadinventory = await db_WmsMaterialkit.Queryable<WmsPretaskH>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c) => c.carry_id == b.id)
|
||||
.InnerJoin<BasMaterial>((a, b, c, d) => d.id == c.material_id)
|
||||
.Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
|
||||
&& (a.endlocation_id == WmsWareHouseConst.ZZCSSX111011 || a.endlocation_id == WmsWareHouseConst.ZZCSSX111012))
|
||||
.Select((a, b, c, d) => new customInventoryEntity
|
||||
{
|
||||
material_id = d.id,
|
||||
material_code = d.code,
|
||||
material_name = d.name,
|
||||
material_specification = d.material_specification,
|
||||
codeqty = c.codeqty,
|
||||
unit_code = c.unit_id
|
||||
}).ToListAsync();
|
||||
|
||||
// 中储仓库存
|
||||
var inventory_中储 = await db_WmsMaterialkit.Queryable<WmsCarryH>()
|
||||
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
|
||||
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
|
||||
.InnerJoin<BasMaterial>((a, b, c, d, e) => d.material_id == e.id)
|
||||
.Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZC_ID)
|
||||
.Select((a, b, c, d, e) => new customInventoryEntity
|
||||
{
|
||||
material_id = e.id,
|
||||
material_code = e.code,
|
||||
material_name = e.name,
|
||||
material_specification = e.material_specification,
|
||||
codeqty = d.codeqty,
|
||||
unit_code = d.unit_id
|
||||
}).ToListAsync();
|
||||
|
||||
List<customInventoryEntity> inventory = new List<customInventoryEntity>();
|
||||
inventory.AddRange(zccinventory);
|
||||
inventory.AddRange(inroadinventory);
|
||||
|
||||
inventory.GroupBy(g => new { g.material_id, g.material_code, g.material_name, g.material_specification, g.unit_code }).Select(g =>
|
||||
{
|
||||
customInventoryEntity newinventory = new customInventoryEntity();
|
||||
newinventory.material_id = g.Key.material_id;
|
||||
newinventory.material_code = g.Key.material_code;
|
||||
newinventory.material_name = g.Key.material_name;
|
||||
newinventory.material_specification = g.Key.material_specification;
|
||||
newinventory.unit_code = g.Key.unit_code;
|
||||
newinventory.codeqty = inventory.Where(r => r.material_id == newinventory.material_id && r.unit_code == newinventory.unit_code).Sum(s => s.codeqty);
|
||||
|
||||
return newinventory;
|
||||
});
|
||||
stopwatch_inv.Stop();
|
||||
LoggerWmsMaterialkit.LogInformation($"中储仓与暂存仓库存查询完成,耗时{stopwatch_inv.ElapsedMilliseconds} ms");
|
||||
List<WmsMaterialTransfer> wmsMaterialTransfers = await db_WmsMaterialkit.Queryable<WmsMaterialTransfer>().Where(r => r.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID
|
||||
&& r.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID && r.type == WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE).ToListAsync();
|
||||
|
||||
// 执行暂存仓库存检查与转库单下发
|
||||
foreach (WmsMaterialkitRecordH wmsMaterialkitRecord in wmsMaterialkitRecordHs)
|
||||
{
|
||||
Stopwatch stopwatch2 = new Stopwatch();
|
||||
stopwatch2.Start();
|
||||
await db_WmsMaterialkit.Ado.BeginTranAsync();
|
||||
List<WmsMaterialTransferD> wmsMaterialTransferDs = await db_WmsMaterialkit.Queryable<WmsMaterialTransferD>()
|
||||
.Where(r => wmsMaterialTransfers.Select(x => x.id).Contains(r.bill_id) && r.station_code == wmsMaterialkitRecord.workstation_id).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();
|
||||
foreach (WmsMaterialkitRecordD wmsMaterialkitRecordD in wmsMaterialkitRecordDs)
|
||||
{
|
||||
Stopwatch stopwatch2 = new Stopwatch();
|
||||
stopwatch2.Start();
|
||||
// 暂存仓库存
|
||||
var zccinventory = await db_WmsMaterialkit.Queryable<WmsCarryH>()
|
||||
.InnerJoin<BasLocation>((a, b) => a.location_id == b.id)
|
||||
.InnerJoin<WmsCarryD>((a, b, c) => a.id == c.carry_id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c, d) => c.membercarry_id == d.carry_id)
|
||||
.InnerJoin<BasMaterial>((a, b, c, d, e) => d.material_id == e.id)
|
||||
.Where((a, b, c, d, e) => b.wh_id == WmsWareHouseConst.WAREHOUSE_ZCC_ID && e.id == wmsMaterialkitRecordD.material_id)
|
||||
.Select((a, b, c, d, e) => new customInventoryEntity
|
||||
{
|
||||
material_id = e.id,
|
||||
material_code = e.code,
|
||||
material_name = e.name,
|
||||
material_specification = e.material_specification,
|
||||
codeqty = d.codeqty,
|
||||
unit_code = d.unit_id
|
||||
}).ToListAsync();
|
||||
|
||||
// 正在配送
|
||||
var inroadinventory = await db_WmsMaterialkit.Queryable<WmsPretaskH>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.carry_id == b.id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c) => c.carry_id == b.id)
|
||||
.InnerJoin<BasMaterial>((a, b, c, d) => d.id == c.material_id)
|
||||
.Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID
|
||||
&& (a.endlocation_id == WmsWareHouseConst.ZZCSSX121009 || a.endlocation_id == WmsWareHouseConst.ZZCSSX121010) && d.id == wmsMaterialkitRecordD.material_id)
|
||||
.Select((a, b, c, d) => new customInventoryEntity
|
||||
{
|
||||
material_id = d.id,
|
||||
material_code = d.code,
|
||||
material_name = d.name,
|
||||
material_specification = d.material_specification,
|
||||
codeqty = c.codeqty,
|
||||
unit_code = c.unit_id
|
||||
}).ToListAsync();
|
||||
|
||||
List<customInventoryEntity> inventory = new List<customInventoryEntity>();
|
||||
inventory.AddRange(zccinventory);
|
||||
inventory.AddRange(inroadinventory);
|
||||
|
||||
await db_WmsMaterialkit.Ado.CommitTranAsync();
|
||||
stopwatch2.Stop();
|
||||
LoggerWmsMaterialkit.LogInformation($"物料配送记录{wmsMaterialkitRecord.bill_code}已下发,耗时{stopwatch2.ElapsedMilliseconds} ms");
|
||||
inventory.GroupBy(g => new { g.material_id, g.material_code, g.material_name, g.material_specification, g.unit_code }).Select(g =>
|
||||
{
|
||||
customInventoryEntity newinventory = new customInventoryEntity();
|
||||
newinventory.material_id = g.Key.material_id;
|
||||
newinventory.material_code = g.Key.material_code;
|
||||
newinventory.material_name = g.Key.material_name;
|
||||
newinventory.material_specification = g.Key.material_specification;
|
||||
newinventory.unit_code = g.Key.unit_code;
|
||||
newinventory.codeqty = inventory.Where(r => r.material_id == newinventory.material_id && r.unit_code == newinventory.unit_code).Sum(s => s.codeqty);
|
||||
|
||||
return newinventory;
|
||||
});
|
||||
|
||||
// 需要下发的数量
|
||||
decimal? need_qty = wmsMaterialkitRecordD.plan_qty - wmsMaterialkitRecordD.yxf_qty;
|
||||
|
||||
// 查询已有库存 (多工单情况下要考虑库存是否被其它工单预留 暂定)
|
||||
decimal? exists_qty = inventory.Sum(r => r.codeqty);
|
||||
need_qty = need_qty - exists_qty;
|
||||
if (need_qty <= 0)
|
||||
break;
|
||||
|
||||
// 查询转库单
|
||||
List<WmsMaterialTransferD> _wmsMaterialTransferDs = wmsMaterialTransferDs.Where(r => r.material_id == wmsMaterialkitRecordD.material_id).ToList();
|
||||
await db_WmsMaterialkit.Ado.BeginTranAsync();
|
||||
decimal? xf_qty = 0;
|
||||
foreach (WmsMaterialTransferD _wmsMaterialTransferD in _wmsMaterialTransferDs)
|
||||
{
|
||||
if (need_qty <= 0)
|
||||
break;
|
||||
// 转库单可以下发的数量
|
||||
decimal? zkcan_qty = _wmsMaterialTransferD.qty - _wmsMaterialTransferD.yxfqty;
|
||||
// 可以下发的数量
|
||||
decimal? can_qty = 0;
|
||||
// 多余数量切换到下一个转库单
|
||||
can_qty = zkcan_qty < need_qty ? zkcan_qty : need_qty;
|
||||
// 查询库存是否有可以下发数量的库存(同批次)
|
||||
// 中储仓库存
|
||||
OutStockStrategyQuery outStockStrategyInput = new()
|
||||
{
|
||||
warehouse_id = WmsWareHouseConst.WAREHOUSE_ZC_ID,
|
||||
material_id = _wmsMaterialTransferD.material_id,
|
||||
code_batch = _wmsMaterialTransferD.code_batch
|
||||
};
|
||||
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).ToListAsync();
|
||||
decimal? inv_qty = wmsCarryCodes.Sum(r => r.codeqty);
|
||||
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}");
|
||||
if (can_qty <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
MaterialTransferDDistributeToZCCInput input = new MaterialTransferDDistributeToZCCInput();
|
||||
input.source_id = _wmsMaterialTransferD.id;
|
||||
input.xf_qty = can_qty;
|
||||
input.dbConn = db_WmsMaterialkit;
|
||||
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} 中储仓出库时数量不匹配!");
|
||||
continue;
|
||||
}
|
||||
xf_qty += can_qty;
|
||||
need_qty = need_qty - can_qty;
|
||||
}
|
||||
|
||||
stopwatch2.Stop();
|
||||
|
||||
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordD>().SetColumns(r => new WmsMaterialkitRecordD
|
||||
{
|
||||
yxf_qty = r.yxf_qty + xf_qty,
|
||||
times = r.times + 1,
|
||||
total_time = r.total_time + (int)stopwatch2.ElapsedMilliseconds,
|
||||
status = wmsMaterialkitRecordD.yxf_qty + xf_qty >= r.plan_qty ? WmsWareHouseConst.BILLSTATUS_COMPLETE_ID : WmsWareHouseConst.BILLSTATUS_ON_ID
|
||||
})
|
||||
.Where(r => r.id == wmsMaterialkitRecordD.id).ExecuteCommandAsync();
|
||||
|
||||
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordH>().SetColumns(r => new WmsMaterialkitRecordH
|
||||
{
|
||||
times = r.times + 1,
|
||||
total_time = r.total_time + (int)stopwatch2.ElapsedMilliseconds
|
||||
})
|
||||
.Where(r => r.id == wmsMaterialkitRecordD.bill_id).ExecuteCommandAsync();
|
||||
|
||||
await db_WmsMaterialkit.Ado.CommitTranAsync();
|
||||
LoggerWmsMaterialkit.LogInformation($"物料齐套配送明细id{wmsMaterialkitRecordD.id}已下发,耗时{stopwatch2.ElapsedMilliseconds} ms");
|
||||
}
|
||||
|
||||
List<WmsMaterialkitRecordD> WmsMaterialkitRecordDs = db_WmsMaterialkit.Queryable<WmsMaterialkitRecordD>()
|
||||
.Where(a => a.bill_id == wmsMaterialkitRecord.id && a.yxf_qty < a.plan_qty).ToList();
|
||||
if (wmsMaterialTransferDs.Count == 0)
|
||||
{
|
||||
await db_WmsMaterialkit.Updateable<WmsMaterialkitRecordH>().SetColumns(it => new WmsMaterialkitRecordH { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
|
||||
.Where(it => it.id == wmsMaterialkitRecord.id).ExecuteCommandHasChangeAsync();
|
||||
}
|
||||
|
||||
LoggerWmsMaterialkit.LogInformation($"物料配送记录{wmsMaterialkitRecord.bill_code}已下发");
|
||||
}
|
||||
}
|
||||
catch (ObjectDisposedException ex)
|
||||
|
||||
Reference in New Issue
Block a user