diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/ArtificialInstock.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/ArtificialInstockInput.cs similarity index 90% rename from WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/ArtificialInstock.cs rename to WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/ArtificialInstockInput.cs index afd656b4..481fbf1d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/ArtificialInstock.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/ArtificialInstockInput.cs @@ -13,6 +13,5 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs public string? create_id { get; set; } public string? carry_code { get; set; } public string? startlocation_code { get; set; } - public string? warehouse_id { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryCodeUnbindCodeInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryCodeUnbindCodeInput.cs new file mode 100644 index 00000000..0387b369 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryCodeUnbindCodeInput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class CarryCodeUnbindCodeInput + { + public string? carry_code_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialSignInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialSignInput.cs new file mode 100644 index 00000000..0e21dacd --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialSignInput.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tnb.WarehouseMgr.Entities.Consts; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class MaterialSignInput + { + public string? org { get; set; } = WmsWareHouseConst.AdministratorOrgId; + public string? create_id { get; set; } + public string? carry_code { get; set; } + public List details { get; set; } + } + public class MaterialSignDetailInput + { + public string? carry_code_id { get; set; } + public decimal sign_qty { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryStockReportH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryStockReportH.cs index 62690e32..002f9c53 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryStockReportH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryStockReportH.cs @@ -255,3 +255,115 @@ public partial class WmsCarryStockReportCode } + + + +/// +/// 载具库存报表 +/// +public partial class WmsCarryStockReportExcel +{ + public int index { get; set; } + ///// + ///// 所属组织 + ///// + //public string? 组织 { get; set; } + + ///// + ///// 载具ID + ///// + //public string? carry_id { get; set; } + + /// + /// 载具编码 + /// + public string? carry_code { get; set; } + + /// + /// 载具名称 + /// + public string? carry_name { get; set; } + + /// + /// 仓库名称 + /// + public string? warehouse_name { get; set; } + + /// + /// 库位编码 + /// + public string? location_code { get; set; } + + /// + /// 库位名称 + /// + public string? location_name { get; set; } + + /// + /// 载具状态 + /// + public string? carry_status { get; set; } + + /// + /// 库位状态 + /// + public string? location_status { get; set; } + + /// + /// 载具类型 + /// + public string? carry_type { get; set; } + + /// + /// 入库时间 + /// + public string? instock_time { get; set; } + + ///// + ///// 物料ID + ///// + //public string? material_id { get; set; } + + /// + /// 物料编号 + /// + public string? material_code { get; set; } + + /// + /// 物料名称 + /// + public string? material_name { get; set; } + + /// + /// 条码编号 + /// + public string? barcode { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 条码数量 + /// + public decimal? qty { get; set; } + + /// + /// 单位 + /// + public string? unit { get; set; } + + ///// + ///// 操作用户 + ///// + //public string? 创建用户 { get; set; } + + /// + /// 绑定时间 + /// + public string? bind_time { get; set; } + +} + + diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignD.cs index abc0da02..2e029107 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignD.cs @@ -72,11 +72,11 @@ public partial class WmsMaterialSignD : BaseEntity /// /// 条码数量 /// - public string? qty { get; set; } + public decimal? qty { get; set; } /// /// 签收数量 /// - public string? sign_qty { get; set; } + public decimal? sign_qty { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignH.cs index d5568ec3..fa0a4b4d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialSignH.cs @@ -45,13 +45,13 @@ public partial class WmsMaterialSignH : BaseEntity public string? carry_code { get; set; } /// - /// 签收业务 + /// 签收仓库id /// - public string? business { get; set; } + public string? warehouse_sign_id { get; set; } /// - /// 回库预任务 + /// 回库仓库id /// - public string? pretask_code { get; set; } + public string? warehouse_instock_id { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockD.cs index 01d3b91e..e7afc73e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockD.cs @@ -89,4 +89,14 @@ public partial class WmsRawmatTransferoutstockD : BaseEntity /// public string? warehouse_code { get; set; } + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + + /// + /// erp行号 + /// + public string? lineno { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockH.cs index 5d926a56..1e996233 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferoutstockH.cs @@ -114,4 +114,14 @@ public partial class WmsRawmatTransferoutstockH : BaseEntity /// public string? warehouse_code { get; set; } + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// 调拨订单id + /// + public string? transfer_order_id { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockD.cs index c3478d0d..55dd1028 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockD.cs @@ -134,4 +134,14 @@ public partial class WmsTransferOutstockD : BaseEntity /// public string? warehouse_code { get; set; } + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + + /// + /// erp行号 + /// + public string? lineno { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockH.cs index 17e874c6..6ff16bf7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferOutstockH.cs @@ -99,4 +99,13 @@ public partial class WmsTransferOutstockH : BaseEntity /// public string? warehouse_code { get; set; } + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// 调拨订单id + /// + public string? transfer_order_id { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs index 767b00c7..406d2fcd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryUnbindService.cs @@ -12,5 +12,8 @@ namespace Tnb.WarehouseMgr.Interfaces { Task CarryUnbind(CarryBindInput input, ISqlSugarClient dbConn = null); Task CarryCodeUnbind(CarryCodeUnbindInput input, ISqlSugarClient dbConn = null); + Task CarryCodeUnbindCode(CarryCodeUnbindCodeInput input, ISqlSugarClient dbConn = null); + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index de8eda6f..52af1347 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -1047,22 +1047,68 @@ namespace Tnb.WarehouseMgr if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID) { WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = new WmsRawmatTransferoutstockH(); + string code = await _billRuleService.GetBillNumber("WmsRawmatTransferoutstockH"); + wmsRawmatTransferoutstockH.bill_code = code; + wmsRawmatTransferoutstockH.create_id = WmsWareHouseConst.ErpUserId; + wmsRawmatTransferoutstockH.create_time = DateTime.Now; + wmsRawmatTransferoutstockH.biller = input.biller; + wmsRawmatTransferoutstockH.dept_code = input.dept_code; + wmsRawmatTransferoutstockH.warehouse_code = warehouse_outstock.whcode; + wmsRawmatTransferoutstockH.erp_pk = input.erp_pk; + wmsRawmatTransferoutstockH.transfer_order_id = wmsTransferOrderH.bill_code; + List wmsRawmatTransferoutstockDs = new List (); + foreach (var detail in input.details) + { + WmsRawmatTransferoutstockD wmsRawmatTransferoutstockD = new WmsRawmatTransferoutstockD(); + wmsRawmatTransferoutstockD.bill_id = wmsRawmatTransferoutstockH.id; + wmsRawmatTransferoutstockD.unit = detail.unit_code; + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync(); + if (erpExtendField != null) + { + wmsRawmatTransferoutstockD.unit = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } - List wmsRawmatTransferoutstockD = new List (); + wmsRawmatTransferoutstockD.qty = detail.qty; + wmsRawmatTransferoutstockD.code_batch = detail.code_batch; + wmsRawmatTransferoutstockD.erp_line_pk = detail.erp_line_pk; + wmsRawmatTransferoutstockD.create_id = WmsWareHouseConst.ErpUserId; + wmsRawmatTransferoutstockD.create_time = DateTime.Now; + wmsRawmatTransferoutstockD.lineno = detail.lineno; + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsRawmatTransferoutstockD.matcode_id = material.id; + wmsRawmatTransferoutstockD.matcode = material.code; + wmsRawmatTransferoutstockD.matspecification = material.material_specification; + } + + wmsRawmatTransferoutstockDs.Add(wmsRawmatTransferoutstockD); + } await db.Insertable(wmsRawmatTransferoutstockH).ExecuteCommandAsync(); - await db.Insertable(wmsRawmatTransferoutstockD).ExecuteCommandAsync(); + await db.Insertable(wmsRawmatTransferoutstockDs).ExecuteCommandAsync(); } else if(warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) { - WmsTransferInstockH wmsTransferInstockH = new WmsTransferInstockH(); + WmsTransferOutstockH wmsTransferOutstockH = new WmsTransferOutstockH(); + string code = await _billRuleService.GetBillNumber("WmsTransferOutstockH"); + wmsTransferOutstockH.bill_code = code; + wmsTransferOutstockH.create_id = WmsWareHouseConst.ErpUserId; + wmsTransferOutstockH.create_time = DateTime.Now; + wmsTransferOutstockH.warehouse_code = warehouse_outstock.whcode; + wmsTransferOutstockH.erp_pk = input.erp_pk; + wmsTransferOutstockH.transfer_order_id = wmsTransferOrderH.bill_code; + List wmsTransferOutstockDs = new List(); - List wmsTransferInstockD = new List(); - - await db.Insertable(wmsTransferInstockH).ExecuteCommandAsync(); - await db.Insertable(wmsTransferInstockD).ExecuteCommandAsync(); + await db.Insertable(wmsTransferOutstockH).ExecuteCommandAsync(); + await db.Insertable(wmsTransferOutstockDs).ExecuteCommandAsync(); } await db.Ado.CommitTranAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 5b092ced..c7309dfe 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -88,7 +88,6 @@ namespace Tnb.WarehouseMgr public static SemaphoreSlim s_floor2CreatePretask = new(1); public static SemaphoreSlim s_taskCommonCreatePretask = new(1); public static SemaphoreSlim s_taskGenPreTask = new(1); - public static SemaphoreSlim s_GenTaskExecute = new(1); public Func AddUnExecuteTask { get; set; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsArtificialInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsArtificialInstockService.cs index 0afb16fd..d82d2108 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsArtificialInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsArtificialInstockService.cs @@ -36,13 +36,15 @@ namespace Tnb.WarehouseMgr private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; + private readonly IWareHouseService _wareHouseService; public WmsArtificialInstockService( ISqlSugarRepository repository, IUserManager userManager, IBillRullService billRullService, IRunService runService, IVisualDevService visualDevService, - IWmsPDAScanInStockService wmsPDAScanInStock) + IWmsPDAScanInStockService wmsPDAScanInStock, + IWareHouseService wareHouseService) { _db = repository.AsSugarClient(); _userManager = userManager; @@ -50,6 +52,7 @@ namespace Tnb.WarehouseMgr _runService = runService; _visualDevService = visualDevService; _wmsPDAScanInStock = wmsPDAScanInStock; + _wareHouseService = wareHouseService; } @@ -95,51 +98,65 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}未绑定物料", 500); } - BasLocation carrryLoc = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); - if (carrryLoc != null && carrryLoc.is_type == "0") + BasLocation carryLoc = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + if (carryLoc != null && carryLoc.is_type == "0") { throw new Exception($"托盘{wmsCarryH.carry_code}在存储库位中,不能绑定!"); } - switch (input.warehouse_id) + switch (carryLoc.wh_id) { case WmsWareHouseConst.WAREHOUSE_YCL_ID: { - var WmsCarryCode = _db.Queryable().Where(it => it.carry_id == wmsCarryH.id).OrderByDescending(it => it.id).First(); - - if (WmsCarryCode != null) + await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync(); + try { - VisualDevModelDataCrInput input2 = new VisualDevModelDataCrInput(); - input2.data = new Dictionary(); - input2.data.Add("barcode", input.carry_code); - input2.data.Add("codeqty", WmsCarryCode.codeqty);//条码数量 - input2.data.Add("material_code", WmsCarryCode.material_code); - input2.data.Add("extras", input.startlocation_code);//location_code - input2.data.Add("warehouse_id", "1");//TEST - input2.data.Add("bill_code", "");//采购收货单号 - input2.data.Add("code_batch", WmsCarryCode.code_batch!);//批次 - input2.data.Add("material_specification", WmsCarryCode.material_specification!);//规格型号 - input2.data.Add("container_no", WmsCarryCode.container_no!);//箱号 - input2.data.Add("material_id", WmsCarryCode.material_id); - input2.data.Add("物料条码", WmsCarryCode.barcode); - input2.data.Add("id", null); - _wmsPDAScanInStock.ScanInStockByRedis(input2, _db).Wait(); - WmsArtificialInstock wmsArtificialInstock = new WmsArtificialInstock(); - wmsArtificialInstock.carry_id = wmsCarryH.id; - wmsArtificialInstock.carry_code = wmsCarryH.carry_code; - wmsArtificialInstock.org_id = input.org; - wmsArtificialInstock.create_id = input.create_id; - wmsArtificialInstock.create_time = DateTime.Now; - wmsArtificialInstock.location_id = startlocationn.id; - wmsArtificialInstock.location_code = startlocationn.location_code; - wmsArtificialInstock.warehouse_id = input.warehouse_id; - await _db.Insertable(wmsArtificialInstock).ExecuteCommandAsync(); + var WmsCarryCode = _db.Queryable().Where(it => it.carry_id == wmsCarryH.id).OrderByDescending(it => it.id).First(); + + if (WmsCarryCode != null) + { + VisualDevModelDataCrInput input2 = new VisualDevModelDataCrInput(); + input2.data = new Dictionary(); + input2.data.Add("barcode", input.carry_code); + input2.data.Add("codeqty", WmsCarryCode.codeqty);//条码数量 + input2.data.Add("material_code", WmsCarryCode.material_code); + input2.data.Add("extras", input.startlocation_code);//location_code + input2.data.Add("warehouse_id", "1");//TEST + input2.data.Add("bill_code", "");//采购收货单号 + input2.data.Add("code_batch", WmsCarryCode.code_batch!);//批次 + input2.data.Add("material_specification", WmsCarryCode.material_specification!);//规格型号 + input2.data.Add("container_no", WmsCarryCode.container_no!);//箱号 + input2.data.Add("material_id", WmsCarryCode.material_id); + input2.data.Add("物料条码", WmsCarryCode.barcode); + input2.data.Add("id", null); + _wmsPDAScanInStock.ScanInStockByRedis(input2, _db).Wait(); + + WmsArtificialInstock wmsArtificialInstock = new WmsArtificialInstock(); + wmsArtificialInstock.carry_id = wmsCarryH.id; + wmsArtificialInstock.carry_code = wmsCarryH.carry_code; + wmsArtificialInstock.org_id = input.org; + wmsArtificialInstock.create_id = input.create_id; + wmsArtificialInstock.create_time = DateTime.Now; + wmsArtificialInstock.location_id = startlocationn.id; + wmsArtificialInstock.location_code = startlocationn.location_code; + wmsArtificialInstock.warehouse_id = carryLoc.wh_id; + await _db.Insertable(wmsArtificialInstock).ExecuteCommandAsync(); + } + else + { + throw new AppFriendlyException($"【ArtificialInstock】载具 {input.carry_code} 未绑定物料条码!", 500); + } } - else + catch { - throw new AppFriendlyException($"【ArtificialInstock】载具 {input.carry_code} 未绑定物料条码!", 500); + throw; } + finally + { + _wareHouseService.s_taskExecuteSemaphore_YCLInstock.Release(); + } + break; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs index ad4010f8..e2645526 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs @@ -188,5 +188,144 @@ namespace Tnb.WarehouseMgr }; return PageResult.SqlSugarPageResult(pagedList); } + + + + [HttpPost, AllowAnonymous] + public async Task CarryStockExcel(CarryStockInput input) + { + var warehouse_id = ""; + var carry_code = ""; + var material_code = ""; + if (!input.queryJson.IsNullOrWhiteSpace()) + { + warehouse_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.warehouse_id)); + carry_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_code)); + material_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_code)); + } + + + + List items = await _db.Queryable() + .LeftJoin((a, b) => b.location_id == a.id) + .InnerJoin((a, b, c) => a.wh_id == c.id) + .LeftJoin((a, b, c, d) => d.id == b.carrystd_id) + .LeftJoin((a, b, c, d, e) => e.carry_id == b.id) + .LeftJoin((a, b, c, d, e, f) => f.id == e.material_id) + .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" + && ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code))) + .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) + .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code)) + .OrderByDescending((a, b, c, d, e, f) => b.carry_code) + .Select((a, b, c, d, e, f) => new WmsCarryStockReport + { + warehouse_name = c.whname, + carry_id = b.id, + carry_code = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_code, + carry_name = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_name, + carry_status = b.is_lock == 1 ? "锁定" : "未锁定", + carry_type = d.carrystd_name, + location_code = a.location_code, + location_name = a.location_name, + location_status = a.is_lock == 1 ? "锁定" : "未锁定", + instock_time = b.instock_time != null ? b.instock_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", + barcode = e.barcode, + code_batch = e.code_batch, + qty = e.codeqty, + material_id = e.material_id, + material_code = e.material_code, + material_name = f.name, + unit = e.unit_id, + creator = e.create_id, + bind_time = e.create_time != null ? e.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "" + }) + .OrderBy((a) => a.location_code) + .ToListAsync(); + + // 料架 + List items_LJ = await _db.Queryable() + .LeftJoin((a, b) => b.location_id == a.id) + .InnerJoin((a, b, c) => a.wh_id == c.id) + .InnerJoin((a, b, c, d) => d.id == b.carrystd_id) + .InnerJoin((a, b, c, d, e) => e.carry_id == b.id) + .InnerJoin((a, b, c, d, e, f) => f.carry_id == e.membercarry_id) + .InnerJoin((a, b, c, d, e, f, g) => g.id == f.material_id) + .InnerJoin((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id) + .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" && b.carry_status != "0" && b.carry_status != "6") + .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) + .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code) || h.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code)) + .Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport + { + warehouse_name = c.whname, + carry_id = b.id, + carry_code = b.carry_code, + carry_name = b.carry_name, + membercarry_code = h.carry_code, + membercarry_name = h.carry_name, + carry_status = b.is_lock == 1 ? "锁定" : "未锁定", + carry_type = d.carrystd_name, + location_code = a.location_code, + location_name = a.location_name, + location_status = a.is_lock == 1 ? "锁定" : "未锁定", + instock_time = b.instock_time != null ? b.instock_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", + barcode = f.barcode, + code_batch = f.code_batch, + qty = f.codeqty, + material_id = f.material_id, + material_code = f.material_code, + material_name = g.name, + unit = f.unit_id, + creator = f.create_id, + bind_time = f.create_time != null ? f.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "" + }) + .OrderBy((a) => a.location_code) + .ToListAsync(); + + items.AddRange(items_LJ); + + // d.carrystd_name != "料架" + List wmsCarryStockReportExcels = new List(); + int index = 0; + items.ForEach(x => + { + + index++; + WmsCarryStockReportExcel wmsCarryStockReportCode = x.Adapt(); + wmsCarryStockReportCode.index = index; + //wmsCarryStockReportCode.carry_id = x.carry_id; + wmsCarryStockReportCode.carry_code = !string.IsNullOrEmpty(x.membercarry_code) ? x.membercarry_code : x.carry_code; + wmsCarryStockReportCode.carry_name = !string.IsNullOrEmpty(x.membercarry_name) ? x.membercarry_name : x.carry_name; + //wmsCarryStockReportCode.material_id = x.material_id; + wmsCarryStockReportCode.material_code = x.material_code; + wmsCarryStockReportCode.material_name = x.material_name; + wmsCarryStockReportCode.barcode = x.barcode; + wmsCarryStockReportCode.code_batch = x.code_batch; + wmsCarryStockReportCode.qty = x.qty; + wmsCarryStockReportCode.unit = x.unit; + //wmsCarryStockReportCode.创建用户 = x.操作用户; + wmsCarryStockReportCode.bind_time = x.bind_time; + wmsCarryStockReportExcels.Add(wmsCarryStockReportCode); + }); + + int rowIndex = 0; + List pages = wmsCarryStockReportExcels.Skip((input.currentPage - 1) * input.pageSize).Take(input.pageSize).ToList(); + pages.ForEach(page => { rowIndex++; page.index = rowIndex; }); + + SqlSugarPagedList pagedList = new() + { + list = pages, + pagination = new() + { + CurrentPage = input.currentPage, + PageSize = input.pageSize, + Total = wmsCarryStockReportExcels.Count() + } + }; + return PageResult.SqlSugarPageResult(pagedList); + } + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs index 7719a691..15787604 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryUnbindService.cs @@ -247,5 +247,45 @@ namespace Tnb.WarehouseMgr } return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); } + + public async Task CarryCodeUnbindCode(CarryCodeUnbindCodeInput input, ISqlSugarClient dbConn = null) + { + bool isOk = false; + + var db = _db; + if (dbConn != null) + db = dbConn; + + try + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + if (!string.IsNullOrEmpty(input.carry_code_id)) + { + int row = await db.Deleteable().Where(r => r.id == input.carry_code_id).ExecuteCommandAsync(); + isOk = row > 0; + + Logger.LogInformation($"【CarryCodeUnbind】载具物料明细{input.carry_code_id}已解绑,解绑条数{row}"); + //if (!isOk) + //{ + // throw Oops.Oh(ErrorCode.COM1001); + //} + } + else + { + throw new AppFriendlyException("载具物料明细不能为空", 500); + } + } + catch (Exception ex) + { + Logger.LogError($"【CarryCodeUnbind】 {ex.Message}"); + Logger.LogError($"【CarryCodeUnbind】 {ex.StackTrace}"); + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); + } + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index 426e0516..6aad3e9a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using Aop.Api.Domain; @@ -18,6 +19,7 @@ using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Interfaces; @@ -36,13 +38,17 @@ namespace Tnb.WarehouseMgr private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; + private readonly IWmsCarryUnbindService _wmsCarryUnbindService; + private readonly IWareHouseService _wareHouseService; public WmsMaterialSignHService( ISqlSugarRepository repository, IUserManager userManager, IBillRullService billRullService, IRunService runService, IVisualDevService visualDevService, - IWmsPDAScanInStockService wmsPDAScanInStock) + IWmsPDAScanInStockService wmsPDAScanInStock, + IWmsCarryUnbindService wmsCarryUnbindService, + IWareHouseService wareHouseService) { _db = repository.AsSugarClient(); _userManager = userManager; @@ -50,8 +56,172 @@ namespace Tnb.WarehouseMgr _runService = runService; _visualDevService = visualDevService; _wmsPDAScanInStock = wmsPDAScanInStock; + _wmsCarryUnbindService = wmsCarryUnbindService; + _wareHouseService = wareHouseService; } + /// + /// 物料签收 + /// + /// + /// + /// + /// + [HttpPost] + public async Task MaterialSign(MaterialSignInput input) + { + try + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + await _db.Ado.BeginTranAsync(); + + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); + if (wmsCarryH == null) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}不存在", 500); + } + if (wmsCarryH.is_lock == 1) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}已锁定", 500); + } + if (wmsCarryH.carry_status != "1") + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}未绑定物料", 500); + } + + if (string.IsNullOrEmpty(wmsCarryH.location_id)) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}当前库位为空,无法签收", 500); + } + + List wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).ToList(); + + WmsMaterialSignH wmsMaterialSignH = new WmsMaterialSignH(); + wmsMaterialSignH.create_id = input.create_id; + wmsMaterialSignH.create_time = DateTime.Now; + wmsMaterialSignH.carry_id = wmsCarryH.id; + wmsMaterialSignH.carry_code = wmsCarryH.carry_code; + List wmsMaterialSignDs = new List(); + foreach (var item in input.details) + { + if (item.sign_qty < 0) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}签收数量不能为空", 500); + } + + WmsCarryCode wmsCarryCode = wmsCarryCodes.Where(r => r.id == item.carry_code_id).First(); + if (wmsCarryCode == null) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code} 载具物料明细id {item.carry_code_id}不存在", 500); + } + if (item.sign_qty > wmsCarryCode.codeqty) + { + throw new AppFriendlyException($"【MaterialSign】载具{input.carry_code}签收数量{item.sign_qty}超过了可签收数量{wmsCarryCode.codeqty}", 500); + } + + WmsMaterialSignD wmsMaterialSignD = new WmsMaterialSignD(); + wmsMaterialSignD.bill_id = wmsMaterialSignH.id; + wmsMaterialSignD.create_id = input.create_id; + wmsMaterialSignD.create_time = DateTime.Now; + wmsMaterialSignD.barcode = wmsCarryCode.barcode; + wmsMaterialSignD.material_id = wmsCarryCode.material_id; + BasMaterial basMaterial = await _db.Queryable().Where(r => r.code == wmsCarryCode.material_code).FirstAsync(); + if (basMaterial == null) + { + throw new AppFriendlyException($"【MaterialSign】物料{wmsCarryCode.material_code} 基础资料不存在", 500); + } + wmsMaterialSignD.material_code = basMaterial.code; + wmsMaterialSignD.material_name = basMaterial.name; + wmsMaterialSignD.material_specification = basMaterial.material_specification; + wmsMaterialSignD.code_batch = wmsCarryCode.code_batch; + wmsMaterialSignD.qty = wmsCarryCode.codeqty; + wmsMaterialSignD.sign_qty = item.sign_qty; + wmsMaterialSignDs.Add(wmsMaterialSignD); + wmsCarryCode.codeqty = wmsCarryCode.codeqty - item.sign_qty; + + if (wmsCarryCode.codeqty == 0) + { + CarryCodeUnbindCodeInput carryCodeUnbindCodeInput = new CarryCodeUnbindCodeInput(); + await _wmsCarryUnbindService.CarryCodeUnbindCode(carryCodeUnbindCodeInput, _db); + wmsCarryCodes.Remove(wmsCarryCode); + + await _db.Updateable().SetColumns(r => r.codeqty == wmsCarryCode.codeqty - item.sign_qty) + .Where(r => r.barcode == wmsCarryCode.barcode).ExecuteCommandAsync(); + } + } + + BasLocation carryLoc = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + if (carryLoc != null && carryLoc.is_type == "0") + { + throw new Exception($"托盘{wmsCarryH.carry_code}在存储库位中,不能签收!"); + } + + switch (carryLoc.wh_id) + { + case WmsWareHouseConst.WAREHOUSE_YCL_ID: + { + + await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync(); + + await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync(); + wmsMaterialSignH.warehouse_sign_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; + wmsMaterialSignH.warehouse_instock_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; + try + { + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_YCLCache_ID }; + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); + if (endLocations.Count == 0) + { + throw new AppFriendlyException("没有可以回库的库位", 500); + } + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = carryLoc.location_code; + commonCreatePretaskInput.endlocation_id = endLocations[0].id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSEMPTYINSTOCK_ID; + commonCreatePretaskInput.isExcuteMission = false; + commonCreatePretaskInput.moduleConsts = ModuleConsts.MODULE_WMSEMPTYINSTOCK_ID; + + Logger.LogInformation($"【MaterialSign】 开始生成原材料仓回库任务 起点{carryLoc.location_code} 终点{endLocations[0].location_code} 托盘 {wmsCarryH.carry_code}"); + + Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); + if (res.code == HttpStatusCode.OK) + { + + } + } + catch (Exception ex) + { + throw; + } + finally + { + _wareHouseService.s_taskExecuteSemaphore_YCLInstock.Release(); + } + + + break; + } + } + + await _db.Updateable(wmsMaterialSignH).ExecuteCommandAsync(); + await _db.Updateable(wmsMaterialSignDs).ExecuteCommandAsync(); + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + Logger.LogError($"【MaterialSign】 {ex.Message}"); + Logger.LogError($"【MaterialSign】 {ex.StackTrace}"); + await _db.Ado.RollbackTranAsync(); + throw new AppFriendlyException($"【MaterialSign】物料签收失败 {ex.Message}", 500); + } + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs index 78447afb..713856be 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferoutstockService.cs @@ -12,12 +12,15 @@ using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Interfaces; using Mapster; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Linq; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Interfaces; @@ -36,13 +39,15 @@ namespace Tnb.WarehouseMgr private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; + private readonly IWareHouseService _wareHouseService; public WmsRawmatTransferoutstockService( ISqlSugarRepository repository, IUserManager userManager, IBillRullService billRullService, IRunService runService, IVisualDevService visualDevService, - IWmsPDAScanInStockService wmsPDAScanInStock) + IWmsPDAScanInStockService wmsPDAScanInStock, + IWareHouseService wareHouseService) { _db = repository.AsSugarClient(); _userManager = userManager; @@ -50,109 +55,218 @@ namespace Tnb.WarehouseMgr _runService = runService; _visualDevService = visualDevService; _wmsPDAScanInStock = wmsPDAScanInStock; + _wareHouseService = wareHouseService; } + public override async Task ModifyAsync(WareHouseUpInput input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + + } + /// - /// 人工扫码入库 + /// 获取物料库存 /// /// /// - /// /// - [HttpPost] - public async Task ArtificialInstock(ArtificialInstockInput input) + [HttpPost, NonUnify, AllowAnonymous] + public async Task MaterialInventory(MaterialTransferGetMaterialInventoryInput input) { try { - if (input == null) + if (input.palletCount <= 0) { - throw new ArgumentNullException(nameof(input)); + throw new AppFriendlyException("托盘数必须大于0", 500); + } + if (string.IsNullOrEmpty(input.material_id)) + { + throw new AppFriendlyException("物料id不可为空", 500); + } + if (string.IsNullOrEmpty(input.code_batch)) + { + throw new AppFriendlyException("批号不可为空", 500); + } + + OutStockStrategyQuery outStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, + material_id = input.material_id, + code_batch = input.code_batch, + Size = input.palletCount, + Region_id = WmsWareHouseConst.REGION_Purchase_ID, + PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK, + AvoidBusyPassage = true + }; + + List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); + + decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty); + + JObject keyValuePairs = new JObject(); + keyValuePairs["realPalletCount"] = items.Count; + keyValuePairs["realInvQty"] = qty; + + return await ToApiResult(HttpStatusCode.OK, "成功", keyValuePairs); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + } + + /// + /// 按托下发(到集中供料或外协) + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task Distribute(MaterialTransferDistributeInput input) + { + try + { + await _s_taskExecuteSemaphore_YCLOutstock.WaitAsync(); + if (string.IsNullOrEmpty(input.source_id)) + { + throw new AppFriendlyException("来源单据id不可为空", 500); + } + if (input.palletCount <= 0) + { + throw new AppFriendlyException("托盘数必须大于0", 500); + } + if (input.qty <= 0) + { + throw new AppFriendlyException("数量必须大于0", 500); + } + if (string.IsNullOrEmpty(input.code_batch)) + { + throw new AppFriendlyException("批号不可为空", 500); + } + + WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); + WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); + + if (wmsMaterialTransferD.yxfqty >= wmsMaterialTransferD.qty) + { + throw new AppFriendlyException("已下发数量已达到转库数量", 500); } await _db.Ado.BeginTranAsync(); - BasLocation startlocationn = await _db.Queryable().Where(r => r.location_code == input.startlocation_code).FirstAsync(); - if (startlocationn == null) + OutStockStrategyQuery outStockStrategyInput = new() { - throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}不存在", 500); - } - if (startlocationn.is_lock == 1) + warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, + material_id = wmsMaterialTransferD.material_id, + code_batch = input.code_batch, + Size = input.palletCount, + Region_id = WmsWareHouseConst.REGION_Purchase_ID, + PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK, + AvoidBusyPassage = true + }; + List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); + + if (items.Count == 0) { - throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}已锁定", 500); - } - WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); - if (wmsCarryH == null) - { - throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}不存在", 500); - } - if (wmsCarryH.is_lock == 1) - { - throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}已锁定", 500); - } - if (wmsCarryH.carry_status != "1") - { - throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}未绑定物料", 500); + throw new AppFriendlyException($@"没有可以出库的载具", 500); } - BasLocation carrryLoc = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); - if (carrryLoc != null && carrryLoc.is_type == "0") + decimal qty = _db.Queryable().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == wmsMaterialTransferD.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty); + + // 暂定PDA上查询到的物料批次和库存数量与提交时获取的不一致时,需要前台重新获取库存接口 + if (input.palletCount != items.Count || input.qty != qty) { - throw new Exception($"托盘{wmsCarryH.carry_code}在存储库位中,不能绑定!"); + throw new AppFriendlyException($@"当前实际托盘数量为{input.palletCount} 实际库存数量为{qty},与前台数据不一致,请重新获取库存", HttpStatusCode.InternalServerError); } - switch (input.warehouse_id) + List endLocations = new List(); + // 集中供料区三工位 + if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_JZGL_ID) { - case WmsWareHouseConst.WAREHOUSE_YCL_ID: - { - var WmsCarryCode = _db.Queryable().Where(it => it.carry_id == wmsCarryH.id).OrderByDescending(it => it.id).First(); - - if (WmsCarryCode != null) - { - VisualDevModelDataCrInput input2 = new VisualDevModelDataCrInput(); - input2.data = new Dictionary(); - input2.data.Add("barcode", input.carry_code); - input2.data.Add("codeqty", WmsCarryCode.codeqty);//条码数量 - input2.data.Add("material_code", WmsCarryCode.material_code); - input2.data.Add("extras", input.startlocation_code);//location_code - input2.data.Add("warehouse_id", "1");//TEST - input2.data.Add("bill_code", "");//采购收货单号 - input2.data.Add("code_batch", WmsCarryCode.code_batch!);//批次 - input2.data.Add("material_specification", WmsCarryCode.material_specification!);//规格型号 - input2.data.Add("container_no", WmsCarryCode.container_no!);//箱号 - input2.data.Add("material_id", WmsCarryCode.material_id); - input2.data.Add("物料条码", WmsCarryCode.barcode); - input2.data.Add("id", null); - _wmsPDAScanInStock.ScanInStockByRedis(input2, _db).Wait(); - - WmsArtificialInstock wmsArtificialInstock = new WmsArtificialInstock(); - wmsArtificialInstock.carry_id = wmsCarryH.id; - wmsArtificialInstock.carry_code = wmsCarryH.carry_code; - wmsArtificialInstock.org_id = input.org; - wmsArtificialInstock.create_id = input.create_id; - wmsArtificialInstock.create_time = DateTime.Now; - wmsArtificialInstock.location_id = startlocationn.id; - wmsArtificialInstock.location_code = startlocationn.location_code; - wmsArtificialInstock.warehouse_id = input.warehouse_id; - await _db.Insertable(wmsArtificialInstock).ExecuteCommandAsync(); - } - else - { - throw new AppFriendlyException($"【ArtificialInstock】载具 {input.carry_code} 未绑定物料条码!", 500); - } - break; - } + // 根据三工位任务数平均分配任务 暂定 + endLocations = _db.Queryable().Where(r => _wareHouseService.GetFloor1GLSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") + .OrderBy("is_lock, task_nums, location_code").ToList(); } + // 中储仓三工位 + else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + // 根据三工位任务数平均分配任务 暂定 + endLocations = _db.Queryable().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") + .OrderBy("is_lock, task_nums, location_code").ToList(); + } + + if (endLocations.Count() < input.palletCount) + { + throw new AppFriendlyException($@"可用的终点库位数量为{endLocations.Count()}个 下发数量为{input.palletCount}个 请检查终点库位的锁定和占用状态", 500); + } + + foreach (var wmsCarryH in items) + { + BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + + BasLocation endLocation = null; + // 集中供料区三工位 + if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_JZGL_ID) + { + // 根据三工位任务数平均分配任务 暂定 + endLocation = await _db.Queryable().Where(r => _wareHouseService.GetFloor1GLSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync(); + } + // 中储仓三工位 + else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + // 根据三工位任务数平均分配任务 暂定 + endLocation = await _db.Queryable().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync(); + } + + if (endLocation == null) + { + throw new AppFriendlyException($@"没有可用的终点库位!请检查终点库位的锁定和占用状态", 500); + } + + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = startLocation.id; + commonCreatePretaskInput.endlocation_id = endLocation.id; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + commonCreatePretaskInput.source_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; + commonCreatePretaskInput.isExcuteMission = false; + + Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); + + if (res.code != HttpStatusCode.OK) + { + Logger.LogInformation($@"生成预任务失败"); + throw new AppFriendlyException($@"生成预任务失败", 500); + } + } + + // 更新子表已下发数量 + await _db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + input.qty).Where(r => r.id == input.source_id).ExecuteCommandAsync(); await _db.Ado.CommitTranAsync(); } catch (Exception ex) { - Logger.LogError($"【ArtificialInstock】 {ex.Message}"); - Logger.LogError($"【ArtificialInstock】 {ex.StackTrace}"); await _db.Ado.RollbackTranAsync(); - throw new AppFriendlyException($"【ArtificialInstock】人工扫码入库失败 {ex.Message}", 500); + Logger.LogError("【Distribute】" + ex.Message); + Logger.LogError("【Distribute】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); } + finally + { + _ = _s_taskExecuteSemaphore_YCLOutstock.Release(); + InvokeGenPretaskExcute(); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs index 583de4dd..f4b87cee 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs @@ -53,107 +53,5 @@ namespace Tnb.WarehouseMgr } - /// - /// 人工扫码入库 - /// - /// - /// - /// - /// - [HttpPost] - public async Task ArtificialInstock(ArtificialInstockInput input) - { - try - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - await _db.Ado.BeginTranAsync(); - - BasLocation startlocationn = await _db.Queryable().Where(r => r.location_code == input.startlocation_code).FirstAsync(); - if (startlocationn == null) - { - throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}不存在", 500); - } - if (startlocationn.is_lock == 1) - { - throw new AppFriendlyException($"【ArtificialInstock】库位{input.startlocation_code}已锁定", 500); - } - WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); - if (wmsCarryH == null) - { - throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}不存在", 500); - } - if (wmsCarryH.is_lock == 1) - { - throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}已锁定", 500); - } - if (wmsCarryH.carry_status != "1") - { - throw new AppFriendlyException($"【ArtificialInstock】载具{input.carry_code}未绑定物料", 500); - } - - BasLocation carrryLoc = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); - if (carrryLoc != null && carrryLoc.is_type == "0") - { - throw new Exception($"托盘{wmsCarryH.carry_code}在存储库位中,不能绑定!"); - } - - switch (input.warehouse_id) - { - case WmsWareHouseConst.WAREHOUSE_YCL_ID: - { - var WmsCarryCode = _db.Queryable().Where(it => it.carry_id == wmsCarryH.id).OrderByDescending(it => it.id).First(); - - if (WmsCarryCode != null) - { - VisualDevModelDataCrInput input2 = new VisualDevModelDataCrInput(); - input2.data = new Dictionary(); - input2.data.Add("barcode", input.carry_code); - input2.data.Add("codeqty", WmsCarryCode.codeqty);//条码数量 - input2.data.Add("material_code", WmsCarryCode.material_code); - input2.data.Add("extras", input.startlocation_code);//location_code - input2.data.Add("warehouse_id", "1");//TEST - input2.data.Add("bill_code", "");//采购收货单号 - input2.data.Add("code_batch", WmsCarryCode.code_batch!);//批次 - input2.data.Add("material_specification", WmsCarryCode.material_specification!);//规格型号 - input2.data.Add("container_no", WmsCarryCode.container_no!);//箱号 - input2.data.Add("material_id", WmsCarryCode.material_id); - input2.data.Add("物料条码", WmsCarryCode.barcode); - input2.data.Add("id", null); - _wmsPDAScanInStock.ScanInStockByRedis(input2, _db).Wait(); - - WmsArtificialInstock wmsArtificialInstock = new WmsArtificialInstock(); - wmsArtificialInstock.carry_id = wmsCarryH.id; - wmsArtificialInstock.carry_code = wmsCarryH.carry_code; - wmsArtificialInstock.org_id = input.org; - wmsArtificialInstock.create_id = input.create_id; - wmsArtificialInstock.create_time = DateTime.Now; - wmsArtificialInstock.location_id = startlocationn.id; - wmsArtificialInstock.location_code = startlocationn.location_code; - wmsArtificialInstock.warehouse_id = input.warehouse_id; - await _db.Insertable(wmsArtificialInstock).ExecuteCommandAsync(); - } - else - { - throw new AppFriendlyException($"【ArtificialInstock】载具 {input.carry_code} 未绑定物料条码!", 500); - } - break; - } - } - - await _db.Ado.CommitTranAsync(); - } - catch (Exception ex) - { - Logger.LogError($"【ArtificialInstock】 {ex.Message}"); - Logger.LogError($"【ArtificialInstock】 {ex.StackTrace}"); - await _db.Ado.RollbackTranAsync(); - throw new AppFriendlyException($"【ArtificialInstock】人工扫码入库失败 {ex.Message}", 500); - } - } - } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs new file mode 100644 index 00000000..5afbfd3d --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using JNPF.Common.Core.Manager; +using JNPF.Systems.Interfaces.System; +using JNPF.VisualDev; +using JNPF.VisualDev.Interfaces; +using SqlSugar; +using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Dto; +using Tnb.WarehouseMgr.Interfaces; + +namespace Tnb.WarehouseMgr +{ + /// + /// 成品调拨出库 + /// + [OverideVisualDev(ModuleConsts.MODULE_WmsArtificialInstock_ID)] + public class WmsTransferOutstockService : BaseWareHouseService + { + private readonly ISqlSugarClient _db; + private readonly IUserManager _userManager; + private readonly IBillRullService _billRullService; + private readonly IRunService _runService; + private readonly IVisualDevService _visualDevService; + private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; + private readonly IWareHouseService _wareHouseService; + public WmsTransferOutstockService( + ISqlSugarRepository repository, + IUserManager userManager, + IBillRullService billRullService, + IRunService runService, + IVisualDevService visualDevService, + IWmsPDAScanInStockService wmsPDAScanInStock, + IWareHouseService wareHouseService) + { + _db = repository.AsSugarClient(); + _userManager = userManager; + _billRullService = billRullService; + _runService = runService; + _visualDevService = visualDevService; + _wmsPDAScanInStock = wmsPDAScanInStock; + _wareHouseService = wareHouseService; + } + + public override async Task ModifyAsync(WareHouseUpInput input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + //if (!isOk) + //{ + // throw Oops.Oh(ErrorCode.COM1001); + //} + } + } +}