diff --git a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs index 0b378beb..0cf86880 100644 --- a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs +++ b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs @@ -21,8 +21,6 @@ public class GainfoDto public class AnalyzePackDto { - - public string UserNo { get; set; } public string UserDepartment { get; set; } diff --git a/Src/Dlhis.Basic/WorkGrids/Controllers/WorkGridsController.cs b/Src/Dlhis.Basic/WorkGrids/Controllers/WorkGridsController.cs new file mode 100644 index 00000000..4549aca8 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Controllers/WorkGridsController.cs @@ -0,0 +1,154 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; +using Dlhis.Basic.WorkGrids.Services; +using Kurisu.AspNetCore.DataAccess.Dto; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.WorkGrids.Controllers; + +/// +/// 工作网格 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class WorkGridsController : ControllerBase +{ + private readonly IWorkGridService _workGridService; + private readonly IWorkGridTimePeriodService _workGridTimePeriodService; + private readonly IWorkGridScheduleService _workGridScheduleService; + + public WorkGridsController(IWorkGridService workGridService, + IWorkGridTimePeriodService workGridTimePeriodService, + IWorkGridScheduleService workGridScheduleService) + { + _workGridService = workGridService; + _workGridTimePeriodService = workGridTimePeriodService; + _workGridScheduleService = workGridScheduleService; + } + + /// + /// 保存 + /// + /// + /// + [HttpPost("save")] + [Transactional] + public async Task SaveWorkGridsAsync(List requests) + { + await _workGridService.SaveAsync(requests); + } + + /// + /// /网格分页 + /// + /// + /// + [HttpGet("page")] + public async Task> GetWorkGridPageAsync([FromQuery] WorkGridPageRequest request) + { + return await _workGridService.GetPageAsync(request); + } + + /// + /// 修改网格管理者 + /// + /// + [HttpPost("leader/change")] + public async Task ChangeWorkGridLeaderAsync(WorkGridChangeRequest request) + { + await _workGridService.ChangeAsync(request.From, request.To); + } + + /// + /// 获取我的网格信息 + /// + /// + /// + [HttpGet("info")] + public async Task GetMyWorkGridAsync([FromQuery] WorkGridPageRequest request) + { + return await _workGridService.GetMyWorkGridAsync(request); + } + + /// + /// 保存网格工作时间 + /// + /// + /// + [HttpPost("timePeriod/save")] + public async Task SaveWorkGridTimePeriodAsync(WorkGridTimePeriodSaveRequest request) + { + await _workGridTimePeriodService.SaveAsync(request); + } + + /// + /// /获取网格工作时间分页 + /// + /// + /// + [HttpGet("timePeriod/page")] + public async Task> GetWorkGridTimePeriodPageAsync([FromQuery] WorkGridTimePeriodPageRequest request) + { + return await _workGridTimePeriodService.GetPageAsync(request); + } + + /// + /// 分配人员到网格中 + /// + /// + /// + [HttpPost("user/assign")] + public async Task AssignUsersToWorkGridAsync(WorkGridUserAssignRequest request) + { + await _workGridService.AssignAsync(request); + } + + /// + /// 移除网格的人员 + /// + /// + /// + [HttpPost("user/remove")] + public async Task RemoveUsersFromWorkGridAsync(WorkGridUserRemoveRequest request) + { + await _workGridService.RemoveAsync(request); + } + + /// + /// 保存网格人员排班 + /// + /// + [HttpPost("user/schedule/save")] + public async Task SaveScheduleAsync(WorkGridScheduleSaveRequest request) + { + await _workGridScheduleService.SaveAsync(request); + } + + /// + /// 获取人网格员排班列表 + /// + /// 网格code + /// + /// + [HttpGet("user/schedule/list")] + public async Task> GetListAsync(Guid workGridCode, DateOnly date) + { + return await _workGridScheduleService.GetListAsync(workGridCode, date); + } + + /// + /// 获取网格人员排班详情 + /// + /// 网格 + /// 开始日期 + /// 结束日期 + /// + [HttpGet("user/schedule/summary")] + public async Task> GetListSummaryAsync([FromQuery] Guid workGridCode, [FromQuery] DateOnly start, [FromQuery] DateOnly end) + { + return await _workGridScheduleService.GetListSummaryAsync(workGridCode, start, end); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridChangeRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridChangeRequest.cs new file mode 100644 index 00000000..568cd2f1 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridChangeRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridChangeRequest +{ + [Required] + public string From { get; set; } + + [Required] + public string To { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridPageRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridPageRequest.cs new file mode 100644 index 00000000..936ee923 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridPageRequest.cs @@ -0,0 +1,8 @@ +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridPageRequest : PageDto +{ + +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridSaveRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridSaveRequest.cs new file mode 100644 index 00000000..8b5f8029 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridSaveRequest.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridSaveRequest +{ + public long? Id { get; set; } + + [Required(ErrorMessage = "名称不可为空")] + public string Name { get; set; } + + /// + /// 负责人 + /// + [Required(ErrorMessage = "负责人不可为空")] + public string LeaderUserCode { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridScheduleSaveRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridScheduleSaveRequest.cs new file mode 100644 index 00000000..dcede077 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridScheduleSaveRequest.cs @@ -0,0 +1,14 @@ +using Dlhis.Entity.Basic.Enums; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridScheduleSaveRequest +{ + public Guid WorkGridCode { get; set; } + + public DateOnly Date { get; set; } + + public WorkGridTimePeriodEnumType PeriodType { get; set; } + + public List UserCodes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridTimePeriodRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridTimePeriodRequest.cs new file mode 100644 index 00000000..0103492f --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridTimePeriodRequest.cs @@ -0,0 +1,7 @@ +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridTimePeriodPageRequest : PageDto +{ +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridTimePeriodSaveRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridTimePeriodSaveRequest.cs new file mode 100644 index 00000000..85bcc07a --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridTimePeriodSaveRequest.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Basic.Enums; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridTimePeriodSaveRequest +{ + public long? Id { get; set; } + + /// + /// 班次, eg: 禁止编辑 + /// + public WorkGridTimePeriodEnumType Type { get; set; } + + /// + /// 前(min) + /// + [Range(1, int.MaxValue)] + public int Before { get; set; } + + /// + /// 后(min) + /// + [Range(1, int.MaxValue)] + public int After { get; set; } + + /// + /// 开始时间 + /// + public TimeOnly Start { get; set; } + + /// + /// 结束时间 + /// + public TimeOnly End { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridUserAssignRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridUserAssignRequest.cs new file mode 100644 index 00000000..c13e6e7c --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridUserAssignRequest.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridUserAssignRequest +{ + public Guid? WorkGridCode { get; set; } + + /// + /// 人员 + /// + [MinLength(1, ErrorMessage = "请选择人员")] + public List UserCodes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Request/WorkGridUserRemoveRequest.cs b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridUserRemoveRequest.cs new file mode 100644 index 00000000..e5358bc5 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Request/WorkGridUserRemoveRequest.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.WorkGrids.Request; + +public class WorkGridUserRemoveRequest +{ + public Guid? WorkGridCode { get; set; } + + /// + /// 人员 + /// + [MinLength(1, ErrorMessage = "请选择人员")] + public List UserCodes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Response/WorkGridPageResponse.cs b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridPageResponse.cs new file mode 100644 index 00000000..3494011a --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridPageResponse.cs @@ -0,0 +1,31 @@ +namespace Dlhis.Basic.WorkGrids.Response; + +public class WorkGridPageResponse +{ + public long Id { get; set; } + + /// + /// 网格code + /// + public Guid Code { get; set; } + + /// + /// 网格名称 + /// + public string Name { get; set; } + + /// + /// 负责人工号 + /// + public string LeaderUserCode { get; set; } + + /// + /// 负责人姓名 + /// + public string UserName { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Response/WorkGridScheduleResponse.cs b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridScheduleResponse.cs new file mode 100644 index 00000000..eddfad3e --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridScheduleResponse.cs @@ -0,0 +1,12 @@ +using Dlhis.Entity.Basic.Enums; + +namespace Dlhis.Basic.WorkGrids.Response; + +public class WorkGridScheduleResponse +{ + public DateOnly Date { get; set; } + + public WorkGridTimePeriodEnumType PeriodType { get; set; } + + public string UserCode { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Response/WorkGridScheduleSummaryResponse.cs b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridScheduleSummaryResponse.cs new file mode 100644 index 00000000..b55d9606 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridScheduleSummaryResponse.cs @@ -0,0 +1,16 @@ +using Dlhis.Entity.Basic.Enums; + +namespace Dlhis.Basic.WorkGrids.Response; + +public class WorkGridScheduleSummaryResponse +{ + public DateOnly Date { get; set; } + public IEnumerable Details { get; set; } +} + +public class WorkGridScheduleSummaryDetailResponse +{ + public WorkGridTimePeriodEnumType PeriodType { get; set; } + + public int Count { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Response/WorkGridTimePeriodPageResponse.cs b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridTimePeriodPageResponse.cs new file mode 100644 index 00000000..03c23873 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridTimePeriodPageResponse.cs @@ -0,0 +1,72 @@ +using Dlhis.Entity.Basic.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.WorkGrids.Response; + +public class WorkGridTimePeriodPageResponse +{ + public long Id { get; set; } + + /// + /// 班次 + /// + public WorkGridTimePeriodEnumType Type { get; set; } + + /// + /// 班次描述 + /// + public string TypeDesc => Type.GetDescription(); + + /// + /// 前 + /// + public int Before { get; set; } + + /// + /// 后 + /// + public int After { get; set; } + + /// + /// 开始时间 + /// + public TimeOnly Start { get; set; } + + /// + /// 结束时间 + /// + public TimeOnly End { get; set; } + + /// + /// 配置描述 + /// + public string Description + { + get { return Type.GetDescription() + "打卡时间从" + Start + "到" + End + "\r\n" + "上班允许提前" + GetTimeDescription(Before) + "\r\n" + "下班允许延迟" + GetTimeDescription(After); } + } + + + private string GetTimeDescription(int minutes) + { + string d; + + if (minutes >= 60) + { + var remaining = minutes % 60; + + d = $"{minutes / 60}小时"; + + if (remaining > 0) + { + d += $"{remaining}分钟"; + } + } + else + { + d = $"{minutes}分钟"; + } + + + return d; + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Response/WorkGridUserPageResponse.cs b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridUserPageResponse.cs new file mode 100644 index 00000000..bd601ea0 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Response/WorkGridUserPageResponse.cs @@ -0,0 +1,57 @@ +namespace Dlhis.Basic.WorkGrids.Response; + +public class WorkGridUserPageResponse +{ + public long Id { get; set; } + + /// + /// 网格code + /// + public Guid Code { get; set; } + + /// + /// 网格名称 + /// + public string Name { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 员工明细 + /// + public List UserInfos { get; set; } +} + +public class WorkGridUserPageDetailResponse +{ + /// + /// 人员工号 + /// + public string Code { get; set; } + + /// + /// 人员姓名 + /// + public string Name { get; set; } + + // /// + // /// 排班值 + // /// + // public WorkGridTimePeriodEnumType? ScheduleType { get; set; } + // + // /// + // /// 排班描述 + // /// + // public string ScheduleTypeDesc + // { + // get + // { + // return !ScheduleType.HasValue + // ? "未排班" + // : ScheduleType.Value.GetDescription(); + // } + // } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridScheduleService.cs b/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridScheduleService.cs new file mode 100644 index 00000000..2b6783d9 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridScheduleService.cs @@ -0,0 +1,16 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; + +namespace Dlhis.Basic.WorkGrids.Services; + +/// +/// 网格排班 +/// +public interface IWorkGridScheduleService : IScopeDependency +{ + Task SaveAsync(WorkGridScheduleSaveRequest request); + + Task> GetListAsync(Guid workGridCode, DateOnly date); + + Task> GetListSummaryAsync(Guid workGridCode, DateOnly start, DateOnly end); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridService.cs b/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridService.cs new file mode 100644 index 00000000..0270987f --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridService.cs @@ -0,0 +1,52 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Basic.WorkGrids.Services; + +/// +/// 工作网格 +/// +public interface IWorkGridService : IScopeDependency +{ + /// + /// 保存 + /// + /// + /// + Task SaveAsync(List requests); + + /// + /// /网格分页 + /// + /// + /// + Task> GetPageAsync(WorkGridPageRequest request); + + /// + /// 修改管理者 + /// + /// + Task ChangeAsync(string from, string to); + + /// + /// 获取 + /// + /// + /// + Task GetMyWorkGridAsync(WorkGridPageRequest request); + + /// + /// 分配人员 + /// + /// + /// + Task AssignAsync(WorkGridUserAssignRequest request); + + /// + /// 移除人员 + /// + /// + /// + Task RemoveAsync(WorkGridUserRemoveRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridTimePeriodService.cs b/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridTimePeriodService.cs new file mode 100644 index 00000000..f2f848da --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Services/IWorkGridTimePeriodService.cs @@ -0,0 +1,25 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Basic.WorkGrids.Services; + +/// +/// 工作网格班次时段配置 +/// +public interface IWorkGridTimePeriodService : IScopeDependency +{ + /// + /// 保存 + /// + /// + /// + Task SaveAsync(WorkGridTimePeriodSaveRequest request); + + /// + /// 获取分页 + /// + /// + /// + Task> GetPageAsync(WorkGridTimePeriodPageRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs new file mode 100644 index 00000000..1e2f25c7 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs @@ -0,0 +1,81 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; +using Dlhis.Entity.Basic.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.WorkGrids.Services.Implements; + +public class WorkGridScheduleService : IWorkGridScheduleService +{ + private readonly IDbContext _dbContext; + + public WorkGridScheduleService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task SaveAsync(WorkGridScheduleSaveRequest request) + { + var exists = await _dbContext.Queryable() + .Where(x => x.Date == request.Date) + .Where(x => x.PeriodType != request.PeriodType) + .Where(x => request.UserCodes.Contains(x.UserCode)) + .AnyAsync(); + + exists.ThrowIfTrue($"存在已经分配的人员"); + + var data = await _dbContext.Queryable() + .Where(x => x.WorkGridCode == request.WorkGridCode) + .Where(x => x.Date == request.Date) + .Where(x => x.PeriodType == request.PeriodType) + .ToListAsync(); + + await _dbContext.DeleteReallyAsync(data); + + var toInserts = request.UserCodes.Select(x => new WorkGridScheduleEntity + { + WorkGridCode = request.WorkGridCode, + Date = request.Date, + PeriodType = request.PeriodType, + UserCode = x + }).ToList(); + + await _dbContext.InsertAsync(toInserts); + } + + /// + public async Task> GetListAsync(Guid workGridCode, DateOnly date) + { + return await _dbContext.Queryable() + .Where(x => x.WorkGridCode == workGridCode && x.Date == date) + .Select(x => new WorkGridScheduleResponse + { + Date = x.Date, + PeriodType = x.PeriodType, + UserCode = x.UserCode + }) + .ToListAsync(); + } + + /// + public async Task> GetListSummaryAsync(Guid workGridCode, DateOnly start, DateOnly end) + { + var workGridSchedules = await _dbContext.Queryable() + .Where(x => x.WorkGridCode == workGridCode && x.Date >= start && x.Date <= end) + .ToListAsync(); + + return workGridSchedules.GroupBy(x => x.Date).Select(x => + { + return new WorkGridScheduleSummaryResponse + { + Date = x.Key, + Details = x.GroupBy(p => p.PeriodType).Select(p => new WorkGridScheduleSummaryDetailResponse + { + PeriodType = p.Key, + Count = p.Count() + }) + }; + }); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs new file mode 100644 index 00000000..f087dd94 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridService.cs @@ -0,0 +1,154 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; +using Dlhis.Entity.Basic.Entity; +using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.DataAccess.Dto; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; +using Kurisu.AspNetCore.Utils.Extensions; +using Mapster; +using SqlSugar; + +namespace Dlhis.Basic.WorkGrids.Services.Implements; + +public class WorkGridService : IWorkGridService +{ + private readonly IDbContext _dbContext; + private readonly ICurrentUser _currentUser; + + public WorkGridService(IDbContext dbContext, ICurrentUser currentUser) + { + _dbContext = dbContext; + _currentUser = currentUser; + } + + /// + public async Task SaveAsync(List requests) + { + foreach (var request in requests) + { + var exists = await _dbContext.Queryable() + .Where(x => x.LeaderUserCode == request.LeaderUserCode) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id) + .AnyAsync(); + + exists.ThrowIfTrue($"{request.LeaderUserCode}已存在管理的网格"); + + if (!request.Id.HasValue) + { + var entity = request.Adapt(); + entity.Code = Guid.NewGuid(); + + await _dbContext.InsertAsync(entity); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).SingleAsync(); + request.Adapt(entity); + + await _dbContext.UpdateAsync(entity); + } + } + } + + /// + public async Task> GetPageAsync(WorkGridPageRequest request) + { + return await _dbContext.Queryable() + .LeftJoin((x, ga) => x.LeaderUserCode == ga.Code) + .Select((x, ga) => new WorkGridPageResponse + { + Id = x.Id, + Code = x.Code, + Name = x.Name, + LeaderUserCode = x.LeaderUserCode, + UserName = ga.Name, + Remark = x.Remark + }) + .ToPageListAsync(request); + } + + /// + public async Task ChangeAsync(string from, string to) + { + var workGrid = await _dbContext.Queryable().Where(x => x.LeaderUserCode == from).SingleAsync(); + workGrid.ThrowIfNull("网格不存在"); + + var gainfo = await _dbContext.Queryable().Where(x => x.Code == to).SingleAsync(); + gainfo.ThrowIfNull($"{to}人员不存在"); + + workGrid.LeaderUserCode = to; + await _dbContext.UpdateAsync(workGrid); + } + + /// + public async Task GetMyWorkGridAsync(WorkGridPageRequest request) + { + var currentUserCode = _currentUser.GetUserClaim("jinko-code"); + var myWorkGrid = await _dbContext.Queryable() + .Where(x => x.LeaderUserCode == currentUserCode) + .Select(x => new WorkGridUserPageResponse + { + Id = x.Id, + Code = x.Code, + Name = x.Name, + Remark = x.Remark, + UserInfos = SqlFunc.Subqueryable() + .LeftJoin((p, ga) => p.UserCode == ga.Code) + .Where((p, ga) => p.WorkGridCode == x.Code) + .ToList((p, ga) => new WorkGridUserPageDetailResponse + { + Code = p.UserCode, + Name = ga.Name + }) + }) + .SingleAsync(); + + return myWorkGrid; + } + + /// + public async Task AssignAsync(WorkGridUserAssignRequest request) + { + var currentFactory = _currentUser.GetStringTenantId(); + var currentUserCode = _currentUser.GetUserClaim("jinko-code"); + + var myWorkGrid = await _dbContext.Queryable().Where(x => x.LeaderUserCode == currentUserCode).SingleAsync(); + myWorkGrid.ThrowIfNull("工作网格尚未配置,请联系管理员"); + + //检查配置的人员 + var count = await _dbContext.Queryable() + .Where(x => x.Factory == currentFactory) + .Where(x => request.UserCodes.Contains(x.Code)) + .CountAsync(); + + (count != request.UserCodes.Count).ThrowIfTrue("存在非当前厂区人员,请检查"); + + var existsAssigned = await _dbContext.Queryable().Where(x => x.WorkGridCode == myWorkGrid.Code) + .Where(x => request.UserCodes.Contains(x.UserCode)) + .AnyAsync(); + existsAssigned.ThrowIfTrue("存在已经分配人员,请勿重复分配"); + + var dataToInserts = request.UserCodes.Select(x => new WorkGridUserEntity + { + WorkGridCode = myWorkGrid.Code, + UserCode = x + }).ToList(); + + await _dbContext.InsertAsync(dataToInserts); + } + + /// + public async Task RemoveAsync(WorkGridUserRemoveRequest request) + { + var currentUserCode = _currentUser.GetUserClaim("jinko-code"); + var myWorkGrid = await _dbContext.Queryable().Where(x => x.LeaderUserCode == currentUserCode).SingleAsync(); + myWorkGrid.ThrowIfNull("工作网格尚未配置,请联系管理员"); + + var workGridUsers = await _dbContext.Queryable().Where(x => x.WorkGridCode == myWorkGrid.Code) + .Where(x => request.UserCodes.Contains(x.UserCode)) + .ToListAsync(); + + await _dbContext.DeleteReallyAsync(workGridUsers); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridTimePeriodService.cs b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridTimePeriodService.cs new file mode 100644 index 00000000..b07b4396 --- /dev/null +++ b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridTimePeriodService.cs @@ -0,0 +1,93 @@ +using Dlhis.Basic.WorkGrids.Request; +using Dlhis.Basic.WorkGrids.Response; +using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Basic.Enums; +using Kurisu.AspNetCore.CustomClass; +using Kurisu.AspNetCore.DataAccess.Dto; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; +using Kurisu.AspNetCore.Utils.Extensions; +using Mapster; + +namespace Dlhis.Basic.WorkGrids.Services.Implements; + +public class WorkGridTimePeriodService : IWorkGridTimePeriodService +{ + private readonly IDbContext _dbContext; + + public WorkGridTimePeriodService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + /// + public async Task SaveAsync(WorkGridTimePeriodSaveRequest request) + { + //await CheckDuplicateTimePeriodAsync(request); + + if (!request.Id.HasValue) + { + //判断重复配置 + var existsSameType = await _dbContext.Queryable() + .Where(x => x.Type == request.Type) + .AnyAsync(); + + existsSameType.ThrowIfTrue($"已存在{request.Type}配置"); + + var data = request.Adapt(); + data.Type = request.Type; + await _dbContext.InsertAsync(data); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).SingleAsync(); + request.Adapt(entity); + + await _dbContext.UpdateAsync(entity); + } + } + + /// + public async Task> GetPageAsync(WorkGridTimePeriodPageRequest request) + { + return await _dbContext.Queryable() + .Select() + .ToPageListAsync(request); + } + + //************************************************************************************************************************************************* + + /// + /// 根据类型获取配置 + /// + /// + /// + private async Task GetSettingAsync(WorkGridTimePeriodEnumType timePeriodType) + { + return await _dbContext.Queryable() + .Where(x => x.Type == timePeriodType) + .SingleAsync(); + } + + /// + /// 检查时间段重合检查 + /// + /// + /// + private async Task CheckDuplicateTimePeriodAsync(WorkGridTimePeriodSaveRequest request) + { + var periods = await _dbContext.Queryable() + .Where(x => x.Type != request.Type) + .Select(x => new TimePeriod + { + Start = x.Start, + End = x.End + }) + .ToListAsync(); + + foreach (var period in periods) + { + period.IsDuplicate(request.Adapt()).ThrowIfTrue($"存在时间段重合[{period.Start}-{period.End}]"); + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/WorkGridEntity.cs b/Src/Dlhis.Entity/Basic/Entity/WorkGridEntity.cs new file mode 100644 index 00000000..f616edcf --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/WorkGridEntity.cs @@ -0,0 +1,37 @@ +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using Mapster; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 工作网格 +/// +[SugarTable(TableName = "WorkGrid")] +public class WorkGridEntity : SugarBaseEntity +{ + /// + /// 网格code + /// + [AdaptIgnore(MemberSide.Destination)] + [SugarColumn(IsNullable = false, ColumnDescription = "网格code")] + public Guid Code { get; set; } + + /// + /// 网格名称 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "网格名称")] + public string Name { get; set; } + + /// + /// 负责人工号 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "负责人工号", UniqueGroupNameList = new[] { "idx_WorkGrid_LeaderUserCode" })] + public string LeaderUserCode { get; set; } + + /// + /// 备注 + /// + [SugarColumn(IsNullable = true, ColumnDescription = "备注")] + public string Remark { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/WorkGridScheduleEntity.cs b/Src/Dlhis.Entity/Basic/Entity/WorkGridScheduleEntity.cs new file mode 100644 index 00000000..22e58f7d --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/WorkGridScheduleEntity.cs @@ -0,0 +1,42 @@ +using Dlhis.Entity.Basic.Enums; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; +using SqlSugar.DbConvert; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// +/// +[SugarTable(TableName = "WorkGridSchedule")] +public class WorkGridScheduleEntity : SugarBaseEntity, ITenantId +{ + /// + /// 网格code + /// + [SugarColumn(IsNullable = false, ColumnDescription = "网格code")] + public Guid WorkGridCode { get; set; } + + /// + /// 排班日期 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "排班日期")] + public DateOnly Date { get; set; } + + /// + /// 排班类型 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "排班类型", SqlParameterDbType = typeof(EnumToStringConvert))] + public WorkGridTimePeriodEnumType PeriodType { get; set; } + + /// + /// 工号 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "工号")] + public string UserCode { get; set; } + + + /// + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/WorkGridTimePeriodEntity.cs b/Src/Dlhis.Entity/Basic/Entity/WorkGridTimePeriodEntity.cs new file mode 100644 index 00000000..1d842130 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/WorkGridTimePeriodEntity.cs @@ -0,0 +1,44 @@ +using Dlhis.Entity.Basic.Enums; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using Mapster; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 工作网格 +/// +[SugarTable(TableName = "WorkGridTimePeriod")] +public class WorkGridTimePeriodEntity : SugarBaseEntity, ITenantId +{ + /// + /// 班次 + /// + [AdaptIgnore(MemberSide.Destination)] + public WorkGridTimePeriodEnumType Type { get; set; } + + /// + /// 前 + /// + public int Before { get; set; } + + /// + /// 后 + /// + public int After { get; set; } + + /// + /// 开始时间 + /// + public TimeOnly Start { get; set; } + + /// + /// 结束时间 + /// + public TimeOnly End { get; set; } + + + [SugarColumn(UniqueGroupNameList = new[] { "idx_workGridTimePeriod_type_tenantId" })] + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/WorkGridUserEntity.cs b/Src/Dlhis.Entity/Basic/Entity/WorkGridUserEntity.cs new file mode 100644 index 00000000..7685a578 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/WorkGridUserEntity.cs @@ -0,0 +1,35 @@ +using Dlhis.Entity.Basic.Enums; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; +using SqlSugar.DbConvert; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 网格人员 +/// +[SugarTable(TableName = "WorkGridUsers")] +public class WorkGridUserEntity : SugarBaseEntity, ITenantId +{ + /// + /// 网格code + /// + [SugarColumn(IsNullable = false, ColumnDescription = "网格code")] + public Guid WorkGridCode { get; set; } + + /// + /// 网格人员 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "网格人员")] + public string UserCode { get; set; } + + /// + /// 排班类型 + /// + [SugarColumn(IsNullable = true, ColumnDescription = "排班类型", SqlParameterDbType = typeof(EnumToStringConvert))] + public WorkGridTimePeriodEnumType? ScheduleType { get; set; } + + /// + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Enums/WorkGridTimePeriodEnumType.cs b/Src/Dlhis.Entity/Basic/Enums/WorkGridTimePeriodEnumType.cs new file mode 100644 index 00000000..e666372a --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Enums/WorkGridTimePeriodEnumType.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; + +namespace Dlhis.Entity.Basic.Enums; + +/// +/// 网格班次 +/// +[Description("网格班次")] +public enum WorkGridTimePeriodEnumType +{ + /// + /// 白班 + /// + [Description("白班")] + Day = 1, + + /// + /// 晚班 + /// + [Description("晚班")] + Night = 2, +} \ No newline at end of file