Kaynağa Gözat

Merge branch 'dev' of http://123.60.180.165:4647/ZZYDOP/DOPCore into dev

tangdi 2 yıl önce
ebeveyn
işleme
647e81f93c

+ 45 - 10
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -6693,6 +6693,7 @@ namespace Business.Replenishment
             string Msg = "OK|交货单生成成功";
             //获取已发布且净需求数量大于0的交货计划数据
             var demandplans = _icdemandschedule.GetListAsync(p => p.factory_id.ToString() == domain && p.status.ToUpper() == "P" && p.tosechedqty > 0 && !p.IsDeleted).Result.OrderBy(p => p.arrivaldate).ToList();
+            //var demandplans = _icdemandschedule.GetListAsync(p => p.factory_id.ToString() == domain && p.status.ToUpper() == "P" && p.itemnum == "94000266" && p.tosechedqty > 0 && !p.IsDeleted).Result.OrderBy(p => p.arrivaldate).ToList();
             //获取已以生成交货单的交货计划
             var alreadys = _srmpolistds.Select(p => p.domain == domain && demandplans.Select(m => m.Id).Contains(p.icdsid) && p.isactive == 1).ToList();
             List<ic_demandschedule> newPlans = new List<ic_demandschedule>();
@@ -6730,9 +6731,18 @@ namespace Business.Replenishment
                 }
                 demandplans = newPlans;
             }
+            //根据交货计划物料编码,获取物料属性为采购件的物料主数据
+            List<ItemMaster> itemMasters = _itemMaster.Select(p => demandplans.Select(m => m.itemnum).Contains(p.ItemNum) && p.Domain == domain && (p.PurMfg == "P" || p.PurMfg == "p")).ToList();
+            if (!itemMasters.Any())
+            {
+                Msg = "OK|物料需求计划中没有采购件,不需要生成交货单";
+                return Msg;
+            }
+            //过滤掉物料属性不为采购件的交货计划
+            demandplans = demandplans.Where(p => itemMasters.Select(m => m.ItemNum).Contains(p.itemnum)).ToList();
             if (!demandplans.Any())
             {
-                Msg = "OK|没有需要生成的交货单";
+                Msg = "OK|物料需求计划中没有采购件,不需要生成交货单";
                 return Msg;
             }
             //获取货源清单数据
@@ -6790,7 +6800,7 @@ namespace Business.Replenishment
                     info.Icdsid = demandplans[i].Id;
                     info.ItemNum = demandplans[i].itemnum;
                     info.CreateTime = DateTime.Now;
-                    info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]没有维护货源清单,无法转交货单";
+                    info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]没有维护货源清单,无法转交货单";
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
@@ -6803,7 +6813,7 @@ namespace Business.Replenishment
                     info.Icdsid = demandplans[i].Id;
                     info.ItemNum = demandplans[i].itemnum;
                     info.CreateTime = DateTime.Now;
-                    info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]的货源清单供应商配额之和不为100%,无法转交货单";
+                    info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]的货源清单供应商配额之和不为100%,无法转交货单";
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
@@ -6818,7 +6828,7 @@ namespace Business.Replenishment
                     info.Icdsid = demandplans[i].Id;
                     info.ItemNum = demandplans[i].itemnum;
                     info.CreateTime = DateTime.Now;
-                    info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]没有可占用的采购明细,无法转交货单";
+                    info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]没有可占用的采购明细,无法转交货单";
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
@@ -6847,7 +6857,7 @@ namespace Business.Replenishment
                     info.Icdsid = demandplans[i].Id;
                     info.ItemNum = demandplans[i].itemnum;
                     info.CreateTime = DateTime.Now;
-                    info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]的采购明细可用数量不足,无法转交货单";
+                    info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]的采购明细可用数量不足,无法转交货单";
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
@@ -6895,7 +6905,7 @@ namespace Business.Replenishment
                         info.Icdsid = demandplans[i].Id;
                         info.ItemNum = demandplans[i].itemnum;
                         info.CreateTime = DateTime.Now;
-                        info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + curChaes[j].supplier_name + "]没有可用采购明细,无法转交货单";
+                        info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + curChaes[j].supplier_name + "]没有可用采购明细,无法转交货单";
                         info.OptTime = optime;
                         exceptions.Add(info);
 
@@ -6938,7 +6948,7 @@ namespace Business.Replenishment
                         info.Icdsid = demandplans[i].Id;
                         info.ItemNum = demandplans[i].itemnum;
                         info.CreateTime = DateTime.Now;
-                        info.Remark = "交货计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + curChaes[j].supplier_name + "]采购明细可用数量不足,无法转交货单";
+                        info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + curChaes[j].supplier_name + "]采购明细可用数量不足,无法转交货单";
                         info.OptTime = optime;
                         exceptions.Add(info);
 
@@ -6946,8 +6956,9 @@ namespace Business.Replenishment
                         break;
                     }
 
-                    //采购单按照需求日期从小到大排
-                    pchPurDtls = pchPurDtls.OrderBy(p => p.DueDate).ToList();
+                    //采购单明细优先级:先PO,按照交货日期从早到晚占用;再DO,按照交货日期从早到晚占用
+                    //pchPurDtls = pchPurDtls.OrderBy(p => p.DueDate).ToList();
+                    pchPurDtls = CalcPurDetailPriority(pchPurDtls);
                     for (int k = 0; k < pchPurDtls.Count; k++)
                     {
                         if (sumNeedQty >= needQty)
@@ -6956,7 +6967,7 @@ namespace Business.Replenishment
                             break;
                         }
                         //当前采购明细剩余数量=订单数量-送货单数量(不是由交货单转的送货单)
-                        decimal syQty = pchPurDtls[k].QtyOrded - pchShds.Where(p => p.po_billline == pchPurDtls[k].Line.ToString()).Sum(p=>p.sh_delivery_quantity);
+                        decimal syQty = pchPurDtls[k].QtyOrded - pchShds.Where(p => p.po_bill == pchPurDtls[k].PurOrd && p.po_billline == pchPurDtls[k].Line.ToString()).Sum(p=>p.sh_delivery_quantity);
                         //当前采购明细被占用数量(已占用数量)
                         var occupy = pchDbOccupys.Where(p => p.ponumber == pchPurDtls[k].PurOrd && p.itemnum == pchPurDtls[k].ItemNum && p.poline == pchPurDtls[k].Line).ToList();
                         decimal yzyQty = occupy.Where(p=>p.status.ToUpper() == "C").Sum(p => p.sentqty) + occupy.Where(p=>p.status.ToUpper() != "C").Sum(p=>p.schedqty);
@@ -7078,5 +7089,29 @@ namespace Business.Replenishment
             }
             return Msg;
         }
+
+        /// <summary>
+        /// 计算采购单明细的占用优先级
+        /// </summary>
+        /// <param name="details"></param>
+        /// <returns></returns>
+        public List<PurOrdDetail> CalcPurDetailPriority(List<PurOrdDetail> details)
+        { 
+            List<PurOrdDetail> newDetails = new List<PurOrdDetail>();
+            //获取DO
+            var doLists = details.Where(p => p.PurOrd.StartsWith("DO")).OrderBy(p=>p.DueDate).ToList();
+            //获取PO
+            var poLists = details.Where(p => !doLists.Select(m => m.PurOrd).Contains(p.PurOrd)).OrderBy(p => p.DueDate).ToList();
+            foreach (var item in poLists)
+            {
+                newDetails.Add(item);
+            }
+            foreach (var item in doLists)
+            {
+                newDetails.Add(item);
+            }
+            return newDetails;
+        }
+
     }
 }