|
|
@@ -4,6 +4,7 @@ using Business.Domain;
|
|
|
using Business.Dto;
|
|
|
using Business.EntityFrameworkCore.SqlRepositories;
|
|
|
using Business.ResourceExamineManagement.Dto;
|
|
|
+using Business.StructuredDB.Production;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Collections.Immutable;
|
|
|
@@ -70,7 +71,14 @@ namespace Business.ResourceExamineManagement
|
|
|
/// 产线休息时间记录表
|
|
|
/// </summary>
|
|
|
private ISqlRepository<QualityLineWorkDetail> _qualityLineWorkDetail;
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 产线人员配置表
|
|
|
+ /// </summary>
|
|
|
+ private ISqlRepository<ProdLineDetailRunCrew> _prodLineDetailRunCrew;
|
|
|
+ /// <summary>
|
|
|
+ /// 加班设置表
|
|
|
+ /// </summary>
|
|
|
+ private ISqlRepository<ResourceOccupancyTime> _resourceOccupancyTime;
|
|
|
/// <summary>
|
|
|
/// 节假日记录表
|
|
|
/// </summary>
|
|
|
@@ -114,6 +122,8 @@ namespace Business.ResourceExamineManagement
|
|
|
ISqlRepository<WorkOrdDetail> workOrdDetail,
|
|
|
ISqlRepository<WorkOrdRouting> workOrdRouting,
|
|
|
ISqlRepository<ProdLineDetail> prodLineDetail,
|
|
|
+ ISqlRepository<ProdLineDetailRunCrew> prodLineDetailRunCrew,
|
|
|
+ ISqlRepository<ResourceOccupancyTime> resourceOccupancyTime,
|
|
|
ISqlRepository<PeriodSequenceDet> periodSequenceDet,
|
|
|
ISqlRepository<ScheduleResultOpMaster> scheduleResultOpMaster,
|
|
|
ISqlRepository<InvMaster> invMaster,
|
|
|
@@ -128,6 +138,8 @@ namespace Business.ResourceExamineManagement
|
|
|
_workOrdDetail = workOrdDetail;
|
|
|
_workOrdRouting = workOrdRouting;
|
|
|
_prodLineDetail = prodLineDetail;
|
|
|
+ _prodLineDetailRunCrew = prodLineDetailRunCrew;
|
|
|
+ _resourceOccupancyTime = resourceOccupancyTime;
|
|
|
_periodSequenceDet = periodSequenceDet;
|
|
|
_scheduleResultOpMaster = scheduleResultOpMaster;
|
|
|
_invMaster = invMaster;
|
|
|
@@ -154,7 +166,7 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <param name="workOrds">工单:定时任务执行时count=0;资源检查调用count>0</param>
|
|
|
/// <param name="factoryid">工单的工厂id</param>
|
|
|
/// <returns></returns>
|
|
|
- public async Task DoProductShcedule(List<WorkOrdMaster> workOrds,string factoryid)
|
|
|
+ public async Task DoProductShcedule(List<WorkOrdMaster> workOrds, string factoryid)
|
|
|
{
|
|
|
domain = factoryid;
|
|
|
if (workOrds.Count == 0)//定时任务调用时,需要获取工单数据
|
|
|
@@ -172,7 +184,8 @@ namespace Business.ResourceExamineManagement
|
|
|
{
|
|
|
earlist = DateTime.Now.Date.AddDays(7);
|
|
|
}
|
|
|
- else {
|
|
|
+ else
|
|
|
+ {
|
|
|
earlist = workOrds.Min(p => p.OrdDate.GetValueOrDefault()).Date;
|
|
|
}
|
|
|
|
|
|
@@ -182,6 +195,10 @@ 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();
|
|
|
+ //获取加班设置
|
|
|
+ List<ResourceOccupancyTime> 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);
|
|
|
//获取当前日期往后的排产记录数据
|
|
|
@@ -233,6 +250,11 @@ namespace Business.ResourceExamineManagement
|
|
|
foreach (var rut in routingDtos)
|
|
|
{
|
|
|
var lineCals = calendars.Where(p => p.ProdLine == rut.Line).ToList();
|
|
|
+ //当前产线未配置工作日历取标准无产线工作日历使用
|
|
|
+ if (lineCals.Count == 0)
|
|
|
+ {
|
|
|
+ lineCals = calendars.Where(p => string.IsNullOrEmpty(p.ProdLine)).ToList();
|
|
|
+ }
|
|
|
if (lineCals.Select(p => p.WeekDay).Distinct().Count() != 7)
|
|
|
{
|
|
|
flag = true;
|
|
|
@@ -503,7 +525,7 @@ namespace Business.ResourceExamineManagement
|
|
|
}
|
|
|
|
|
|
//开始时间往后推到半小时/整点节点
|
|
|
- actStart = CalcStartTimeAfter(actStart);
|
|
|
+ //actStart = CalcStartTimeAfter(actStart);
|
|
|
//当天的工作日历
|
|
|
var shopCal = curCalendars.Where(p => p.WeekDay == weekDay).First();
|
|
|
//当前日期的工作时间段
|
|
|
@@ -838,44 +860,79 @@ namespace Business.ResourceExamineManagement
|
|
|
/// <returns></returns>
|
|
|
public List<WorkOrdRoutingDto> ProcPretreatment(WorkOrdMaster workOrd, List<WorkOrdRouting> woRuntings, List<ProdLineDetail> prodLines, List<ScheduleResultOpMaster> schedules)
|
|
|
{
|
|
|
+ #region 注释旧逻辑
|
|
|
+ //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();
|
|
|
+ //if (firsts.Count == 0)
|
|
|
+ //{
|
|
|
+ // return routingDtos;
|
|
|
+ //}
|
|
|
+ //WorkOrdRoutingDto dto = new WorkOrdRoutingDto();
|
|
|
+ ////主工序按照Op排序,取最大Op
|
|
|
+ //var lastOp = firsts.First();
|
|
|
+ //dto.ParentOp = lastOp.ParentOp;
|
|
|
+ //dto.level = 1;
|
|
|
+ //dto.Op = lastOp.OP;
|
|
|
+ //dto.ChdParentOps = new List<int>();
|
|
|
+ ////获取当前层级工序中有子级的工序集合
|
|
|
+ //var childs = woRuntings.Where(p => firsts.Select(m => m.OP).Contains(p.ParentOp)).Select(m => m.ParentOp).Distinct().ToList();
|
|
|
+ //if (childs.Count > 0)
|
|
|
+ //{
|
|
|
+ // dto.ChdParentOps = childs;
|
|
|
+ //}
|
|
|
+ ////主工序对应的产线(目前只考虑一个产品对应一条产线的情况)
|
|
|
+ //var line = prodLines.Where(p => p.Part == lastOp.ItemNum && p.Op == lastOp.OP).FirstOrDefault();
|
|
|
+ //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;
|
|
|
+ //}
|
|
|
+ //routingDtos.Add(dto);
|
|
|
+
|
|
|
+ ////递归处理其他层级工序
|
|
|
+ //RecursionProc(woRuntings, firsts, 1, routingDtos, prodLines);
|
|
|
+ #endregion
|
|
|
+ #region 新逻辑
|
|
|
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(x => x.WorkOrd == workOrd.WorkOrd && x.MilestoneOp).ToList();
|
|
|
if (firsts.Count == 0)
|
|
|
{
|
|
|
return routingDtos;
|
|
|
}
|
|
|
- WorkOrdRoutingDto dto = new WorkOrdRoutingDto();
|
|
|
- //主工序按照Op排序,取最大Op
|
|
|
- var lastOp = firsts.First();
|
|
|
- dto.ParentOp = lastOp.ParentOp;
|
|
|
- dto.level = 1;
|
|
|
- dto.Op = lastOp.OP;
|
|
|
- dto.ChdParentOps = new List<int>();
|
|
|
- //获取当前层级工序中有子级的工序集合
|
|
|
- var childs = woRuntings.Where(p => firsts.Select(m => m.OP).Contains(p.ParentOp)).Select(m => m.ParentOp).Distinct().ToList();
|
|
|
- if (childs.Count > 0)
|
|
|
- {
|
|
|
- dto.ChdParentOps = childs;
|
|
|
- }
|
|
|
- //主工序对应的产线(目前只考虑一个产品对应一条产线的情况)
|
|
|
- var line = prodLines.Where(p => p.Part == lastOp.ItemNum && p.Op == lastOp.OP).FirstOrDefault();
|
|
|
- if (line != null)
|
|
|
+ foreach (var item in firsts)
|
|
|
{
|
|
|
- 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;
|
|
|
+ //多产线处理
|
|
|
+ var line = prodLines.Where(p => p.Part == item.ItemNum && p.Op == item.OP).ToList();
|
|
|
+ foreach (var data in line)
|
|
|
+ {
|
|
|
+ WorkOrdRoutingDto dto = new WorkOrdRoutingDto();
|
|
|
+ dto.Line = data.Line;
|
|
|
+ dto.Rate = data.Rate;
|
|
|
+ dto.SetupTime = data.SetupTime;
|
|
|
+ dto.sequence = data.Sequence;
|
|
|
+ dto.Op = data.Op.Value;
|
|
|
+ //获取产线占用结束时间
|
|
|
+ var schedule = schedules.Where(p => p.Line == data.Line).OrderByDescending(p => p.WorkEndTime).FirstOrDefault();
|
|
|
+ dto.StartTime = schedule == null ? planStart : schedule.WorkEndTime <= planStart ? planStart : schedule.WorkEndTime;
|
|
|
+ routingDtos.Add(dto);
|
|
|
+ }
|
|
|
}
|
|
|
- routingDtos.Add(dto);
|
|
|
-
|
|
|
+ //多生产线优先级处理
|
|
|
+ //var
|
|
|
+ //var Lines = routingDtos.GroupBy(x => x.Line);
|
|
|
//递归处理其他层级工序
|
|
|
- RecursionProc(woRuntings, firsts, 1, routingDtos, prodLines);
|
|
|
-
|
|
|
+ //RecursionProc(woRuntings, firsts, 1, routingDtos, prodLines);
|
|
|
+ #endregion
|
|
|
return routingDtos;
|
|
|
}
|
|
|
|