Quellcode durchsuchen

交货单生成调整

heteng vor 2 Jahren
Ursprung
Commit
9233ef1b1a

+ 119 - 101
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -1,4 +1,5 @@
-using Business.Core.Enum;
+using Amazon.Runtime.Internal.Util;
+using Business.Core.Enum;
 using Business.Core.Utilities;
 using Business.Domain;
 using Business.Dto;
@@ -6699,7 +6700,6 @@ 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 && string.IsNullOrEmpty(p.ishistoryversion)).Result.OrderBy(p => p.arrivaldate).ToList();
-            //var demandplans = _icdemandschedule.GetListAsync(p => p.factory_id.ToString() == domain && p.status.ToUpper() == "P" && p.Id == 1858630771946815625 && 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>();
@@ -6751,8 +6751,10 @@ namespace Business.Replenishment
                 Msg = "OK|物料需求计划中没有采购件,不需要生成交货单";
                 return Msg;
             }
-            //获取货源清单数据
             List<string> itemnums = demandplans.Select(p => p.itemnum).ToList();
+            //获取物料主数据
+            var icitems = _mysql_ic_item.GetListAsync(a => itemnums.Contains(a.number) && a.factory_id.ToString() == domain && !a.IsDeleted).Result.ToList();
+            //获取货源清单数据
             var purchases = _srmPurchase.GetListAsync(p => p.factory_id.ToString() == domain && p.is_active == "否" && itemnums.Contains(p.number) && !p.IsDeleted).Result;
             if (!purchases.Any())
             {
@@ -6761,11 +6763,6 @@ namespace Business.Replenishment
             }
             //获取采购明细数据:未关闭,且未交货数量(需求数量-已收数量)>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())
-            {
-                Msg = "NO|没有可用的采购单";
-                return Msg;
-            }
             List<string> purOrds = purOrdDetails.Select(p => p.PurOrd).Distinct().ToList();
             //获取送货单子表数据
             List<scm_shdzb> shdzbs = _scm_shdzb.Select(p=> purOrds.Contains(p.po_bill) && itemnums.Contains(p.sh_material_code) && string.IsNullOrEmpty(p.jhdbh)).ToList();
@@ -6789,19 +6786,26 @@ namespace Business.Replenishment
                 newPurMasters.AddRange(kyDoList);
             }
             purOrdMasters = newPurMasters;
-            if (!purOrdMasters.Any())
-            {
-                Msg = "NO|没有可用的采购单";
-                return Msg;
-            }
             //过滤采购单明细
             purOrdDetails = purOrdDetails.Where(p => purOrdMasters.Select(m => m.PurOrd).Contains(p.PurOrd)).ToList();
 
+            //获取系统级参数:是否启用计划协议(0不启用,1启用)
+            var sysSet = _generalizedCodeMaster.Select(s => s.FldName == "SystemConfig" && s.Val == "ScheduleAgreement" && s.Domain == param.factoryId.ToString()).ToList();
+            int ScheduleAgreement = 0;
+            if (sysSet.Any())
+            {
+                if (!string.IsNullOrEmpty(sysSet[0].Ufld1))
+                {
+                    int.TryParse(sysSet[0].Ufld1, out ScheduleAgreement);
+                }
+            }
+
             //生成交货单
             srm_polist_ds entity;
             List<srm_polist_ds> inserts = new List<srm_polist_ds>();
-            //当前交货计划转交货单数据
-            List<srm_polist_ds> curInserts = new List<srm_polist_ds>();
+            //新生成的PR
+            srm_pr_main srm_Pr = new srm_pr_main();
+            List<srm_pr_main> prInserts = new List<srm_pr_main>();
             //交货单异常记录
             List<DeliveryExceptionMaster> exceptions = new List<DeliveryExceptionMaster>();
             DeliveryExceptionMaster info = new DeliveryExceptionMaster();
@@ -6818,51 +6822,52 @@ namespace Business.Replenishment
             demandplans = demandplans.OrderBy(p => p.requestdate).ToList();
             for (int i = 0; i < demandplans.Count; i++)
             {
-                curInserts = new List<srm_polist_ds>();
-                //获取当前交货计划物料对应的货源清单
-                var curChaes = purchases.Where(p => p.number == demandplans[i].itemnum).OrderByDescending(p => p.quota_rate).ToList();
-                //校验1:如果当前物料没有维护货源清单,则跳过
-                if (!curChaes.Any())
+                //物料数据
+                var curItem = icitems.FirstOrDefault(p=>p.number == demandplans[i].itemnum);
+                if (curItem == null)
                 {
+                    //添加异常记录
                     info = new DeliveryExceptionMaster();
                     info.Domain = domain;
                     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") + "]物料尚未同步到ic_item表,请同步后再生成交货单";
+                    info.NeedQty = 0;
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
                 }
-                //校验2:如果当前物料对应货源清单的供应商配额之和不为100%,则跳过
-                if (curChaes.Sum(p => p.quota_rate.GetValueOrDefault()) != 100)
+                //获取当前交货计划物料对应的货源清单
+                var curChaes = purchases.Where(p => p.number == demandplans[i].itemnum).OrderByDescending(p => p.quota_rate).ToList();
+                //校验1:如果当前物料没有维护货源清单,则跳过
+                if (!curChaes.Any())
                 {
                     info = new DeliveryExceptionMaster();
                     info.Domain = domain;
                     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") + "]没有维护货源清单,无法转交货单";
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
                 }
-                //获取当前交货计划物料对应的可用采购单明细数据
-                var curPurDtls = purOrdDetails.Where(p => p.ItemNum == demandplans[i].itemnum).OrderBy(p => p.DueDate).ToList();
-                //校验3:如果当前物料没有可用的采购明细,则跳过
-                if (!curPurDtls.Any())
+                //校验2:如果当前物料对应货源清单的供应商配额之和不为100%,则跳过
+                if (curChaes.Sum(p => p.quota_rate.GetValueOrDefault()) != 100)
                 {
                     info = new DeliveryExceptionMaster();
                     info.Domain = domain;
                     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.NeedQty = demandplans[i].tosechedqty;
+                    info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]的货源清单供应商配额之和不为100%,无法转交货单";
                     info.OptTime = optime;
                     exceptions.Add(info);
                     continue;
                 }
+                //获取当前交货计划物料对应的可用采购单明细数据
+                var curPurDtls = purOrdDetails.Where(p => p.ItemNum == demandplans[i].itemnum).OrderBy(p => p.DueDate).ToList();
                 //当前采购明细对应的采购单
                 var curPurMsts = purOrdMasters.Where(p => curPurDtls.Select(m => m.PurOrd).Distinct().Contains(p.PurOrd)).ToList();
                 //当前采购明细对应的送货单
@@ -6871,30 +6876,7 @@ namespace Business.Replenishment
                 var curDbOccupys = dbPolistds.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == demandplans[i].itemnum).ToList();
                 //本次计算中采购单明细被交货单占用情况
                 var curCalcOccupys = inserts.Where(p => curPurDtls.Select(m => m.PurOrd).Contains(p.ponumber) && p.itemnum == demandplans[i].itemnum).ToList();
-                //校验4:如果当前物料对应的采购明细可用数量不满足,则跳过
-                //采购单明细的剩余未交数量:采购明细的需求数量-送货单需求数量(不是交货单转的送货单)
-                sumRestQty = curPurDtls.Sum(p => p.QtyOrded) - curShds.Sum(p=>p.sh_delivery_quantity);
-                //交货单占用数量:交货单的需求数量
-                sumDbOccupy = curDbOccupys.Where(p=>p.status.ToUpper() == "C").Sum(p => p.sentqty) + curDbOccupys.Where(p=>p.status.ToUpper() != "C").Sum(p=>p.schedqty);
-                //本次计算交货单占用数量:本次计算交货单的需求数量
-                sumCurOccupy = curCalcOccupys.Sum(p => p.schedqty);
-                //剩余可用数量
-                restQty = sumRestQty - sumDbOccupy - sumCurOccupy;
-                if (restQty < demandplans[i].tosechedqty)
-                {
-                    info = new DeliveryExceptionMaster();
-                    info.Domain = domain;
-                    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.NeedQty = demandplans[i].tosechedqty - restQty;
-                    info.OptTime = optime;
-                    exceptions.Add(info);
-                    continue;
-                }
-                //标志位
-                bool flag = false;
+                
                 //当前交货计划已分配数量
                 decimal allQty = 0m;
                 //当前供应商分配数量
@@ -6925,42 +6907,9 @@ namespace Business.Replenishment
                     {
                         needQty = demandplans[i].tosechedqty - allQty;
                     }
-                    //以下为供应商是采购申请场景
                     //获取当前供应商对应的采购单明细数据,按照交货日期从小到大开始占用
                     var pchPurMsts = curPurMsts.Where(p => p.Supp == curChaes[j].supplier_number).ToList();
-                    if (!pchPurMsts.Any())
-                    {
-                        //当前供应商没有可用采购单,则当前交货计划无法转交货单
-                        info = new DeliveryExceptionMaster();
-                        info.Domain = domain;
-                        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 + "]没有可用"+ (curChaes[j].IsRequireGoods == 0 ?"采购申请":"要货令") +",无法转交货单";
-                        info.NeedQty = needQty;
-                        info.OptTime = optime;
-                        exceptions.Add(info);
-
-                        flag = true;
-                        break;
-                    }
                     var pchPurDtls = curPurDtls.Where(p => pchPurMsts.Select(m => m.PurOrd).Contains(p.PurOrd)).ToList();
-                    if (!pchPurDtls.Any())
-                    {
-                        //当前供应商没有可用采购单明细,则当前交货计划无法转交货单
-                        info = new DeliveryExceptionMaster();
-                        info.Domain = domain;
-                        info.Icdsid = demandplans[i].Id;
-                        info.ItemNum = demandplans[i].itemnum;
-                        info.CreateTime = DateTime.Now;
-                        info.Remark = "物料[" + demandplans[i].itemnum + "]对应供应商[" + curChaes[j].supplier_name + "]没有可用" + (curChaes[j].IsRequireGoods == 0 ? "采购申请" : "要货令") + ",无法转交货单";
-                        info.NeedQty = needQty;
-                        info.OptTime = optime;
-                        exceptions.Add(info);
-
-                        flag = true;
-                        break;
-                    }
                     //送货单占用数量
                     var pchShds = curShds.Where(p => pchPurMsts.Select(m => m.PurOrd).Contains(p.po_bill)).ToList();
                     //校验当前供应商的采购明细剩余可用数量是否满足供应商的配额
@@ -6973,25 +6922,76 @@ namespace Business.Replenishment
                     sumCurOccupy = curCalcOccupys.Where(p => pchPurDtls.Select(m => m.PurOrd).Contains(p.ponumber)).Sum(p => p.schedqty);
                     //剩余可用数量
                     restQty = sumRestQty - sumDbOccupy - sumCurOccupy;
+                    restQty = restQty < 0 ? 0 : restQty;
                     if (restQty < needQty)
                     {
-                        //当前供应商可用采购单明细不足,则当前交货计划无法转交货单
+                        //当前供应商可用采购单明细不足,生成新的pr,记录异常日志
+                        srm_Pr = new srm_pr_main();
+                        srm_Pr.GenerateNewId(help.NextId());
+                        srm_Pr.pr_order_type = curItem.erp_cls == 2 ? "L" : "";//单据类型
+                        srm_Pr.supplier_type = curChaes[j].supplier_type;
+                        srm_Pr.IsRequireGoods = curChaes[j].IsRequireGoods;
+                        if (curChaes[j].supplier_type == "VMI")
+                        {
+                            srm_Pr.IsRequireGoods = 1;
+                            srm_Pr.pr_order_type = "K";
+                        }
+                        srm_Pr.pr_purchaseid = curChaes[j].supplier_id;//供应商id  
+                        srm_Pr.pr_purchasenumber = curChaes[j].supplier_number;//供应商编码
+                        srm_Pr.pr_purchasename = curChaes[j].supplier_name;//供应商名称
+                        srm_Pr.pr_purchaser = curChaes[j].order_rector_name;//采购员
+                        srm_Pr.pr_purchaser_num = curChaes[j].order_rector_num;//采购员工号(采购信息表)
+                        srm_Pr.pr_rqty = needQty - restQty;//需求数量
+                        srm_Pr.pr_aqty = srm_Pr.pr_rqty;//申请数量
+                        srm_Pr.pr_sqty = srm_Pr.pr_rqty;//建议数量
+                        srm_Pr.icitem_id = curItem.Id;//物料id
+                        srm_Pr.icitem_name = curItem.name;//物料名称
+                        if (ScheduleAgreement == 1)
+                        {
+                            srm_Pr.pr_ssend_date = demandplans[i].arrivaldate.AddDays((double)(-7));//系统建议下单日期
+                            srm_Pr.pr_sarrive_date = demandplans[i].arrivaldate;//系统建议到达日期(建议到货日期)
+                        }
+                        else
+                        {
+                            srm_Pr.pr_ssend_date = demandplans[i].arrivaldate.AddDays((double)(-1 * curChaes[j].lead_time.GetValueOrDefault()));//系统建议下单日期
+                            srm_Pr.pr_sarrive_date = demandplans[i].arrivaldate;
+                        }
+                        srm_Pr.pr_sysprice = curChaes[j].order_price;//系统价格(含税)
+                        srm_Pr.pr_orderprice = srm_Pr.pr_rqty * curChaes[j].order_price;//订单价格(含税)
+                        srm_Pr.pr_price = curChaes[j].netpurchase_price;//采购净价(不含税)
+                        srm_Pr.pr_rate = curChaes[j].taxrate;//税率
+                        srm_Pr.pr_unit = curItem.unit;//单位
+                        srm_Pr.state = 1;//状态
+                        srm_Pr.old_apply_aqty = 0;//已申请数量
+                        srm_Pr.pr_type = curItem.erp_cls == 2 ? 2 : 3;//申请类型
+                        srm_Pr.currencytype = curChaes[j].currency_type == null ? 1 : curChaes[j].currency_type.Value;//币种
+                        srm_Pr.secInv_ratio = curItem.secinv_ratio;//安全库存触发采购比例
+                        srm_Pr.tenant_id = param.company_id;
+                        srm_Pr.company_id = param.company_id;
+                        srm_Pr.factory_id = param.factoryId;
+                        srm_Pr.create_time = DateTime.Now;
+                        srm_Pr.create_by_name = user;
+                        srm_Pr.update_time = DateTime.Now;
+                        srm_Pr.update_by_name = user;
+                        prInserts.Add(srm_Pr);
+
+                        //处理总数量,需求数量
+                        allQty += needQty - restQty;
+                        needQty -= restQty;
+
+                        //添加异常记录
                         info = new DeliveryExceptionMaster();
                         info.Domain = domain;
                         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 + "]"+ (curChaes[j].IsRequireGoods == 0 ? "采购申请" : "要货令") + "不足,无法转交货单";
+                        info.Remark = "物料需求计划[" + demandplans[i].itemnum + ":" + demandplans[i].requestdate.ToString("yyyy-MM-dd") + "]对应供应商[" + curChaes[j].supplier_name + "]"+ (curChaes[j].IsRequireGoods == 0 ? "采购申请" : "要货令") + "不足,已生成采购申请,请转采购订单后再生成交货单";
                         info.NeedQty = needQty - restQty;
                         info.OptTime = optime;
                         exceptions.Add(info);
-
-                        flag = true;
-                        break;
                     }
 
                     //采购单明细优先级:先PO,按照交货日期从早到晚占用;再DO,按照交货日期从早到晚占用
-                    //pchPurDtls = pchPurDtls.OrderBy(p => p.DueDate).ToList();
                     pchPurDtls = CalcPurDetailPriority(pchPurDtls);
                     for (int k = 0; k < pchPurDtls.Count; k++)
                     {
@@ -7061,7 +7061,7 @@ namespace Business.Replenishment
                         entity.createuser = user;
                         entity.remarks = "";
                         entity.isactive = 1;
-                        curInserts.Add(entity);
+                        inserts.Add(entity);
 
                         //当前交货计划已分配数量累加
                         allQty += xqQty;
@@ -7069,17 +7069,10 @@ namespace Business.Replenishment
                         sumNeedQty += xqQty;
                     }
                 }
-                //标志位为true,则当前交货计划无法转交货单
-                if (flag)
-                {
-                    continue;
-                }
-                inserts.AddRange(curInserts);
             }
             if (inserts.Any())
             {
                 //获取交货单号
-                List<string> GenerateMoList = new List<string>();
                 var nbrlist = _serialNumberAppService.GetBillNo(domain, "M8", inserts.Count, "", 1);
                 if (!nbrlist.Any() || nbrlist.Count != inserts.Count)
                 {
@@ -7097,6 +7090,26 @@ namespace Business.Replenishment
                     inserts[i].dsnum = nbrlist[i].NbrResult;
                 }
             }
+            if (prInserts.Any())
+            {
+                //获取Pr单号
+                var prlist = _serialNumberAppService.GetBillNo(domain, "M8", prInserts.Count, "", 1);
+                if (!prlist.Any() || prlist.Count != prInserts.Count)
+                {
+                    Msg = "NO|采购申请单号生成失败";
+                    return Msg;
+                }
+                prInserts = prInserts.OrderBy(p => p.create_time).ToList();
+                for (int i = 0; i < prInserts.Count; i++)
+                {
+                    if (string.IsNullOrEmpty(prlist[i].NbrResult))
+                    {
+                        Msg = "NO|采购申请单号生成失败";
+                        return Msg;
+                    }
+                    prInserts[i].pr_billno = prlist[i].NbrResult;
+                }
+            }
             //数据插入
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
@@ -7107,6 +7120,11 @@ namespace Business.Replenishment
                     {
                         _srmpolistds.Insert(inserts);
                     }
+                    //插入Pr
+                    if (prInserts.Any())
+                    {
+                        _businessDbContext.BulkInsert(prInserts);
+                    }
                     //插入异常记录
                     if (exceptions.Any())
                     {