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 { /// /// 排班跑批接口 /// /// /// [HttpPost, Route("Running")] public JsonActionResult Running([FromBody] KeywordFilter filter) { return SafeExecute(() => { var baseConfig = this.GetEntityByRedis(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(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(i => classIds.Contains(i.ID), filter, "Nav_ClassDetail"); var allTeamPersons = this.GetEntities(i => teamIds.Contains(i.TEAM_ID), filter); List shiftList = new List();//排版表 List shiftDetailList = new List();//排版明细表 var nodelModels = new List();//所有生产单元 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(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(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) { lastClassId = pageData[index].CLASS_ID; 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 options, IEnumerable> 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 }); } } } } }