ow
This commit is contained in:
1 parent
282d8ce583
commit
28dd3ffebd
229 files changed
+5765
-4786
No files matched your search
@@ -19,6 +19,7 @@ using SixLabors.ImageSharp;
|
||||
using SixLabors.ImageSharp.PixelFormats;
|
||||
using SixLabors.ImageSharp.Processing;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using static System.Net.Mime.MediaTypeNames;
|
||||
using Image = SixLabors.ImageSharp.Image;
|
||||
@@ -1129,6 +1130,103 @@ namespace CloudBuilder.Master.Service
|
||||
repositoryFolderMap.InsertNow(map);
|
||||
}
|
||||
|
||||
[PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
|
||||
[UnitOfWork]
|
||||
public FamilyPersonDisplayData UploadIdCardFile()
|
||||
{
|
||||
FamilyPersonDisplayData data = new FamilyPersonDisplayData();
|
||||
|
||||
//1) 先走原有分片上传落盘(FilePath 头指定 idcard 目录)
|
||||
UploadFile();
|
||||
|
||||
//2) 取本次上传文件,server-to-server 调 OCR 识别服务(无浏览器跨域)
|
||||
var file = httpContextAccessor.HttpContext?.Request?.Form?.Files?.FirstOrDefault();
|
||||
if (file == null || file.Length <= 0) return data;
|
||||
|
||||
//文件名(xxxx-1-1.ext 分片名)与识别面:side 以普通表单字段传入,缺省取配置
|
||||
data.IdCardFilename = file.FileName;
|
||||
string side = ServiceSettingsPolicy.GetIdCardOcrSide(service);
|
||||
if (httpContextAccessor.HttpContext.Request.Form.ContainsKey("side"))
|
||||
{
|
||||
var formSide = httpContextAccessor.HttpContext.Request.Form["side"].ToString();
|
||||
if (!string.IsNullOrWhiteSpace(formSide)) side = formSide;
|
||||
}
|
||||
|
||||
string apiUrl = ServiceSettingsPolicy.GetIdCardOcrApiUrl(service);
|
||||
if (string.IsNullOrWhiteSpace(apiUrl)) return data;
|
||||
|
||||
try
|
||||
{
|
||||
using var recognizeStream = file.OpenReadStream();
|
||||
using var form = new System.Net.Http.MultipartFormDataContent();
|
||||
var fileContent = new System.Net.Http.StreamContent(recognizeStream);
|
||||
fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(
|
||||
string.IsNullOrWhiteSpace(file.ContentType) ? "image/jpeg" : file.ContentType);
|
||||
form.Add(fileContent, "file", file.FileName);
|
||||
form.Add(new System.Net.Http.StringContent(side), "side");
|
||||
|
||||
using var client = new System.Net.Http.HttpClient();
|
||||
client.Timeout = TimeSpan.FromSeconds(ServiceSettingsPolicy.GetIdCardOcrTimeoutSeconds(service));
|
||||
using var response = client.PostAsync(apiUrl, form).GetAwaiter().GetResult();
|
||||
string json = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
|
||||
if (string.IsNullOrWhiteSpace(json)) return data;
|
||||
|
||||
using var doc = System.Text.Json.JsonDocument.Parse(json);
|
||||
var root = doc.RootElement;
|
||||
|
||||
//识别服务返回 { code:0, data:{... } },code!=0 视为未识别到,仅返回文件名
|
||||
int code = -1;
|
||||
if (root.TryGetProperty("code", out var codeEl) && codeEl.ValueKind == System.Text.Json.JsonValueKind.Number)
|
||||
code = codeEl.GetInt32();
|
||||
if (code != 0) return data;
|
||||
if (!root.TryGetProperty("data", out var info) || info.ValueKind != System.Text.Json.JsonValueKind.Object)
|
||||
return data;
|
||||
|
||||
string GetStr(string key)
|
||||
{
|
||||
if (info.TryGetProperty(key, out var el))
|
||||
{
|
||||
if (el.ValueKind == System.Text.Json.JsonValueKind.String) return el.GetString();
|
||||
if (el.ValueKind != System.Text.Json.JsonValueKind.Null && el.ValueKind != System.Text.Json.JsonValueKind.Undefined)
|
||||
return el.ToString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//常用名/民族/住址/身份证号/签发机关/有效期限(姓名映射到 CommonName 已在需求确认)
|
||||
data.CommonName = GetStr("name");
|
||||
data.Nation = GetStr("nation");
|
||||
data.Address = GetStr("address");
|
||||
data.IdNumber = GetStr("id_number");
|
||||
data.Issuer = GetStr("issuer");
|
||||
data.Validity = GetStr("validity");
|
||||
|
||||
//性别回传原始文本(如“男”),由前端按 GenderPolicy 匹配为策略编码,避免后端依赖运行时语言包
|
||||
data.Gender = GetStr("gender");
|
||||
|
||||
//出生日期:OCR 返回多为 yyyyMMdd,解析为 DateTime(Kind=Unspecified,避免时区偏移)
|
||||
var birth = GetStr("birth");
|
||||
if (!string.IsNullOrWhiteSpace(birth))
|
||||
{
|
||||
var digits = new string(birth.Where(char.IsDigit).ToArray());
|
||||
if (digits.Length >= 8
|
||||
&& DateTime.TryParseExact(digits.Substring(0, 8), "yyyyMMdd",
|
||||
System.Globalization.CultureInfo.InvariantCulture,
|
||||
DateTimeStyles.None, out var birthDate))
|
||||
{
|
||||
data.BirthDate = birthDate;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//OCR 调用失败不影响图片已上传:记录日志,返回仅含文件名的 data,前端据此提示“未识别到信息”
|
||||
Console.WriteLine($"[UploadIdCardFile] OCR recognize failed: {ex.Message}");
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
[PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
|
||||
[UnitOfWork]
|
||||
public void UploadFile()
|
||||
@@ -1386,7 +1484,7 @@ namespace CloudBuilder.Master.Service
|
||||
{
|
||||
DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
|
||||
|
||||
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey,entity.TranscodeIndc);
|
||||
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc);
|
||||
}
|
||||
|
||||
[PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
|
||||
@@ -1395,7 +1493,7 @@ namespace CloudBuilder.Master.Service
|
||||
IRepository<DmsFileDeleteLogEntity> repositoryDmsFileDeleteLog = repository.GetRepository<IRepository<DmsFileDeleteLogEntity>>();
|
||||
DmsFileDeleteLogEntity entity = repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
|
||||
|
||||
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey,entity.TranscodeIndc);
|
||||
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc);
|
||||
}
|
||||
|
||||
private string PackParameters(DmsFileEntity dmsFile)
|
||||
@@ -1436,14 +1534,14 @@ namespace CloudBuilder.Master.Service
|
||||
}
|
||||
|
||||
para = string.Format(service.Configuration[ServiceSettingsPolicy.FfmpegArguments], mp4Url, "", fullName);
|
||||
|
||||
|
||||
IRepository<SecurityScheduleTaskQueueEntity> logRepository = repository.GetRepository<IRepository<SecurityScheduleTaskQueueEntity>>();
|
||||
SecurityScheduleTaskQueueEntity task = new SecurityScheduleTaskQueueEntity();
|
||||
|
||||
task.DocumentId = documentId;
|
||||
task.TaskId = service.Configuration[ServiceSettingsPolicy.FfmpegPath];
|
||||
task.TaskParam = para;
|
||||
|
||||
|
||||
logRepository.InsertNow(task);
|
||||
|
||||
para = string.Format(service.Configuration[ServiceSettingsPolicy.FfmpegArguments], mp4Url, " -t 10", fullName);
|
||||
|
||||
Reference in new issue
Block a user