|
|
@@ -16,7 +16,7 @@ using System.Transactions;
|
|
|
using Volo.Abp.Application.Services;
|
|
|
using Volo.Abp.MultiTenancy;
|
|
|
|
|
|
-namespace Business.Quartz
|
|
|
+namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 生产排产服务
|
|
|
@@ -121,19 +121,19 @@ namespace Business.Quartz
|
|
|
ISqlRepository<HolidayMaster> holidayMaster,
|
|
|
ICurrentTenant currentTenant
|
|
|
)
|
|
|
- {
|
|
|
- _itemMaster= itemMaster;
|
|
|
- _workOrdMaster= workOrdMaster;
|
|
|
- _workOrdDetail= workOrdDetail;
|
|
|
- _workOrdRouting= workOrdRouting;
|
|
|
+ {
|
|
|
+ _itemMaster = itemMaster;
|
|
|
+ _workOrdMaster = workOrdMaster;
|
|
|
+ _workOrdDetail = workOrdDetail;
|
|
|
+ _workOrdRouting = workOrdRouting;
|
|
|
_prodLineDetail = prodLineDetail;
|
|
|
_periodSequenceDet = periodSequenceDet;
|
|
|
- _scheduleResultOpMaster= scheduleResultOpMaster;
|
|
|
- _invMaster= invMaster;
|
|
|
- _shopCalendarWorkCtr= shopCalendarWorkCtr;
|
|
|
- _qualityLineWorkDetail= qualityLineWorkDetail;
|
|
|
+ _scheduleResultOpMaster = scheduleResultOpMaster;
|
|
|
+ _invMaster = invMaster;
|
|
|
+ _shopCalendarWorkCtr = shopCalendarWorkCtr;
|
|
|
+ _qualityLineWorkDetail = qualityLineWorkDetail;
|
|
|
_holidayMaster = holidayMaster;
|
|
|
- _currentTenant= currentTenant;
|
|
|
+ _currentTenant = currentTenant;
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
@@ -171,11 +171,11 @@ namespace Business.Quartz
|
|
|
List<ProdLineDetail> prodLines = _prodLineDetail.Select(p => workOrds.Select(m => m.ItemNum).Contains(p.Part) && p.Domain == "1001" && p.IsActive);
|
|
|
List<string> lines = prodLines.Select(p => p.Line).ToList();
|
|
|
//获取生产周期数据
|
|
|
- List<PeriodSequenceDet> dbPeriodSequences = _periodSequenceDet.Select(p=> lines.Contains(p.Line) && p.PlanDate >= earlist && p.Domain == "1001" && p.IsActive);
|
|
|
+ List<PeriodSequenceDet> dbPeriodSequences = _periodSequenceDet.Select(p => lines.Contains(p.Line) && p.PlanDate >= earlist && p.Domain == "1001" && p.IsActive);
|
|
|
//获取当前日期往后的排产记录数据
|
|
|
List<ScheduleResultOpMaster> dbSchedules = _scheduleResultOpMaster.Select(p => lines.Contains(p.Line) && p.WorkDate >= earlist && p.Domain == "1001");
|
|
|
//获取工作日历数据
|
|
|
- calendars = _shopCalendarWorkCtr.Select(p=>p.Domain == "1001" && p.IsActive);
|
|
|
+ calendars = _shopCalendarWorkCtr.Select(p => p.Domain == "1001" && p.IsActive);
|
|
|
//获取产线休息记录数据
|
|
|
qualityLines = _qualityLineWorkDetail.Select(p => p.Domain == "1001" && p.IsActive);
|
|
|
//获取节假日记录数据
|
|
|
@@ -201,16 +201,16 @@ namespace Business.Quartz
|
|
|
|
|
|
//工序预处理:确定每层级工序对应的产线
|
|
|
List<WorkOrdRoutingDto> routingDtos = ProcPretreatment(item, workOrdRoutings.Where(p => p.WorkOrd == item.WorkOrd).ToList(), prodLines, allResults);
|
|
|
-
|
|
|
+
|
|
|
//排产前的数据校验
|
|
|
if (routingDtos.Count == 0)//没有维护主工序
|
|
|
{
|
|
|
//记录排产异常原因
|
|
|
- new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<"+ item.WorkOrd + ">的工序数据维护错误", _currentTenant.Id.ToString());
|
|
|
+ new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<" + item.WorkOrd + ">的工序数据维护错误", _currentTenant.Id.ToString());
|
|
|
continue;
|
|
|
}
|
|
|
//校验每层级工序是否都维护了产线
|
|
|
- if (routingDtos.Exists(p=> string.IsNullOrEmpty(p.Line)))
|
|
|
+ if (routingDtos.Exists(p => string.IsNullOrEmpty(p.Line)))
|
|
|
{
|
|
|
//记录排产异常原因
|
|
|
new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "工单<" + item.WorkOrd + ">的产线数据维护错误", _currentTenant.Id.ToString());
|
|
|
@@ -221,7 +221,7 @@ namespace Business.Quartz
|
|
|
foreach (var rut in routingDtos)
|
|
|
{
|
|
|
var lineCals = calendars.Where(p => p.ProdLine == rut.Line).ToList();
|
|
|
- if (lineCals.Select(p=>p.WeekDay).Distinct().Count() !=7)
|
|
|
+ if (lineCals.Select(p => p.WeekDay).Distinct().Count() != 7)
|
|
|
{
|
|
|
flag = true;
|
|
|
break;
|
|
|
@@ -242,20 +242,21 @@ namespace Business.Quartz
|
|
|
}
|
|
|
using (TransactionScope scope = new TransactionScope())
|
|
|
{
|
|
|
- try {
|
|
|
+ try
|
|
|
+ {
|
|
|
//记录排产数据
|
|
|
/*_workOrdMaster.Update(workOrds);*/
|
|
|
_periodSequenceDet.Insert(periodSequenceDtls);
|
|
|
_scheduleResultOpMaster.Insert(scheduleMasters);
|
|
|
scope.Complete();
|
|
|
}
|
|
|
- catch(Exception ex)
|
|
|
+ catch (Exception ex)
|
|
|
{
|
|
|
new NLogHelper("ProductionScheduleAppService").WriteLog("DoProductShcedule", "记录排产数据失败:" + ex.Message, _currentTenant.Id.ToString());
|
|
|
scope.Dispose();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -265,7 +266,7 @@ namespace Business.Quartz
|
|
|
/// <param name="routingDtos">每层级工序对应的产线信息,从小到大排序</param>
|
|
|
/// <param name="periodsDet">生产周期</param>
|
|
|
/// <param name="scheduleResults">排产结果</param>
|
|
|
- public void LineSchedule(WorkOrdMaster workOrd,List<WorkOrdRoutingDto> routingDtos,List<PeriodSequenceDet> periodsDet, List<ScheduleResultOpMaster> scheduleResults)
|
|
|
+ public void LineSchedule(WorkOrdMaster workOrd, List<WorkOrdRoutingDto> routingDtos, List<PeriodSequenceDet> periodsDet, List<ScheduleResultOpMaster> scheduleResults)
|
|
|
{
|
|
|
//生产周期
|
|
|
List<PeriodSequenceDet> curSequences = new List<PeriodSequenceDet>();
|
|
|
@@ -273,7 +274,7 @@ namespace Business.Quartz
|
|
|
List<ScheduleResultOpMaster> curScheduleRsts = new List<ScheduleResultOpMaster>();
|
|
|
//产线排产开始时间
|
|
|
List<LineStartDto> lineStarts = new List<LineStartDto>();
|
|
|
-
|
|
|
+
|
|
|
//循环产线,排产
|
|
|
foreach (var item in routingDtos)
|
|
|
{
|
|
|
@@ -431,8 +432,8 @@ namespace Business.Quartz
|
|
|
/// <param name="curCalendars"></param>
|
|
|
/// <param name="curQtyDtls"></param>
|
|
|
/// <returns></returns>
|
|
|
- public LineScheduledDto GetScheduledPoint(WorkOrdRoutingDto routingDto,DateTime startTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
- {
|
|
|
+ public LineScheduledDto GetScheduledPoint(WorkOrdRoutingDto routingDto, DateTime startTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
+ {
|
|
|
LineScheduledDto scheduledDto = new LineScheduledDto();
|
|
|
//当天排产开始时间
|
|
|
scheduledDto.StartTime = startTime;
|
|
|
@@ -503,12 +504,13 @@ namespace Business.Quartz
|
|
|
//获取下一个工作日开始时间
|
|
|
actStart = GetNextWorkDay(weekDay, startTime, curCalendars);
|
|
|
}
|
|
|
- else {//开始时间位于当天的休息时间段
|
|
|
+ else
|
|
|
+ {//开始时间位于当天的休息时间段
|
|
|
foreach (var item in workPoints)
|
|
|
{
|
|
|
//获取下一个时间段
|
|
|
- var next = workPoints.First(p=>p.Level == item.Level + 1);
|
|
|
- if (item.EndPoint < startTime && startTime < next.StartPoint)
|
|
|
+ var next = workPoints.First(p => p.Level == item.Level + 1);
|
|
|
+ if (item.EndPoint < startTime && startTime < next.StartPoint)
|
|
|
{
|
|
|
actStart = next.StartPoint;
|
|
|
break;
|
|
|
@@ -601,7 +603,7 @@ namespace Business.Quartz
|
|
|
/// <param name="curCalendars">当前产线工作日历</param>
|
|
|
/// <param name="curQtyDtls">当前产线休息记录</param>
|
|
|
/// <returns></returns>
|
|
|
- public DateTime DealChildStartTime(DateTime startTime,decimal setupTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
+ public DateTime DealChildStartTime(DateTime startTime, decimal setupTime, List<ShopCalendarWorkCtr> curCalendars, List<QualityLineWorkDetail> curQtyDtls)
|
|
|
{
|
|
|
//提前期转换成分钟
|
|
|
decimal needMinute = setupTime * 60;
|
|
|
@@ -629,7 +631,7 @@ namespace Business.Quartz
|
|
|
//剩余提前期
|
|
|
needMinute -= curMins;
|
|
|
//获取前层级时间段
|
|
|
- var prePoints = workPoints.Where(p => p.Level < curPoint.Level).OrderByDescending(p=>p.Level).ToList();
|
|
|
+ var prePoints = workPoints.Where(p => p.Level < curPoint.Level).OrderByDescending(p => p.Level).ToList();
|
|
|
bool flag = true;//标志位
|
|
|
foreach (var item in prePoints)
|
|
|
{
|
|
|
@@ -654,7 +656,7 @@ namespace Business.Quartz
|
|
|
//获取前一个工作日
|
|
|
perStartTime = GetPreWorkDay(perStartTime, curCalendars);
|
|
|
//获取前一个工作日的工作时间段数据,倒序排
|
|
|
- workPoints = DealWorkDayToLevels(perStartTime, shopCal, curQtyDtls).OrderByDescending(p=>p.Level).ToList();
|
|
|
+ workPoints = DealWorkDayToLevels(perStartTime, shopCal, curQtyDtls).OrderByDescending(p => p.Level).ToList();
|
|
|
//当天的工作时长(分钟)
|
|
|
decimal sumWorkMins = workPoints.Sum(p => p.WorkMinutes);
|
|
|
if (sumWorkMins >= needMinute)//当天可用提前期满足
|
|
|
@@ -671,7 +673,8 @@ namespace Business.Quartz
|
|
|
}
|
|
|
flag = false;
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
//当天可用提前期不满足
|
|
|
needMinute -= sumWorkMins;
|
|
|
}
|
|
|
@@ -695,7 +698,7 @@ namespace Business.Quartz
|
|
|
DateTime nextDate = startTime.Date.AddDays(1);
|
|
|
//下一天是周几
|
|
|
int nextWeekDay = (weekDay + 1) % 7;
|
|
|
- var calendar = curCalendars.FirstOrDefault(p=>p.WeekDay == nextWeekDay);
|
|
|
+ var calendar = curCalendars.FirstOrDefault(p => p.WeekDay == nextWeekDay);
|
|
|
string strStart = calendar.ShiftsStart1.ToString("0.00").Replace(".", ":");
|
|
|
//判断下一天是否是工作日
|
|
|
if (nextWeekDay == 0 || nextWeekDay == 6)//下一天是周六或者周日,需要判断是否调班,需要加班
|
|
|
@@ -773,7 +776,7 @@ namespace Business.Quartz
|
|
|
int weekDay = (int)startTime.DayOfWeek;
|
|
|
//计算当天的开工时间点,停工时间点
|
|
|
string strStart = shopCal.ShiftsStart1.ToString("0.00").Replace(".", ":");
|
|
|
- DateTime dayStartPoint = Convert.ToDateTime(date + " "+ strStart);
|
|
|
+ DateTime dayStartPoint = Convert.ToDateTime(date + " " + strStart);
|
|
|
DateTime dayEndPoint = dayStartPoint.AddHours(Convert.ToDouble(shopCal.ShiftsHours1));
|
|
|
//工作时间段
|
|
|
List<LineWorkPointDto> workPoints = new List<LineWorkPointDto>();
|
|
|
@@ -787,7 +790,7 @@ namespace Business.Quartz
|
|
|
foreach (var item in curQtyDtls)
|
|
|
{
|
|
|
DateTime endPoint = Convert.ToDateTime(date + " " + item.RestTimePoint);
|
|
|
- dto.EndPoint= endPoint;
|
|
|
+ dto.EndPoint = endPoint;
|
|
|
span = dto.EndPoint - dto.StartPoint;
|
|
|
dto.WorkMinutes = (decimal)span.TotalMinutes;
|
|
|
workPoints.Add(dto);
|
|
|
@@ -814,13 +817,13 @@ namespace Business.Quartz
|
|
|
/// <param name="prodLines">产线</param>
|
|
|
/// <param name="schedules">当前工单对应产品的排产记录</param>
|
|
|
/// <returns></returns>
|
|
|
- public List<WorkOrdRoutingDto> ProcPretreatment(WorkOrdMaster workOrd,List<WorkOrdRouting> woRuntings, List<ProdLineDetail> prodLines, List<ScheduleResultOpMaster> schedules)
|
|
|
+ public List<WorkOrdRoutingDto> ProcPretreatment(WorkOrdMaster workOrd, List<WorkOrdRouting> woRuntings, List<ProdLineDetail> prodLines, List<ScheduleResultOpMaster> schedules)
|
|
|
{
|
|
|
List<WorkOrdRoutingDto> routingDtos = new List<WorkOrdRoutingDto>();
|
|
|
//当前工单计划开始时间(默认加两天)
|
|
|
DateTime planStart = workOrd.OrdDate.GetValueOrDefault().AddDays(2);
|
|
|
//取主工序(第一层级工序)
|
|
|
- var firsts = woRuntings.Where(p =>p.ParentOp == 0).OrderByDescending(p => p.OP).ToList();
|
|
|
+ var firsts = woRuntings.Where(p => p.ParentOp == 0).OrderByDescending(p => p.OP).ToList();
|
|
|
if (firsts.Count == 0)
|
|
|
{
|
|
|
return routingDtos;
|
|
|
@@ -840,13 +843,14 @@ namespace Business.Quartz
|
|
|
}
|
|
|
//主工序对应的产线(目前只考虑一个产品对应一条产线的情况)
|
|
|
var line = prodLines.Where(p => p.Part == lastOp.ItemNum && p.Op == lastOp.OP).FirstOrDefault();
|
|
|
- if (line != null) {
|
|
|
+ if (line != null)
|
|
|
+ {
|
|
|
dto.Line = line.Line;
|
|
|
dto.Rate = line.Rate;
|
|
|
dto.SetupTime = 0;
|
|
|
//获取产线占用结束时间
|
|
|
var schedule = schedules.Where(p => p.Line == line.Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
- dto.StartTime = schedule == null ? planStart : (schedule.WorkEndTime <= planStart ? planStart : schedule.WorkEndTime);
|
|
|
+ dto.StartTime = schedule == null ? planStart : schedule.WorkEndTime <= planStart ? planStart : schedule.WorkEndTime;
|
|
|
}
|
|
|
routingDtos.Add(dto);
|
|
|
|
|
|
@@ -867,7 +871,7 @@ namespace Business.Quartz
|
|
|
public void RecursionProc(List<WorkOrdRouting> woRuntings, List<WorkOrdRouting> preLevels, int level, List<WorkOrdRoutingDto> routingDtos, List<ProdLineDetail> prodLines)
|
|
|
{
|
|
|
//获取当前层级工序
|
|
|
- var curLevels = woRuntings.Where(p => preLevels.Select(m=>m.OP).Contains(p.ParentOp)).ToList();
|
|
|
+ var curLevels = woRuntings.Where(p => preLevels.Select(m => m.OP).Contains(p.ParentOp)).ToList();
|
|
|
if (curLevels.Count == 0)
|
|
|
{
|
|
|
return;
|
|
|
@@ -877,8 +881,9 @@ namespace Business.Quartz
|
|
|
foreach (var item in parentOps)
|
|
|
{
|
|
|
var dto = new WorkOrdRoutingDto();
|
|
|
- var lastOp = curLevels.Where(p=>p.ParentOp == item).OrderByDescending(m=>m.OP).FirstOrDefault();
|
|
|
- if (lastOp == null){
|
|
|
+ var lastOp = curLevels.Where(p => p.ParentOp == item).OrderByDescending(m => m.OP).FirstOrDefault();
|
|
|
+ if (lastOp == null)
|
|
|
+ {
|
|
|
continue;
|
|
|
}
|
|
|
dto.Op = lastOp.OP;
|
|
|
@@ -902,7 +907,7 @@ namespace Business.Quartz
|
|
|
routingDtos.Add(dto);
|
|
|
}
|
|
|
//递归
|
|
|
- RecursionProc(woRuntings, curLevels, level + 1, routingDtos,prodLines);
|
|
|
+ RecursionProc(woRuntings, curLevels, level + 1, routingDtos, prodLines);
|
|
|
}
|
|
|
}
|
|
|
}
|