ProductionScheduleAppService.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using Business.Business.Dto;
  2. using Bussiness.Model.MES.IC;
  3. using Bussiness.Model.Production;
  4. using Bussiness.Model.SRM;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using Volo.Abp.Application.Services;
  11. using Volo.Abp.Domain.Repositories;
  12. using Volo.Abp.Validation.Localization;
  13. namespace Business.Quartz
  14. {
  15. /// <summary>
  16. /// 生产排产服务
  17. /// </summary>
  18. public class ProductionScheduleAppService : ApplicationService
  19. {
  20. /// <summary>
  21. /// 物料
  22. /// </summary>
  23. private IRepository<ItemMaster, long> _itemMaster;
  24. /// <summary>
  25. /// 工单
  26. /// </summary>
  27. private IRepository<WorkOrdMaster, long> _workOrdMaster;
  28. /// <summary>
  29. /// 工单物料明细
  30. /// </summary>
  31. private IRepository<WorkOrdDetail, long> _workOrdDetail;
  32. /// <summary>
  33. /// 工单工艺路线明细
  34. /// </summary>
  35. private IRepository<WorkOrdRouting, long> _workOrdRouting;
  36. /// <summary>
  37. /// 库存主数据
  38. /// </summary>
  39. private IRepository<InvMaster, long> _invMaster;
  40. /// <summary>
  41. /// 生产线明细
  42. /// </summary>
  43. private IRepository<ProdLineDetail, long> _prodLineDetail;
  44. /// <summary>
  45. /// 生产周期明细
  46. /// </summary>
  47. private IRepository<PeriodSequenceDet, long> _periodSequenceDet;
  48. /// <summary>
  49. /// 排产结果明细
  50. /// </summary>
  51. private IRepository<ScheduleResultOpMaster, long> _scheduleResultOpMaster;
  52. /// <summary>
  53. /// 构造函数
  54. /// </summary>
  55. public ProductionScheduleAppService(
  56. IRepository<ItemMaster, long> itemMaster,
  57. IRepository<WorkOrdMaster, long> workOrdMaster,
  58. IRepository<WorkOrdDetail, long> workOrdDetail,
  59. IRepository<WorkOrdRouting, long> workOrdRouting,
  60. IRepository<ProdLineDetail, long> prodLineDetail,
  61. IRepository<PeriodSequenceDet, long> periodSequenceDet,
  62. IRepository<ScheduleResultOpMaster, long> scheduleResultOpMaster,
  63. IRepository<InvMaster, long> invMaster
  64. )
  65. {
  66. _itemMaster= itemMaster;
  67. _workOrdMaster= workOrdMaster;
  68. _workOrdDetail= workOrdDetail;
  69. _workOrdRouting= workOrdRouting;
  70. _prodLineDetail = prodLineDetail;
  71. _periodSequenceDet = periodSequenceDet;
  72. _scheduleResultOpMaster= scheduleResultOpMaster;
  73. _invMaster= invMaster;
  74. }
  75. /// <summary>
  76. /// 执行生产排产
  77. /// </summary>
  78. public async void DoExt()
  79. {
  80. await DoProductShcedule();
  81. }
  82. /// <summary>
  83. /// 生产排产
  84. /// </summary>
  85. public async Task DoProductShcedule()
  86. {
  87. //1、获取需要排产的工单:Status为空且IsActive==1
  88. List<WorkOrdMaster> workOrds = _workOrdMaster.GetListAsync(p => string.IsNullOrEmpty(p.Status) && p.IsActive ==1).Result;
  89. if (workOrds.Count == 0)
  90. {
  91. return;
  92. }
  93. //2、获取数据
  94. //获取工单工艺路径数据
  95. List<WorkOrdRouting> workOrdRoutings = _workOrdRouting.GetListAsync(p => workOrds.Select(m=>m.WorkOrd).Contains(p.WorkOrd) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
  96. //获取物料对应的生产线信息:物料、工序对应的生产线
  97. List<ProdLineDetail> prodLineDetails = _prodLineDetail.GetListAsync(p => workOrds.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == "1001" && p.Status != "C" && p.IsActive == 1).Result;
  98. //获取当前日期往后的排产记录数据
  99. List<ScheduleResultOpMaster> schedules = _scheduleResultOpMaster.GetListAsync(p=>workOrds.Select(m=>m.ItemNum).Contains(p.ItemNum) && p.Domain == "1001").Result;
  100. //3、工序预处理
  101. List<WorkOrdRoutingDto> routingDtos = ProcPretreatment(workOrdRoutings);
  102. //3、排产
  103. //排产结果(记录所有工序的排产情况)
  104. List<ScheduleResultOpMaster> scheduleResults = new List<ScheduleResultOpMaster>();
  105. //生产周期(记录最后一个工序的排产情况)
  106. List<PeriodSequenceDet> periodsDet = new List<PeriodSequenceDet>();
  107. foreach (var item in workOrds)
  108. {
  109. }
  110. }
  111. /// <summary>
  112. /// 工单工艺路线预处理
  113. /// </summary>
  114. /// <param name="WoRuntings"></param>
  115. /// <returns></returns>
  116. public List<WorkOrdRoutingDto> ProcPretreatment(List<WorkOrdRouting> woRuntings)
  117. {
  118. List<WorkOrdRoutingDto> routingDtos = new List<WorkOrdRoutingDto>();
  119. //取主工序(第一层级工序)
  120. var firsts = woRuntings.Where(p=>p.ParentOp == 0).ToList();
  121. if (firsts.Count == 0)
  122. {
  123. return routingDtos;
  124. }
  125. WorkOrdRoutingDto dto;
  126. foreach (var item in firsts)
  127. {
  128. dto = new WorkOrdRoutingDto();
  129. dto.Op = item.OP;
  130. dto.ParentOp= item.ParentOp;
  131. dto.level = 1;
  132. dto.RunTime = item.RunTime;
  133. routingDtos.Add(dto);
  134. }
  135. //递归处理其他层级工序
  136. RecursionProc(woRuntings, firsts, 1, routingDtos);
  137. return routingDtos;
  138. }
  139. /// <summary>
  140. /// 递归处理工序
  141. /// </summary>
  142. /// <param name="woRuntings">工单工序</param>
  143. /// <param name="curLevels">上-层级工序</param>
  144. /// <param name="level">层级</param>
  145. /// <param name="routingDtos">返回结果</param>
  146. public void RecursionProc(List<WorkOrdRouting> woRuntings, List<WorkOrdRouting> preLevels, int level, List<WorkOrdRoutingDto> routingDtos)
  147. {
  148. //获取当前层级工序
  149. var curLevels = woRuntings.Where(p => preLevels.Select(m=>m.OP).Contains(p.ParentOp)).ToList();
  150. if (curLevels.Count() == 0)
  151. {
  152. return;
  153. }
  154. foreach (var item in curLevels)
  155. {
  156. var dto = new WorkOrdRoutingDto();
  157. dto.Op = item.OP;
  158. dto.ParentOp = item.ParentOp;
  159. dto.level = level + 1;
  160. dto.RunTime = item.RunTime;
  161. routingDtos.Add(dto);
  162. }
  163. RecursionProc(woRuntings, curLevels, level + 1, routingDtos);
  164. }
  165. }
  166. }