Forráskód Böngészése

配额逻辑调整。

tangdi 2 éve
szülő
commit
2bc483934b

+ 144 - 4
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -1501,6 +1501,142 @@ namespace Business.ResourceExamineManagement
         /// <param name="factoryid"></param>
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
         private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, decimal lack_qty, long? companyId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys, DateTime? plan_date)
+        {
+            SRMPRDto sRMPR = new SRMPRDto();
+            //mo_srm_purchase supplier = null;
+            var plan = planList.Find(x => x.mysql_id == returnlist.item_id);
+            var supplist = supplierList.Where(s => s.icitem_id == returnlist.item_id && s.quota_rate.GetValueOrDefault() > 0).ToList();
+            if (!supplist.Any() || plan == null)
+            {
+                returnlist.stock_state = 99;
+                sRMPR.lastStartTmie = DateTime.Now.AddDays(7);//默认采购提前期
+                sRMPR.totalLeadTime = 7;
+                return sRMPR;
+            }
+            sRMPR.srm_Pr_Main = new List<mo_srm_pr_main>();
+            foreach (var supplier in supplist)
+            {
+                mo_srm_pr_main srm_Pr = new mo_srm_pr_main();
+                srm_Pr.GenerateNewId(help.NextId());
+                srm_Pr.mysql_id = help.NextId();
+                if (mes_morder != null)
+                {
+                    srm_Pr.pr_mono = mes_morder.morder_no;//关联工单号
+                    srm_Pr.entity_id = 1;//工单行号
+                }
+                srm_Pr.pr_order_type = returnlist.erp_cls == 2 ? "L" : "";//单据类型
+                srm_Pr.supplier_type = supplier.supplier_type;
+                srm_Pr.IsRequireGoods = supplier.IsRequireGoods;
+                if (supplier.supplier_type == "VMI")
+                {
+                    srm_Pr.IsRequireGoods = 1;
+                    srm_Pr.pr_order_type = "K";
+                }
+                srm_Pr.pr_purchaseid = supplier.supplier_id;//供应商id  
+                srm_Pr.pr_purchasenumber = supplier.supplier_number;//供应商编码
+                srm_Pr.pr_purchasename = supplier.supplier_name;//供应商名称
+                srm_Pr.pr_purchaser = supplier.order_rector_name;//采购员
+                srm_Pr.pr_purchaser_num = supplier.order_rector_num;//采购员工号(采购信息表)
+
+
+                srm_Pr.pr_rqty = Math.Ceiling(lack_qty * supplier.quota_rate.GetValueOrDefault() / 100);//需求数量
+
+                srm_Pr.pr_aqty = srm_Pr.pr_rqty;//申请数量
+                srm_Pr.pr_sqty = srm_Pr.pr_rqty;//建议数量
+                srm_Pr.icitem_id = returnlist.item_id;//物料id
+                srm_Pr.icitem_name = returnlist.item_name;//物料名称
+                srm_Pr.num = returnlist.num;
+                if (plan_date != null)
+                {
+                    //-1为提前一天准备
+                    srm_Pr.pr_sarrive_date = plan_date.GetValueOrDefault().AddDays(-1 - (int)(Math.Ceiling(plan.clean_leadtime.GetValueOrDefault())));
+                    srm_Pr.pr_ssend_date = srm_Pr.pr_sarrive_date.Value.AddDays(-(int)Math.Ceiling(supplier.lead_time.GetValueOrDefault()));//系统建议下单日期
+                    if (srm_Pr.pr_ssend_date < DateTime.Now.Date.AddDays(1))
+                    {
+                        //如果建议下单日期为今天或者过去,则代表物料需求供应时间不够,则需要标记此物料时间不足。
+                        var timeSp = DateTime.Now - srm_Pr.pr_ssend_date.Value;
+                        returnlist.pre_time = timeSp.Days + 1;
+                        srm_Pr.pr_ssend_date = srm_Pr.pr_ssend_date.Value.AddDays(returnlist.pre_time.GetValueOrDefault());
+                        srm_Pr.pr_sarrive_date = srm_Pr.pr_sarrive_date.Value.AddDays(returnlist.pre_time.GetValueOrDefault());
+                    }
+                }
+                else
+                {
+                    srm_Pr.pr_ssend_date = DateTime.Now.Date.AddDays(1);//系统建议下单日期
+                    srm_Pr.pr_sarrive_date = DateTime.Now.AddDays((double)supplier.lead_time.GetValueOrDefault());//系统建议到达日期(建议到货日期)
+                }
+                srm_Pr.pr_sysprice = supplier.order_price;//系统价格(含税)
+                srm_Pr.pr_orderprice = srm_Pr.pr_rqty * supplier.order_price;//订单价格(含税)
+                srm_Pr.pr_price = supplier.netpurchase_price;//采购净价(不含税)
+                srm_Pr.pr_rate = supplier.taxrate;//税率
+                srm_Pr.pr_unit = returnlist.unit;//单位
+                srm_Pr.state = 1;//状态
+                srm_Pr.old_apply_aqty = 0;//已申请数量
+                srm_Pr.pr_type = orderType;//申请类型
+                srm_Pr.currencytype = supplier.currency_type == null ? 1 : supplier.currency_type.Value;//币种
+                srm_Pr.secInv_ratio = plan.secinv_ratio;//安全库存触发采购比例
+                srm_Pr.tenant_id = companyId.GetValueOrDefault();
+                srm_Pr.company_id = companyId;
+                srm_Pr.factory_id = factoryid;
+                srm_Pr.bang_id = bangId;
+                if (sentrys != null)
+                {
+                    srm_Pr.sentry_id = sentrys.Id;
+                }
+                srm_Pr.totalLeadTime = supplier.lead_time.GetValueOrDefault();//plan.transportation_leadtime + plan.stock_leadtime + plan.production_leadtime + plan.order_leadtime;
+                srm_Pr.create_time = DateTime.Now;
+                srm_Pr.create_by_name = "admin";
+                srm_Pr.update_time = DateTime.Now;
+                srm_Pr.update_by_name = "admin";
+                sRMPR.srm_Pr_Main.Add(srm_Pr);
+                quarter_srm_pr_mains.Add(srm_Pr);
+
+                //生成mo_srm_po_occupy采购占用表数据。 
+                mo_srm_po_occupy srm_Po_Occupy = new mo_srm_po_occupy();
+                srm_Po_Occupy.GenerateNewId(help.NextId());
+                srm_Po_Occupy.mysql_id = help.NextId();
+                srm_Po_Occupy.bang_id = bangId;
+                srm_Po_Occupy.polist_id = srm_Pr.mysql_id;
+                if (sentrys != null)
+                {
+                    srm_Po_Occupy.eid = sentrys.Id;
+                    srm_Po_Occupy.bill_no = sentrys.seorder_id;
+                    srm_Po_Occupy.entry_id = sentrys.entry_seq.GetValueOrDefault();
+                    srm_Po_Occupy.org_id = sentrys.org_id;
+                }
+                if (mes_morder != null)
+                {
+                    srm_Po_Occupy.morder_id = mes_morder.Id;
+                    srm_Po_Occupy.morder_mo = mes_morder.morder_no;
+                }
+                srm_Po_Occupy.qty = srm_Pr.pr_rqty;
+                srm_Po_Occupy.type = MorderEnum.Zyjc_Type;//TODO:类型未知
+                srm_Po_Occupy.stime = srm_Pr.pr_ssend_date;
+                srm_Po_Occupy.etime = srm_Pr.pr_sarrive_date;
+                srm_Po_Occupy.state = 1;
+                srm_Po_Occupy.company_id = param.company_id;//取销售子表企业ID
+                srm_Po_Occupy.factory_id = param.factoryId;
+                srm_Po_OccupiesInsert.Add(srm_Po_Occupy);
+            }
+            sRMPR.totalLeadTime = (int)Math.Ceiling(sRMPR.srm_Pr_Main.Max(x => x.totalLeadTime.GetValueOrDefault()));
+            
+            if (sRMPR.srm_Pr_Main.Any())
+            {
+                sRMPR.srm_Pr_Main.OrderBy(x => x.totalLeadTime.GetValueOrDefault()).ThenBy(x => x.pr_orderprice.GetValueOrDefault()).First().isbestoptions = true;
+            }
+            sRMPR.item_no = returnlist.num;
+            sRMPR.orderentry_id = returnlist.sentry_id;
+            sRMPR.lastStartTmie = sRMPR.srm_Pr_Main.Max(x => x.pr_sarrive_date.GetValueOrDefault());
+            return sRMPR;
+        }
+
+        /*/// <summary>
+        /// 生成采购申请单,颗粒度是一个物料一个单,没必要弄列表
+        /// </summary>
+        /// <param name="returnlist"></param>
+        /// <param name="factoryid"></param>
+        /// <param name="orderType">2委外采购申请单,3采购申请单</param>
+        private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, decimal lack_qty, long? companyId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<mo_srm_purchase> supplierList, List<mo_ic_item> planList, crm_seorderentry sentrys, DateTime? plan_date)
         {
             SRMPRDto sRMPR = new SRMPRDto();
             mo_srm_purchase supplier = null;
@@ -1562,7 +1698,8 @@ namespace Business.ResourceExamineManagement
                             });
                             supplier = newsupplist.Find(s => s.supplier_id == dto1.pr_purchaseid);
                         }
-                        else {
+                        else
+                        {
                             supplier = newsupplist.OrderBy(s => s.quota_priority).FirstOrDefault();//默认取配额优先级
                         }
                     }
@@ -1640,7 +1777,8 @@ namespace Business.ResourceExamineManagement
                     returnlist.pre_time = timeSp.Days + 1;
                 }
             }
-            else {
+            else
+            {
                 srm_Pr.pr_ssend_date = DateTime.Now.Date.AddDays(1);//系统建议下单日期
                 srm_Pr.pr_sarrive_date = DateTime.Now.AddDays((double)supplier.lead_time.GetValueOrDefault());//系统建议到达日期(建议到货日期)
             }
@@ -1678,7 +1816,7 @@ namespace Business.ResourceExamineManagement
             }
             sRMPR.item_no = returnlist.num;
             sRMPR.orderentry_id = returnlist.sentry_id;
-            sRMPR.lastStartTmie = DateTime.Now.AddDays((double)(sRMPR.srm_Pr_Main.MinBy(x => x.totalLeadTime).totalLeadTime.GetValueOrDefault()));//加上提前期和备料期,得到齐套时间
+            sRMPR.lastStartTmie = sRMPR.srm_Pr_Main.Max(x => x.pr_sarrive_date.GetValueOrDefault());//加上提前期和备料期,得到齐套时间
 
             //生成mo_srm_po_occupy采购占用表数据。 
             mo_srm_po_occupy srm_Po_Occupy = new mo_srm_po_occupy();
@@ -1707,7 +1845,9 @@ namespace Business.ResourceExamineManagement
             srm_Po_Occupy.factory_id = param.factoryId;
             srm_Po_OccupiesInsert.Add(srm_Po_Occupy);
             return sRMPR;
-        }
+        }*/
+
+
         // 生成订单编号 字母+年月日+8位随机数+时间戳
         public string getOrderNum(string preCode)
         {

+ 6 - 4
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1783,7 +1783,7 @@ namespace Business.ResourceExamineManagement
                 }
             }
             
-            List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.GetValueOrDefault()) && bangidList.Contains(s.bang_id));
+            List<mo_ic_item_stockoccupy> item_stockoccupy = await _ic_item_stockoccupy.GetListAsync(s => seIds.Contains(s.orderentry_id.Value) && bangidList.Contains(s.bang_id));
 
             using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
             {
@@ -2938,12 +2938,14 @@ namespace Business.ResourceExamineManagement
             {
                 DateTime.TryParse(endtime, out etime);
             }
+            List<string> tsWork = new List<string> { "test", "tcn", "rw" };
+            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && x.OrdDate>= stime && x.OrdDate <= etime && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && (x.Status.ToLower() == "p" || x.Status.ToLower() == "r")).ToList();
+
             //根据排产日计划来获取
-            var periodSd = _periodSequenceDet.Select(s => s.Domain == domain && string.IsNullOrEmpty(s.Status) == true && stime <= s.PlanDate && s.PlanDate <= etime).ToList();
+            var periodSd = _periodSequenceDet.Select(s => s.Domain == domain && ordlist.Select(x => x.WorkOrd).Contains(s.WorkOrds)).ToList();
             if (periodSd.Any())
             {
-                List<string> tsWork = new List<string> { "test", "tcn", "rw" };
-                var ordlist = _workOrdMaster.Select(x => x.Domain == domain && periodSd.Select(s => s.WorkOrds).Contains(x.WorkOrd) && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && (x.Status.ToLower() == "p" || x.Status.ToLower() == "r")).ToList();
+                ordlist = ordlist.Where(x => periodSd.Select(c => c.WorkOrds).Contains(x.WorkOrd)).ToList();
 
                 List<mes_morder> morders = _mysql_mes_morder.GetListAsync(x => domain == x.factory_id.ToString() && ordlist.Select(s => s.WorkOrd).Contains(x.morder_no) && (x.morder_state == MorderEnum.Initial_state || x.morder_state == MorderEnum.Xd_state) && !x.IsDeleted).Result;
                 if (!morders.Any())