using Business.Core.Utilities;
using Business.Domain;
using Business.Dto;
using Business.EntityFrameworkCore.SqlRepositories;
using Business.SaleForecast;
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;
namespace Business.SaleForecastManagement
{
///
/// 产能分析
///
public class MonthlyCapacityLoadAppService : ApplicationService, IMonthlyCapacityLoadAppService, ITransientDependency
{
//#region 服务
/////
///// 物料
/////
//private IRepository _ic_item;
/////
///// 整体需求计划明细
/////
//private ISqlRepository _overallDemandPlanDtl;
/////
///// 生产线明细
/////
//private ISqlRepository _prodLineDetail;
/////
///// 工作日历数据
/////
//private ISqlRepository _shopCalendarWorkCtr;
/////
///// 产线休息时间记录表
/////
//private ISqlRepository _qualityLineWorkDetail;
/////
///// 节假日记录表
/////
//private ISqlRepository _holidayMaster;
/////
///// 月度产能共识主表
/////
//private ISqlRepository _monthlyProdCapacityMain;
/////
///// 月度产能共识明细表
/////
//private ISqlRepository _monthlyProdCapacityDtl;
/////
///// 标准物料规格型号设置表
/////
//private ISqlRepository _standardItemModelSet;
/////
///// 工作单元
/////
//private readonly IUnitOfWorkManager _unitOfWorkManager;
/////
///// 日志
/////
//private readonly ICurrentTenant _currentTenant;
/////
///// 雪花算法
/////
//SnowFlake help = new SnowFlake();
//#endregion
//#region 构造函数
/////
///// 构造函数
/////
//public MonthlyCapacityLoadAppService(
// IRepository ic_item,
// ISqlRepository overallDemandPlanDtl,
// ISqlRepository prodLineDetail,
// ISqlRepository shopCalendarWorkCtr,
// ISqlRepository qualityLineWorkDetail,
// ISqlRepository holidayMaster,
// ISqlRepository monthlyProdCapacityMain,
// ISqlRepository monthlyProdCapacityDtl,
// IUnitOfWorkManager unitOfWorkManager,
// ICurrentTenant currentTenant,
// ISqlRepository standardItemModelSet
// )
//{
// _ic_item= ic_item;
// _overallDemandPlanDtl= overallDemandPlanDtl;
// _prodLineDetail= prodLineDetail;
// _shopCalendarWorkCtr= shopCalendarWorkCtr;
// _qualityLineWorkDetail= qualityLineWorkDetail;
// _holidayMaster= holidayMaster;
// _monthlyProdCapacityMain= monthlyProdCapacityMain;
// _monthlyProdCapacityDtl= monthlyProdCapacityDtl;
// _unitOfWorkManager= unitOfWorkManager;
// _currentTenant= currentTenant;
// _standardItemModelSet= standardItemModelSet;
//}
//#endregion
/////
///// 产能分析
/////
/////
/////
/////
//public async Task CapacityAnalysis(InputDto input)
//{
// //1、获取数据
// //1.1 根据年、月、版本号获取整体需求计划明细
// List 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();
// //1.2 根据规格型号获取物料数据
// List models = planDtls.Select(p => p.Model).Distinct().ToList();
// List standards = _standardItemModelSet.Select(p => models.Contains(p.Model) && p.tenant_id == input.tenant_id && p.factory_id == input.factory_id);
// //1.3 根据物料编码获取产线数据
// List lines = _prodLineDetail.Select(p => standards.Select(m => m.ItemNumber).Contains(p.Part) && p.Domain == input.factory_id.ToString() && p.IsActive);
// //1.4 根据产线获取工作日历数据和产线休息配置数据
// List calendars = _shopCalendarWorkCtr.Select(p => lines.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
// List lineWorks = _qualityLineWorkDetail.Select(p => lines.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
// //1.5 获取当前年和下一年的节假日配置数据
// List 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);
// //月度产能共识主表
// List capacityMains = new List();
// //月度产能共识明细表
// List capacityDtls = new List();
// foreach (var item in planDtls)
// {
// //获取当前产品的生产线
// var std = standards.FirstOrDefault(p => p.Model == item.Model);
// if (std == null)
// {
// new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "规格型号【" + item.Model + "】没有维护标准物料数据", _currentTenant.Id.ToString());
// return "NO|规格型号【" + item.Model + "】没有维护标准物料数据,请维护后再发布!";
// }
// var curLines = lines.Where(p => p.Part == std.ItemNumber).OrderBy(p => p.Line).ToList();
// //过滤产线
// var distLines = curLines.Select(p => p.Line).Distinct().ToList();
// if (distLines.Count == 0)
// {
// new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "物料【" + std.ItemNumber + "】没有维护产线数据", _currentTenant.Id.ToString());
// return "NO|物料【" + std.ItemNumber + "】没有维护产线数据,请维护后再发布!";
// }
// foreach (var dl in distLines)
// {
// //添加月度产能共识主表数据
// MonthlyProdCapacityMain main = new MonthlyProdCapacityMain();
// main.Id = help.NextId();
// main.Version = input.version;//整体需求计划版本号
// main.Year = Convert.ToInt16(item.PlanDate.Substring(0, 4));
// main.Month = Convert.ToInt16(item.PlanDate.Substring(4, 2));
// main.ProdRange = item.ProdRange;
// main.Model = item.Model;
// main.ProdQty = item.Qty;
// main.ProdLine = dl;
// main.Qty = item.Qty;
// main.tenant_id = item.tenant_id;
// main.factory_id = item.factory_id;
// main.Version = item.Version;
// main.CreateTime = DateTime.Now;
// capacityMains.Add(main);
// //添加月度产能共识产能效率数据
// MonthlyProdCapacityDtl dtl = new MonthlyProdCapacityDtl();
// dtl.MainId = main.Id;
// dtl.Version = input.version;
// dtl.Year = main.Year;
// dtl.Month = main.Month;
// dtl.ProdLine = dl;
// //计算每天工作时间
// var curCal = calendars.FirstOrDefault(p => p.ProdLine == dl);
// if (curCal == null)
// {
// continue;
// }
// dtl.DailyWorks = curCal.ShiftsHours1;
// dtl.FlightQty = 1;
// //计算当月工作天数
// var curHoildays = holidays.Where(p => p.Dated.Value.Year == main.Year && p.Dated.Value.Month == main.Month).ToList();
// //当月天数
// int days = DateTime.DaysInMonth(main.Year.Value, main.Month.Value);
// //当月周末天数
// int weekDays = CalcWeekDays(days, Convert.ToDateTime(main.Year.ToString() + "-" + main.Month.ToString() + "-01"));
// dtl.YearWorks = days - weekDays - curHoildays.Where(p => p.Ufld1 == "休假").Count() + curHoildays.Where(p => p.Ufld1 == "调班").Count();
// dtl.AvailableTimes = dtl.DailyWorks * dtl.FlightQty * dtl.YearWorks;
// //计算产线耗时
// var line = curLines.Where(p => p.Line == dl).OrderByDescending(p => p.Op).First();
// dtl.NeedWorks = line.Rate == 0 ? 0 : (Math.Ceiling(main.Qty.GetValueOrDefault() / line.Rate));
// dtl.ProdRate = 100;
// dtl.Rate = dtl.AvailableTimes == 0 ? 0 : Math.Floor(dtl.NeedWorks.GetValueOrDefault() / dtl.AvailableTimes.GetValueOrDefault() * 100);
// dtl.IsOverTime = dtl.NeedWorks > dtl.YearWorks ? "是" : "否";
// dtl.OverTimes = dtl.IsOverTime == "是" ? (dtl.NeedWorks - dtl.YearWorks) : 0;
// dtl.tenant_id = main.tenant_id;
// dtl.factory_id = main.factory_id;
// capacityDtls.Add(dtl);
// }
// }
// //保存数据
// using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
// {
// try
// {
// //先删除数据
// _monthlyProdCapacityMain.Delete(p => p.tenant_id == input.tenant_id && p.factory_id == input.factory_id && p.Version.Contains(input.version.Substring(0, 7)));
// _monthlyProdCapacityDtl.Delete(p => p.tenant_id == input.tenant_id && p.factory_id == input.factory_id && p.Version.Contains(input.version.Substring(0, 7)));
// //插入数据
// _monthlyProdCapacityMain.Insert(capacityMains);
// _monthlyProdCapacityDtl.Insert(capacityDtls);
// await unitOfWork.CompleteAsync();
// }
// catch (Exception e)
// {
// unitOfWork.Dispose();
// new NLogHelper("MonthlyCapacityLoadAppService").WriteLog("CapacityAnalysis", "生成【" + input.year + "年" + input.month + "月】月度产能共识失败:" + e.Message, _currentTenant.Id.ToString());
// return "NO|" + e.Message;
// };
// }
// return "OK|发布成功!";
//}
/////
///// 计算当月有多少个周末
/////
/////
/////
/////
//private int CalcWeekDays(int days, DateTime startDay)
//{
// int sumDays = 0;
// for (int i = 0; i < days; i++)
// {
// int weekDays = (int)startDay.AddDays(i).DayOfWeek;
// if (weekDays == 0 || weekDays == 6)
// {
// sumDays++;
// }
// }
// return sumDays;
//}
}
}