diff --git a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs index c34ea385..2a7287f7 100644 --- a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs +++ b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs @@ -49,14 +49,33 @@ public class WorkGridScheduleService : IWorkGridScheduleService var others = request.UserCodes.Except(workGridUserCodes).ToList(); others.ThrowIfExists($"{others.Join(",")}非当前网格人员"); - var exists = await _dbContext.Queryable() + var dateBefore = request.Date.AddDays(-1); + var dateAfter = request.Date.AddDays(1); + + var scheduleRange = await _dbContext.Queryable() .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, diff --git a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs index c1f724c3..b60bff8e 100644 --- a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs +++ b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs @@ -193,17 +193,20 @@ 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); + } } } - + return myWorkGrid; }