Browse Source

解决冲突

Murphy 2 years ago
parent
commit
082d2f2268

+ 5 - 1
MicroServices/Business/Business.Application.Contracts/Dto/LineStartDto.cs

@@ -31,6 +31,11 @@ namespace Business.Dto
         /// </summary>
         public decimal setupTime { get; set; }
 
+        /// <summary>
+        /// 工序清场时间(分钟)
+        /// </summary>
+        public decimal WaitTime { get; set; }
+
         /// <summary>
         /// 产线排产实际开始日期
         /// </summary>
@@ -41,5 +46,4 @@ namespace Business.Dto
         /// </summary>
         public decimal Rate { get; set; }
     }
-   
 }

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

@@ -301,6 +301,11 @@ namespace Business.ResourceExamineManagement
                                 }
                                 //1.先生成委外工单。
                                 var mesorder = CreateMesOOder(level1Dto, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+
+                                //2.生成采购申请
+                                //采购申请
+                                PackageSRMPR(level1Dto, bangid, sentrys);
+
                                 level1Dto.subcontracting_qty = level1Dto.lack_qty;
                                 level1Dto.subcontracting_list = new List<ooder>();
                                 ooder oo = new ooder();
@@ -310,19 +315,12 @@ namespace Business.ResourceExamineManagement
                                 oo.production_unit_code = mesorder.production_unit_code;
                                 oo.ooentry_prdname = mesorder.ooentry_prdname;
                                 oo.ooentry_stime = mesorder.ooentry_stime;
-                                oo.ooentry_etime = mesorder.ooentry_etime;
+                                oo.ooentry_etime = level1Dto.kitting_time;
                                 oo.oorder_date = mesorder.oorder_date;
                                 oo.oorder_no = mesorder.oorder_no;
                                 level1Dto.subcontracting_list.Add(oo);
-                                level1Dto.kitting_time = mesorder.ooentry_etime;
                                 orderList.Add(mesorder);
-                                //2.生成采购申请
-                                //采购申请
-                                PackageSRMPR(level1Dto, bangid, sentrys);
                             }
-
-                           
-
                         }
                         else
                         {
@@ -736,6 +734,9 @@ namespace Business.ResourceExamineManagement
                             }
                             //1.先生成委外工单。
                             var mesorder = CreateMesOOder(item, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                            //2.生成采购申请
+                            //采购申请
+                            PackageSRMPR(item, bangid, sentrys);
                             item.subcontracting_qty = item.lack_qty;
                             item.subcontracting_list = new List<ooder>();
                             ooder oo = new ooder();
@@ -745,15 +746,12 @@ namespace Business.ResourceExamineManagement
                             oo.production_unit_code = mesorder.production_unit_code;
                             oo.ooentry_prdname = mesorder.ooentry_prdname;
                             oo.ooentry_stime = mesorder.ooentry_stime;
-                            oo.ooentry_etime = mesorder.ooentry_etime;
+                            oo.ooentry_etime = item.kitting_time;
                             oo.oorder_date = mesorder.oorder_date;
                             oo.oorder_no = mesorder.oorder_no;
                             item.subcontracting_list.Add(oo);
-                            item.kitting_time = mesorder.ooentry_etime;
                             orderList.Add(mesorder);
-                            //2.生成采购申请
-                            //采购申请
-                            PackageSRMPR(item, bangid, sentrys);
+                            
                         }
                     }
                 }
@@ -1162,6 +1160,8 @@ namespace Business.ResourceExamineManagement
                                     }
                                     //1.先生成委外工单。
                                     var mesorder = CreateMesOOder(sct, param.company_id, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                                    //采购申请
+                                    PackageSRMPR(sct, bangid, sentrys);
                                     sct.subcontracting_qty = sct.lack_qty;
                                     sct.subcontracting_list = new List<ooder>();
                                     ooder oo = new ooder();
@@ -1171,14 +1171,11 @@ namespace Business.ResourceExamineManagement
                                     oo.production_unit_code = mesorder.production_unit_code;
                                     oo.ooentry_prdname = mesorder.ooentry_prdname;
                                     oo.ooentry_stime = mesorder.ooentry_stime;
-                                    oo.ooentry_etime = mesorder.ooentry_etime;
+                                    oo.ooentry_etime = sct.kitting_time;
                                     oo.oorder_date = mesorder.oorder_date;
                                     oo.oorder_no = mesorder.oorder_no;
                                     item.subcontracting_list.Add(oo);
-                                    sct.kitting_time = mesorder.ooentry_etime;
                                     orderList.Add(mesorder);
-                                    //采购申请
-                                    PackageSRMPR(sct, bangid, sentrys);
                                 }
                             }
                         }
@@ -1300,7 +1297,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() + plan.clean_leadtime.GetValueOrDefault()));//加上提前期和备料期,得到齐套时间
+            sRMPR.lastStartTmie = DateTime.Now.AddDays((double)(sRMPR.srm_Pr_Main.MinBy(x => x.totalLeadTime).totalLeadTime.GetValueOrDefault()));//加上提前期和备料期,得到齐套时间
             return sRMPR;
         }
         // 生成订单编号 字母+年月日+8位随机数+时间戳
@@ -1443,8 +1440,9 @@ namespace Business.ResourceExamineManagement
             {
                 item.purchase_qty = item.lack_qty;
                 item.purchase_list = new List<purchase>();
-                item.kitting_time = SRMPRDto.lastStartTmie;
+                
             }
+            item.kitting_time = SRMPRDto.lastStartTmie;
             SRMPRDtoList.Add(SRMPRDto);
         }
     }

File diff suppressed because it is too large
+ 649 - 263
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductionScheduleAppService.cs


+ 165 - 108
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -10,7 +10,9 @@ using Business.ResourceExamineManagement.Dto;
 using Business.StructuredDB.SaleFcst;
 using Business.StructuredDB.WMS;
 using EFCore.BulkExtensions;
+using Microsoft.AspNetCore.DataProtection.Repositories;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
 using MongoDB.Driver;
 using MongoDB.Driver.Linq;
 using Newtonsoft.Json;
@@ -2393,6 +2395,9 @@ namespace Business.ResourceExamineManagement
             //只做库存是否齐套检查
             if (mo_Mes_Morders.Any())
             {
+                List<mes_morder> updateList = new List<mes_morder>();
+                List<mes_morder> xdupdateList = new List<mes_morder>();
+
                 //检查工单是否已经下了领料单
                 var nbrList = _nbrMaster.Select(a => a.Domain == domain && a.Type == "SM" && mo_Mes_Morders.Select(c => c.morder_no).Contains(a.WorkOrd));
                 foreach (var mo in mo_Mes_Morders)
@@ -2422,6 +2427,7 @@ namespace Business.ResourceExamineManagement
                             //工单状态为  “备料中”
                             mo.MaterialSituation = MorderEnum.Preparation;
                         }
+                        updateList.Add(mo);
                         //完成时间已经过去,则不做处理
                     }
                     else {
@@ -2479,6 +2485,7 @@ namespace Business.ResourceExamineManagement
                                     workords += "," + cmo.morder_no;
                                     cmo.MaterialSituation = MorderEnum.Preparation;
                                     cmo.morder_state = MorderEnum.Xd_state;
+                                    updateList.Add(cmo);
                                 }
                                 else {
                                     cmo.MaterialSituation = MorderEnum.CarehouseComplete;
@@ -2487,6 +2494,10 @@ namespace Business.ResourceExamineManagement
                                         workords += "," + cmo.morder_no;
                                         cmo.MaterialSituation = MorderEnum.Preparation;
                                         cmo.morder_state = MorderEnum.Xd_state;
+                                        xdupdateList.Add(cmo);
+                                    }
+                                    else {
+                                        updateList.Add(cmo);
                                     }
                                 }
                             }
@@ -2499,6 +2510,11 @@ namespace Business.ResourceExamineManagement
                                     workords += "," + cmo.morder_no;
                                     cmo.morder_state = MorderEnum.Xd_state;
                                     cmo.MaterialSituation = MorderEnum.Part;
+                                    xdupdateList.Add(cmo);
+                                }
+                                else
+                                {
+                                    updateList.Add(cmo);
                                 }
                             }
                         }
@@ -2508,7 +2524,7 @@ namespace Business.ResourceExamineManagement
                     //保存检查结果
                     SaveExamineResult(result.KittingCheckResultList, result.DayBulletinBoardList, 1);*/
                 }
-                _businessDbContext.BulkUpdate(mo_Mes_Morders);
+                _businessDbContext.BulkUpdate(updateList);
                 if (workords.Length > 0)
                 {
                     workords = workords.Substring(1, workords.Length - 1);
@@ -2518,6 +2534,7 @@ namespace Business.ResourceExamineManagement
                     {
                         return rst;
                     }
+                    _businessDbContext.BulkUpdate(xdupdateList);
                     var insertList = GetCopyOP(workords, domain);
                     if (insertList.Any())
                     {
@@ -3038,8 +3055,13 @@ namespace Business.ResourceExamineManagement
                     var wkordPrList = prmainlist.Where(s => s.pr_mono == wod.WorkOrd).ToList();
 
                     //反算所有的PR,根据时间减去提前期   //按最大预处理时间倒排
-                    var moIcitems = icitemlist.Where(s => wkordPrList.Select(c => c.icitem_id).Contains(s.mysql_id)).ToList();
-                    var maxTime = moIcitems.Max(s => s.clean_leadtime.GetValueOrDefault());
+                    var moIcitems = icitemlist.Where(s => s.is_clean == 1 && wkordPrList.Select(c => c.icitem_id).Contains(s.mysql_id)).ToList();
+                    //获取预处理提前期最大值
+                    decimal maxTime = 0;
+                    if (moIcitems.Any())
+                    {
+                        maxTime = moIcitems.Max(x => x.clean_leadtime.GetValueOrDefault());
+                    }
                     wkordPrList.ForEach(pr =>
                     {
                         var ts = pr.pr_parrive_date - pr.pr_psend_date;
@@ -3288,7 +3310,7 @@ namespace Business.ResourceExamineManagement
             AutoCreateBomBill(companyid);
         }
 
-        public async Task AutoCreatePickBill(List<WorkOrdMaster> workOrdMasters, List<PeriodSequenceDet> dbPeriodSequences, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList, string userAccount)
+        public async Task AutoCreatePickBill(List<WorkOrdMaster> workOrdMasters, List<PeriodSequenceDet> dbPeriodSequences, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList, string userAccount, List<WorkOrdDetail> workDetails)
         {
             if (dbPeriodSequences.Any())
             {
@@ -3296,11 +3318,14 @@ namespace Business.ResourceExamineManagement
                 List<LineMaster> AllLineMasters = _lineMaster.Select(p => AllLines.Contains(p.Line) && p.Domain == workOrdMasters[0].Domain && p.IsActive);
                 var user = _employeeMaster.Select(s => s.Employee == userAccount && s.Domain == workOrdMasters[0].Domain).FirstOrDefault();
                 var ewdmList = _empWorkDutyMaster.Select(s => s.Domain == workOrdMasters[0].Domain).ToList();
+                //需要前处理物料
+                var Items = _mysql_ic_item.GetListAsync(s => workDetails.Select(c => c.ItemNum).Contains(s.number) && s.factory_id.ToString() == workOrdMasters[0].Domain).Result;
+                List<ItemMaster> itemMasterList = _itemMaster.Select(p => workDetails.Select(c => c.ItemNum).Contains(p.ItemNum) && p.Domain == workOrdMasters[0].Domain).Distinct().ToList();
+
                 //按照工单领料,一个工单一个领料单,之前是按照排产日期和产线分别领料
                 foreach (var workord in workOrdMasters)
                 {
                     Dictionary<string, decimal> dictItemQty = new Dictionary<string, decimal>();
-                    decimal QtyOrdSum = workord.QtyOrded;
                     string LocationTo = "";
                     LineMaster defaultLine = null;
 
@@ -3314,110 +3339,44 @@ namespace Business.ResourceExamineManagement
                         }
                         LocationTo = defaultLine?.VLocation;
                     }
-                    
-                    List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord.WorkOrd).ItemNum, QtyOrdSum, workord.Domain);
-                    var childrenList = itemList.Select(a => a.ComponentItem).Distinct().ToList();
-                    List<ItemMaster> itemLocList = _itemMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
-                    var dopIcitems = _ic_item.GetListAsync(s => itemLocList.Select(c => c.ItemNum).Contains(s.number) && s.factory_id.ToString() == workord.Domain).Result;
+                    var workdtls = workDetails.Where(s => s.WorkOrd == workord.WorkOrd).ToList();
+                    //List<ProductStructureMaster> itemList = GetProductStructure(dbPeriodSequences.First(a => a.WorkOrds == workord.WorkOrd).ItemNum, QtyOrdSum, workord.Domain);
+                    //var childrenList = itemList.Select(a => a.ComponentItem).Distinct().ToList();
+                    List<ItemMaster> itemLocList = itemMasterList.Where(p => workdtls.Select(c => c.ItemNum).Contains(p.ItemNum) && p.Domain == workord.Domain).Distinct().ToList();
+
+                    List<WorkOrdDetail> cleanDetail = new List<WorkOrdDetail>();
+                    List<WorkOrdDetail> noCleanDetail = new List<WorkOrdDetail>();
+                    workdtls.ForEach(s => {
+                        var i = Items.Find(x => x.number == s.ItemNum && x.is_clean == 1);
+                        if (i != null)
+                        {
+                            cleanDetail.Add(s);
+                        }
+                        else {
+                            noCleanDetail.Add(s);
+                        }
+                    });
                     //获取预处理提前期最大值
                     decimal cleanTime = 0;
-                    if (dopIcitems.Any())
+                    if (noCleanDetail.Any())
                     {
-                        cleanTime = dopIcitems.Max(s => s.clean_leadtime.GetValueOrDefault());
+                        //无需前处理领料单
+                        GenerateNbr(workord, cleanTime, defaultLine, userAccount, nbrMasterList, nbrDetailList, noCleanDetail, itemLocList, ewdmList, LocationTo, user,"");
                     }
-                    List<ItemPackMaster> itemPackList = _itemPackMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
-                    var Nbr = GetMaxSerialNumber(417416915624005);
-                    
-                    DateTime eff = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1);
-                    DateTime start = eff.AddDays((double)(0 - cleanTime - 1));
-                    if (start <= DateTime.Now.Date)
+                    if (cleanDetail.Any())
                     {
-                        start = DateTime.Now.Date;
+                        //需要前处理的领料单
+                        cleanTime = Items.Where(s=> cleanDetail.Select(i=>i.ItemNum).Contains(s.number)).Max(s => s.clean_leadtime.GetValueOrDefault());
+                        GenerateNbr(workord, cleanTime, defaultLine, userAccount, nbrMasterList, nbrDetailList, cleanDetail, itemLocList, ewdmList, LocationTo, user, "PrevProcess");
                     }
-                    var newNbr = new NbrMaster
-                    {
-                        Domain = workord.Domain,
-                        Type = "SM",
-                        Nbr = Nbr,
-                        Remark = "下达自动领料",
-                        //Date = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Min(a => a.PlanDate),
-                        ProdLine = defaultLine?.Line,
-                        EffDate = eff,
-                        Date = start,
-                        Status = "",
-                        WorkOrd = workord.WorkOrd,
-                        QtyOrd = QtyOrdSum,
-                        IsActive = true,
-                        IsChanged = true,
-                        Name = userAccount,
-                        Department = "101",
-                        CreateTime = DateTime.Now,
-                        UpdateTime = DateTime.Now,
-                        CreateUser = user?.Name,
-                        UpdateUser = user?.Name,
-                    };
-                    nbrMasterList.Add(newNbr);
-                    List<string> headAccount = new List<string>();
-                    int i = 1;
-                    itemList?.ForEach(a =>
-                    {
-                        var find = itemLocList?.Find(c => c.ItemNum == a.ComponentItem);
-                        string LocationFrom = "";
-                        if (find != null)
-                        {
-                            LocationFrom = find.Location;
-                            //找出职责范围负责人
-                            //s.ItemNum1 <= a.ComponentItem && a.ComponentItem <= s.ItemNum2
-                           var ewdm = ewdmList.Find(s => 0 >= string.Compare(s.ItemNum1, a.ComponentItem) && 0 >= string.Compare(a.ComponentItem, s.ItemNum2));
-                            if (ewdm != null && !string.IsNullOrEmpty(ewdm.Employee))
-                            {
-                                headAccount.Add(ewdm.Employee);
-                            }
-                        }
-                        
-                        //相同物料汇总
-                        var itemComponent = nbrDetailList.Find(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem);
-                        if (itemComponent == null)
-                        {
-                            nbrDetailList.Add(new NbrDetail
-                            {
-                                Domain = workord.Domain,
-                                Type = "SM",
-                                Nbr = Nbr,
-                                ItemNum = a.ComponentItem,
-                                QtyFrom = 0,
-                                QtyTo = 0,
-                                LocationFrom = LocationFrom,
-                                LocationTo = LocationTo,//现在这几条线是同一线边仓,暂时不考虑多个线边仓
-                                WorkOrd = workord.WorkOrd,
-                                QtyOrd = a.Qty,
-                                CurrQtyOpened = a.Qty,
-                                Line = i,
-                                IsActive = true,
-                                CreateTime = DateTime.Now,
-                                UpdateTime = DateTime.Now,
-                                CreateUser = user?.Name,
-                                UpdateUser = user?.Name,
-                                UM = a.UM
-                            });
-                            i++;
-                        }
-                        else
-                        {
-                            nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).QtyOrd = itemComponent.QtyOrd + a.Qty;
-                            nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ComponentItem).CurrQtyOpened = itemComponent.CurrQtyOpened + a.Qty;
-                        }
-                    });
+                    
 
-                    if (headAccount.Any())
-                    {
-                        newNbr.User1 = string.Join(",", headAccount.Distinct());
-                        string[] user2 = headAccount.ToArray();
-                        newNbr.User2 =JsonConvert.SerializeObject(user2);
-                    }
+                    
+                    //List<ItemPackMaster> itemPackList = _itemPackMaster.Select(p => childrenList.Contains(p.ItemNum) && p.Domain == workord.Domain && p.IsActive).Distinct().ToList();
+                    
 
-                    //先屏蔽备料单扣除库存的DEMO演示。
-                    /*nbrDetailList.ForEach(a =>
+                    /*//先屏蔽备料单扣除库存的DEMO演示。
+                    nbrDetailList.ForEach(a =>
                     {
                         if (a.Nbr == Nbr)
                         {
@@ -3464,6 +3423,101 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+        private void GenerateNbr(WorkOrdMaster workord,decimal cleanTime, LineMaster defaultLine, string userAccount, List<NbrMaster> nbrMasterList, List<NbrDetail> nbrDetailList, List<WorkOrdDetail> detail, List<ItemMaster> itemLocList, List<EmpWorkDutyMaster> ewdmList, string LocationTo,EmployeeMaster user,string TransType)
+        {
+            var Nbr = GetMaxSerialNumber(417416915624005);
+            DateTime eff = workord.OrdDate.GetValueOrDefault().Date.AddDays(-1);
+            DateTime start = eff.AddDays((double)(0 - cleanTime - 1));
+            if (start <= DateTime.Now.Date)
+            {
+                start = DateTime.Now.Date;
+            }
+            //string sql = "exec pr_SFM_GetOrdNbr @Domain='{0}',@NbrType='SM', @UserNo='{1}',@IsDopCall=1'";
+
+            var newNbr = new NbrMaster
+            {
+                Domain = workord.Domain,
+                Type = "SM",
+                Nbr = Nbr,
+                Remark = "下达自动领料",
+                //Date = dbPeriodSequences.Where(a => a.WorkOrds == workord.WorkOrd).Min(a => a.PlanDate),
+                ProdLine = defaultLine?.Line,
+                EffDate = eff,
+                Date = start,
+                Status = "",
+                WorkOrd = workord.WorkOrd,
+                QtyOrd = workord.QtyOrded,
+                IsActive = true,
+                IsChanged = true,
+                Name = userAccount,
+                Department = "101",
+                CreateTime = DateTime.Now,
+                UpdateTime = DateTime.Now,
+                CreateUser = user?.Name,
+                UpdateUser = user?.Name,
+                TransType = TransType
+            };
+            nbrMasterList.Add(newNbr);
+            List<string> headAccount = new List<string>();
+            int i = 1;
+            detail.ForEach(a =>
+            {
+                var find = itemLocList?.Find(c => c.ItemNum == a.ItemNum);
+                string LocationFrom = "";
+                if (find != null)
+                {
+                    LocationFrom = find.Location;
+                    //找出职责范围负责人
+                    var ewdm = ewdmList.Find(s => 0 >= string.Compare(s.ItemNum1, a.ItemNum) && 0 >= string.Compare(a.ItemNum, s.ItemNum2));
+                    if (ewdm != null && !string.IsNullOrEmpty(ewdm.Employee))
+                    {
+                        headAccount.Add(ewdm.Employee);
+                    }
+                    //相同物料汇总
+                    var itemComponent = nbrDetailList.Find(b => b.Nbr == Nbr && b.ItemNum == a.ItemNum);
+                    if (itemComponent == null)
+                    {
+                        nbrDetailList.Add(new NbrDetail
+                        {
+                            Domain = workord.Domain,
+                            Type = "SM",
+                            Nbr = Nbr,
+                            ItemNum = a.ItemNum,
+                            QtyFrom = 0,
+                            QtyTo = 0,
+                            LocationFrom = LocationFrom,
+                            LocationTo = LocationTo,//现在这几条线是同一线边仓,暂时不考虑多个线边仓
+                            WorkOrd = workord.WorkOrd,
+                            QtyOrd = a.QtyRequired,
+                            CurrQtyOpened = a.QtyRequired,
+                            Line = i,
+                            IsActive = true,
+                            CreateTime = DateTime.Now,
+                            UpdateTime = DateTime.Now,
+                            CreateUser = user?.Name,
+                            UpdateUser = user?.Name,
+                            UM = find.UM
+                        });
+                        i++;
+                    }
+                    else
+                    {
+                        nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ItemNum).QtyOrd = itemComponent.QtyOrd + a.QtyRequired;
+                        nbrDetailList.First(b => b.Nbr == Nbr && b.ItemNum == a.ItemNum).CurrQtyOpened = itemComponent.CurrQtyOpened + a.QtyRequired;
+                    }
+                }
+            });
+
+            if (headAccount.Any())
+            {
+                newNbr.User1 = string.Join(",", headAccount.Distinct());
+                string[] user2 = headAccount.ToArray();
+                newNbr.User2 = JsonConvert.SerializeObject(user2);
+            }
+        }
+
+
+
         public void AsyncItemStockFromWMS(List<crm_seorderentry> sentrys)
         {
             //产品编码
@@ -3621,22 +3675,24 @@ namespace Business.ResourceExamineManagement
             }
 
             //增加判断当前工单是否进行过齐套检查,并且是仓库齐套
-            var mes_morders = _mysql_mes_morder.GetListAsync(s => dbWorkOrds.Contains(s.morder_no) && s.factory_id.ToString() == domain).Result;
+            /*var mes_morders = _mysql_mes_morder.GetListAsync(s => dbWorkOrds.Contains(s.morder_no) && s.factory_id.ToString() == domain).Result;
             if (mes_morders.Where(s => s.MaterialSituation != MorderEnum.CarehouseComplete).Any())
             {
                 return "请选择物料情况为“仓库齐套”的工单。";
-            }
+            }*/
 
             List<NbrMaster> nbrMasterList = new List<NbrMaster>();//需要生成领料单列表
             List<NbrDetail> nbrDetailList = new List<NbrDetail>();//需要生成领料单明细列表
 
             var ords = workOrdMasters.Select(p => p.WorkOrd).ToList();
+            var workDetails = _workOrdDetail.Select(p => p.Domain == domain && workOrds.Contains(p.WorkOrd));
 
             dbPeriodSequences = dbPeriodSequences.Where(p => ords.Contains(p.WorkOrds)).ToList();
-            await AutoCreatePickBill(workOrdMasters, dbPeriodSequences, nbrMasterList, nbrDetailList, userAccount);
+            await AutoCreatePickBill(workOrdMasters, dbPeriodSequences, nbrMasterList, nbrDetailList, userAccount, workDetails);
             if (nbrMasterList.Any())
             {
-                dbPeriodSequences.ForEach(p => { p.Status = "r"; });
+                //改到发布日计划时更新。
+                //dbPeriodSequences.ForEach(p => { p.Status = "r"; });
                 workOrdMasters.ForEach(p => { p.Status = "r"; });
 
                 //清理掉库存占用  这里考虑的是资源检查的占用没有完全占用备料单数据,而其他数据再进行齐套检查时,无法考虑到备料单的占用。
@@ -3650,6 +3706,7 @@ namespace Business.ResourceExamineManagement
                     nbrdtls.ForEach(x =>
                     {
                         ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
+                        itemStockoccupyDto.GenerateNewId(help.NextId());
                         itemStockoccupyDto.morder_mo = s.WorkOrd;
                         itemStockoccupyDto.occupy_time = DateTime.Now;
                         var nbrItem = icitem.Find(c => c.number == x.ItemNum);
@@ -3676,13 +3733,13 @@ namespace Business.ResourceExamineManagement
                         _nbrMaster.Insert(nbrMasterList);
                         nbrMasterList.ForEach(a =>
                         {
-                            string sql ="exec pr_WMS_BPM_AddMobileTask @TaskID='{0}',@PlanDate='{1}',@ExecuterTypeID=2,@CreateUser='{2}'";
-                            _businessDbContext.Database.ExecuteSqlRaw(sql, a.Nbr, a.Date.Value.ToString("yyyy-MM-dd"), a.CreateUser);
+                            string sql =string.Format("exec pr_WMS_BPM_AddMobileTask @TaskID='{0}',@PlanDate='{1}',@ExecuterTypeID=2,@CreateUser='{2}'", a.Nbr, a.Date.Value.ToString("yyyy-MM-dd"), a.CreateUser);
+                            _businessDbContext.Database.ExecuteSqlRaw(sql);
                         });
 
                         if (itemstockoccupy.Any())
                         {
-                            _businessDbContext.BulkDelete(itemstockoccupy);
+                            await _mysql_ic_item_stockoccupy.HardDeleteAsync(itemstockoccupy);
                         }
                         if (insertOccuyy.Any())
                         { 

+ 131 - 21
MicroServices/Business/Business.Application/SaleForecastManagement/AnnualProductionOutlineAppService.cs

@@ -6,6 +6,7 @@ using Business.EntityFrameworkCore.SqlRepositories;
 using Business.SaleForecast;
 using Business.StructuredDB.SaleFcst;
 using Business.StructuredDB.WMS;
+using Microsoft.EntityFrameworkCore.Infrastructure;
 using NetTopologySuite.Algorithm;
 using RazorEngine;
 using Spire.Pdf.General.Render.Decode.Jpeg2000.j2k.wavelet.synthesis;
@@ -20,6 +21,7 @@ using Volo.Abp.DependencyInjection;
 using Volo.Abp.Domain.Repositories;
 using Volo.Abp.MultiTenancy;
 using Volo.Abp.Uow;
+using ZstdSharp.Unsafe;
 using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
 
 namespace Business.SaleForecastManagement
@@ -69,6 +71,23 @@ namespace Business.SaleForecastManagement
         /// 平台库存表
         /// </summary>
         private readonly IRepository<WMS_PlatformInventory, long> _PlatformInventory;
+        /// <summary>
+        /// 已发货记录
+        /// </summary>
+        private ISqlRepository<ASNBOLShipperDetail> _ASNBOLShipperDetail;
+        /// <summary>
+        /// 工单工艺路线明细
+        /// </summary>
+        private ISqlRepository<WorkOrdRouting> _workOrdRouting;
+        /// <summary>
+        /// 补货模型
+        /// </summary>
+        private IRepository<ReplenishmentModel, long> _replenishmentModel;
+        /// <summary>
+        /// 主生产计划
+        /// </summary>
+        private IRepository<ProductionMasterPlan, long> _productionMasterPlan;
+
 
         /// <summary>
         /// 雪花算法
@@ -90,18 +109,26 @@ namespace Business.SaleForecastManagement
             ISqlRepository<ProdLineDetail> prodLineDetail,
             IRepository<WMS_PlatformInventory, long> PlatformInventory,
             ISqlRepository<RoutingOpDetail> routingOpDetail,
-            ISqlRepository<LocationDetail> locationDetail
+            ISqlRepository<ASNBOLShipperDetail> ASNBOLShipperDetail,
+            ISqlRepository<WorkOrdRouting> workOrdRouting,
+            ISqlRepository<LocationDetail> locationDetail,
+            IRepository<ReplenishmentModel, long> replenishmentModel,
+            IRepository<ProductionMasterPlan, long> productionMasterPlan
             )
         {
             _unitOfWorkManager = unitOfWorkManager;
             _currentTenant = currentTenant;
             _PlatformInventory = PlatformInventory;
             _prodLineDetail = prodLineDetail;
+            _workOrdRouting = workOrdRouting;
             _routingOpDetail = routingOpDetail;
             _locationDetail = locationDetail;
+            _ASNBOLShipperDetail = ASNBOLShipperDetail;
             _yearDemandManagement = yearDemandManagement;
             _yearDemandManagementHistory = yearDemandManagementHistory;
             _annualProductionOutline = annualProductionOutline;
+            _replenishmentModel = replenishmentModel;
+            _productionMasterPlan = productionMasterPlan;
         }
         #endregion
         /// <summary>
@@ -121,42 +148,76 @@ namespace Business.SaleForecastManagement
             List<ProdLineDetail> prodLines = _prodLineDetail.Select(p => yearDemands.Select(m => m.SAPItemNumber).Contains(p.Part) && p.Domain == input.factory_id.ToString() && p.IsActive && routingOpList.Select(m => m.Op).Contains(p.Op)).OrderBy(x => x.Sequence).ToList();
             List<LocationDetail> locations = _locationDetail.Select(x => yearDemands.Select(m => m.SAPItemNumber).Contains(x.ItemNum) && x.Domain == input.factory_id.ToString() && x.IsActive).ToList();
             //平台库存
-            var platformInvList = _PlatformInventory.GetListAsync(a => yearDemands.Select(m => m.SAPItemNumber).Contains(a.SAPItemNumber) && a.tenant_id == input.tenant_id && a.factory_id == input.factory_id).Result;
-            //取上一个月发货出库记录
-            //IEnumerable<ASNBOLShipperDetail> shipList = _ASNBOLShipperDetail.Select(a => a.Domain == input.factory_id.ToString() && a.IsActive && a.shtype == "SH" && a.Typed != "S" && a.RealQty > 0 && planItemList.Contains(a.ContainerItem)).Where(s => s.ShipDate >= getMonthStartTime(-1) && s.ShipDate <= getMonthEndTime(-1));
-            //在制  -- 工单计划中的数量   工单数量-完成数=生产中的在制
+            var platformInvList = _PlatformInventory.GetListAsync(a => yearDemands.Select(m => m.SAPItemNumber).Contains(a.SAPItemNumber) && a.tenant_id == input.tenant_id && a.factory_id == input.factory_id && !a.IsDeleted).Result;
+            var replenishmentModels = _replenishmentModel.GetListAsync(x => !x.IsDeleted && x.isparam && yearDemands.Select(m => m.SAPItemNumber).Contains(x.number)).Result.ToList();
+            // 获取某年某月的起始日期和结束日期
+            int year = input.year;
+            int month = DateTime.Now.Month;
+            DateTime start = new DateTime(year, month, 1);
+            DateTime end = start.AddMonths(1).AddDays(-1);
+            //取当月发货出库记录
+            var shipList = _ASNBOLShipperDetail.Select(a => a.Domain == input.factory_id.ToString() && a.IsActive && a.shtype == "SH" && a.Typed != "S" && a.RealQty > 0 && yearDemands.Select(p => p.SAPItemNumber).Contains(a.ContainerItem)).Where(s => s.ShipDate >= start && s.ShipDate <= end);
+            #region 在制数量
+            //获取在制数量 获取工单数取每年4月到12月底的工单
+            DateTime startYear = new DateTime(year, 4, 1);
+            DateTime endYear = new DateTime(year, 12, 31);
+            List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.Select(x => x.IsActive && x.QtyComplete > 0 && x.Domain == input.factory_id.ToString()).Where(p => p.DueDate >= startYear && p.DueDate <= endYear).ToList();
+            decimal? InProductionQty = 0.00m;
+            var workOrds = workOrdRoutings.GroupBy(x => x.WorkOrd).ToList();
+            //按照工单循环
+            //某工单10-90工序   Max(10-80工序QtyComplete)-90工序QtyComplete =在制数量
+            foreach (var item in workOrds)
+            {
+                var workOrdRoutingList = workOrdRoutings.Where(x => x.WorkOrd == item.Key).OrderByDescending(o => o.OP).ToList();
+                //找出最大工序
+                var MaxOp = workOrdRoutingList.FirstOrDefault();
+                //查询出其他工序最大值
+                var MaxQtyComplete = workOrdRoutingList.Where(x => x.RecID != MaxOp.RecID).ToList().Max(o => o.QtyComplete);
+                InProductionQty += MaxQtyComplete - MaxOp.QtyComplete;
+            }
+            #endregion
             //年度生产大纲实体
             List<AnnualProductionOutline> annualProductionOutlines = new List<AnnualProductionOutline>();
             List<YearDemandManagement> frontYearDemand = new List<YearDemandManagement>();
             foreach (var item in yearDemands)
             {
                 var routingOp = routingOps.Where(x => x.RoutingCode == item.SAPItemNumber).ToList();
+                //组装标准工时
                 var Assembly = routingOp.Where(x => x.Descr == "组装").FirstOrDefault();
+                //热封标准工时
                 var HeatSealing = routingOp.Where(x => x.Descr == "热封").FirstOrDefault();
+                //包装标准工时
                 var Packaging = routingOp.Where(x => x.Descr == "包装").FirstOrDefault();
                 var prodLine = prodLines.Where(x => x.Part == item.SAPItemNumber).OrderBy(x => x.Sequence).FirstOrDefault();
                 //不同库位库存数量
                 var locationList = locations.Where(x => x.ItemNum == item.SAPItemNumber).ToList();
+                //平台数据
                 var platformInvs = platformInvList.Where(x => x.SAPItemNumber == item.SAPItemNumber).ToList();
-                var QtySum = yearDemands.Where(x => x.SAPItemNumber == item.SAPItemNumber).ToList();
+                //销售预测 对应 Excel中公式 AVERAGE 如果预测为0不参与计算排产批量
+                var QtySum = yearDemands.Where(x => x.SAPItemNumber == item.SAPItemNumber && x.Qty > 0).ToList();
                 //排产批量:(AVG(1 - 12月销售预测)/ 100 )=(0.45 = 1 小数向上取整)  *100 = 100
                 var pcpl = Math.Ceiling(QtySum.Sum(p => p.Qty) / QtySum.Count()) * 100;
-                //库存合计 + 在制+已发货
-                var locationSum = (locationList.Count == 0 ? 0 : locationList.Sum(x => x.QtyOnHand)) + (platformInvs.Count == 0 ? 0 : platformInvs.Sum(x => x.InventoryQuantity));
-                //if (annualProductionOutlines.Count > 0)
-                //{
+                //库存合计 + 在制+已发货 + 灭菌中 TODO: 灭菌中取值待确定
+                var ship = shipList.Where(x => x.ContainerItem == item.SAPItemNumber).ToList();
+                var locationSum = (locationList.Count == 0 ? 0 : locationList.Sum(x => x.QtyOnHand)) + (platformInvs.Count == 0 ? 0 : platformInvs.Sum(x => x.InventoryQuantity)) + (ship.Count == 0 ? 0 : ship.Sum(x => x.RealQty)) + InProductionQty + 0;
                 //前面N个月的生产数量
                 var frontQtySum = annualProductionOutlines.Sum(x => x.Qty);
-                var num = (locationSum + frontQtySum) - frontYearDemand.Sum(m => m.Qty) - item.Qty / 2;
+                //生产数量:3月为例子,if((库存合计和前2月生产数量)-(前2个月销售预测数据+安全库存)-当月销售预测数据 / 2 < 0)
+                // { 排产批量 * ((-(库存合计+前2个月生产数量)) +  (安全库存+前2个月销售预测) + 当月销售预测 / 2 ) / 排产批量 ) } else {0}
+                decimal ProduceQty = 0.00m;
+                //判断库存是否满足需要,满足则不用生产
+                var num = (locationSum.Value + frontQtySum) - frontYearDemand.Sum(m => m.Qty) + 0 - item.Qty / 2;
                 if (num < 0)
                 {
-                    num = pcpl * Math.Ceiling((-(locationSum + frontQtySum)) + frontYearDemand.Sum(m => m.Qty) + item.Qty / 2);
+                    ProduceQty = pcpl * Math.Ceiling((-(locationSum.Value + frontQtySum)) + (frontYearDemand.Sum(m => m.Qty) + 0) + item.Qty / 2);
                 }
-                // }
-                //生产数量:3月为例子,(库存和前2月生产数量)-(前2个月销售预测数据)-当月销售预测数据 / 2 < 0  else 排产批量 *((-库存合计数量 + 前2个月销售预测数量 + 当月销售预测数量 / 2)/ 批量排产)
+                else
+                {
+                    ProduceQty = 0;
+                }
+
                 //生成年度生产大纲
                 AnnualProductionOutline annualProductionOutline = new AnnualProductionOutline();
-                //TODO:取值
                 annualProductionOutline.Year = item.Year;
                 annualProductionOutline.Area = item.Area;
                 annualProductionOutline.ProdLine = item.ProdLine;
@@ -166,12 +227,12 @@ namespace Business.SaleForecastManagement
                 annualProductionOutline.Model = item.Model;
                 annualProductionOutline.Languages = item.Languages;
                 annualProductionOutline.PlanMonth = item.PlanMonth;
-                annualProductionOutline.Qty = num;
+                annualProductionOutline.Qty = ProduceQty;
                 annualProductionOutline.StandardHours = (Assembly == null ? 0 : Assembly.RunTime) + (HeatSealing == null ? 0 : HeatSealing.RunTime) + (Packaging == null ? 0 : Packaging.RunTime);
                 //组装热封包装工时乘以数量 =单月工时
-                annualProductionOutline.AssemblyHours = Assembly == null ? 0 : Assembly.RunTime * num;
-                annualProductionOutline.HeatSealingHours = HeatSealing == null ? 0 : HeatSealing.RunTime * num;
-                annualProductionOutline.PackagingHours = Packaging == null ? 0 : Packaging.RunTime * num;
+                annualProductionOutline.AssemblyHours = Assembly == null ? 0 : Assembly.RunTime * ProduceQty;
+                annualProductionOutline.HeatSealingHours = HeatSealing == null ? 0 : HeatSealing.RunTime * ProduceQty;
+                annualProductionOutline.PackagingHours = Packaging == null ? 0 : Packaging.RunTime * ProduceQty;
                 annualProductionOutline.Totalhours = annualProductionOutline.AssemblyHours + annualProductionOutline.HeatSealingHours + annualProductionOutline.Totalhours;
                 annualProductionOutline.OrderNum = item.OrderNum;
                 annualProductionOutlines.Add(annualProductionOutline);
@@ -182,17 +243,66 @@ namespace Business.SaleForecastManagement
             {
                 try
                 {
-                    await _annualProductionOutline.InsertManyAsync(annualProductionOutlines);
+                    //await _annualProductionOutline.InsertManyAsync(annualProductionOutlines);
+                    await unitOfWork.CompleteAsync();
+                }
+                catch (Exception e)
+                {
+                    unitOfWork.Dispose();
+                    new NLogHelper("AnnualProductionOutlineAppService").WriteLog("SaveAnnualProductionOutline", "【" + input.year + "年" + "】年度生成大纲生成失败:" + e.Message, _currentTenant.Id.ToString());
+                    return "NO|" + e.Message;
+                };
+            }
+            return "OK";
+        }
+
+        /// <summary>
+        /// 生成主计划
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public async Task<string> SaveProductionMasterPlan(InputDto input)
+        {
+            //计算当前年月的N0,N+1,N+2
+            List<string> planMons = new List<string>();
+            string strN0 = input.year.ToString() + "-" + input.month.ToString("00");
+            planMons.Add(strN0);
+            int newYear = input.month == 12 ? input.year + 1 : input.year;
+            int newMonth = input.month == 12 ? 1 : input.month + 1;
+            string strN1 = newYear.ToString() + "-" + newMonth.ToString("00");
+            planMons.Add(strN1);
+            newYear = newMonth == 12 ? newYear + 1 : newYear;
+            newMonth = newMonth == 12 ? 1 : newMonth + 1;
+            string strN2 = newYear.ToString() + "-" + newMonth.ToString("00");
+            planMons.Add(strN2);
+            //N0,N+1,N+2月度发货计划
+            var productionMasterPlan = _productionMasterPlan.GetListAsync(x => x.Year == input.year && !x.IsDeleted && x.tenant_id == input.tenant_id && x.company_id == input.company_id && x.factory_id == input.factory_id && planMons.Contains(x.PlanMonth)).Result.OrderBy(p => p.OrderNum).ThenBy(o => o.PlanMonth).ToList();
+            foreach (var item in productionMasterPlan)
+            {
+
+            }
+
+
+
+
+
+            //保存数据
+            using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
+            {
+                try
+                {
+                    //await _annualProductionOutline.InsertManyAsync(annualProductionOutlines);
                     await unitOfWork.CompleteAsync();
                 }
                 catch (Exception e)
                 {
                     unitOfWork.Dispose();
-                    new NLogHelper("AnnualProductionOutlineAppService").WriteLog("SaveAnnualProductionOutline", "【" + input.year + "年" + "】月度需求预测更新失败:" + e.Message, _currentTenant.Id.ToString());
+                    new NLogHelper("AnnualProductionOutlineAppService").WriteLog("SaveProductionMasterPlan", "【" + input.year + "年" + "】主计划生成失败:" + e.Message, _currentTenant.Id.ToString());
                     return "NO|" + e.Message;
                 };
             }
             return "OK";
+
         }
     }
 }

+ 112 - 112
MicroServices/Business/Business.Application/SystemJobManagement/SystemJobAppService.cs

@@ -590,118 +590,118 @@ namespace Business.SystemJobManagement
         ////    }
         ////}
 
-        ////同步物料
-        //public void SyncItemMaster()
-        //{
-        //    bool isAll = true;//是否同步所有物料
-        //    var ic_itemList = _mysql_ic_item.GetListAsync(a => a.tenant_id == 1000 && a.factory_id == 1001).Result;
-        //    List<ItemMaster> custList = new List<ItemMaster>();
-        //    if (isAll)
-        //    {
-        //        custList = _itemMaster.Select(a => a.IsActive && a.Domain == "1001");
-        //    }
-        //    else
-        //    {
-        //        //格努产品编码同步子级物料
-        //        List<string> childItems = GetChildItemNumber("", new List<string>());
-        //        custList = _itemMaster.Select(a => a.IsActive && a.Domain == "1001" && childItems.Distinct().Contains(a.ItemNum));
-        //    }
-        //    List<ic_item> ItemsAdd = new List<ic_item>();
-        //    List<srm_purchase> srm_purchaseAdd = new List<srm_purchase>();
-        //    if (custList != null && custList.Count > 0)
-        //    {
-        //        for (int i = 0; i < custList.Count; i++)
-        //        {
-        //            var ic_item = ic_itemList.Find(x => x.number == custList[i].ItemNum && x.tenant_id == 1000 && x.factory_id == 1001);
-        //            if (ic_item == null)
-        //            {
-        //                long itemId = help.NextId();
-        //                ItemsAdd.Add(new ic_item(itemId)
-        //                {
-        //                    number = custList[i].ItemNum, //物料编码
-        //                    name = custList[i].Descr, //物料名称
-        //                    model = custList[i].Descr1,//规格型号
-        //                    fversion = "",//版本号
-        //                    //ext.FErpClsID == "配置类" ? 0 : ext.FErpClsID == "自制" ? 1 : ext.FErpClsID == "委外" ? 2 : ext.FErpClsID == "外购" ? 3 : ext.FErpClsID == "虚拟" ? 4 : ext.FErpClsID == "费用" ? 5 : ext.FErpClsID == "服务" ? 6 : -1;
-        //                    //erp_cls = custList[i].PurMfg == "P" ? 3 : 1,//物料属性
-        //                    erp_cls = custList[i].ItemNum == "1.SD1.D.0056-F" || custList[i].ItemNum == "1.ZC1.D.0001" || custList[i].ItemNum == "1.BW1.D.0030" ? 1 : 3,
-        //                    //erp_cls_name = custList[i].PurMfg == "P" ? "外购" : "自制",//物料属性名称
-        //                    erp_cls_name = custList[i].ItemNum == "1.SD1.D.0056-F" || custList[i].ItemNum == "1.ZC1.D.0001" || custList[i].ItemNum == "1.BW1.D.0030" ? "自制" : "外购",
-        //                    unit = custList[i].UM,//单位
-        //                    item_level = 0,//物料等级
-        //                    source = "",//来源
-        //                    iskeyitem = custList[i].IsMainMas ? 1 : 0,//是否关键件
-        //                    net_weight = (decimal)custList[i].NetWeight,//净重
-        //                    maund = custList[i].NetWeightUM,//重量单位
-        //                    length = (decimal)custList[i].Length,//长度
-        //                    width = (decimal)custList[i].Width,//宽度
-        //                    height = (decimal)custList[i].Height,//高度
-        //                    allowpur = custList[i].PurMfg == "P" ? 1 : 0,//允许采购
-        //                    allowsale = 1,//允许销售
-        //                    allowmanu = custList[i].PurMfg == "L" ? 1 : 0,//允许生产
-        //                    allowout = 1,//允许委外
-        //                    allowbatch = custList[i].LotSerialControl ? 1 : 0,//批号管理
-        //                    allowserial = custList[i].LotSerialControl ? 1 : 0,//序列号管理
-        //                    photo = "",//图片
-        //                    enable_warning = 1,//启用预警
-        //                    factory_id = 1001,
-        //                    tenant_id = 1000,
-        //                    IsDeleted = false,
-
-
-        //                    batch_manager = custList[i].LotSerialControl ? 1 : 0,
-        //                    minorderqty = custList[i].MinOrd,
-        //                    minpackqty = 1,
-        //                    ordissu_days = 1,
-        //                    transportation_leadtime = 3,
-        //                    stock_leadtime = 1,
-        //                    production_leadtime = 4,
-        //                    order_leadtime = 4,
-
-        //                    fix_leadtime = 1,
-        //                    order_inter_val = 1,
-        //                    lead_time = 1,
-        //                    bat_change_economy = 1,
-        //                    total_tqq = 1,
-        //                    order_point = 1,
-        //                    secinv = 1,
-        //                    secinv_ratio = 1,
-        //                    self_inspection_date = 1,
-        //                    Warehousing_date = 1,
-        //                    Shipping_date = 3,
-        //                });
-        //                srm_purchaseAdd.Add(new srm_purchase(help.NextId())
-        //                {
-        //                    icitem_id = itemId,
-        //                    icitem_name = custList[i].Descr,
-        //                    sourcelist_number = "HYQD12064",
-        //                    supplier_id = 10101000051,
-        //                    supplier_number = "",
-        //                    supplier_name = "广州市伟正金属构件有限公司",
-        //                    purchgroup = "",
-        //                    purcher = "",
-        //                    purchase_unit = "",
-        //                    netpurchase_price = 1,
-        //                    taxrate = 0.13m,
-        //                    currency_type = 1,
-        //                    order_rector_name = "",
-        //                    order_rector_num = "",
-        //                    factory_code = "",
-        //                    order_dept = "",
-        //                    order_price = 13,
-        //                    sale_price = 130,
-        //                    qty_min = 10,
-        //                    batch_append_qty = 10,
-        //                    factory_id = 1001,
-        //                    tenant_id = 1000,
-        //                    IsDeleted = false
-        //                });
-        //            }
-        //        }
-        //    }
-        //    _businessDbContext.BulkInsert(ItemsAdd);
-        //    _businessDbContext.BulkInsert(srm_purchaseAdd);
-        //}
+        /*//同步物料
+        public void SyncItemMaster()
+        {
+            bool isAll = true;//是否同步所有物料
+            var ic_itemList = _mysql_ic_item.GetListAsync(a => a.tenant_id == 1000 && a.factory_id == 1001).Result;
+            List<ItemMaster> custList = new List<ItemMaster>();
+            if (isAll)
+            {
+                custList = _itemMaster.Select(a => a.IsActive && a.Domain == "1001");
+            }
+            else
+            {
+                //格努产品编码同步子级物料
+                List<string> childItems = GetChildItemNumber("", new List<string>());
+                custList = _itemMaster.Select(a => a.IsActive && a.Domain == "1001" && childItems.Distinct().Contains(a.ItemNum));
+            }
+            List<ic_item> ItemsAdd = new List<ic_item>();
+            List<srm_purchase> srm_purchaseAdd = new List<srm_purchase>();
+            if (custList != null && custList.Count > 0)
+            {
+                for (int i = 0; i < custList.Count; i++)
+                {
+                    var ic_item = ic_itemList.Find(x => x.number == custList[i].ItemNum && x.tenant_id == 1000 && x.factory_id == 1001);
+                    if (ic_item == null)
+                    {
+                        long itemId = help.NextId();
+                        ItemsAdd.Add(new ic_item(itemId)
+                        {
+                            number = custList[i].ItemNum, //物料编码
+                            name = custList[i].Descr, //物料名称
+                            model = custList[i].Descr1,//规格型号
+                            fversion = "",//版本号
+                            //ext.FErpClsID == "配置类" ? 0 : ext.FErpClsID == "自制" ? 1 : ext.FErpClsID == "委外" ? 2 : ext.FErpClsID == "外购" ? 3 : ext.FErpClsID == "虚拟" ? 4 : ext.FErpClsID == "费用" ? 5 : ext.FErpClsID == "服务" ? 6 : -1;
+                            //erp_cls = custList[i].PurMfg == "P" ? 3 : 1,//物料属性
+                            erp_cls = custList[i].ItemNum == "1.SD1.D.0056-F" || custList[i].ItemNum == "1.ZC1.D.0001" || custList[i].ItemNum == "1.BW1.D.0030" ? 1 : 3,
+                            //erp_cls_name = custList[i].PurMfg == "P" ? "外购" : "自制",//物料属性名称
+                            erp_cls_name = custList[i].ItemNum == "1.SD1.D.0056-F" || custList[i].ItemNum == "1.ZC1.D.0001" || custList[i].ItemNum == "1.BW1.D.0030" ? "自制" : "外购",
+                            unit = custList[i].UM,//单位
+                            item_level = 0,//物料等级
+                            source = "",//来源
+                            iskeyitem = custList[i].IsMainMas ? 1 : 0,//是否关键件
+                            net_weight = (decimal)custList[i].NetWeight,//净重
+                            maund = custList[i].NetWeightUM,//重量单位
+                            length = (decimal)custList[i].Length,//长度
+                            width = (decimal)custList[i].Width,//宽度
+                            height = (decimal)custList[i].Height,//高度
+                            allowpur = custList[i].PurMfg == "P" ? 1 : 0,//允许采购
+                            allowsale = 1,//允许销售
+                            allowmanu = custList[i].PurMfg == "L" ? 1 : 0,//允许生产
+                            allowout = 1,//允许委外
+                            allowbatch = custList[i].LotSerialControl ? 1 : 0,//批号管理
+                            allowserial = custList[i].LotSerialControl ? 1 : 0,//序列号管理
+                            photo = "",//图片
+                            enable_warning = 1,//启用预警
+                            factory_id = 1001,
+                            tenant_id = 1000,
+                            IsDeleted = false,
+                            clean_leadtime = custList[i].MFGMTTR,
+                            is_clean= custList[i].IssuePolicy ? 1 : 0,
+                            batch_manager = custList[i].LotSerialControl ? 1 : 0,
+                            minorderqty = custList[i].MinOrd,
+                            minpackqty = 1,
+                            ordissu_days = 1,
+                            transportation_leadtime = 3,
+                            stock_leadtime = 1,
+                            production_leadtime = 4,
+                            order_leadtime = 4,
+
+                            fix_leadtime = 1,
+                            order_inter_val = 1,
+                            lead_time = 1,
+                            bat_change_economy = 1,
+                            total_tqq = 1,
+                            order_point = 1,
+                            secinv = 1,
+                            secinv_ratio = 1,
+                            self_inspection_date = 1,
+                            Warehousing_date = 1,
+                            Shipping_date = 3,
+                        });
+                        srm_purchaseAdd.Add(new srm_purchase(help.NextId())
+                        {
+                            icitem_id = itemId,
+                            icitem_name = custList[i].Descr,
+                            sourcelist_number = "HYQD12064",
+                            supplier_id = 10101000051,
+                            supplier_number = "",
+                            supplier_name = "广州市伟正金属构件有限公司",
+                            purchgroup = "",
+                            purcher = "",
+                            purchase_unit = "",
+                            netpurchase_price = 1,
+                            taxrate = 0.13m,
+                            currency_type = 1,
+                            order_rector_name = "",
+                            order_rector_num = "",
+                            factory_code = "",
+                            order_dept = "",
+                            order_price = 13,
+                            sale_price = 130,
+                            qty_min = 10,
+                            batch_append_qty = 10,
+                            factory_id = 1001,
+                            tenant_id = 1000,
+                            IsDeleted = false
+                        });
+                    }
+                }
+            }
+            _businessDbContext.BulkInsert(ItemsAdd);
+            _businessDbContext.BulkInsert(srm_purchaseAdd);
+        }*/
 
         //public void SyncBom()
         //{

+ 9 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/ItemMaster.cs

@@ -71,7 +71,16 @@ namespace Business.Domain
         public string DefaultShelf { get; set; }
         public decimal? MaxOrd { get; set; }
         public decimal? MinOrd { get; set; }
+        /// <summary>
+        /// 前处理天数
+        /// </summary>
         public decimal MFGMTTR { get; set; }
+        /// <summary>
+        /// 是否前处理
+        /// </summary>
+        [Comment("是否前处理")]
+        public bool IssuePolicy { get; set; }
+
         /// <summary>
         /// 是否有效:1-有效;0-无效
         /// </summary>

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/MES/IC/NbrMaster.cs

@@ -147,5 +147,11 @@ namespace Business.Domain
         /// </summary>
         [Comment("修改人")]
         public string UpdateUser { get; set; }
+
+        /// <summary>
+        /// 前处理领料单 =PrevProcess
+        /// </summary>
+        [Comment("前处理领料单")]
+        public string TransType { get; set; }
     }
 }

+ 6 - 0
MicroServices/Business/Business.Domain/StructuredDB/Production/WorkOrdRouting.cs

@@ -80,6 +80,12 @@ namespace Business.Domain
         /// </summary>
         [Comment("订单数量")]
         public decimal? QtyOrded { get; set; }
+        /// <summary>
+        /// 报工数量
+        /// </summary>
+        [Comment("报工数量")]
+        public decimal? QtyComplete { get; set; }
+        
 
         /// <summary>
         /// 工序清场时长(小时)

+ 9 - 0
MicroServices/Business/Business.HttpApi/Controllers/AnnualProductionOutlineController.cs

@@ -22,6 +22,15 @@ namespace Business.Controllers
         /// 年度生产大纲
         /// </summary>
         private readonly IAnnualProductionOutlineAppService _IAnnualProductionOutlineAppService;
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="MonthlyCapacityLoadAppService"></param>
+        public AnnualProductionOutlineController(IAnnualProductionOutlineAppService MonthlyCapacityLoadAppService)
+        {
+            _IAnnualProductionOutlineAppService = MonthlyCapacityLoadAppService;
+        }
         /// <summary>
         /// 月度需求分析
         /// </summary>

Some files were not shown because too many files changed in this diff