|
@@ -17,6 +17,7 @@ using Volo.Abp.DependencyInjection;
|
|
|
using Volo.Abp.Domain.Repositories;
|
|
using Volo.Abp.Domain.Repositories;
|
|
|
using Volo.Abp.MultiTenancy;
|
|
using Volo.Abp.MultiTenancy;
|
|
|
using Volo.Abp.Uow;
|
|
using Volo.Abp.Uow;
|
|
|
|
|
+using Volo.Abp.Validation.Localization;
|
|
|
|
|
|
|
|
namespace Business.SaleForecastManagement
|
|
namespace Business.SaleForecastManagement
|
|
|
{
|
|
{
|
|
@@ -51,16 +52,6 @@ namespace Business.SaleForecastManagement
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
private ISqlRepository<HolidayMaster> _holidayMaster;
|
|
private ISqlRepository<HolidayMaster> _holidayMaster;
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
|
|
- /// 月度产能共识主表
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- private ISqlRepository<MonthlyProdCapacityMain> _monthlyProdCapacityMain;
|
|
|
|
|
-
|
|
|
|
|
- /// <summary>
|
|
|
|
|
- /// 月度产能共识明细表
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- private ISqlRepository<MonthlyProdCapacityDtl> _monthlyProdCapacityDtl;
|
|
|
|
|
-
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 工作单元
|
|
/// 工作单元
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -116,6 +107,11 @@ namespace Business.SaleForecastManagement
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
private IRepository<OverallDemandPlan, long> _overallDemandPlan;
|
|
private IRepository<OverallDemandPlan, long> _overallDemandPlan;
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 月度产能共识表
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ private IRepository<MonthlyProdCapacity, long> _monthlyProdCapacity;
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 雪花算法
|
|
/// 雪花算法
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -132,8 +128,7 @@ namespace Business.SaleForecastManagement
|
|
|
ISqlRepository<ShopCalendarWorkCtr> shopCalendarWorkCtr,
|
|
ISqlRepository<ShopCalendarWorkCtr> shopCalendarWorkCtr,
|
|
|
ISqlRepository<QualityLineWorkDetail> qualityLineWorkDetail,
|
|
ISqlRepository<QualityLineWorkDetail> qualityLineWorkDetail,
|
|
|
ISqlRepository<HolidayMaster> holidayMaster,
|
|
ISqlRepository<HolidayMaster> holidayMaster,
|
|
|
- ISqlRepository<MonthlyProdCapacityMain> monthlyProdCapacityMain,
|
|
|
|
|
- ISqlRepository<MonthlyProdCapacityDtl> monthlyProdCapacityDtl,
|
|
|
|
|
|
|
+ IRepository<MonthlyProdCapacity, long> monthlyProdCapacity,
|
|
|
IUnitOfWorkManager unitOfWorkManager,
|
|
IUnitOfWorkManager unitOfWorkManager,
|
|
|
ICurrentTenant currentTenant,
|
|
ICurrentTenant currentTenant,
|
|
|
IRepository<StandardItemModelSet,long> standardItemModelSet,
|
|
IRepository<StandardItemModelSet,long> standardItemModelSet,
|
|
@@ -152,8 +147,7 @@ namespace Business.SaleForecastManagement
|
|
|
_shopCalendarWorkCtr = shopCalendarWorkCtr;
|
|
_shopCalendarWorkCtr = shopCalendarWorkCtr;
|
|
|
_qualityLineWorkDetail = qualityLineWorkDetail;
|
|
_qualityLineWorkDetail = qualityLineWorkDetail;
|
|
|
_holidayMaster = holidayMaster;
|
|
_holidayMaster = holidayMaster;
|
|
|
- _monthlyProdCapacityMain = monthlyProdCapacityMain;
|
|
|
|
|
- _monthlyProdCapacityDtl = monthlyProdCapacityDtl;
|
|
|
|
|
|
|
+ _monthlyProdCapacity = monthlyProdCapacity;
|
|
|
_unitOfWorkManager = unitOfWorkManager;
|
|
_unitOfWorkManager = unitOfWorkManager;
|
|
|
_currentTenant = currentTenant;
|
|
_currentTenant = currentTenant;
|
|
|
_standardItemModelSet = standardItemModelSet;
|
|
_standardItemModelSet = standardItemModelSet;
|
|
@@ -168,147 +162,6 @@ namespace Business.SaleForecastManagement
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
- ///// <summary>
|
|
|
|
|
- ///// 产能分析
|
|
|
|
|
- ///// </summary>
|
|
|
|
|
- ///// <param name="input"></param>
|
|
|
|
|
- ///// <returns></returns>
|
|
|
|
|
- ///// <exception cref="NotImplementedException"></exception>
|
|
|
|
|
- //public async Task<string> CapacityAnalysis(InputDto input)
|
|
|
|
|
- //{
|
|
|
|
|
- // //1、获取数据
|
|
|
|
|
- // //1.1 根据年、月、版本号获取整体需求计划明细
|
|
|
|
|
- // 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();
|
|
|
|
|
- // //1.2 根据规格型号获取物料数据
|
|
|
|
|
- // List<string> models = planDtls.Select(p => p.Model).Distinct().ToList();
|
|
|
|
|
- // List<StandardItemModelSet> standards = _standardItemModelSet.Select(p => models.Contains(p.Model) && p.tenant_id == input.tenant_id && p.factory_id == input.factory_id);
|
|
|
|
|
- // //1.3 根据物料编码获取产线数据
|
|
|
|
|
- // List<ProdLineDetail> lines = _prodLineDetail.Select(p => standards.Select(m => m.ItemNumber).Contains(p.Part) && p.Domain == input.factory_id.ToString() && p.IsActive);
|
|
|
|
|
- // //1.4 根据产线获取工作日历数据和产线休息配置数据
|
|
|
|
|
- // List<ShopCalendarWorkCtr> calendars = _shopCalendarWorkCtr.Select(p => lines.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
|
|
|
|
|
- // List<QualityLineWorkDetail> lineWorks = _qualityLineWorkDetail.Select(p => lines.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
|
|
|
|
|
- // //1.5 获取当前年和下一年的节假日配置数据
|
|
|
|
|
- // 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);
|
|
|
|
|
-
|
|
|
|
|
- // //月度产能共识主表
|
|
|
|
|
- // List<MonthlyProdCapacityMain> capacityMains = new List<MonthlyProdCapacityMain>();
|
|
|
|
|
- // //月度产能共识明细表
|
|
|
|
|
- // List<MonthlyProdCapacityDtl> capacityDtls = new List<MonthlyProdCapacityDtl>();
|
|
|
|
|
- // 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|发布成功!";
|
|
|
|
|
- //}
|
|
|
|
|
-
|
|
|
|
|
- /// <summary>
|
|
|
|
|
- /// 计算当月有多少个周末
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- /// <param name="days"></param>
|
|
|
|
|
- /// <param name="startDay"></param>
|
|
|
|
|
- /// <returns></returns>
|
|
|
|
|
- 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;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 月度需求预测更新
|
|
/// 月度需求预测更新
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -404,13 +257,16 @@ namespace Business.SaleForecastManagement
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
- //计算当前年月的N+1,N+2
|
|
|
|
|
|
|
+ //计算当前年月的N0,N+1,N+2
|
|
|
|
|
+ List<string> planMons = new List<string>();
|
|
|
int newYear = input.month == 12 ? input.year + 1 : input.year;
|
|
int newYear = input.month == 12 ? input.year + 1 : input.year;
|
|
|
int newMonth = input.month == 12 ? 1 : input.month + 1;
|
|
int newMonth = input.month == 12 ? 1 : input.month + 1;
|
|
|
string strN1 = newYear.ToString() + "-" + newMonth.ToString("00");
|
|
string strN1 = newYear.ToString() + "-" + newMonth.ToString("00");
|
|
|
|
|
+ planMons.Add(strN1);
|
|
|
newYear = newMonth == 12 ? newYear + 1 : newYear;
|
|
newYear = newMonth == 12 ? newYear + 1 : newYear;
|
|
|
newMonth = newMonth == 12 ? 1 : newMonth + 1;
|
|
newMonth = newMonth == 12 ? 1 : newMonth + 1;
|
|
|
string strN2 = newYear.ToString() + "-" + newMonth.ToString("00");
|
|
string strN2 = newYear.ToString() + "-" + newMonth.ToString("00");
|
|
|
|
|
+ planMons.Add(strN2);
|
|
|
|
|
|
|
|
//需要回写的数据
|
|
//需要回写的数据
|
|
|
List<YearDemandManagement> updates = new List<YearDemandManagement>();
|
|
List<YearDemandManagement> updates = new List<YearDemandManagement>();
|
|
@@ -540,6 +396,9 @@ namespace Business.SaleForecastManagement
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
+ //生成月度产能共识
|
|
|
|
|
+ List<MonthlyProdCapacity> capacities = CapacityAnalysis(input, updates, planMons);
|
|
|
|
|
+
|
|
|
//保存数据
|
|
//保存数据
|
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
using (var unitOfWork = _unitOfWorkManager.Begin(false, true))
|
|
|
{
|
|
{
|
|
@@ -562,6 +421,10 @@ namespace Business.SaleForecastManagement
|
|
|
}
|
|
}
|
|
|
//回写年度生产大纲
|
|
//回写年度生产大纲
|
|
|
await _yearDemandManagement.UpdateManyAsync(updates);
|
|
await _yearDemandManagement.UpdateManyAsync(updates);
|
|
|
|
|
+ //先删除产能共识
|
|
|
|
|
+ await _monthlyProdCapacity.HardDeleteAsync(p=>p.Year == input.year && p.Month == input.month && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id);
|
|
|
|
|
+ await _monthlyProdCapacity.InsertManyAsync(capacities);
|
|
|
|
|
+
|
|
|
await unitOfWork.CompleteAsync();
|
|
await unitOfWork.CompleteAsync();
|
|
|
}
|
|
}
|
|
|
catch (Exception e)
|
|
catch (Exception e)
|
|
@@ -574,6 +437,79 @@ namespace Business.SaleForecastManagement
|
|
|
return "OK|修订成功!";
|
|
return "OK|修订成功!";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 生成月度产能共识
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="input"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public List<MonthlyProdCapacity> CapacityAnalysis(InputDto input,List<YearDemandManagement> yearDemands, List<string> planMons)
|
|
|
|
|
+ {
|
|
|
|
|
+ //1、获取数据
|
|
|
|
|
+ //1.1 根据规格型号获取物料数据
|
|
|
|
|
+ List<string> models = yearDemands.Select(p => p.Model).Distinct().ToList();
|
|
|
|
|
+ List<StandardItemModelSet> standards = _standardItemModelSet.GetListAsync(p => models.Contains(p.Model) && p.tenant_id == input.tenant_id && p.company_id == input.company_id && p.factory_id == input.factory_id).Result;
|
|
|
|
|
+ //1.3 根据物料编码获取产线数据
|
|
|
|
|
+ List<ProdLineDetail> lineDtls = _prodLineDetail.Select(p => standards.Select(m => m.ItemNumber).Contains(p.Part) && p.Domain == input.factory_id.ToString() && p.IsActive).OrderBy(p => p.Line).ToList();
|
|
|
|
|
+ //1.4 根据产线获取工作日历数据和产线休息配置数据
|
|
|
|
|
+ List<ShopCalendarWorkCtr> calendars = _shopCalendarWorkCtr.Select(p => lineDtls.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
|
|
|
|
|
+ List<QualityLineWorkDetail> lineWorks = _qualityLineWorkDetail.Select(p => lineDtls.Select(m => m.Line).Contains(p.ProdLine) && p.Domain == input.factory_id.ToString() && p.IsActive);
|
|
|
|
|
+ //1.5 获取当前年和下一年的节假日配置数据
|
|
|
|
|
+ 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);
|
|
|
|
|
+
|
|
|
|
|
+ //月度产能共识表
|
|
|
|
|
+ List<MonthlyProdCapacity> capacities = new List<MonthlyProdCapacity>();
|
|
|
|
|
+ //产线
|
|
|
|
|
+ List<string> lines = lineDtls.Select(p => p.Line).Distinct().ToList();
|
|
|
|
|
+ foreach (var item in lines)
|
|
|
|
|
+ {
|
|
|
|
|
+ //计算每天工作时间
|
|
|
|
|
+ var curCal = calendars.FirstOrDefault(p => p.ProdLine == item);
|
|
|
|
|
+ if (curCal == null)
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ foreach (var pm in planMons)
|
|
|
|
|
+ {
|
|
|
|
|
+ //添加月度产能共识产能效率数据
|
|
|
|
|
+ MonthlyProdCapacity dtl = new MonthlyProdCapacity();
|
|
|
|
|
+ dtl.Year = input.year;
|
|
|
|
|
+ dtl.Month = input.month;
|
|
|
|
|
+ dtl.PlanMonth = pm;
|
|
|
|
|
+ dtl.ProdLine = item;
|
|
|
|
|
+
|
|
|
|
|
+ dtl.DailyWorks = curCal.ShiftsHours1 + curCal.ShiftsHours2 + curCal.ShiftsHours3 + curCal.ShiftsHours4;
|
|
|
|
|
+ dtl.FlightQty = 1;
|
|
|
|
|
+ //计算当月工作天数
|
|
|
|
|
+ var curHoildays = holidays.Where(p => p.Dated.Value.Year == Convert.ToInt16(pm.Substring(0,4)) && p.Dated.Value.Month == Convert.ToInt16(pm.Substring(5, 2))).ToList();
|
|
|
|
|
+ //当月天数
|
|
|
|
|
+ int days = DateTime.DaysInMonth(input.year, input.month);
|
|
|
|
|
+ //当月周末天数
|
|
|
|
|
+ int weekDays = CalcWeekDays(days, Convert.ToDateTime(pm + "-01"));
|
|
|
|
|
+ dtl.MonthWorks = days - weekDays - curHoildays.Where(p => p.Ufld1 == "休假").Count() + curHoildays.Where(p => p.Ufld1 == "调班").Count();
|
|
|
|
|
+ dtl.AvailableTimes = dtl.DailyWorks * dtl.MonthWorks;
|
|
|
|
|
+ //计算产线耗时
|
|
|
|
|
+ var curLines = lineDtls.Where(p => p.Line == item).ToList();
|
|
|
|
|
+ var line = curLines.OrderByDescending(p => p.Op).First();
|
|
|
|
|
+ var curStands = standards.Where(p=> curLines.Select(m=>m.Part).Contains(p.ItemNumber)).ToList();
|
|
|
|
|
+ var curDemands = yearDemands.Where(p => curStands.Select(m => m.Model).Contains(p.Model) && p.PlanMonth == pm).ToList();
|
|
|
|
|
+ dtl.NeedWorks = line.Rate == 0 ? 0 : (Math.Ceiling(curDemands.Sum(p=>p.Qty) / line.Rate));
|
|
|
|
|
+ dtl.ProdRate = 100;
|
|
|
|
|
+ dtl.Rate = dtl.AvailableTimes == 0 ? 0 : Math.Floor(dtl.NeedWorks / dtl.AvailableTimes * 100);
|
|
|
|
|
+ dtl.IsOverTime = dtl.NeedWorks > dtl.AvailableTimes ? "是" : "否";
|
|
|
|
|
+ dtl.OverTimes = dtl.IsOverTime == "是" ? (dtl.NeedWorks - dtl.AvailableTimes) : 0;
|
|
|
|
|
+ dtl.tenant_id = input.tenant_id;
|
|
|
|
|
+ dtl.company_id= input.company_id;
|
|
|
|
|
+ dtl.factory_id = input.factory_id;
|
|
|
|
|
+ dtl.org_id= input.org_id;
|
|
|
|
|
+ dtl.create_by= input.create_by;
|
|
|
|
|
+ dtl.create_by_name = input.create_by_name;
|
|
|
|
|
+ dtl.create_time = DateTime.Now;
|
|
|
|
|
+ capacities.Add(dtl);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return capacities;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 计算再订货点
|
|
/// 计算再订货点
|
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -601,6 +537,26 @@ namespace Business.SaleForecastManagement
|
|
|
return rop;
|
|
return rop;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 计算当月有多少个周末
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="days"></param>
|
|
|
|
|
+ /// <param name="startDay"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 生成整体需求计划
|
|
/// 生成整体需求计划
|
|
|
/// </summary>
|
|
/// </summary>
|