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
}
}