瀏覽代碼

考虑子工单生成

zhengly 3 年之前
父節點
當前提交
14caaf653e

+ 24 - 17
MicroServices/Business/Business.Application/ResourceExamineManagement/MorderAppService.cs

@@ -89,10 +89,6 @@ namespace Business.ResourceExamineManagement
             //TODO:考虑性能问题 循环调用,后期改造传递数组,批量处理数据后,批量保存。
             //获取销售订单信息
             var seorder = _mysql_crm_seorder.FindAsync(x => x.Id == seorderentry.seorder_id).Result;
-            //物料BOM
-            //var ic_bom = _ic_bom.GetManyByCondition(x => x.bom_number == BomNumber && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
-            //物料详情
-            //var ic_item = _ic_item.GetManyByCondition(x => x.number == number && x.factory_id == seorderentry.factory_id).Result.FirstOrDefault();
 
             mes_morder mes_Morder = new mes_morder();
             mes_Morder.GenerateNewId();
@@ -105,18 +101,29 @@ namespace Business.ResourceExamineManagement
             mes_Morder.fms_number = ic_Item.fms_number;
             mes_Morder.bom_number = BomNumber;
             mes_Morder.fmodel = ic_Item.model;
-            //最早的开工时间3天后、 最晚时间为订单承诺时间-采购提前期-质检提前期-入库提前期-发料提前期 =最晚开工时间  最早或最晚为系统建议开工日期
-            //根绝系统配置参数 取最早或者最晚开始日期
-            //var StartDate = DateTime.Now.Date.AddDays(3);
-            //mes_Morder.moentry_sys_stime = StartDate;
-            //if (!string.IsNullOrEmpty(BomNumber))
-            //{
-            //    var ProductiveDate = ProductiveExamine(BomNumber, version, (int)(Quantity.Value));
-            //    //系统建议完工日期为 开工日期+产能检查时间=完工日期
-            //    var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-            //    mes_Morder.moentry_sys_etime = StartDate.AddDays((double)Day);
-            //    mes_Morder.morder_need_time = ProductiveDate.Result;
-            //}
+            if (ParentId != null)
+            {
+                //最早的开工时间3天后、 最晚时间为订单承诺时间 - 采购提前期 - 质检提前期 - 入库提前期 - 发料提前期 = 最晚开工时间  最早或最晚为系统建议开工日期
+                var StartDate = DateTime.Now.Date.AddDays(3);
+                mes_Morder.moentry_sys_stime = StartDate;
+                if (!string.IsNullOrEmpty(BomNumber))
+                {
+                    ProdExamineParamDto prodExamine = new ProdExamineParamDto()
+                    {
+                        bom_number = BomNumber,
+                        version = version,
+                        packages = (int)Quantity.GetValueOrDefault(),
+                        tenantId = seorderentry.tenant_id,
+                        factoryId = seorderentry.factory_id.GetValueOrDefault()
+                    };
+                    var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
+                    //系统建议完工日期为 开工日期+产能检查时间=完工日期
+                    var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
+                    mes_Morder.moentry_sys_etime = StartDate.AddDays((double)Day);
+                    mes_Morder.morder_need_time = ProductiveDate.Result;
+                }
+            }
+
             mes_Morder.moentry_startup_status = 0;
             mes_Morder.tenant_id = seorderentry.tenant_id;
             mes_Morder.factory_id = seorderentry.factory_id;
@@ -125,7 +132,7 @@ namespace Business.ResourceExamineManagement
             mes_Morder.project_name = seorder.project_name;
             mes_Morder.planner_num = seorderentry.planner_no;
             mes_Morder.planner_name = seorderentry.planner_name;
-            mes_Morder.morder_date = DateTime.Now.Date;
+            mes_Morder.morder_date = DateTime.Now.Date.AddDays(1);
             //mes_Morder.morder_fstate = "计划";
             //TODO:目前没有取值位置
             mes_Morder.moentry_prd = null;

+ 101 - 123
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -211,10 +211,6 @@ namespace Business.ResourceExamineManagement
         private List<ic_item_pur> supplierList;
 
         private List<ic_plan> planList;
-
-        private List<SRMPRDto> SRMPRDtoList = new List<SRMPRDto>();
-
-        private List<mes_oorder> orderList = new List<mes_oorder>();
         #endregion
 
         #region 构造函数
@@ -417,8 +413,6 @@ namespace Business.ResourceExamineManagement
             }
             //订单行资源检查明细list
             rtn.examines = examines;
-            rtn.srm_pr_list = SRMPRDtoList;
-            rtn.order_list = orderList;
             rtn.sklist = sklist;
             return JsonConvert.SerializeObject(rtn);
         }
@@ -714,12 +708,12 @@ namespace Business.ResourceExamineManagement
             foreach (var item in returnlist)
             {
                 //最顶级、虚拟件
-                if (item.level == 1 || item.erp_cls == 4 || childidList.Contains(item.bom_child_id.GetValueOrDefault()))
+                if (item.level == 1 || item.erp_cls == 4 || !childidList.Contains(item.bom_child_id.GetValueOrDefault()))
                 {
                     continue;
                 }
                 //有替代关系
-                if (item.haveicsubs != 1)
+                if (item.haveicsubs == 1)
                 {
                     continue;
                 }
@@ -878,7 +872,7 @@ namespace Business.ResourceExamineManagement
         {
             //第一级
             returnlist = returnlist.OrderBy(s => s.num).ToList();
-            var childList = returnlist.Where(s => s.parent_id == returnlist[0].id && s.type == 0).OrderBy(s => s.num).ToList();
+            var childList = returnlist.Where(s => s.parent_id == returnlist[0].id && s.type == 0).ToList();
 
             var planList = GetICPlan(returnlist.Select(p => p.item_id).ToList(), bangid, param.factoryId);//plan列表
 
@@ -918,38 +912,37 @@ namespace Business.ResourceExamineManagement
             //这里更新产品得满足时间。
             if (mes_MorderDto != null)
             {
-                //TODO:目前不考虑子工单 只存在单条数据先这样取值;
-                //var mes_Morders = mes_MorderDto.mes_Morders.FirstOrDefault();
-                //var mes_Moentry = mes_MorderDto.mes_Moentries.FirstOrDefault();
-                foreach (var item in mes_MorderDto.mes_Morders)
+                //主工单最后计算满足日期
+                var mes_Morders = mes_MorderDto.mes_Morders.Where(x => x.parent_id == null).FirstOrDefault();
+                if (mes_Morders != null)
                 {
-                    if (!string.IsNullOrEmpty(item.bom_number))
+                    if (!string.IsNullOrEmpty(mes_Morders.bom_number))
                     {
+                        //var ProductiveDate = ProductiveExamine(mes_Morders.bom_number, returnlist[0].version, (int)mes_Morders.morder_production_number.Value);
                         ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                         {
-                            bom_number = item.bom_number,
+                            bom_number = mes_Morders.bom_number,
                             version = returnlist[0].version,
-                            packages = (int)item.morder_production_number.Value,
+                            packages = (int)mes_Morders.morder_production_number.Value,
                             tenantId = param.tenantId,
                             factoryId = param.factoryId
 
                         };
-                        var itemId = returnlist.Where(x => x.bom_number == item.bom_number).FirstOrDefault().item_id;
-                        var plan = planList.Find(x => x.icitem_id == itemId);
+                        var plan = planList.Find(x => x.icitem_id == returnlist[0].item_id);
                         var ProductiveDate = _productExamineAppService.ProductiveExamine(prodExamine);
                         var Day = ProductiveDate.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                        item.moentry_sys_stime = returnlist[0].kitting_time.Value.AddDays(1);//数据齐套完成后隔天开始生产;
+                        mes_Morders.moentry_sys_stime = returnlist[0].kitting_time.Value.AddDays(1);//数据齐套完成后隔天开始生产;
                         //结束日期=开始时间+生产时长+自检提前期+入库提前期+发运提前期;
                         var LeadTime = Day + plan.self_inspection_date.Value + plan.Shipping_date.Value + plan.Warehousing_date.Value;
-                        item.moentry_sys_etime = item.moentry_sys_stime.Value.AddDays((double)Day);
-                        item.morder_need_time = ProductiveDate.Result;
-                        //满足资源检查的时间需加上提前期 //TODO:工单返回满足时间
-                        returnlist[0].satisfy_time = item.moentry_sys_stime.Value.AddDays((double)LeadTime);
+                        mes_Morders.moentry_sys_etime = mes_Morders.moentry_sys_stime.Value.AddDays((double)Day);
+                        mes_Morders.morder_need_time = ProductiveDate.Result;
+                        //满足资源检查的时间需加上提前期
+                        returnlist[0].satisfy_time = mes_Morders.moentry_sys_stime.Value.AddDays((double)LeadTime);
                     }
+                    //批量保存 后期考虑子工单
+                    _mes_morder.InsertMany(mes_MorderDto.mes_Morders);
+                    _mes_moentry.InsertMany(mes_MorderDto.mes_Moentries);
                 }
-                //批量保存 后期考虑子工单
-                _mes_morder.InsertMany(mes_MorderDto.mes_Morders);
-                _mes_moentry.InsertMany(mes_MorderDto.mes_Moentries);
             }
         }
 
@@ -968,7 +961,7 @@ namespace Business.ResourceExamineManagement
         {
             foreach (var item in childList)
             {
-                var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).OrderBy(k => k.num).ToList();
+                var cilList = returnlist.Where(s => s.parent_id == item.id && s.type == 0).ToList();
 
                 if (item.haveicsubs == 1)
                 {
@@ -985,7 +978,6 @@ namespace Business.ResourceExamineManagement
                     ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
                     itemStockoccupyDto.bang_id = bangid;
                     itemStockoccupyDto.icitem_id = item.item_id;
-                    itemStockoccupyDto.item_no = item.num;
                     item.kitting_time = DateTime.Now;
                     if (cilList.Count() > 0)
                     {
@@ -993,58 +985,68 @@ namespace Business.ResourceExamineManagement
                         item.kitting_time = cilList.Max(s => s.kitting_time);
                     }
 
-                    if (parent.stock_state == 0)
+                    if (item.lack_qty > 0)
                     {
-                        if (item.lack_qty > 0)
+                        //如果缺料,占用库存,然后走采购或自制
+                        itemStockoccupyDto.quantity = item.sqty;
+                        item.use_qty = item.sqty;
+                        sklist.Add(itemStockoccupyDto);
+                        if (item.erp_cls == 1)
                         {
-                            //如果缺料,占用库存,然后走采购或自制
-                            if (item.sqty > 0)
-                            {
-                                itemStockoccupyDto.quantity = item.sqty;
-                                sklist.Add(itemStockoccupyDto);
-                            }
-                            item.use_qty = item.sqty;
-                            if (item.erp_cls == 1)
+                            //走自制
+                            //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
+                            ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                             {
-                                //走自制
-                                //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
-                                ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                                {
-                                    bom_number = item.bom_number,
-                                    version = item.version,
-                                    packages = (int)item.lack_qty,
-                                    tenantId = param.tenantId,
-                                    factoryId = param.factoryId
-
-                                };
-                                var minute = _productExamineAppService.ProductiveExamine(prodExamine);
-                                //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
-                                //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                                var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                                item.kitting_time = item.kitting_time.Value.AddDays((double)Day);
-                            }
-                            else if (item.erp_cls == 3)
-                            {
-                                //采购申请
-                                var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
-                                item.kitting_time = SRMPRDto.lastStartTmie;
-                                SRMPRDtoList.Add(SRMPRDto);
-                            }
-                            else if (item.erp_cls == 2)
+                                bom_number = item.bom_number,
+                                version = item.version,
+                                packages = item.lack_qty.GetInt(),
+                                tenantId = param.tenantId,
+                                factoryId = param.factoryId
+
+                            };
+                            var minute = _productExamineAppService.ProductiveExamine(prodExamine);
+                            //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
+                            //系统建议完工日期为 开工日期+产能检查时间=完工日期
+                            var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
+                            item.kitting_time = item.kitting_time.Value.AddDays((double)Day);
+                        }
+                        else if (item.erp_cls == 2)
+                        {
+                            //采购申请
+                            var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                            item.kitting_time = SRMPRDto.lastStartTmie;
+                        }
+                        else if (item.erp_cls == 3)
+                        {
+
+                            if (item.erp_cls == 3)
                             {
                                 //1.先生成委外工单。
-                                var mesorder = CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-                                item.kitting_time = mesorder.ooentry_etime;
-                                orderList.Add(mesorder);
+                                CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                                //2.再根据委外工单需要检查库存材料,然后提供给第三方组装(委外生产)。
+                                //3.如果委外工单的物料库存不够,先生成物料采购申请单,再生成物料的采购订单,到货后再走委外流程。
+                                /*foreach (var cl in cilList)
+                                {
+                                    if (cl.stock_state == 0 || cl.stock_state == 2)
+                                    {
+                                        //采购申请
+                                        var SRMPRDto = CreateSRMPR(item, input.tenantId, input.factoryId, bangid, item.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                                        item.kitting_time = SRMPRDto.lastStartTmie;
+                                    }
+                                }*/
+                                //4.再生成委外的采购申请单。
                             }
                         }
-                        else
+                    }
+                    else
+                    {
+                        item.use_qty = 0;
+                        if (parent.stock_state == 1)
                         {
                             //如果父级缺料,则本级等于父级缺料*本级使用数量
                             item.use_qty = parent.lack_qty * item.qty;
                             itemStockoccupyDto.quantity = item.use_qty;
                             sklist.Add(itemStockoccupyDto);
-
                         }
                     }
                     item.is_use = true;
@@ -1212,7 +1214,6 @@ namespace Business.ResourceExamineManagement
                 ic_item_stockoccupy itemStockoccupyDto = new ic_item_stockoccupy();
                 itemStockoccupyDto.bang_id = bangid;
                 itemStockoccupyDto.icitem_id = slt.item_id;
-                itemStockoccupyDto.item_no = slt.num;
                 slt.is_use = true;
                 if (slt.lack_qty > 0)
                 {
@@ -1225,9 +1226,9 @@ namespace Business.ResourceExamineManagement
                         //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
                         ProdExamineParamDto prodExamine = new ProdExamineParamDto()
                         {
-                            bom_number = slt.bom_number,
-                            version = slt.version,
-                            packages = (int)slt.lack_qty,
+                            bom_number = item.bom_number,
+                            version = item.version,
+                            packages = item.lack_qty.GetInt(),
                             tenantId = param.tenantId,
                             factoryId = param.factoryId
 
@@ -1242,19 +1243,19 @@ namespace Business.ResourceExamineManagement
                             CalcStrategy(slt, returnlist, bangid, sklist);
                         }*/
                     }
-                    else if (slt.erp_cls == 3)
-                    {
-                        //采购申请
-                        var SRMPRDto = CreateSRMPR(slt, input.tenantId, input.factoryId, bangid, slt.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
-                        item.kitting_time = SRMPRDto.lastStartTmie;
-                        SRMPRDtoList.Add(SRMPRDto);
-                    }
-                    else if (slt.erp_cls == 2)
-                    {
-                        //1.先生成委外工单。
-                        var mesorder = CreateMesOOder(slt, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-                        slt.kitting_time = mesorder.ooentry_etime;
-                        orderList.Add(mesorder);
+                    else if (slt.erp_cls == 2 || slt.erp_cls == 3)
+                    {   /*//生成采购订单
+                        //slt.purchase_qty = slt.lack_qty;
+                        var leadTimeList = GetLeadTime(new List<long> { slt.item_id }, input.tenantId, input.factoryId);//提前期列表
+                        var supplierList = GetSupplier(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//供应商列表
+                        var planList = GetICPlan(new List<BomChildExamineDto> { slt }, input.tenantId, input.factoryId);//plan列表
+
+                        slt.kitting_time = CreateSRMPR(slt, input.tenantId, input.factoryId, bangid, slt.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        if (item.erp_cls == 3)
+                        {
+                            //生成委外工单
+                            CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        }*/
                     }
                 }
                 else
@@ -1336,7 +1337,6 @@ namespace Business.ResourceExamineManagement
                         itemStockoccupyDto.bang_id = bangid;
                         itemStockoccupyDto.icitem_id = zy.item_id;
                         itemStockoccupyDto.quantity = use_p_num * zy.qty; ;
-                        itemStockoccupyDto.item_no = zy.num;
                         sklist.Add(itemStockoccupyDto);
                     }
                     idx++;
@@ -1363,36 +1363,20 @@ namespace Business.ResourceExamineManagement
                     var num = parent_lack * sct.qty - itemSockoccupy.Sum(m => m.quantity);
                     if (sct.erp_cls == 1)
                     {
-                        //走自制
-                        //var minute = ProductiveExamine(item.bom_number, "1.0", item.lack_qty.GetInt());
-                        ProdExamineParamDto prodExamine = new ProdExamineParamDto()
-                        {
-                            bom_number = sct.bom_number,
-                            version = sct.version,
-                            packages = (int)sct.lack_qty,
-                            tenantId = param.tenantId,
-                            factoryId = param.factoryId
-
-                        };
-                        var minute = _productExamineAppService.ProductiveExamine(prodExamine);
-                        //var ProductiveDate = ProductiveExamine(BomNumber, (int)(Quantity.Value));
-                        //系统建议完工日期为 开工日期+产能检查时间=完工日期
-                        var Day = minute.Result / (60 * 10); //返回的分钟除以十个小时得出工作天数;
-                        sct.kitting_time = sct.kitting_time.Value.AddDays((double)Day);
-                    }
-                    else if (sct.erp_cls == 3)
-                    {
-                        //采购申请
-                        var SRMPRDto = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
-                        sct.kitting_time = SRMPRDto.lastStartTmie;
-                        SRMPRDtoList.Add(SRMPRDto);
+                        //自制
+                        //GenerateMorder()
                     }
-                    else if (sct.erp_cls == 2)
+                    else if (sct.erp_cls == 2 || sct.erp_cls == 3)
                     {
-                        //1.先生成委外工单。
-                        var mesorder = CreateMesOOder(sct, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
-                        sct.kitting_time = mesorder.ooentry_etime;
-                        orderList.Add(mesorder);
+                        /*var leadTimeList = GetLeadTime(new List<long> { sct.item_id }, input.tenantId, input.factoryId);//提前期列表
+                        var supplierList = GetSupplier(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//供应商列表
+                        var planList = GetICPlan(new List<BomChildExamineDto> { sct }, input.tenantId, input.factoryId);//plan列表
+                        sct.kitting_time = CreateSRMPR(sct, input.tenantId, input.factoryId, bangid, sct.erp_cls, leadTimeList, supplierList, planList, plan_date.Value);
+                        if (item.erp_cls == 3)
+                        {
+                            //生成委外工单
+                            CreateMesOOder(item, input.tenantId, input.factoryId, bangid, leadTimeList, supplierList, plan_date.Value);
+                        }*/
                     }
                 }
             }
@@ -1576,7 +1560,6 @@ namespace Business.ResourceExamineManagement
             {
                 //判断缺料数量
                 item.lack_qty = parent.lack_qty * item.qty - item.sqty;
-                item.lack_qty = item.lack_qty < 0 ? 0 : item.lack_qty;
                 //判断状态
                 item.stock_state = item.lack_qty > 0 ? 0 : 1;
             }
@@ -2039,19 +2022,14 @@ namespace Business.ResourceExamineManagement
         /// <param name="orderType">2委外采购申请单,3采购申请单</param>
         private SRMPRDto CreateSRMPR(BomChildExamineDto returnlist, long tenantId, long factoryid, long bangId, int orderType, List<ICItemLeadTimeDto> iCItemLeadTimes, List<ic_item_pur> supplierList, List<ic_plan> planList, DateTime deliveryDate)
         {
-            SRMPRDto sRMPR = new SRMPRDto();
-            srm_pr_main srm_Pr = new srm_pr_main();
             var leadTime = iCItemLeadTimes.Find(x => x.item_id == returnlist.item_id);
             var supplier = supplierList.Find(x => x.icitem_id == returnlist.item_id);//默认取第一个供应商
             var plan = planList.Find(x => x.icitem_id == returnlist.item_id);
             if (leadTime == null || supplier == null || plan == null)
             {
-                sRMPR.srm_Pr_Main = null;
-                sRMPR.lastStartTmie = deliveryDate.AddDays(7 * -1);//减去提前期
-                return sRMPR;
-                //throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
+                throw new NotImplementedException("未找到物料ic_factory_details或ic_item_pur或ic_plan信息!");
             }
-            
+            srm_pr_main srm_Pr = new srm_pr_main();
             srm_Pr.GenerateNewId();
             srm_Pr.pr_billno = getOrderNum("PR");//pr单号
             srm_Pr.pr_mono = "";//关联工单号
@@ -2087,7 +2065,7 @@ namespace Business.ResourceExamineManagement
             srm_Pr.bang_id = bangId;
             //_srm_pr_main.InsertOne(srm_Pr);
             decimal? totalLeadTime = leadTime.transportation_leadtime + leadTime.stock_leadtime + leadTime.production_leadtime + leadTime.order_leadtime;
-            
+            SRMPRDto sRMPR = new SRMPRDto();
             sRMPR.srm_Pr_Main = srm_Pr;
             sRMPR.lastStartTmie = deliveryDate.AddDays((double)totalLeadTime * -1);//减去提前期
             return sRMPR;