MonthlyCapacityLoadAppService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. using Abp.Application.Services;
  2. using Business.Core.Utilities;
  3. using Business.Dto;
  4. using Business.EntityFrameworkCore;
  5. using Business.EntityFrameworkCore.SqlRepositories;
  6. using Business.Model.MES.IC;
  7. using Business.Model.Production;
  8. using Business.Model.SRM;
  9. using Business.MongoModel.MES.IC;
  10. using Business.MongoModel.Production;
  11. using Business.MongoModel.SRM;
  12. using Business.ResourceExamineManagement;
  13. using Business.SaleForecast;
  14. using Microsoft.CodeAnalysis.CSharp.Syntax;
  15. using Microsoft.EntityFrameworkCore.Migrations;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Linq;
  19. using System.Text;
  20. using System.Threading.Tasks;
  21. using Volo.Abp.DependencyInjection;
  22. using Volo.Abp.Domain.Repositories;
  23. using Volo.Abp.MultiTenancy;
  24. using Volo.Abp.Uow;
  25. namespace Business.SaleForecastManagement
  26. {
  27. /// <summary>
  28. /// 产能分析
  29. /// </summary>
  30. public class MonthlyCapacityLoadAppService : ApplicationService, IMonthlyCapacityLoadAppService, ITransientDependency
  31. {
  32. //#region 服务
  33. ///// <summary>
  34. ///// 物料
  35. ///// </summary>
  36. //private IRepository<ic_item, long> _ic_item;
  37. ///// <summary>
  38. ///// 整体需求计划明细
  39. ///// </summary>
  40. //private ISqlRepository<OverallDemandPlanDtl> _overallDemandPlanDtl;
  41. ///// <summary>
  42. ///// 生产线明细
  43. ///// </summary>
  44. //private ISqlRepository<ProdLineDetail> _prodLineDetail;
  45. ///// <summary>
  46. ///// 工作日历数据
  47. ///// </summary>
  48. //private ISqlRepository<ShopCalendarWorkCtr> _shopCalendarWorkCtr;
  49. ///// <summary>
  50. ///// 产线休息时间记录表
  51. ///// </summary>
  52. //private ISqlRepository<QualityLineWorkDetail> _qualityLineWorkDetail;
  53. ///// <summary>
  54. ///// 节假日记录表
  55. ///// </summary>
  56. //private ISqlRepository<HolidayMaster> _holidayMaster;
  57. ///// <summary>
  58. ///// 月度产能共识主表
  59. ///// </summary>
  60. //private ISqlRepository<MonthlyProdCapacityMain> _monthlyProdCapacityMain;
  61. ///// <summary>
  62. ///// 月度产能共识明细表
  63. ///// </summary>
  64. //private ISqlRepository<MonthlyProdCapacityDtl> _monthlyProdCapacityDtl;
  65. ///// <summary>
  66. ///// 标准物料规格型号设置表
  67. ///// </summary>
  68. //private ISqlRepository<StandardItemModelSet> _standardItemModelSet;
  69. ///// <summary>
  70. ///// 工作单元
  71. ///// </summary>
  72. //private readonly IUnitOfWorkManager _unitOfWorkManager;
  73. ///// <summary>
  74. ///// 日志
  75. ///// </summary>
  76. //private readonly ICurrentTenant _currentTenant;
  77. ///// <summary>
  78. ///// 雪花算法
  79. ///// </summary>
  80. //SnowFlake help = new SnowFlake();
  81. //#endregion
  82. //#region 构造函数
  83. ///// <summary>
  84. ///// 构造函数
  85. ///// </summary>
  86. //public MonthlyCapacityLoadAppService(
  87. // IRepository<ic_item, long> ic_item,
  88. // ISqlRepository<OverallDemandPlanDtl> overallDemandPlanDtl,
  89. // ISqlRepository<ProdLineDetail> prodLineDetail,
  90. // ISqlRepository<ShopCalendarWorkCtr> shopCalendarWorkCtr,
  91. // ISqlRepository<QualityLineWorkDetail> qualityLineWorkDetail,
  92. // ISqlRepository<HolidayMaster> holidayMaster,
  93. // ISqlRepository<MonthlyProdCapacityMain> monthlyProdCapacityMain,
  94. // ISqlRepository<MonthlyProdCapacityDtl> monthlyProdCapacityDtl,
  95. // IUnitOfWorkManager unitOfWorkManager,
  96. // ICurrentTenant currentTenant,
  97. // ISqlRepository<StandardItemModelSet> standardItemModelSet
  98. // )
  99. //{
  100. // _ic_item= ic_item;
  101. // _overallDemandPlanDtl= overallDemandPlanDtl;
  102. // _prodLineDetail= prodLineDetail;
  103. // _shopCalendarWorkCtr= shopCalendarWorkCtr;
  104. // _qualityLineWorkDetail= qualityLineWorkDetail;
  105. // _holidayMaster= holidayMaster;
  106. // _monthlyProdCapacityMain= monthlyProdCapacityMain;
  107. // _monthlyProdCapacityDtl= monthlyProdCapacityDtl;
  108. // _unitOfWorkManager= unitOfWorkManager;
  109. // _currentTenant= currentTenant;
  110. // _standardItemModelSet= standardItemModelSet;
  111. //}
  112. //#endregion
  113. ///// <summary>
  114. ///// 产能分析
  115. ///// </summary>
  116. ///// <param name="input"></param>
  117. ///// <returns></returns>
  118. ///// <exception cref="NotImplementedException"></exception>
  119. //public async Task<string> CapacityAnalysis(InputDto input)
  120. //{
  121. // //1、获取数据
  122. // //1.1 根据年、月、版本号获取整体需求计划明细
  123. // List<OverallDemandPlanDtl> planDtls = _overallDemandPlanDtl.Select(p => p.Year == input.year && p.Month == input.month && p.Version == input.version && p.tenant_id == input.tenant_id && p.factory_id == input.factory_id).OrderBy(p => p.ProdLine).ThenBy(p => p.ProdRange).ThenBy(p => p.Model).ThenBy(p => p.PlanDate).ToList();
  124. // //1.2 根据规格型号获取物料数据
  125. // List<string> models = planDtls.Select(p => p.Model).Distinct().ToList();
  126. // List<StandardItemModelSet> standards = _standardItemModelSet.Select(p => models.Contains(p.Model) && p.tenant_id == input.tenant_id && p.factory_id == input.factory_id);
  127. // //1.3 根据物料编码获取产线数据
  128. // List<ProdLineDetail> lines = _prodLineDetail.Select(p => standards.Select(m => m.ItemNumber).Contains(p.Part) && p.Domain == input.factory_id.ToString() && p.IsActive);
  129. // //1.4 根据产线获取工作日历数据和产线休息配置数据
  130. // List<ShopCalendarWorkCtr> calendars = _shopCalendarWorkCtr.Select(p => lines.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
  131. // List<QualityLineWorkDetail> lineWorks = _qualityLineWorkDetail.Select(p => lines.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
  132. // //1.5 获取当前年和下一年的节假日配置数据
  133. // List<HolidayMaster> holidays = _holidayMaster.Select(p => (p.Dated.Value.Year == input.year || p.Dated.Value.Year == (input.year + 1)) && p.Domain == input.factory_id.ToString() && p.IsActive);
  134. // //月度产能共识主表
  135. // List<MonthlyProdCapacityMain> capacityMains = new List<MonthlyProdCapacityMain>();
  136. // //月度产能共识明细表
  137. // List<MonthlyProdCapacityDtl> capacityDtls = new List<MonthlyProdCapacityDtl>();
  138. // foreach (var item in planDtls)
  139. // {
  140. // //获取当前产品的生产线
  141. // var std = standards.FirstOrDefault(p => p.Model == item.Model);
  142. // if (std == null)
  143. // {
  144. // new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "规格型号【" + item.Model + "】没有维护标准物料数据", _currentTenant.Id.ToString());
  145. // return "NO|规格型号【" + item.Model + "】没有维护标准物料数据,请维护后再发布!";
  146. // }
  147. // var curLines = lines.Where(p => p.Part == std.ItemNumber).OrderBy(p => p.Line).ToList();
  148. // //过滤产线
  149. // var distLines = curLines.Select(p => p.Line).Distinct().ToList();
  150. // if (distLines.Count == 0)
  151. // {
  152. // new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "物料【" + std.ItemNumber + "】没有维护产线数据", _currentTenant.Id.ToString());
  153. // return "NO|物料【" + std.ItemNumber + "】没有维护产线数据,请维护后再发布!";
  154. // }
  155. // foreach (var dl in distLines)
  156. // {
  157. // //添加月度产能共识主表数据
  158. // MonthlyProdCapacityMain main = new MonthlyProdCapacityMain();
  159. // main.Id = help.NextId();
  160. // main.Version = input.version;//整体需求计划版本号
  161. // main.Year = Convert.ToInt16(item.PlanDate.Substring(0, 4));
  162. // main.Month = Convert.ToInt16(item.PlanDate.Substring(4, 2));
  163. // main.ProdRange = item.ProdRange;
  164. // main.Model = item.Model;
  165. // main.ProdQty = item.Qty;
  166. // main.ProdLine = dl;
  167. // main.Qty = item.Qty;
  168. // main.tenant_id = item.tenant_id;
  169. // main.factory_id = item.factory_id;
  170. // main.Version = item.Version;
  171. // main.CreateTime = DateTime.Now;
  172. // capacityMains.Add(main);
  173. // //添加月度产能共识产能效率数据
  174. // MonthlyProdCapacityDtl dtl = new MonthlyProdCapacityDtl();
  175. // dtl.MainId = main.Id;
  176. // dtl.Version = input.version;
  177. // dtl.Year = main.Year;
  178. // dtl.Month = main.Month;
  179. // dtl.ProdLine = dl;
  180. // //计算每天工作时间
  181. // var curCal = calendars.FirstOrDefault(p => p.ProdLine == dl);
  182. // if (curCal == null)
  183. // {
  184. // continue;
  185. // }
  186. // dtl.DailyWorks = curCal.ShiftsHours1;
  187. // dtl.FlightQty = 1;
  188. // //计算当月工作天数
  189. // var curHoildays = holidays.Where(p => p.Dated.Value.Year == main.Year && p.Dated.Value.Month == main.Month).ToList();
  190. // //当月天数
  191. // int days = DateTime.DaysInMonth(main.Year.Value, main.Month.Value);
  192. // //当月周末天数
  193. // int weekDays = CalcWeekDays(days, Convert.ToDateTime(main.Year.ToString() + "-" + main.Month.ToString() + "-01"));
  194. // dtl.YearWorks = days - weekDays - curHoildays.Where(p => p.Ufld1 == "休假").Count() + curHoildays.Where(p => p.Ufld1 == "调班").Count();
  195. // dtl.AvailableTimes = dtl.DailyWorks * dtl.FlightQty * dtl.YearWorks;
  196. // //计算产线耗时
  197. // var line = curLines.Where(p => p.Line == dl).OrderByDescending(p => p.Op).First();
  198. // dtl.NeedWorks = line.Rate == 0 ? 0 : (Math.Ceiling(main.Qty.GetValueOrDefault() / line.Rate));
  199. // dtl.ProdRate = 100;
  200. // dtl.Rate = dtl.AvailableTimes == 0 ? 0 : Math.Floor(dtl.NeedWorks.GetValueOrDefault() / dtl.AvailableTimes.GetValueOrDefault() * 100);
  201. // dtl.IsOverTime = dtl.NeedWorks > dtl.YearWorks ? "是" : "否";
  202. // dtl.OverTimes = dtl.IsOverTime == "是" ? (dtl.NeedWorks - dtl.YearWorks) : 0;
  203. // dtl.tenant_id = main.tenant_id;
  204. // dtl.factory_id = main.factory_id;
  205. // capacityDtls.Add(dtl);
  206. // }
  207. // }
  208. // //保存数据
  209. // using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
  210. // {
  211. // try
  212. // {
  213. // //先删除数据
  214. // _monthlyProdCapacityMain.Delete(p => p.tenant_id == input.tenant_id && p.factory_id == input.factory_id && p.Version.Contains(input.version.Substring(0, 7)));
  215. // _monthlyProdCapacityDtl.Delete(p => p.tenant_id == input.tenant_id && p.factory_id == input.factory_id && p.Version.Contains(input.version.Substring(0, 7)));
  216. // //插入数据
  217. // _monthlyProdCapacityMain.Insert(capacityMains);
  218. // _monthlyProdCapacityDtl.Insert(capacityDtls);
  219. // await unitOfWork.CompleteAsync();
  220. // }
  221. // catch (Exception e)
  222. // {
  223. // unitOfWork.Dispose();
  224. // new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "生成【" + input.year + "年" + input.month + "月】月度产能共识失败:" + e.Message, _currentTenant.Id.ToString());
  225. // return "NO|" + e.Message;
  226. // };
  227. // }
  228. // return "OK|发布成功!";
  229. //}
  230. ///// <summary>
  231. ///// 计算当月有多少个周末
  232. ///// </summary>
  233. ///// <param name="days"></param>
  234. ///// <param name="startDay"></param>
  235. ///// <returns></returns>
  236. //private int CalcWeekDays(int days, DateTime startDay)
  237. //{
  238. // int sumDays = 0;
  239. // for (int i = 0; i < days; i++)
  240. // {
  241. // int weekDays = (int)startDay.AddDays(i).DayOfWeek;
  242. // if (weekDays == 0 || weekDays == 6)
  243. // {
  244. // sumDays++;
  245. // }
  246. // }
  247. // return sumDays;
  248. //}
  249. }
  250. }