fix 优化排班控制
This commit is contained in:
@@ -49,14 +49,33 @@ public class WorkGridScheduleService : IWorkGridScheduleService
|
|||||||
var others = request.UserCodes.Except(workGridUserCodes).ToList();
|
var others = request.UserCodes.Except(workGridUserCodes).ToList();
|
||||||
others.ThrowIfExists($"{others.Join(",")}非当前网格人员");
|
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
|
.Where(x => x.WorkGridCode == request.WorkGridCode
|
||||||
&& x.Date == request.Date
|
&& x.Date >= dateBefore && x.Date <= dateAfter
|
||||||
&& request.UserCodes.Contains(x.UserCode)
|
&& 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);
|
var maximumConsecutiveDtos = await MaximumConsecutiveUserCodesAsync(request.UserCodes, 10, request.Date);
|
||||||
maximumConsecutiveDtos.ThrowIfExists(maximumConsecutiveDtos.Select(x => $"{x.UserCode}已经连续排班10天({x.Start}-{x.End}),不可继续排班").Join("\r\n"));
|
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,
|
WITH ranked_dates AS (SELECT UserCode,
|
||||||
date,
|
date,
|
||||||
ROW_NUMBER() OVER (PARTITION BY UserCode ORDER BY date) AS rn
|
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),
|
GROUP BY UserCode, date),
|
||||||
grouped AS (SELECT UserCode,
|
grouped AS (SELECT UserCode,
|
||||||
date,
|
date,
|
||||||
|
|||||||
@@ -193,17 +193,20 @@ public class WorkGridService : IWorkGridService
|
|||||||
})
|
})
|
||||||
.SingleAsync();
|
.SingleAsync();
|
||||||
|
|
||||||
var userCodes = myWorkGrid.UserInfos.Select(x => x.Code).ToList();
|
if (myWorkGrid != null)
|
||||||
if (userCodes.Any())
|
|
||||||
{
|
{
|
||||||
var maximumConsecutiveUserCodes = await _workGridScheduleService.MaximumConsecutiveUserCodesAsync(userCodes, 1, DateOnly.FromDateTime(request.Date));
|
var userCodes = myWorkGrid.UserInfos.Select(x => x.Code).ToList();
|
||||||
|
if (userCodes.Any())
|
||||||
foreach (var item in myWorkGrid.UserInfos)
|
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return myWorkGrid;
|
return myWorkGrid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user