仓库-出库单,出库记录,批量查看,成品库等功能优化调整,出库逻辑调整
This commit is contained in:
@@ -60,6 +60,18 @@ namespace ZR.Service.mes.wms.IService
|
||||
/// <param name="parm"></param>
|
||||
/// <returns></returns>
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,5 +44,7 @@ namespace ZR.Service.mes.wms.IService
|
||||
|
||||
int ModifyInventoryQuantity(string id, int stack_num);
|
||||
|
||||
PagedInfo<WmGoodsNowProductionDictDto> GetDictData(WmGoodsNowProductionDictDto parm);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -299,6 +299,60 @@ namespace ZR.Service.mes.wms
|
||||
.SetColumns(it => it.GoodsNumAction == stack_num)
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -39,6 +39,8 @@ namespace ZR.Service.mes.wms
|
||||
var predicate = Expressionable.Create<WmOutOrder>()
|
||||
.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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除出货单关联的物料出货单
|
||||
@@ -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<WmOutOrderPlan>()
|
||||
.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> wmOutOrderPlan = Context.Queryable<WmOutOrderPlan>()
|
||||
.Where(exp)
|
||||
@@ -590,6 +592,7 @@ namespace ZR.Service.mes.wms
|
||||
// 出库记录
|
||||
List<WmGoodsOutRecord> outPackageList = Context.Queryable<WmGoodsOutRecord>()
|
||||
.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<WmOutOrderPlan>()
|
||||
// 严格规则
|
||||
return CheckRuleJudgmentFirstInFirstOut(shipment_num, short_path);
|
||||
/*WmOutOrderPlan plan_item = Context.Queryable<WmOutOrderPlan>()
|
||||
.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<WmGoodsOutRecord>()
|
||||
.Where(it => it.PackageCodeClient.Contains(short_path))
|
||||
.Where(it => it.FkOutOrderId == shipment_num)
|
||||
.Count();
|
||||
var plan_earliest = Context.Queryable<WmOutOrderPlan>()
|
||||
.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;
|
||||
}
|
||||
|
||||
|
||||
/// <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 "经检查,此批次号不在出库单计划中!";
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user