From dea3361a936c554507dcd894654531c5f7edf9a2 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 24 Apr 2024 22:16:20 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix=20=E8=8F=9C=E5=8D=95=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=80=92=E5=BD=92=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Menu/Services/Implements/MenuService.cs | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs index 78dea3b9..6092f066 100644 --- a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs +++ b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs @@ -78,7 +78,6 @@ public class MenuService : IMenuService Code = x, UniqueType = request.UniqueType, UniqueValue = request.UniqueValue - }).ToList(); await _dbContext.InsertAsync(permissions); @@ -87,48 +86,34 @@ public class MenuService : IMenuService public async Task> GetAssignmentCodesAsync(AssignTypeEnumType uniqueType, string uniqueData) { var permissionCodes = await _dbContext.Queryable() - .Where(x => x.UniqueType == uniqueType) - .Where(x => x.UniqueValue == uniqueData) - .Select(x => x.Code) - .ToListAsync(); + .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)); - } + RecursionHandler(menu, permissionCodes, permissionCodes.Contains(menu.Code)); } return permissionCodes; - static List RecursionHandler(List menus, List innerPermissions) + static bool RecursionHandler(MenuResponse current, List innerPermissions, bool add) { - 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 (add) innerPermissions.Add(current.Code); - if (!innerPermissions.Contains(menu.Code)) + foreach (var menu in current.Items) + { + var currentAdd = RecursionHandler(menu, innerPermissions, add || innerPermissions.Contains(menu.Code)); + if (currentAdd && !innerPermissions.Contains(current.Code)) { - foreach (var item in menu.Items.Select(x => x.Code)) - { - codes.Add(item); - } + innerPermissions.Add(current.Code); } } - return codes.ToList(); + return add; } } @@ -150,6 +135,7 @@ public class MenuService : IMenuService { return await GetListAsync(PlatformEnumType.PCAdmin); } + return new List(); } @@ -229,7 +215,6 @@ public class MenuService : IMenuService private async Task CheckAsync(SaveMenuRequest request) { - //检查重复code var exists = await _dbContext.Queryable() .Where(x => x.Code == request.Code) From f112ef31608f1a9dc75686baeee3085799f28661 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 24 Apr 2024 22:32:26 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix=20=E6=9D=83=E9=99=90=E9=80=92?= =?UTF-8?q?=E5=BD=92=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Menu/Services/Implements/MenuService.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs index 6092f066..130efa5d 100644 --- a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs +++ b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs @@ -119,8 +119,21 @@ public class MenuService : IMenuService public async Task> GetAllAssignmentPermissionsAsync() { - var all = await GetAllAssignmentCodesAsync(); - return await _dbContext.Queryable().Where(x => all.Contains(x.Code)).Select(x => x.Permission).ToListAsync(); + var menus = await GetCurrentMenusAsync(); + return GetPermissions(menus).ToList(); + + IEnumerable GetPermissions(List innerMenuResponses) + { + foreach (var item in innerMenuResponses) + { + yield return item.Permission; + + foreach (var item1 in GetPermissions(item.Items)) + { + yield return item1; + } + } + } } public async Task> GetCurrentMenusAsync() From 62596ee61d1c4f6ff63f57ea8dd88cd1ada98785 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 24 Apr 2024 22:16:20 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix=20=E8=8F=9C=E5=8D=95=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=80=92=E5=BD=92=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Menu/Services/Implements/MenuService.cs | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs index 78dea3b9..6092f066 100644 --- a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs +++ b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs @@ -78,7 +78,6 @@ public class MenuService : IMenuService Code = x, UniqueType = request.UniqueType, UniqueValue = request.UniqueValue - }).ToList(); await _dbContext.InsertAsync(permissions); @@ -87,48 +86,34 @@ public class MenuService : IMenuService public async Task> GetAssignmentCodesAsync(AssignTypeEnumType uniqueType, string uniqueData) { var permissionCodes = await _dbContext.Queryable() - .Where(x => x.UniqueType == uniqueType) - .Where(x => x.UniqueValue == uniqueData) - .Select(x => x.Code) - .ToListAsync(); + .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)); - } + RecursionHandler(menu, permissionCodes, permissionCodes.Contains(menu.Code)); } return permissionCodes; - static List RecursionHandler(List menus, List innerPermissions) + static bool RecursionHandler(MenuResponse current, List innerPermissions, bool add) { - 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 (add) innerPermissions.Add(current.Code); - if (!innerPermissions.Contains(menu.Code)) + foreach (var menu in current.Items) + { + var currentAdd = RecursionHandler(menu, innerPermissions, add || innerPermissions.Contains(menu.Code)); + if (currentAdd && !innerPermissions.Contains(current.Code)) { - foreach (var item in menu.Items.Select(x => x.Code)) - { - codes.Add(item); - } + innerPermissions.Add(current.Code); } } - return codes.ToList(); + return add; } } @@ -150,6 +135,7 @@ public class MenuService : IMenuService { return await GetListAsync(PlatformEnumType.PCAdmin); } + return new List(); } @@ -229,7 +215,6 @@ public class MenuService : IMenuService private async Task CheckAsync(SaveMenuRequest request) { - //检查重复code var exists = await _dbContext.Queryable() .Where(x => x.Code == request.Code) From 2c17f38c5efcebd535913be837d557c50ea4d308 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 24 Apr 2024 22:32:26 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix=20=E6=9D=83=E9=99=90=E9=80=92?= =?UTF-8?q?=E5=BD=92=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Menu/Services/Implements/MenuService.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs index 6092f066..130efa5d 100644 --- a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs +++ b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs @@ -119,8 +119,21 @@ public class MenuService : IMenuService public async Task> GetAllAssignmentPermissionsAsync() { - var all = await GetAllAssignmentCodesAsync(); - return await _dbContext.Queryable().Where(x => all.Contains(x.Code)).Select(x => x.Permission).ToListAsync(); + var menus = await GetCurrentMenusAsync(); + return GetPermissions(menus).ToList(); + + IEnumerable GetPermissions(List innerMenuResponses) + { + foreach (var item in innerMenuResponses) + { + yield return item.Permission; + + foreach (var item1 in GetPermissions(item.Items)) + { + yield return item1; + } + } + } } public async Task> GetCurrentMenusAsync() From 74843a1677b79de4a9f67426a54c40833004fa1c Mon Sep 17 00:00:00 2001 From: liguoyang Date: Sun, 28 Apr 2024 11:11:04 +0800 Subject: [PATCH 05/10] =?UTF-8?q?feat=20=E7=94=A8=E6=88=B7=E5=9F=BA?= =?UTF-8?q?=E5=9C=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UserTenantsController.cs | 42 +++++++++++++++++++ .../Identity/Request/UserTenantSaveRequest.cs | 9 ++++ .../Identity/Response/UserTenantResponse.cs | 6 +++ .../Identity/Services/IUserTenantService.cs | 11 +++++ .../Services/Implements/UserTenantService.cs | 40 ++++++++++++++++++ 5 files changed, 108 insertions(+) create mode 100644 Src/Dlhis.Sys/Identity/Controllers/UserTenantsController.cs create mode 100644 Src/Dlhis.Sys/Identity/Request/UserTenantSaveRequest.cs create mode 100644 Src/Dlhis.Sys/Identity/Response/UserTenantResponse.cs create mode 100644 Src/Dlhis.Sys/Identity/Services/IUserTenantService.cs create mode 100644 Src/Dlhis.Sys/Identity/Services/Implements/UserTenantService.cs diff --git a/Src/Dlhis.Sys/Identity/Controllers/UserTenantsController.cs b/Src/Dlhis.Sys/Identity/Controllers/UserTenantsController.cs new file mode 100644 index 00000000..60559162 --- /dev/null +++ b/Src/Dlhis.Sys/Identity/Controllers/UserTenantsController.cs @@ -0,0 +1,42 @@ +using Dlhis.Sys.Identity.Request; +using Dlhis.Sys.Identity.Response; +using Dlhis.Sys.Identity.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Sys.Identity.Controllers; + +[Authorize(Roles = "admin")] +[Route("api/[controller]")] +[ApiController] +public class UserTenantsController : ControllerBase +{ + private readonly IUserTenantService _userTenantService; + + public UserTenantsController(IUserTenantService userTenantService) + { + _userTenantService = userTenantService; + } + + + /// + /// 获取用户的基地配置 + /// + /// + /// + [HttpGet] + public async Task> GetUserTenantsByIdAsync(int userId) + { + return await _userTenantService.GetUserTenantsByIdAsync(userId); + } + + /// + /// 保存 + /// + /// + [HttpPost("save")] + public async Task SaveUserTenantsAsync(UserTenantSaveRequest request) + { + await _userTenantService.SaveUserTenantsAsync(request); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/Identity/Request/UserTenantSaveRequest.cs b/Src/Dlhis.Sys/Identity/Request/UserTenantSaveRequest.cs new file mode 100644 index 00000000..2df4d8c5 --- /dev/null +++ b/Src/Dlhis.Sys/Identity/Request/UserTenantSaveRequest.cs @@ -0,0 +1,9 @@ +namespace Dlhis.Sys.Identity.Request +{ + public class UserTenantSaveRequest + { + public int UserId { get; set; } + + public List TenantCodes { get; set; } = new(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/Identity/Response/UserTenantResponse.cs b/Src/Dlhis.Sys/Identity/Response/UserTenantResponse.cs new file mode 100644 index 00000000..3b39d8d7 --- /dev/null +++ b/Src/Dlhis.Sys/Identity/Response/UserTenantResponse.cs @@ -0,0 +1,6 @@ +namespace Dlhis.Sys.Identity.Response; + +public class UserTenantResponse +{ + public string Code { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/Identity/Services/IUserTenantService.cs b/Src/Dlhis.Sys/Identity/Services/IUserTenantService.cs new file mode 100644 index 00000000..6cb1dc21 --- /dev/null +++ b/Src/Dlhis.Sys/Identity/Services/IUserTenantService.cs @@ -0,0 +1,11 @@ +using Dlhis.Sys.Identity.Request; +using Dlhis.Sys.Identity.Response; + +namespace Dlhis.Sys.Identity.Services; + +public interface IUserTenantService : IScopeDependency +{ + Task> GetUserTenantsByIdAsync(int id); + + Task SaveUserTenantsAsync(UserTenantSaveRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Sys/Identity/Services/Implements/UserTenantService.cs b/Src/Dlhis.Sys/Identity/Services/Implements/UserTenantService.cs new file mode 100644 index 00000000..6dbaffe5 --- /dev/null +++ b/Src/Dlhis.Sys/Identity/Services/Implements/UserTenantService.cs @@ -0,0 +1,40 @@ +using Dlhis.Entity.Sys.Entities; +using Dlhis.Sys.Identity.Request; +using Dlhis.Sys.Identity.Response; +using Kurisu.SqlSugar.Services; + +namespace Dlhis.Sys.Identity.Services.Implements; + +public class UserTenantService : IUserTenantService +{ + private readonly IDbContext _dbContext; + + public UserTenantService(IDbContext dbContext) + { + _dbContext = dbContext.ChangeDb("identity"); + } + + public async Task> GetUserTenantsByIdAsync(int id) + { + return await _dbContext.Queryable() + .Where(x => x.UserId == id) + .Select(x => new UserTenantResponse + { + Code = x.TenantCode + }) + .ToListAsync(); + } + + public async Task SaveUserTenantsAsync(UserTenantSaveRequest request) + { + var userTenants = await _dbContext.Queryable().Where(x => x.UserId == request.UserId).ToListAsync(); + await _dbContext.DeleteReallyAsync(userTenants); + + await _dbContext.InsertAsync(request.TenantCodes.Select(x => new UserTenantEntity + { + UserId = request.UserId, + TenantCode = x + }) + .ToList()); + } +} \ No newline at end of file From 339236c79fcc03bbe5ae86262b39793498c4024a Mon Sep 17 00:00:00 2001 From: liguoyang Date: Sun, 28 Apr 2024 11:16:23 +0800 Subject: [PATCH 06/10] =?UTF-8?q?fix=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{IDisheMenuApi.cs => IDishesMenuApi.cs} | 2 +- .../DevicePermissionsController.cs | 11 -- .../Device/Request/AssigmentByCodeRequest.cs | 15 -- .../Response/AssigmentByCodeResponse.cs | 17 --- .../Services/IDevicePermissionService.cs | 11 +- .../Implements/DevicePermissionService.cs | 87 +----------- .../Implements/BookingOrderService.cs | 130 +++++++++--------- 7 files changed, 72 insertions(+), 201 deletions(-) rename Src/Dlhis.Basic.Api/{IDisheMenuApi.cs => IDishesMenuApi.cs} (95%) delete mode 100644 Src/Dlhis.Basic/Device/Request/AssigmentByCodeRequest.cs delete mode 100644 Src/Dlhis.Basic/Device/Response/AssigmentByCodeResponse.cs diff --git a/Src/Dlhis.Basic.Api/IDisheMenuApi.cs b/Src/Dlhis.Basic.Api/IDishesMenuApi.cs similarity index 95% rename from Src/Dlhis.Basic.Api/IDisheMenuApi.cs rename to Src/Dlhis.Basic.Api/IDishesMenuApi.cs index 96b649da..20b31c99 100644 --- a/Src/Dlhis.Basic.Api/IDisheMenuApi.cs +++ b/Src/Dlhis.Basic.Api/IDishesMenuApi.cs @@ -5,7 +5,7 @@ using Kurisu.RemoteCall.Attributes; namespace Dlhis.Basic.Api; [EnableRemoteClient(Name = "basic-service", BaseUrl = "${InternalRequest:BasicRequestUrl}")] -public interface IDisheMenuApi +public interface IDishesMenuApi { /// /// diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 05ac0ff5..8606dc88 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -45,17 +45,6 @@ public class DevicePermissionsController : ControllerBase return await _devicePermissionService.GetAssignmentsAsync(request.UniqueType, request.AssignType, request.AssignValue); } - /// - /// 获取用户权限设备 - /// - /// - /// - [HttpGet("assignmentsbyno")] - public async Task> GetAssigmentByCodeAsync([FromQuery] AssigmentByCodeRequest request) - { - return await _devicePermissionService.GetAssigmentByCodeAsync(request); - } - /// /// 获取就餐设备唯一号权限 diff --git a/Src/Dlhis.Basic/Device/Request/AssigmentByCodeRequest.cs b/Src/Dlhis.Basic/Device/Request/AssigmentByCodeRequest.cs deleted file mode 100644 index 4430c371..00000000 --- a/Src/Dlhis.Basic/Device/Request/AssigmentByCodeRequest.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Kurisu.Core.DataAccess.Dto; -using SqlSugar; -using System.ComponentModel.DataAnnotations; - -namespace Dlhis.Basic.Device.Request -{ - public class AssigmentByCodeRequest : PageDto - { - /// - /// 档案号 - /// - [Required] - public string No { get; set; } - } -} diff --git a/Src/Dlhis.Basic/Device/Response/AssigmentByCodeResponse.cs b/Src/Dlhis.Basic/Device/Response/AssigmentByCodeResponse.cs deleted file mode 100644 index d6420096..00000000 --- a/Src/Dlhis.Basic/Device/Response/AssigmentByCodeResponse.cs +++ /dev/null @@ -1,17 +0,0 @@ -using SqlSugar; - -namespace Dlhis.Basic.Device.Response -{ - public class AssigmentByCodeResponse - { - /// - /// 设备唯一码,IP/MAC/SNO - /// - public string UniqueNo { get; set; } - - /// - /// 设备名称 - /// - public string UniqueName { get; set; } - } -} diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 245c2b90..547e591f 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -42,8 +42,7 @@ public interface IDevicePermissionService : IScopeDependency /// /// Task GenerateDeviceTasksAsync(string userNo, DeviceTaskEnumType taskType); - - + /// /// 获取用户所有设备权限 /// @@ -59,14 +58,6 @@ public interface IDevicePermissionService : IScopeDependency /// Task> GetCanteenDeviceUniqueNosByUserNoAsync(string userNo); - /// - /// 获取用户权限设备 - /// - /// - /// - Task> GetAssigmentByCodeAsync(AssigmentByCodeRequest request); - - Task GetPermissionUsersInfoAsync(List userNos); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 808eb322..7a36922d 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -318,79 +318,6 @@ public class DevicePermissionService : IDevicePermissionService return result.SelectMany(x => x.Codes).ToList(); } - - /// - /// 获取用户权限设备 - /// - /// - /// - public async Task> GetAssigmentByCodeAsync(AssigmentByCodeRequest request) - { - var lst1 = new List(); - //所有设备guid - var gds = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, request.No); - if (gds != null && gds.Count > 0) - { - lst1.AddRange(gds); - } - - //所有设备组guid - var ggs = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, request.No); - - //所有营业点guid - var gps = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.User, request.No); - - var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); - var regiss = await _dbContext.Queryable().ToListAsync(); - - if (ggs != null && ggs.Count > 0) - { - foreach (var gid in ggs) - { - var ds = await _dbContext.Queryable() - .Where(x => x.GroupCode == gid) - .Select(x => x.DeviceCode) - .ToListAsync(); - lst1.AddRange(ds); - } - } - if (gps != null && gps.Count > 0) - { - foreach (var placeCode in gps) - { - var nos = regiss.Where(x => x.BusinessPlaceCode == placeCode) - .Select(x => x.DeviceUniqueNo).ToList(); - - var dcodes = devices.Where(d => nos.Contains(d.UniqueNo)) - .Select(d => d.Code).ToList(); - lst1.AddRange(dcodes); - } - } - - var dds = lst1.Distinct().ToList(); - var lst = devices.Where(x => dds.Contains(x.Code)) - .Select(x => new AssigmentByCodeResponse - { - UniqueNo = x.UniqueNo, - UniqueName = x.Supplier - }).ToList(); - - // 分页操作 - var startIndex = (request.PageIndex - 1) * request.PageSize; - var pagedData = lst.Skip(startIndex).Take(request.PageSize).ToList(); - - var pagination = new Pagination - { - PageIndex = request.PageIndex, - PageSize = request.PageSize, - Total = lst.Count, // 使用原始列表的总数进行分页 - Data = pagedData - }; - - return pagination; - - } - //************************************************ help methods ******************************************************* /// @@ -440,7 +367,7 @@ public class DevicePermissionService : IDevicePermissionService var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList(); tops.ForEach(x => { - RecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(x => x.Codes).Contains(x.Code)); + RecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(item => item.Codes).Contains(x.Code)); }); } @@ -471,8 +398,8 @@ public class DevicePermissionService : IDevicePermissionService private async Task>> GetAssignDeviceCodesInternalAsync(List userNos) { - var deivces = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); - var deviceUniqueNos = deivces.Select(x => x.UniqueNo).ToList(); + var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); + var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); var registries = await _dbContext.Queryable() .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) .Where(x => !SqlFunc.IsNullOrEmpty(x.BusinessPlaceCode)) @@ -493,7 +420,7 @@ public class DevicePermissionService : IDevicePermissionService foreach (var gainfo in gainfos) { - var codes = GetAssignDeviceCodesInternal(gainfo, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, deivces); + var codes = GetAssignDeviceCodesInternal(gainfo, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices); result.Add(gainfo.No, codes); } @@ -558,14 +485,14 @@ public class DevicePermissionService : IDevicePermissionService var deviceGroupCodes = deviceGroupDtos.SelectMany(x => x.Codes).Distinct().ToList(); var businessPlaceCodes = businessPlaceDtos.SelectMany(x => x.Codes).Distinct().ToList(); - var deveiceCodesByGroup = deviceGroupRelationships.Where(x => deviceGroupCodes.Contains(x.GroupCode)).GroupBy(x => x.TenantId) + var deviceCodesByGroup = deviceGroupRelationships.Where(x => deviceGroupCodes.Contains(x.GroupCode)).GroupBy(x => x.TenantId) .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(item => item.DeviceCode).Distinct().ToList() }); - var placeGroup = deviceRegistries.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode.Value)).GroupBy(x => x.TenantId) + var placeGroup = deviceRegistries.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode!.Value)).GroupBy(x => x.TenantId) .Select(x => { var currentDeviceUniqueNos = x.Select(item => item.DeviceUniqueNo).ToList(); @@ -578,7 +505,7 @@ public class DevicePermissionService : IDevicePermissionService }) .ToList(); - deviceDtos.AddRange(deveiceCodesByGroup); + deviceDtos.AddRange(deviceCodesByGroup); deviceDtos.AddRange(placeGroup); return deviceDtos.GroupBy(x => x.Tenant).Select(x => new UserTenantDeviceCodeDto diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs index 6b963f16..e9727865 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs @@ -19,16 +19,16 @@ namespace Dlhis.Canteen.Order.Services.Implements; public class BookingOrderService : BaseOrderService, IBookingOrderService { - private readonly IDisheMenuApi _disheMenuApi; + private readonly IDishesMenuApi _dishesMenuApi; private readonly IBusinessPlacePermissionsApi _businessPlacePermissionsApi; public BookingOrderService(ICanteenSettingService canteenSettingService, IDbContext dbContext, - IDisheMenuApi disheMenuApi, + IDishesMenuApi dishesMenuApi, IBusinessPlacePermissionsApi businessPlacePermissionsApi, ICurrentUser currentUser, IDevicePermissionApi devicePermissionApi, ILogger logger) : base(canteenSettingService, dbContext, currentUser, devicePermissionApi, logger) { - _disheMenuApi = disheMenuApi; + _dishesMenuApi = dishesMenuApi; _businessPlacePermissionsApi = businessPlacePermissionsApi; } @@ -46,7 +46,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService (now >= dealLine).ThrowIfTrue("超出订餐时间"); //菜单存在 - var menuDetailResult = await _disheMenuApi.GetBookingDishesDetailAsync(request.BookingDate, request.BusinessPlaceCode, (int)request.ShiftType, request.DishesCode); + var menuDetailResult = await _dishesMenuApi.GetBookingDishesDetailAsync(request.BookingDate, request.BusinessPlaceCode, (int)request.ShiftType, request.DishesCode); var menuDetail = menuDetailResult.Data; menuDetail.ThrowIfNull("预定失败,菜品已经下架"); @@ -75,7 +75,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService IsOffline = false, IsCostCrossTenant = await GetSettingAsync(businessPlace.TenantId, CanteenSettingItemEnumType.AllowCrossTenant), - OriginTenantId = gainfo.Factory,//人员可能跨基地消费 + OriginTenantId = gainfo.Factory, //人员可能跨基地消费 Status = BalanceRecordStatusEnumType.Valid, OrderStatus = CanteenOrderStatusEnumType.Success, @@ -89,8 +89,8 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService var orderId = await DbContext.InsertReturnIdentityAsync(order); await CommonHelper.RetryAsync(async () => { - await _disheMenuApi.GetBookingDishesDetailAsync(request.BookingDate, request.BusinessPlaceCode, (int)request.ShiftType, request.DishesCode); - var menuDetail = menuDetailResult.Data; + await _dishesMenuApi.GetBookingDishesDetailAsync(request.BookingDate, request.BusinessPlaceCode, (int)request.ShiftType, request.DishesCode); + menuDetail = menuDetailResult.Data; menuDetail.ThrowIfNull("预定失败,菜品已经下架"); menuDetail.Number -= request.Number; @@ -107,24 +107,24 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService (mealInfo.Balance < 0).ThrowIfTrue("余额不足,无法消费"); await DbContext.Updateable() - .SetColumns(x => x.Balance == mealInfo.Balance) - .SetColumns(x => x.Version == x.Version + 1) - .SetColumns(x => x.ModifiedTime == DateTime.Now) - .Where(x => x.UserNo == order.UserNo && x.Version == mealInfo.Version)//必须与查询时的version一致 - .ExecuteCommandThrowVersionAsync(); + .SetColumns(x => x.Balance == mealInfo.Balance) + .SetColumns(x => x.Version == x.Version + 1) + .SetColumns(x => x.ModifiedTime == DateTime.Now) + .Where(x => x.UserNo == order.UserNo && x.Version == mealInfo.Version) //必须与查询时的version一致 + .ExecuteCommandThrowVersionAsync(); } await DbContext.Updateable() - .SetColumns(x => x.Number == menuDetail.Number) - .SetColumns(x => x.Version == x.Version + 1) - .SetColumns(x => x.ModifiedTime == now) - .Where(x => x.StartDate <= menuDetail.Date && menuDetail.Date <= x.EndDate - && x.ShiftType == request.ShiftType - && x.BusinessPlaceCode == request.BusinessPlaceCode - && x.DishesCode == request.DishesCode - && x.Version == menuDetail.Version - ) - .ExecuteCommandThrowVersionAsync(); + .SetColumns(x => x.Number == menuDetail.Number) + .SetColumns(x => x.Version == x.Version + 1) + .SetColumns(x => x.ModifiedTime == now) + .Where(x => x.StartDate <= menuDetail.Date && menuDetail.Date <= x.EndDate + && x.ShiftType == request.ShiftType + && x.BusinessPlaceCode == request.BusinessPlaceCode + && x.DishesCode == request.DishesCode + && x.Version == menuDetail.Version + ) + .ExecuteCommandThrowVersionAsync(); //写入记录 var balanceRecord = order.Adapt(); @@ -140,7 +140,6 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService Number = request.Number, TenantId = order.TenantId, }); - }, 10); @@ -159,52 +158,51 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService var myCodes = (await _businessPlacePermissionsApi.GetMyAsync()).Data.Select(x => (Guid?)x.Code).ToList(); var page = await DbContext.Queryable() - .LeftJoin((x, ga) => x.UserNo == ga.No) - .LeftJoin((x, ga, dept) => dept.No == ga.DepartmentNo) - .Where(x => myCodes.Contains(x.BusinessPlaceCode)) - .WhereIF(request.OrderStatus.HasValue, x => x.OrderStatus == request.OrderStatus) - .WhereIF(request.Source.HasValue, x => x.Source == request.Source) - .WhereIF(request.Search.IsPresent(), (x, ga) => x.UserCode == request.Search || ga.Name.Contains(request.Search)) - .WhereIF(request.BookingPeriod?.Start.HasValue == true && request.BookingPeriod?.End.HasValue == true, x => + .LeftJoin((x, ga) => x.UserNo == ga.No) + .LeftJoin((x, ga, dept) => dept.No == ga.DepartmentNo) + .Where(x => myCodes.Contains(x.BusinessPlaceCode)) + .WhereIF(request.OrderStatus.HasValue, x => x.OrderStatus == request.OrderStatus) + .WhereIF(request.Source.HasValue, x => x.Source == request.Source) + .WhereIF(request.Search.IsPresent(), (x, ga) => x.UserCode == request.Search || ga.Name.Contains(request.Search)) + .WhereIF(request.BookingPeriod?.Start.HasValue == true && request.BookingPeriod?.End.HasValue == true, x => SqlFunc.Subqueryable() - .Where(p => p.OrderNo == x.No) - .Where(p => p.BookingDate >= request.BookingPeriod.Start) - .Where(p => p.BookingDate <= request.BookingPeriod.End) - .Any() - ) - .WhereIF(request.ShiftTpe.HasValue, x => x.ShiftType == request.ShiftTpe) - .Select((x, ga, dept) => new OrderBookingResponse - { - No = x.No, - DeliveryAddress = x.DeliveryAddress, - Remark = x.Remark, - Amount = SqlFunc.Abs(x.Amount), - CreateTime = x.CreateTime, - ShiftType = x.ShiftType, - Status = x.OrderStatus, - UserCode = x.UserCode, - UserName = ga.Name, - Source = x.Source, - DepartmentName = dept.Name, - }) - .ToPageListAsync(request); + .Where(p => p.OrderNo == x.No) + .Where(p => p.BookingDate >= request.BookingPeriod.Start) + .Where(p => p.BookingDate <= request.BookingPeriod.End) + .Any() + ) + .WhereIF(request.ShiftTpe.HasValue, x => x.ShiftType == request.ShiftTpe) + .Select((x, ga, dept) => new OrderBookingResponse + { + No = x.No, + DeliveryAddress = x.DeliveryAddress, + Remark = x.Remark, + Amount = SqlFunc.Abs(x.Amount), + CreateTime = x.CreateTime, + ShiftType = x.ShiftType, + Status = x.OrderStatus, + UserCode = x.UserCode, + UserName = ga.Name, + Source = x.Source, + DepartmentName = dept.Name, + }) + .ToPageListAsync(request); var nos = page.Data.Select(x => x.No).ToList(); var details = await DbContext.Queryable() .LeftJoin((x, dishes) => x.DishesCode == dishes.CustomCode) .Where(x => nos.Contains(x.OrderNo)) - .Select((x, dishes) => new { x.OrderNo, x.BookingDate, x.Number, dishes.Name }). - ToListAsync(); + .Select((x, dishes) => new { x.OrderNo, x.BookingDate, x.Number, dishes.Name }).ToListAsync(); page.Data.ForEach(x => { - x.BookingDate = details.FirstOrDefault(item => item.OrderNo == x.No).BookingDate; + x.BookingDate = details.First(item => item.OrderNo == x.No).BookingDate; x.TotalNumber = details.Where(item => item.OrderNo == x.No).Sum(item => item.Number); x.DishesInfos = details.Where(item => item.OrderNo == x.No).Select(item => new - { - item.Name - }) - .ToList(); + { + item.Name + }) + .ToList(); }); return page; @@ -243,7 +241,6 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService .Where(x => x.No == request.No) .ExecuteCommandAsync(); - var balance = await DbContext.Queryable().Where(x => x.No == request.No).SingleAsync(); await DbContext.Updateable() .SetColumns(x => x.Status == BalanceRecordStatusEnumType.Obsolute) .SetColumns(x => x.Remark == request.Reason) @@ -265,7 +262,6 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService .SetColumns(x => x.ModifiedBy == userId) .Where(x => x.Id == mealInfo.Id && x.Version == mealInfo.Version) .ExecuteCommandThrowVersionAsync(); - }, 5); } } @@ -291,15 +287,15 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService var end = start.AddDays(1).AddSeconds(-1); var exists = await DbContext.Queryable() - .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking) - .Where(x => x.OrderStatus == CanteenOrderStatusEnumType.Success) - .Where(x => x.ShiftType == shiftType) - .Where(x => x.UserNo == gainfo.No) - .Where(x => x.CreateTime >= start && x.CreateTime <= end) - .AnyAsync(); + .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking) + .Where(x => x.OrderStatus == CanteenOrderStatusEnumType.Success) + .Where(x => x.ShiftType == shiftType) + .Where(x => x.UserNo == gainfo.No) + .Where(x => x.CreateTime >= start && x.CreateTime <= end) + .AnyAsync(); exists.ThrowIfTrue("不可重复订餐"); return gainfo; } -} +} \ No newline at end of file From 44e0ddca352989ad33f3faf8d6978a31f26a0527 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Sun, 28 Apr 2024 11:26:23 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix=20=E5=BF=85=E9=A1=BB=E5=88=86?= =?UTF-8?q?=E9=85=8D=E5=9F=BA=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Sys/Identity/Services/Implements/TenantService.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Src/Dlhis.Sys/Identity/Services/Implements/TenantService.cs b/Src/Dlhis.Sys/Identity/Services/Implements/TenantService.cs index 70642c2f..f8e51a11 100644 --- a/Src/Dlhis.Sys/Identity/Services/Implements/TenantService.cs +++ b/Src/Dlhis.Sys/Identity/Services/Implements/TenantService.cs @@ -84,12 +84,6 @@ public class TenantService : ITenantService }) .ToListAsync(); - if (!myTenants.Any()) - { - myTenants = await GetListAsync(); - myTenants = myTenants.Where(x => x.PCode.IsPresent()).ToList(); - } - var currentTenant = myTenants.FirstOrDefault(x => x.Code == tenantId); var otherTenants = myTenants.Where(x => x.Code != tenantId); From dfaa35e4877fbdd4d9f78b97519602dd640dc48f Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 6 May 2024 17:20:26 +0800 Subject: [PATCH 08/10] =?UTF-8?q?fix=20role=3Dadmin=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Dlhis.Common/FileOperation/Controllers/FileController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Dlhis.Common/FileOperation/Controllers/FileController.cs b/Src/Dlhis.Common/FileOperation/Controllers/FileController.cs index d6b329e3..59bd8fc3 100644 --- a/Src/Dlhis.Common/FileOperation/Controllers/FileController.cs +++ b/Src/Dlhis.Common/FileOperation/Controllers/FileController.cs @@ -42,7 +42,7 @@ public class FileController : ControllerBase /// /// /// - [Authorize(Roles = "admin")] + [Authorize] [HttpPost("{Bucket}/version/upload")] [RequestFormLimits(MultipartBodyLengthLimit = int.MaxValue)] [RequestSizeLimit(int.MaxValue)] From aaf43f754040842193a59036035b7531217cdd28 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 7 May 2024 12:54:39 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix=20=E5=91=BD=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Device/Controllers/DevicesConnectController.cs | 2 +- Src/Dlhis.Basic/Device/Controllers/DevicesController.cs | 6 +++--- Src/Dlhis.Basic/Device/Services/IDeviceConnectService.cs | 4 ++-- .../Device/Services/Implements/DeviceConnectService.cs | 6 +++--- Src/Dlhis.Basic/Dlhis.Basic.csproj | 3 +++ 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesConnectController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesConnectController.cs index bd0cf881..ba0c2773 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicesConnectController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicesConnectController.cs @@ -42,7 +42,7 @@ public class DevicesConnectController : ControllerBase [IgnoreTenant] public async Task ResigterAsync(DeviceResigterRequest request) { - return await _deviceConnectService.ResigterAsync(request); + return await _deviceConnectService.RegisterAsync(request); } /// diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs index 11e3f0f2..a9dd8bc9 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs @@ -65,9 +65,9 @@ public class DevicesController : ControllerBase [Obsolete("迁移到DeviceConnect")] [HttpPost("resigter")] [IgnoreTenant] - public async Task ResigterAsync(DeviceResigterRequest request) + public async Task RegisterAsync(DeviceResigterRequest request) { - return await _deviceConnectService.ResigterAsync(request); + return await _deviceConnectService.RegisterAsync(request); } /// @@ -138,7 +138,7 @@ public class DevicesController : ControllerBase [HttpPost("businessplaces")] public async Task SetResigterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request) { - await _deviceConnectService.SetResigterBusinessPlaceAsync(request); + await _deviceConnectService.SetRegisterBusinessPlaceAsync(request); } /// diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceConnectService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceConnectService.cs index bf3045e1..a7ef65a8 100644 --- a/Src/Dlhis.Basic/Device/Services/IDeviceConnectService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDeviceConnectService.cs @@ -10,7 +10,7 @@ public interface IDeviceConnectService : IScopeDependency /// /// /// - Task ResigterAsync(DeviceResigterRequest request); + Task RegisterAsync(DeviceResigterRequest request); /// @@ -24,7 +24,7 @@ public interface IDeviceConnectService : IScopeDependency /// /// /// - Task SetResigterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request); + Task SetRegisterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request); /// /// 设备心跳 diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs index d735172e..cf295760 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs @@ -22,7 +22,7 @@ public class DeviceConnectService : IDeviceConnectService } - public async Task ResigterAsync(DeviceResigterRequest request) + public async Task RegisterAsync(DeviceResigterRequest request) { var businessPlace = await _dbContext.Queryable().Where(x => x.CustomCode == request.BusinessCustomCode).FirstAsync(); businessPlace.ThrowIfNull("营业点不存在"); @@ -32,7 +32,7 @@ public class DeviceConnectService : IDeviceConnectService if (registry == null) { - registry = new DeviceRegistryEntity() + registry = new DeviceRegistryEntity { DeviceUniqueNo = request.UniqueNo, LastHeartbeatTime = DateTime.Now, @@ -60,7 +60,7 @@ public class DeviceConnectService : IDeviceConnectService return devices.Adapt>(); } - public async Task SetResigterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request) + public async Task SetRegisterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request) { var device = await GetEnableDeviceAsync(request.UniqueNo); (device.Type != DeviceTypeEnumType.Meal).ThrowIfTrue("非就餐类型设备,无法设置"); diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj index 401adcbf..eb05152d 100644 --- a/Src/Dlhis.Basic/Dlhis.Basic.csproj +++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj @@ -14,6 +14,9 @@ + + appsettings.json + From f2e619028c50a26acf2fc1034c2a16bd3b2ebacd Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 7 May 2024 14:45:48 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat=20=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dlhis.Jinko.Face.sln | 7 ++ .../Controllers/FaceController.cs | 104 ++++++++++++++++++ Src/Dlhis.InfoCheck/Dlhis.InfoCheck.csproj | 23 ++++ Src/Dlhis.InfoCheck/Dockerfile | 23 ++++ Src/Dlhis.InfoCheck/Program.cs | 19 ++++ .../Properties/launchSettings.json | 38 +++++++ .../Request/FaceDetectRequest.cs | 6 + .../Request/FaceRecognizeRequest.cs | 8 ++ .../Response/FaceRecognizeResponse.cs | 14 +++ .../appsettings.Development.json | 31 ++++++ Src/Dlhis.InfoCheck/appsettings.json | 65 +++++++++++ 11 files changed, 338 insertions(+) create mode 100644 Src/Dlhis.InfoCheck/Controllers/FaceController.cs create mode 100644 Src/Dlhis.InfoCheck/Dlhis.InfoCheck.csproj create mode 100644 Src/Dlhis.InfoCheck/Dockerfile create mode 100644 Src/Dlhis.InfoCheck/Program.cs create mode 100644 Src/Dlhis.InfoCheck/Properties/launchSettings.json create mode 100644 Src/Dlhis.InfoCheck/Request/FaceDetectRequest.cs create mode 100644 Src/Dlhis.InfoCheck/Request/FaceRecognizeRequest.cs create mode 100644 Src/Dlhis.InfoCheck/Response/FaceRecognizeResponse.cs create mode 100644 Src/Dlhis.InfoCheck/appsettings.Development.json create mode 100644 Src/Dlhis.InfoCheck/appsettings.json diff --git a/Dlhis.Jinko.Face.sln b/Dlhis.Jinko.Face.sln index f8c00af7..d1d15d0f 100644 --- a/Dlhis.Jinko.Face.sln +++ b/Dlhis.Jinko.Face.sln @@ -47,6 +47,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Message", "Message", "{65E7 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.Message", "Src\Dlhis.Message\Dlhis.Message.csproj", "{053BF7B2-B1A0-435F-9C77-2EF5622CC5C5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.InfoCheck", "Src\Dlhis.InfoCheck\Dlhis.InfoCheck.csproj", "{4D656761-8CE7-4316-A3DF-8C1722D69CCE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -117,6 +119,10 @@ Global {053BF7B2-B1A0-435F-9C77-2EF5622CC5C5}.Debug|Any CPU.Build.0 = Debug|Any CPU {053BF7B2-B1A0-435F-9C77-2EF5622CC5C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {053BF7B2-B1A0-435F-9C77-2EF5622CC5C5}.Release|Any CPU.Build.0 = Release|Any CPU + {4D656761-8CE7-4316-A3DF-8C1722D69CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D656761-8CE7-4316-A3DF-8C1722D69CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D656761-8CE7-4316-A3DF-8C1722D69CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D656761-8CE7-4316-A3DF-8C1722D69CCE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -136,6 +142,7 @@ Global {D4043506-7247-4DDC-9751-927403515669} = {3D8A98C1-83C9-4375-AEAB-4F72AFAF365B} {69E8A91A-5D05-4327-BC24-038523C7628C} = {489252FB-A44B-46EE-B065-21CDCB724441} {053BF7B2-B1A0-435F-9C77-2EF5622CC5C5} = {65E76F97-E78A-4C95-B788-4091236B1A79} + {4D656761-8CE7-4316-A3DF-8C1722D69CCE} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7439494A-E2FD-4FEA-8ABF-74AE57A4A5A0} diff --git a/Src/Dlhis.InfoCheck/Controllers/FaceController.cs b/Src/Dlhis.InfoCheck/Controllers/FaceController.cs new file mode 100644 index 00000000..030057cd --- /dev/null +++ b/Src/Dlhis.InfoCheck/Controllers/FaceController.cs @@ -0,0 +1,104 @@ +using Microsoft.AspNetCore.Mvc; +using SkiaSharp; +using ViewFaceCore.Core; +using ViewFaceCore.Model; +using ViewFaceCore.Exceptions; +using ViewFaceCore; +using ViewFaceCore.Configs; +using Microsoft.AspNetCore.Authorization; +using Dlhis.InfoCheck.Request; +using Dlhis.InfoCheck.Response; + +namespace Dlhis.InfoCheck.Controllers; + +/// +/// ÈËÁ³¼ì²â +/// +[Authorize] +[ApiController] +[Route("[controller]")] +public class FaceController : ControllerBase +{ + /// + /// ÈËÁ³ÖÊÁ¿¼ì²â + /// + /// + /// + [HttpPost("detection")] + public object FacialDetection(FaceDetectRequest request) + { + var base64Bytes = Convert.FromBase64String(request.Base64); + using var stream = new MemoryStream(base64Bytes); + using var bitmap = SKBitmap.Decode(stream); + using var faceDetector = new FaceDetector(); + + using var faceMark = new FaceLandmarker(new FaceLandmarkConfig + { + MarkType = MarkType.Light + }); + + //todo ¶àÈËÇé¿ö + var info = faceDetector.Detect(bitmap).First(); + var markPoints = faceMark.Mark(bitmap, info); + + using var faceQuality = new FaceQuality(); + var brightnessResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Brightness); + var resolutionResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Resolution); + //var clarityResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Clarity); + var clarityExResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.ClarityEx); + var integrityExResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Integrity); + var structureeResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Structure); + //var poseResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Pose); + var poseExeResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.PoseEx); + + return new + { + Brightness = brightnessResult, + Resolution = resolutionResult, + Clarity = clarityExResult, + Integrity = integrityExResult, + Structure = structureeResult, + Pose = poseExeResult + }; + } + + + /// + /// ÈËÁ³¶ԱÈ + /// + /// + /// + [HttpPost("recognize")] + public FaceRecognizeResponse FacialRecognize(FaceRecognizeRequest request) + { + var firstBase64Bytes = Convert.FromBase64String(request.FirstBase64); + using var firstStream = new MemoryStream(firstBase64Bytes); + using var firstBitmap = SKBitmap.Decode(firstStream); + + var secondBase64Bytes = Convert.FromBase64String(request.SecondBase64); + using var secondStream = new MemoryStream(secondBase64Bytes); + using var secondBitmap = SKBitmap.Decode(secondStream); + + using var recognizer = new FaceRecognizer(new FaceRecognizeConfig + { + //¶ÔӦãÐֵ FaceType.Normal£º0.62¡¢FaceType.Mask£º0.4¡¢FaceType.Light£º0.55 + FaceType = FaceType.Normal + }); + + using var faceDetector = new FaceDetector(); + using var faceMark = new FaceLandmarker(); + + //todo + var lft = recognizer.Extract(firstBitmap, faceMark.Mark(firstBitmap, faceDetector.Detect(firstBitmap).First())); + var rft = recognizer.Extract(secondBitmap, faceMark.Mark(secondBitmap, faceDetector.Detect(secondBitmap).First())); + + var similarity = recognizer.Compare(lft, rft); + var isSelf = recognizer.IsSelf(similarity); + + return new FaceRecognizeResponse + { + Similarity = similarity, + IsSelf = isSelf + }; + } +} diff --git a/Src/Dlhis.InfoCheck/Dlhis.InfoCheck.csproj b/Src/Dlhis.InfoCheck/Dlhis.InfoCheck.csproj new file mode 100644 index 00000000..cad3976a --- /dev/null +++ b/Src/Dlhis.InfoCheck/Dlhis.InfoCheck.csproj @@ -0,0 +1,23 @@ + + + + net6.0 + disable + enable + True + Linux + ..\.. + + + + + + + + + + + + + + diff --git a/Src/Dlhis.InfoCheck/Dockerfile b/Src/Dlhis.InfoCheck/Dockerfile new file mode 100644 index 00000000..c9f9f586 --- /dev/null +++ b/Src/Dlhis.InfoCheck/Dockerfile @@ -0,0 +1,23 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["Src/Dlhis.InfoCheck/Dlhis.InfoCheck.csproj", "Src/Dlhis.InfoCheck/"] +RUN dotnet restore "./Src/Dlhis.InfoCheck/./Dlhis.InfoCheck.csproj" +COPY . . +WORKDIR "/src/Src/Dlhis.InfoCheck" +RUN dotnet build "./Dlhis.InfoCheck.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./Dlhis.InfoCheck.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Dlhis.InfoCheck.dll"] \ No newline at end of file diff --git a/Src/Dlhis.InfoCheck/Program.cs b/Src/Dlhis.InfoCheck/Program.cs new file mode 100644 index 00000000..ec28e74a --- /dev/null +++ b/Src/Dlhis.InfoCheck/Program.cs @@ -0,0 +1,19 @@ +using Kurisu.AspNetCore.Startup; +using Kurisu.AspNetCore.Utils.Extensions; +using Microsoft.IdentityModel.Logging; + +class Program +{ + static void Main(string[] args) + { + KurisuHost.Run(args); + } +} + +public class Startup : DefaultStartup +{ + public Startup(IConfiguration configuration) : base(configuration) + { + IdentityModelEventSource.ShowPII = true; + } +} \ No newline at end of file diff --git a/Src/Dlhis.InfoCheck/Properties/launchSettings.json b/Src/Dlhis.InfoCheck/Properties/launchSettings.json new file mode 100644 index 00000000..49b1f9a2 --- /dev/null +++ b/Src/Dlhis.InfoCheck/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "profiles": { + "Dlhis.InfoCheck": { + "commandName": "Project", + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5048" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Docker": { + "commandName": "Docker", + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/weatherforecast", + "environmentVariables": { + "ASPNETCORE_URLS": "http://+:80" + }, + "publishAllPorts": true + } + }, + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:53902", + "sslPort": 0 + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.InfoCheck/Request/FaceDetectRequest.cs b/Src/Dlhis.InfoCheck/Request/FaceDetectRequest.cs new file mode 100644 index 00000000..5593cc4e --- /dev/null +++ b/Src/Dlhis.InfoCheck/Request/FaceDetectRequest.cs @@ -0,0 +1,6 @@ +namespace Dlhis.InfoCheck.Request; + +public class FaceDetectRequest +{ + public string Base64 { get; set; } +} diff --git a/Src/Dlhis.InfoCheck/Request/FaceRecognizeRequest.cs b/Src/Dlhis.InfoCheck/Request/FaceRecognizeRequest.cs new file mode 100644 index 00000000..126df29c --- /dev/null +++ b/Src/Dlhis.InfoCheck/Request/FaceRecognizeRequest.cs @@ -0,0 +1,8 @@ +namespace Dlhis.InfoCheck.Request; + +public class FaceRecognizeRequest +{ + public string FirstBase64 { get; set; } + + public string SecondBase64 { get; set; } +} diff --git a/Src/Dlhis.InfoCheck/Response/FaceRecognizeResponse.cs b/Src/Dlhis.InfoCheck/Response/FaceRecognizeResponse.cs new file mode 100644 index 00000000..dc3adb16 --- /dev/null +++ b/Src/Dlhis.InfoCheck/Response/FaceRecognizeResponse.cs @@ -0,0 +1,14 @@ +namespace Dlhis.InfoCheck.Response; + +public class FaceRecognizeResponse +{ + /// + /// 相似度 + /// + public float Similarity { get; set; } + + /// + /// 同一人 + /// + public bool IsSelf { get; set; } +} diff --git a/Src/Dlhis.InfoCheck/appsettings.Development.json b/Src/Dlhis.InfoCheck/appsettings.Development.json new file mode 100644 index 00000000..17b935d5 --- /dev/null +++ b/Src/Dlhis.InfoCheck/appsettings.Development.json @@ -0,0 +1,31 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "SwaggerOptions": { + "Enable": true, + "Authority": "https://yikatong.isawesome.cn/oauth2", + "ClientId": "4fb184324eac4180", + "ClientSecret": "8ac8f235152f1524", + "Scopes": { + "openid": "openid", + "profile": "profile", + "yikatong": "yikatong" + } + }, + "IdentityServerOptions": { + "Authority": "https://yikatong.isawesome.cn/oauth2", + "RequireHttpsMetadata": true, + "Issuer": "identity.isawesome.cn", + "Audience": "", + "Pat": { + "Enable": false, + "Scheme": "token", + "ClientId": "reference", + "ClientSecret": "123456" + } + } +} diff --git a/Src/Dlhis.InfoCheck/appsettings.json b/Src/Dlhis.InfoCheck/appsettings.json new file mode 100644 index 00000000..f7c0efed --- /dev/null +++ b/Src/Dlhis.InfoCheck/appsettings.json @@ -0,0 +1,65 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "SwaggerOptions": { + "Enable": true, + "Authority": "http://identity.oauth.svc.cluster.local", + "ClientId": "4fb184324eac4180", + "ClientSecret": "8ac8f235152f1524", + "Scopes": { + "openid": "openid", + "profile": "profile", + "yikatong": "yikatong" + } + }, + "IdentityServerOptions": { + "Authority": "http://identity.oauth.svc.cluster.local", + "RequireHttpsMetadata": false, + "Issuer": "identity.isawesome.cn", + "Audience": "", + "Pat": { + "Enable": false, + "Scheme": "token", + "ClientId": "reference", + "ClientSecret": "123456" + } + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "WriteTo": [ + { + "Name": "Async", + "Args": { + "configure": [ + { + "Name": "Console", + "Args": { + "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "MySQL", + "Args": { + "connectionString": "server=192.168.199.124;port=3306;userid=root;password=dlhis123;database=log;charset=utf8mb4;", + "tableName": "Logs", + "autoCreateSqlTable": true + } + } + ] + } + } + ] + } +}