From cffe4b138f3bef3d0bf0096ef3a714c9c775eb22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Mon, 29 Apr 2024 17:00:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=93=E5=BA=93-=E5=87=BA=E5=BA=93=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E5=87=BA=E5=BA=93=E8=AE=B0=E5=BD=95=EF=BC=8C=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9F=A5=E7=9C=8B=EF=BC=8C=E6=88=90=E5=93=81=E5=BA=93?= =?UTF-8?q?=E7=AD=89=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= =?UTF-8?q?=EF=BC=8C=E5=87=BA=E5=BA=93=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/wms/WmGoodsBatchSearchController.cs | 9 ++ .../mes/wms/WmGoodsNowProductionController.cs | 12 ++ ZR.Model/MES/wms/Dto/WmGoodsBatchSearchDto.cs | 8 ++ .../MES/wms/Dto/WmGoodsNowProductionDto.cs | 52 +++++++- ZR.Model/MES/wms/Dto/WmOutOrderDto.cs | 8 ++ .../IService/IWmGoodsBatchSearchService.cs | 12 ++ .../IService/IWmGoodsNowProductionService.cs | 2 + .../mes/wms/WmGoodsBatchSearchService.cs | 92 ++++++++++++++ .../mes/wms/WmGoodsNowProductionService.cs | 54 ++++++++ ZR.Service/mes/wms/WmOutOrderService.cs | 120 +++++++++++++++--- 10 files changed, 352 insertions(+), 17 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsBatchSearchController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsBatchSearchController.cs index f32dc1a0..22546d8c 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsBatchSearchController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsBatchSearchController.cs @@ -88,6 +88,15 @@ namespace ZR.Admin.WebApi.Controllers { result = _wmGoodsBatchSearchService.GetBatchOutRecordTreeLazyByPartnumber(parm); } + // 按出库单号 + else if (parm.Model == 3 && parm.Type == 1) + { + result = _wmGoodsBatchSearchService.GetBatchOutRecordByShipmentNum(parm); + } + else if (parm.Model == 3 && parm.Type == 2) + { + result = _wmGoodsBatchSearchService.GetBatchOutRecordTreeLazyByShipmentNum(parm); + } } if (result is null) { diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsNowProductionController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsNowProductionController.cs index 03ba6fc3..99121a3c 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsNowProductionController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmGoodsNowProductionController.cs @@ -39,6 +39,18 @@ namespace ZR.Admin.WebApi.Controllers return SUCCESS(response); } + /// + /// 查询成品库当前货物表列表(下拉菜单展示) + /// + /// + /// + [HttpGet("dict")] + public IActionResult QueryWmGoodsNowProductionDict([FromQuery] WmGoodsNowProductionDictDto parm) + { + var response = _WmGoodsNowProductionService.GetDictData(parm); + return SUCCESS(response); + } + /// /// 批量查询 父子节点 diff --git a/ZR.Model/MES/wms/Dto/WmGoodsBatchSearchDto.cs b/ZR.Model/MES/wms/Dto/WmGoodsBatchSearchDto.cs index 537360f7..ab09879c 100644 --- a/ZR.Model/MES/wms/Dto/WmGoodsBatchSearchDto.cs +++ b/ZR.Model/MES/wms/Dto/WmGoodsBatchSearchDto.cs @@ -27,6 +27,10 @@ namespace ZR.Model.MES.wms.Dto /// 批次号 /// public string PackageCode { get; set; } = string.Empty; + /// + /// 出库单号 + /// + public string ShipmentNum { get; set; } = string.Empty; } @@ -40,6 +44,10 @@ namespace ZR.Model.MES.wms.Dto /// public string Id { get; set; } = string.Empty; /// + /// 出库单号 + /// + public string ShipmentNum { get; set; } = string.Empty; + /// /// 树子节点主键(需要第二层为空) /// public string PackageCodeClient_son { get; set; } = null; diff --git a/ZR.Model/MES/wms/Dto/WmGoodsNowProductionDto.cs b/ZR.Model/MES/wms/Dto/WmGoodsNowProductionDto.cs index a8bdef58..15c0232e 100644 --- a/ZR.Model/MES/wms/Dto/WmGoodsNowProductionDto.cs +++ b/ZR.Model/MES/wms/Dto/WmGoodsNowProductionDto.cs @@ -77,5 +77,55 @@ namespace ZR.Model.MES.wms.Dto public DateTime? CreatedTime { get; set; } } - + + + /// + /// 成品库当前货物表查询对象(下拉菜单) + /// + public class WmGoodsNowProductionDictDto : PagerInfo + { + // 查询值============== + /// + /// 搜索条件 + /// + public string Query { get; set; } = string.Empty; + + // 返回值============== + /// + /// 成品库货物id + /// + public string Id { get; set; } + /// + /// 批次号(MES中) + /// + public string PackageCodeClient { get; set; } = string.Empty; + /// + /// 库位号 + /// + public string LocationCode { get; set; } = string.Empty; + /// + /// 零件号 + /// + public string Partnumber { get; set; } = string.Empty; + /// + /// 详细描述 + /// + public string Description { get; set; } = string.Empty; + /// + /// 入库时库存 + /// + public int? GoodsNumLogic { get; set; } = 0; + /// + /// 当前实际库存! + /// + public int? GoodsNumAction { get; set; } = 0; + /// + /// 下拉显示值 + /// + public string Label { get; set; } = string.Empty; + /// + /// 下拉实际值 + /// + public object Value { get; set; } + } } \ No newline at end of file diff --git a/ZR.Model/MES/wms/Dto/WmOutOrderDto.cs b/ZR.Model/MES/wms/Dto/WmOutOrderDto.cs index 36474257..b81049ff 100644 --- a/ZR.Model/MES/wms/Dto/WmOutOrderDto.cs +++ b/ZR.Model/MES/wms/Dto/WmOutOrderDto.cs @@ -15,6 +15,14 @@ namespace ZR.Model.MES.wms.Dto public int? Date { get; set; } public string CustomNo { get; set; } + /// + /// 出库单状态(1-出库中 2-出库完成 3-弃用) + /// + public int Type { get; set; } = -1; + /// + /// 状态(0-停用 1-启用) + /// + public int Status { get; set; } = -1; } /// diff --git a/ZR.Service/mes/wms/IService/IWmGoodsBatchSearchService.cs b/ZR.Service/mes/wms/IService/IWmGoodsBatchSearchService.cs index c246bbab..cc9ea4ee 100644 --- a/ZR.Service/mes/wms/IService/IWmGoodsBatchSearchService.cs +++ b/ZR.Service/mes/wms/IService/IWmGoodsBatchSearchService.cs @@ -60,6 +60,18 @@ namespace ZR.Service.mes.wms.IService /// /// PagedInfo GetBatchOutRecordTreeLazyByPartnumber(WmGoodsBatchSearchDto parm); + /// + /// 9.树表最外层查询(出库记录根据出库单号聚合) + /// + /// + /// + PagedInfo GetBatchOutRecordByShipmentNum(WmGoodsBatchSearchDto parm); + /// + /// 10.树表子节点懒加载查询(出库记录根据出库单号聚合) + /// + /// + /// + PagedInfo GetBatchOutRecordTreeLazyByShipmentNum(WmGoodsBatchSearchDto parm); } } diff --git a/ZR.Service/mes/wms/IService/IWmGoodsNowProductionService.cs b/ZR.Service/mes/wms/IService/IWmGoodsNowProductionService.cs index 38473d83..46845926 100644 --- a/ZR.Service/mes/wms/IService/IWmGoodsNowProductionService.cs +++ b/ZR.Service/mes/wms/IService/IWmGoodsNowProductionService.cs @@ -44,5 +44,7 @@ namespace ZR.Service.mes.wms.IService int ModifyInventoryQuantity(string id, int stack_num); + PagedInfo GetDictData(WmGoodsNowProductionDictDto parm); + } } diff --git a/ZR.Service/mes/wms/WmGoodsBatchSearchService.cs b/ZR.Service/mes/wms/WmGoodsBatchSearchService.cs index a0435c70..ef7ade90 100644 --- a/ZR.Service/mes/wms/WmGoodsBatchSearchService.cs +++ b/ZR.Service/mes/wms/WmGoodsBatchSearchService.cs @@ -434,5 +434,97 @@ namespace ZR.Service.Business } } + public PagedInfo GetBatchOutRecordByShipmentNum(WmGoodsBatchSearchDto parm) + { + try + { + // 查询条件 + var exp = Expressionable.Create() + .AndIF(!string.IsNullOrEmpty(parm.ShipmentNum), it => it.FkOutOrderId.Contains(parm.ShipmentNum)) + .And(it => it.FkOutOrderId != string.Empty) + // 根据sql语句进行切换 + //.AndIF(!string.IsNullOrEmpty(parm.PackageCode), it => it.PackageCode.Contains(parm.PackageCode)) + .ToExpression(); + string sql = "SELECT\n" + + " MAX( id ) AS ID,\n" + + " MAX( fk_out_order_id ) AS fk_out_order_id,\n" + + " IFNULL( fk_out_order_id, '无出库单' ) AS ShipmentNum,\n" + + " IFNULL( fk_out_order_id, '无出库单' ) AS PackageCodeClient_son,\n" + + " NULL AS PackageCodeClient_short_parent,\n" + + " '' AS Partnumber,\n" + + " '' AS Description,\n" + + " '' AS PackageCode,\n" + + " '' AS LocationCode,\n" + + " COUNT( * ) AS PackageNum,\n" + + " SUM( goods_num_logic ) AS GoodsNumLogic,\n" + + " SUM( goods_num_action ) AS GoodsNumAction,\n" + + " '' AS Remark,\n" + + " NULL AS OutTime,\n" + + " TRUE AS HasChild \n" + + "FROM\n" + + " wm_goods_out_record \n" + + "GROUP BY\n" + + " ShipmentNum \n" + + "ORDER BY\n" + + " ShipmentNum DESC"; + PagedInfo result = Context.SqlQueryable(sql) + .Where(exp) + .Select() + .ToPage(parm); + return result; + } + catch + { + return null; + } + } + + public PagedInfo GetBatchOutRecordTreeLazyByShipmentNum(WmGoodsBatchSearchDto parm) + { + try + { + PagedInfo result = new PagedInfo(); + // 出库记录 + List list = Context.Queryable() + .Where(it => it.FkOutOrderId == parm.ShipmentNum) + .Select(it => new WmGoodsBatchTableDto + { + Id = it.Id, + ShipmentNum = it.FkOutOrderId, + PackageCode = it.PackageCodeClient, + PackageCodeClient_son = null, + PackageCodeClient_short_parent = it.FkOutOrderId, + Partnumber = it.Partnumber, + Description = "", + LocationCode = it.LocationCode, + PackageNum = 1, + GoodsNumLogic = (int)it.GoodsNumLogic, + GoodsNumAction = (int)it.GoodsNumAction, + OutTime = it.OutTime, + Remark = it.Remark, + HasChild = false + }) + .OrderBy(it => it.Id) + .ToList(); + foreach (WmGoodsBatchTableDto item in list) + { + WmMaterial material = Context.Queryable() + .Where(it => it.Partnumber == item.Partnumber) + .First(); + if (material == null) + { + item.Description = "此零件号不在物料清单内!"; + continue; + } + item.Description = !string.IsNullOrEmpty(material.Description) ? material.Description : material.ProductName; + } + result.Result = list; + return result; + } + catch + { + return null; + } + } } } \ No newline at end of file diff --git a/ZR.Service/mes/wms/WmGoodsNowProductionService.cs b/ZR.Service/mes/wms/WmGoodsNowProductionService.cs index 223b4c21..6025dde4 100644 --- a/ZR.Service/mes/wms/WmGoodsNowProductionService.cs +++ b/ZR.Service/mes/wms/WmGoodsNowProductionService.cs @@ -299,6 +299,60 @@ namespace ZR.Service.mes.wms .SetColumns(it => it.GoodsNumAction == stack_num) .Where(it => it.Id == id).ExecuteCommand(); } + + public PagedInfo GetDictData(WmGoodsNowProductionDictDto parm) + { + var predicate = Expressionable.Create() + .AndIF(!string.IsNullOrEmpty(parm.Query), it => it.Partnumber.Contains(parm.Query)) + .Or(it => it.PackageCodeClient.Contains(parm.Query)) + // .Or(it => it.LocationCode.Contains(parm.Query)) + ; + + var response = Queryable() + .Where(predicate.ToExpression()) + .Select(it => new WmGoodsNowProductionDictDto + { + Id = it.Id, + PackageCodeClient = it.PackageCodeClient, + LocationCode = it.LocationCode, + Partnumber = it.Partnumber, + Description = string.Empty, + GoodsNumAction = it.GoodsNumAction, + GoodsNumLogic = it.GoodsNumLogic, + Label = string.Empty, + }) + .ToPage(parm); + + foreach (WmGoodsNowProductionDictDto item in response.Result) + { + WmMaterial material = Context.Queryable() + .Where(it => it.Partnumber == item.Partnumber) + .First(); + if (material == null) + { + item.Description = "此零件号不在物料清单内!"; + } + else + { + item.Description = !string.IsNullOrEmpty(material.Description) ? material.Description : material.ProductName; + } + string label = "批次号:" + item.PackageCodeClient + " 零件号:" + item.Partnumber + " 描述:" + item.Description; + var value = new + { + Id = item.Id, + PackageCodeClient = item.PackageCodeClient, + LocationCode = item.LocationCode, + Partnumber = item.Partnumber, + Description = item.Description, + GoodsNumAction = item.GoodsNumAction, + GoodsNumLogic = item.GoodsNumLogic, + }; + item.Value = value; + item.Label = label; + + } + return response; + } } diff --git a/ZR.Service/mes/wms/WmOutOrderService.cs b/ZR.Service/mes/wms/WmOutOrderService.cs index 8486be25..3d610dc4 100644 --- a/ZR.Service/mes/wms/WmOutOrderService.cs +++ b/ZR.Service/mes/wms/WmOutOrderService.cs @@ -39,6 +39,8 @@ namespace ZR.Service.mes.wms var predicate = Expressionable.Create() .AndIF(!string.IsNullOrEmpty(parm.ShipmentNum), it => it.ShipmentNum.Contains(parm.ShipmentNum)) .AndIF(!string.IsNullOrEmpty(parm.CustomNo), it => it.CustomNo.Contains(parm.CustomNo)) + .AndIF(parm.Type > 0, it => it.Type == parm.Type) + .AndIF(parm.Status > -1, it => it.Status == parm.Status) .AndIF(parm.Year > 0, it => it.Year == parm.Year) .AndIF(parm.Week > 0, it => it.Year == parm.Week) .AndIF(parm.Date > 0, it => it.Year == parm.Date) @@ -149,7 +151,7 @@ namespace ZR.Service.mes.wms { return null; } - + } /// /// 删除出货单关联的物料出货单 @@ -259,11 +261,11 @@ namespace ZR.Service.mes.wms material_num = material_num + (int)product.GoodsNumLogic; } } - - - wmMaterialQuery_Stock_item.stockQuantity = material_num; - material_stockQuantity_list.Add(wmMaterialQuery_Stock_item); - + + + wmMaterialQuery_Stock_item.stockQuantity = material_num; + material_stockQuantity_list.Add(wmMaterialQuery_Stock_item); + @@ -567,7 +569,7 @@ namespace ZR.Service.mes.wms // 当前工单出库计划 var exp = Expressionable.Create() .And(it => it.FkOutOrderId == shipment_num) - .AndIF(!string.IsNullOrEmpty(partnumber),it => it.MaterialCode == partnumber) + .AndIF(!string.IsNullOrEmpty(partnumber), it => it.MaterialCode == partnumber) .ToExpression(); List wmOutOrderPlan = Context.Queryable() .Where(exp) @@ -590,6 +592,7 @@ namespace ZR.Service.mes.wms // 出库记录 List outPackageList = Context.Queryable() .Where(it => it.PackageCodeClient.Contains(item.Patchcode)) + .Where(it => it.FkOutOrderId == shipment_num) .ToList(); int outPackageNum = 0; int outPartnumberNum = 0; @@ -616,7 +619,7 @@ namespace ZR.Service.mes.wms OutPackageNum = outPackageNum, OutPartnumberNum = outPartnumberNum, IsError = (nowPartnumberNum + outPartnumberNum) != item.PartnumberNum, - IsOver = outPartnumberNum == item.PartnumberNum + IsOver = outPartnumberNum > item.PartnumberNum }; result.Add(newItem); } @@ -660,7 +663,7 @@ namespace ZR.Service.mes.wms //3 判断箱子是否配置零件号 if (parnumber != resultionPackage.PartNumner) { - return "此箱子不在选择的物料号"; + return "此箱子不是选择的物料号"; } // 3.1判断是否已入库 @@ -683,8 +686,9 @@ namespace ZR.Service.mes.wms //} // 5. 确保出最早批次 string short_path = resultionPackage.PatchCode.Split('_')[0]; - - WmOutOrderPlan plan_item = Context.Queryable() + // 严格规则 + return CheckRuleJudgmentFirstInFirstOut(shipment_num, short_path); + /*WmOutOrderPlan plan_item = Context.Queryable() .Where(it => it.FkOutOrderId == shipment_num) .Where(it => it.Patchcode == short_path) .OrderBy(it => it.Outorder) @@ -692,18 +696,28 @@ namespace ZR.Service.mes.wms if (plan_item != null) { + // 查看此批次号在此工单下已出库箱子数量 + int patchInNum = Context.Queryable() + .Where(it => it.PackageCodeClient.Contains(short_path)) + .Where(it => it.FkOutOrderId == shipment_num) + .Count(); var plan_earliest = Context.Queryable() .Where(it => it.FkOutOrderId == shipment_num) .Where(it => it.MaterialCode == plan_item.MaterialCode) - .Where(it => it.PackageNum > it.ReceivedPackNum) + .Where(it => it.PackageNum > patchInNum) .OrderBy(it => it.Outorder) .First(); //已经出库完成,没有可以出库的了 if (plan_earliest == null) { - return "此物料已经全部出库完成,无法继续出库"; + return "此物料在计划中已经全部出库完成,无法继续出库"; } - if (plan_earliest.Id == plan_item.Id) + // 批次号是最早批次 + *//*if (plan_earliest.Id == plan_item.Id) + { + return "ok"; + }*//* + if (plan_earliest.Patchcode == short_path) { return "ok"; } @@ -711,7 +725,7 @@ namespace ZR.Service.mes.wms { return "不是此物料最早批次,无法出库"; } - } + }*/ // 6 .还差一个 数量超过要出库的箱子 return "此箱标签不可出库,批次号不在出库单计划内!请检查出库单计划!"; } @@ -743,6 +757,80 @@ namespace ZR.Service.mes.wms return result; } - + /// + /// 出库单先进先出规则判断(严格复杂版) + /// + /// 工单号 + /// 短批次号 + /// "ok" 代表通过,其余返回错误提示 + /// + public string CheckRuleJudgmentFirstInFirstOut(string shipment_num, string shortPackageCode) + { + // 1.检查是否有记录 + var exp1 = Expressionable.Create() + .And(it => it.FkOutOrderId == shipment_num) + .And(it => it.Patchcode == shortPackageCode) + .ToExpression(); + bool hasRecord = Context.Queryable() + .Where(exp1) + .Any(); + if (!hasRecord) + { + return "此批次号不在出库单计划中!"; + } + + // 1.取出出库单计划 + List plans = Context.Queryable() + .Where(it => it.FkOutOrderId == shipment_num) + .OrderBy(it => it.Outorder) + .ToList(); + foreach (WmOutOrderPlan plan in plans) + { + // 2.此出库单下的批次号的已出库记录 + var exp2 = Expressionable.Create() + .And(it => it.PackageCodeClient.Contains(plan.Patchcode)) + .And(it => it.FkOutOrderId == shipment_num) + .ToExpression(); + List outPackageList = Context.Queryable() + .Where(exp2) + .ToList(); + int outPackageNum = 0; + int outPartnumberNum = 0; + foreach (WmGoodsOutRecord outItem in outPackageList) + { + outPackageNum += 1; + outPartnumberNum += (int)outItem.GoodsNumAction; + } + // 按顺序检查是否出完 + if (plan.Patchcode != shortPackageCode) + { + // 检查此批次是否出完 + if (outPartnumberNum >= plan.RequireNum) + { + // 出完了 + continue; + } + else + { + return "不是出库单计划中此物料的最早批次,无法出库! 计划中批次:" + plan.Patchcode + "未出完!"; + } + } + else + { + // 检查此批次是否出完 + if (outPartnumberNum < plan.RequireNum) + { + return "ok"; + } + else + { + // 出完了 + return "此批次已在出库计划中出完! 当前已出库:" + outPartnumberNum + "个零件!"; + + } + } + } + return "经检查,此批次号不在出库单计划中!"; + } } } \ No newline at end of file