Browse Source

代码提交。

tangdi 2 years ago
parent
commit
69bf045adf

+ 7 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/IResourceExamineAppService.cs

@@ -154,5 +154,12 @@ namespace Business.ResourceExamineManagement
         /// <param name="domain"></param>
         /// <returns></returns>
         Task<string> AutoMergeMo(string domain);
+
+        /// <summary>
+        /// ίÍâ²É¹ºÉêÇëºÏ²¢
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        Task<string> AutoMergeWWPR(string domain);
     }
 }

+ 0 - 17
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -406,23 +406,6 @@ namespace Business.ResourceExamineManagement
             }
         }
 
-        /*//计算每层物料倒排时,需要根据半成品的工作时长倒排。
-        public void CalcLevelMakeTime(List<BomChildExamineDto> returnlist)
-        {
-            for (int level = 3; level <= returnlist.Max(s => s.level); level++)
-            {
-                var list = returnlist.Where(s => s.level == level).ToList();
-                list.ForEach(s => {
-                    var parent = returnlist.Find(p => p.fid == s.parent_id);
-                    if (parent != null)
-                    {
-                        s.pre_time = parent.make_time.GetValueOrDefault() + parent.pre_time.GetValueOrDefault();
-                    }
-                });
-            }
-        }*/
-
-
         /// <summary>
         /// 生成主工单
         /// </summary>

+ 242 - 14
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1064,26 +1064,26 @@ namespace Business.ResourceExamineManagement
             }
         }
 
-        //PR手动合并
+        //PR手动合并--排除委外
         public async Task<string> PrMerge(string ids)
         {
             //物料、供应商为相同才允许合并。
             var idList = AnalysisIdList(ids);
-            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => idList.Contains(s.Id) && s.IsRequireGoods == 1).Result;
+            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => idList.Contains(s.Id)).Result;
             if (prlist.Any())
             {
                 if (prlist.Where(s => s.state == 0).Count() > 0)
                 {
                     return JsonConvert.SerializeObject("所选包含已关闭采购申请,请重新选择。");
                 }
-                /*if (prlist.Where(s => s.state == 2).Count() > 0)
+                if (prlist.Where(s => s.state == 2).Count() > 0)
                 {
                     return JsonConvert.SerializeObject("所选包含已提交评审采购申请,请重新选择。");
                 }
                 if (prlist.Where(s => s.state == 4).Count() > 0)
                 {
                     return JsonConvert.SerializeObject("所选包含已评审通过采购申请,请重新选择。");
-                }*/
+                }
                 var list = prlist.GroupBy(s => new { s.icitem_id, s.pr_purchaseid, s.IsRequireGoods, s.supplier_type });
                 if (list.Count() > 1)
                 {
@@ -1160,11 +1160,11 @@ namespace Business.ResourceExamineManagement
             return JsonConvert.SerializeObject("ok");
         }
 
-        //PR自动合并
+        //PR自动合并--只取外购不取委外
         public void PrAutoMerge(string companyid)
         {
             //直接按间隔多少天一次来处理数据,定时任务按周四来考虑。
-            DateTime toTime = DateTime.Now; //new DateTime(2023, 7, 6);
+            DateTime toTime = DateTime.Now;//new DateTime(2023, 12, 3);
             DateTime starttime = toTime.Date.AddDays(1);
             DateTime endtime = toTime.Date.AddDays(28);
             //只合并要货令
@@ -1221,7 +1221,7 @@ namespace Business.ResourceExamineManagement
                             newPr.pr_sqty = ilist.Sum(s => s.pr_sqty);//建议数量
 
                             decimal qty = newPr.pr_rqty.GetValueOrDefault();
-                            if (pur != null && pur.quota_rate.GetValueOrDefault() == 100)
+                            if (pur != null && newPr.pr_type == 2 && pur.quota_rate.GetValueOrDefault() == 100)//委外的采购申请通过委外圆整逻辑处理
                             {
                                 //数量圆整 按最小包装量向上圆整
                                 if (pur.packaging_qty.GetValueOrDefault() != 0)
@@ -3265,7 +3265,7 @@ namespace Business.ResourceExamineManagement
         /// 工单检查物料齐套
         /// </summary>
         /// <param name="input"></param>
-        public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, bool planCheck = false)
+        public async Task<PschedDto> OrderKittingCheck(List<mes_morder> mo_Mes_Morders, bool planCheck = false,List<mes_moentry> moentryList = null)
         {
             //资源检查结果
             PschedDto rtn = new PschedDto();
@@ -3292,8 +3292,15 @@ namespace Business.ResourceExamineManagement
 
             var morderIdList = mo_Mes_Morders.Select(s => s.Id).ToList();
 
-            List<mes_moentry> mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => morderIdList.Contains(x.moentry_moid.Value)).Result;
-
+            List<mes_moentry> mo_Mes_Moentries = new List<mes_moentry>();
+            if (moentryList != null)
+            {
+                mo_Mes_Moentries = moentryList;
+            }
+            else {
+                mo_Mes_Moentries = _mysql_mes_moentry.GetListAsync(x => morderIdList.Contains(x.moentry_moid.Value)).Result;
+            }
+            
             //获取订单行数据
             List<crm_seorderentry> sentrys = _mysql_crm_seorderentry.GetListAsync(p => p.company_id == param.company_id && p.factory_id == param.factoryId && !p.IsDeleted && mo_Mes_Moentries.Select(x => x.soentry_id).Contains(p.Id)).Result;
 
@@ -3358,6 +3365,10 @@ namespace Business.ResourceExamineManagement
                     priorityMorderList.Add(mo);
                 }
             }
+            if (!priorityMorderList.Any())
+            {
+                priorityMorderList = mo_Mes_Morders;
+            }
             if (!planCheck)
             {
                 //如果是齐套检查,则不考虑其他数据的占用,只看原材料库存
@@ -3546,7 +3557,7 @@ namespace Business.ResourceExamineManagement
                 }
 
                 //获取工单数据
-                var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd) && p.Domain == param.factoryId.ToString());
+                /*var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd) && p.Domain == param.factoryId.ToString());
                 workOrdMasters.ForEach(s => {
                     var mo = mo_Mes_Morders.Find(m => m.morder_no == s.WorkOrd);
                     if (mo != null)
@@ -3554,16 +3565,16 @@ namespace Business.ResourceExamineManagement
                         s.OrdDate = mo.moentry_sys_stime;
                         s.DueDate = mo.moentry_sys_stime;
                     }
-                });
+                });*/
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
                     try
                     {
                         _businessDbContext.BulkUpdate(mo_Mes_Morders);
-                        if (workOrdMasters.Any())
+                        /*if (workOrdMasters.Any())
                         {
                             _workOrdMaster.Update(workOrdMasters);
-                        }
+                        }*/
                         if (prmainlist.Any())
                         {
                             var pr_mainlist = ObjectMapper.Map<List<mo_srm_pr_main>, List<srm_pr_main>>(prmainlist);
@@ -5347,6 +5358,208 @@ namespace Business.ResourceExamineManagement
             }
             
         }
+
+        //自动合并委外PR,按周频次
+        public async Task<string> AutoMergeWWPR(string domain)
+        {
+            try
+            {
+                //合并委外数据
+                List<srm_pr_main> alllist = _mysql_srm_pr_main.GetListAsync(s => s.factory_id.ToString() == domain && s.pr_type == 2 && s.pr_ssend_date >= DateTime.Now.Date && s.state == 1).Result;
+                List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.factory_id.ToString() == domain && alllist.Select(c => c.icitem_id).Distinct().Contains(s.Id)).Result;
+
+                var occupyListLINQ = _businessDbContext.srm_po_occupy.Where(x => x.factory_id.ToString() == domain && !x.IsDeleted).Join(_businessDbContext.srm_pr_main.Where(s => s.factory_id.ToString() == domain && s.pr_ssend_date >= DateTime.Now.Date && s.state == 1), p => p.polist_id, pr => pr.Id, (p, pr) => new { p, pr }).ToList();
+                List<srm_po_occupy> occupylist = new List<srm_po_occupy>();
+                for (int i = 0; i < occupyListLINQ.Count; i++)
+                {
+                    occupylist.Add(occupyListLINQ[i].p);
+                }
+                var purList = _mysql_srm_purchase.GetListAsync(x => x.factory_id.ToString() == domain).Result;
+                //占用不清除,只按照圆整的数量,来买料。
+                List<WWPRDto> wwprList = new List<WWPRDto>();
+                var itemIds = alllist.Select(x => x.icitem_id).Distinct().ToList();
+                foreach (var id in itemIds)
+                {
+                    var itemPrList = alllist.Where(x => x.icitem_id == id).ToList();
+                    var purIdList = itemPrList.Select(x => x.pr_purchaseid).Distinct().ToList();
+                    var icitem = ic_Items.Find(x => x.Id == id);
+                    foreach (var purid in purIdList)
+                    {
+                        var purItemList = itemPrList.Where(x => x.pr_purchaseid == purid).ToList();
+                        var pur = purList.Find(x => x.icitem_id == id && x.supplier_id == purid);
+                        
+                        var minTime = purItemList.Min(x => x.pr_ssend_date).GetValueOrDefault();
+                        var maxTime = purItemList.Max(x => x.pr_ssend_date).GetValueOrDefault();
+                        int diff = 7 - Convert.ToInt16(minTime.DayOfWeek);
+                        bool flag = true;
+                        DateTime endTime = minTime.AddDays(diff);
+                        while (flag)
+                        {
+                            WWPRDto dto = new WWPRDto();
+                            var weekList = purItemList.Where(x => x.pr_ssend_date >= minTime && x.pr_ssend_date <= endTime).ToList();
+                            if (weekList.Any())
+                            {
+                                dto.prList = weekList;
+                                dto.itemId = id.Value;
+                                dto.SumQty = weekList.Sum(x => x.pr_aqty.GetValueOrDefault());
+                                dto.MinQty = 0;
+                                dto.icitem = icitem;
+                                if (pur != null)
+                                {
+                                    dto.MinQty = pur.qty_min.GetValueOrDefault();
+                                    dto.diffQty = dto.MinQty > dto.SumQty ? dto.MinQty - dto.SumQty : 0;
+                                }
+                                wwprList.Add(dto);
+                            }
+                            minTime = endTime.AddDays(1);
+                            endTime = endTime.AddDays(7);
+                            if (endTime >= maxTime)
+                            {
+                                flag = false;
+                            }
+                        }
+                    }
+                }
+                List<srm_pr_main> insetList = new List<srm_pr_main>();
+                List<srm_pr_main> updateList = new List<srm_pr_main>();
+                List<srm_po_occupy> occupyUptList = new List<srm_po_occupy>();
+                List<mes_morder> moList = new List<mes_morder>();
+                List<mes_moentry> moentryList = new List<mes_moentry>();
+                //委外数据合并加圆整
+                if (wwprList.Any())
+                {
+                    List<string> GenerateMoList = new List<string>();
+                    var moNbrlistDto = _serialNumberAppService.GetBillNo(domain, "PR", wwprList.Count(), "admin", 1);
+                    long bang_id = help.NextId();
+                    if (moNbrlistDto.Any())
+                    {
+                        foreach (var nbr in moNbrlistDto)
+                        {
+                            GenerateMoList.Add(nbr.NbrResult);
+                        }
+                    }
+                    foreach (var wwDto in wwprList)
+                    {
+                        //如果需要圆整,圆整数量生成虚拟工单
+                        if (wwDto.diffQty > 0)
+                        {
+                            if (wwDto.icitem != null)
+                            {
+                                mes_morder mes_Morder = new mes_morder();
+                                mes_Morder.GenerateNewId(help.NextId());
+                                mes_Morder.morder_type = MorderEnum.JhMorder;
+                                mes_Morder.work_order_type = MorderEnum.CgMorder;
+                                mes_Morder.morder_state = "";
+                                mes_Morder.morder_no = Guid.NewGuid().ToString();
+                                mes_Morder.fms_number = "";
+                                mes_Morder.bom_number = wwDto.icitem.number;
+                                mes_Morder.fmodel = wwDto.icitem.model;
+                                mes_Morder.moentry_startup_status = 0;
+                                mes_Morder.tenant_id = wwDto.icitem.tenant_id;
+                                mes_Morder.factory_id = wwDto.icitem.factory_id;
+                                mes_Morder.company_id = wwDto.icitem.company_id;
+                                mes_Morder.org_id = wwDto.icitem.org_id;
+                                mes_Morder.product_code = wwDto.icitem.number;
+                                mes_Morder.product_name = wwDto.icitem.name;
+                                mes_Morder.morder_date = DateTime.Now.Date.AddDays(1);
+                                mes_Morder.moentry_prd = null;
+                                mes_Morder.moentry_prdname = null;
+                                mes_Morder.moentry_wrkc = null;
+                                mes_Morder.moentry_wrkcname = null;
+                                mes_Morder.picking_qty = 0;
+                                mes_Morder.unit = wwDto.icitem.unit;
+                                mes_Morder.morder_production_number = wwDto.diffQty;
+                                mes_Morder.need_number = wwDto.diffQty;
+                                //成品半成品取周一为入库时间开始往前推
+                                mes_Morder.moentry_sys_stime = wwDto.prList.OrderBy(x => x.pr_ssend_date).FirstOrDefault().pr_ssend_date;
+                                //mes_Morder.moentry_sys_etime = weekTime;
+                                mes_Morder.remaining_number = 0;
+                                mes_Morder.create_time = DateTime.Now;
+                                mes_Morder.bang_id = bang_id;
+                                moList.Add(mes_Morder);
+                                //生成工单子表数据
+                                mes_moentry mes_Moentry = new mes_moentry();
+                                mes_Moentry.GenerateNewId(help.NextId());
+                                mes_Moentry.moentry_moid = mes_Morder.Id;
+                                mes_Moentry.moentry_mono = mes_Morder.morder_no;
+                                mes_Moentry.unit = wwDto.icitem.unit;
+                                mes_Moentry.morder_production_number = wwDto.diffQty;
+                                mes_Moentry.need_number = wwDto.diffQty;
+                                mes_Moentry.remaining_number = 0;
+                                mes_Moentry.tenant_id = wwDto.icitem.tenant_id;
+                                mes_Moentry.factory_id = wwDto.icitem.factory_id;
+                                mes_Moentry.company_id = wwDto.icitem.company_id;
+                                mes_Moentry.org_id = wwDto.icitem.org_id;
+                                mes_Moentry.create_time = DateTime.Now;
+                                mes_Moentry.bang_id = bang_id;
+                                moentryList.Add(mes_Moentry);
+                            }
+                        }
+                        /*//如果有多条,需要合并
+                        if (wwDto.prList.Count() > 1)
+                        {
+                            var first = wwDto.prList.OrderBy(x => x.pr_ssend_date).FirstOrDefault();
+                            srm_pr_main pr = help.DeepCopy(first);
+                            pr.GenerateNewId(help.NextId());
+                            if (GenerateMoList.Any())
+                            {
+                                pr.pr_billno = GenerateMoList[0];
+                                GenerateMoList.Remove(pr.pr_billno);
+                            }
+                            else
+                            {
+                                var nbrDto = _serialNumberAppService.GetBillNo(domain, "PR", 1, "admin", 1);
+                                if (nbrDto.Any())
+                                {
+                                    pr.pr_billno = nbrDto[0].NbrResult;
+                                }
+                            }
+                            if (string.IsNullOrEmpty(pr.pr_billno))
+                            {
+                                pr.pr_billno = help.NextId().ToString();
+                            }
+                            pr.pr_sqty = wwDto.SumQty;
+                            pr.pr_aqty = wwDto.SumQty;
+                            pr.pr_rqty = wwDto.prList.Sum(x => x.pr_rqty.GetValueOrDefault());
+                            pr.pr_orderprice = pr.pr_rqty * pr.pr_sysprice;//订单价格(含税)
+                            insetList.Add(pr);
+                            wwDto.prList.ForEach(x => { x.state = 0; });
+                            updateList.AddRange(wwDto.prList);
+                            var wwoccupy = occupylist.Where(x => wwDto.prList.Select(c => c.Id).Contains(x.polist_id.GetValueOrDefault())).ToList();
+                            wwoccupy.ForEach(x => { x.polist_id = pr.Id; });
+                            occupyUptList.AddRange(wwoccupy);
+                        }*/
+                        /*else
+                        {
+                            wwDto.prList.ForEach(x => { x.pr_sqty = wwDto.SumQty; x.pr_aqty = wwDto.SumQty; });
+                            updateList.AddRange(wwDto.prList);
+                        }*/
+                    }
+                    /*if (insetList.Any())
+                    {
+                        _businessDbContext.BulkInsert(insetList);
+                    }
+                    if (updateList.Any())
+                    {
+                        _businessDbContext.BulkUpdate(updateList);
+                    }
+                    if (occupyUptList.Any())
+                    {
+                        _businessDbContext.BulkUpdate(occupyUptList);
+                    }*/
+                    if (moList.Any())
+                    {
+                        var rtn = await OrderKittingCheck(moList, true, moentryList);
+                    }
+                }
+                return "ok";
+            }
+            catch (Exception e)
+            {
+                new NLogHelper("ResourceExamineAppService").WriteLog("AutoMergeMo", "自动合并工单任务失败:" + e.Message, _currentTenant.Id.ToString());
+                return "保存失败,请联系管理员。";
+            }
+        }
     }
 
     public class WorkOrdDto
@@ -5363,4 +5576,19 @@ namespace Business.ResourceExamineManagement
 
         public decimal SumQty { get; set; }
     }
+
+    public class WWPRDto
+    {
+        public long itemId { get; set; }
+
+        public List<srm_pr_main> prList { get; set; } = new List<srm_pr_main>();
+
+        public ic_item icitem { get; set; }
+
+        public decimal MinQty { get; set; }
+
+        public decimal SumQty { get; set; }
+
+        public decimal diffQty { get; set; }
+    }
 }

+ 12 - 0
MicroServices/Business/Business.HttpApi/Controllers/ResourceExamineController.cs

@@ -272,5 +272,17 @@ namespace Business.Controllers
         {
             return _ResourceExamineAppService.AutoMergeMo(domain);
         }
+
+        /// <summary>
+        /// 委外采购申请合并
+        /// </summary>
+        /// <param name="domain"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("AutoMergeWWPR")]
+        public Task<string> AutoMergeWWPR(string domain)
+        {
+            return _ResourceExamineAppService.AutoMergeWWPR(domain);
+        }
     }
 }