Jelajahi Sumber

资源检查代码调整。

tangdi 3 tahun lalu
induk
melakukan
905f96fad4

+ 1 - 1
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/BomChildExamineDto.cs

@@ -221,7 +221,7 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// 群组优先级
         /// </summary>
-        public int substitute_all_num { get; set; }
+        public int? substitute_all_num { get; set; }
 
         /// <summary>
         /// 替代策略

+ 103 - 41
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -153,6 +153,15 @@ namespace Business.ResourceExamineManagement
             //先处理下最顶级的产品需要数量
 
             level1Dto.needCount = level1Dto.qty * count;
+            //直接占用库存,缺料就生成采购
+            mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
+            itemStockoccupyDto.bang_id = bangid;
+            itemStockoccupyDto.icitem_id = level1Dto.item_id;
+            itemStockoccupyDto.item_no = level1Dto.num;
+            if (sentrys != null)
+            {
+                itemStockoccupyDto.orderentry_id = sentrys.Id;
+            }
             if (param.checkflag)
             {
                 //找到当前物料的占用记录
@@ -161,6 +170,19 @@ namespace Business.ResourceExamineManagement
                 level1Dto.sqty -= itemSockoccupy.Sum(s => s.quantity);
                 level1Dto.sqty = level1Dto.sqty < 0 ? 0 : level1Dto.sqty;
                 level1Dto.lack_qty = level1Dto.needCount - level1Dto.sqty;
+                level1Dto.lack_qty = level1Dto.lack_qty < 0 ? 0 : level1Dto.lack_qty;
+                if (level1Dto.sqty != 0)
+                {
+                    if (level1Dto.lack_qty > 0)
+                    {
+                        level1Dto.use_qty = level1Dto.sqty;
+                    }
+                    else {
+                        level1Dto.use_qty = level1Dto.needCount;
+                    }
+                    itemStockoccupyDto.quantity = level1Dto.sqty;
+                    sklist.Add(itemStockoccupyDto);
+                }
             }
             else {
                 level1Dto.lack_qty = level1Dto.needCount;
@@ -170,26 +192,9 @@ namespace Business.ResourceExamineManagement
             //平铺需要数量
             CaclMaterialShortage(returnlist);
 
-            Mes_MorderDto mes_MorderDto = null;
             level1Dto.is_use = true;
             if (level1Dto.lack_qty > 0)
             {
-                //直接占用库存,缺料就生成采购
-                mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
-                itemStockoccupyDto.bang_id = bangid;
-                itemStockoccupyDto.icitem_id = level1Dto.item_id;
-                itemStockoccupyDto.item_no = level1Dto.num;
-                if (sentrys != null)
-                {
-                    itemStockoccupyDto.orderentry_id = sentrys.Id;
-                }
-                if (level1Dto.sqty != 0 && param.checkflag)
-                {
-                    level1Dto.use_qty = level1Dto.sqty;
-                    itemStockoccupyDto.quantity = level1Dto.sqty;
-                    sklist.Add(itemStockoccupyDto);
-                }
-
                 //获取物料详情
                 var ic_item = icitemlist.Find(s => s.mysql_id == level1Dto.item_id);
                 _morderAppService.mo_Mes_Morders = mordersList;//工单
@@ -238,31 +243,68 @@ namespace Business.ResourceExamineManagement
                     //先设定在制的齐套时间
                     //level1Dto.satisfy_time = mooccupylist[0]?.moo_etime;
                     level1Dto.stock_state = 0;
-                    level1Dto.make_qty = level1Dto.lack_qty;
+
                     if (param.checkflag)
                     {
-                        //生成主工单
-                        GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                        //根据成品属性来判断是自制还是委外还是外购,需要考虑这种场景
+                        if (level1Dto.erp_cls == 1)
                         {
-                            seorderentry = sentrys,
-                            seorder = seorder,
-                            ic_Item = ic_item,
-                            BomNumber = level1Dto.bom_number,
-                            version = level1Dto.version,
-                            number = level1Dto.item_number,
-                            Quantity = level1Dto.lack_qty,
-                            morder_type = MorderEnum.XsMorder,
-                            work_order_type = MorderEnum.CgMorder,
-                            morder_state = MorderEnum.Initial_state,
-                            bang_id = bangid,
+                            level1Dto.make_qty = level1Dto.lack_qty;
+                            //生成主工单
+                            GenerateMorderDto generateMorderDto = new GenerateMorderDto()
+                            {
+                                seorderentry = sentrys,
+                                seorder = seorder,
+                                ic_Item = ic_item,
+                                BomNumber = level1Dto.bom_number,
+                                version = level1Dto.version,
+                                number = level1Dto.item_number,
+                                Quantity = level1Dto.lack_qty,
+                                morder_type = MorderEnum.XsMorder,
+                                work_order_type = MorderEnum.CgMorder,
+                                morder_state = MorderEnum.Initial_state,
+                                bang_id = bangid
+                            };
+                            CreateMainOrder(generateMorderDto, level1Dto, childList, returnlist, bangid, plan_date, sklist, sentrys, icitemlist);
+                        }
+                        else if (level1Dto.erp_cls == 3)
+                        {
+                            //采购申请
+                            PackageSRMPR(level1Dto, bangid, plan_date);
+                        }
+                        else if (level1Dto.erp_cls == 2)
+                        {
+                            //先计算末级数据的齐套时间。
+                            if (childList.Count() > 0)
+                            {
+                                MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
+                                level1Dto.kitting_time = childList.Max(s => s.kitting_time);
+                            }
+                            //1.先生成委外工单。
+                            var mesorder = CreateMesOOder(level1Dto, param.tenantId, param.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                            level1Dto.subcontracting_qty = level1Dto.lack_qty;
+                            level1Dto.subcontracting_list = new List<ooder>();
+                            ooder oo = new ooder();
+                            oo.Id = mesorder.id;
+                            oo.morder_production_number = mesorder.morder_production_number;
+                            oo.production_unit = mesorder.production_unit;
+                            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.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, plan_date);
 
-                        };
-                        //生成主工单
-                        _morderAppService.process = process;
-                        _morderAppService.techs = techs;
-                        _morderAppService.tech_Processes = tech_Processes;
-                        _morderAppService.tech_Proc_Workshops = tech_Proc_Workshops;
-                        mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
+                        }
+                    }
+                    else {
+                        MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
                     }
                 }
             }
@@ -275,7 +317,20 @@ namespace Business.ResourceExamineManagement
                 level1Dto.stock_state = 1;
                 return;
             }
+        }
 
+        /// <summary>
+        /// 生成主工单
+        /// </summary>
+        public void CreateMainOrder(GenerateMorderDto generateMorderDto, BomChildExamineDto level1Dto, List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, DateTime
+            ? plan_date, List<mo_ic_item_stockoccupy> sklist, crm_seorderentry sentrys, List<mo_ic_item> icitemlist)
+        {
+            //生成主工单
+            _morderAppService.process = process;
+            _morderAppService.techs = techs;
+            _morderAppService.tech_Processes = tech_Processes;
+            _morderAppService.tech_Proc_Workshops = tech_Proc_Workshops;
+            Mes_MorderDto mes_MorderDto = _morderAppService.GenerateMorder(generateMorderDto);
             MatterTileDevelop(level1Dto, childList, returnlist, sklist, bangid, plan_date, sentrys, icitemlist);
             //这里更新产品得满足时间。
             if (mes_MorderDto != null)
@@ -301,7 +356,7 @@ namespace Business.ResourceExamineManagement
                         var plan = planList.Find(x => x.icitem_id == level1Dto.item_id);
                         var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
                         var Day = ProductiveDate / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                        mes_Morders.moentry_sys_stime = childList.Max(s=>s.kitting_time.GetValueOrDefault()).AddDays(1);//数据齐套完成后隔天开始生产;
+                        mes_Morders.moentry_sys_stime = childList.Max(s => s.kitting_time.GetValueOrDefault()).AddDays(1);//数据齐套完成后隔天开始生产;
                         //结束日期=开始时间+生产时长+自检提前期+入库提前期+发运提前期;
                         var LeadTime = 0.00m;
                         if (plan != null)
@@ -345,6 +400,7 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+
         /// <summary>
         /// 物料计算
         /// </summary>
@@ -636,6 +692,7 @@ namespace Business.ResourceExamineManagement
                 if (parent != null)
                 {
                     item.use_qty = parent.lack_qty * item.qty;
+                    item.kitting_time = DateTime.Now;
                     itemStockoccupyDto.quantity = item.use_qty;
                 }
                 sklist.Add(itemStockoccupyDto);
@@ -750,6 +807,7 @@ namespace Business.ResourceExamineManagement
             //占用库存
             foreach (var slt in select)
             {
+                slt.self_lack_qty = parent.lack_qty * slt.qty;
                 mo_ic_item_stockoccupy itemStockoccupyDto = new mo_ic_item_stockoccupy();
                 itemStockoccupyDto.bang_id = bangid;
                 itemStockoccupyDto.icitem_id = slt.item_id;
@@ -1213,7 +1271,6 @@ namespace Business.ResourceExamineManagement
         {
             //采购申请
             var SRMPRDto = CreateSRMPR(item, param.tenantId, param.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
-            item.purchase_qty = item.lack_qty;
             item.purchase_list = new List<purchase>();
             if (SRMPRDto.srm_Pr_Main != null)
             {
@@ -1238,7 +1295,12 @@ namespace Business.ResourceExamineManagement
                     item.purchase_list.Add(pur);
                 }
             }
-            item.kitting_time = SRMPRDto.lastStartTmie;
+            if (item.erp_cls == 3)
+            {
+                item.purchase_qty = item.lack_qty;
+                item.purchase_list = new List<purchase>();
+                item.kitting_time = SRMPRDto.lastStartTmie;
+            }
             SRMPRDtoList.Add(SRMPRDto);
         }
     }

+ 30 - 90
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -230,6 +230,7 @@ namespace Business.ResourceExamineManagement
         private List<mo_ic_plan> planList;
 
         private readonly BusinessBangDbContext _businessBangDbContext;
+        private readonly BusinessDbContext _businessDbContext;
         #endregion
 
         #region 构造函数
@@ -295,7 +296,8 @@ namespace Business.ResourceExamineManagement
             PurchaseOrderAppService purchaseOrderAppService,
             ICurrentTenant currentTenant,
             MorderAppService morderAppService,
-            BusinessBangDbContext businessBangDbContext
+            BusinessBangDbContext businessBangDbContext,
+            BusinessDbContext businessDbContext
             )
         {
             _mes_technique = mes_technique;
@@ -352,6 +354,7 @@ namespace Business.ResourceExamineManagement
             _currentTenant = currentTenant;
             _morderAppService = morderAppService;
             _businessBangDbContext = businessBangDbContext;
+            _businessDbContext = businessDbContext;
         }
         #endregion
 
@@ -375,6 +378,25 @@ namespace Business.ResourceExamineManagement
             //资源检查明细list
             List<ExamineResult> examines = new List<ExamineResult>();
             ExamineResult dtl;
+            /*if (input.sorderId == 123)
+            {
+                Random rd = new Random();
+
+                List<ic_item_stock> itemstocklist = new List<ic_item_stock>();
+                var iclist = _mysql_ic_item.GetListAsync(s => s.tenant_id == 101).Result;
+                iclist.ForEach(s => {
+                    ic_item_stock stock = new ic_item_stock();
+                    stock.GenerateNewId(help.NextId());
+                    stock.icitem_id = s.Id;
+                    stock.icitem_name = s.name;
+                    stock.sqty = rd.Next(0, 300);
+                    stock.tenant_id = s.tenant_id;
+                    stock.factory_id = s.factory_id;
+                    itemstocklist.Add(stock);
+                });
+                await _businessDbContext.ic_item_stock.BulkInsertAsync(itemstocklist, options => options.InsertKeepIdentity = true);
+                return "ok";
+            }*/
 
             //生成当前计算bangid
             long bangid = help.NextId();
@@ -417,88 +439,6 @@ namespace Business.ResourceExamineManagement
 
             DataInitialization(boms, bangid, sorder, bomlist, bomchildlist, icitemlist, sublist, suballlist, subdtllist, stocklist, sklist);
 
-            /*//物料bom
-            List<mo_ic_bom> bomlist = new List<mo_ic_bom>();
-            //物料bom明细
-            List<mo_ic_bom_child> bomchildlist = new List<mo_ic_bom_child>();
-            //获取物料bom,物料bom明细
-            GetIcBomData(boms, bomlist, bomchildlist);
-
-            //根据明细集合查出所有得替代关系表数据集合
-            List<string> codeList = bomchildlist.Select(c => c.substitute_code).ToList();
-            var sublist = _ic_substitute.GetManyByCondition(p => codeList.Contains(p.substitute_code) && !p.IsDeleted).Result;
-
-            List<long> subidlist = sublist.Select(c => c.mysql_id).ToList();
-            var suballlist = _ic_substitute_all.GetManyByCondition(p => subidlist.Contains(p.substitute_id) && !p.IsDeleted).Result;
-
-            List<long> suballidlist = suballlist.Select(c => c.mysql_id).ToList();
-            var subdtllist = _ic_substitute_all_dtl.GetManyByCondition(p => suballidlist.Contains(p.substitute_allid) && !p.IsDeleted).Result;
-
-            #region 1、数据准备
-            //1.1、获取工艺路径数据
-            List<mo_mes_technique> techs = GetMesTechniques(bomlist);
-            if (techs.Count == 0)
-            {
-                throw new NotImplementedException("请先配置工艺路径!");
-            }
-
-            //1.2、获取工艺路径关联工序数据
-            List<mo_mes_tech_process> tech_Processes = await _mes_tech_process.GetManyByCondition(p => techs.Select(m => m.mysql_id).ToList().Contains(p.tech_id) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
-            if (tech_Processes.Count == 0)
-            {
-                throw new NotImplementedException("请先配置工序!");
-            }
-
-            //1.3、获取当前工艺路径下的工序数据
-            List<long> procIds = tech_Processes.Select(m => m.proc_id).ToList();
-            List<mo_mes_process> process = await _mes_process.GetManyByCondition(p => procIds.Contains(p.mysql_id) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
-
-            //1.3、获取工艺工序关联工位信息
-            List<long> techProcIds = tech_Processes.Select(m => m.mysql_id).ToList();
-            List<mo_mes_tech_proc_workshop> tech_Proc_Workshops = await _mes_tech_proc_workshop.GetManyByCondition(p => techProcIds.Contains(p.tech_proc_id) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
-            //主工单
-            List<mo_mes_morder> mo_Mes_Morders = await _mes_morder.GetManyByCondition(x => boms.Select(p => p.bom_number).Contains(x.bom_number) && (x.morder_state != MorderEnum.Accomplish_state || x.morder_state != MorderEnum.Close_state
-          && x.morder_icitem_type != MorderEnum.XgwyMorder) && !x.IsDeleted && x.tenant_id == param.tenantId && x.bang_id == bangid);
-            //工单占用表
-            List<mo_mes_mooccupy> mes_mooccupyList = await _mes_mooccupy.GetManyByCondition(x => x.moo_state == 1 && !x.IsDeleted && x.tenant_id == param.tenantId
-          && boms.Select(p => p.item_number).Contains(x.fitem_number) && x.bang_id == bangid);
-
-            //物料采购订单明细
-            var poDetailList = await _srm_po_list.GetManyByCondition(x => boms.Select(p => p.icitem_id).ToList().Contains(x.icitem_id.Value) && x.state == 1 && x.rstate == 1 && !x.IsDeleted);
-            //采购订单占用数据
-            var poOccupys = await _srm_po_occupy.GetManyByCondition(x => poDetailList.Select(p => p.id).ToList().Contains(x.polist_id) && !x.IsDeleted);
-            #endregion
-
-            //物料占用记录
-            List<mo_ic_item_stockoccupy> sklist = new List<mo_ic_item_stockoccupy>();
-            //获取物料数据
-            List<long> itemIds = bomlist.Select(p => p.icitem_id).ToList();
-            itemIds.AddRange(bomchildlist.Select(p => p.icitem_id).ToList());
-            itemIds.AddRange(subdtllist.Select(p => p.icitem_id).ToList());
-            List<mo_ic_item> icitemlist = _ic_item.GetManyByCondition(p => itemIds.Contains(p.mysql_id) && !p.IsDeleted).Result;
-
-            //物料库存
-            var stocklist = _ic_item_stock.GetManyByCondition(p => p.factory_id == param.factoryId && p.bang_id == bangid && itemIds.Contains(p.icitem_id)).Result;
-
-            //物料提前期
-            leadTimeList = GetLeadTime(itemIds, input.tenantId, input.factoryId);//提前期列表
-            supplierList = GetSupplier(itemIds, input.tenantId, input.factoryId);//供应商列表
-            planList = GetICPlan(itemIds, input.tenantId, input.factoryId);//plan列表
-
-            _CalcBomViewAppService.param = param;
-            _CalcBomViewAppService.planList = planList;
-            _CalcBomViewAppService.leadTimeList = leadTimeList;
-            _CalcBomViewAppService.supplierList = supplierList;
-            //资源检查添加工艺路径数据
-            _CalcBomViewAppService.techs = techs;//工艺路径
-            _CalcBomViewAppService.tech_Processes = tech_Processes;//工艺关联工序
-            _CalcBomViewAppService.process = process;//工序
-            _CalcBomViewAppService.tech_Proc_Workshops = tech_Proc_Workshops;//工艺工序关联工位
-            _CalcBomViewAppService.mordersList = mo_Mes_Morders;//工单
-            _CalcBomViewAppService.mooccupyAllList = mes_mooccupyList;//工单占用表
-            _CalcBomViewAppService.seorder = sorder;//销售订单
-            _CalcBomViewAppService.srm_Po_Lists = poDetailList; //采购明细
-            _CalcBomViewAppService.srm_Po_Occupies = poOccupys; //采购占用表*/
 
             foreach (var item in sentrys)
             {
@@ -679,31 +619,31 @@ namespace Business.ResourceExamineManagement
             }
             if (examineList.Any())
             {
-                await _mysql_examine_result.InsertManyAsync(examineList);
+                await _businessBangDbContext.b_examine_result.BulkInsertAsync(examineList, options => options.InsertKeepIdentity = true);
             }
             if (bomExamineList.Any())
             {
-                await _mysql_bom_child_examine.InsertManyAsync(bomExamineList);
+                await _businessBangDbContext.b_bom_child_examine.BulkInsertAsync(bomExamineList.OrderBy(s => s.num_order).ToList(), options => options.InsertKeepIdentity = true);
             }
             if (mooccupyList.Any())
             {
-                await _mysql_mo_occupy.InsertManyAsync(mooccupyList);
+                await _businessBangDbContext.b_mo_occupy.BulkInsertAsync(mooccupyList, options => options.InsertKeepIdentity = true);
             }
             if (moorderList.Any())
             {
-                await _mysql_mo_order.InsertManyAsync(moorderList);
+                await _businessBangDbContext.b_mo_order.BulkInsertAsync(moorderList, options => options.InsertKeepIdentity = true);
             }
             if (ooderList.Any())
             {
-                await _mysql_ooder.InsertManyAsync(ooderList);
+                await _businessBangDbContext.b_ooder.BulkInsertAsync(ooderList, options => options.InsertKeepIdentity = true);
             }
             if (purchaseList.Any())
             {
-                await _mysql_purchase.InsertManyAsync(purchaseList);
+                await _businessBangDbContext.b_purchase.BulkInsertAsync(purchaseList, options => options.InsertKeepIdentity = true);
             }
             if (purchaseoccupyList.Any())
             {
-                await _mysql_purchase_occupy.InsertManyAsync(purchaseoccupyList);
+                await _businessBangDbContext.b_purchase_occupy.BulkInsertAsync(purchaseoccupyList, options => options.InsertKeepIdentity = true);
             }
             //清空快照数据
             await ClearSnapShot(bangid);

+ 1 - 1
MicroServices/Business/Business.EntityFrameworkCore/EntityFrameworkCore/Bang/BusinessBangDbContext.cs

@@ -19,7 +19,7 @@ using Volo.Abp.TenantManagement.EntityFrameworkCore;
 namespace Business.EntityFrameworkCore
 {
     /// <summary>
-    /// ¶ÔÓ¦dopbizÊý¾Ý¿â
+    /// ¶ÔÓ¦dopbangÊý¾Ý¿â
     /// </summary>
     [ConnectionStringName("DOPBang")]
     public class BusinessBangDbContext : AbpDbContext<BusinessBangDbContext>