|
|
@@ -113,6 +113,16 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
private List<HolidayMaster> holidays;
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 生产线UPH设置
|
|
|
+ /// </summary>
|
|
|
+ private List<ProdLineDetailRunCrew> prodLineDetailRunCrews;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 加班设置
|
|
|
+ /// </summary>
|
|
|
+ private List<ResourceOccupancyTime> resourceOccupancyTimes;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 工厂id
|
|
|
/// </summary>
|
|
|
@@ -206,9 +216,9 @@ namespace Business.ResourceExamineManagement
|
|
|
List<ProdLineDetail> prodLines = _prodLineDetail.Select(p => workOrds.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == domain && p.IsActive);
|
|
|
List<string> lines = prodLines.Select(p => p.Line).ToList();
|
|
|
//获取非标准产线人员配置
|
|
|
- List<ProdLineDetailRunCrew> prodLineDetailRunCrews = _prodLineDetailRunCrew.Select(x => prodLines.Select(p => p.RecID).Contains(x.ProdLineDetailRecID) && x.IsActive && x.Domain == domain).ToList();
|
|
|
+ prodLineDetailRunCrews = _prodLineDetailRunCrew.Select(x => prodLines.Select(p => p.RecID).Contains(x.ProdLineDetailRecID) && x.IsActive && x.Domain == domain).ToList();
|
|
|
//获取加班设置
|
|
|
- List<ResourceOccupancyTime> resourceOccupancyTimes = _resourceOccupancyTime.Select(x => prodLines.Select(p => p.Line).Contains(x.Resource) && x.IsActive && x.Domain == domain).ToList();
|
|
|
+ resourceOccupancyTimes = _resourceOccupancyTime.Select(x => prodLines.Select(p => p.Line).Contains(x.Resource) && x.IsActive && x.Domain == domain).ToList();
|
|
|
//获取生产周期数据
|
|
|
List<PeriodSequenceDet> dbPeriodSequences = _periodSequenceDet.Select(p => lines.Contains(p.Line) && p.PlanDate >= earlist && p.Domain == domain && p.IsActive);
|
|
|
//获取当前日期往后的排产记录数据
|
|
|
@@ -239,8 +249,7 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
#region 校验
|
|
|
//工单工艺多产线关键工序、物料对应的生产线信息:物料,工序对应的生产线、工作日历数据
|
|
|
- var workOrdRouting = workOrdRoutings.Where(x => x.WorkOrd == item.WorkOrd && x.ParentOp == 0).ToList();
|
|
|
- if (workOrdRouting.Count == 0)
|
|
|
+ if (curRoutings.Count == 0)
|
|
|
{
|
|
|
//记录排产异常原因
|
|
|
new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<" + item.WorkOrd + ">的工单工艺流程数据维护为空", _currentTenant.Id.ToString());
|
|
|
@@ -286,7 +295,7 @@ namespace Business.ResourceExamineManagement
|
|
|
#endregion
|
|
|
|
|
|
//产线排产
|
|
|
- LineSchedule(item, curRoutings, curProdLines, periodSequenceDtls, scheduleMasters,allResults);
|
|
|
+ LineSchedule(item, curRoutings, curProdLines, periodSequenceDtls, scheduleMasters, allResults);
|
|
|
|
|
|
List<ScheduleResultOpMaster> scheduleList = scheduleMasters.Where(s => s.WorkOrd == item.WorkOrd).ToList();
|
|
|
if (scheduleList.Any())
|
|
|
@@ -342,7 +351,7 @@ namespace Business.ResourceExamineManagement
|
|
|
else
|
|
|
{
|
|
|
//获取前一产线排产开始时间,通过提前期计算当前产线排产开始时间
|
|
|
- lineStart = DealNextStartTime(workOrd,lineStart, workOrdRoutings[i].OP, prodLines, allResults);
|
|
|
+ lineStart = DealNextStartTime(workOrd, lineStart, workOrdRoutings[i].OP, prodLines, allResults);
|
|
|
}
|
|
|
//当前产线的工作日历
|
|
|
var mLCalendars = calendars.Where(p => p.ProdLine == lineStart.Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
|
|
|
@@ -358,16 +367,16 @@ namespace Business.ResourceExamineManagement
|
|
|
while (sumQty < workOrd.QtyOrded)
|
|
|
{
|
|
|
//获取当天的产能
|
|
|
- LineScheduledDto dto = GetScheduledPoint(lineStart.Rate, workStartTime, mLCalendars, mlqtyWorkDtls);
|
|
|
+ LineScheduledDto dto = GetScheduledPoint(lineStart, workStartTime, mLCalendars, mlqtyWorkDtls);
|
|
|
//排产开始时,需要先减去产线准备时间
|
|
|
if (sumTimes < lineStart.setupTime)
|
|
|
{
|
|
|
//判断当天的可用生产时长能满足提前期
|
|
|
- if (dto.EffTime >= lineStart.setupTime)
|
|
|
+ if (dto.EffTime >= lineStart.setupTime - sumTimes)
|
|
|
{
|
|
|
sumTimes = lineStart.setupTime;
|
|
|
//当天剩余产能
|
|
|
- decimal sumAmount = dto.ProductQty - Math.Floor(lineStart.Rate * lineStart.setupTime);
|
|
|
+ decimal sumAmount = dto.ProductQty - Math.Floor(dto.Rate * (lineStart.setupTime - sumTimes));
|
|
|
//判断已排产数量+当天的产能是否超过工单数量
|
|
|
if (sumQty + sumAmount <= workOrd.QtyOrded)//当天的产能需要全部排产
|
|
|
{
|
|
|
@@ -410,7 +419,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//剩余需要排产的数量
|
|
|
decimal residueQty = workOrd.QtyOrded - sumQty;
|
|
|
//剩余数量生产需要时长(分钟)
|
|
|
- decimal workTime = Math.Ceiling(residueQty / lineStart.Rate * 60);
|
|
|
+ decimal workTime = Math.Ceiling(residueQty / dto.Rate * 60);
|
|
|
//获取当天的工作时间段
|
|
|
var curCalendar = mLCalendars.FirstOrDefault(p => !string.IsNullOrEmpty(p.ProdLine) && p.WeekDay == (int)workStartTime.DayOfWeek);
|
|
|
if (curCalendar == null)
|
|
|
@@ -528,7 +537,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//剩余需要排产的数量
|
|
|
decimal residueQty = workOrd.QtyOrded - sumQty;
|
|
|
//剩余数量生产需要时长(分钟)
|
|
|
- decimal workTime = Math.Ceiling(residueQty / lineStart.Rate * 60);
|
|
|
+ decimal workTime = Math.Ceiling(residueQty / dto.Rate * 60);
|
|
|
//获取当天的工作时间段
|
|
|
var curCalendar = mLCalendars.FirstOrDefault(p => !string.IsNullOrEmpty(p.ProdLine) && p.WeekDay == (int)workStartTime.DayOfWeek);
|
|
|
if (curCalendar == null)
|
|
|
@@ -537,64 +546,63 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
List<LineWorkPointDto> workPoints = DealWorkDayToLevels(workStartTime, curCalendar, mlqtyWorkDtls);
|
|
|
var curPoint = workPoints.Find(p => p.StartPoint <= workStartTime && workStartTime <= p.EndPoint);
|
|
|
- if (curPoint == null)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- TimeSpan span = curPoint.EndPoint - workStartTime;
|
|
|
- //当天工作时间段的有效生产时间
|
|
|
- decimal effMins = (decimal)span.TotalMinutes;
|
|
|
- DateTime workEndTime = workStartTime;
|
|
|
- if (effMins >= workTime)//当前工作时间段即可满足产能
|
|
|
+ if (curPoint != null)
|
|
|
{
|
|
|
- workEndTime = workStartTime.AddMinutes((double)workTime);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //获取后续生产时间段
|
|
|
- var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
|
|
|
- //剩余需要工作时长
|
|
|
- decimal nextMins = workTime - effMins;
|
|
|
- foreach (var p in nextPoints)
|
|
|
+ TimeSpan span = curPoint.EndPoint - workStartTime;
|
|
|
+ //当天工作时间段的有效生产时间
|
|
|
+ decimal effMins = (decimal)span.TotalMinutes;
|
|
|
+ DateTime workEndTime = workStartTime;
|
|
|
+ if (effMins >= workTime)//当前工作时间段即可满足产能
|
|
|
+ {
|
|
|
+ workEndTime = workStartTime.AddMinutes((double)workTime);
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- if (p.WorkMinutes >= nextMins)
|
|
|
+ //获取后续生产时间段
|
|
|
+ var nextPoints = workPoints.Where(p => p.Level > curPoint.Level).ToList();
|
|
|
+ //剩余需要工作时长
|
|
|
+ decimal nextMins = workTime - effMins;
|
|
|
+ foreach (var p in nextPoints)
|
|
|
{
|
|
|
- workEndTime = p.StartPoint.AddMinutes((double)nextMins);
|
|
|
- break;
|
|
|
+ if (p.WorkMinutes >= nextMins)
|
|
|
+ {
|
|
|
+ workEndTime = p.StartPoint.AddMinutes((double)nextMins);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ nextMins -= p.WorkMinutes;
|
|
|
}
|
|
|
- nextMins -= p.WorkMinutes;
|
|
|
}
|
|
|
+ sumQty = workOrd.QtyOrded;
|
|
|
+ //记录生产周期
|
|
|
+ curSequences.Add(new PeriodSequenceDet
|
|
|
+ {
|
|
|
+ Domain = domain,
|
|
|
+ Line = lineStart.Line,
|
|
|
+ ItemNum = workOrd.ItemNum,
|
|
|
+ PlanDate = workStartTime.Date,
|
|
|
+ Period = dto.Period,//目前只考虑一班制
|
|
|
+ OrdQty = residueQty,
|
|
|
+ WorkOrds = workOrd.WorkOrd,
|
|
|
+ Op = lineStart.Op,
|
|
|
+ IsActive = true,
|
|
|
+ Status = "",
|
|
|
+ CreateTime = DateTime.Now
|
|
|
+ });
|
|
|
+ //记录排产记录
|
|
|
+ curScheduleRsts.Add(new ScheduleResultOpMaster
|
|
|
+ {
|
|
|
+ Domain = domain,
|
|
|
+ WorkOrd = workOrd.WorkOrd,
|
|
|
+ Line = lineStart.Line,
|
|
|
+ ItemNum = workOrd.ItemNum,
|
|
|
+ Op = lineStart.Op,
|
|
|
+ WorkDate = workStartTime.Date,
|
|
|
+ WorkQty = residueQty,
|
|
|
+ WorkStartTime = workStartTime,
|
|
|
+ WorkEndTime = workEndTime,
|
|
|
+ CreateTime = DateTime.Now
|
|
|
+ });
|
|
|
}
|
|
|
- sumQty = workOrd.QtyOrded;
|
|
|
- //记录生产周期
|
|
|
- curSequences.Add(new PeriodSequenceDet
|
|
|
- {
|
|
|
- Domain = domain,
|
|
|
- Line = lineStart.Line,
|
|
|
- ItemNum = workOrd.ItemNum,
|
|
|
- PlanDate = workStartTime.Date,
|
|
|
- Period = dto.Period,//目前只考虑一班制
|
|
|
- OrdQty = residueQty,
|
|
|
- WorkOrds = workOrd.WorkOrd,
|
|
|
- Op = lineStart.Op,
|
|
|
- IsActive = true,
|
|
|
- Status = "",
|
|
|
- CreateTime = DateTime.Now
|
|
|
- });
|
|
|
- //记录排产记录
|
|
|
- curScheduleRsts.Add(new ScheduleResultOpMaster
|
|
|
- {
|
|
|
- Domain = domain,
|
|
|
- WorkOrd = workOrd.WorkOrd,
|
|
|
- Line = lineStart.Line,
|
|
|
- ItemNum = workOrd.ItemNum,
|
|
|
- Op = lineStart.Op,
|
|
|
- WorkDate = workStartTime.Date,
|
|
|
- WorkQty = residueQty,
|
|
|
- WorkStartTime = workStartTime,
|
|
|
- WorkEndTime = workEndTime,
|
|
|
- CreateTime = DateTime.Now
|
|
|
- });
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -607,12 +615,12 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <summary>
|
|
|
/// 获取产线当天的开工时间,结束时间,有效工作时长,生产数量
|
|
|
/// </summary>
|
|
|
- /// <param name="rate">产线UPH</param>
|
|
|
+ /// <param name="lineStart">排产产线</param>
|
|
|
/// <param name="startTime">产线排产开始时间</param>
|
|
|
/// <param name="curCalendars"></param>
|
|
|
/// <param name="curQtyDtls"></param>
|
|
|
/// <returns></returns>
|
|
|
- public LineScheduledDto GetScheduledPoint(decimal rate, DateTime startTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
+ public LineScheduledDto GetScheduledPoint(LineStartDto lineStart, DateTime startTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
{
|
|
|
LineScheduledDto scheduledDto = new LineScheduledDto();
|
|
|
//当天排产开始时间
|
|
|
@@ -641,6 +649,15 @@ namespace Business.ResourceExamineManagement
|
|
|
span = item.EndPoint - item.StartPoint;
|
|
|
scheduledDto.EffTime += (decimal)span.TotalHours;
|
|
|
}
|
|
|
+ //判断产线当天有没有加班
|
|
|
+ var curOccupyTimes = resourceOccupancyTimes.Where(p=> p.Resource == lineStart.Line && p.StartTime.GetValueOrDefault().Date == startTime.Date).ToList();
|
|
|
+ scheduledDto.EffTime += curOccupyTimes.Sum(p=> Convert.ToDecimal(p.Ufld1));
|
|
|
+ //判断当前产线的UPH
|
|
|
+ var curRunCrews = prodLineDetailRunCrews.Where(p=>p.ProdLineDetailRecID == lineStart.RecID).ToList();
|
|
|
+ //判断当前日期是否配置了UPH
|
|
|
+ var curLevel = curRunCrews.FirstOrDefault(p => p.StartDate.GetValueOrDefault().Date <= startTime.Date && p.EndDate.GetValueOrDefault().Date >= startTime.Date);
|
|
|
+ decimal rate = curLevel == null ? lineStart.Rate : curLevel.Rate;
|
|
|
+ scheduledDto.Rate = rate;
|
|
|
//计算当天的产能
|
|
|
scheduledDto.ProductQty = Math.Floor(scheduledDto.EffTime * rate);
|
|
|
//计算班次
|
|
|
@@ -668,11 +685,13 @@ namespace Business.ResourceExamineManagement
|
|
|
var lines = prodLines.Where(p => p.Part == workOrd.ItemNum && p.Op == op).OrderBy(p => p.Sequence).ToList();
|
|
|
//获取第一条产线排产结束时间
|
|
|
var schedule = allResults.Where(p => p.Line == lines[0].Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
- actStart = schedule == null ? actStart : schedule.WorkEndTime;
|
|
|
+ actStart = schedule == null ? actStart : (schedule.WorkEndTime >= actStart ? schedule.WorkEndTime : actStart);
|
|
|
//计算实际开工时间
|
|
|
- var curCalendars = calendars.Where(p => p.ProdLine == lines[0].Line).ToList();
|
|
|
+ //产线工作日历:当前产线的工作日历+默认工作日历
|
|
|
+ var curCalendars = calendars.Where(p => p.ProdLine == lines[0].Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
|
|
|
var curQtyDtls = qualityLines.Where(p=>p.ProdLine == lines[0].Line).ToList();
|
|
|
actStart = CalcActStartTime(actStart, curCalendars, curQtyDtls);
|
|
|
+ lineStart.RecID = lines[0].RecID;
|
|
|
lineStart.Line = lines[0].Line;
|
|
|
lineStart.StartTime = actStart;
|
|
|
lineStart.setupTime = lines[0].SetupTime;
|
|
|
@@ -681,13 +700,15 @@ namespace Business.ResourceExamineManagement
|
|
|
for (int i = 1; i < lines.Count; i++)
|
|
|
{
|
|
|
schedule = allResults.Where(p => p.Line == lines[i].Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
- DateTime StartTime = schedule == null ? actStart : schedule.WorkEndTime;
|
|
|
+ DateTime StartTime = schedule == null ? actStart : (schedule.WorkEndTime >= actStart ? schedule.WorkEndTime : actStart);
|
|
|
//计算实际开工时间
|
|
|
- curCalendars = calendars.Where(p => p.ProdLine == lines[i].Line).ToList();
|
|
|
+ //产线工作日历:当前产线的工作日历+默认工作日历
|
|
|
+ curCalendars = calendars.Where(p => p.ProdLine == lines[i].Line || string.IsNullOrEmpty(p.ProdLine)).ToList();
|
|
|
curQtyDtls = qualityLines.Where(p => p.ProdLine == lines[i].Line).ToList();
|
|
|
StartTime = CalcActStartTime(StartTime, curCalendars, curQtyDtls);
|
|
|
if (StartTime < lineStart.StartTime)
|
|
|
{
|
|
|
+ lineStart.RecID = lines[i].RecID;
|
|
|
lineStart.Line = lines[i].Line;
|
|
|
lineStart.StartTime = StartTime;
|
|
|
lineStart.setupTime = lines[i].SetupTime;
|
|
|
@@ -701,7 +722,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// 计算主产线实际排产开始时间
|
|
|
/// </summary>
|
|
|
/// <param name="startTime">开始时间</param>
|
|
|
- /// <param name="curCalendars">当前产线工作日历</param>
|
|
|
+ /// <param name="curCalendars">当前产线工作日历+默认工作日历</param>
|
|
|
/// <param name="curQtyDtls">当前产线休息记录</param>
|
|
|
/// <returns></returns>
|
|
|
public DateTime CalcActStartTime(DateTime startTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
@@ -720,7 +741,12 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
//当天的工作日历
|
|
|
- var shopCal = curCalendars.Where(p => p.WeekDay == weekDay).First();
|
|
|
+ var shopCal = curCalendars.Where(p => !string.IsNullOrEmpty(p.ProdLine) && p.WeekDay == weekDay).FirstOrDefault();
|
|
|
+ if (shopCal == null)
|
|
|
+ {
|
|
|
+ //产线没有维护当天的工作日历,则取默认工作日历
|
|
|
+ shopCal = curCalendars.Where(p => string.IsNullOrEmpty(p.ProdLine) && p.WeekDay == weekDay).FirstOrDefault();
|
|
|
+ }
|
|
|
//当前日期的工作时间段
|
|
|
List<LineWorkPointDto> workPoints = DealWorkDayToLevels(startTime, shopCal, curQtyDtls);
|
|
|
//计算starttime处于那个工作时间段
|
|
|
@@ -846,6 +872,7 @@ namespace Business.ResourceExamineManagement
|
|
|
//获取第一条产线排产结束时间
|
|
|
var schedule = allResults.Where(p => p.Line == lines[0].Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
DateTime startTime = CalcStartTimeWithSetUpTime(lines[0], lineStart.StartTime, lineStart.setupTime + lines[0].OverlapTime);
|
|
|
+ startDto.RecID = lines[0].RecID;
|
|
|
startDto.Line = lines[0].Line;
|
|
|
startDto.setupTime = lines[0].SetupTime;
|
|
|
startDto.StartTime = schedule == null ? startTime : (startTime < schedule.WorkEndTime ? schedule.WorkEndTime : startTime);
|
|
|
@@ -858,6 +885,7 @@ namespace Business.ResourceExamineManagement
|
|
|
startTime = schedule == null ? startTime : (startTime < schedule.WorkEndTime ? schedule.WorkEndTime : startTime);
|
|
|
if (startTime < startDto.StartTime)
|
|
|
{
|
|
|
+ startDto.RecID = lines[i].RecID;
|
|
|
startDto.Line = lines[i].Line;
|
|
|
startDto.setupTime = lines[i].SetupTime;
|
|
|
startDto.StartTime = startTime;
|
|
|
@@ -883,7 +911,12 @@ namespace Business.ResourceExamineManagement
|
|
|
//开始时间是周几
|
|
|
int weekDay = (int)startTime.DayOfWeek;
|
|
|
//当天的工作日历
|
|
|
- var shopCal = calendars.Where(p => p.ProdLine == line.Line && p.WeekDay == weekDay).First();
|
|
|
+ var shopCal = calendars.Where(p => p.ProdLine == line.Line && p.WeekDay == weekDay).FirstOrDefault();
|
|
|
+ if (shopCal == null)
|
|
|
+ {
|
|
|
+ //产线没有维护当天的工作日历,则取默认工作日历
|
|
|
+ shopCal = calendars.Where(p => string.IsNullOrEmpty(p.ProdLine) && p.WeekDay == weekDay).FirstOrDefault();
|
|
|
+ }
|
|
|
//当前产线的休息时间设置
|
|
|
var curQtyDtls = qualityLines.Where(p => p.ProdLine == line.Line).ToList();
|
|
|
//当前日期的工作时间段
|
|
|
@@ -923,10 +956,15 @@ namespace Business.ResourceExamineManagement
|
|
|
while (flag)
|
|
|
{
|
|
|
//获取下一个工作日
|
|
|
- nextStartTime = GetNextWorkDay(weekDay, startTime, calendars.Where(p => p.ProdLine == line.Line).ToList());
|
|
|
+ nextStartTime = GetNextWorkDay(weekDay, startTime, calendars.Where(p => p.ProdLine == line.Line || string.IsNullOrEmpty(p.ProdLine)).ToList());
|
|
|
weekDay = (int)nextStartTime.DayOfWeek;
|
|
|
//获取前一个工作日的工作时间段数据,level顺排
|
|
|
- workPoints = DealWorkDayToLevels(nextStartTime, calendars.Where(p=>p.ProdLine == line.Line && p.WeekDay == weekDay).First(), curQtyDtls).OrderBy(p => p.Level).ToList();
|
|
|
+ var curCalendar = calendars.Where(p => p.ProdLine == line.Line && p.WeekDay == weekDay).FirstOrDefault();
|
|
|
+ if (curCalendar == null )
|
|
|
+ {
|
|
|
+ curCalendar = calendars.Where(p => string.IsNullOrEmpty(p.ProdLine) && p.WeekDay == weekDay).FirstOrDefault();
|
|
|
+ }
|
|
|
+ workPoints = DealWorkDayToLevels(nextStartTime, curCalendar, curQtyDtls).OrderBy(p => p.Level).ToList();
|
|
|
//当天的工作时长(分钟)
|
|
|
decimal sumWorkMins = workPoints.Sum(p => p.WorkMinutes);
|
|
|
if (sumWorkMins >= needMinute)//当天可用提前期满足
|
|
|
@@ -957,7 +995,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// </summary>
|
|
|
/// <param name="weekDay">当前周几</param>
|
|
|
/// <param name="startTime">开始时间</param>
|
|
|
- /// <param name="curCalendars">当前产线的工作日历</param>
|
|
|
+ /// <param name="curCalendars">当前产线的工作日历+默认工作日历</param>
|
|
|
/// <returns></returns>
|
|
|
public DateTime GetNextWorkDay(int weekDay, DateTime startTime, List<ShopCalendarWorkCtr> curCalendars)
|
|
|
{
|
|
|
@@ -996,44 +1034,6 @@ namespace Business.ResourceExamineManagement
|
|
|
return rtnData;
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 获取上一个工作日开始时间
|
|
|
- /// </summary>
|
|
|
- /// <param name="startTime">开始时间</param>
|
|
|
- /// <param name="curCalendars">当前产线的工作日历</param>
|
|
|
- /// <returns></returns>
|
|
|
- public DateTime GetPreWorkDay(DateTime startTime, List<ShopCalendarWorkCtr> curCalendars)
|
|
|
- {
|
|
|
- DateTime rtnData = startTime;
|
|
|
- //前一天
|
|
|
- DateTime preDate = startTime.Date.AddDays(-1);
|
|
|
- //前一天是周几
|
|
|
- int preWeekDay = (int)preDate.DayOfWeek;
|
|
|
- var calendar = curCalendars.FirstOrDefault(p => p.WeekDay == preWeekDay);
|
|
|
- string strStart = calendar.ShiftsStart1.ToString("0.00").Replace(".", ":");
|
|
|
- //判断前一天是否是工作日
|
|
|
- if (preWeekDay == 0 || preWeekDay == 6)//前一天是周六或者周日,需要判断是否调班,需要加班
|
|
|
- {
|
|
|
- if (!holidays.Exists(p => p.Dated.GetValueOrDefault().Date == preDate && p.Ufld1 == "调班"))//前一天是非工作日
|
|
|
- {
|
|
|
- //递归继续找上一个工作日
|
|
|
- rtnData = GetPreWorkDay(preDate, curCalendars);
|
|
|
- return rtnData;
|
|
|
- }
|
|
|
- rtnData = Convert.ToDateTime(preDate.ToString("yyyy-MM-dd") + " " + strStart);
|
|
|
- return rtnData;
|
|
|
- }
|
|
|
- //前一天不是周六周日,需要判断是不是节假日
|
|
|
- if (holidays.Exists(p => p.Dated.GetValueOrDefault().Date == preDate && p.Ufld1 == "休假"))//是节假日
|
|
|
- {
|
|
|
- //递归继续找前一个工作日
|
|
|
- rtnData = GetPreWorkDay(preDate, curCalendars);
|
|
|
- return rtnData;
|
|
|
- }
|
|
|
- rtnData = Convert.ToDateTime(preDate.ToString("yyyy-MM-dd") + " " + strStart);
|
|
|
- return rtnData;
|
|
|
- }
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 处理当前日期的工作时间段
|
|
|
/// </summary>
|
|
|
@@ -1056,7 +1056,7 @@ namespace Business.ResourceExamineManagement
|
|
|
string strStart = shopCal.ShiftsStart1.ToString("0.00").Replace(".", ":");
|
|
|
DateTime dayStartPoint = Convert.ToDateTime(date + " " + strStart);
|
|
|
//结束时间
|
|
|
- DateTime dayEndPoint = CalcEndPoint(startTime, shopCal);
|
|
|
+ DateTime dayEndPoint = dayStartPoint.AddHours((double)(shopCal.ShiftsHours1 + shopCal.ShiftsHours2));
|
|
|
dto.Level = level;
|
|
|
dto.Line = shopCal.ProdLine;
|
|
|
dto.WeekDay = weekDay;
|
|
|
@@ -1084,64 +1084,5 @@ namespace Business.ResourceExamineManagement
|
|
|
|
|
|
return workPoints.OrderBy(p => p.Level).ToList();
|
|
|
}
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 计算当前班次结束时间
|
|
|
- /// </summary>
|
|
|
- /// <param name="startTime"></param>
|
|
|
- /// <param name="shopCal"></param>
|
|
|
- /// <returns></returns>
|
|
|
- public DateTime CalcEndPoint(DateTime startTime, ShopCalendarWorkCtr shopCal)
|
|
|
- {
|
|
|
- //年-月-日
|
|
|
- string date = startTime.Date.ToString("yyyy-MM-dd");
|
|
|
- string strStart = "";
|
|
|
- DateTime dayStartPoint = DateTime.Now;
|
|
|
- DateTime dayEndPoint = DateTime.Now;
|
|
|
- if (shopCal.ShiftsStart2 != 0 && shopCal.ShiftsHours2 != 0)//设置了第二班
|
|
|
- {
|
|
|
- strStart = shopCal.ShiftsStart2.ToString("0.00").Replace(".", ":");
|
|
|
- dayStartPoint = Convert.ToDateTime(date + " " + strStart);
|
|
|
- dayEndPoint = dayStartPoint.AddHours(Convert.ToDouble(shopCal.ShiftsHours2));
|
|
|
- return dayEndPoint;
|
|
|
- }
|
|
|
- strStart = shopCal.ShiftsStart1.ToString("0.00").Replace(".", ":");
|
|
|
- dayStartPoint = Convert.ToDateTime(date + " " + strStart);
|
|
|
- dayEndPoint = dayStartPoint.AddHours(Convert.ToDouble(shopCal.ShiftsHours1));
|
|
|
- return dayEndPoint;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 计算第一条产线开始时间
|
|
|
- /// </summary>
|
|
|
- /// <param name="workOrd">工单</param>
|
|
|
- /// <param name="op">关键工序</param>
|
|
|
- /// <param name="prodLines">产线明细</param>
|
|
|
- /// <param name="scheduleResults">排产结果</param>
|
|
|
- /// <returns></returns>
|
|
|
- public LineStartDto CalcLineStart(WorkOrdMaster workOrd, int op, List<ProdLineDetail> prodLines, List<ScheduleResultOpMaster> scheduleResults)
|
|
|
- {
|
|
|
- LineStartDto dto = new LineStartDto();
|
|
|
- //获取工序对应的产线,根据优先级排序
|
|
|
- var lines = prodLines.Where(p => p.Part == workOrd.ItemNum && p.Op == op).OrderBy(p=>p.Sequence).ToList();
|
|
|
- //第一条产线:使用工单OrdDate计算开始排产时间,不需要考虑提前期
|
|
|
- //获取当前产线排产结束时间
|
|
|
- var schedule = scheduleResults.Where(p => p.Line == lines[0].Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
- dto.Line = lines[0].Line;
|
|
|
- dto.Op = op;
|
|
|
- dto.StartTime = schedule == null ? workOrd.OrdDate.GetValueOrDefault() : (schedule.WorkEndTime <= workOrd.OrdDate ? workOrd.OrdDate.GetValueOrDefault() : schedule.WorkEndTime);
|
|
|
- //循环其他产线
|
|
|
- for (int i = 1; i < lines.Count; i++)
|
|
|
- {
|
|
|
- schedule = scheduleResults.Where(p => p.Line == lines[i].Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
- DateTime StartTime = schedule == null ? workOrd.OrdDate.GetValueOrDefault() : (schedule.WorkEndTime <= workOrd.OrdDate ? workOrd.OrdDate.GetValueOrDefault() : schedule.WorkEndTime);
|
|
|
- if (StartTime < dto.StartTime)
|
|
|
- {
|
|
|
- dto.Line = lines[i].Line;
|
|
|
- dto.StartTime = StartTime;
|
|
|
- }
|
|
|
- }
|
|
|
- return dto;
|
|
|
- }
|
|
|
}
|
|
|
}
|