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