From 7d2c041bb99c38ab6c0884b5c78c73997a10316e Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 13:48:13 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix=20=E8=B0=83=E6=95=B4=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/Controllers/BalancesController.cs | 2 +- .../Basic/Entity/GainfoGroupEntity.cs | 29 +++++++++++++++++++ .../Entity/GainfoGroupRelationshipEntity.cs | 22 ++++++++++++++ .../Sys/Entities/DevicePermissionEntity.cs | 13 +++++++-- .../Sys/Entities/MenuPermissionEntity.cs | 2 +- ...tTypeEnumType.cs => AssignTypeEnumType.cs} | 12 ++++++-- 6 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs create mode 100644 Src/Dlhis.Entity/Basic/Entity/GainfoGroupRelationshipEntity.cs rename Src/Dlhis.Entity/Sys/Enums/{MenuAssignmentTypeEnumType.cs => AssignTypeEnumType.cs} (71%) diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index e8934f50..9ac751e5 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -23,7 +23,7 @@ public class BalancesController : ControllerBase } /// - /// 获取消费记录 + /// 获取记录分页 /// /// /// diff --git a/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs b/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs new file mode 100644 index 00000000..2243b9e5 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/GainfoGroupEntity.cs @@ -0,0 +1,29 @@ +using Kurisu.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 档案组 +/// +[SugarTable(TableName = "GainfoGroup", TableDescription = "档案组")] +public class GainfoGroupEntity : SugarBaseEntity +{ + /// + /// 分组code + /// + [SugarColumn(ColumnDescription = "分组code")] + public Guid Code { get; set; } + + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称")] + public string Name { get; set; } + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注")] + public string Remark { get; set; } +} diff --git a/Src/Dlhis.Entity/Basic/Entity/GainfoGroupRelationshipEntity.cs b/Src/Dlhis.Entity/Basic/Entity/GainfoGroupRelationshipEntity.cs new file mode 100644 index 00000000..a8747085 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/GainfoGroupRelationshipEntity.cs @@ -0,0 +1,22 @@ +using Kurisu.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 档案人员组关系 +/// +[SugarTable(TableName = "GainfoGroupRelationship", TableDescription = "档案人员组关系")] +public class GainfoGroupRelationshipEntity : SugarBaseEntity +{ + /// + /// 分组code + /// + public Guid GroupCode { get; set; } + + /// + /// 人员档案号 + /// + [SugarColumn(ColumnDescription = "人员档案号")] + public string UserNo { get; set; } +} diff --git a/Src/Dlhis.Entity/Sys/Entities/DevicePermissionEntity.cs b/Src/Dlhis.Entity/Sys/Entities/DevicePermissionEntity.cs index c6f98596..cb4e2e0f 100644 --- a/Src/Dlhis.Entity/Sys/Entities/DevicePermissionEntity.cs +++ b/Src/Dlhis.Entity/Sys/Entities/DevicePermissionEntity.cs @@ -13,10 +13,17 @@ namespace Dlhis.Entity.Sys.Entities; public class DevicePermissionEntity : SugarBaseEntity, ITenantId, ISoftDeleted { /// - /// 人员档案 + /// 分配权限类型 /// - [SugarColumn(ColumnDescription = "人员档案")] - public string UserNo { get; set; } + [SugarColumn(ColumnDataType = "varchar(50)", ColumnDescription = "分配权限类型", SqlParameterDbType = typeof(EnumToStringConvert))] + public AssignTypeEnumType AssignType { get; set; } + + /// + /// 分配值 + /// + [SugarColumn(ColumnDescription = "分配值")] + public string AssignValue { get; set; } + /// /// 设备权限类型 diff --git a/Src/Dlhis.Entity/Sys/Entities/MenuPermissionEntity.cs b/Src/Dlhis.Entity/Sys/Entities/MenuPermissionEntity.cs index 33133cf2..67d38089 100644 --- a/Src/Dlhis.Entity/Sys/Entities/MenuPermissionEntity.cs +++ b/Src/Dlhis.Entity/Sys/Entities/MenuPermissionEntity.cs @@ -16,7 +16,7 @@ public class MenuPermissionEntity : SugarBaseEntity, ITenantId, ISoftDeleted /// 权限分配类型 /// [SugarColumn(ColumnDataType = "varchar(50)", ColumnDescription = "权限分配类型", SqlParameterDbType = typeof(EnumToStringConvert))] - public MenuAssignmentTypeEnumType UniqueType { get; set; } + public AssignTypeEnumType UniqueType { get; set; } /// /// 类型值 diff --git a/Src/Dlhis.Entity/Sys/Enums/MenuAssignmentTypeEnumType.cs b/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs similarity index 71% rename from Src/Dlhis.Entity/Sys/Enums/MenuAssignmentTypeEnumType.cs rename to Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs index 0d70d4b4..f41385d5 100644 --- a/Src/Dlhis.Entity/Sys/Enums/MenuAssignmentTypeEnumType.cs +++ b/Src/Dlhis.Entity/Sys/Enums/AssignTypeEnumType.cs @@ -5,8 +5,8 @@ namespace Dlhis.Entity.Sys.Enums; /// /// 权限类型 /// -[Description("权限分配类型")] -public enum MenuAssignmentTypeEnumType +[Description("分配类型")] +public enum AssignTypeEnumType { /// /// 用户 @@ -30,5 +30,11 @@ public enum MenuAssignmentTypeEnumType /// 部门 /// [Description("部门")] - Department = 4 + Department = 4, + + /// + /// 租户/基地 + /// + [Description("租户/基地")] + Tenant = 5, } From ea5761d9b4102e7850d799c3226150a1b72ec963 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 14:55:26 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix=20=E6=A1=A3=E6=A1=88=E7=BB=84,?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=9D=83=E9=99=90=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionsController.cs | 20 +-- .../Request/DeviceGetAssignmentsRequest.cs | 19 ++- .../Request/DevicePermissionSaveReuqest.cs | 13 +- .../Services/IDevicePermissionService.cs | 16 +-- .../Implements/DevicePermissionService.cs | 135 +++++++++++------- Src/Dlhis.Basic/Dlhis.Basic.csproj | 2 +- .../Controllers/GainfoGroupsController.cs | 80 +++++++++++ .../Controllers/GainfosController.cs | 7 +- .../Request/GainfoAssignRequest.cs | 17 +++ .../Request/GainfoDImissionRequest.cs | 17 ++- .../Request/GainfoGroupPageRequest.cs | 7 + .../Request/GainfoGroupSaveRequest.cs | 16 +++ .../Request/GainfoUploadFaceRequest.cs | 20 ++- .../Response/GainfoGroupResponse.cs | 19 +++ .../Services/IGainfoGroupService.cs | 18 +++ .../Organization/Services/IGainfoService.cs | 4 +- .../Services/Implements/GainfoGroupService.cs | 101 +++++++++++++ .../Services/Implements/GainfoService.cs | 4 +- 18 files changed, 408 insertions(+), 107 deletions(-) create mode 100644 Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs create mode 100644 Src/Dlhis.Basic/Organization/Request/GainfoAssignRequest.cs create mode 100644 Src/Dlhis.Basic/Organization/Request/GainfoGroupPageRequest.cs create mode 100644 Src/Dlhis.Basic/Organization/Request/GainfoGroupSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs create mode 100644 Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs create mode 100644 Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 0efd2afc..aedb02e5 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -20,12 +20,12 @@ public class DevicePermissionsController : ControllerBase /// /// 分配权限 /// - /// + /// /// [HttpPost("assign")] - public async Task AssignmentAsync(List requests) + public async Task AssignAsync(DevicePermissionSaveReuqest request) { - await _devicePermissionService.AssignmentAsync(requests); + await _devicePermissionService.AssignAsync(request); } /// @@ -36,18 +36,6 @@ public class DevicePermissionsController : ControllerBase [HttpGet("assignments")] public async Task> GetAssignmentsAsync([FromQuery] DeviceGetAssignmentsRequest request) { - return await _devicePermissionService.GetAssignmentsAsync(request.UserNo, request.UniqueType); - } - - - /// - /// 重置 - /// - /// - /// - [HttpPost("reset")] - public async Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request) - { - await _devicePermissionService.ResetAssignmentsAsync(request); + return await _devicePermissionService.GetAssignmentsAsync(request.UniqueType, request.AssignType, request.AssignValue); } } diff --git a/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs index f4974b17..9d4f4114 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs @@ -6,14 +6,19 @@ namespace Dlhis.Basic.Device.Request; public class DeviceGetAssignmentsRequest { /// - /// 用户档案号 - /// - [Required] - public string UserNo { get; set; } - - /// - /// 权限分配类型 MenuAssignmentTypeEnumType + /// 权限分配类型 DeviceAssignmentTypeEnumType /// [EnumDataType(typeof(DeviceAssignmentTypeEnumType))] public DeviceAssignmentTypeEnumType UniqueType { get; set; } + + /// + /// 分配类型 AssignTypeEnumType + /// + [EnumDataType(typeof(AssignTypeEnumType))] + public AssignTypeEnumType AssignType { get; set; } + + /// + /// 分配值 + /// + public string AssignValue { get; set; } } diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs index e115b57d..5bca130a 100644 --- a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs +++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs @@ -5,14 +5,20 @@ namespace Dlhis.Basic.Device.Request; public class DevicePermissionSaveReuqest { + /// + /// 分配类型 AssignTypeEnumType + /// + [EnumDataType(typeof(AssignTypeEnumType), ErrorMessage = "枚举类型错误")] + public AssignTypeEnumType AssignType { get; set; } + /// /// 人员档案号 /// [Required(ErrorMessage = "人员档案号不能为空")] - public string UserNo { get; set; } + public string AssignValue { get; set; } /// - /// 分配权限类型 DevicePermissionTypeEnumType + /// 来源分配权限类型 DevicePermissionTypeEnumType /// [EnumDataType(typeof(DeviceAssignmentTypeEnumType), ErrorMessage = "枚举类型错误")] public DeviceAssignmentTypeEnumType UniqueType { get; set; } @@ -20,6 +26,5 @@ public class DevicePermissionSaveReuqest /// /// 分配权限值不能为空 /// - [Required(ErrorMessage = "分配权限值不能为空")] - public Guid UniqueValue { get; set; } + public List Codes { get; set; } = new List(); } diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 8c75e764..b88bd079 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -8,24 +8,18 @@ public interface IDevicePermissionService : IScopeDependency /// /// 保存设备权限 /// - /// + /// /// - Task AssignmentAsync(List reuqests); + Task AssignAsync(DevicePermissionSaveReuqest reuqest); /// /// 获取分配的权限 /// - /// /// + /// + /// /// - Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType); - - - /// - /// 重置分配 - /// - /// - Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request); + Task> GetAssignmentsAsync(DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue); /// diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 3798ede7..e1f52e36 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -20,81 +20,66 @@ public class DevicePermissionService : IDevicePermissionService } [Transactional] - public async Task AssignmentAsync(List reuqests) + public async Task AssignAsync(DevicePermissionSaveReuqest reuqest) { - foreach (var grp in reuqests.GroupBy(x => x.UserNo)) + await GenerateDeviceTasksAsync(async () => { - var userNo = grp.Key; - var data = grp.AsEnumerable().DistinctBy(x => x.UniqueValue).ToList(); + await _dbContext.Client.Deleteable() + .Where(x => x.AssignType == reuqest.AssignType) + .Where(x => x.AssignValue == reuqest.AssignValue) + .ExecuteCommandAsync(); - await GenerateDeviceTasksAsync(async () => + var devicePermissions = reuqest.Codes.Select(x => new DevicePermissionEntity { - await _dbContext.Client.Deleteable() - .Where(x => x.UserNo == userNo) - .ExecuteCommandAsync(); + AssignType = reuqest.AssignType, + AssignValue = reuqest.AssignValue, + UniqueType = reuqest.UniqueType, + UniqueValue = x, + }).ToList(); - var devicePermissions = data.Select(x => new DevicePermissionEntity - { - UserNo = x.UserNo, - UniqueType = x.UniqueType, - UniqueValue = x.UniqueValue, + await _dbContext.InsertAsync(devicePermissions); - }).ToList(); - - await _dbContext.InsertAsync(devicePermissions); - - }, new List { userNo }); - }; + }, null); } - public async Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType) + public async Task> GetAssignmentsAsync(DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue) { - var assignments = await _dbContext.Queryable() - .WhereIF(uniqueType.HasValue, x => x.UniqueType == uniqueType) - .Where(x => x.UserNo == userNo) + var devicePermissions = await _dbContext.Queryable() + .Where(x => x.UniqueType == uniqueType) + .Where(x => x.AssignType == assignType) + .Where(x => x.AssignValue == assignValue) .Select(x => x.UniqueValue) .ToListAsync(); - if (uniqueType.HasValue && uniqueType == DeviceAssignmentTypeEnumType.Group) + if (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)); + RecursionGetNext(x, deviceGroups, devicePermissions, devicePermissions.Contains(x.Code)); }); } - return assignments.Distinct().ToList(); + return devicePermissions.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)); + if (add) result.Add(item.Code); + RecursionGetNext(item, deviceGroups, result, result.Contains(item.Code)); } } } - 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(); + userNos = await GetPermissionUserNosAsync(); } var beforeDic = new Dictionary>(userNos.Count); @@ -108,6 +93,7 @@ public class DevicePermissionService : IDevicePermissionService //获取当前的权限code var currentDic = new Dictionary>(userNos.Count); + userNos = await GetPermissionUserNosAsync(); foreach (var userNo in userNos) { currentDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo)); @@ -115,8 +101,11 @@ public class DevicePermissionService : IDevicePermissionService foreach (var userNo in userNos) { - var beforeCodes = beforeDic[userNo]; - var currentCodes = currentDic[userNo]; + beforeDic.TryGetValue(userNo, out var beforeCodes); + if (beforeCodes == null) beforeCodes = new List(); + + currentDic.TryGetValue(userNo, out var currentCodes); + if (currentCodes == null) currentCodes = new List(); //被删除 var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList(); @@ -171,6 +160,32 @@ public class DevicePermissionService : IDevicePermissionService //************************************************ help methods ******************************************************* + private async Task> GetPermissionUserNosAsync() + { + var permissions = await _dbContext.Queryable().ToListAsync(); + //User + var userNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.User).Select(x => x.AssignValue).ToList(); + + //Group + var groupCode = permissions.Where(x => x.AssignType == AssignTypeEnumType.Group).Select(x => Guid.Parse(x.AssignValue)).ToList(); + var userNosByGroup = await _dbContext.Queryable() + .Where(x => groupCode.Contains(x.GroupCode)) + .Select(x => x.UserNo) + .ToListAsync(); + + //Department + var departmentNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.Department).Select(x => x.AssignValue).ToList(); + var userNosByDepartment = await _dbContext.Queryable().Where(x => departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync(); + + //Tenant + var tenants = permissions.Where(x => x.AssignType == AssignTypeEnumType.Tenant).Select(x => x.AssignValue).ToList(); + var userNosByWerk = await _dbContext.Queryable().Where(x => tenants.Contains(x.Werks)).Select(x => x.No).ToListAsync(); + + + return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).ToList(); + } + + /// /// 获取用户所有设备权限 /// @@ -178,17 +193,37 @@ public class DevicePermissionService : IDevicePermissionService /// private async Task> GetAssignDeviceCodesAsync(string userNo) { - var deviceCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Device); + var gainfo = await _dbContext.Queryable().Where(x => x.No == userNo).SingleAsync(); + var gainfoGroups = await _dbContext.Queryable().Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToListAsync(); - var groupCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Group); - var deviceCodeUnderGroups = await _dbContext.Queryable() - .Where(x => groupCodes.Contains(x.GroupCode)) - .Select(x => x.DeviceCode) - .Distinct() - .ToListAsync(); + var deviceCodes = new List(); + var deviceGroupCodes = new List(); - deviceCodes.AddRange(deviceCodeUnderGroups); + var du = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo); + var gu = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo); + deviceCodes.AddRange(du); + deviceGroupCodes.AddRange(gu); + foreach (var group in gainfoGroups) + { + var dg = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, group.ToString()); + var gg = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, group.ToString()); + deviceCodes.AddRange(dg); + deviceGroupCodes.AddRange(gg); + } + + var dd = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo); + var gd = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo); + deviceCodes.AddRange(dd); + deviceGroupCodes.AddRange(gd); + + var dt = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Werks); + var gt = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Werks); + deviceCodes.AddRange(du); + deviceGroupCodes.AddRange(gu); + + var deveiceCodesByGroup = await _dbContext.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToListAsync(); + deviceCodes.AddRange(deveiceCodesByGroup); return deviceCodes.Distinct().ToList(); } diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj index 2d3bb2ea..ddf7fbde 100644 --- a/Src/Dlhis.Basic/Dlhis.Basic.csproj +++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj @@ -17,7 +17,7 @@ - + diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs new file mode 100644 index 00000000..b578cf1a --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoGroupsController.cs @@ -0,0 +1,80 @@ +using Dlhis.Basic.Organization.Request; +using Dlhis.Basic.Organization.Response; +using Dlhis.Basic.Organization.Services; +using Kurisu.AspNetCore.MVC; +using Kurisu.Core.DataAccess.Dto; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.Organization.Controllers; + +/// +/// 档案分组 +/// +[Authorize] +[ApiDefinition("SAP", Description = "晶科sap组织架构信息")] +[Route("api/[controller]")] +[ApiController] +public class GainfoGroupsController : ControllerBase +{ + private readonly IGainfoGroupService _gainfoGroupService; + + public GainfoGroupsController(IGainfoGroupService gainfoGroupService) + { + _gainfoGroupService = gainfoGroupService; + } + + /// + /// 获取档案组分页 + /// + /// + /// + [HttpGet("page")] + public async Task> GetPageAsync([FromQuery] GainfoGroupPageRequest request) + { + return await _gainfoGroupService.GetPageAsync(request); + } + + /// + /// 获取所有档案组 + /// + /// + [HttpGet("list")] + public async Task> GetListAsync() + { + return await _gainfoGroupService.GetListAsync(); + } + + /// + /// 保存档案组 + /// + /// + /// + [HttpPost] + public async Task SaveAsync(GainfoGroupSaveRequest request) + { + await _gainfoGroupService.SaveAsync(request); + } + + /// + /// 根据分组code获取人员档案 + /// + /// + /// + [HttpGet("gainfos")] + public async Task> GetGainfosByGroupAsync(Guid code) + { + return await _gainfoGroupService.GetGainfosByGroupAsync(code); + } + + /// + /// 分配人员 + /// + /// + /// + [HttpPost("assign")] + public async Task AssignGainfosAsync(GainfoAssignRequest request) + { + await _gainfoGroupService.AssignGainfosAsync(request); + } +} diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs index c18beb24..7c9fac1b 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations; -using Dlhis.Basic.Organization.Filters; +using Dlhis.Basic.Organization.Filters; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Basic.Organization.Services; @@ -65,7 +64,7 @@ public class GainfosController : ControllerBase /// /// [HttpPost("dimission")] - public async Task DimissionAsync(GainfoDImissionRequest request) + public async Task DimissionAsync(GainfoDimissionRequest request) { await _gainfoService.DimissionAsync(request); } @@ -76,7 +75,7 @@ public class GainfosController : ControllerBase /// /// [HttpPost("onboarding")] - public async Task OnboardingAsync(GainfoDImissionRequest request) + public async Task OnboardingAsync(GainfoDimissionRequest request) { await _gainfoService.OnboardingAsync(request); } diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoAssignRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoAssignRequest.cs new file mode 100644 index 00000000..6741f83a --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/GainfoAssignRequest.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Organization.Request; + +public class GainfoAssignRequest +{ + /// + /// 分组code + /// + [Required(ErrorMessage = "档案组code")] + public Guid GroupCode { get; set; } + + /// + /// 档案号 + /// + public List UserNos { get; set; } = new List(); +} diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoDImissionRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoDImissionRequest.cs index 6d56fcd7..320420f8 100644 --- a/Src/Dlhis.Basic/Organization/Request/GainfoDImissionRequest.cs +++ b/Src/Dlhis.Basic/Organization/Request/GainfoDImissionRequest.cs @@ -1,13 +1,12 @@ using System.ComponentModel.DataAnnotations; -namespace Dlhis.Basic.Organization.Request +namespace Dlhis.Basic.Organization.Request; + +public class GainfoDimissionRequest { - public class GainfoDImissionRequest - { - /// - /// 档案号 - /// - [Required(ErrorMessage = "档案号不能为空")] - public string UserNo { get; set; } - } + /// + /// 档案号 + /// + [Required(ErrorMessage = "档案号不能为空")] + public string UserNo { get; set; } } diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoGroupPageRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoGroupPageRequest.cs new file mode 100644 index 00000000..b38a161d --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/GainfoGroupPageRequest.cs @@ -0,0 +1,7 @@ +using Kurisu.Core.DataAccess.Dto; + +namespace Dlhis.Basic.Organization.Request; + +public class GainfoGroupPageRequest: PageDto +{ +} diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoGroupSaveRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoGroupSaveRequest.cs new file mode 100644 index 00000000..bb5173e4 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/GainfoGroupSaveRequest.cs @@ -0,0 +1,16 @@ +namespace Dlhis.Basic.Organization.Request; + +public class GainfoGroupSaveRequest +{ + public long? Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } +} diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs index 495a329e..5f403df8 100644 --- a/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs +++ b/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs @@ -2,7 +2,7 @@ namespace Dlhis.Basic.Organization.Request; -public class GainfoUploadFaceRequest +public class GainfoUploadFaceRequest : IValidatableObject { /// /// 用户档案号 @@ -15,4 +15,22 @@ public class GainfoUploadFaceRequest /// [Required(ErrorMessage = "人脸照片不能为空")] public string Face { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + bool v = true; + try + { + Convert.FromBase64String(Face); + } + catch (Exception) + { + v = false; + } + + if (!v) + { + yield return new ValidationResult("人脸照片需要为Base64格式", new[] { nameof(Face) }); + } + } } diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs new file mode 100644 index 00000000..c53fdec5 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs @@ -0,0 +1,19 @@ +namespace Dlhis.Basic.Organization.Response; + +public class GainfoGroupResponse +{ + /// + /// 分组code + /// + public Guid Code { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } +} diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs new file mode 100644 index 00000000..344f4dd1 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoGroupService.cs @@ -0,0 +1,18 @@ +using Dlhis.Basic.Organization.Request; +using Dlhis.Basic.Organization.Response; +using Kurisu.Core.DataAccess.Dto; + +namespace Dlhis.Basic.Organization.Services; + +public interface IGainfoGroupService : IScopeDependency +{ + Task> GetPageAsync(GainfoGroupPageRequest request); + + Task> GetListAsync(); + + Task SaveAsync(GainfoGroupSaveRequest request); + + Task> GetGainfosByGroupAsync(Guid code); + + Task AssignGainfosAsync(GainfoAssignRequest request); +} diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs index eff29b50..43c71e75 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs @@ -13,9 +13,9 @@ public interface IGainfoService : IScopeDependency Task UpdateAsync(GainfoSaveRequest request); - Task DimissionAsync(GainfoDImissionRequest request); + Task DimissionAsync(GainfoDimissionRequest request); - Task OnboardingAsync(GainfoDImissionRequest request); + Task OnboardingAsync(GainfoDimissionRequest request); Task CurrentUserInfoAsync(); diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs new file mode 100644 index 00000000..a82c11f6 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs @@ -0,0 +1,101 @@ +using Dlhis.Basic.Organization.Request; +using Dlhis.Basic.Organization.Response; +using Dlhis.Entity.Basic.Entity; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.DataAccess.Dto; +using Kurisu.SqlSugar.Extensions; +using Kurisu.SqlSugar.Services; +using Mapster; + +namespace Dlhis.Basic.Organization.Services.Implements; + +public class GainfoGroupService : IGainfoGroupService +{ + private readonly IDbContext _dbContext; + + public GainfoGroupService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task> GetPageAsync(GainfoGroupPageRequest request) + { + return await _dbContext.Queryable() + .Select() + .ToPageListAsync(request); + } + + + public async Task> GetListAsync() + { + return await _dbContext.Queryable() + .Select() + .ToListAsync(); + } + + public async Task SaveAsync(GainfoGroupSaveRequest request) + { + await CheckDuplicateNameAsync(request); + + 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> GetGainfosByGroupAsync(Guid code) + { + var userNos = await _dbContext.Queryable() + .Where(x => x.GroupCode == code) + .Select(x => x.UserNo) + .ToListAsync(); + + var list = await _dbContext.Queryable() + .Where(x => userNos.Contains(x.No)) + .Select() + .ToListAsync(); + + return list; + } + + public async Task AssignGainfosAsync(GainfoAssignRequest request) + { + var relations = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); + await _dbContext.DeleteReallyAsync(relations); + + var entities = request.UserNos.Select(x => new GainfoGroupRelationshipEntity + { + GroupCode = request.GroupCode, + UserNo = x + + }).ToList(); + + await _dbContext.InsertAsync(entities); + } + + //******************************************************* help methods *********************************************************** + + /// + /// 检查重名 + /// + /// + /// + private async Task CheckDuplicateNameAsync(GainfoGroupSaveRequest request) + { + var exists = await _dbContext.Queryable() + .Where(x => x.Name == request.Name) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id) + .AnyAsync(); + + exists.ThrowIfTrue($"重复组名{request.Name}"); + } +} diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs index 16c3c30a..bb7fb4eb 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs @@ -87,7 +87,7 @@ public class GainfoService : IGainfoService /// /// [Transactional] - public async Task DimissionAsync(GainfoDImissionRequest request) + public async Task DimissionAsync(GainfoDimissionRequest request) { var gainfo = await _gainfoStore.Queryable(GainfoStatusEnumType.Working) .Where(x => x.No == request.UserNo) @@ -107,7 +107,7 @@ public class GainfoService : IGainfoService /// /// /// - public async Task OnboardingAsync(GainfoDImissionRequest request) + public async Task OnboardingAsync(GainfoDimissionRequest request) { var gainfo = await _gainfoStore.Queryable(GainfoStatusEnumType.External) .Where(x => x.No == request.UserNo) From da0ceaa93992075b4cc8a1582f4aba32085d2f19 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 15:33:06 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix=20=E6=97=A5=E5=BF=97=E7=BA=A7?= =?UTF-8?q?=E5=88=AB=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Canteen/appsettings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Src/Dlhis.Canteen/appsettings.json b/Src/Dlhis.Canteen/appsettings.json index c244b003..49e3558e 100644 --- a/Src/Dlhis.Canteen/appsettings.json +++ b/Src/Dlhis.Canteen/appsettings.json @@ -45,7 +45,8 @@ "Override": { "System": "Warning", "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" + "Microsoft.Hosting.Lifetime": "Information", + "Microsoft.AspNetCore": "Debug" } }, "WriteTo": [ From 7a42f4938e42a1c66a8b7e6d89b254e12f1133a8 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 15:45:01 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix=20=E8=BD=AC=E6=88=90=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/IDevicePermissionService.cs | 8 +++ .../Implements/DevicePermissionService.cs | 63 ++++++++++--------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index b88bd079..9b35637b 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -29,4 +29,12 @@ public interface IDevicePermissionService : IScopeDependency /// /// Task GenerateDeviceTasksAsync(Func func, List userNos); + + + /// + /// 获取用户所有设备权限 + /// + /// + /// + Task> GetAssignDeviceCodesAsync(string userNo); } diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index e1f52e36..99c0f409 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -158,40 +158,12 @@ public class DevicePermissionService : IDevicePermissionService } - //************************************************ help methods ******************************************************* - - private async Task> GetPermissionUserNosAsync() - { - var permissions = await _dbContext.Queryable().ToListAsync(); - //User - var userNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.User).Select(x => x.AssignValue).ToList(); - - //Group - var groupCode = permissions.Where(x => x.AssignType == AssignTypeEnumType.Group).Select(x => Guid.Parse(x.AssignValue)).ToList(); - var userNosByGroup = await _dbContext.Queryable() - .Where(x => groupCode.Contains(x.GroupCode)) - .Select(x => x.UserNo) - .ToListAsync(); - - //Department - var departmentNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.Department).Select(x => x.AssignValue).ToList(); - var userNosByDepartment = await _dbContext.Queryable().Where(x => departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync(); - - //Tenant - var tenants = permissions.Where(x => x.AssignType == AssignTypeEnumType.Tenant).Select(x => x.AssignValue).ToList(); - var userNosByWerk = await _dbContext.Queryable().Where(x => tenants.Contains(x.Werks)).Select(x => x.No).ToListAsync(); - - - return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).ToList(); - } - - /// /// 获取用户所有设备权限 /// /// /// - private async Task> GetAssignDeviceCodesAsync(string userNo) + public async Task> GetAssignDeviceCodesAsync(string userNo) { var gainfo = await _dbContext.Queryable().Where(x => x.No == userNo).SingleAsync(); var gainfoGroups = await _dbContext.Queryable().Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToListAsync(); @@ -227,4 +199,37 @@ public class DevicePermissionService : IDevicePermissionService return deviceCodes.Distinct().ToList(); } + + + //************************************************ help methods ******************************************************* + + /// + /// 获取当前基地有权限的用户 + /// + /// + private async Task> GetPermissionUserNosAsync() + { + var permissions = await _dbContext.Queryable().ToListAsync(); + //User + var userNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.User).Select(x => x.AssignValue).ToList(); + + //Group + var groupCode = permissions.Where(x => x.AssignType == AssignTypeEnumType.Group).Select(x => Guid.Parse(x.AssignValue)).ToList(); + var userNosByGroup = await _dbContext.Queryable() + .Where(x => groupCode.Contains(x.GroupCode)) + .Select(x => x.UserNo) + .ToListAsync(); + + //Department + var departmentNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.Department).Select(x => x.AssignValue).ToList(); + var userNosByDepartment = await _dbContext.Queryable().Where(x => departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync(); + + //Tenant + var tenants = permissions.Where(x => x.AssignType == AssignTypeEnumType.Tenant).Select(x => x.AssignValue).ToList(); + var userNosByWerk = await _dbContext.Queryable().Where(x => tenants.Contains(x.Werks)).Select(x => x.No).ToListAsync(); + + + return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).ToList(); + } + } From a0384e51796015fe1f79e49a6b198ff250c4cc9c Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 16:48:03 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix=20=E6=97=A5=E5=BF=97=E7=BA=A7?= =?UTF-8?q?=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Canteen/appsettings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Src/Dlhis.Canteen/appsettings.json b/Src/Dlhis.Canteen/appsettings.json index 49e3558e..c244b003 100644 --- a/Src/Dlhis.Canteen/appsettings.json +++ b/Src/Dlhis.Canteen/appsettings.json @@ -45,8 +45,7 @@ "Override": { "System": "Warning", "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information", - "Microsoft.AspNetCore": "Debug" + "Microsoft.Hosting.Lifetime": "Information" } }, "WriteTo": [ From 01ec2740317b3fba6409cbc0ac52f686c6013625 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 16:53:41 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat=20=E6=A0=B9=E6=8D=AE=E5=B7=A5?= =?UTF-8?q?=E5=8F=B7=E8=8E=B7=E5=8F=96=E4=BA=BA=E8=84=B8=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Device/Controllers/DevicesController.cs | 12 ++++- .../Device/Response/DeviceResponse.cs | 11 ----- .../Device/Services/IDeviceService.cs | 2 + .../Services/Implements/DeviceService.cs | 5 +++ .../Controllers/GainfosController.cs | 11 +++++ .../Organization/Services/IGainfoService.cs | 2 + .../Services/Implements/GainfoService.cs | 45 ++++++++++++++++++- Src/Dlhis.Basic/appsettings.json | 4 ++ Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs | 13 ------ .../Device/Enums/DeviceFuncEnumType.cs | 12 +++-- .../Services/Implements/AssignmentService.cs | 2 +- 11 files changed, 88 insertions(+), 31 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs index 610f6768..19d92f35 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs @@ -145,8 +145,18 @@ public class DevicesController : ControllerBase /// /// [HttpGet] - public async Task> GetDeviceByNoAsync([FromQuery]DevicePageRequest request) + public async Task> GetDeviceByNoAsync([FromQuery] DevicePageRequest request) { return await _deviceService.GetDeviceByNoAsync(request); } + + /// + /// 获取考勤设备 + /// + /// + [HttpGet("attendances")] + public async Task> GetAttendanceDevicesAsync() + { + return await _deviceService.GetAttendanceDevicesAsync(); + } } diff --git a/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs index a36e18c7..628a35b4 100644 --- a/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs +++ b/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs @@ -74,17 +74,6 @@ public class DeviceResponse /// public string ConnectionInfo { get; set; } - /// - /// 最后使用人 - /// - public DateTime LastLogId { get; set; } - - /// - /// 最后使用日期 - /// - public DateTime LastLogDateTime { get; set; } - - /// /// 是否启用 /// diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceService.cs index d13e5dcb..930db433 100644 --- a/Src/Dlhis.Basic/Device/Services/IDeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDeviceService.cs @@ -13,4 +13,6 @@ public interface IDeviceService : IScopeDependency Task CheckExistsAsync(string deviceUniqueNo); Task> GetDeviceByNoAsync(DevicePageRequest request); + + Task> GetAttendanceDevicesAsync(); } diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs index dc5f4e37..bdf243c1 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs @@ -164,5 +164,10 @@ public class DeviceService : IDeviceService return page; } + + public Task> GetAttendanceDevicesAsync() + { + throw new NotImplementedException(); + } } diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs index 7c9fac1b..56b26d43 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs @@ -112,5 +112,16 @@ public class GainfosController : ControllerBase { return await _gainfoService.GetFaceAsync(token); } + + /// + /// 获取人脸照片 + /// + /// + /// + [HttpGet("face/{userCode}")] + public async Task GetFaceByUserCodeAsync(string userCode) + { + return await _gainfoService.GetFaceByUserCodeAsync(userCode); + } } diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs index 43c71e75..77e812c1 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs @@ -22,4 +22,6 @@ public interface IGainfoService : IScopeDependency Task UploadFaceAsync(GainfoUploadFaceRequest request); Task GetFaceAsync(string token); + + Task GetFaceByUserCodeAsync(string userCode); } diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs index bb7fb4eb..2c67f1e6 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs @@ -1,4 +1,5 @@ -using Dlhis.Basic.Organization.Request; +using System.Threading.Tasks; +using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; @@ -13,6 +14,8 @@ using Kurisu.SqlSugar.Services; using Mapster; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using NetTaste; namespace Dlhis.Basic.Organization.Services.Implements; @@ -266,4 +269,44 @@ public class GainfoService : IGainfoService } }); } + + public async Task GetFaceByUserCodeAsync(string userCode) + { + var gainfo = await _dbContext.Queryable().Where(x => x.Code == userCode).SingleAsync(); + gainfo.ThrowIfNull("人员信息不存在"); + + return await Scoped.Request.Value.CreateAsync(async (sp) => + { + var configuration = sp.GetService(); + + var faceConnectionString = configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value; + if (faceConnectionString.IsEmpty()) + { + throw new UserFriendlyException("暂不支持获取人脸"); + } + + var dbContext = sp.GetService(); + //todo 切换连接字符串 + dbContext.Client.CurrentConnectionConfig.ConnectionString = faceConnectionString; + + var face = await dbContext.Queryable() + .Where(x => x.UserCode == userCode) + .SingleAsync(); + + face.ThrowIfNull("人脸照片尚未录入"); + + var timeLimitedDataProtector = sp.GetService() + .CreateProtector("down:face") + .ToTimeLimitedDataProtector(); + + var faceUrl = configuration.GetSection("FaceUrlOptions:Url").Value; + var limit = configuration.GetSection("FaceUrlOptions:Limit").Get(); + var dataProtectionProvider = sp.GetService(); + + var key = $"face:{userCode}"; + var token = timeLimitedDataProtector.Protect(key, TimeSpan.FromSeconds(limit)); + + return faceUrl + token; + }); + } } diff --git a/Src/Dlhis.Basic/appsettings.json b/Src/Dlhis.Basic/appsettings.json index 75960c44..d48a4890 100644 --- a/Src/Dlhis.Basic/appsettings.json +++ b/Src/Dlhis.Basic/appsettings.json @@ -10,6 +10,10 @@ "CommonRequestUrl": "http://common", "UserRequestUrl": "http://user" }, + "FaceUrlOptions": { + "Url": "https://yikatong.isawesome.cn/api/basic/gainfos/face?token=", + "Limit": 7200 + }, "SqlSugarOptions": { "DefaultConnectionString": "server=192.168.199.124;port=3306;userid=root;password=dlhis123;database=yikatong;charset=utf8mb4;", "SlaveConnectionString": [], diff --git a/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs b/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs index 529fdb59..90e508fe 100644 --- a/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs +++ b/Src/Dlhis.Entity/Basic/Entity/DeviceEntity.cs @@ -77,19 +77,6 @@ public class DeviceEntity : SugarBaseEntity, ITenantId [SugarColumn(ColumnDescription = "连接信息")] public string ConnectionInfo { get; set; } - /// - /// 最后使用人 - /// - [SugarColumn(IsNullable = true, ColumnDescription = "最后使用人")] - public DateTime? LastLogId { get; set; } - - /// - /// 最后使用日期 - /// - [SugarColumn(IsNullable = true, ColumnDescription = "最后使用日期")] - public DateTime? LastLogDateTime { get; set; } - - /// /// 是否启用 /// diff --git a/Src/Dlhis.Entity/Device/Enums/DeviceFuncEnumType.cs b/Src/Dlhis.Entity/Device/Enums/DeviceFuncEnumType.cs index 2d6a2f10..ac475816 100644 --- a/Src/Dlhis.Entity/Device/Enums/DeviceFuncEnumType.cs +++ b/Src/Dlhis.Entity/Device/Enums/DeviceFuncEnumType.cs @@ -3,9 +3,9 @@ namespace Dlhis.Entity.Device.Enums; /// -/// 机器设备功能 +/// 设备功能 /// -[Description("机器设备功能")] +[Description("设备功能")] public enum DeviceFuncEnumType { /// @@ -26,14 +26,12 @@ public enum DeviceFuncEnumType [Description("人脸")] Face, - /// /// 刷卡 /// [Description("刷卡")] Card, - /// /// 二维码 /// @@ -46,4 +44,10 @@ public enum DeviceFuncEnumType /// [Description("布控")] Control, + + /// + /// 考勤 + /// + [Description("考勤")] + Attendance, } diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs index 8b8bd91d..e49d24f0 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs @@ -169,7 +169,7 @@ public class AssignmentService : IAssignmentService return Scoped.Request.Value.Create((sp) => { - FaceUrlOptions faceUrlOptions = sp.GetService>().Value; + var faceUrlOptions = sp.GetService>().Value; var dataProtectionProvider = sp.GetService(); var timeLimitedDataProtector = dataProtectionProvider From b8364815ac96200f1acd8976583f21639bb76453 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 17:37:21 +0800 Subject: [PATCH 07/10] =?UTF-8?q?feat=20=E8=8E=B7=E5=8F=96=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Device/Services/Implements/DeviceService.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs index bdf243c1..92d90627 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs @@ -2,6 +2,7 @@ using Dlhis.Basic.Device.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.UnifyResultAndValidation; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; @@ -154,7 +155,7 @@ public class DeviceService : IDeviceService public async Task> GetDeviceByNoAsync(DevicePageRequest request) { var page = await _dbContext.Queryable() - .Where(x=>x.UniqueNo == request.UniqueNo) + .Where(x => x.UniqueNo == request.UniqueNo) .Select(device => new DeviceResponse { FuncsStr = device.Funcs.ToString() @@ -165,9 +166,17 @@ public class DeviceService : IDeviceService return page; } - public Task> GetAttendanceDevicesAsync() + public async Task> GetAttendanceDevicesAsync() { - throw new NotImplementedException(); + var devices = await _dbContext.Queryable() + .Where(x => x.Enable) + .Select(x => new DeviceResponse + { + FuncsStr = x.Funcs.ToString() + }, true) + .ToListAsync(); + + return devices.Where(x => x.Funcs.Contains(DeviceFuncEnumType.Attendance)).ToList(); } } From 6cd7f63b9802bb1bde88ee7f85888bf159023508 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 15 Jan 2024 17:56:34 +0800 Subject: [PATCH 08/10] =?UTF-8?q?fix=20=E6=9F=A5=E8=AF=A2=E6=B1=87?= =?UTF-8?q?=E6=80=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/Services/Implements/BalanceService.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index 7348a454..b09670d2 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -131,8 +131,14 @@ public class BalanceService : IBalanceService CostDateTime = record.CostDateTime }).ToPageListAsync(request); + //消费总金额 + var sum = await _dbContext.Queryable() + .WhereIF(request.SearchDate.HasValue, record => record.CostDate >= start) + .WhereIF(request.SearchDate.HasValue, record => record.CostDate <= end) + .Where(record => record.TenantId == device.TenantId || (record.DeviceInfo == device.Code.ToString() || record.DeviceInfo == device.UniqueNo)) + .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) + .SumAsync(record => SqlFunc.Abs(SqlFunc.IsNull(record.Amount, 0))); - var sum = page.Data.Sum(x => Math.Abs(x.Amount)); page.Data.ForEach(x => x.Sum = sum); return page; From 6ba39eabc144241f9979f3fb8d884e7bb78e71d4 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 16 Jan 2024 11:10:24 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix=20=E8=BF=94=E5=9B=9Eid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs index c53fdec5..f7f397b4 100644 --- a/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs +++ b/Src/Dlhis.Basic/Organization/Response/GainfoGroupResponse.cs @@ -2,6 +2,8 @@ public class GainfoGroupResponse { + public long Id { get; set; } + /// /// 分组code /// From d65ac0912d4ae145d7dcd9b5f5fb6b90771fa414 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 16 Jan 2024 12:04:48 +0800 Subject: [PATCH 10/10] =?UTF-8?q?fix=20=E5=9B=9E=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=8C=BA=E9=97=B4=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index b09670d2..e91ac5cc 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -79,7 +79,7 @@ public class BalanceService : IBalanceService { now = request.SearchDate.Value; start = new DateTime(now.Year, now.Month, now.Day); - end = new DateTime(now.Year, now.Month, now.Day + 1); + end = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59); } var device = await _dbContext.Queryable()