feat 拍照对照片进行识别对比
This commit is contained in:
26
Src/Dlhis.Basic/HikService.cs
Normal file
26
Src/Dlhis.Basic/HikService.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
8
Src/Dlhis.Basic/IHikService.cs
Normal file
8
Src/Dlhis.Basic/IHikService.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using Dlhis.Basic.Organization.Request;
|
||||
|
||||
namespace Dlhis.Basic;
|
||||
|
||||
public interface IHikService : IScopeDependency
|
||||
{
|
||||
Task<double> GetSimilarityAsync(GainfoFaceValidateRequest request);
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
|
||||
namespace Dlhis.Basic.Organization.Request
|
||||
{
|
||||
public class FaceValidationRequest : PageDto
|
||||
{
|
||||
public bool? IsSuccess { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
8
Src/Dlhis.Basic/Organization/Response/HikResponse.cs
Normal file
8
Src/Dlhis.Basic/Organization/Response/HikResponse.cs
Normal 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; }
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user