diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialInventoryInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialInventoryInput.cs index 9326e0ce..e7fac74c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialInventoryInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialInventoryInput.cs @@ -5,6 +5,14 @@ /// public class CarryMaterialInventoryInput { + /// + /// 业务类型 + /// + public string? biz_type { get; set; } + /// + /// 来源单据id + /// + public string? source_id { get; set; } /// /// 仓库编码 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatTransferoutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatTransferoutstockInput.cs index d256999c..a7136991 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatTransferoutstockInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/RawmatTransferoutstockInput.cs @@ -24,6 +24,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto /// /// 载具 /// - public List carrys { get; set; } + public List carrys { get; set; } + } + + public class RawmatTransferoutstockDetailInput + { + public string carry_code { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs index 4a5c092c..64f3ebe4 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryCode.part.cs @@ -48,5 +48,10 @@ public partial class WmsCarryCode /// [SugarColumn(IsIgnore = true)] public string carry_code { get; set; } + /// + /// 签收数量 + /// + [SugarColumn(IsIgnore = true)] + public decimal? sign_qty { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockC.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockC.cs new file mode 100644 index 00000000..a9ba1b45 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockC.cs @@ -0,0 +1,77 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 原材料调拨出库载具表 +/// +[SugarTable("wms_rawmat_transferoutstock_c")] +public partial class WmsRawmatTransferoutstockC : BaseEntity +{ + public WmsRawmatTransferoutstockC() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 原材料调拨出库单id + /// + public string? bill_id { get; set; } + + /// + /// 载具ID + /// + public string? carry_id { get; set; } + + /// + /// 载具编号 + /// + public string? carry_code { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 终点库位id + /// + public string? endlocation_id { get; set; } + + /// + /// 终点库位编码 + /// + public string? endlocation_code { get; set; } + + /// + /// 起点库位id + /// + public string? startlocation_id { get; set; } + + /// + /// 起点库位编码 + /// + public string? startlocation_code { get; set; } + + /// + /// 原材料调拨出库明细id + /// + public string? mat_bill_id { get; set; } + + /// + /// 载具数量 + /// + public decimal? qty { get; set; } + + /// + /// 签收数量 + /// + public decimal? sign_qty { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 743501b0..c199d2ec 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -3692,22 +3692,33 @@ namespace Tnb.WarehouseMgr { try { + if (string.IsNullOrEmpty(input.biz_type)) + throw new AppFriendlyException("业务类型不可为空", 500); + if (string.IsNullOrEmpty(input.source_id)) + throw new AppFriendlyException("来源单据id不可为空", 500); if (string.IsNullOrEmpty(input.warehouse_code)) - { throw new AppFriendlyException("出库仓库不可为空", 500); - } - if (string.IsNullOrEmpty(input.material_id)) - { throw new AppFriendlyException("物料id不可为空", 500); - } if (string.IsNullOrEmpty(input.code_batch)) - { throw new AppFriendlyException("批号不可为空", 500); - } BasWarehouse basWarehouse = await _db.Queryable().Where(r => r.whcode == input.warehouse_code).FirstAsync(); + // 下发数量 + decimal? qty = 0; + switch (input.biz_type) + { + case WmsWareHouseConst.BIZTYPE_WmsRawmatTransferoutstock_ID: + { + WmsRawmatTransferoutstockD wmsRawmatTransferoutstockD = await _db.Queryable().Where(r => r.id == input.source_id).FirstAsync(); + if (wmsRawmatTransferoutstockD == null) + throw new AppFriendlyException($"来源单据{input.source_id}不存在", 500); + qty = wmsRawmatTransferoutstockD.qty - wmsRawmatTransferoutstockD.actual_qty; + break; + } + } + switch (basWarehouse.id) { case WmsWareHouseConst.WAREHOUSE_YCL_ID: @@ -3743,23 +3754,58 @@ namespace Tnb.WarehouseMgr }) .ToListAsync(); - var wmsCarryCodesSum = wmsCarryCodes.GroupBy(r => new { r.carry_id, r.material_id, r.code_batch }).Select(g => + + var wmsCarryCodesOrderByQty = wmsCarryCodes.GroupBy(r => new { r.carry_id, r.material_id, r.code_batch }) + .Select(g => + { + var list = g.ToList(); + decimal sumqty = g.Sum(r => r.qty); + + var newg = new + { + carry_id = list[0].carry_id, + carry_code = list[0].carry_code, + material_id = list[0].material_id, + material_code = list[0].material_code, + material_name = list[0].material_name, + material_specification = list[0].material_specification, + barcode = list[0].barcode, + code_batch = list[0].code_batch, + qty = sumqty + }; + return newg; + }); + + + bool isFindSortCarry = false; + var wmsCarryCodesSum = wmsCarryCodesOrderByQty.OrderBy(r => r.qty).Select(g => { - var list = g.ToList(); + decimal sumqty = g.qty; + + decimal? remainQty = qty - sumqty; + + // 首次小于0则需要分拣 + if (remainQty < 0 && !isFindSortCarry) + isFindSortCarry = true; + else + isFindSortCarry = false; var newg = new { - carry_id = list[0].carry_id, - carry_code = list[0].carry_code, - material_id = list[0].material_id, - material_code = list[0].material_code, - material_name = list[0].material_name, - material_specification = list[0].material_specification, - barcode = list[0].barcode, - code_batch = list[0].code_batch, - qty = g.Sum(r => r.qty) + carry_id = g.carry_id, + carry_code = g.carry_code, + material_id = g.material_id, + material_code = g.material_code, + material_name = g.material_name, + material_specification = g.material_specification, + barcode = g.barcode, + code_batch = g.code_batch, + qty = sumqty, + sign_qty = isFindSortCarry ? qty : sumqty, + isSortCarry = isFindSortCarry, // 是否为分拣载具 + isSelect = isFindSortCarry || remainQty > 0, // 是否勾选 }; - + qty -= sumqty; return newg; }); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs index 1fb64888..658884e6 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs @@ -379,8 +379,51 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"【MaterialByCarry】托盘{input.carry_code}不存在", 500); } + WmsDistaskH wmsDistaskH = await _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).OrderByDescending(r => r.id).FirstAsync(); + if (wmsDistaskH == null) + { + throw new AppFriendlyException($"【MaterialSign】无法找到载具{input.carry_code}的执行任务", 500); + } + + if (string.IsNullOrEmpty(wmsDistaskH.biz_type)) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}任务{wmsDistaskH.bill_code}的业务类型异常", 500); + } List wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id && r.codeqty > 0).ToList(); + switch (wmsDistaskH.biz_type) + { + case WmsWareHouseConst.BIZTYPE_WmsRawmatTransferoutstock_ID: + { + WmsRawmatTransferoutstockC wmsRawmatTransferoutstockC = await _db.Queryable() + .Where(r => r.mat_bill_id == wmsDistaskH.source_id && r.carry_id == wmsCarryH.id).FirstAsync(); + if (wmsRawmatTransferoutstockC != null) + { + // 返回默认签收数量 + if (wmsRawmatTransferoutstockC.sign_qty > 0) + { + List _wmsCarryCodes = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).ToList(); + foreach (WmsCarryCode wmsCarryCode in _wmsCarryCodes) + { + wmsCarryCode.carry_code = wmsCarryH.carry_code; + if (wmsCarryCode.codeqty < wmsRawmatTransferoutstockC.sign_qty) + { + wmsCarryCode.sign_qty = wmsCarryCode.codeqty; + wmsRawmatTransferoutstockC.sign_qty -= wmsCarryCode.codeqty; + } + else + { + wmsCarryCode.sign_qty = wmsRawmatTransferoutstockC.sign_qty; + } + } + } + } + + break; + } + } + + return await ToApiResult(HttpStatusCode.OK, "成功", wmsCarryCodes); } catch (Exception ex) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index 14436abc..d1d0937d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -162,6 +162,7 @@ namespace Tnb.WarehouseMgr { CarryCodeUnbindCodeInput carryCodeUnbindCodeInput = new CarryCodeUnbindCodeInput(); await _wmsCarryUnbindService.CarryCodeUnbindCode(carryCodeUnbindCodeInput, _db); + await _db.Updateable().SetColumns(r => r.carry_status == "0").Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); } //await _db.Updateable().SetColumns(r => r.codeqty == wmsCarryCode.codeqty) // .Where(r => r.barcode == wmsCarryCode.barcode).ExecuteCommandAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs index e8f6b111..d3aa5979 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseService.cs @@ -34,6 +34,7 @@ using Tnb.BasicData; using Tnb.ProductionMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Entity; using Microsoft.Extensions.Logging; +using Microsoft.AspNetCore.Authorization; namespace Tnb.WarehouseMgr { @@ -390,5 +391,9 @@ namespace Tnb.WarehouseMgr throw; } } + + + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs index f4a155ea..53642c0f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs @@ -96,8 +96,18 @@ namespace Tnb.WarehouseMgr WmsRawmatTransferoutstockD wmsRawmatTransferoutstockD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = await _db.Queryable().FirstAsync(it => it.id == wmsRawmatTransferoutstockD.bill_id); - List items = await _db.Queryable().Where(r => input.carrys.Contains(r.carry_code)).ToListAsync(); + List _items = await _db.Queryable().Where(r => input.carrys.Select(c => c.carry_code).Contains(r.carry_code)).ToListAsync(); + List wmsCarryCodes = await _db.Queryable().Where(r => _items.Select(c => c.id).Contains(r.carry_id) + && r.material_id == wmsRawmatTransferoutstockD.matcode_id && r.code_batch == wmsRawmatTransferoutstockD.code_batch).ToListAsync(); + + List items = new List(); + + foreach (var carry in input.carrys.Select(c => c.carry_code)) + { + items.Add(_items.Where(r => r.carry_code == carry).First()); + } + foreach (var item in items) { if (item.is_lock == 1) @@ -111,13 +121,20 @@ namespace Tnb.WarehouseMgr } } - List wmsCarryCodes = await _db.Queryable().Where(r => items.Select(c => c.id).Contains(r.carry_id) - && r.material_id == wmsRawmatTransferoutstockD.matcode_id && r.code_batch == wmsRawmatTransferoutstockD.code_batch).ToListAsync(); + decimal? sign_qty = 0; decimal qty = wmsCarryCodes.Sum(c => c.codeqty); if (wmsRawmatTransferoutstockD.actual_qty + qty > wmsRawmatTransferoutstockD.qty) { - throw new AppFriendlyException($"本次出库数量{qty}已超过可出库数量{wmsRawmatTransferoutstockD.qty - wmsRawmatTransferoutstockD.actual_qty}", 500); + // 最后一个托盘的数量 + decimal lastCarryQty = wmsCarryCodes.Where(r => r.carry_id == items[items.Count - 1].id).Sum(r => r.codeqty); + // 如果最后一个托盘数量小于超出的出库数量 + if (lastCarryQty < wmsRawmatTransferoutstockD.actual_qty + qty - wmsRawmatTransferoutstockD.qty) + { + throw new AppFriendlyException($"本次出库数量{qty}已超过可出库数量{wmsRawmatTransferoutstockD.qty - wmsRawmatTransferoutstockD.actual_qty} 且无需选择{items[items.Count - 1].carry_code}", 500); + } + // 签收数量 + sign_qty = lastCarryQty - (wmsRawmatTransferoutstockD.actual_qty + qty - wmsRawmatTransferoutstockD.qty); } await _db.Ado.BeginTranAsync(); @@ -145,6 +162,23 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($@"没有可用的终点库位!请检查终点库位的锁定和占用状态", 500); } + WmsRawmatTransferoutstockC wmsRawmatTransferoutstockC = new WmsRawmatTransferoutstockC(); + wmsRawmatTransferoutstockC.bill_id = wmsRawmatTransferoutstockH.id; + wmsRawmatTransferoutstockC.mat_bill_id = wmsRawmatTransferoutstockD.id; + wmsRawmatTransferoutstockC.carry_id = wmsCarryH.id; + wmsRawmatTransferoutstockC.carry_code = wmsCarryH.carry_code; + wmsRawmatTransferoutstockC.create_id = input.create_id; + wmsRawmatTransferoutstockC.create_time = DateTime.Now; + wmsRawmatTransferoutstockC.startlocation_id = startLocation.id; + wmsRawmatTransferoutstockC.startlocation_code = startLocation.location_code; + wmsRawmatTransferoutstockC.endlocation_id = endLocation.id; + wmsRawmatTransferoutstockC.endlocation_code = endLocation.location_code; + decimal carryQty = wmsCarryCodes.Where(r => r.carry_id == wmsCarryH.id).Sum(r => r.codeqty); + wmsRawmatTransferoutstockC.qty = carryQty; + wmsRawmatTransferoutstockC.sign_qty = wmsCarryH.id == items[items.Count - 1].id && sign_qty > 0 ? sign_qty : carryQty; + + await _db.Insertable(wmsRawmatTransferoutstockC).ExecuteCommandAsync(); + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); commonCreatePretaskInput.startlocation_id = startLocation.id; commonCreatePretaskInput.endlocation_id = endLocation.id;