Преглед изворни кода

产销协同工单生产逻辑修复。

tangdi пре 2 година
родитељ
комит
11dfa69825

+ 5 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/PschedDto.cs

@@ -72,6 +72,11 @@ namespace Business.ResourceExamineManagement.Dto
         /// </summary>
         public long? sentry_id { get; set; }
 
+        /// <summary>
+        /// 成品编码
+        /// </summary>
+        public string? prd_code { get; set; }
+
         /// <summary>
         /// 行号
         /// </summary>

+ 7 - 5
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -688,7 +688,7 @@ namespace Business.ResourceExamineManagement
                 {
                     var ic_item = icitemlist.Find(s => s.mysql_id == item.item_id);
                     List<mo_mes_mooccupy> mooccupylist = new List<mo_mes_mooccupy>();
-                    if (param.checkflag)
+                    if (param.checkflag || param.checkPlan)
                     {
                         mooccupylist = _morderAppService.CheckMorder(item.bom_number, item.lack_qty, plan_date.GetValueOrDefault(), sentrys, ic_item, bangid);
                     }  
@@ -738,6 +738,7 @@ namespace Business.ResourceExamineManagement
                             morder_type = morder_type,
                             work_order_type = MorderEnum.CgMorder,
                             morder_state = MorderEnum.Initial_state,
+                            ParentId=mes_morder.Id,
                             bang_id = bangid
                         };
                         Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
@@ -758,7 +759,7 @@ namespace Business.ResourceExamineManagement
                         if (mes_MorderDto != null)
                         {
                             //主工单最后计算满足日期
-                            var mes_Morders = mes_MorderDto.mes_Morders.Where(x => x.parent_id == null).FirstOrDefault();
+                            var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
                             if (mes_Morders != null)
                             {
                                 //子工单生成的检查明细,还是挂接到主工单上。
@@ -1206,7 +1207,7 @@ namespace Business.ResourceExamineManagement
                         {
                             var ic_item = icitemlist.Find(s => s.mysql_id == sct.item_id);
                             List<mo_mes_mooccupy> mooccupylist = new List<mo_mes_mooccupy>();
-                            if (param.checkflag)
+                            if (param.checkflag || param.checkPlan)
                             {
                                 mooccupylist = _morderAppService.CheckMorder(sct.bom_number, sct.lack_qty, dateTime, sentrys, ic_item, bangid);
                             }
@@ -1255,6 +1256,7 @@ namespace Business.ResourceExamineManagement
                                     morder_type = morder_type,
                                     work_order_type = MorderEnum.CgMorder,
                                     morder_state = MorderEnum.Initial_state,
+                                    ParentId=mes_morder.Id,
                                     bang_id = bangid
                                 };
                                 Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
@@ -1275,7 +1277,7 @@ namespace Business.ResourceExamineManagement
                                 if (mes_MorderDto != null)
                                 {
                                     //主工单最后计算满足日期
-                                    var mes_Morders = mes_MorderDto.mes_Morders.Where(x => x.parent_id == null).FirstOrDefault();
+                                    var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
                                     if (mes_Morders != null)
                                     {
                                         //子工单生成的检查明细,还是挂接到主工单上。
@@ -1513,7 +1515,7 @@ namespace Business.ResourceExamineManagement
                                                                  //数量圆整 按最小包装量向上圆整
             decimal qty = Math.Ceiling(returnlist.lack_qty / (supplier.packaging_qty.GetValueOrDefault() == 0 ? 1 : supplier.packaging_qty.GetValueOrDefault()));
             //判断最小起订量
-            qty = qty > supplier.qty_min ? qty : supplier.qty_min.GetValueOrDefault();
+            qty = qty > supplier.qty_min.GetValueOrDefault() ? qty : supplier.qty_min.GetValueOrDefault();
             srm_Pr.pr_rqty = returnlist.lack_qty;//需求数量
             srm_Pr.pr_aqty = qty;//申请数量
             srm_Pr.pr_sqty = qty;//建议数量

+ 4 - 31
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -154,34 +154,7 @@ namespace Business.ResourceExamineManagement
             mes_Morder.bom_number = generateMorderDto.BomNumber;
             mes_Morder.fmodel = generateMorderDto.ic_Item.model;
             mes_Morder.urgent = 0;//暂时不用这个字段
-            if (generateMorderDto.ParentId != null && generateMorderDto.moentry_sys_stime != null)
-            {
-                //最早的开工时间3天后、 最晚时间为订单承诺时间 - 采购提前期 - 质检提前期 - 入库提前期 - 发料提前期 = 最晚开工时间  最早或最晚为系统建议开工日期
-                //var StartDate = DateTime.Now.Date.AddDays(3);
-                mes_Morder.moentry_sys_stime = generateMorderDto.moentry_sys_stime;
-                if (!string.IsNullOrEmpty(generateMorderDto.BomNumber))
-                {
-                    ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                    {
-                        ItemNum = generateMorderDto.BomNumber,
-                        PlanStart = generateMorderDto.moentry_sys_stime.Value,
-                        QtyOrd = (int)generateMorderDto.Quantity.GetValueOrDefault()
-                    };
-                    _productExamineAppService.prodLines = prodLines;
-                    _productExamineAppService.routingOps = routingOps;
-                    _productExamineAppService.periodSequences = periodSequences;
-                    _productExamineAppService.calendarWorks = calendarWorks;
-                    _productExamineAppService.qualityLineWorks = qualityLineWorks;
-                    _productExamineAppService.holidays = holidays;
-
-                    var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
-                    //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                    //var Day = ProductiveDate / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                    mes_Morder.moentry_sys_etime = ProductiveDate;
-                    TimeSpan span = ProductiveDate - generateMorderDto.moentry_sys_stime.Value;
-                    mes_Morder.morder_need_time = (decimal)span.TotalMinutes;
-                }
-            }
+            
             mes_Morder.moentry_startup_status = 0;
             mes_Morder.tenant_id = param.company_id.GetValueOrDefault();
             mes_Morder.factory_id = param.factoryId;
@@ -274,13 +247,13 @@ namespace Business.ResourceExamineManagement
             //&& x.fitem_number == ic_Item.number && x.bang_id == bang_id);
 
             var mes_mooccupyList = mo_Mes_Mooccupies.Where(x => x.fitem_number == ic_Item.number);
-
+            DateTime totime = DateTime.Now;
             //首先满足需求数量工单其次判断是否满足交付日期、当数量不满足时继续查找最早交付日期订单 工单数量累加。
             //当前工单计划日期-1天 小于交付日期 && 计算生产数量-入库数据并且大于需求产品数量。
             var moentrys = mo_Mes_Moentry.Where(s => s.soentry_id == seorderentry.Id);
             //找到当前订单行生成的主工单
             var toMid = moentrys.Select(s => s.moentry_moid).ToList();
-            var morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && x.morder_type == MorderEnum.JhMorder && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate &&
+            var morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && x.morder_type == MorderEnum.JhMorder && totime < x.moentry_sys_etime.GetValueOrDefault() && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate &&
             (x.morder_production_number - x.inventory_number - mes_mooccupyList.Where(p => p.moo_moid.GetValueOrDefault() == x.mysql_id)?.Sum(m => m.moo_qty)) > Quantity)
              .OrderByDescending(x => x.planner_end_date).ToList();
 
@@ -288,7 +261,7 @@ namespace Business.ResourceExamineManagement
             //当数量或日期不满足的时候,寻找最早日期的工单
             if (morderDataList.Count == 0)
             {
-                morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && (x.morder_type == MorderEnum.JhMorder || toMid.Contains(x.mysql_id)) && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
+                morderDataList = mo_Mes_Morders.Where(x => x.bom_number == bomNumber && (x.morder_type == MorderEnum.JhMorder || toMid.Contains(x.mysql_id)) && totime < x.moentry_sys_etime.GetValueOrDefault() && x.moentry_sys_etime.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.planner_end_date).ToList();
             }
             var QuantityNumber = 0.00m;
             //存在此数据满足当前BOM交付找到最早日期工单,则返回无需后续继续检查。

+ 5 - 3
MicroServices/Business/Business.Application/ResourceExamineManagement/PurchaseOrderAppService.cs

@@ -86,13 +86,15 @@ namespace Business.ResourceExamineManagement
             //采购订单占用数据
             var poOccupys = srm_Po_Occupies.Where(x => poDetailList.Select(p => p.Id).ToList().Contains(x.polist_id));
 
+            DateTime toTime = DateTime.Now.Date;
+
             //先查询出满足日期,并且数量可满足占用的数据
-            var poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault() < DeliverDate && x.qty - x.rqty - x.esqty -
+            var poDetails = poDetailList.Where(x => toTime < x.rarrdate.GetValueOrDefault() && x.rarrdate.GetValueOrDefault() < DeliverDate && x.qty - x.rqty - x.esqty -
                 poOccupys.Where(p => p.polist_id == x.mysql_id)?.Sum(m => m.qty) > Quantity).OrderByDescending(x => x.rarrdate).ToList();
             //未满足则查询出满足日期的订单
             if (poDetails.Count == 0)
             {
-                poDetails = poDetailList.Where(x => x.rarrdate.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.rarrdate).ToList();
+                poDetails = poDetailList.Where(x => toTime < x.rarrdate.GetValueOrDefault() && x.rarrdate.GetValueOrDefault() < DeliverDate).OrderByDescending(x => x.rarrdate).ToList();
             }
             var QuantityNumber = 0.00m;
             foreach (var item in poDetails)
@@ -126,7 +128,7 @@ namespace Business.ResourceExamineManagement
             //代表PO还未占用完
             if (Quantity > 0)
             {
-                var prlist  = srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_sarrive_date <= DeliverDate).ToList();
+                var prlist  = srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && toTime < x.pr_sarrive_date && x.pr_sarrive_date < DeliverDate).OrderByDescending(f => f.pr_sarrive_date).ToList();
                 foreach (var pr in prlist)
                 {
                     decimal prOccupy = srm_Po_Occupies.Where(x => x.polist_id == pr.mysql_id).Sum(c => c.qty.GetValueOrDefault());

+ 49 - 23
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -704,6 +704,7 @@ namespace Business.ResourceExamineManagement
                     dtl.need_qty = item.qty.GetValueOrDefault();
                     dtl.need_time = item.plan_date;
                     dtl.bangid = bangid;
+                    dtl.prd_code = item.item_number;
                     //获取当前物料bom数据
                     var childBom = boms.Where(p => p.item_number == item.item_number).FirstOrDefault();
                     dtl.bom_number = childBom.bom_number;
@@ -877,10 +878,10 @@ namespace Business.ResourceExamineManagement
                 b_ex.GenerateNewId(help.NextId());// = help.NextId();
                 if (_CalcBomViewAppService.mordersInsertList.Any())
                 {
-                    var moentry = _CalcBomViewAppService.moentriesInsertList.Where(s => s.soentry_id == b_ex.sentry_id).FirstOrDefault();
+                    var moentry = _CalcBomViewAppService.moentriesInsertList.Where(s => s.soentry_id == b_ex.sentry_id).ToList();
                     if (moentry != null)
                     {
-                        var sentryMo = _CalcBomViewAppService.mordersInsertList.Where(s => s.mysql_id == moentry.moentry_moid).FirstOrDefault();
+                        var sentryMo = _CalcBomViewAppService.mordersInsertList.Where(s => moentry.Select(x => x.moentry_moid).Contains(s.mysql_id) && s.product_code == ex.prd_code).FirstOrDefault();
                         if (sentryMo != null)
                         {
                             b_ex.morder_id = sentryMo.mysql_id;
@@ -1011,14 +1012,14 @@ namespace Business.ResourceExamineManagement
                 {
                     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 });
                 if (list.Count() > 1)
                 {
@@ -1099,7 +1100,7 @@ namespace Business.ResourceExamineManagement
             DateTime toTime = DateTime.Now; //new DateTime(2023, 7, 6);
             DateTime starttime = toTime.Date.AddDays(8);
             DateTime endtime = toTime.Date.AddDays(14);
-            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && (s.state == 1 || s.state == 3)).Result;
+            List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.pr_ssend_date >= starttime && s.pr_ssend_date <= endtime && s.state == 1).Result;
             List<ic_item> ic_Items = _mysql_ic_item.GetListAsync(s => s.company_id.ToString() == companyid && prlist.Select(c => c.icitem_id).Contains(s.Id)).Result;
 
             var occupylist = _mysql_srm_po_occupy.GetListAsync(s => prlist.Select(c => c.Id).Contains(s.polist_id.GetValueOrDefault()) && s.company_id.ToString() == companyid && s.IsDeleted == false).Result;
@@ -1308,7 +1309,7 @@ namespace Business.ResourceExamineManagement
             DateTime starttime = toTime.AddDays(1);
             DateTime endtime = toTime.AddDays(8);
             List<srm_pr_main> prlist = _mysql_srm_pr_main.GetListAsync(s => s.company_id.ToString() == companyid && s.IsRequireGoods == 0 && s.pr_sarrive_date >= starttime &&
-            s.pr_sarrive_date <= endtime && (s.state == 1|| s.state == 2 || s.state == 3)).Result;
+            s.pr_sarrive_date <= endtime && s.state == 1).Result;
 
             if (prlist.Any())
             {
@@ -1384,10 +1385,10 @@ namespace Business.ResourceExamineManagement
             {
                 return JsonConvert.SerializeObject("所选包含已关闭要货令,请重新选择。");
             }
-            if (prlist.Where(s => s.state == 3).Count() > 0)
+            /*if (prlist.Where(s => s.state == 3).Count() > 0)
             {
                 return JsonConvert.SerializeObject("所选包含评审未通过要货令,请重新选择。");
-            }
+            }*/
             if (prlist.Where(s => s.IsRequireGoods == 0).Count() > 0)
             {
                 return JsonConvert.SerializeObject("包含采购申请,不允许与要货令转采购订单。");
@@ -1558,18 +1559,18 @@ namespace Business.ResourceExamineManagement
                     //如果计算记录有工单id,则代表有生成工单,而不是占用计划工单
                     if (newExm.morder_id.GetValueOrDefault() != 0)
                     {
-                        var me = moentry.Find(s => s.soentry_id == se.Id && s.bang_id == newExm.bangid);
-                        if (me == null)
+                        var meList = moentry.Where(s => s.soentry_id == se.Id && s.bang_id == newExm.bangid).ToList();
+                        if (!meList.Any())
                         {
-                            //补救场景,假设mongdb数据丢失,从一个json格式中获取数据
+                            //补救场景,假设mongdb数据丢失,从一个json格式中获取数据//此处暂不考虑
                         }
-                        var mo = mordersList.Find(s => s.mysql_id == me.moentry_moid && s.bang_id == newExm.bangid);
-                        if (mo == null)
+                        var molist = mordersList.Where(s => meList.Select(c => c.moentry_moid).Contains(s.mysql_id) && s.bang_id == newExm.bangid).ToList();
+                        if (!molist.Any())
                         {
-                            //补救场景,假设mongdb数据丢失,从一个json格式中获取数据
+                            //补救场景,假设mongdb数据丢失,从一个json格式中获取数据//此处暂不考虑
                         }
-                        WriteMoentry.Add(me);
-                        WriteMorder.Add(mo);
+                        WriteMoentry.AddRange(meList);
+                        WriteMorder.AddRange(molist);
                     }
                     exmResult.Add(newExm);
                     bangidList.Add(newExm.bangid.GetValueOrDefault());
@@ -1908,7 +1909,7 @@ namespace Business.ResourceExamineManagement
             if (srm_po_list.Count > 0)
             {
                 //采购订单--取出状态为在途的PO
-                var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_po_list.Select(c => c.po_id).Contains(x.Id) && (x.state == 0 || x.state == 1)).Result;
+                var srm_po_main = _mysql_srm_po_main.GetListAsync(x => x.company_id == companyId && x.factory_id == factoryId && srm_po_list.Select(c => c.po_id).Contains(x.Id) && x.state != 4).Result;
                 if (srm_po_main.Count > 0)
                 {
                     var moSrm_po_main = ObjectMapper.Map<List<srm_po_main>, List<mo_srm_po_main>>(srm_po_main);
@@ -1978,7 +1979,7 @@ namespace Business.ResourceExamineManagement
             //await _srm_po_occupy.DeleteAsync(p => p.bang_id == bangid);
 
             //清除PR
-            await _srm_pr_main.DeleteAsync(p => p.bang_id == bangid);
+            //await _srm_pr_main.DeleteAsync(p => p.bang_id == bangid);
         }
 
         /// <summary>
@@ -2123,7 +2124,7 @@ namespace Business.ResourceExamineManagement
                     poDto.polist = new List<srm_po_list>();
                     pOGroupDtos.Add(poDto);
                 }
-                item.state = 4;
+                item.state = 0;
                 srm_po_list podetail = new srm_po_list();
                 podetail.GenerateNewId(help.NextId());
                 podetail.pr_id = item.Id;
@@ -2146,7 +2147,7 @@ namespace Business.ResourceExamineManagement
                 podetail.taxamount = item.pr_orderprice.GetValueOrDefault() - podetail.netmoney;
                 podetail.plan_qty = item.pr_aqty;
                 podetail.unit = item.pr_unit;
-                podetail.state = item.state;
+                podetail.state = 1;
                 podetail.rarrdate = item.pr_sarrive_date;
                 podetail.rnumber = 0;
                 podetail.currencytype = item.currencytype;
@@ -3105,6 +3106,7 @@ namespace Business.ResourceExamineManagement
                 dtl.order_statr_time = item.start_time;
                 dtl.bom_number = item.bom_number;
                 dtl.need_qty = item.need_number.GetValueOrDefault();
+                dtl.prd_code = item.product_code;
 
                 //获取当前物料bom数据
                 var childBom = boms.Where(p => p.bom_number == item.bom_number).FirstOrDefault();
@@ -3992,13 +3994,19 @@ namespace Business.ResourceExamineManagement
                     woRouting.CreateTime = DateTime.Now;
                     workOrdRoutings.Add(woRouting);
                 }
-
-                var exm = exmResult.Find(s => s.morder_id == item.Id);
+                long fid = GetParentMo(morders, item);
+                var exm = exmResult.Find(s => s.morder_id == fid);
                 if (exm != null)
                 {
                     var childs = childExamineList.Where(s => s.examine_id == exm.Id && s.is_use == true).ToList();
+
+                    var child = childs.Find(s => s.item_number == item.product_code);
+                    if (child == null)
+                    {
+                        continue;
+                    }
                     List<b_bom_child_examine> returnList = new List<b_bom_child_examine>();
-                    GetWorkDetalis(childs.Where(s => s.level == 2).ToList(), returnList, childs);
+                    GetWorkDetalis(childs.Where(s => s.parent_id == child.fid).ToList(), returnList, childs);
                     if (returnList.Any())
                     {
                         foreach (var structure in returnList)
@@ -4059,6 +4067,24 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+        public long GetParentMo(List<mes_morder> morders, mes_morder item)
+        {
+            if (item.parent_id != null)
+            {
+                var parentMo = morders.Find(s => s.Id == item.parent_id);
+                if (parentMo != null)
+                {
+                    return GetParentMo(morders, parentMo);
+                }
+                else {
+                    return item.Id;
+                }
+            }
+            else {
+                return item.Id;
+            }
+        }
+
         /// <summary>
         /// 获取虚拟件明细
         /// </summary>

+ 1 - 1
MicroServices/Business/Business.Domain/StructuredDB/SRM/srm_po_main.cs

@@ -61,7 +61,7 @@ namespace Business.Domain
         [Comment("是否加急")]
         public int? po_express { get; set; }
         /// <summary>
-        /// 数据状态(0-新增、1-通过、2-完成、3-关闭、4-未通过)
+        /// 数据状态(0-新增、1-审核中、2-同意、3-拒绝、4-关闭)
         /// </summary>
         [Comment("数据状态")]
         public int? state { get; set; }