using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; using SqlSugar; namespace Dlhis.Basic.Organization.Services.Implements; public class GainfoIdCardFaceCompareService : IGainfoIdCardFaceCompareService { private readonly IDbContext _dbContext; private readonly IDbContext _faceDbContext; private readonly IAliyunClient _aliyunClient; private readonly ICurrentUser _currentUser; public GainfoIdCardFaceCompareService( IDbContext dbContext, IAliyunClient aliyunClient, ICurrentUser currentUser) { _dbContext = dbContext; _faceDbContext = dbContext.ChangeDb("face"); _aliyunClient = aliyunClient; _currentUser = currentUser; } public async Task> GetPageAsync(IdCardFaceComparePageRequest request) { var factories = GetFactories(request.Factories); return await _dbContext.Queryable() .LeftJoin((record, gainfo) => record.UserCode == gainfo.Code) .LeftJoin((record, gainfo, department) => gainfo.DepartmentNo == department.No) .WhereIF(factories.Any(), (record, gainfo) => factories.Contains(gainfo.Factory)) .WhereIF(request.UserType.HasValue, record => record.UserType == request.UserType.Value) .WhereIF(request.CompareResult.HasValue, record => record.CompareResult == request.CompareResult.Value) .WhereIF(request.Search.IsPresent(), (record, gainfo) => record.UserCode == request.Search || record.IdNo == request.Search || record.UserName.Contains(request.Search) || gainfo.Name.Contains(request.Search)) .OrderBy(record => record.CreateTime, OrderByType.Desc) .Select((record, gainfo, department) => new IdCardFaceCompareRecordResponse { Id = record.Id, UserCode = record.UserCode, UserName = record.UserName, UserType = record.UserType, IdNo = record.IdNo, DepartmentName = department.Name, Factory = gainfo.Factory, CompareResult = record.CompareResult, IsPassed = record.IsPassed, Similarity = record.Similarity, CompareCount = record.CompareCount, LastCompareTime = record.LastCompareTime, ApiResponse = record.ApiResponse, ErrorMessage = record.ErrorMessage, CreateTime = record.CreateTime }) .ToPageListAsync(request); } public async Task CompareAsync(IdCardFaceCompareRequest request) { var gainfo = await _dbContext.Queryable() .Where(x => x.Code == request.UserCode) .SingleAsync(); gainfo.ThrowIfNull("人员档案信息不存在"); gainfo.IdNo.IsPresent().ThrowIfFalse("人员证件号为空,无法对比"); var now = DateTime.Now; var userId = _currentUser.GetIntSubjectId(); var record = await _dbContext.Queryable() .Where(x => x.UserCode == gainfo.Code) .SingleAsync(); if (record == null) { record = new IdCardFaceCompareRecordEntity { UserCode = gainfo.Code, UserType = gainfo.Type, UserName = gainfo.Name, IdNo = gainfo.IdNo, CompareResult = IdCardFaceCompareResultEnumType.NotCompared, CompareCount = 0, CreateTime = now, ModifiedTime = now, CreatedBy = userId, ModifiedBy = userId }; await _dbContext.InsertAsync(record); } else { record.UserType = gainfo.Type; record.UserName = gainfo.Name; record.IdNo = gainfo.IdNo; record.CompareResult = IdCardFaceCompareResultEnumType.NotCompared; record.ErrorMessage = null; record.ModifiedTime = now; record.ModifiedBy = userId; await _dbContext.UpdateAsync(record); } var face = await _faceDbContext.Queryable() .Where(x => x.UserCode == gainfo.Code) .Select(x => x.Face) .SingleAsync(); if (!face.IsPresent()) { record.ErrorMessage = "人脸照片尚未录入"; record.ModifiedTime = DateTime.Now; record.ModifiedBy = userId; await _dbContext.UpdateAsync(record); throw new UserFriendlyException(record.ErrorMessage); } try { var response = await _aliyunClient.Id3MetaVerifyAsync(gainfo.IdNo, gainfo.Name, face); record.CompareResult = IdCardFaceCompareResultEnumType.Compared; record.ApiResponse = response.RawResponse; record.IsPassed = response.Passed; record.Similarity = response.Similarity; record.CompareCount += 1; record.LastCompareTime = now; record.ModifiedTime = DateTime.Now; record.ModifiedBy = userId; } catch (Exception ex) { record.ErrorMessage = ex.Message; record.ModifiedTime = DateTime.Now; record.ModifiedBy = userId; await _dbContext.UpdateAsync(record); throw; } await _dbContext.UpdateAsync(record); return await GetRecordAsync(record.Id); } private async Task GetRecordAsync(long id) { return await _dbContext.Queryable() .LeftJoin((record, gainfo) => record.UserCode == gainfo.Code) .LeftJoin((record, gainfo, department) => gainfo.DepartmentNo == department.No) .Where(record => record.Id == id) .Select((record, gainfo, department) => new IdCardFaceCompareRecordResponse { Id = record.Id, UserCode = record.UserCode, UserName = record.UserName, UserType = record.UserType, IdNo = record.IdNo, DepartmentName = department.Name, Factory = gainfo.Factory, CompareResult = record.CompareResult, IsPassed = record.IsPassed, Similarity = record.Similarity, CompareCount = record.CompareCount, LastCompareTime = record.LastCompareTime, ApiResponse = record.ApiResponse, ErrorMessage = record.ErrorMessage, CreateTime = record.CreateTime }) .SingleAsync(); } private List GetFactories(List requestFactories) { var currentFactories = _currentUser.GetUserClaim("tenants")?.Split(",").Where(x => x.IsPresent()).ToList() ?? new List(); if (requestFactories == null || !requestFactories.Any()) { return currentFactories; } return requestFactories.Where(x => currentFactories.Contains(x)).ToList(); } }