diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index e2cce63a..17a4c10e 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -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(); @@ -178,7 +180,8 @@ namespace Tnb.ProductionMgr #region 构造函数 public RedisBackGround(StackExRedisHelper redisData, IPrdInstockService prdInstockService, ISqlSugarRepository 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 rep_prdMoTasks = prdMoTasks.Where(r => r.workline_id == prdMoTask.workline_id && r.id != prdMoTask.id).ToList(); + List 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().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() - .InnerJoin((a, b) => a.location_id == b.id) - .InnerJoin((a, b, c) => a.id == c.carry_id) - .InnerJoin((a, b, c, d) => c.membercarry_id == d.carry_id) - .InnerJoin((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() - .InnerJoin((a, b) => a.carry_id == b.id) - .InnerJoin((a, b, c) => c.carry_id == b.id) - .InnerJoin((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() - .InnerJoin((a, b) => a.location_id == b.id) - .InnerJoin((a, b, c) => a.id == c.carry_id) - .InnerJoin((a, b, c, d) => c.membercarry_id == d.carry_id) - .InnerJoin((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 inventory = new List(); - 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 wmsMaterialTransfers = await db_WmsMaterialkit.Queryable().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 wmsMaterialTransferDs = await db_WmsMaterialkit.Queryable() + .Where(r => wmsMaterialTransfers.Select(x => x.id).Contains(r.bill_id) && r.station_code == wmsMaterialkitRecord.workstation_id).OrderBy(r => r.id).ToListAsync(); + List wmsMaterialkitRecordDs = await db_WmsMaterialkit.Queryable() + .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() + .InnerJoin((a, b) => a.location_id == b.id) + .InnerJoin((a, b, c) => a.id == c.carry_id) + .InnerJoin((a, b, c, d) => c.membercarry_id == d.carry_id) + .InnerJoin((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() + .InnerJoin((a, b) => a.carry_id == b.id) + .InnerJoin((a, b, c) => c.carry_id == b.id) + .InnerJoin((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 inventory = new List(); + 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 _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 items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); + List wmsCarryCodes = await db_WmsMaterialkit.Queryable() + .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().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().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 WmsMaterialkitRecordDs = db_WmsMaterialkit.Queryable() + .Where(a => a.bill_id == wmsMaterialkitRecord.id && a.yxf_qty < a.plan_qty).ToList(); + if (wmsMaterialTransferDs.Count == 0) + { + await db_WmsMaterialkit.Updateable().SetColumns(it => new WmsMaterialkitRecordH { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) + .Where(it => it.id == wmsMaterialkitRecord.id).ExecuteCommandHasChangeAsync(); + } + + LoggerWmsMaterialkit.LogInformation($"物料配送记录{wmsMaterialkitRecord.bill_code}已下发"); } } catch (ObjectDisposedException ex) diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDDistributeToZCCInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDDistributeToZCCInput.cs new file mode 100644 index 00000000..186b6271 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDDistributeToZCCInput.cs @@ -0,0 +1,31 @@ +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class MaterialTransferDDistributeToZCCInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 来源单据id(转库单子表) + /// + public string? source_id { get; set; } + + /// + /// + /// + public decimal? xf_qty { get; set; } + + public ISqlSugarClient dbConn { get; set; } = null; + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs index 6f3d6bd8..18503302 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialkitRecordH.cs @@ -95,9 +95,9 @@ public partial class WmsMaterialkitRecordH : BaseEntity public decimal? qty { get; set; } /// - /// 产线id + /// 工位id /// - public string? workline_id { get; set; } + public string? workstation_id { get; set; } /// /// 状态(开始 执行中 完成) diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsMaterialTransferService.cs new file mode 100644 index 00000000..99ca5f8a --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsMaterialTransferService.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Tnb.WarehouseMgr.Entities.Dto; + +namespace Tnb.WarehouseMgr.Interfaces +{ + public interface IWmsMaterialTransferService + { + /// + /// 中储仓下发到二楼暂存仓(明细下发) + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + Task DistributeDetailToZCC(MaterialTransferDDistributeToZCCInput input); + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index dbb2a4b1..914cca22 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -596,6 +596,7 @@ namespace Tnb.WarehouseMgr .Select() .ToListAsync(); + items = items.DistinctBy(r => r.id).ToList(); return input.Size > 0 ? items.Take(input.Size).ToList() : items; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index e1a89f29..430ddad7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -53,7 +53,7 @@ namespace Tnb.WarehouseMgr /// [OverideVisualDev(ModuleConsts.MODULE_WMSMATERIALTRANSFER_ID)] [ServiceModule(BizTypeId)] - public class WmsMaterialTransferService : BaseWareHouseService + public class WmsMaterialTransferService : BaseWareHouseService, IWmsMaterialTransferService { private const string BizTypeId = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; private readonly ISqlSugarClient _db; @@ -1027,7 +1027,7 @@ namespace Tnb.WarehouseMgr if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) { List wmsMaterialTransferDs = _db.Queryable() - .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk <= a.yzqty_rk).ToList(); + .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yxfqty_rk < a.yzqty_rk).ToList(); if (wmsMaterialTransferDs.Count == 0) { isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) @@ -1038,7 +1038,7 @@ namespace Tnb.WarehouseMgr else { List wmsMaterialTransferDs = _db.Queryable() - .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty <= a.qty).ToList(); + .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList(); if (wmsMaterialTransferDs.Count == 0) { isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) @@ -1436,6 +1436,131 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// 中储仓下发到二楼暂存仓(明细下发) + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeDetailToZCC(MaterialTransferDDistributeToZCCInput input) + { + await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); + var db = input.dbConn; + if (input.dbConn == null) + db = _db; + + Logger.LogInformation($"中储仓下发到二楼暂存仓"); + try + { + WmsMaterialTransferD wmsMaterialTransferD = db.Queryable().Where(r => r.id == input.source_id).First(); + if (wmsMaterialTransferD == null) + { + Logger.LogWarning($"不存在id为{input.source_id}的转库单明细!"); + throw new AppFriendlyException($"不存在id为{input.source_id}的转库单明细!", 500); + } + if (wmsMaterialTransferD.yxfqty + input.xf_qty > wmsMaterialTransferD.qty) + { + Logger.LogWarning($@"转库单明细{wmsMaterialTransferD.id},下发数量{input.xf_qty}已超过可转库数量{wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty}!"); + throw new AppFriendlyException($@"转库单明细{wmsMaterialTransferD.id},下发数量{input.xf_qty}已超过可转库数量{wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty}", 500); + } + + // 转库单载具子表 + List wmsMaterialTransferCarrys = new List(); + + // 需要转库数量 + decimal? needOut = input.xf_qty; + + //出库取起点,获取所有符合输入的载具规格的载具 + OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new() + { + warehouse_id = "2", + material_id = wmsMaterialTransferD.material_id, + code_batch = wmsMaterialTransferD.code_batch, + needOut = needOut, + material_code = wmsMaterialTransferD.material_code, + endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 } + }; + + List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); + + foreach (var item in carrys) + { + WmsCarryH wmsCarryH = item.Item1; + decimal codeqty = item.Item2; + BasLocation endlocation_ssx = item.Item3; + + // 转库单载具子表 + WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry(); + wmsMaterialTransferCarry.bill_id = input.source_id; + wmsMaterialTransferCarry.carry_id = wmsCarryH.id; + wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code; + wmsMaterialTransferCarry.create_id = input.create_id; + wmsMaterialTransferCarry.create_time = DateTime.Now; + wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id; + wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code; + wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id; + wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code; + wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id; + wmsMaterialTransferCarry.qty = codeqty; + wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry); + } + + await db.Ado.BeginTranAsync(); + + WmsMaterialTransfer wmsMaterialTransfer = await db.Queryable().Where(r => r.id == wmsMaterialTransferD.bill_id).FirstAsync(); + await db.Updateable().SetColumns(r => new WmsMaterialTransfer + { + status = WmsWareHouseConst.BILLSTATUS_ON_ID, + carry_count = wmsMaterialTransferCarrys.Count, + remainbindracknum = wmsMaterialTransferCarrys.Count + }).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeToZCC】更新转库单{wmsMaterialTransfer.bill_code}主表的数据"); + + await db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeToZCC】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据"); + + foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys) + { + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id; + commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id; + commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id; + commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + commonCreatePretaskInput.source_id = wmsMaterialTransferCarry.mat_bill_id; + commonCreatePretaskInput.isExcuteMission = false; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【DistributeToZCC生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500); + } + + await db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync(); + } + Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功"); + + + await db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await db.Ado.RollbackTranAsync(); + Logger.LogError("【DistributeToZCC】" + ex.Message); + Logger.LogError("【DistributeToZCC】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + _s_taskExecuteSemaphore_F1ZCCOutstock.Release(); + InvokeGenPretaskExcute(); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + /// /// 中储仓退料到原材料仓 ///