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