From b697520cb4879109dc74c7c356db34ef46e60db8 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 11 Jul 2024 17:47:47 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=97=B6=E6=AE=B5=E7=A0=81=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeviceTimePeriodsController.cs | 36 +++++++++ .../Device/Request/DeviceSaveRequest.cs | 4 + .../Request/DeviceTimePeriodPageRequest.cs | 14 ++++ .../Request/DeviceTimePeriodSaveRequest.cs | 71 +++++++++++++++++ .../Device/Response/DevicePageResponse.cs | 5 ++ .../Response/DeviceTimePeriodPageResponse.cs | 48 ++++++++++++ .../Services/IDeviceTimePeriodService.cs | 12 +++ .../Implements/DeviceTimePeriodService.cs | 76 +++++++++++++++++++ Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs | 7 ++ .../Device/Entities/DeviceTimePeriodEntity.cs | 69 +++++++++++++++++ .../Enums/DeviceTimePeriodAssignEnumType.cs | 22 ++++++ .../Services/Implements/AssignmentService.cs | 6 +- 12 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs create mode 100644 Src/Dlhis.Basic/Device/Request/DeviceTimePeriodPageRequest.cs create mode 100644 Src/Dlhis.Basic/Device/Request/DeviceTimePeriodSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Device/Response/DeviceTimePeriodPageResponse.cs create mode 100644 Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs create mode 100644 Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs create mode 100644 Src/Dlhis.Entity/Device/Entities/DeviceTimePeriodEntity.cs create mode 100644 Src/Dlhis.Entity/Device/Enums/DeviceTimePeriodAssignEnumType.cs diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs new file mode 100644 index 00000000..ca88b408 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs @@ -0,0 +1,36 @@ +using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; +using Dlhis.Basic.Device.Services; +using Kurisu.AspNetCore.DataAccess.Dto; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.Device.Controllers; + +/// +/// 设备时段码 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class DeviceTimePeriodsController : ControllerBase +{ + private readonly IDeviceTimePeriodService _deviceTimePeriodService; + + public DeviceTimePeriodsController(IDeviceTimePeriodService deviceTimePeriodService) + { + _deviceTimePeriodService = deviceTimePeriodService; + } + + [HttpGet("page")] + public async Task> GetPageAsync([FromQuery] DeviceTimePeriodPageRequest request) + { + return await _deviceTimePeriodService.GetPageAsync(request); + } + + [HttpPost("save")] + public async Task SaveAsync(DeviceTimePeriodSaveRequest request) + { + await _deviceTimePeriodService.SaveAsync(request); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs index c13fd0be..2af66e0c 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs @@ -76,6 +76,10 @@ public class DeviceSaveRequest : IValidatableObject /// public bool AsAttendance { get; set; } + + public bool EnableTimePeriod { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) { if (Type != DeviceTypeEnumType.Door && AsAttendance) diff --git a/Src/Dlhis.Basic/Device/Request/DeviceTimePeriodPageRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceTimePeriodPageRequest.cs new file mode 100644 index 00000000..3ab8e736 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Request/DeviceTimePeriodPageRequest.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Device.Enums; +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Basic.Device.Request; + +public class DeviceTimePeriodPageRequest : PageDto +{ + /// + /// DeviceTimePeriodAssignEnumType + /// + [EnumDataType(typeof(DeviceTimePeriodAssignEnumType))] + public DeviceTimePeriodAssignEnumType AssignType { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Request/DeviceTimePeriodSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceTimePeriodSaveRequest.cs new file mode 100644 index 00000000..90b5042a --- /dev/null +++ b/Src/Dlhis.Basic/Device/Request/DeviceTimePeriodSaveRequest.cs @@ -0,0 +1,71 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Device.Enums; + +namespace Dlhis.Basic.Device.Request; + +public class DeviceTimePeriodSaveRequest : IValidatableObject +{ + public long? Id { get; set; } + + /// + /// 卡类型 timeperiod + /// + [Range(2, 3)] + public int CardType { get; set; } + + /// + /// 分配类型 DeviceTimePeriodAssignEnumType + /// + [EnumDataType(typeof(DeviceTimePeriodAssignEnumType))] + public DeviceTimePeriodAssignEnumType AssignType { get; set; } + + /// + /// 分配值 + /// + [Required] + public Guid Value { get; set; } + + /// + /// 上班开始 + /// + [Required] + public TimeOnly OnStart { get; set; } + + /// + /// 上班结束 + /// + [Required] + public TimeOnly OnEnd { get; set; } + + /// + /// 下班开始 + /// + [Required] + public TimeOnly OffStart { get; set; } + + /// + /// 下班结束 + /// + [Required] + public TimeOnly OffEnd { get; set; } + + /// + public IEnumerable Validate(ValidationContext validationContext) + { + if (OnStart >= OnEnd) + { + yield return new ValidationResult("上班时段范围有误", new[] { nameof(OnStart) }); + } + + if (OffStart >= OffEnd) + { + yield return new ValidationResult("下班时段范围有误", new[] { nameof(OffStart) }); + } + + + if (OnEnd >= OffStart) + { + yield return new ValidationResult("上下班时段范围有误", new[] { nameof(OnEnd) }); + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs b/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs index 11ec35bf..d71e5a44 100644 --- a/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs +++ b/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs @@ -97,6 +97,11 @@ public class DevicePageResponse /// public bool AsAttendance { get; set; } + /// + /// 是否启用时段码 + /// + public bool EnableTimePeriod { get; set; } + //*********************************************************附加信息**************************************************************/ diff --git a/Src/Dlhis.Basic/Device/Response/DeviceTimePeriodPageResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceTimePeriodPageResponse.cs new file mode 100644 index 00000000..b5519bc0 --- /dev/null +++ b/Src/Dlhis.Basic/Device/Response/DeviceTimePeriodPageResponse.cs @@ -0,0 +1,48 @@ +using Dlhis.Entity.Device.Enums; + +namespace Dlhis.Basic.Device.Response; + +public class DeviceTimePeriodPageResponse +{ + public long Id { get; set; } + + /// + /// 卡类型 + /// + public int CardType { get; set; } + + /// + /// 分配类型 + /// + public DeviceTimePeriodAssignEnumType AssignType { get; set; } + + /// + /// 分配值 + /// + public Guid Value { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 上班开始 + /// + public TimeOnly OnStart { get; set; } + + /// + /// 上班结束 + /// + public TimeOnly OnEnd { get; set; } + + /// + /// 下班开始 + /// + public TimeOnly OffStart { get; set; } + + /// + /// 下班结束 + /// + public TimeOnly OffEnd { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs new file mode 100644 index 00000000..180d5b9d --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs @@ -0,0 +1,12 @@ +using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Basic.Device.Services; + +public interface IDeviceTimePeriodService : IScopeDependency +{ + Task> GetPageAsync(DeviceTimePeriodPageRequest request); + + Task SaveAsync(DeviceTimePeriodSaveRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs new file mode 100644 index 00000000..a1cdaf2f --- /dev/null +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs @@ -0,0 +1,76 @@ +using Dlhis.Basic.Device.Request; +using Dlhis.Basic.Device.Response; +using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; +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.Device.Services.Implements; + +public class DeviceTimePeriodService : IDeviceTimePeriodService +{ + private readonly IDbContext _dbContext; + + public DeviceTimePeriodService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + /// + public async Task> GetPageAsync(DeviceTimePeriodPageRequest request) + { + var page = await _dbContext.Queryable() + .Where(x => x.AssignType == request.AssignType) + .Select() + .ToPageListAsync(request); + + var values = page.Data.Select(x => x.Value); + var data = request.AssignType == DeviceTimePeriodAssignEnumType.Device + ? await _dbContext.Queryable().Where(x => values.Contains(x.Code)).Select(x => new { x.Code, Name = x.DeployPlace }).ToListAsync() + : await _dbContext.Queryable().Where(x => values.Contains(x.Code)).Select(x => new { x.Code, x.Name }).ToListAsync(); + + page.Data.ForEach(item => { item.Name = data.FirstOrDefault(x => x.Code == item.Value)?.Name; }); + + return page; + } + + /// + public async Task SaveAsync(DeviceTimePeriodSaveRequest request) + { + (await _dbContext.Queryable().Where(x => x.Type == "timeperiod").AnyAsync(x => x.Code == request.CardType.ToString())) + .ThrowIfFalse($"卡类型{request.CardType}不支持"); + + var existsData = request.AssignType == DeviceTimePeriodAssignEnumType.Device + ? await _dbContext.Queryable().Where(x => x.Code == request.Value).AnyAsync() + : await _dbContext.Queryable().Where(x => x.Code == request.Value).AnyAsync(); + existsData.ThrowIfFalse("数据不匹配"); + + + (await _dbContext.Queryable() + .Where(x => x.CardType == request.CardType) + .Where(x => x.AssignType == request.AssignType) + .Where(x => x.Value == request.Value) + .AnyAsync()).ThrowIfTrue("请勿重复添加"); + + + if (!request.Id.HasValue) + { + var entity = request.Adapt(); + entity.CardType = request.CardType; + entity.AssignType = request.AssignType; + entity.Value = request.Value; + await _dbContext.InsertAsync(entity); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).SingleAsync(); + request.Adapt(entity); + + await _dbContext.UpdateAsync(entity); + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs b/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs index a4b3eb62..a1d431a3 100644 --- a/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs +++ b/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs @@ -95,6 +95,13 @@ namespace Dlhis.Entity.Basic.Entity [SugarColumn(ColumnDataType = "bit", ColumnDescription = "是否作为考勤设备")] public bool AsAttendance { get; set; } + + /// + /// 是否启用时段码 + /// + [SugarColumn(ColumnDataType = "bit", ColumnDescription = "是否启用时段码", DefaultValue = "0")] + public bool EnableTimePeriod { get; set; } = false; + public string TenantId { get; set; } } } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Device/Entities/DeviceTimePeriodEntity.cs b/Src/Dlhis.Entity/Device/Entities/DeviceTimePeriodEntity.cs new file mode 100644 index 00000000..61d41503 --- /dev/null +++ b/Src/Dlhis.Entity/Device/Entities/DeviceTimePeriodEntity.cs @@ -0,0 +1,69 @@ +using Dlhis.Entity.Device.Enums; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using Mapster; +using SqlSugar; +using SqlSugar.DbConvert; + +namespace Dlhis.Entity.Device.Entities; + +/// +/// 设备时段码 +/// +[SugarTable(TableName = "DeviceTimePeriod", TableDescription = "设备时段码")] +public class DeviceTimePeriodEntity : SugarBaseEntity, ITenantId +{ + /// + /// 卡类型 + /// + [AdaptIgnore(MemberSide.Destination)] + [SugarColumn(IsNullable = false, ColumnDescription = "卡类型", + UniqueGroupNameList = new[] { "unique_DeviceTimePeriod_cardType_assignType_value" })] + public int CardType { get; set; } + + /// + /// 分配类型 + /// + [AdaptIgnore(MemberSide.Destination)] + [SugarColumn(IsNullable = false, ColumnDescription = "分配类型", + ColumnDataType = "varchar(50)", + UniqueGroupNameList = new[] { "unique_DeviceTimePeriod_cardType_assignType_value" }, + SqlParameterDbType = typeof(EnumToStringConvert))] + public DeviceTimePeriodAssignEnumType AssignType { get; set; } + + /// + /// 分配值 + /// + [AdaptIgnore(MemberSide.Destination)] + [SugarColumn(IsNullable = false, ColumnDescription = "分配值", + UniqueGroupNameList = new[] { "unique_DeviceTimePeriod_cardType_assignType_value" })] + public Guid Value { get; set; } + + /// + /// 上班开始 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "上班开始")] + public TimeOnly OnStart { get; set; } + + /// + /// 上班结束 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "上班结束")] + public TimeOnly OnEnd { get; set; } + + /// + /// 下班开始 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "下班开始")] + public TimeOnly OffStart { get; set; } + + /// + /// 下班结束 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "下班结束")] + public TimeOnly OffEnd { get; set; } + + + [SugarColumn(IsNullable = false, UniqueGroupNameList = new[] { "unique_DeviceTimePeriod_cardType_assignType_value" })] + public string TenantId { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Device/Enums/DeviceTimePeriodAssignEnumType.cs b/Src/Dlhis.Entity/Device/Enums/DeviceTimePeriodAssignEnumType.cs new file mode 100644 index 00000000..07fb46e2 --- /dev/null +++ b/Src/Dlhis.Entity/Device/Enums/DeviceTimePeriodAssignEnumType.cs @@ -0,0 +1,22 @@ +using System.ComponentModel; + +namespace Dlhis.Entity.Device.Enums; + +/// +/// 设备时段码分配类型 +/// +[Description("设备时段码分配类型")] +public enum DeviceTimePeriodAssignEnumType +{ + /// + /// 模板 + /// + [Description("模板")] + Template = 1, + + /// + /// 设备 + /// + [Description("设备")] + Device = 2 +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs index e0c4f58a..cd0bb120 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs @@ -111,7 +111,7 @@ public class AssignmentService : IAssignmentService Id = 1, Name = "小白领", Enable = true, - Sections = new List() + Sections = new List { new() { @@ -121,8 +121,8 @@ public class AssignmentService : IAssignmentService new() { Start = TimeOnly.Parse("08:00:00"), - End = TimeOnly.Parse("17:30:00"), - }, + End = TimeOnly.Parse("17:30:00") + } } } }