|
|
@@ -6202,7 +6202,12 @@ namespace Business.Replenishment
|
|
|
//获取货源清单数据(配额比例为0的排除)
|
|
|
List<string> itemnums = demandplans.Select(p => p.itemnum).ToList();
|
|
|
var purchases = _srmPurchase.GetListAsync(p => p.factory_id.ToString() == domain && p.is_active == "否" && itemnums.Contains(p.number) && p.quota_rate > 0 && !p.IsDeleted).Result;
|
|
|
- //获取PO可用明细数据:未关闭,且未交货数量(需求数量-已收数量)>0
|
|
|
+ if (!purchases.Any())
|
|
|
+ {
|
|
|
+ Msg = "NO|没有可用的货源清单";
|
|
|
+ return Msg;
|
|
|
+ }
|
|
|
+ //获取采购明细数据:未关闭,且未交货数量(需求数量-已收数量)>0
|
|
|
List<PurOrdDetail> purOrdDetails = _PurOrdDetail.Select(p => p.Domain == domain && itemnums.Contains(p.ItemNum) && p.Status.ToUpper() != "C" && (p.QtyOrded - p.RctQty)>0).OrderBy(p=>p.DueDate).ToList();
|
|
|
if (!purOrdDetails.Any())
|
|
|
{
|
|
|
@@ -6226,8 +6231,8 @@ namespace Business.Replenishment
|
|
|
foreach (var item in demandplans)
|
|
|
{
|
|
|
//获取当前交货计划物料对应的货源清单
|
|
|
- var curChaes = purchases.Where(p => p.number == item.itemnum).ToList();
|
|
|
- //获取当前交货计划物料对应的采购单明细数据
|
|
|
+ var curChaes = purchases.Where(p => p.number == item.itemnum).OrderByDescending(p=>p.quota_rate).ToList();
|
|
|
+ //获取当前交货计划物料对应的可用采购单明细数据
|
|
|
var curPurDtls = purOrdDetails.Where(p => p.ItemNum == item.itemnum).OrderBy(p=>p.DueDate).ToList();
|
|
|
//数据库中当前采购单明细被交货单占用情况
|
|
|
var curDbOccupys = dbPolistds.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == item.itemnum).ToList();
|
|
|
@@ -6259,20 +6264,39 @@ namespace Business.Replenishment
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
+ //当前交货计划已分配数量
|
|
|
+ decimal allQty = 0m;
|
|
|
//当前供应商分配数量数量
|
|
|
decimal needQty = 0m;
|
|
|
- //已分配数量合计
|
|
|
+ //当前供应商已分配数量合计
|
|
|
decimal sumNeedQty = 0m;
|
|
|
- //剩余需要分配数量
|
|
|
+ //当前供应商剩余需要分配数量
|
|
|
decimal remainQty = 0m;
|
|
|
- //存在货源清单,po可用数量满足当前交货计划,则先计算供应商配额,然后,再占用po可用数量
|
|
|
+ //存在货源清单,采购单明细可用数量满足当前交货计划,则先计算供应商配额,然后,再占用采购单明细可用数量
|
|
|
foreach (var pch in curChaes)
|
|
|
{
|
|
|
+ //如果交货计划已分配数量>=交货计划净需求数量,则终止
|
|
|
+ if (allQty >= item.tosechedqty)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //供应商占用数量置0
|
|
|
+ sumNeedQty = 0m;
|
|
|
//计算当前供应商分配数量
|
|
|
needQty = item.tosechedqty * pch.quota_rate.GetValueOrDefault();
|
|
|
+ //如果交货计划剩余数量小于按照供应商配额计算的数量,则当前供应商需分配数量为交货计划剩余数量
|
|
|
+ if (item.tosechedqty - allQty < needQty)
|
|
|
+ {
|
|
|
+ needQty = item.tosechedqty - allQty;
|
|
|
+ }
|
|
|
//按照采购单明细数据交货日期从小到大开始占用
|
|
|
foreach (var pud in curPurDtls)
|
|
|
{
|
|
|
+ if (sumNeedQty >= needQty)
|
|
|
+ {
|
|
|
+ //当前供应商配额以满足,循环下一个供应商
|
|
|
+ break;
|
|
|
+ }
|
|
|
//当前采购明细剩余数量=订单数量-已收数量
|
|
|
decimal syQty = pud.QtyOrded - pud.RctQty;
|
|
|
//当前采购明细被占用数量(已占用数量)
|
|
|
@@ -6313,7 +6337,7 @@ namespace Business.Replenishment
|
|
|
entity.Id = help.NextId();
|
|
|
entity.domain = domain;
|
|
|
entity.icdsid = item.Id;
|
|
|
- //TODO:调用存储过程生成交货单号
|
|
|
+ //交货单号最后一次性生成
|
|
|
entity.dsnum = "";
|
|
|
entity.status = "N";
|
|
|
entity.itemnum = item.itemnum;
|
|
|
@@ -6330,6 +6354,11 @@ namespace Business.Replenishment
|
|
|
entity.createtime = DateTime.Now;
|
|
|
entity.createuser = user;
|
|
|
inserts.Add(entity);
|
|
|
+
|
|
|
+ //当前交货计划已分配数量累加
|
|
|
+ allQty += xqQty;
|
|
|
+ //当前供应商已分配数量累加
|
|
|
+ sumNeedQty += xqQty;
|
|
|
}
|
|
|
}
|
|
|
}
|