diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs
index e0274c09..bba3ae80 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs
@@ -23,7 +23,7 @@ public class DeviceGroupsController : ControllerBase
}
///
- /// 设备分组分页
+ /// 设备组分页
///
///
///
@@ -34,7 +34,7 @@ public class DeviceGroupsController : ControllerBase
}
///
- /// 获取设备分组树
+ /// 获取设备组树
///
/// 是否显示设备
///
diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
index 404e8e6e..0efd2afc 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
@@ -38,4 +38,16 @@ public class DevicePermissionsController : ControllerBase
{
return await _devicePermissionService.GetAssignmentsAsync(request.UserNo, request.UniqueType);
}
+
+
+ ///
+ /// 重置
+ ///
+ ///
+ ///
+ [HttpPost("reset")]
+ public async Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request)
+ {
+ await _devicePermissionService.ResetAssignmentsAsync(request);
+ }
}
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceResetAssignmentsRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceResetAssignmentsRequest.cs
new file mode 100644
index 00000000..afdcbe9b
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Request/DeviceResetAssignmentsRequest.cs
@@ -0,0 +1,12 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Dlhis.Basic.Device.Request;
+
+public class DeviceResetAssignmentsRequest
+{
+ ///
+ /// 人员档案号
+ ///
+ [Required(ErrorMessage = "人员不能为空")]
+ public string UserNo { get; set; }
+}
diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
index ee36c386..8c75e764 100644
--- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
@@ -19,4 +19,20 @@ public interface IDevicePermissionService : IScopeDependency
///
///
Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType);
+
+
+ ///
+ /// 重置分配
+ ///
+ ///
+ Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request);
+
+
+ ///
+ /// 生成下发任务
+ ///
+ ///
+ ///
+ ///
+ Task GenerateDeviceTasksAsync(Func func, List userNos);
}
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
index 37c34957..f183213f 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
@@ -4,6 +4,7 @@ using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.DataAccess.Dto;
+using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Services;
using Mapster;
@@ -13,10 +14,12 @@ namespace Dlhis.Basic.Device.Services.Implements;
public class DeviceGroupService : IDeviceGroupService
{
private readonly IDbContext _dbContext;
+ private readonly IDevicePermissionService _devicePermissionService;
- public DeviceGroupService(IDbContext dbContext)
+ public DeviceGroupService(IDbContext dbContext, IDevicePermissionService devicePermissionService)
{
_dbContext = dbContext;
+ _devicePermissionService = devicePermissionService;
}
public async Task> GetPageAsync(DeviceGroupPageRequest request)
@@ -70,6 +73,7 @@ public class DeviceGroupService : IDeviceGroupService
await _dbContext.DeleteAsync(deviceGroup);
}
+ [Transactional]
public async Task AssignDevicesAsync(DeviceAssignRequest request)
{
var group = await _dbContext.Queryable().Where(x => x.Code == request.GroupCode).FirstAsync();
@@ -77,15 +81,13 @@ public class DeviceGroupService : IDeviceGroupService
await CheckNoNextGroupAsync(group.Code);
- if (!request.DeviceCodes.Any())
+ //下发任务
+ await _devicePermissionService.GenerateDeviceTasksAsync(async () =>
{
- //todo 删除时候判断权限是否分配
-
var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync();
await _dbContext.DeleteAsync(relationships);
- }
- else
- {
+
+ request.DeviceCodes = await _dbContext.Queryable().Where(x => request.DeviceCodes.Contains(x.Code)).Select(x => x.Code).ToListAsync();
var entities = request.DeviceCodes.Select(x => new DeviceGroupRelationshipEntity
{
GroupCode = request.GroupCode,
@@ -94,8 +96,8 @@ public class DeviceGroupService : IDeviceGroupService
}).ToList();
await _dbContext.InsertAsync(entities);
- }
- //todo 生成下发任务
+
+ }, null);
}
public async Task> GetDevicesAsync(Guid code)
@@ -165,6 +167,7 @@ public class DeviceGroupService : IDeviceGroupService
Name = device.UniqueNo,
PCode = relation.GroupCode
})
+ .Distinct()
.ToList();
}
}
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
index 7c3645c2..3798ede7 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
@@ -1,7 +1,11 @@
using Dlhis.Basic.Device.Request;
+using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
+using Dlhis.Entity.Device.Enums;
using Dlhis.Entity.Sys.Entities;
using Dlhis.Entity.Sys.Enums;
+using Kurisu.AspNetCore.Utils.Extensions;
+using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Services;
namespace Dlhis.Basic.Device.Services.Implements;
@@ -15,26 +19,32 @@ public class DevicePermissionService : IDevicePermissionService
_dbContext = dbContext;
}
+ [Transactional]
public async Task AssignmentAsync(List reuqests)
{
- foreach (var item in reuqests)
+ foreach (var grp in reuqests.GroupBy(x => x.UserNo))
{
- var permissions = await _dbContext.Queryable()
- .Where(x => x.UniqueType == item.UniqueType)
- .Where(x => x.UniqueValue == item.UniqueValue)
- .Where(x => x.UserNo == item.UserNo)
- .ToListAsync();
+ var userNo = grp.Key;
+ var data = grp.AsEnumerable().DistinctBy(x => x.UniqueValue).ToList();
- //todo 差异数据
- await _dbContext.Client.Deleteable(permissions).ExecuteCommandAsync();
-
- await _dbContext.InsertAsync(new DevicePermissionEntity
+ await GenerateDeviceTasksAsync(async () =>
{
- UserNo = item.UserNo,
- UniqueType = item.UniqueType,
- UniqueValue = item.UniqueValue,
- });
- }
+ await _dbContext.Client.Deleteable()
+ .Where(x => x.UserNo == userNo)
+ .ExecuteCommandAsync();
+
+ var devicePermissions = data.Select(x => new DevicePermissionEntity
+ {
+ UserNo = x.UserNo,
+ UniqueType = x.UniqueType,
+ UniqueValue = x.UniqueValue,
+
+ }).ToList();
+
+ await _dbContext.InsertAsync(devicePermissions);
+
+ }, new List { userNo });
+ };
}
public async Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType)
@@ -45,61 +55,141 @@ public class DevicePermissionService : IDevicePermissionService
.Select(x => x.UniqueValue)
.ToListAsync();
- return assignments;
+ if (uniqueType.HasValue && uniqueType == DeviceAssignmentTypeEnumType.Group)
+ {
+ var deviceGroups = await _dbContext.Queryable().ToListAsync();
+ var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
+ tops.ForEach(x =>
+ {
+ RecursionGetNext(x, deviceGroups, assignments, assignments.Contains(x.Code));
+ });
+ }
+
+ return assignments.Distinct().ToList();
+
+ void RecursionGetNext(DeviceGroupEntity current, List deviceGroups, List result, bool add)
+ {
+ var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
+ foreach (var item in next)
+ {
+ if (add) assignments.Add(item.Code);
+ RecursionGetNext(item, deviceGroups, result, assignments.Contains(item.Code));
+ }
+ }
}
- public async Task> GetAssignDeviceCodesAsync(string userNo)
+
+ public async Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request)
{
+ await GenerateDeviceTasksAsync(async () =>
+ {
+ await _dbContext.Client.Deleteable()
+ .Where(x => x.UserNo == request.UserNo)
+ .ExecuteCommandAsync();
+
+ }, new List { request.UserNo });
+ }
+
+ public async Task GenerateDeviceTasksAsync(Func func, List userNos)
+ {
+ if (userNos.IsEmpty())
+ {
+ userNos = await _dbContext.Queryable().Select(x => x.UserNo).Distinct().ToListAsync();
+ }
+
+ var beforeDic = new Dictionary>(userNos.Count);
+ foreach (var userNo in userNos)
+ {
+ beforeDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo));
+ }
+
+ //获取处理
+ await func();
+
+ //获取当前的权限code
+ var currentDic = new Dictionary>(userNos.Count);
+ foreach (var userNo in userNos)
+ {
+ currentDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo));
+ }
+
+ foreach (var userNo in userNos)
+ {
+ var beforeCodes = beforeDic[userNo];
+ var currentCodes = currentDic[userNo];
+
+ //被删除
+ var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList();
+ //新增
+ var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList();
+
+ if (!deletedItems.Any() && !addItems.Any())
+ {
+ continue;
+ }
+
+ var deivces = await _dbContext.Queryable().Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).ToListAsync();
+ var deviceCodes = deivces.Select(x => x.Code).ToList();
+ deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList();
+ addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList();
+
+ var userInfo = await _dbContext.Queryable()
+ .LeftJoin((ga, department) => department.No == ga.DepartmentNo)
+ .Where(ga => ga.No == userNo)
+ .Select(ga => new
+ {
+ ga.Code
+ })
+ .SingleAsync();
+
+ //下发任务创建
+ var toDeleted = deletedItems.Select(x => new DeviceTaskEntity
+ {
+ DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Type = DeviceTaskEnumType.Delete,
+ UserNo = userNo,
+ Version = 0,
+ UserCode = userInfo.Code,
+ }).ToList();
+
+ var toAdd = addItems.Select(x => new DeviceTaskEntity
+ {
+ DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Type = DeviceTaskEnumType.Add,
+ UserNo = userNo,
+ Version = 0,
+ UserCode = userInfo.Code,
+ }).ToList();
+
+ var tasks = toDeleted.Concat(toAdd).ToList();
+ await _dbContext.InsertAsync(tasks);
+ }
+ }
+
+
+ //************************************************ help methods *******************************************************
+
+ ///
+ /// 获取用户所有设备权限
+ ///
+ ///
+ ///
+ private async Task> GetAssignDeviceCodesAsync(string userNo)
+ {
+ var deviceCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Device);
+
var groupCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Group);
- var deviceGroups = await _dbContext.Queryable().ToListAsync();
+ var deviceCodeUnderGroups = await _dbContext.Queryable()
+ .Where(x => groupCodes.Contains(x.GroupCode))
+ .Select(x => x.DeviceCode)
+ .Distinct()
+ .ToListAsync();
- return null;
- //var deviceCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Device);
+ deviceCodes.AddRange(deviceCodeUnderGroups);
- //var permissionCodes = await _dbContext.Queryable()
- // .Where(x => x.UniqueType == uniqueType)
- // .Where(x => x.UniqueValue == uniqueData)
- // .Select(x => x.Code)
- // .ToListAsync();
-
- //var menus = await GetListAsync(PlatformEnumType.PCAdmin);
-
- //foreach (var menu in menus)
- //{
- // if (menu.Items.Any())
- // {
- // var codes = RecursionHandler(menu.Items, permissionCodes);
- // permissionCodes.RemoveAll(x => codes.Contains(x));
- // }
- //}
-
- //return permissionCodes;
-
- //static List RecursionHandler(List menus, List innerPermissions)
- //{
- // var codes = new HashSet();
- // foreach (var menu in menus)
- // {
- // if (menu.Items.Any())
- // {
- // var innerPermissionCodes = RecursionHandler(menu.Items, innerPermissions);
- // foreach (var item in innerPermissionCodes)
- // {
- // codes.Add(item);
- // }
- // }
-
- // if (!innerPermissions.Contains(menu.Code))
- // {
- // foreach (var item in menu.Items.Select(x => x.Code))
- // {
- // codes.Add(item);
- // }
- // }
- // }
-
- // return codes.ToList();
- //}
+ return deviceCodes.Distinct().ToList();
}
}
diff --git a/Src/Dlhis.Basic/Packs/SqlSugarPack.cs b/Src/Dlhis.Basic/Packs/SqlSugarPack.cs
index 60895fd4..50f6dc86 100644
--- a/Src/Dlhis.Basic/Packs/SqlSugarPack.cs
+++ b/Src/Dlhis.Basic/Packs/SqlSugarPack.cs
@@ -17,6 +17,7 @@ public class SqlSugarPack : BaseAppPack
public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
#if DEBUG
+
//using var scope = app.ApplicationServices.CreateScope();
//var db = scope.ServiceProvider.GetService();
//var tables = App.ActiveTyps.Where(x => x.IsDefined(typeof(SugarTable), false))
diff --git a/Src/Dlhis.Sys/Dlhis.Sys.csproj b/Src/Dlhis.Sys/Dlhis.Sys.csproj
index 8a58f593..77c0be37 100644
--- a/Src/Dlhis.Sys/Dlhis.Sys.csproj
+++ b/Src/Dlhis.Sys/Dlhis.Sys.csproj
@@ -25,8 +25,4 @@
-
-
-
-