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")
+ }
}
}
}