Procházet zdrojové kódy

产能检查调整

heteng před 3 roky
rodič
revize
3a86f81d46

+ 35 - 0
MicroServices/Business/Business.Application.Contracts/ResourceExamineManagement/Dto/TechProcDto.cs

@@ -0,0 +1,35 @@
+using Bussiness.Model.Tech;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Business.ResourceExamineManagement.Dto
+{
+    /// <summary>
+    /// 工艺路径处理Dto
+    /// </summary>
+    public class TechProcDto
+    {
+        /// <summary>
+        /// 工艺路径序号
+        /// </summary>
+        public int serialno { get; set; }
+
+        /// <summary>
+        /// 工艺路径
+        /// </summary>
+        public List<mes_tech_process> processes { get; set; }
+
+        /// <summary>
+        /// 工序详细情况
+        /// </summary>
+        public List<StartTimeDto> details { get; set; }
+
+        /// <summary>
+        /// 当前工序耗时
+        /// </summary>
+        public decimal sumTimes { get; set; }
+    }
+}

+ 65 - 25
MicroServices/Business/Business.Application/ResourceExamineManagement/ProductExamineAppService.cs

@@ -107,25 +107,15 @@ namespace Business.ResourceExamineManagement
             List<mes_tech_proc_workshop> tech_Proc_Workshops = await _mes_tech_proc_workshop.GetManyByCondition(p => techProcIds.Contains(p.tech_proc_id.Value) && p.tenant_id == param.tenantId && p.factory_id == param.factoryId && !p.IsDeleted);
             #endregion
 
-            //1、获取工艺路径下的第一层级工序
-            List<mes_tech_process> fistChilds = tech_Processes.Where(p => p.parentprocid == tech.Id).ToList();
-            if (fistChilds.Count == 0)
+            //1、获取工艺路径下的第一层级工序:目前只考虑第一层级
+            List<mes_tech_process> fistLevels = tech_Processes.Where(p => p.parentprocid == tech.Id).ToList();
+            if (fistLevels.Count == 0)
             {
                 throw new NotImplementedException("当前工艺路径没有配置工序,请调整!");
             }
-            List<mes_tech_process> sortChilds = new List<mes_tech_process>();
-            //添加最后一个工序
-            var last = fistChilds.FirstOrDefault(p => p.nextprocid == null);
-            if (last == null)
-            {
-                throw new NotImplementedException("当前工艺路径没有配置最终工序,请调整!");
-            }
-            sortChilds.Add(last);
-            //递归按工序先后顺序排序
-            SortProcess(fistChilds, last.proc_id.Value, sortChilds);
-            //总耗时(分钟)
-            //decimal sumTimes = CalcTakeTimeByLq(sortChilds, param.packages);//通过Lq计算
-            decimal sumTimes = CalcTakeTimeByLqt(sortChilds, param.packages);//通过Lqt计算
+            //工艺预处理
+            List<TechProcDto> teches = TechProcPretreatment(fistLevels,param.packages);
+            decimal sumTimes = teches.OrderByDescending(p => p.sumTimes).First().sumTimes;
             return sumTimes;
         }
 
@@ -145,15 +135,69 @@ namespace Business.ResourceExamineManagement
             }
         }
 
+        /// <summary>
+        /// 工序预处理,按照多分支生成多条单独的工艺路径
+        /// </summary>
+        /// <param name="proc">当前工序</param>
+        /// <param name="processes">工艺关联工序list</param>
+        /// <param name="packages">生产件数</param>
+        /// <returns></returns>
+        private List<TechProcDto> TechProcPretreatment(List<mes_tech_process> processes,int packages)
+        { 
+            //工艺路径预处理dto
+            List<TechProcDto> techProcDtos = new List<TechProcDto>();
+            TechProcDto dto;
+            //获取下一步工序id
+            List<long> nextProcIds = processes.Select(p => p.nextprocid.Value).ToList();
+            //获取起点工序
+            var startProcs = processes.Where(p => !nextProcIds.Contains(p.proc_id.Value)).ToList();
+            //递归处理工序返回值
+            List<mes_tech_process> rtnList;
+            for (int i = 0; i < startProcs.Count; i++)
+            {
+                dto = new TechProcDto();
+                rtnList = new List<mes_tech_process>();
+                GetNextProc(startProcs[i], processes, rtnList);
+                dto.serialno = i;
+                dto.processes = rtnList;
+                //dto.startTimes = CalcTakeTimeByLq(rtnList, packages);//通过Lq计算
+                dto.details = CalcTakeTimeByLqt(rtnList, packages);//通过Lqt计算
+                dto.sumTimes = dto.details.Sum(p=>p.wait_time);
+            }
+            return techProcDtos;
+        }
+
+        /// <summary>
+        /// 递归:根据起始工序,获取后续工序
+        /// </summary>
+        /// <param name="proc"></param>
+        /// <param name="processes"></param>
+        /// <param name="rtnList"></param>
+        private void GetNextProc(mes_tech_process proc, List<mes_tech_process> processes, List<mes_tech_process> rtnList)
+        {
+            rtnList.Add(proc);
+            //下一工序id为null,终止
+            if (proc?.nextprocid == null)
+            {
+                return;
+            }
+            //获取下一个工序
+            var nextProc = processes.FirstOrDefault(p=>p.proc_id == proc.nextprocid);
+            if (nextProc == null) 
+            {
+                return;
+            }
+            GetNextProc(nextProc, processes, rtnList);
+        }
+
         /// <summary>
         /// 通过Lq计算工艺耗时
         /// </summary>
         /// <param name="Processes"></param>
         /// <param name="packages"></param>
         /// <returns></returns>
-        private decimal CalcTakeTimeByLq(List<mes_tech_process> Processes, int packages)
+        private List<StartTimeDto> CalcTakeTimeByLq(List<mes_tech_process> Processes, int packages)
         {
-            decimal sumTimes = 0.00m;//总耗时(分钟)
             //工序需要等待时间记录
             List<StartTimeDto> starts = new List<StartTimeDto>();
             StartTimeDto dto;
@@ -169,11 +213,10 @@ namespace Business.ResourceExamineManagement
                 {
                     dto = CalcProcTakeTimeByLq(chd, chd.lq.Value, packages);
                 }
-                sumTimes += dto.wait_time;
                 //添加记录
                 starts.Add(dto);
             }
-            return sumTimes;
+            return starts;
         }
 
         /// <summary>
@@ -215,10 +258,8 @@ namespace Business.ResourceExamineManagement
         /// <param name="Processes"></param>
         /// <param name="packages"></param>
         /// <returns></returns>
-        private decimal CalcTakeTimeByLqt(List<mes_tech_process> Processes, int packages)
+        private List<StartTimeDto> CalcTakeTimeByLqt(List<mes_tech_process> Processes, int packages)
         {
-            //总耗时
-            decimal sumTimes = 0;
             //工序需要等待时间记录
             List<StartTimeDto> starts = new List<StartTimeDto>();
             StartTimeDto dto;
@@ -240,11 +281,10 @@ namespace Business.ResourceExamineManagement
                 {
                     dto.wait_time = chd.lqt.Value;
                 }
-                sumTimes += dto.wait_time;
                 //添加记录
                 starts.Add(dto);
             }
-            return sumTimes;
+            return starts;
         }
 
         /// <summary>