feat 拍照对照片进行识别对比

This commit is contained in:
2025-05-13 14:06:12 +08:00
parent cf6e03f986
commit 4bfb2660e8
9 changed files with 175 additions and 10 deletions

View File

@@ -0,0 +1,26 @@
using System.Text;
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
using HttpUtil;
using Kurisu.AspNetCore.Utils.Extensions;
namespace Dlhis.Basic;
public class HikService : IHikService
{
/// <inheritdoc />
public async Task<double> GetSimilarityAsync(GainfoFaceValidateRequest request)
{
var body = request.ToJson(JsonExtensions.DefaultSetting);
var url = "/artemis/api/frs/v1/application/oneToOne";
var key = "27390082";
var secret = "MLl7Dv7p5Pgc9XYI3r4O";
HttpUtillib.SetPlatformInfo(key, secret, "10.32.0.10");
var r = HttpUtillib.HttpPost(url, body, 15);
var result = Encoding.UTF8.GetString(r).ToObject<HikResponse<double>>();
(result.Code == "0").ThrowIfFalse($"海康人脸相似度对比失败:{result.Msg}");
return await Task.FromResult(result.Data);
}
}

View File

@@ -0,0 +1,8 @@
using Dlhis.Basic.Organization.Request;
namespace Dlhis.Basic;
public interface IHikService : IScopeDependency
{
Task<double> GetSimilarityAsync(GainfoFaceValidateRequest request);
}

View File

@@ -1,10 +1,9 @@
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Text;
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
using Dlhis.Basic.Organization.Services;
using HttpUtil;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.Utils.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -39,9 +38,20 @@ public class GainfoFacesController : ControllerBase
return await _gainfoFaceService.GetPageAsync(request);
}
/// <summary>
/// 获取人脸识别记录分页
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet("uploadRecord/page")]
public async Task<Pagination<FaceValidationResponse>> GetUploadPageRecordsAsync([FromQuery] FaceValidationRequest request)
{
return await _gainfoFaceService.GetUploadPageRecordsAsync(request);
}
[AllowAnonymous]
[HttpPost("test")]
public async Task<string> TestAsync(GainfoFaceValidateRequest request)
public async Task<HikResponse<double>> TestAsync(GainfoFaceValidateRequest request)
{
var client = _httpClientFactory.CreateClient("hik-openapi");
var body = request.ToJson(JsonExtensions.DefaultSetting);
@@ -51,7 +61,7 @@ public class GainfoFacesController : ControllerBase
HttpUtillib.SetPlatformInfo(key, secret, "10.32.0.10");
var r = HttpUtillib.HttpPost(url, body, 15);
return Encoding.UTF8.GetString(r);
return Encoding.UTF8.GetString(r).ToObject<HikResponse<double>>();
// var headers = InitRequest(url, body, key, secret);
// client.DefaultRequestHeaders.Accept.Clear();

View File

@@ -4,6 +4,7 @@ using Dlhis.Basic.Organization.Response;
using Dlhis.Basic.Organization.Services;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.AspNetCore.UnifyResultAndValidation.Abstractions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -77,9 +78,9 @@ public class GainfosController : ControllerBase
[HttpPost("face")]
[IgnoreTenant]
[Transactional]
public async Task UploadFaceAsync(GainfoUploadFaceRequest request)
public async Task<IApiResult> UploadFaceAsync(GainfoUploadFaceRequest request)
{
await _gainfoFaceService.UploadFaceAsync(request);
return await _gainfoFaceService.UploadFaceAsync(request);
}
/// <summary>

View File

@@ -0,0 +1,9 @@
using Kurisu.AspNetCore.DataAccess.Dto;
namespace Dlhis.Basic.Organization.Request
{
public class FaceValidationRequest : PageDto
{
public bool? IsSuccess { get; set; }
}
}

View File

@@ -0,0 +1,39 @@
namespace Dlhis.Basic.Organization.Response;
public class FaceValidationResponse
{
/// <summary>
/// 工号
/// </summary>
public string UserCode { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 识别相似度
/// </summary>
public double Similarity { get; set; }
/// <summary>
/// 可接受的相似度
/// </summary>
public double AcceptSimilarity { get; set; }
/// <summary>
/// 拍照前
/// </summary>
public string CurrentFace { get; set; }
/// <summary>
/// 上传
/// </summary>
public string UploadFace { get; set; }
/// <summary>
/// 操作时间
/// </summary>
public DateTime CreateTime { get; set; }
}

View File

@@ -0,0 +1,8 @@
namespace Dlhis.Basic.Organization.Response;
public class HikResponse<T>
{
public string Code { get; set; }
public string Msg { get; set; }
public T Data { get; set; }
}

View File

@@ -1,5 +1,8 @@
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.UnifyResultAndValidation;
using Kurisu.AspNetCore.UnifyResultAndValidation.Abstractions;
using Microsoft.AspNetCore.Mvc;
namespace Dlhis.Basic.Organization.Services;
@@ -14,11 +17,13 @@ public interface IGainfoFaceService : IScopeDependency
Task<IActionResult> GetFaceAsync(string token);
Task UploadFaceAsync(GainfoUploadFaceRequest request);
Task<IApiResult> UploadFaceAsync(GainfoUploadFaceRequest request);
Task UploadFacesAsync(List<GainfoUploadFaceRequest> request);
Task<string> GetFaceByUserCodeAsync(string userCode);
Task<Dictionary<string, string>> GetFaceByUserCodesAsync(GetFaceByUserCodesRequest request);
Task<Pagination<FaceValidationResponse>> GetUploadPageRecordsAsync(FaceValidationRequest request);
}

View File

@@ -13,11 +13,17 @@ using Dlhis.Jip.Api.Requests;
using Dlhis.Sys.Api;
using Kurisu.AspNetCore.Authentication.Abstractions;
using Kurisu.AspNetCore.CustomClass;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.UnifyResultAndValidation;
using Kurisu.AspNetCore.UnifyResultAndValidation.Abstractions;
using Kurisu.AspNetCore.Utils.Extensions;
using Mapster;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace Dlhis.Basic.Organization.Services.Implements;
@@ -35,6 +41,7 @@ public class GainfoFaceService : IGainfoFaceService
private readonly IInfoCheckApi _infoCheckApi;
private readonly IJinkoJipApi _jinkoJipApi;
private readonly ITenantApi _tenantApi;
private readonly IHikService _hikService;
private readonly IDataProtectionProvider _dataProtectionProvider;
public GainfoFaceService(IGainfoStore gainfoStore,
@@ -48,6 +55,7 @@ public class GainfoFaceService : IGainfoFaceService
IInfoCheckApi infoCheckApi,
IJinkoJipApi jinkoJipApi,
ITenantApi tenantApi,
IHikService hikService,
IDataProtectionProvider dataProtectionProvider)
{
_logger = logger;
@@ -62,6 +70,7 @@ public class GainfoFaceService : IGainfoFaceService
_infoCheckApi = infoCheckApi;
_jinkoJipApi = jinkoJipApi;
_tenantApi = tenantApi;
_hikService = hikService;
_dataProtectionProvider = dataProtectionProvider;
}
@@ -80,6 +89,7 @@ public class GainfoFaceService : IGainfoFaceService
.WhereIF(request.Exists.HasValue && request.Exists.Value, x => existsFaceCodes.Contains(x.Code))
.WhereIF(request.Exists.HasValue && !request.Exists.Value, x => !existsFaceCodes.Contains(x.Code))
.WhereIF(request.Search.IsPresent(), x => x.Code == request.Search)
.OrderBy(x => x.CreateTime, OrderByType.Desc)
.Select((x, d) => new GainfoFacePageResponse
{
UserCode = x.Code,
@@ -210,7 +220,7 @@ public class GainfoFaceService : IGainfoFaceService
}
}
public async Task UploadFaceAsync(GainfoUploadFaceRequest request)
public async Task<IApiResult> UploadFaceAsync(GainfoUploadFaceRequest request)
{
var gainfo = await _gainfoStore.Queryable().Where(x => x.No == request.UserNo || x.Code == request.UserNo).SingleAsync();
gainfo.ThrowIfNull("人员档案信息不存在");
@@ -235,7 +245,33 @@ public class GainfoFaceService : IGainfoFaceService
if (face.Face == request.Face)
{
_logger.LogWarning("相同的人脸照片更新忽略");
return;
return DefaultApiResult.Success("操作成功");
}
var faceSimilaritySetting = await _dbContext.Queryable<BasicTypeEntity>().Where(x => x.Type == "faceSimilarity").SingleAsync();
if (faceSimilaritySetting != null)
{
var faceSimilarity = await _hikService.GetSimilarityAsync(new GainfoFaceValidateRequest
{
SrcFacePicBinaryData = face.Face,
DistFacePicBinaryData = request.Face
});
var acceptSimilarity = faceSimilaritySetting.Code.Adapt<double>();
var isError = faceSimilarity < acceptSimilarity;
await _dbContext.InsertAsync(new HikValidateResultEntity
{
UserCode = face.UserCode,
Similarity = faceSimilarity,
AcceptSimilarity = acceptSimilarity,
CurrentFace = face.Face,
UploadFace = request.Face
});
if (isError)
{
return DefaultApiResult.Error($"系统检测非本人更新,请重试(相似度{faceSimilarity})");
}
}
face.Face = request.Face;
@@ -278,6 +314,8 @@ public class GainfoFaceService : IGainfoFaceService
//生成任务
await _devicePermissionService.GenerateDeviceTasksAsync(gainfo.No, taskType, "照片上传生成");
return DefaultApiResult.Success("操作成功");
}
public async Task UploadFacesAsync(List<GainfoUploadFaceRequest> requests)
@@ -364,6 +402,27 @@ public class GainfoFaceService : IGainfoFaceService
return faceDictionary;
}
/// <inheritdoc />
public async Task<Pagination<FaceValidationResponse>> GetUploadPageRecordsAsync(FaceValidationRequest request)
{
return await _dbContext.Queryable<HikValidateResultEntity>()
.LeftJoin<GainfoEntity>((x, ga) => x.UserCode == ga.Code)
.WhereIF(request.IsSuccess.HasValue && request.IsSuccess.Value, x => x.AcceptSimilarity >= x.Similarity)
.WhereIF(request.IsSuccess is false, x => x.AcceptSimilarity < x.Similarity)
.WhereIF(request.Search.IsPresent(), (x, ga) => x.UserCode == request.Search || ga.Name.Contains(request.Search))
.Select((x, ga) => new FaceValidationResponse
{
UserCode = x.UserCode,
UserName = ga.Name,
Similarity = x.Similarity,
AcceptSimilarity = x.AcceptSimilarity,
CurrentFace = x.CurrentFace,
UploadFace = x.UploadFace,
CreateTime = x.CreateTime
})
.ToPageListAsync(request);
}
//*********************************************************************************************************************************************
/// <summary>