ProductExamineAppService.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. using Business.Core.MongoDBHelper;
  2. using Business.ResourceExamineManagement.Dto;
  3. using Business.Model.Production;
  4. using Business.Model.Tech;
  5. using Business.MongoModel.Production;
  6. using Business.MongoModel.Tech;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using Volo.Abp.Application.Services;
  13. using Volo.Abp.Domain.Repositories;
  14. namespace Business.ResourceExamineManagement
  15. {
  16. /// <summary>
  17. /// 产能检查
  18. /// </summary>
  19. public class ProductExamineAppService: ApplicationService
  20. {
  21. #region 服务
  22. /// <summary>
  23. /// 生产线明细表
  24. /// </summary>
  25. public List<ProdLineDetail> prodLines = new List<ProdLineDetail>();
  26. /// <summary>
  27. /// 标准工艺路径表
  28. /// </summary>
  29. public List<RoutingOpDetail> routingOps = new List<RoutingOpDetail>();
  30. /// <summary>
  31. /// 排产记录表
  32. /// </summary>
  33. public List<PeriodSequenceDet> periodSequences = new List<PeriodSequenceDet>();
  34. /// <summary>
  35. /// 工作日历
  36. /// </summary>
  37. public List<ShopCalendarWorkCtr> calendarWorks = new List<ShopCalendarWorkCtr>();
  38. /// <summary>
  39. /// 休息时间段
  40. /// </summary>
  41. public List<QualityLineWorkDetail> qualityLineWorks = new List<QualityLineWorkDetail>();
  42. /// <summary>
  43. /// 节假日
  44. /// </summary>
  45. public List<HolidayMaster> holidays = new List<HolidayMaster>();
  46. #endregion
  47. /// <summary>
  48. /// 构造函数
  49. /// </summary>
  50. public ProductExamineAppService()
  51. {
  52. }
  53. /// <summary>
  54. /// 产能计算-批量
  55. /// </summary>
  56. /// <param name="param">产能检查入参</param>
  57. /// <returns>生产时长(天)</returns>
  58. public DateTime ProductiveExamine(ProdExamineParamDto param)
  59. {
  60. //生产结束时间
  61. DateTime planEnd = param.PlanStart.Date;
  62. if (param.QtyOrd <= 0)
  63. {
  64. return planEnd;
  65. }
  66. //获取当前产品的工艺路线:主产线,最后一道工序
  67. var curRoutingOps = routingOps.Where(p => p.RoutingCode == param.ItemNum && p.ParentOp == 0).OrderByDescending(p => p.Op).ToList();
  68. if (curRoutingOps.Count() == 0)
  69. {
  70. return planEnd;
  71. }
  72. var lastOp = curRoutingOps.Last();
  73. //获取产线
  74. var curProdLine = prodLines.FirstOrDefault(p => p.Part == param.ItemNum && p.Op == lastOp.Op);
  75. if (curProdLine == null)
  76. {
  77. return planEnd;
  78. }
  79. //获取产线工作日历
  80. var curCalendars = calendarWorks.Where(p => p.ProdLine == curProdLine.Line).ToList();
  81. if (curCalendars.Count() == 0 || curCalendars.Count() != 0)
  82. {
  83. return planEnd;
  84. }
  85. //获取产线休息时间
  86. var curqualityLines = qualityLineWorks.Where(p=>p.ProdLine == curProdLine.Line).ToList();
  87. //生产数量
  88. decimal sumAmount = 0m;
  89. do
  90. {
  91. //获取工作日
  92. planEnd = GetNextWorkDay(planEnd, curCalendars);
  93. //计算工作日的产能
  94. sumAmount += CalcCapacity(planEnd, curProdLine, curCalendars, curqualityLines);
  95. planEnd.AddDays(1);
  96. } while (sumAmount < param.QtyOrd);
  97. return planEnd.AddDays(-1);
  98. }
  99. /// <summary>
  100. /// 获取工作日
  101. /// </summary>
  102. /// <param name="weekDay">当前周几</param>
  103. /// <param name="startTime">开始时间:年-月-日</param>
  104. /// <param name="curCalendars">当前产线的工作日历</param>
  105. /// <returns></returns>
  106. public DateTime GetNextWorkDay(DateTime startTime, List<ShopCalendarWorkCtr> curCalendars)
  107. {
  108. DateTime rtnData = startTime;
  109. int weekDay = (int)startTime.DayOfWeek;
  110. var calendar = curCalendars.FirstOrDefault(p => p.WeekDay == weekDay);
  111. //判断当天是否是工作日
  112. if (weekDay == 0 || weekDay == 6)//周六,周日
  113. {
  114. if (!holidays.Exists(p => p.Dated.GetValueOrDefault().Date == startTime && p.Ufld1 == "调班"))//今天是周末
  115. {
  116. //递归继续找下一个工作日
  117. rtnData = GetNextWorkDay(startTime.AddDays(1), curCalendars);
  118. return rtnData;
  119. }
  120. return rtnData;
  121. }
  122. //今天不是周六周日,需要判断是不是节假日
  123. if (holidays.Exists(p => p.Dated.GetValueOrDefault().Date == startTime && p.Ufld1 == "休假"))//是节假日
  124. {
  125. //递归继续找下一个工作日
  126. rtnData = GetNextWorkDay(startTime.AddDays(1), curCalendars);
  127. return rtnData;
  128. }
  129. return rtnData;
  130. }
  131. /// <summary>
  132. /// 计算当天的产能
  133. /// </summary>
  134. /// <param name="startTime"></param>
  135. /// <param name="prodLine"></param>
  136. /// <param name="curCalendars"></param>
  137. /// <param name="curQualityLines"></param>
  138. /// <returns></returns>
  139. public decimal CalcCapacity(DateTime startTime,ProdLineDetail prodLine, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQualityLines)
  140. {
  141. decimal sumQty = 0m;
  142. //获取休息时长(分钟)
  143. decimal sumResrt = curQualityLines.Sum(p => p.RestTime);
  144. //获取当天的工作时长(分钟)
  145. decimal workTime = curCalendars.First(p => p.WeekDay == (int)startTime.DayOfWeek).ShiftsHours1 * 60;
  146. //计算产能
  147. sumQty = (workTime - sumResrt) / 60 * prodLine.Rate;
  148. return sumQty;
  149. }
  150. }
  151. }