fix 优化排班控制

This commit is contained in:
2025-03-06 17:48:35 +08:00
parent 6a0f448531
commit d90486017e
2 changed files with 34 additions and 12 deletions

View File

@@ -49,14 +49,33 @@ public class WorkGridScheduleService : IWorkGridScheduleService
var others = request.UserCodes.Except(workGridUserCodes).ToList();
others.ThrowIfExists($"{others.Join(",")}非当前网格人员");
var exists = await _dbContext.Queryable<WorkGridScheduleEntity>()
var dateBefore = request.Date.AddDays(-1);
var dateAfter = request.Date.AddDays(1);
var scheduleRange = await _dbContext.Queryable<WorkGridScheduleEntity>()
.Where(x => x.WorkGridCode == request.WorkGridCode
&& x.Date == request.Date
&& x.Date >= dateBefore && x.Date <= dateAfter
&& request.UserCodes.Contains(x.UserCode)
)
.AnyAsync();
.ToListAsync();
exists.ThrowIfTrue("当天已经存在排班人员");
var existsUserCodes = scheduleRange.Where(x => x.Date == request.Date && request.UserCodes.Contains(x.UserCode)).Select(x => x.UserCode).ToList();
existsUserCodes.ThrowIfExists(existsUserCodes.Join(",") + "当天已存在排班");
if (request.PeriodType == WorkGridTimePeriodEnumType.Day)
{
existsUserCodes = scheduleRange
.Where(x => x.Date == dateBefore && x.PeriodType == WorkGridTimePeriodEnumType.Night && request.UserCodes.Contains(x.UserCode))
.Select(x => x.UserCode).ToList();
existsUserCodes.ThrowIfExists(existsUserCodes.Join(",") + $"在{dateBefore.ToString("yyyy-MM-dd")}已存在{WorkGridTimePeriodEnumType.Night.GetDescription()}");
}
else if (request.PeriodType == WorkGridTimePeriodEnumType.Night)
{
existsUserCodes = scheduleRange
.Where(x => x.Date == dateAfter && x.PeriodType == WorkGridTimePeriodEnumType.Day && request.UserCodes.Contains(x.UserCode))
.Select(x => x.UserCode).ToList();
existsUserCodes.ThrowIfExists(existsUserCodes.Join(",") + $"在{dateAfter.ToString("yyyy-MM-dd")}已存在{WorkGridTimePeriodEnumType.Day.GetDescription()}");
}
var maximumConsecutiveDtos = await MaximumConsecutiveUserCodesAsync(request.UserCodes, 10, request.Date);
maximumConsecutiveDtos.ThrowIfExists(maximumConsecutiveDtos.Select(x => $"{x.UserCode}已经连续排班10天({x.Start}-{x.End}),不可继续排班").Join("\r\n"));
@@ -228,7 +247,7 @@ public class WorkGridScheduleService : IWorkGridScheduleService
WITH ranked_dates AS (SELECT UserCode,
date,
ROW_NUMBER() OVER (PARTITION BY UserCode ORDER BY date) AS rn
FROM WorkGridSchedules where UserCode in ({p})
FROM WorkGridSchedules where IsDeleted = 0 and UserCode in ({p})
GROUP BY UserCode, date),
grouped AS (SELECT UserCode,
date,

View File

@@ -193,14 +193,17 @@ public class WorkGridService : IWorkGridService
})
.SingleAsync();
var userCodes = myWorkGrid.UserInfos.Select(x => x.Code).ToList();
if (userCodes.Any())
if (myWorkGrid != null)
{
var maximumConsecutiveUserCodes = await _workGridScheduleService.MaximumConsecutiveUserCodesAsync(userCodes, 1, DateOnly.FromDateTime(request.Date));
foreach (var item in myWorkGrid.UserInfos)
var userCodes = myWorkGrid.UserInfos.Select(x => x.Code).ToList();
if (userCodes.Any())
{
item.MaximumConsecutiveSchedules = maximumConsecutiveUserCodes.FirstOrDefault(x => x.UserCode == item.Code);
var maximumConsecutiveUserCodes = await _workGridScheduleService.MaximumConsecutiveUserCodesAsync(userCodes, 1, DateOnly.FromDateTime(request.Date));
foreach (var item in myWorkGrid.UserInfos)
{
item.MaximumConsecutiveSchedules = maximumConsecutiveUserCodes.FirstOrDefault(x => x.UserCode == item.Code);
}
}
}