using iWareCommon.Utils;
using iWareSql.MyDbContext;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Admin.NET.Application
{
///
/// 库存帮助类
///
public class InventoryHelper
{
///
/// 清理库存
///
/// 要更新的数据库库存ID集合
///
///
/// 要处理的物料编号
///
public static (List deleteware_container_vs_materialList, List updateware_container_vs_materialList, List records)
RemoveInventory(ref List updateDbIds, ref List containerVsMaterialList, decimal quantity, string materialCode, string sapLocation)
{
List deleteware_container_vs_materialList = new List();
List updateware_container_vs_materialList = new List();
List records = new List();
//这里不需要重新赋值!!!! 【Editby shaocx,2023-05-18】
//按照批次号挨个扣减
//containerVsMaterialList = containerVsMaterialList.Where(x=>x.WareMaterialCode== wareMaterialCode).OrderBy(x => x.BarNo).ToList();//按照批次号升序排列
var new_containerVsMaterialList = containerVsMaterialList.Where(x => x.WareMaterialCode == materialCode && x.Sap_Location == sapLocation).OrderBy(x => x.BarNo).ToList();//按照批次号升序排列
decimal num = quantity;
foreach (var item in new_containerVsMaterialList)
{
if (item.Quantity == item.OCCQuantity)
{
item.IsDeleted = true;//删除库存 ! 【Editby shaocx,2023-05-18】
updateDbIds.Add(item.Id);
continue;
}
if (item.WareMaterialCode != materialCode || item.IsDeleted == true)
{
continue;
}
if (num == 0)
break;
if (num >= (item.Quantity - item.OCCQuantity))
{
//需要移除该物料数据
deleteware_container_vs_materialList.Add(item);
item.IsDeleted = true;//删除库存 ! 【Editby shaocx,2023-05-18】
num = num - Convert.ToDecimal((item.Quantity - item.OCCQuantity));
records.Add(new ware_container_vs_material()//这是参数,不是表数据
{
WareContainerCode = item.WareContainerCode,
WareMaterialCode = item.WareMaterialCode,
BarNo = item.BarNo,
Sap_Location = item.Sap_Location,
Quantity = Convert.ToDecimal((item.Quantity - item.OCCQuantity)),
RecordInsertTime = item.RecordInsertTime
});
updateDbIds.Add(item.Id);
}
else
{
item.OCCQuantity += num;//更新库存 ! 【Editby shaocx,2023-05-18】
updateware_container_vs_materialList.Add(item);
records.Add(new ware_container_vs_material()//这是参数,不是表数据
{
WareContainerCode = item.WareContainerCode,
WareMaterialCode = item.WareMaterialCode,
BarNo = item.BarNo,
Sap_Location = item.Sap_Location,
Quantity = num,
RecordInsertTime = item.RecordInsertTime
});
updateDbIds.Add(item.Id);
num = 0;//赋值为0一定要放到最后面!
break;
}
}
//增加验证 【Editby shaocx,2023-05-18】
if (num > 0)
{
//throw new System.Exception($"扣减库存,物料{materialCode}没有被扣减完全!");
//记录日志
Log4NetHelper.WriteErrorLog(LogType.RgvThreadService, $"扣减库存,物料{materialCode}没有被扣减完全!");
}
return (deleteware_container_vs_materialList: deleteware_container_vs_materialList, updateware_container_vs_materialList: updateware_container_vs_materialList, records: records);
}
}
}