Ver Fonte

资源检查调整。

tangdi há 3 anos atrás
pai
commit
74ee87dc79

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

@@ -1,6 +1,10 @@
-using System;
+using Bussiness.MongoModel.Production;
+using Bussiness.MongoModel.SRM;
+using Microsoft.EntityFrameworkCore;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -114,50 +118,100 @@ namespace Business.ResourceExamineManagement.Dto
         /// </summary>
         public decimal sqty { get; set; }
 
+        /// <summary>
+        /// 库存占用数量
+        /// </summary>
+        public decimal use_qty { get; set; }
+
+        /// <summary>
+        /// 本级缺料数量
+        /// </summary>
+        public decimal self_lack_qty { get; set; }
+
         /// <summary>
         /// 缺料数量
         /// </summary>
         public decimal lack_qty { get; set; }
 
+        /// <summary>
+        /// 在制占用数量
+        /// </summary>
+        public decimal mo_qty { get; set; }
+
+        /// <summary>
+        /// 在制占用明细
+        /// </summary>
+        public List<mo_occupy> mo_occupy_list { get; set; }
+
         /// <summary>
         /// 采购数量
         /// </summary>
         public decimal purchase_qty { get; set; }
 
+        /// <summary>
+        /// 采购明细
+        /// </summary>
+        public List<mo_srm_pr_main> purchase_list { get; set; }
+
+        /// <summary>
+        /// 采购占用数量
+        /// </summary>
+        public decimal purchase_occupy_qty { get; set; }
+
+        /// <summary>
+        /// 采购占用明细
+        /// </summary>
+        public List<mo_srm_po_occupy> purchase_occupy_list { get; set; }
+
         /// <summary>
         /// 自制数量
         /// </summary>
         public decimal make_qty { get; set; }
 
+        /// <summary>
+        /// 自制工单明细
+        /// </summary>
+        public List<Mes_MorderDto> make_list { get; set; }
+
+        /// <summary>
+        /// 自制占用数量
+        /// </summary>
+        public decimal make_occupy_qty { get; set; }
+
+        /// <summary>
+        /// 自制占用明细
+        /// </summary>
+        public List<Mes_MorderDto> make_occupy_list { get; set; }
+
         /// <summary>
         /// 委外数量
         /// </summary>
         public decimal subcontracting_qty { get; set; }
 
         /// <summary>
-        /// 齐套时间
+        /// 委外工单明细
         /// </summary>
-        public DateTime? kitting_time { get; set; }
+        public List<mo_mes_oorder> subcontracting_list { get; set; }
 
         /// <summary>
-        /// 满足时间
+        /// 委外占用数量
         /// </summary>
-        public DateTime? satisfy_time { get; set; }
+        public decimal subcontracting_occupy_qty { get; set; }
 
-        /*/// <summary>
-        /// 计划员
+        /// <summary>
+        /// 委外数量
         /// </summary>
-        public string plan_user { get; set; }
+        public decimal subcontracting_occupy_list { get; set; }
 
         /// <summary>
-        /// 采购员
+        /// 齐套时间
         /// </summary>
-        public string purchase_user { get; set; }
+        public DateTime? kitting_time { get; set; }
 
         /// <summary>
-        /// 来源
+        /// 满足时间
         /// </summary>
-        public string source { get; set; }*/
+        public DateTime? satisfy_time { get; set; }
 
         /// <summary>
         /// 是否BOM
@@ -235,18 +289,31 @@ namespace Business.ResourceExamineManagement.Dto
         public decimal needCount { get; set; }
 
         /// <summary>
-        /// 使用数量(库存使用)
+        /// 是否使用此物料
         /// </summary>
-        public decimal use_qty { get; set; }
+        public bool is_use { get; set; }
+    }
 
+    public class mo_occupy
+    {
         /// <summary>
-        /// 在制占用数量
+        /// 工单号
         /// </summary>
-        public decimal mo_qty { get; set; }
+        public string? moo_mo { get; set; }
 
         /// <summary>
-        /// 是否使用此物料
+        /// 占用量
         /// </summary>
-        public bool is_use { get; set; }
+        public decimal? moo_qty { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime? moo_stime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime? moo_etime { get; set; }
     }
 }

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

@@ -87,6 +87,6 @@ namespace Business.ResourceExamineManagement.Dto
         /// <summary>
         /// 替代关系展开
         /// </summary>
-        public List<BomChildExamineDto> substitutes { get; set; }
+        public List<BomChildExamineDto> BomChildExamineList { get; set; }
     }
 }

+ 45 - 14
MicroServices/Business/Business.Application/ResourceExamineManagement/CalcBomViewAppService.cs

@@ -106,6 +106,7 @@ namespace Business.ResourceExamineManagement
 
             level1Dto.needCount = level1Dto.qty * count;
             level1Dto.lack_qty = level1Dto.needCount - level1Dto.sqty;
+            level1Dto.self_lack_qty = level1Dto.lack_qty;
             //平铺需要数量
             CaclMaterialShortage(returnlist);
 
@@ -119,11 +120,32 @@ namespace Business.ResourceExamineManagement
                 if (mooccupylist.Any())
                 {
                     mooccupyAllList.AddRange(mooccupylist);
+                    //在制占用明细
+                    level1Dto.mo_occupy_list = new List<mo_occupy>();
+                    mooccupylist.ForEach(s =>
+                    {
+                        mo_occupy mooc = new mo_occupy();
+                        mooc.moo_mo = s.moo_mo;
+                        mooc.moo_stime = s.moo_ctime;
+                        mooc.moo_etime = s.moo_etime;
+                        mooc.moo_qty = s.moo_qty;
+                        level1Dto.mo_occupy_list.Add(mooc);
+                    });
                 }
-
+                //直接占用库存,缺料就生成采购
+                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;
+                itemStockoccupyDto.orderentry_id = sentrys.Id;
+                
                 decimal moo_qty = mooccupylist.Sum(s => s.moo_qty.GetValueOrDefault());
                 level1Dto.mo_qty = moo_qty;
-
+                if (moo_qty != 0)
+                {
+                    itemStockoccupyDto.quantity = moo_qty;
+                    sklist.Add(itemStockoccupyDto);
+                }
                 if (moo_qty == level1Dto.lack_qty)
                 {
                     //在制完全足够
@@ -170,7 +192,8 @@ namespace Business.ResourceExamineManagement
             CaleLackItem(level1Dto, childList, returnlist, sklist);
             //level1Dto.kz = childList.Min(s => s.kz);//得到最小可制数量。
             //再加个循环,来根据替代关系里的检查结果,根据规则明确使用和生成占用关系。
-            CalcIcitem(childList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
+            List<long> childidList = new List<long>();
+            CalcIcitem(childList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys, childidList);
             level1Dto.kitting_time = childList.Max(s => s.kitting_time);
             //这里更新产品得满足时间。
             if (mes_MorderDto != null)
@@ -285,6 +308,7 @@ namespace Business.ResourceExamineManagement
                 //判断状态
                 item.stock_state = item.lack_qty > 0 ? 0 : 1;
             }
+            item.self_lack_qty = item.lack_qty;
         }
 
         /// <summary>
@@ -298,18 +322,24 @@ namespace Business.ResourceExamineManagement
         /// <param name="sklist"></param>
         /// <param name="plan_date"></param>
         public void CalcIcitem(List<BomChildExamineDto> childList, List<BomChildExamineDto> returnlist, long bangid, SeorderentryDto input, List<mo_ic_item_stockoccupy> sklist, DateTime
-            ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys)
+            ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys, List<long> childidList)
         {
             foreach (var item in childList)
             {
                 var parent = returnlist.Find(s => s.id == item.parent_id);
                 if (parent.stock_state == 0)
                 {
+                    if (childidList.Contains(item.bom_child_id.GetValueOrDefault()))
+                    {
+                        continue;
+                    }
                     if (item.haveicsubs == 1)
                     {
                         //如果有替代关系,根据群组来明确使用哪个群组的替代料。按整批和混用逻辑来算
                         // 如果有群组替代,就移除掉被检查过的记录 item.icitem_ids
-                        CalcStrategy(item, returnlist, bangid, sklist, input, plan_date, icitemlist, sentrys);
+                        //通过替代群组代码,将替代群组物料进行绑定。
+                        childidList.AddRange(returnlist.Where(s => s.substitute_code == item.substitute_code).Select(d => d.bom_child_id.GetValueOrDefault()));
+                        CalcStrategy(item, returnlist, bangid, sklist, input, plan_date, icitemlist, sentrys, childidList);
                     }
                     else
                     {
@@ -322,7 +352,7 @@ namespace Business.ResourceExamineManagement
                         itemStockoccupyDto.item_no = item.num;
                         item.kitting_time = DateTime.Now;
                         item.is_use = true;
-                        StartProcessing(item, icitemlist, returnlist, plan_date, sentrys, sklist, itemStockoccupyDto, bangid, input);
+                        StartProcessing(item, icitemlist, returnlist, plan_date, sentrys, sklist, itemStockoccupyDto, bangid, input, childidList);
                     }
                 }
             }
@@ -341,7 +371,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="bangid"></param>
         /// <param name="input"></param>
         public void StartProcessing(BomChildExamineDto item, List<mo_ic_item> icitemlist, List<BomChildExamineDto> returnlist, DateTime
-            ? plan_date, crm_seorderentry sentrys, List<mo_ic_item_stockoccupy> sklist, mo_ic_item_stockoccupy itemStockoccupyDto, long bangid, SeorderentryDto input)
+            ? plan_date, crm_seorderentry sentrys, List<mo_ic_item_stockoccupy> sklist, mo_ic_item_stockoccupy itemStockoccupyDto, long bangid, SeorderentryDto input, List<long> childidList)
         {
             var parent = returnlist.Find(s => s.id == item.parent_id);
             if (item.lack_qty > 0)
@@ -376,7 +406,7 @@ namespace Business.ResourceExamineManagement
                         //先计算末级数据的齐套时间。
                         if (cilList.Count() > 0)
                         {
-                            CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
+                            CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys,  childidList);
                             item.kitting_time = cilList.Max(s => s.kitting_time);
                         }
 
@@ -412,7 +442,7 @@ namespace Business.ResourceExamineManagement
                     //先计算末级数据的齐套时间。
                     if (cilList.Count() > 0)
                     {
-                        CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys);
+                        CalcIcitem(cilList, returnlist, bangid, input, sklist, plan_date, icitemlist, sentrys, childidList);
                         item.kitting_time = cilList.Max(s => s.kitting_time);
                     }
                     //1.先生成委外工单。
@@ -444,7 +474,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="plan_date"></param>
         public void CalcStrategy(BomChildExamineDto item, List<BomChildExamineDto> returnlist, long bangid, List<mo_ic_item_stockoccupy> sklist, SeorderentryDto input, DateTime
-            ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys)
+            ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys, List<long> childidList)
         {
             //提取群组关系
             var sublist = returnlist.Where(s => s.parent_id == item.parent_id && s.num == item.num && s.level == item.level).OrderBy(c => c.substitute_all_num).ToList();
@@ -455,7 +485,7 @@ namespace Business.ResourceExamineManagement
                 case 0://整批
                     WholeBatchCheck(sublist, returnlist, sklist, select);
                     //如果都需要采购的情况下,则默认使用优先级最高的
-                    WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys);
+                    WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys, childidList);
                     break;
                 case 1://混用
                     MixedUse(item, sublist, returnlist, sklist, bangid, parent, input, plan_date, icitemlist, sentrys);
@@ -470,7 +500,7 @@ namespace Business.ResourceExamineManagement
                     else
                     {
                         //走整批
-                        WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys);
+                        WholeBatch(item, sublist, returnlist, sklist, select, bangid, parent, input, plan_date, icitemlist, sentrys, childidList);
                     }
                     break;
             }
@@ -523,7 +553,7 @@ namespace Business.ResourceExamineManagement
         /// <param name="input"></param>
         /// <param name="plan_date"></param>
         public void WholeBatch(BomChildExamineDto item, List<BomChildExamineDto> sublist, List<BomChildExamineDto> returnlist, List<mo_ic_item_stockoccupy> sklist, List<BomChildExamineDto> select, long bangid, BomChildExamineDto parent, SeorderentryDto input, DateTime
-            ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys)
+            ? plan_date, List<mo_ic_item> icitemlist, crm_seorderentry sentrys,List<long> childidList)
         {
             if (select.Count() == 0)
             {
@@ -548,7 +578,7 @@ namespace Business.ResourceExamineManagement
                 itemStockoccupyDto.icitem_id = slt.item_id;
                 itemStockoccupyDto.item_no = slt.num;
                 slt.is_use = true;
-                StartProcessing(slt, icitemlist, returnlist, plan_date, sentrys, sklist, itemStockoccupyDto, bangid, input);
+                StartProcessing(slt, icitemlist, returnlist, plan_date, sentrys, sklist, itemStockoccupyDto, bangid, input, childidList);
             }
 
         }
@@ -737,6 +767,7 @@ namespace Business.ResourceExamineManagement
             item.sqty = item.sqty - stockQty;
             item.lack_qty = parent.lack_qty * item.qty - item.sqty;
             item.lack_qty = item.lack_qty > 0 ? item.lack_qty : 0;
+            item.self_lack_qty = item.lack_qty;
             item.stock_state = item.lack_qty > 0 ? 0 : 1;
         }
 

+ 5 - 15
MicroServices/Business/Business.Application/ResourceExamineManagement/PretreatmentAppService.cs

@@ -8,6 +8,7 @@ using SixLabors.ImageSharp;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Cryptography;
 using System.Text;
 using System.Threading.Tasks;
 using Volo.Abp.Application.Services;
@@ -188,29 +189,16 @@ namespace Business.ResourceExamineManagement
             //除顶级外,其他层级关系全带出来。生成平铺
             foreach (var item in returnlist)
             {
-                //最顶级、虚拟件
+                //最顶级、虚拟件、已计算过的群组
                 if (item.level == 1 || item.erp_cls == 4 || childidList.Contains(item.bom_child_id.GetValueOrDefault()))
                 {
                     continue;
                 }
-                //有替代关系
+                //有替代关系
                 if (item.haveicsubs != 1)
                 {
                     continue;
                 }
-                if (!string.IsNullOrEmpty(item.icitem_ids))
-                {
-                    long cid = 1;
-                    var cids = item.icitem_ids.Split(',');
-                    foreach (var c in cids)
-                    {
-                        if (long.TryParse(c, out cid))
-                        {
-                            childidList.Add(cid);
-                        }
-                    }
-                }
-
 
                 //找到当前物料的替代群组关系集
                 var sl = sublist.Find(s => s.substitute_code == item.substitute_code);
@@ -229,6 +217,8 @@ namespace Business.ResourceExamineManagement
                             }
                             else
                             {
+                                //通过替代群组代码,将替代群组物料进行绑定。
+                                childidList.AddRange(returnlist.Where(s => s.substitute_code == item.substitute_code).Select(d => d.bom_child_id.GetValueOrDefault()));
                                 //将主料赋值上属性
                                 var dtlitem = returnlist.Find(s => s.item_id == dtl.icitem_id && s.level == item.level);
                                 dtlitem.substitute_all_num = sal.order_num;//群组优先级

+ 1 - 3
MicroServices/Business/Business.Application/ResourceExamineManagement/ResourceExamineAppService.cs

@@ -396,8 +396,6 @@ namespace Business.ResourceExamineManagement
                 //计算
                 _CalcBomViewAppService.CalcView(getBomList, bangid, item.qty.Value, input, item.plan_date, sklist, item, icitemlist);
 
-                
-
                 //TODO:最晚开始时间
                 var curFacDtl = leadTimeList.FirstOrDefault(p => p.item_id == childBom.icitem_id);
                 //最晚开工时间=订单行客户要求交期-运输提前期-库存提前期-生产提前期-下单提前期
@@ -405,7 +403,7 @@ namespace Business.ResourceExamineManagement
                 //物料齐套时间
                 dtl.kitting_times = getBomList.Where(p => p.is_use).OrderByDescending(m => m.kitting_time).First().kitting_time.GetValueOrDefault();
                 //替代关系展开list
-                dtl.substitutes = getBomList;
+                dtl.BomChildExamineList = getBomList;
                 //添加订单行开工信息
                 examines.Add(dtl);
                 //生成工单 TODO:0=产品数量