Przeglądaj źródła

交货计划生成交货单调整

heteng 2 lat temu
rodzic
commit
c4ff0e9ce3

+ 36 - 7
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -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;
                     }
                 }
             }