2024-01-22 09:17:01 +08:00
|
|
|
|
using APT.BaseData.Domain.ApiModel.Platform;
|
|
|
|
|
|
using APT.BaseData.Domain.Entities.FM;
|
|
|
|
|
|
using APT.BaseData.Domain.Enums;
|
|
|
|
|
|
using APT.Infrastructure.Api;
|
|
|
|
|
|
using APT.Infrastructure.Core;
|
|
|
|
|
|
using APT.Utility;
|
|
|
|
|
|
using APT.WebApi.Models;
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
|
|
|
|
namespace APT.PP.WebApi.Controllers
|
|
|
|
|
|
{
|
|
|
|
|
|
[Route("api/PP/DepartmentCalendar")]
|
|
|
|
|
|
[TypeFilter(typeof(CustomActionFilterAttribute))]
|
|
|
|
|
|
public class RunController : APTApiController<T_FM_BASE_CONFIG>
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 排班跑批接口
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="entity"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpPost, Route("Running")]
|
|
|
|
|
|
public JsonActionResult<bool> Running([FromBody] KeywordFilter filter)
|
|
|
|
|
|
{
|
|
|
|
|
|
return SafeExecute<bool>(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
var baseConfig = this.GetEntityByRedis<T_FM_BASE_CONFIG>(filter.GetOrgId().ToString(), filter.GetOrgId());
|
|
|
|
|
|
if (baseConfig == null)
|
|
|
|
|
|
this.ThrowError("010002");
|
|
|
|
|
|
var perDay = baseConfig.CALENDAR_DAYS;
|
|
|
|
|
|
var perEndDay = DateTime.Now.AddDays(perDay).Date;
|
|
|
|
|
|
//获取日历配置表
|
|
|
|
|
|
var configData = this.GetEntities<T_FM_DEPARTMENT_CALENDAR_CONFIG>(d => d.ENABLE_STATUS == Convert.ToInt32(FMEnableStatusEnum.启用)
|
|
|
|
|
|
&& d.ORG_ID == filter.OrgId && d.CURR_TIME < perEndDay && d.END_TIME >= DateTime.Now
|
|
|
|
|
|
&& d.Nav_DepartmentCalendarConfigDetail.Any()
|
|
|
|
|
|
&& d.Nav_DepartmentCalendarConfigTeam.Any(), filter,
|
|
|
|
|
|
"Nav_Calendar.Nav_Holiday.Nav_HolidayDetails",
|
|
|
|
|
|
"Nav_DepartmentCalendarConfigDetail", "Nav_DepartmentCalendarConfigTeam").ToList();
|
|
|
|
|
|
var classIds = configData.SelectMany(i => i.Nav_DepartmentCalendarConfigDetail).Select(i => i.CLASS_ID).ToArray();
|
|
|
|
|
|
var teamIds = configData.SelectMany(i => i.Nav_DepartmentCalendarConfigTeam).Select(i => i.TEAM_ID).ToArray();
|
|
|
|
|
|
var allClass = this.GetEntities<T_FM_CLASS>(i => classIds.Contains(i.ID), filter, "Nav_ClassDetail");
|
|
|
|
|
|
var allTeamPersons = this.GetEntities<T_FM_TEAM_PERSON>(i => teamIds.Contains(i.TEAM_ID), filter);
|
|
|
|
|
|
List<T_FM_DEPARTMENT_SCHEDULING> shiftList = new List<T_FM_DEPARTMENT_SCHEDULING>();//排版表
|
|
|
|
|
|
List<T_FM_DEPARTMENT_SCHEDULING_DETAIL> shiftDetailList = new List<T_FM_DEPARTMENT_SCHEDULING_DETAIL>();//排版明细表
|
|
|
|
|
|
var nodelModels = new List<ControlNodelModel>();//所有生产单元
|
|
|
|
|
|
var baseFilter = new BaseFilter(filter.OrgId);
|
|
|
|
|
|
baseFilter.Order = DbOrder.ASC;
|
|
|
|
|
|
baseFilter.Level = -1;
|
|
|
|
|
|
baseFilter.IsParentData = false;
|
|
|
|
|
|
baseFilter.SelectField = new string[] { "ID" };
|
|
|
|
|
|
var workShops = this.GetEntities<T_FM_DEPARTMENT>(x => x.DEPARTMENT_TYPE == (int)FMDepartmentType.车间, baseFilter);
|
|
|
|
|
|
string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
|
|
|
|
|
|
foreach (var nodelModel in workShops)
|
|
|
|
|
|
{
|
|
|
|
|
|
var shopCalenDarConfgs = configData.Where(i => i.DEPARTMENT_ID == nodelModel.ID).ToList();
|
|
|
|
|
|
foreach (var sh in shopCalenDarConfgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
//通过第一个班组判断顺序
|
|
|
|
|
|
var orderTeam = sh.Nav_DepartmentCalendarConfigTeam.OrderBy(i => i.NUM).ToList();
|
|
|
|
|
|
var groupOrderTeam = orderTeam.GroupBy(i => i.NUM).ToList();
|
|
|
|
|
|
var orderClass = sh.Nav_DepartmentCalendarConfigDetail.OrderBy(i => i.NUM).ToList();
|
|
|
|
|
|
var fristTeam = groupOrderTeam.FirstOrDefault().FirstOrDefault();
|
|
|
|
|
|
var fristClass = orderClass.FirstOrDefault();
|
|
|
|
|
|
//排序排班的最后几条记录
|
|
|
|
|
|
BasePageFilter pageFilter = new BasePageFilter(1, sh.CYCLE);
|
|
|
|
|
|
pageFilter.OrgId = filter.OrgId;
|
|
|
|
|
|
pageFilter.Order = DbOrder.DESC;
|
|
|
|
|
|
pageFilter.Sort = "DATE_TIME";
|
|
|
|
|
|
var shiftData = this.GetOrderPageEntities<T_FM_DEPARTMENT_SCHEDULING>(s => s.DEPARTMENT_CALENDAR_CONFIG_ID == sh.ID
|
|
|
|
|
|
&& s.DATE_TIME < sh.CURR_TIME && s.TEAM_ID == fristTeam.TEAM_ID, pageFilter);
|
|
|
|
|
|
var curPerEndDay = perEndDay > sh.END_TIME ? sh.END_TIME : perEndDay;
|
|
|
|
|
|
var dayIndex = 0;
|
|
|
|
|
|
var classIndex = 0;
|
|
|
|
|
|
Guid lastClassId = fristClass.ID;
|
|
|
|
|
|
//判断班次顺序
|
|
|
|
|
|
if (shiftData != null && shiftData.Data.Any())
|
|
|
|
|
|
{
|
|
|
|
|
|
var pageData = shiftData.Data.ToList();
|
|
|
|
|
|
for (var index = 0; index < pageData.Count; index++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (index == 0)
|
|
|
|
|
|
{
|
2024-05-27 14:31:27 +08:00
|
|
|
|
lastClassId = (Guid)pageData[index].CLASS_ID;
|
2024-01-22 09:17:01 +08:00
|
|
|
|
var nowClass = sh.Nav_DepartmentCalendarConfigDetail.FirstOrDefault(i => i.CLASS_ID == lastClassId);
|
|
|
|
|
|
classIndex = sh.Nav_DepartmentCalendarConfigDetail.Count(i => i.NUM < nowClass.NUM);
|
|
|
|
|
|
dayIndex++;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (lastClassId == pageData[index].CLASS_ID)
|
|
|
|
|
|
{
|
|
|
|
|
|
dayIndex++;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var totalCurrentIndex = classIndex * sh.CYCLE + dayIndex;//总的顺序
|
|
|
|
|
|
var totalIndex = orderClass.Count * sh.CYCLE;
|
|
|
|
|
|
for (var starTime = sh.CURR_TIME.Date; starTime <= curPerEndDay; starTime = starTime.AddDays(1))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
bool isWork = true;
|
|
|
|
|
|
var holidayWeeks = sh.Nav_Calendar.Nav_Holiday;
|
|
|
|
|
|
string week = Day[Convert.ToInt32(starTime.DayOfWeek.ToString("d"))].ToString();
|
|
|
|
|
|
switch (week)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "星期一":
|
|
|
|
|
|
isWork = holidayWeeks.MON;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "星期二":
|
|
|
|
|
|
isWork = holidayWeeks.TUES;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "星期三":
|
|
|
|
|
|
isWork = holidayWeeks.WED;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "星期四":
|
|
|
|
|
|
isWork = holidayWeeks.THUR;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "星期五":
|
|
|
|
|
|
isWork = holidayWeeks.FRI;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "星期六":
|
|
|
|
|
|
isWork = holidayWeeks.SAT;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "星期日":
|
|
|
|
|
|
isWork = holidayWeeks.SUN;
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
var holidayDetails = sh.Nav_Calendar.Nav_Holiday.Nav_HolidayDetails;//假期详情
|
|
|
|
|
|
foreach (var holidayDetail in holidayDetails)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (holidayDetail.START_TIME.Date <= starTime.Date && holidayDetail.END_TIME.Date >= starTime.Date && !holidayDetail.WORK)//休息日
|
|
|
|
|
|
isWork = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isWork)
|
|
|
|
|
|
{
|
|
|
|
|
|
//一个循环结束
|
|
|
|
|
|
if (totalCurrentIndex == totalIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
totalCurrentIndex = 0;
|
|
|
|
|
|
classIndex = 0;
|
|
|
|
|
|
dayIndex = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
//一个周期换班次
|
|
|
|
|
|
if (dayIndex == sh.CYCLE)
|
|
|
|
|
|
{
|
|
|
|
|
|
classIndex++;
|
|
|
|
|
|
dayIndex = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
//var minCount = Math.Min(orderClass.Count, groupOrderTeam.Count);
|
|
|
|
|
|
//遍历班次
|
|
|
|
|
|
for (var t = 0; t < orderClass.Count; t++)
|
|
|
|
|
|
{
|
|
|
|
|
|
//班组对应班次
|
|
|
|
|
|
var teamClasIndex = (classIndex + t) % orderClass.Count;
|
|
|
|
|
|
var objClass = allClass.FirstOrDefault(i => i.ID == orderClass[teamClasIndex].CLASS_ID);
|
|
|
|
|
|
|
|
|
|
|
|
var startTimeStr = starTime.ToString("yyyy-MM-dd");
|
|
|
|
|
|
foreach (var team in groupOrderTeam[t])
|
|
|
|
|
|
{
|
|
|
|
|
|
T_FM_DEPARTMENT_SCHEDULING shift = new T_FM_DEPARTMENT_SCHEDULING
|
|
|
|
|
|
{
|
|
|
|
|
|
ID = Guid.NewGuid(),
|
|
|
|
|
|
ORG_ID = filter.OrgId,
|
|
|
|
|
|
DEPARTMENT_ID = (Guid)sh.DEPARTMENT_ID,
|
|
|
|
|
|
DEPARTMENT_CALENDAR_CONFIG_ID = sh.ID,
|
|
|
|
|
|
DATE_TIME = starTime,
|
|
|
|
|
|
START_TIME = DateTime.Parse(startTimeStr
|
|
|
|
|
|
+ " " + objClass.Nav_ClassDetail.Min(i => i.STARTTIME).ToString("HH:mm:ss")),
|
|
|
|
|
|
END_TIME = DateTime.Parse(startTimeStr
|
|
|
|
|
|
+ " " + objClass.Nav_ClassDetail.Max(i => i.ENDTIME).ToString("HH:mm:ss")),
|
|
|
|
|
|
CLASS_ID = orderClass[teamClasIndex].CLASS_ID,
|
|
|
|
|
|
TEAM_ID = team.TEAM_ID,
|
|
|
|
|
|
NUM = orderClass[teamClasIndex].NUM,
|
|
|
|
|
|
ENABLE_STATUS = Convert.ToInt32(FMEnableStatusEnum.启用)
|
|
|
|
|
|
};
|
|
|
|
|
|
if (shift.END_TIME < shift.START_TIME)
|
|
|
|
|
|
{
|
|
|
|
|
|
shift.END_TIME=shift.END_TIME.AddDays(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
shiftList.Add(shift);
|
|
|
|
|
|
|
|
|
|
|
|
var theClass = allClass.FirstOrDefault(i => i.ID == shift.CLASS_ID);
|
|
|
|
|
|
if (theClass != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var teamPersons = allTeamPersons.Where(i => i.TEAM_ID == shift.TEAM_ID).Distinct(t=>t.PERSON_ID).ToList();
|
|
|
|
|
|
foreach (var teamPerson in teamPersons)
|
|
|
|
|
|
{
|
|
|
|
|
|
var schDetail = new T_FM_DEPARTMENT_SCHEDULING_DETAIL
|
|
|
|
|
|
{
|
|
|
|
|
|
ID = Guid.NewGuid(),
|
|
|
|
|
|
DEPARTMENT_SCHEDULING_ID = shift.ID,
|
|
|
|
|
|
PERSON_ID = teamPerson.PERSON_ID,
|
|
|
|
|
|
ORG_ID = filter.OrgId,
|
|
|
|
|
|
};
|
|
|
|
|
|
shiftDetailList.Add(schDetail);
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
dayIndex++;
|
|
|
|
|
|
sh.CURR_TIME = curPerEndDay.AddDays(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Console.WriteLine(ex.ToString());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//统一提交数据
|
|
|
|
|
|
this.UnifiedCommit(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (shiftList.Any())
|
|
|
|
|
|
this.BantchAddEntityNoCommit(shiftList);
|
|
|
|
|
|
if (shiftDetailList.Any())
|
|
|
|
|
|
this.BantchAddEntityNoCommit(shiftDetailList);
|
|
|
|
|
|
this.BantchUpdateEntityNoCommit(configData, "CURR_TIME");
|
|
|
|
|
|
});
|
|
|
|
|
|
return true;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void GetCascaderOptions(List<ControlNodelModel> options, IEnumerable<TreeNode<T_FM_DEPARTMENT>> nodes)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var item in nodes)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.Children.Any())
|
|
|
|
|
|
{
|
|
|
|
|
|
options.Add(new ControlNodelModel { Value = item.Node.ID.ToString(), Label = item.Node.NAME });
|
|
|
|
|
|
GetCascaderOptions(options, item.Children);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
options.Add(new ControlNodelModel { Value = item.Node.ID.ToString(), Label = item.Node.NAME });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|