仓库-出库单,出库记录,批量查看,成品库等功能优化调整,出库逻辑调整

This commit is contained in:
2024-04-29 17:00:38 +08:00
parent c99118ea02
commit cffe4b138f
10 changed files with 352 additions and 17 deletions

View File

@@ -88,6 +88,15 @@ namespace ZR.Admin.WebApi.Controllers
{ {
result = _wmGoodsBatchSearchService.GetBatchOutRecordTreeLazyByPartnumber(parm); 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) if (result is null)
{ {

View File

@@ -39,6 +39,18 @@ namespace ZR.Admin.WebApi.Controllers
return SUCCESS(response); return SUCCESS(response);
} }
/// <summary>
/// 查询成品库当前货物表列表(下拉菜单展示)
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("dict")]
public IActionResult QueryWmGoodsNowProductionDict([FromQuery] WmGoodsNowProductionDictDto parm)
{
var response = _WmGoodsNowProductionService.GetDictData(parm);
return SUCCESS(response);
}
/// <summary> /// <summary>
/// 批量查询 父子节点 /// 批量查询 父子节点

View File

@@ -27,6 +27,10 @@ namespace ZR.Model.MES.wms.Dto
/// 批次号 /// 批次号
/// </summary> /// </summary>
public string PackageCode { get; set; } = string.Empty; public string PackageCode { get; set; } = string.Empty;
/// <summary>
/// 出库单号
/// </summary>
public string ShipmentNum { get; set; } = string.Empty;
} }
@@ -40,6 +44,10 @@ namespace ZR.Model.MES.wms.Dto
/// </summary> /// </summary>
public string Id { get; set; } = string.Empty; public string Id { get; set; } = string.Empty;
/// <summary> /// <summary>
/// 出库单号
/// </summary>
public string ShipmentNum { get; set; } = string.Empty;
/// <summary>
/// 树子节点主键(需要第二层为空) /// 树子节点主键(需要第二层为空)
/// </summary> /// </summary>
public string PackageCodeClient_son { get; set; } = null; public string PackageCodeClient_son { get; set; } = null;

View File

@@ -77,5 +77,55 @@ namespace ZR.Model.MES.wms.Dto
public DateTime? CreatedTime { get; set; } public DateTime? CreatedTime { get; set; }
} }
/// <summary>
/// 成品库当前货物表查询对象(下拉菜单)
/// </summary>
public class WmGoodsNowProductionDictDto : PagerInfo
{
// 查询值==============
/// <summary>
/// 搜索条件
/// </summary>
public string Query { get; set; } = string.Empty;
// 返回值==============
/// <summary>
/// 成品库货物id
/// </summary>
public string Id { get; set; }
/// <summary>
/// 批次号(MES中)
/// </summary>
public string PackageCodeClient { get; set; } = string.Empty;
/// <summary>
/// 库位号
/// </summary>
public string LocationCode { get; set; } = string.Empty;
/// <summary>
/// 零件号
/// </summary>
public string Partnumber { get; set; } = string.Empty;
/// <summary>
/// 详细描述
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// 入库时库存
/// </summary>
public int? GoodsNumLogic { get; set; } = 0;
/// <summary>
/// 当前实际库存!
/// </summary>
public int? GoodsNumAction { get; set; } = 0;
/// <summary>
/// 下拉显示值
/// </summary>
public string Label { get; set; } = string.Empty;
/// <summary>
/// 下拉实际值
/// </summary>
public object Value { get; set; }
}
} }

View File

@@ -15,6 +15,14 @@ namespace ZR.Model.MES.wms.Dto
public int? Date { get; set; } public int? Date { get; set; }
public string CustomNo { get; set; } public string CustomNo { get; set; }
/// <summary>
/// 出库单状态1-出库中 2-出库完成 3-弃用)
/// </summary>
public int Type { get; set; } = -1;
/// <summary>
/// 状态0-停用 1-启用)
/// </summary>
public int Status { get; set; } = -1;
} }
/// <summary> /// <summary>

View File

@@ -60,6 +60,18 @@ namespace ZR.Service.mes.wms.IService
/// <param name="parm"></param> /// <param name="parm"></param>
/// <returns></returns> /// <returns></returns>
PagedInfo<WmGoodsBatchTableDto> GetBatchOutRecordTreeLazyByPartnumber(WmGoodsBatchSearchDto parm); PagedInfo<WmGoodsBatchTableDto> GetBatchOutRecordTreeLazyByPartnumber(WmGoodsBatchSearchDto parm);
/// <summary>
/// 9.树表最外层查询(出库记录根据出库单号聚合)
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
PagedInfo<WmGoodsBatchTableDto> GetBatchOutRecordByShipmentNum(WmGoodsBatchSearchDto parm);
/// <summary>
/// 10.树表子节点懒加载查询(出库记录根据出库单号聚合)
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
PagedInfo<WmGoodsBatchTableDto> GetBatchOutRecordTreeLazyByShipmentNum(WmGoodsBatchSearchDto parm);
} }
} }

View File

@@ -44,5 +44,7 @@ namespace ZR.Service.mes.wms.IService
int ModifyInventoryQuantity(string id, int stack_num); int ModifyInventoryQuantity(string id, int stack_num);
PagedInfo<WmGoodsNowProductionDictDto> GetDictData(WmGoodsNowProductionDictDto parm);
} }
} }

View File

@@ -434,5 +434,97 @@ namespace ZR.Service.Business
} }
} }
public PagedInfo<WmGoodsBatchTableDto> GetBatchOutRecordByShipmentNum(WmGoodsBatchSearchDto parm)
{
try
{
// 查询条件
var exp = Expressionable.Create<WmGoodsOutRecord>()
.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<WmGoodsBatchTableDto> result = Context.SqlQueryable<WmGoodsOutRecord>(sql)
.Where(exp)
.Select<WmGoodsBatchTableDto>()
.ToPage(parm);
return result;
}
catch
{
return null;
}
}
public PagedInfo<WmGoodsBatchTableDto> GetBatchOutRecordTreeLazyByShipmentNum(WmGoodsBatchSearchDto parm)
{
try
{
PagedInfo<WmGoodsBatchTableDto> result = new PagedInfo<WmGoodsBatchTableDto>();
// 出库记录
List<WmGoodsBatchTableDto> list = Context.Queryable<WmGoodsOutRecord>()
.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<WmMaterial>()
.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;
}
}
} }
} }

View File

@@ -299,6 +299,60 @@ namespace ZR.Service.mes.wms
.SetColumns(it => it.GoodsNumAction == stack_num) .SetColumns(it => it.GoodsNumAction == stack_num)
.Where(it => it.Id == id).ExecuteCommand(); .Where(it => it.Id == id).ExecuteCommand();
} }
public PagedInfo<WmGoodsNowProductionDictDto> GetDictData(WmGoodsNowProductionDictDto parm)
{
var predicate = Expressionable.Create<WmGoodsNowProduction>()
.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<WmMaterial>()
.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;
}
} }

View File

@@ -39,6 +39,8 @@ namespace ZR.Service.mes.wms
var predicate = Expressionable.Create<WmOutOrder>() var predicate = Expressionable.Create<WmOutOrder>()
.AndIF(!string.IsNullOrEmpty(parm.ShipmentNum), it => it.ShipmentNum.Contains(parm.ShipmentNum)) .AndIF(!string.IsNullOrEmpty(parm.ShipmentNum), it => it.ShipmentNum.Contains(parm.ShipmentNum))
.AndIF(!string.IsNullOrEmpty(parm.CustomNo), it => it.CustomNo.Contains(parm.CustomNo)) .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.Year > 0, it => it.Year == parm.Year)
.AndIF(parm.Week > 0, it => it.Year == parm.Week) .AndIF(parm.Week > 0, it => it.Year == parm.Week)
.AndIF(parm.Date > 0, it => it.Year == parm.Date) .AndIF(parm.Date > 0, it => it.Year == parm.Date)
@@ -149,7 +151,7 @@ namespace ZR.Service.mes.wms
{ {
return null; return null;
} }
} }
/// <summary> /// <summary>
/// 删除出货单关联的物料出货单 /// 删除出货单关联的物料出货单
@@ -259,11 +261,11 @@ namespace ZR.Service.mes.wms
material_num = material_num + (int)product.GoodsNumLogic; material_num = material_num + (int)product.GoodsNumLogic;
} }
} }
wmMaterialQuery_Stock_item.stockQuantity = material_num; wmMaterialQuery_Stock_item.stockQuantity = material_num;
material_stockQuantity_list.Add(wmMaterialQuery_Stock_item); material_stockQuantity_list.Add(wmMaterialQuery_Stock_item);
@@ -567,7 +569,7 @@ namespace ZR.Service.mes.wms
// 当前工单出库计划 // 当前工单出库计划
var exp = Expressionable.Create<WmOutOrderPlan>() var exp = Expressionable.Create<WmOutOrderPlan>()
.And(it => it.FkOutOrderId == shipment_num) .And(it => it.FkOutOrderId == shipment_num)
.AndIF(!string.IsNullOrEmpty(partnumber),it => it.MaterialCode == partnumber) .AndIF(!string.IsNullOrEmpty(partnumber), it => it.MaterialCode == partnumber)
.ToExpression(); .ToExpression();
List<WmOutOrderPlan> wmOutOrderPlan = Context.Queryable<WmOutOrderPlan>() List<WmOutOrderPlan> wmOutOrderPlan = Context.Queryable<WmOutOrderPlan>()
.Where(exp) .Where(exp)
@@ -590,6 +592,7 @@ namespace ZR.Service.mes.wms
// 出库记录 // 出库记录
List<WmGoodsOutRecord> outPackageList = Context.Queryable<WmGoodsOutRecord>() List<WmGoodsOutRecord> outPackageList = Context.Queryable<WmGoodsOutRecord>()
.Where(it => it.PackageCodeClient.Contains(item.Patchcode)) .Where(it => it.PackageCodeClient.Contains(item.Patchcode))
.Where(it => it.FkOutOrderId == shipment_num)
.ToList(); .ToList();
int outPackageNum = 0; int outPackageNum = 0;
int outPartnumberNum = 0; int outPartnumberNum = 0;
@@ -616,7 +619,7 @@ namespace ZR.Service.mes.wms
OutPackageNum = outPackageNum, OutPackageNum = outPackageNum,
OutPartnumberNum = outPartnumberNum, OutPartnumberNum = outPartnumberNum,
IsError = (nowPartnumberNum + outPartnumberNum) != item.PartnumberNum, IsError = (nowPartnumberNum + outPartnumberNum) != item.PartnumberNum,
IsOver = outPartnumberNum == item.PartnumberNum IsOver = outPartnumberNum > item.PartnumberNum
}; };
result.Add(newItem); result.Add(newItem);
} }
@@ -660,7 +663,7 @@ namespace ZR.Service.mes.wms
//3 判断箱子是否配置零件号 //3 判断箱子是否配置零件号
if (parnumber != resultionPackage.PartNumner) if (parnumber != resultionPackage.PartNumner)
{ {
return "此箱子不选择的物料号"; return "此箱子不选择的物料号";
} }
// 3.1判断是否已入库 // 3.1判断是否已入库
@@ -683,8 +686,9 @@ namespace ZR.Service.mes.wms
//} //}
// 5. 确保出最早批次 // 5. 确保出最早批次
string short_path = resultionPackage.PatchCode.Split('_')[0]; string short_path = resultionPackage.PatchCode.Split('_')[0];
// 严格规则
WmOutOrderPlan plan_item = Context.Queryable<WmOutOrderPlan>() return CheckRuleJudgmentFirstInFirstOut(shipment_num, short_path);
/*WmOutOrderPlan plan_item = Context.Queryable<WmOutOrderPlan>()
.Where(it => it.FkOutOrderId == shipment_num) .Where(it => it.FkOutOrderId == shipment_num)
.Where(it => it.Patchcode == short_path) .Where(it => it.Patchcode == short_path)
.OrderBy(it => it.Outorder) .OrderBy(it => it.Outorder)
@@ -692,18 +696,28 @@ namespace ZR.Service.mes.wms
if (plan_item != null) if (plan_item != null)
{ {
// 查看此批次号在此工单下已出库箱子数量
int patchInNum = Context.Queryable<WmGoodsOutRecord>()
.Where(it => it.PackageCodeClient.Contains(short_path))
.Where(it => it.FkOutOrderId == shipment_num)
.Count();
var plan_earliest = Context.Queryable<WmOutOrderPlan>() var plan_earliest = Context.Queryable<WmOutOrderPlan>()
.Where(it => it.FkOutOrderId == shipment_num) .Where(it => it.FkOutOrderId == shipment_num)
.Where(it => it.MaterialCode == plan_item.MaterialCode) .Where(it => it.MaterialCode == plan_item.MaterialCode)
.Where(it => it.PackageNum > it.ReceivedPackNum) .Where(it => it.PackageNum > patchInNum)
.OrderBy(it => it.Outorder) .OrderBy(it => it.Outorder)
.First(); .First();
//已经出库完成,没有可以出库的了 //已经出库完成,没有可以出库的了
if (plan_earliest == null) 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"; return "ok";
} }
@@ -711,7 +725,7 @@ namespace ZR.Service.mes.wms
{ {
return "不是此物料最早批次,无法出库"; return "不是此物料最早批次,无法出库";
} }
} }*/
// 6 .还差一个 数量超过要出库的箱子 // 6 .还差一个 数量超过要出库的箱子
return "此箱标签不可出库,批次号不在出库单计划内!请检查出库单计划!"; return "此箱标签不可出库,批次号不在出库单计划内!请检查出库单计划!";
} }
@@ -743,6 +757,80 @@ namespace ZR.Service.mes.wms
return result; return result;
} }
/// <summary>
/// 出库单先进先出规则判断(严格复杂版)
/// </summary>
/// <param name="shipment_num">工单号</param>
/// <param name="shortPackageCode">短批次号</param>
/// <returns> "ok" 代表通过,其余返回错误提示</returns>
/// <exception cref="NotImplementedException"></exception>
public string CheckRuleJudgmentFirstInFirstOut(string shipment_num, string shortPackageCode)
{
// 1.检查是否有记录
var exp1 = Expressionable.Create<WmOutOrderPlan>()
.And(it => it.FkOutOrderId == shipment_num)
.And(it => it.Patchcode == shortPackageCode)
.ToExpression();
bool hasRecord = Context.Queryable<WmOutOrderPlan>()
.Where(exp1)
.Any();
if (!hasRecord)
{
return "此批次号不在出库单计划中!";
}
// 1.取出出库单计划
List<WmOutOrderPlan> plans = Context.Queryable<WmOutOrderPlan>()
.Where(it => it.FkOutOrderId == shipment_num)
.OrderBy(it => it.Outorder)
.ToList();
foreach (WmOutOrderPlan plan in plans)
{
// 2.此出库单下的批次号的已出库记录
var exp2 = Expressionable.Create<WmGoodsOutRecord>()
.And(it => it.PackageCodeClient.Contains(plan.Patchcode))
.And(it => it.FkOutOrderId == shipment_num)
.ToExpression();
List<WmGoodsOutRecord> outPackageList = Context.Queryable<WmGoodsOutRecord>()
.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 "经检查,此批次号不在出库单计划中!";
}
} }
} }