This commit is contained in:
2026-06-29 15:28:17 +08:00
parent 2e22d145bc
commit ad6d7ea29e
5 changed files with 122 additions and 15 deletions

View File

@@ -42,4 +42,14 @@ public class GainfoIdCardFaceCompareController : ControllerBase
{ {
return await _service.CompareAsync(request); return await _service.CompareAsync(request);
} }
/// <summary>
/// 保存人证人脸对比记录
/// </summary>
[HttpPost("save")]
[Transactional]
public async Task<IdCardFaceCompareRecordResponse> SaveAsync(IdCardFaceCompareRecordSaveRequest request)
{
return await _service.SaveAsync(request);
}
} }

View File

@@ -0,0 +1,43 @@
using System.ComponentModel.DataAnnotations;
using Dlhis.Entity.Basic.Enums;
namespace Dlhis.Basic.Organization.Request;
public class IdCardFaceCompareRecordSaveRequest
{
/// <summary>
/// 用户code
/// </summary>
[Required(ErrorMessage = "用户code不可为空")]
public string UserCode { get; set; }
/// <summary>
/// 对比结果
/// </summary>
public IdCardFaceCompareResultEnumType? CompareResult { get; set; }
/// <summary>
/// 业务核验是否通过
/// </summary>
public bool? IsPassed { get; set; }
/// <summary>
/// 相似度
/// </summary>
public double? Similarity { get; set; }
/// <summary>
/// 阿里云原始响应
/// </summary>
public string ApiResponse { get; set; }
/// <summary>
/// 对比异常信息
/// </summary>
public string ErrorMessage { get; set; }
/// <summary>
/// 对比时间
/// </summary>
public DateTime? CompareTime { get; set; }
}

View File

@@ -90,12 +90,12 @@ public class AliyunClient : IAliyunClient
}; };
var response = JsonConvert.DeserializeObject<AliyunId3MetaVerifyApiResponse>(rawResponse); var response = JsonConvert.DeserializeObject<AliyunId3MetaVerifyApiResponse>(rawResponse);
result.RequestId = response?.RequestId; result.RequestId = response.RequestId;
result.Code = response?.Code; result.Code = response.Code;
result.Message = response?.Message; result.Message = response.Message;
result.BizCode = response?.ResultObject?.BizCode; result.BizCode = response.ResultObject.BizCode;
result.Similarity = ParseVerifyScore(response?.ResultObject?.FaceDetail); result.Similarity = ParseVerifyScore(response.ResultObject.FaceDetail);
result.Passed = response?.ResultObject?.BizCode switch result.Passed = response.ResultObject.BizCode switch
{ {
"1" => true, "1" => true,
"2" or "3" => false, "2" or "3" => false,
@@ -105,15 +105,10 @@ public class AliyunClient : IAliyunClient
return result; return result;
} }
private static double? ParseVerifyScore(string faceDetail) private static double ParseVerifyScore(string faceDetail)
{ {
if (string.IsNullOrWhiteSpace(faceDetail))
{
return null;
}
var detail = JsonConvert.DeserializeObject<AliyunId3MetaVerifyFaceDetail>(faceDetail); var detail = JsonConvert.DeserializeObject<AliyunId3MetaVerifyFaceDetail>(faceDetail);
return detail?.VerifyScore; return detail.VerifyScore;
} }
private static string ComputeSignature(SortedDictionary<string, string> parameters, string httpMethod, string accessKeySecret) private static string ComputeSignature(SortedDictionary<string, string> parameters, string httpMethod, string accessKeySecret)
@@ -184,6 +179,6 @@ public class AliyunClient : IAliyunClient
private class AliyunId3MetaVerifyFaceDetail private class AliyunId3MetaVerifyFaceDetail
{ {
[JsonProperty("verifyScore")] [JsonProperty("verifyScore")]
public double? VerifyScore { get; set; } public double VerifyScore { get; set; }
} }
} }

View File

@@ -19,4 +19,11 @@ public interface IGainfoIdCardFaceCompareService : IScopeDependency
/// <param name="request">人证人脸对比请求</param> /// <param name="request">人证人脸对比请求</param>
/// <returns>人证人脸对比记录</returns> /// <returns>人证人脸对比记录</returns>
Task<IdCardFaceCompareRecordResponse> CompareAsync(IdCardFaceCompareRequest request); Task<IdCardFaceCompareRecordResponse> CompareAsync(IdCardFaceCompareRequest request);
/// <summary>
/// 保存人证人脸对比记录
/// </summary>
/// <param name="request">人证人脸对比记录</param>
/// <returns>人证人脸对比记录</returns>
Task<IdCardFaceCompareRecordResponse> SaveAsync(IdCardFaceCompareRecordSaveRequest request);
} }

View File

@@ -15,7 +15,6 @@ namespace Dlhis.Basic.Organization.Services.Implements;
public class GainfoIdCardFaceCompareService : IGainfoIdCardFaceCompareService public class GainfoIdCardFaceCompareService : IGainfoIdCardFaceCompareService
{ {
private readonly IDbContext _dbContext; private readonly IDbContext _dbContext;
private readonly IServiceProvider _serviceProvider;
private readonly IAliyunClient _aliyunClient; private readonly IAliyunClient _aliyunClient;
private readonly ICurrentUser _currentUser; private readonly ICurrentUser _currentUser;
@@ -151,6 +150,59 @@ public class GainfoIdCardFaceCompareService : IGainfoIdCardFaceCompareService
return await GetRecordAsync(record.UserCode); return await GetRecordAsync(record.UserCode);
} }
public async Task<IdCardFaceCompareRecordResponse> SaveAsync(IdCardFaceCompareRecordSaveRequest request)
{
var gainfo = await _dbContext.Queryable<GainfoEntity>()
.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<IdCardFaceCompareRecordEntity>()
.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) private async Task UpdateRecordErrorAndThrowAsync(IdCardFaceCompareRecordEntity record, string message, int userId)
{ {
record.ErrorMessage = message; record.ErrorMessage = message;