feat 最大连续排班控制增加
This commit is contained in:
@@ -31,6 +31,13 @@ public class WorkGridsController : ControllerBase
|
||||
_workGridScheduleService = workGridScheduleService;
|
||||
}
|
||||
|
||||
[HttpGet("gainfo-selections")]
|
||||
public async Task<Pagination<WorkGridGainfoPageResponse>> GetPageAsync([FromQuery] WorkGridGainfoPageRequest request)
|
||||
{
|
||||
return await _workGridService.GetPageAsync(request);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 保存
|
||||
/// </summary>
|
||||
@@ -53,7 +60,7 @@ public class WorkGridsController : ControllerBase
|
||||
{
|
||||
return await _workGridService.GetPageAsync(request);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 修改网格管理者
|
||||
/// </summary>
|
||||
@@ -125,6 +132,7 @@ public class WorkGridsController : ControllerBase
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
[HttpPost("user/schedule/save")]
|
||||
[Transactional]
|
||||
public async Task SaveScheduleAsync(WorkGridScheduleSaveRequest request)
|
||||
{
|
||||
await _workGridScheduleService.SaveAsync(request);
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
namespace Dlhis.Basic.WorkGrids.Request;
|
||||
|
||||
public class WorkGridGainfoPageRequest : PageDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询日期内的连续排数
|
||||
/// </summary>
|
||||
public DateTime Date { get; set; } = DateTime.Today;
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
using Dlhis.Entity.Basic.Enums;
|
||||
using Kurisu.AspNetCore.Utils.Extensions;
|
||||
|
||||
namespace Dlhis.Basic.WorkGrids.Response;
|
||||
|
||||
public class WorkGridGainfoPageResponse
|
||||
{
|
||||
public long Id { get; set; }
|
||||
|
||||
public string No { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 人员类型
|
||||
/// </summary>
|
||||
public GainfoUserTypeEnumType? Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 姓名
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 工号
|
||||
/// </summary>
|
||||
public string Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 性别
|
||||
/// </summary>
|
||||
public GenderEnumType Gender { get; set; }
|
||||
|
||||
public string GenderDesc => Gender.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 部门编码
|
||||
/// </summary>
|
||||
public string DepartmentNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门名称
|
||||
/// </summary>
|
||||
public string DepartmentName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 有工作网格
|
||||
/// </summary>
|
||||
public bool HasWorkGrid => WorkGridName.IsPresent();
|
||||
/// <summary>
|
||||
/// 网格名称
|
||||
/// </summary>
|
||||
public string WorkGridName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大连续排班信息
|
||||
/// </summary>
|
||||
public WorkGridScheduleMaximumConsecutiveDto MaximumConsecutiveSchedules { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
namespace Dlhis.Basic.WorkGrids.Response;
|
||||
|
||||
public class WorkGridScheduleMaximumConsecutiveDto
|
||||
{
|
||||
public string UserCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 连续次数
|
||||
/// </summary>
|
||||
public int Count { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始日期
|
||||
/// </summary>
|
||||
public DateOnly Start { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 结束日期
|
||||
/// </summary>
|
||||
public DateOnly End { get; set; }
|
||||
}
|
||||
@@ -21,4 +21,6 @@ public interface IWorkGridScheduleService : IScopeDependency
|
||||
Task<Pagination<WorkGridScheduleAttendancePageResponse>> GetAttendancePageAsync(WorkGridScheduleAttendancePageRequest request);
|
||||
|
||||
Task ManuallyUploadAsync(List<long> logIds);
|
||||
|
||||
Task<List<WorkGridScheduleMaximumConsecutiveDto>> MaximumConsecutiveUserCodesAsync(List<string> userCodes, int days, DateOnly date);
|
||||
}
|
||||
@@ -9,6 +9,13 @@ namespace Dlhis.Basic.WorkGrids.Services;
|
||||
/// </summary>
|
||||
public interface IWorkGridService : IScopeDependency
|
||||
{
|
||||
/// <summary>
|
||||
/// 人员选择接口
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
Task<Pagination<WorkGridGainfoPageResponse>> GetPageAsync(WorkGridGainfoPageRequest request);
|
||||
|
||||
/// <summary>
|
||||
/// 保存
|
||||
/// </summary>
|
||||
|
||||
@@ -62,6 +62,9 @@ public class WorkGridScheduleService : IWorkGridScheduleService
|
||||
|
||||
await _dbContext.InsertAsync(toInserts);
|
||||
|
||||
var maximumConsecutiveDtos = await MaximumConsecutiveUserCodesAsync(request.UserCodes, 11, request.Date);
|
||||
maximumConsecutiveDtos.ThrowIfExists(maximumConsecutiveDtos.Select(x => $"{x.UserCode}已经连续排班10天({x.Start}-{x.End}),不可继续排班").Join("\r\n"));
|
||||
|
||||
await _operateLog.LogAsync(OperateLogType.WorkGrid, $"新增网格({workGrid.Name}){request.Date.ToString("yyyy-M-d")}的{request.PeriodType.GetDescription()}人员:{request.UserCodes.Join(",")}");
|
||||
}
|
||||
|
||||
@@ -206,4 +209,39 @@ public class WorkGridScheduleService : IWorkGridScheduleService
|
||||
|
||||
await _operateLog.LogAsync(OperateLogType.WorkGrid, $"重提上传考勤:{requests.Select(x => x.Id).Join(",")}");
|
||||
}
|
||||
|
||||
public async Task<List<WorkGridScheduleMaximumConsecutiveDto>> MaximumConsecutiveUserCodesAsync(List<string> userCodes, int days, DateOnly date)
|
||||
{
|
||||
var p = userCodes.Select(x => $"@param{x}").Join(",");
|
||||
var values = userCodes.ToDictionary(x => $"param{x}", x => x);
|
||||
|
||||
values.Add("date", date.ToString("yyyy-MM-dd"));
|
||||
values.Add("days", days.ToString());
|
||||
|
||||
var sql = $@"
|
||||
WITH ranked_dates AS (SELECT UserCode,
|
||||
date,
|
||||
ROW_NUMBER() OVER (PARTITION BY UserCode ORDER BY date) AS rn
|
||||
FROM WorkGridSchedules where UserCode in ({p})
|
||||
GROUP BY UserCode, date),
|
||||
grouped AS (SELECT UserCode,
|
||||
date,
|
||||
DATE_SUB(date, INTERVAL rn DAY) AS grp
|
||||
FROM ranked_dates),
|
||||
streaks AS (SELECT UserCode,
|
||||
grp,
|
||||
COUNT(*) AS streak_days,
|
||||
MIN(date) AS start_date,
|
||||
MAX(date) AS end_date
|
||||
FROM grouped
|
||||
GROUP BY UserCode, grp
|
||||
HAVING streak_days >= @days)
|
||||
SELECT UserCode, streak_days as Count, start_date as Start, end_date as End
|
||||
FROM streaks where @date>= start_date and @date<= end_date;
|
||||
|
||||
";
|
||||
|
||||
var data = await _dbContext.Client.Ado.SqlQueryAsync<WorkGridScheduleMaximumConsecutiveDto>(sql, values);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ using Dlhis.Basic.WorkGrids.Request;
|
||||
using Dlhis.Basic.WorkGrids.Response;
|
||||
using Dlhis.Constants;
|
||||
using Dlhis.Entity.Basic.Entity;
|
||||
using Dlhis.Entity.Basic.Enums;
|
||||
using Dlhis.Entity.Common.Enums;
|
||||
using Kurisu.AspNetCore.Authentication.Abstractions;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
@@ -18,17 +19,57 @@ public class WorkGridService : IWorkGridService
|
||||
{
|
||||
private readonly IDbContext _dbContext;
|
||||
private readonly ICurrentUser _currentUser;
|
||||
private readonly IWorkGridScheduleService _workGridScheduleService;
|
||||
private readonly IOperateLog _operateLog;
|
||||
|
||||
public WorkGridService(IDbContext dbContext,
|
||||
ICurrentUser currentUser,
|
||||
IWorkGridScheduleService workGridScheduleService,
|
||||
IOperateLog operateLog)
|
||||
{
|
||||
_dbContext = dbContext;
|
||||
_currentUser = currentUser;
|
||||
_workGridScheduleService = workGridScheduleService;
|
||||
_operateLog = operateLog;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<Pagination<WorkGridGainfoPageResponse>> GetPageAsync(WorkGridGainfoPageRequest request)
|
||||
{
|
||||
var factory = _currentUser.GetStringTenantId();
|
||||
|
||||
var r = await _dbContext.Queryable<GainfoEntity>()
|
||||
.LeftJoin<DepartmentEntity>((x, dept) => x.DepartmentNo == dept.No)
|
||||
.LeftJoin<WorkGridUserEntity>((x, dept, wgu) => x.Code == wgu.UserCode)
|
||||
.LeftJoin<WorkGridEntity>((x, dept, wgu, wg) => wgu.WorkGridCode == wg.Code)
|
||||
.Where(x => x.Factory == factory && (x.Type == GainfoUserTypeEnumType.Normal || x.Type == GainfoUserTypeEnumType.SecurityWhite))
|
||||
.WhereIF(request.Search.IsPresent(), x => x.Code == request.Search || x.Name.Contains(request.Search))
|
||||
.Select((x, dept, wgu, wg) => new WorkGridGainfoPageResponse
|
||||
{
|
||||
Id = x.Id,
|
||||
No = x.No,
|
||||
Type = x.Type,
|
||||
Name = x.Name,
|
||||
Code = x.Code,
|
||||
Gender = x.Gender,
|
||||
DepartmentNo = x.DepartmentNo,
|
||||
DepartmentName = dept.Name,
|
||||
Remark = x.Remark,
|
||||
WorkGridName = wg.Name,
|
||||
})
|
||||
.ToPageListAsync(request);
|
||||
|
||||
var userCodes = r.Data.Select(x => x.Code).ToList();
|
||||
var maximumConsecutiveUserCodes = await _workGridScheduleService.MaximumConsecutiveUserCodesAsync(userCodes, 1, DateOnly.FromDateTime(request.Date));
|
||||
|
||||
foreach (var item in r.Data)
|
||||
{
|
||||
item.MaximumConsecutiveSchedules = maximumConsecutiveUserCodes.FirstOrDefault(x => x.UserCode == item.Code);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task SaveAsync(List<WorkGridSaveRequest> requests)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user