diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoIdCardFaceCompareController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoIdCardFaceCompareController.cs index adaf1e3b..19fd4999 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoIdCardFaceCompareController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoIdCardFaceCompareController.cs @@ -42,4 +42,14 @@ public class GainfoIdCardFaceCompareController : ControllerBase { return await _service.CompareAsync(request); } + + /// + /// 保存人证人脸对比记录 + /// + [HttpPost("save")] + [Transactional] + public async Task SaveAsync(IdCardFaceCompareRecordSaveRequest request) + { + return await _service.SaveAsync(request); + } } diff --git a/Src/Dlhis.Basic/Organization/Request/IdCardFaceCompareRecordSaveRequest.cs b/Src/Dlhis.Basic/Organization/Request/IdCardFaceCompareRecordSaveRequest.cs new file mode 100644 index 00000000..ac910260 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/IdCardFaceCompareRecordSaveRequest.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Basic.Enums; + +namespace Dlhis.Basic.Organization.Request; + +public class IdCardFaceCompareRecordSaveRequest +{ + /// + /// 用户code + /// + [Required(ErrorMessage = "用户code不可为空")] + public string UserCode { get; set; } + + /// + /// 对比结果 + /// + public IdCardFaceCompareResultEnumType? CompareResult { get; set; } + + /// + /// 业务核验是否通过 + /// + public bool? IsPassed { get; set; } + + /// + /// 相似度 + /// + public double? Similarity { get; set; } + + /// + /// 阿里云原始响应 + /// + public string ApiResponse { get; set; } + + /// + /// 对比异常信息 + /// + public string ErrorMessage { get; set; } + + /// + /// 对比时间 + /// + public DateTime? CompareTime { get; set; } +} diff --git a/Src/Dlhis.Basic/Organization/Services/IAliyunClient.cs b/Src/Dlhis.Basic/Organization/Services/IAliyunClient.cs index 0f04adf0..bc1909ba 100644 --- a/Src/Dlhis.Basic/Organization/Services/IAliyunClient.cs +++ b/Src/Dlhis.Basic/Organization/Services/IAliyunClient.cs @@ -90,12 +90,12 @@ public class AliyunClient : IAliyunClient }; var response = JsonConvert.DeserializeObject(rawResponse); - result.RequestId = response?.RequestId; - result.Code = response?.Code; - result.Message = response?.Message; - result.BizCode = response?.ResultObject?.BizCode; - result.Similarity = ParseVerifyScore(response?.ResultObject?.FaceDetail); - result.Passed = response?.ResultObject?.BizCode switch + result.RequestId = response.RequestId; + result.Code = response.Code; + result.Message = response.Message; + result.BizCode = response.ResultObject.BizCode; + result.Similarity = ParseVerifyScore(response.ResultObject.FaceDetail); + result.Passed = response.ResultObject.BizCode switch { "1" => true, "2" or "3" => false, @@ -105,15 +105,10 @@ public class AliyunClient : IAliyunClient return result; } - private static double? ParseVerifyScore(string faceDetail) + private static double ParseVerifyScore(string faceDetail) { - if (string.IsNullOrWhiteSpace(faceDetail)) - { - return null; - } - var detail = JsonConvert.DeserializeObject(faceDetail); - return detail?.VerifyScore; + return detail.VerifyScore; } private static string ComputeSignature(SortedDictionary parameters, string httpMethod, string accessKeySecret) @@ -184,6 +179,6 @@ public class AliyunClient : IAliyunClient private class AliyunId3MetaVerifyFaceDetail { [JsonProperty("verifyScore")] - public double? VerifyScore { get; set; } + public double VerifyScore { get; set; } } } diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoIdCardFaceCompareService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoIdCardFaceCompareService.cs index 307860a1..ef41e50f 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoIdCardFaceCompareService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoIdCardFaceCompareService.cs @@ -19,4 +19,11 @@ public interface IGainfoIdCardFaceCompareService : IScopeDependency /// 人证人脸对比请求 /// 人证人脸对比记录 Task CompareAsync(IdCardFaceCompareRequest request); + + /// + /// 保存人证人脸对比记录 + /// + /// 人证人脸对比记录 + /// 人证人脸对比记录 + Task SaveAsync(IdCardFaceCompareRecordSaveRequest request); } diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoIdCardFaceCompareService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoIdCardFaceCompareService.cs index bac986ab..9de859d5 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoIdCardFaceCompareService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoIdCardFaceCompareService.cs @@ -15,7 +15,6 @@ namespace Dlhis.Basic.Organization.Services.Implements; public class GainfoIdCardFaceCompareService : IGainfoIdCardFaceCompareService { private readonly IDbContext _dbContext; - private readonly IServiceProvider _serviceProvider; private readonly IAliyunClient _aliyunClient; private readonly ICurrentUser _currentUser; @@ -151,6 +150,59 @@ public class GainfoIdCardFaceCompareService : IGainfoIdCardFaceCompareService return await GetRecordAsync(record.UserCode); } + public async Task SaveAsync(IdCardFaceCompareRecordSaveRequest request) + { + var gainfo = await _dbContext.Queryable() + .Where(x => x.Code == request.UserCode) + .SingleAsync(); + gainfo.ThrowIfNull("人员档案信息不存在"); + + var now = DateTime.Now; + var compareTime = request.CompareTime ?? 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, + CompareCount = 0, + CreatedBy = userId, + CreateTime = now + }; + } + + record.UserType = gainfo.Type; + record.UserName = gainfo.Name; + record.IdNo = gainfo.IdNo; + record.CompareResult = request.CompareResult + ?? (request.ErrorMessage.IsPresent() + ? IdCardFaceCompareResultEnumType.NotCompared + : IdCardFaceCompareResultEnumType.Compared); + record.ApiResponse = request.ApiResponse; + record.IsPassed = request.IsPassed; + record.Similarity = request.Similarity; + record.ErrorMessage = request.ErrorMessage; + record.CompareCount += 1; + record.LastCompareTime = compareTime; + record.ModifiedTime = now; + record.ModifiedBy = userId; + + if (record.Id == 0) + { + await _dbContext.InsertAsync(record); + } + else + { + await _dbContext.UpdateAsync(record); + } + + return await GetRecordAsync(record.UserCode); + } + private async Task UpdateRecordErrorAndThrowAsync(IdCardFaceCompareRecordEntity record, string message, int userId) { record.ErrorMessage = message;