diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs
index ca88b408..17b198f3 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DeviceTimePeriodsController.cs
@@ -1,6 +1,8 @@
-using Dlhis.Basic.Device.Request;
+using System.ComponentModel.DataAnnotations;
+using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Device.Services;
+using Dlhis.Entity.Device.Enums;
using Kurisu.AspNetCore.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -21,16 +23,40 @@ public class DeviceTimePeriodsController : ControllerBase
{
_deviceTimePeriodService = deviceTimePeriodService;
}
-
+
+ ///
+ /// 时段码分页
+ ///
+ ///
+ ///
[HttpGet("page")]
- public async Task> GetPageAsync([FromQuery] DeviceTimePeriodPageRequest request)
+ public async Task> GetPageAsync([FromQuery] DeviceTimePeriodPageRequest request)
{
return await _deviceTimePeriodService.GetPageAsync(request);
}
+ ///
+ /// 保存时段码设置
+ ///
+ ///
[HttpPost("save")]
public async Task SaveAsync(DeviceTimePeriodSaveRequest request)
{
await _deviceTimePeriodService.SaveAsync(request);
}
+
+ ///
+ /// 获取类型时段列表
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("list")]
+ public async Task> GetListAsync(
+ [EnumDataType(typeof(DeviceTimePeriodAssignEnumType))]
+ DeviceTimePeriodAssignEnumType assignType,
+ [Required] Guid value)
+ {
+ return await _deviceTimePeriodService.GetListAsync(assignType, value);
+ }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Dtos/DeviceTimePeriodDto.cs b/Src/Dlhis.Basic/Device/Dtos/DeviceTimePeriodDto.cs
new file mode 100644
index 00000000..982077ad
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Dtos/DeviceTimePeriodDto.cs
@@ -0,0 +1,11 @@
+namespace Dlhis.Basic.Device.Dtos;
+
+public class DeviceTimePeriodDto
+{
+ public int CardType { 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/Response/DeviceTimePeriodPageResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceTimePeriodResponse.cs
similarity index 95%
rename from Src/Dlhis.Basic/Device/Response/DeviceTimePeriodPageResponse.cs
rename to Src/Dlhis.Basic/Device/Response/DeviceTimePeriodResponse.cs
index b5519bc0..676571b4 100644
--- a/Src/Dlhis.Basic/Device/Response/DeviceTimePeriodPageResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DeviceTimePeriodResponse.cs
@@ -2,7 +2,7 @@ using Dlhis.Entity.Device.Enums;
namespace Dlhis.Basic.Device.Response;
-public class DeviceTimePeriodPageResponse
+public class DeviceTimePeriodResponse
{
public long Id { get; set; }
diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs
index 180d5b9d..db59b281 100644
--- a/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs
+++ b/Src/Dlhis.Basic/Device/Services/IDeviceTimePeriodService.cs
@@ -1,12 +1,17 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
+using Dlhis.Entity.Device.Enums;
using Kurisu.AspNetCore.DataAccess.Dto;
namespace Dlhis.Basic.Device.Services;
public interface IDeviceTimePeriodService : IScopeDependency
{
- Task> GetPageAsync(DeviceTimePeriodPageRequest request);
+ Task> GetPageAsync(DeviceTimePeriodPageRequest request);
Task SaveAsync(DeviceTimePeriodSaveRequest request);
+
+ Task> GetListAsync(DeviceTimePeriodAssignEnumType assignType, Guid value);
+
+ Task GenerateDeviceTimePeriodTasksAsync(Func func);
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs
index 2b21701f..d05c08a2 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs
@@ -22,12 +22,14 @@ public class DeviceService : IDeviceService
private readonly IDbContext _dbContext;
private readonly ICurrentUser _currentUser;
private readonly ITenantApi _tenantApi;
+ private readonly IDeviceTimePeriodService _deviceTimePeriodService;
- public DeviceService(IDbContext dbContext, ICurrentUser currentUser, ITenantApi tenantApi)
+ public DeviceService(IDbContext dbContext, ICurrentUser currentUser, ITenantApi tenantApi, IDeviceTimePeriodService deviceTimePeriodService)
{
_dbContext = dbContext;
_currentUser = currentUser;
_tenantApi = tenantApi;
+ _deviceTimePeriodService = deviceTimePeriodService;
}
public async Task> GetPageAsync(DevicePageRequest request)
@@ -63,50 +65,54 @@ public class DeviceService : IDeviceService
await CheckUniqueNoExistsAsync(request);
await CheckTemplateExistsAsync(request.TemplateCode);
await CheckTemplateFieldAsync(request.TemplateCode, request.ConnectionInfo);
-
- DeviceEntity entity;
- if (!request.Id.HasValue)
+
+ await _deviceTimePeriodService.GenerateDeviceTimePeriodTasksAsync(async () =>
{
- entity = request.Adapt();
- entity.UniqueNo = request.UniqueNo;
- entity.Code = Guid.NewGuid();
- await _dbContext.InsertAsync(entity);
- //同时保存注册信息
- var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync();
- if (registry == null)
+ DeviceEntity entity;
+
+ if (!request.Id.HasValue)
{
- registry = new DeviceRegistryEntity
+ entity = request.Adapt();
+ entity.UniqueNo = request.UniqueNo;
+ entity.Code = Guid.NewGuid();
+ await _dbContext.InsertAsync(entity);
+ //同时保存注册信息
+ var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync();
+ if (registry == null)
{
- DeviceUniqueNo = request.UniqueNo,
- LastHeartbeatTime = DateTime.Now,
- RegisterTime = DateTime.Now,
- BusinessPlaceCode = null,
- };
+ registry = new DeviceRegistryEntity
+ {
+ DeviceUniqueNo = request.UniqueNo,
+ LastHeartbeatTime = DateTime.Now,
+ RegisterTime = DateTime.Now,
+ BusinessPlaceCode = null,
+ };
- await _dbContext.InsertAsync(registry);
+ await _dbContext.InsertAsync(registry);
+ }
}
- }
- else
- {
- entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
- entity.ThrowIfNull("设备不存在,无法更新");
-
- //分类发生变化,检查是否存在分组
- if (request.Type != entity.Type)
+ else
{
- var existsG = await _dbContext.Queryable()
- .LeftJoin((dgr, dg) => dgr.GroupCode == dg.Code)
- .Where((dgr, dg) => dgr.DeviceCode == entity.Code)
- .AnyAsync();
+ entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
+ entity.ThrowIfNull("设备不存在,无法更新");
- existsG.ThrowIfTrue("存在设备分组,不可修改设备分类");
+ //分类发生变化,检查是否存在分组
+ if (request.Type != entity.Type)
+ {
+ var existsG = await _dbContext.Queryable()
+ .LeftJoin((dgr, dg) => dgr.GroupCode == dg.Code)
+ .Where((dgr, dg) => dgr.DeviceCode == entity.Code)
+ .AnyAsync();
+
+ existsG.ThrowIfTrue("存在设备分组,不可修改设备分类");
+ }
+
+ request.Adapt(entity);
+ await _dbContext.UpdateAsync(entity);
}
- request.Adapt(entity);
- await _dbContext.UpdateAsync(entity);
- }
-
- await GenerateUploadRecordLogForBeginTimeAsync(entity);
+ await GenerateUploadRecordLogForBeginTimeAsync(entity);
+ });
}
///
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs
index a1cdaf2f..9a903db8 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTimePeriodService.cs
@@ -1,3 +1,4 @@
+using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
@@ -8,6 +9,7 @@ using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
using Mapster;
+using SqlSugar;
namespace Dlhis.Basic.Device.Services.Implements;
@@ -21,11 +23,11 @@ public class DeviceTimePeriodService : IDeviceTimePeriodService
}
///
- public async Task> GetPageAsync(DeviceTimePeriodPageRequest request)
+ public async Task> GetPageAsync(DeviceTimePeriodPageRequest request)
{
var page = await _dbContext.Queryable()
.Where(x => x.AssignType == request.AssignType)
- .Select()
+ .Select()
.ToPageListAsync(request);
var values = page.Data.Select(x => x.Value);
@@ -54,23 +56,149 @@ public class DeviceTimePeriodService : IDeviceTimePeriodService
.Where(x => x.CardType == request.CardType)
.Where(x => x.AssignType == request.AssignType)
.Where(x => x.Value == request.Value)
+ .WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.AnyAsync()).ThrowIfTrue("请勿重复添加");
-
- if (!request.Id.HasValue)
+ await GenerateDeviceTimePeriodTasksAsync(async () =>
{
- 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);
+ 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);
+ await _dbContext.UpdateAsync(entity);
+ }
+ });
+ }
+
+ ///
+ public async Task> GetListAsync(DeviceTimePeriodAssignEnumType assignType, Guid value)
+ {
+ return await _dbContext.Queryable().Where(x => x.AssignType == assignType && x.Value == value).Select().ToListAsync();
+ }
+
+
+ public async Task GenerateDeviceTimePeriodTasksAsync(Func func)
+ {
+ var cardTypes = await _dbContext.Queryable().Where(x => x.Type == "timeperiod").Select(x => SqlFunc.ToInt32(x.Code)).ToListAsync();
+
+ var before = await GetSettingsAsync();
+ await func();
+ var current = await GetSettingsAsync();
+
+ var tasks = new List();
+
+ var deviceUniqueNos = before.Keys.ToList().Concat(current.Keys).Distinct().ToList();
+ var devices = await _dbContext.Queryable().Where(x => deviceUniqueNos.Contains(x.UniqueNo)).ToListAsync();
+ foreach (var device in devices)
+ {
+ var deviceUniqueNo = device.UniqueNo;
+
+ before.TryGetValue(deviceUniqueNo, out var beforeDtos);
+ beforeDtos ??= new List(0);
+
+ current.TryGetValue(deviceUniqueNo, out var currentDtos);
+ currentDtos ??= new List(0);
+
+ if (beforeDtos.Count != currentDtos.Count)
+ {
+ tasks.Add(new DeviceTaskEntity
+ {
+ Type = beforeDtos.Count < currentDtos.Count ? DeviceTaskEnumType.TimePeriodAdd : DeviceTaskEnumType.TimePeriodDelete,
+ DeviceType = device.Type,
+ UserId = null,
+ UserNo = null,
+ DeviceUniqueNo = deviceUniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Version = 0,
+ CancellationId = 0,
+ Source = null,
+ Priority = 90,
+ TenantId = device.TenantId
+ });
+
+ continue;
+ }
+
+ foreach (var cardType in cardTypes)
+ {
+ var b = beforeDtos.FirstOrDefault(x => x.CardType == cardType);
+ if (b == null)
+ {
+ continue;
+ }
+
+ var c = currentDtos.First(x => x.CardType == cardType);
+
+ if (b.OnStart != c.OnStart || b.OnEnd != c.OnEnd || b.OffStart != c.OffStart || b.OffEnd != c.OffEnd)
+ {
+ tasks.Add(new DeviceTaskEntity
+ {
+ Type = DeviceTaskEnumType.TimePeriodAdd,
+ DeviceType = device.Type,
+ UserId = null,
+ UserNo = null,
+ DeviceUniqueNo = deviceUniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Version = 0,
+ CancellationId = 0,
+ Source = null,
+ Priority = 90,
+ TenantId = device.TenantId
+ });
+ }
+ }
}
+
+ await _dbContext.InsertAsync(tasks);
+ }
+
+ private async Task>> GetSettingsAsync()
+ {
+ var timePeriods = await _dbContext.Queryable().ToListAsync();
+
+ var templateCodes = timePeriods.Where(x => x.AssignType == DeviceTimePeriodAssignEnumType.Template).Select(x => x.Value).Distinct().ToList();
+ var deviceCodes = timePeriods.Where(x => x.AssignType == DeviceTimePeriodAssignEnumType.Device).Select(x => x.Value).ToList();
+
+ var devices = await _dbContext.Queryable()
+ .Where(x => !SqlFunc.IsNullOrEmpty(x.TemplateCode))
+ .Where(x => templateCodes.Contains(x.TemplateCode.Value) || deviceCodes.Contains(x.Code))
+ .Where(x => x.Enable && x.EnableTimePeriod)
+ .ToListAsync();
+
+ return devices.Select(x =>
+ {
+ var tSettings = timePeriods
+ .Where(item => item.AssignType == DeviceTimePeriodAssignEnumType.Template && item.Value == x.TemplateCode)
+ .Adapt>();
+
+ var dSettings = timePeriods
+ .Where(item => item.AssignType == DeviceTimePeriodAssignEnumType.Device && item.Value == x.Code)
+ .Adapt>();
+
+ foreach (var setting in dSettings)
+ {
+ var s = tSettings.FirstOrDefault(item => item.CardType == setting.CardType);
+ if (s != null)
+ {
+ tSettings.Remove(s);
+ }
+
+ tSettings.Add(setting);
+ }
+
+ return new
+ {
+ x.UniqueNo, tSettings
+ };
+ }).ToDictionary(x => x.UniqueNo, x => x.tSettings);
}
}
\ No newline at end of file
diff --git a/Src/Dlhis.Entity/Sap/SapDataSyncEntity.cs b/Src/Dlhis.Entity/Sap/SapDataSyncEntity.cs
index 018288eb..57167cfc 100644
--- a/Src/Dlhis.Entity/Sap/SapDataSyncEntity.cs
+++ b/Src/Dlhis.Entity/Sap/SapDataSyncEntity.cs
@@ -6,9 +6,12 @@ namespace Dlhis.Entity.Sap;
[SugarTable(TableName = "SapDataSync")]
public class SapDataSyncEntity : SugarBaseEntity
{
+ [SugarColumn(UniqueGroupNameList = new[] { "unique_SapDataSync_key-type" })]
public string Key { get; set; }
+ [SugarColumn(UniqueGroupNameList = new[] { "unique_SapDataSync_key-type" })]
public string Type { get; set; }
+ [SugarColumn(ColumnDataType = "bit")]
public bool IsSync { get; set; }
}
\ No newline at end of file