Эх сурвалжийг харах

特殊工单实现逻辑处理。

tangdi 2 жил өмнө
parent
commit
402c3e290a

+ 23 - 37
MicroServices/Business/Business.Application/ReplenishmentManagement/ReplenishmentAppService.cs

@@ -2477,7 +2477,6 @@ namespace Business.Replenishment
                 workOrd.WorkOrd = item.morder_no;
                 workOrd.ItemNum = item.product_code;//物料编码
                 workOrd.QtyOrded = item.need_number.GetValueOrDefault();
-                workOrd.RoutingCode = item.product_code;
                 workOrd.Period = 1;
                 workOrd.Priority = item.urgent;
                 workOrd.Status = "p";
@@ -3102,6 +3101,7 @@ namespace Business.Replenishment
                     if (list.Any())
                         rtn.srm_pr_list = _CalcBomViewAppService.SRMPRDtoList;
                 }
+                string seqSql = "";
                 if (prmainlist.Any())
                 {
                     var nbrlistDto = _serialNumberAppService.GetBillNo(prmainlist[0].factory_id.ToString(), "PR", prmainlist.Count, "admin", 1);
@@ -3126,6 +3126,22 @@ namespace Business.Replenishment
                             }
                         }
                     }
+                    var prapplyList = prmainlist.Where(s => s.IsRequireGoods != 1).ToList();
+                    if (prapplyList.Any())
+                    {
+                        //请购单插入事务
+                        var rstSeqId = _serialNumberAppService.GetSeqIdList(prapplyList[0].factory_id.ToString(), 1, 1);
+                        long seqId = 0;
+                        if (long.TryParse(rstSeqId, out seqId))
+                        {
+                            prapplyList.ForEach(p =>
+                            {
+                                seqSql += "insert QadTracking(Ufld1,Domain,SeqID,TransType,Subject,[Order],Int1,CreateTime,CreateUser,UpdateTime,UpdateUser) values('C','" + p.factory_id.ToString() +
+                                    "'," + seqId.ToString() + ",'nbr-pr-mes','请购单','" + p.pr_billno + "'," + p.Id.ToString() + ",getdate(),'',getdate(),'');";
+                                seqId++;
+                            });
+                        }
+                    }
                 }
 
                 //获取工单数据
@@ -3140,38 +3156,6 @@ namespace Business.Replenishment
                     }
 
                 });
-               /* //优先级排序
-                workOrdMasters = workOrdMasters.OrderBy(s => s.OrdDate).ToList();
-                //排产
-                //await _productionScheduleAppService.DoProductSchedule(workOrdMasters, param.factoryId.ToString());
-
-                foreach (var wod in workOrdMasters)
-                {
-                    var morder = mo_Mes_Morders.Find(s => s.morder_no == wod.WorkOrd);
-                    morder.moentry_sys_stime = wod.OrdDate;
-                    morder.moentry_sys_etime = wod.DueDate;
-
-                    *//*var exa = rtn.examines.Find(s => s.morder_no == wod.WorkOrd);
-                    exa.latest_times = morder.moentry_sys_etime.GetValueOrDefault().Date.AddDays(1);
-                    //根据排产后得日期,反推PR。
-                    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());
-                    wkordPrList.ForEach(pr =>
-                    {
-                        var ts = pr.pr_parrive_date - pr.pr_psend_date;
-                        //var icitem = icitemlist.Find(s => s.mysql_id == pr.icitem_id);
-                        //var bce = exa.BomChildExamineList.Find(s => s.item_id == pr.icitem_id && s.num == pr.num);
-                        pr.pr_sarrive_date = morder.moentry_sys_stime.Value.AddDays((double)(0 - maxTime - 1));//到货还需要向前推 物料的预处理时间。到货日期必须提前一天到
-                        pr.pr_ssend_date = pr.pr_sarrive_date.GetValueOrDefault().AddDays(0 - ts.Value.Days);
-                        if (pr.pr_ssend_date < DateTime.Now.Date.AddDays(1))
-                        {
-                            pr.pr_ssend_date = DateTime.Now.Date.AddDays(1);
-                        }
-                    });*//*
-                }*/
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
                     try
@@ -3180,10 +3164,11 @@ namespace Business.Replenishment
                         if (prmainlist.Any())
                         {
                             var pr_mainlist = ObjectMapper.Map<List<mo_srm_pr_main>, List<srm_pr_main>>(prmainlist);
-
-
-
                             _businessDbContext.BulkInsert(pr_mainlist);
+                            if (!string.IsNullOrEmpty(seqSql))
+                            {
+                                _businessBangDbContext.Database.ExecuteSqlRaw(seqSql);
+                            }
                         }
                         if (_CalcBomViewAppService.newStockOccList.Any())
                         {
@@ -3194,7 +3179,8 @@ namespace Business.Replenishment
                         if (_CalcBomViewAppService.srm_Po_OccupiesInsert.Any())
                         {
                             _CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
-                            await _srm_po_occupy.InsertManyAsync(_CalcBomViewAppService.srm_Po_OccupiesInsert);
+                            var srmpooccupyInsert = ObjectMapper.Map<List<mo_srm_po_occupy>, List<srm_po_occupy>>(_CalcBomViewAppService.srm_Po_OccupiesInsert);
+                            _businessDbContext.BulkInsert(srmpooccupyInsert);
                         }
                         await unitOfWork.CompleteAsync();
                     }

+ 180 - 164
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -728,96 +728,101 @@ namespace Business.ResourceExamineManagement
                     else
                     {
                         item.lack_qty -= moo_qty;
-                        //生成主工单
-                        GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                        List<string> tsWork = new List<string> { "试制工单", "TCN工单", "返工工单" };
+                        //如果是特殊工单,只判断自制件的库存和在制,而不生成自制
+                        if (!tsWork.Contains(mes_morder.morder_type))
                         {
-                            seorderentry = sentrys,
-                            seorder = seorder,
-                            ic_Item = ic_item,
-                            BomNumber = item.bom_number,
-                            version = item.version,
-                            number = item.item_number,
-                            Quantity = item.lack_qty,
-                            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);
+                            GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                            {
+                                seorderentry = sentrys,
+                                seorder = seorder,
+                                ic_Item = ic_item,
+                                BomNumber = item.bom_number,
+                                version = item.version,
+                                number = item.item_number,
+                                Quantity = item.lack_qty,
+                                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);
 
-                        ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                        {
-                            ItemNum = item.item_number,
-                            PlanStart = plan_date.GetValueOrDefault(),
-                            QtyOrd = item.lack_qty,
-                            Domain = param.factoryId.ToString()
-                        };
-                        int make = _productExamineAppService.ProductTime(prodExamine);
-                        if (make < item.PurLT)
-                        {
-                            //如果生产时长小于供应提前期,则按供应提前期算
-                            make = item.PurLT;
-                        }
-                        item.make_qty = item.lack_qty;
-                        if (mes_MorderDto != null)
-                        {
-                            //主工单最后计算满足日期
-                            var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
-                            if (mes_Morders != null)
+                            ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                             {
-                                var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, item.lack_qty, bangid);
-                                mooccupyAllList.Add(generateMooccupy);
-                                mooccupyAllInsertList.Add(generateMooccupy);
-                                
-                                //子工单生成的检查明细,还是挂接到主工单上。
-                                mes_Morders.moentry_sys_etime = plan_date.GetValueOrDefault().AddDays(-1);
-                                mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
-                                item.make_list = new List<moorder>();
-                                mes_MorderDto.mes_Morders.ForEach(me =>
-                                {
-                                    moorder mo = new moorder();
-                                    mo.Id = me.Id;
-                                    mo.moentry_stime = me.moentry_stime;
-                                    mo.moentry_etime = me.moentry_etime;
-                                    mo.moentry_wrkcname = me.moentry_wrkcname;
-                                    mo.moentry_sys_stime = me.moentry_sys_stime;
-                                    mo.moentry_sys_etime = me.moentry_sys_etime;
-                                    mo.moentry_prdname = me.moentry_prdname;
-                                    mo.morder_need_time = me.morder_need_time;
-                                    mo.morder_no = me.morder_no;
-                                    mo.morder_production_number = me.morder_production_number;
-                                    mo.need_number = me.need_number;
-                                    mo.reality_end_time = me.reality_end_time;
-                                    mo.reality_start_time = me.reality_start_time;
-                                    item.make_list.Add(mo);
-                                });
-                                //批量保存 后期考虑子工单
-                                mordersList.AddRange(mes_MorderDto.mes_Morders);
-                                mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
-                                moentriesList.AddRange(mes_MorderDto.mes_Moentries);
-                                moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
-
-                                mes_Morders.mat_start_date = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                                                                                                                  //先计算末级数据的齐套时间。
-                                if (cilList.Count > 0)
+                                ItemNum = item.item_number,
+                                PlanStart = plan_date.GetValueOrDefault(),
+                                QtyOrd = item.lack_qty,
+                                Domain = param.factoryId.ToString()
+                            };
+                            int make = _productExamineAppService.ProductTime(prodExamine);
+                            if (make < item.PurLT)
+                            {
+                                //如果生产时长小于供应提前期,则按供应提前期算
+                                make = item.PurLT;
+                            }
+                            item.make_qty = item.lack_qty;
+                            if (mes_MorderDto != null)
+                            {
+                                //主工单最后计算满足日期
+                                var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
+                                if (mes_Morders != null)
                                 {
-                                    CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
-                                    mes_Morders.mat_start_date = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1).Date;
-                                    mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
-                                    if (item.kitting_time < mes_Morders.mat_end_date)
+                                    var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, item.lack_qty, bangid);
+                                    mooccupyAllList.Add(generateMooccupy);
+                                    mooccupyAllInsertList.Add(generateMooccupy);
+
+                                    //子工单生成的检查明细,还是挂接到主工单上。
+                                    mes_Morders.moentry_sys_etime = plan_date.GetValueOrDefault().AddDays(-1);
+                                    mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
+                                    item.make_list = new List<moorder>();
+                                    mes_MorderDto.mes_Morders.ForEach(me =>
                                     {
-                                        item.kitting_time = mes_Morders.mat_end_date;
-                                    }
-                                    if (IsStraight)
+                                        moorder mo = new moorder();
+                                        mo.Id = me.Id;
+                                        mo.moentry_stime = me.moentry_stime;
+                                        mo.moentry_etime = me.moentry_etime;
+                                        mo.moentry_wrkcname = me.moentry_wrkcname;
+                                        mo.moentry_sys_stime = me.moentry_sys_stime;
+                                        mo.moentry_sys_etime = me.moentry_sys_etime;
+                                        mo.moentry_prdname = me.moentry_prdname;
+                                        mo.morder_need_time = me.morder_need_time;
+                                        mo.morder_no = me.morder_no;
+                                        mo.morder_production_number = me.morder_production_number;
+                                        mo.need_number = me.need_number;
+                                        mo.reality_end_time = me.reality_end_time;
+                                        mo.reality_start_time = me.reality_start_time;
+                                        item.make_list.Add(mo);
+                                    });
+                                    //批量保存 后期考虑子工单
+                                    mordersList.AddRange(mes_MorderDto.mes_Morders);
+                                    mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
+                                    moentriesList.AddRange(mes_MorderDto.mes_Moentries);
+                                    moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
+
+                                    mes_Morders.mat_start_date = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                                                                                                       //先计算末级数据的齐套时间。
+                                    if (cilList.Count > 0)
                                     {
-                                        //正排
-                                        mes_Morders.moentry_sys_stime = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                                        mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make);
+                                        CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
+                                        mes_Morders.mat_start_date = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1).Date;
+                                        mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
+                                        if (item.kitting_time < mes_Morders.mat_end_date)
+                                        {
+                                            item.kitting_time = mes_Morders.mat_end_date;
+                                        }
+                                        if (IsStraight)
+                                        {
+                                            //正排
+                                            mes_Morders.moentry_sys_stime = item.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                            mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make);
+                                        }
                                     }
                                 }
                             }
                         }
+                        
                     }
                 }
                 else if (item.erp_cls == 3)
@@ -1267,93 +1272,98 @@ namespace Business.ResourceExamineManagement
                             }
                             else {
                                 sct.lack_qty -= moo_qty;
-                                //TODO:需要按标准UPH来计算生产时长
-                                //生成主工单
-                                GenerateMorderDto generateMorderDto = new GenerateMorderDto()
-                                {
-                                    seorderentry = sentrys,
-                                    seorder = seorder,
-                                    ic_Item = ic_item,
-                                    BomNumber = sct.bom_number,
-                                    version = sct.version,
-                                    number = sct.item_number,
-                                    Quantity = sct.lack_qty,
-                                    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);
-                                ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                                List<string> tsWork = new List<string> { "试制工单", "TCN工单", "返工工单" };
+                                //如果是特殊工单,只判断自制件的库存和在制,而不生成自制
+                                if (!tsWork.Contains(mes_morder.morder_type))
                                 {
-                                    ItemNum = sct.item_number,
-                                    PlanStart = dateTime,
-                                    QtyOrd = sct.lack_qty,
-                                    Domain = param.factoryId.ToString()
-                                };
-                                int make = _productExamineAppService.ProductTime(prodExamine);
-                                if (make < sct.PurLT)
-                                {
-                                    //如果生产时长小于供应提前期,则按供应提前期算
-                                    make = sct.PurLT;
-                                }
-                                sct.make_qty = sct.lack_qty;
-                                if (mes_MorderDto != null)
-                                {
-                                    //主工单最后计算满足日期
-                                    var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
-                                    if (mes_Morders != null)
+                                    //TODO:需要按标准UPH来计算生产时长
+                                    //生成主工单
+                                    GenerateMorderDto generateMorderDto = new GenerateMorderDto()
                                     {
-                                        var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, sct.lack_qty, bangid);
-                                        mooccupyAllList.Add(generateMooccupy);
-                                        mooccupyAllInsertList.Add(generateMooccupy);
-
-                                        //子工单生成的检查明细,还是挂接到主工单上。
-                                        //mes_morder = ObjectMapper.Map<mo_mes_morder, mes_morder>(mes_Morders);
-                                        mes_Morders.moentry_sys_etime = dateTime.AddDays(-1);
-                                        mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
-                                        sct.make_list = new List<moorder>();
-                                        mes_MorderDto.mes_Morders.ForEach(me =>
-                                        {
-                                            moorder mo = new moorder();
-                                            mo.Id = me.Id;
-                                            mo.moentry_stime = me.moentry_stime;
-                                            mo.moentry_etime = me.moentry_etime;
-                                            mo.moentry_wrkcname = me.moentry_wrkcname;
-                                            mo.moentry_sys_stime = me.moentry_sys_stime;
-                                            mo.moentry_sys_etime = me.moentry_sys_etime;
-                                            mo.moentry_prdname = me.moentry_prdname;
-                                            mo.morder_need_time = me.morder_need_time;
-                                            mo.morder_no = me.morder_no;
-                                            mo.morder_production_number = me.morder_production_number;
-                                            mo.need_number = me.need_number;
-                                            mo.reality_end_time = me.reality_end_time;
-                                            mo.reality_start_time = me.reality_start_time;
-                                            sct.make_list.Add(mo);
-                                        });
-                                        //批量保存 后期考虑子工单
-                                        mordersList.AddRange(mes_MorderDto.mes_Morders);
-                                        mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
-                                        moentriesList.AddRange(mes_MorderDto.mes_Moentries);
-                                        moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
-
-                                        mes_Morders.mat_start_date = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                                        //先计算末级数据的齐套时间。
-                                        if (cilList.Count > 0)
+                                        seorderentry = sentrys,
+                                        seorder = seorder,
+                                        ic_Item = ic_item,
+                                        BomNumber = sct.bom_number,
+                                        version = sct.version,
+                                        number = sct.item_number,
+                                        Quantity = sct.lack_qty,
+                                        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);
+                                    ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                                    {
+                                        ItemNum = sct.item_number,
+                                        PlanStart = dateTime,
+                                        QtyOrd = sct.lack_qty,
+                                        Domain = param.factoryId.ToString()
+                                    };
+                                    int make = _productExamineAppService.ProductTime(prodExamine);
+                                    if (make < sct.PurLT)
+                                    {
+                                        //如果生产时长小于供应提前期,则按供应提前期算
+                                        make = sct.PurLT;
+                                    }
+                                    sct.make_qty = sct.lack_qty;
+                                    if (mes_MorderDto != null)
+                                    {
+                                        //主工单最后计算满足日期
+                                        var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
+                                        if (mes_Morders != null)
                                         {
-                                            CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
-                                            mes_Morders.mat_start_date = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1).Date;
-                                            mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
-                                            if (sct.kitting_time < mes_Morders.mat_end_date)
+                                            var generateMooccupy = _morderAppService.GetMooccupies(sentrys, ic_item, mes_Morders, sct.lack_qty, bangid);
+                                            mooccupyAllList.Add(generateMooccupy);
+                                            mooccupyAllInsertList.Add(generateMooccupy);
+
+                                            //子工单生成的检查明细,还是挂接到主工单上。
+                                            //mes_morder = ObjectMapper.Map<mo_mes_morder, mes_morder>(mes_Morders);
+                                            mes_Morders.moentry_sys_etime = dateTime.AddDays(-1);
+                                            mes_Morders.moentry_sys_stime = mes_Morders.moentry_sys_etime.GetValueOrDefault().AddDays(-(make - 1));
+                                            sct.make_list = new List<moorder>();
+                                            mes_MorderDto.mes_Morders.ForEach(me =>
                                             {
-                                                sct.kitting_time = mes_Morders.mat_end_date;
-                                            }
-                                            if (IsStraight)
+                                                moorder mo = new moorder();
+                                                mo.Id = me.Id;
+                                                mo.moentry_stime = me.moentry_stime;
+                                                mo.moentry_etime = me.moentry_etime;
+                                                mo.moentry_wrkcname = me.moentry_wrkcname;
+                                                mo.moentry_sys_stime = me.moentry_sys_stime;
+                                                mo.moentry_sys_etime = me.moentry_sys_etime;
+                                                mo.moentry_prdname = me.moentry_prdname;
+                                                mo.morder_need_time = me.morder_need_time;
+                                                mo.morder_no = me.morder_no;
+                                                mo.morder_production_number = me.morder_production_number;
+                                                mo.need_number = me.need_number;
+                                                mo.reality_end_time = me.reality_end_time;
+                                                mo.reality_start_time = me.reality_start_time;
+                                                sct.make_list.Add(mo);
+                                            });
+                                            //批量保存 后期考虑子工单
+                                            mordersList.AddRange(mes_MorderDto.mes_Morders);
+                                            mordersInsertList.AddRange(mes_MorderDto.mes_Morders);
+                                            moentriesList.AddRange(mes_MorderDto.mes_Moentries);
+                                            moentriesInsertList.AddRange(mes_MorderDto.mes_Moentries);
+
+                                            mes_Morders.mat_start_date = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                                                                                                              //先计算末级数据的齐套时间。
+                                            if (cilList.Count > 0)
                                             {
-                                                //正排
-                                                mes_Morders.moentry_sys_stime = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
-                                                mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make);
+                                                CalcIcitem(cilList, returnlist, bangid, sklist, mes_Morders.moentry_sys_stime, icitemlist, sentrys, childidList);
+                                                mes_Morders.mat_start_date = cilList.Max(s => s.kitting_time).GetValueOrDefault().AddDays(1).Date;
+                                                mes_Morders.mat_end_date = mes_Morders.mat_start_date.GetValueOrDefault().AddDays(make);
+                                                if (sct.kitting_time < mes_Morders.mat_end_date)
+                                                {
+                                                    sct.kitting_time = mes_Morders.mat_end_date;
+                                                }
+                                                if (IsStraight)
+                                                {
+                                                    //正排
+                                                    mes_Morders.moentry_sys_stime = sct.kitting_time.GetValueOrDefault().AddDays(1).Date;//数据齐套完成后隔天开始生产;
+                                                    mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.GetValueOrDefault().AddDays(make);
+                                                }
                                             }
                                         }
                                     }
@@ -1559,8 +1569,13 @@ namespace Business.ResourceExamineManagement
             srm_Pr.pr_purchasename = supplier.supplier_name;//供应商名称
             srm_Pr.pr_purchaser = supplier.order_rector_name;//采购员
             srm_Pr.pr_purchaser_num = supplier.order_rector_num;//采购员工号(采购信息表)
-                                                                 //数量圆整 按最小包装量向上圆整
-            decimal qty = Math.Ceiling(returnlist.lack_qty / (supplier.packaging_qty.GetValueOrDefault() == 0 ? 1 : supplier.packaging_qty.GetValueOrDefault()));
+            decimal qty = 0;
+            //数量圆整 按最小包装量向上圆整
+            if (supplier.packaging_qty.GetValueOrDefault() != 0)
+            {
+                decimal count = Math.Ceiling(returnlist.lack_qty / supplier.packaging_qty.GetValueOrDefault());
+                qty = count * supplier.packaging_qty.GetValueOrDefault();
+            }
             //判断最小起订量
             qty = qty > supplier.qty_min.GetValueOrDefault() ? qty : supplier.qty_min.GetValueOrDefault();
             srm_Pr.pr_rqty = returnlist.lack_qty;//需求数量
@@ -1729,6 +1744,7 @@ namespace Business.ResourceExamineManagement
             _purchaseOrderAppService.mo_Srm_Po_Lists = srm_Po_Lists; //采购明细
             _purchaseOrderAppService.srm_Po_Occupies = srm_Po_Occupies; //采购明细
             _purchaseOrderAppService.srm_Pr_Mains = srm_Pr_Mains;//在途PR
+            _purchaseOrderAppService.mes_morder = mes_morder;//当前工单传递进去。
 
             var occupylist = _purchaseOrderAppService.CheckPurchaseOrder(sentrys, item.item_id, item.lack_qty, plan_date, ic_item_List, bangid);
             if (occupylist.Any())

+ 6 - 1
MicroServices/Business/Business.Application/ResourceExamineManagement/PurchaseOrderAppService.cs

@@ -53,6 +53,7 @@ namespace Business.ResourceExamineManagement
         /// </summary>
         public List<mo_srm_pr_main> srm_Pr_Mains = new List<mo_srm_pr_main>();
 
+        public mes_morder mes_morder = new mes_morder();
         #endregion
         #region 构造函数
         /// <summary>
@@ -128,7 +129,11 @@ namespace Business.ResourceExamineManagement
             //代表PO还未占用完
             if (Quantity > 0)
             {
-                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();
+                var prlist  = srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && toTime < x.pr_sarrive_date && x.pr_sarrive_date < DeliverDate && x.pr_mono != mes_morder.morder_no).OrderByDescending(f => f.pr_sarrive_date).ToList();
+                if (mes_morder != null)
+                {
+                    prlist.AddRange(srm_Pr_Mains.Where(x => x.icitem_id.Value == icitem_id && x.pr_mono == mes_morder.morder_no).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());

+ 45 - 11
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -1649,7 +1649,7 @@ namespace Business.ResourceExamineManagement
                     {
                         prapplyList.ForEach(p =>
                         {
-                            seqSql += "insert QadTracking(Ufld1,Domain,SeqID,TransType,Subject,[Order],Int1,CreateTime,CreateUser,UpdateTime,UpdateUser) values('A','" + p.factory_id.ToString() +
+                            seqSql += "insert QadTracking(Ufld1,Domain,SeqID,TransType,Subject,[Order],Int1,CreateTime,CreateUser,UpdateTime,UpdateUser) values('C','" + p.factory_id.ToString() +
                                 "'," + seqId.ToString() + ",'nbr-pr-mes','请购单','" + p.pr_billno + "'," + p.Id.ToString() + ",getdate(),'',getdate(),'');";
                             seqId++;
                         });
@@ -2406,7 +2406,8 @@ namespace Business.ResourceExamineManagement
             {
                 return "当前任务工厂编号为空,请检查。";
             }
-            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && string.IsNullOrEmpty(x.Typed) == true && x.Status.ToLower() == "p").ToList();
+            List<string> tsWork = new List<string> { "test", "tcn", "rw" };
+            var ordlist = _workOrdMaster.Select(x => x.Domain == domain && (string.IsNullOrEmpty(x.Typed) == true || tsWork.Contains(x.Typed)) && x.Status.ToLower() == "p").ToList();
             List<mes_morder> Mes_Morders = _mysql_mes_morder.GetListAsync(x => ordlist.Select(c=>c.WorkOrd).Contains(x.morder_no) && x.factory_id.ToString() == domain).Result;
 
             /*//先排除锁定期内的工单 //优先级排序
@@ -3120,8 +3121,8 @@ namespace Business.ResourceExamineManagement
 
             //删除同步Mysql后旧数据
             await DeleteMySqlOldData(sentrys);
-            
-            List<mo_ic_bom> boms = _ic_bom.GetListAsync(p => mo_Mes_Morders.Select(m => m.bom_number).Contains(p.bom_number) && p.factory_id == param.factoryId && p.company_id == param.company_id && !p.IsDeleted).Result.ToList();
+            List<string> tsWork = new List<string> { "试制工单", "TCN工单", "返工工单" };
+            List<mo_ic_bom> boms = _ic_bom.GetListAsync(p => mo_Mes_Morders.Where(x=> !tsWork.Contains(x.morder_type)).Select(m => m.bom_number).Contains(p.bom_number) && p.factory_id == param.factoryId && p.company_id == param.company_id && !p.IsDeleted).Result.ToList();
 
             //物料bom
             List<mo_ic_bom> bomlist = new List<mo_ic_bom>();
@@ -3154,6 +3155,10 @@ namespace Business.ResourceExamineManagement
                 pretreatments = _mysql_b_bom_pretreatment.GetListAsync(s => boms.Select(c => c.mysql_id).ToList().Contains(s.sourceid)).Result;
             }
 
+            //增加特殊工单的预处理结果,因为特殊工单是自定义物料清单
+            var specialWork = mo_Mes_Morders.Where(x => tsWork.Contains(x.morder_type)).ToList();
+            pretreatments.AddRange(_mysql_b_bom_pretreatment.GetListAsync(s => specialWork.Select(c => c.Id).ToList().Contains(s.sourceid)).Result);
+
             //数据库快照-同步mysql库数据到mongoDB中
             await DbSnapShot(param.company_id, param.factoryId, bangid, pretreatments);
 
@@ -3198,9 +3203,19 @@ namespace Business.ResourceExamineManagement
                 dtl.prd_code = item.product_code;
 
                 //获取当前物料bom数据
+                List<b_bom_pretreatment> itemPrelist = new List<b_bom_pretreatment>();
                 var childBom = boms.Where(p => p.bom_number == item.bom_number).FirstOrDefault();
-
-                var itemPrelist = pretreatments.Where(s => s.sourceid == childBom.mysql_id).ToList();
+                if (childBom != null)
+                {
+                    itemPrelist = pretreatments.Where(s => s.sourceid == childBom.mysql_id).ToList();
+                }
+                else {
+                    itemPrelist = pretreatments.Where(s => s.sourceid == item.Id).ToList();
+                }
+                /*if (tsWork.Contains(item.morder_type))
+                {
+                    itemPrelist = pretreatments.Where(s => s.sourceid == item.Id).ToList();
+                }*/
                 if (!itemPrelist.Any())
                 {
                     continue;
@@ -3223,7 +3238,7 @@ namespace Business.ResourceExamineManagement
                 _CalcBomViewAppService.CalcView(getBomList, bangid, item.need_number.GetValueOrDefault(), item.moentry_sys_stime, sklist, sentry, icitemlist);
                 
                 //TODO:最晚开始时间
-                var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
+                //var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
                 //物料齐套时间
                 dtl.kitting_times = getBomList.Where(p => p.is_use && p.kitting_time != null).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
                 //替代关系展开list
@@ -3252,6 +3267,7 @@ namespace Business.ResourceExamineManagement
                     if (list.Any())
                         rtn.srm_pr_list = _CalcBomViewAppService.SRMPRDtoList;
                 }
+                string seqSql = "";
                 if (prmainlist.Any())
                 {
                     var nbrlistDto = _serialNumberAppService.GetBillNo(prmainlist[0].factory_id.ToString(), "PR", prmainlist.Count, "admin", 1);
@@ -3276,9 +3292,24 @@ namespace Business.ResourceExamineManagement
                             }
                         }
                     }
+                    var prapplyList = prmainlist.Where(s => s.IsRequireGoods != 1).ToList();
+                    if (prapplyList.Any())
+                    {
+                        //请购单插入事务
+                        var rstSeqId = _serialNumberAppService.GetSeqIdList(prapplyList[0].factory_id.ToString(), 1, 1);
+                        long seqId = 0;
+                        if (long.TryParse(rstSeqId, out seqId))
+                        {
+                            prapplyList.ForEach(p =>
+                            {
+                                seqSql += "insert QadTracking(Ufld1,Domain,SeqID,TransType,Subject,[Order],Int1,CreateTime,CreateUser,UpdateTime,UpdateUser) values('C','" + p.factory_id.ToString() +
+                                    "'," + seqId.ToString() + ",'nbr-pr-mes','请购单','" + p.pr_billno + "'," + p.Id.ToString() + ",getdate(),'',getdate(),'');";
+                                seqId++;
+                            });
+                        }
+                    }
                 }
 
-
                 //获取工单数据
                 var workOrdMasters = _workOrdMaster.Select(p => mo_Mes_Morders.Select(c => c.morder_no).Contains(p.WorkOrd) && p.Domain == param.factoryId.ToString());
                 workOrdMasters.ForEach(s => {
@@ -3288,7 +3319,6 @@ namespace Business.ResourceExamineManagement
                         s.OrdDate = mo.moentry_sys_stime;
                         s.DueDate = mo.moentry_sys_stime;
                     }
-                    
                 });
                 using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
                 {
@@ -3303,6 +3333,10 @@ namespace Business.ResourceExamineManagement
                         {
                             var pr_mainlist = ObjectMapper.Map<List<mo_srm_pr_main>, List<srm_pr_main>>(prmainlist);
                             _businessDbContext.BulkInsert(pr_mainlist);
+                            if (!string.IsNullOrEmpty(seqSql))
+                            {
+                                _businessBangDbContext.Database.ExecuteSqlRaw(seqSql);
+                            }
                         }
                         if (_CalcBomViewAppService.newStockOccList.Any())
                         {
@@ -3313,7 +3347,8 @@ namespace Business.ResourceExamineManagement
                         if (_CalcBomViewAppService.srm_Po_OccupiesInsert.Any())
                         {
                             _CalcBomViewAppService.srm_Po_OccupiesInsert.ForEach(s => { s.company_id = param.company_id; s.factory_id = param.factoryId; });
-                            await _srm_po_occupy.InsertManyAsync(_CalcBomViewAppService.srm_Po_OccupiesInsert);
+                            var srmpooccupyInsert = ObjectMapper.Map<List<mo_srm_po_occupy>, List<srm_po_occupy>>(_CalcBomViewAppService.srm_Po_OccupiesInsert);
+                            _businessDbContext.BulkInsert(srmpooccupyInsert);
                         }
                         await unitOfWork.CompleteAsync();
                     }
@@ -4042,7 +4077,6 @@ namespace Business.ResourceExamineManagement
                 workOrd.WorkOrd = item.morder_no;
                 workOrd.ItemNum = item.product_code;//物料编码
                 workOrd.QtyOrded = item.need_number.GetValueOrDefault();
-                workOrd.RoutingCode = item.product_code;
                 workOrd.Period = 1;
                 workOrd.Priority = item.urgent;
                 workOrd.Status = "p";

+ 4 - 0
MicroServices/Business/Business.Core/Enum/MorderEnum.cs

@@ -38,6 +38,10 @@ namespace Business.Core.Enum
         /// </summary>
         public const string ScMorder = "试产工单";
         /// <summary>
+        /// TCN工单
+        /// </summary>
+        public const string TcnMorder = "TCN工单";
+        /// <summary>
         /// 备库工单
         /// </summary>
         public const string BkMorder = "备库工单";