using Business.Core.Utilities; using Business.Domain; using Business.Dto; using Business.EntityFrameworkCore.SqlRepositories; using Business.ResourceExamineManagement; using Business.StructuredDB.MES; using Business.StructuredDB.SaleFcst; using Business.StructuredDB.WMS; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; using Volo.Abp.Uow; using IUnitOfWorkManager = Volo.Abp.Uow.IUnitOfWorkManager; namespace Business.MES { //DOP public class SyncMESAppService : ApplicationService, ISyncMESAppService, ITransientDependency { #region 服务 /// /// 生产日计划 /// private readonly IRepository _producedailyplan; /// /// 工单表 /// private readonly IRepository _morder; /// /// 工单 /// private ISqlRepository _workOrdMaster; /// /// 生产线明细表 /// private ISqlRepository _prodLineDetail; /// /// 生产线数据 /// private ISqlRepository _lineMaster; /// /// 工作日历 /// private ISqlRepository _shopCalendarWorkCtr; /// /// 雪花算法 /// SnowFlake snowFlake = new SnowFlake(); /// /// 事务 /// private readonly IUnitOfWorkManager _unitOfWorkManager; /// /// 生产排产 /// private readonly ProductionScheduleAppService _productionScheduleAppService; /// /// 产线休息时间记录表 /// private ISqlRepository _qualityLineWorkDetail; #endregion #region 构造函数 /// /// 构造函数 /// public SyncMESAppService( IRepository mes_producedailyplan, IRepository mes_morder, ISqlRepository workOrdMaster, ISqlRepository prodLineDetail, ISqlRepository lineMaster, ISqlRepository shopCalendarWorkCtr, ISqlRepository qualityLineWorkDetail, IUnitOfWorkManager unitOfWorkManager, ProductionScheduleAppService productionScheduleAppService, ICurrentTenant currentTenant ) { _producedailyplan = mes_producedailyplan; _morder = mes_morder; _workOrdMaster = workOrdMaster; _prodLineDetail = prodLineDetail; _lineMaster = lineMaster; _shopCalendarWorkCtr = shopCalendarWorkCtr; _unitOfWorkManager = unitOfWorkManager; _qualityLineWorkDetail = qualityLineWorkDetail; _productionScheduleAppService = productionScheduleAppService; } #endregion /// /// 生成日计划 /// /// public void SavaProducedailyplanData(long factory_id) { //var workOrd = _workOrdMaster.Select(x => x.IsActive == true && x.Status == "初始" && x.Domain == factory_id.ToString()).OrderBy(x => x.OrdDate); //var morder = _morder.GetListAsync(x => x.IsDeleted == true && workOrd.Select(p => p.WorkOrd).Contains(x.morder_no)); //var prodLine = _prodLineDetail.Select(x => workOrd.Select(p => p.ItemNum).Contains(x.Part) && x.IsActive == true && x.Domain == factory_id.ToString()).ToList().OrderBy(y=>y.Sequence); } #region 注释 /// /// 计算工厂产能 /// /// 开始时间 /// 结束时间 //public void FactoryCapacity(DateTime StartDataTime, DateTime EndDataTime, long factory_id) //{ // var LineData = _lineMaster.Select(x => x.IsActive == true && x.Domain == factory_id.ToString()).ToList(); // var shopCalendarWorkCtr = _shopCalendarWorkCtr.Select(x => (LineData.Select(p => p.Line).Contains(x.ProdLine) || x.ProdLine == "") && x.IsActive == true && x.Domain == factory_id.ToString()).ToList(); // //获取产线休息记录数据 // var qualityLines = _qualityLineWorkDetail.Select(p => p.Domain == factory_id.ToString() && p.IsActive); // foreach (var item in LineData) // { // //当前日期 // DateTime actStart = StartDataTime; // var datatime = (EndDataTime - EndDataTime).Days; // //当前产线的每天休息时间记录 // var mlqtyWorkDtls = qualityLines.Where(p => p.ProdLine == item.Line).OrderBy(p => p.Line).ToList(); // for (int i = 0; i < datatime; i++) // { // //查询生产线是否配置工作日历 // var data = shopCalendarWorkCtr.Where(x => x.ProdLine == item.Line).ToList(); // if (data != null) // { // //有配置 根据配置时长计算 // } // else // { // //无对应配置 查询出无产线配置日历计算 // var line = shopCalendarWorkCtr.Where(x => x.ProdLine == "").ToList(); // //开始时间是周几 // int weekDay = (int)actStart.DayOfWeek; // //判断当天是否是工作日 // bool isWorkDay = _productionScheduleAppService.CheckIsWorkDay(actStart); // if (!isWorkDay)//是工作日 // { // //输出DTO 工作时长为0 // } // else // { // //当天的工作日历 // var shopCal = line.Where(p => p.WeekDay == weekDay).First(); // //当前日期的工作时间段 // List workPoints = DealWorkDayToLevels(actStart, shopCal, mlqtyWorkDtls); // } // } // actStart.AddDays(i); // } // } //} /// /// 处理当前日期的工作时间段 /// /// /// 当前产线的工作日历-周几 /// 每天休息记录 /// //public List DealWorkDayToLevels(DateTime startTime, ShopCalendarWorkCtr shopCal, List curQtyDtls) //{ // //年-月-日 // string date = startTime.Date.ToString("yyyy-MM-dd"); // //排产记录结束日期是周几 // int weekDay = (int)startTime.DayOfWeek; // //计算当天的开工时间点,停工时间点 // string strStart = shopCal.ShiftsStart1.ToString("0.00").Replace(".", ":"); // DateTime dayStartPoint = Convert.ToDateTime(date + " " + strStart); // DateTime dayEndPoint = dayStartPoint.AddHours(Convert.ToDouble(shopCal.ShiftsHours1)); // //工作时间段 // List workPoints = new List(); // LineRestDataTimeDto dto = new LineRestDataTimeDto(); // TimeSpan span = TimeSpan.Zero; // foreach (var item in curQtyDtls) // { // dto.Line = shopCal.ProdLine; // dto.WeekDay = weekDay; // DateTime StarDatime = Convert.ToDateTime(date + " " + item.RestTimePoint); // dto.StartPoint = StarDatime; // dto.EndPoint = StarDatime.AddMinutes(item.RestTime); ; // } // //return workPoints.OrderBy(p => p.Level).ToList(); //} #endregion } }