This commit is contained in:
owenchen committed 2026-10-17 21:08:10 +08:00
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);