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;