PatientDBService.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  1. using MongoDB.Driver;
  2. using System.Text;
  3. using VitalService.Common;
  4. using WingServerCommon.Mapper;
  5. using VitalService.Entities;
  6. using VitalService.Request;
  7. using WingInterfaceLibrary.Interface.DBVitalInterface;
  8. using WingInterfaceLibrary.Request.DBVitalRequest;
  9. using WingInterfaceLibrary.Enum.VitalEnum;
  10. using WingInterfaceLibrary.DTO.Vital;
  11. using WingInterfaceLibrary.Request;
  12. using System;
  13. using WingServerCommon.Log;
  14. using WingInterfaceLibrary.DB.Request;
  15. using System.Text.RegularExpressions;
  16. using WingInterfaceLibrary.Enum;
  17. namespace VitalService.Service
  18. {
  19. /// <summary>
  20. /// 居民数据服务
  21. /// </summary>
  22. public partial class VitalDatabaseService : IVitalPatientDBService
  23. {
  24. private IEncrypt _encryptInstance = new DBEncryptHelper();
  25. /// <summary>
  26. /// 创建居民数据
  27. /// </summary>
  28. /// <param name="request">创建请求</param>
  29. /// <returns></returns>
  30. public async Task<string> CreatePatientAsync(CreatePatientDBRequest request)
  31. {
  32. try
  33. {
  34. AddDoctorCode(request.OperationDoctor);
  35. StringBuilder logBuilder = new StringBuilder();
  36. var entity = request.MappingTo<PatientEntity>();
  37. var permissionInfo = await SetPatientRequestCreatedFrom(entity, request.OperationDoctor);
  38. if (permissionInfo.team == null || string.IsNullOrWhiteSpace(permissionInfo.team.Code))
  39. {
  40. ThrowRpcException(CustomerRpcCode.TeamNotSet, "Team not set");
  41. }
  42. if (!string.IsNullOrWhiteSpace(request.Code))
  43. {
  44. var filter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  45. var patientInfo = await _patientDBRepository.FindOneAsync(filter, null, false);
  46. if (patientInfo != null)
  47. {
  48. string doctorChange = string.Empty;
  49. string orgChange = string.Empty;
  50. string teamChange = string.Empty;
  51. patientInfo = Decrypt(patientInfo);
  52. var patientFilter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  53. var patientsUpdate = new List<UpdateDefinition<PatientEntity>>();
  54. if (!string.IsNullOrWhiteSpace(request.PatientName) && patientInfo.PatientName != request.PatientName)
  55. {
  56. logBuilder.AppendLine($"居民姓名从{patientInfo.PatientName}变更为{request.PatientName}");
  57. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.PatientName, _encryptInstance.Encrypt(request.PatientName)));
  58. }
  59. if (!string.IsNullOrWhiteSpace(request.PatientAddress) && patientInfo.PatientAddress != request.PatientAddress)
  60. {
  61. logBuilder.AppendLine($"居民地址从{patientInfo.PatientAddress}变更为{request.PatientAddress}");
  62. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.PatientAddress, _encryptInstance.Encrypt(request.PatientAddress)));
  63. }
  64. if (!string.IsNullOrWhiteSpace(request.PermanentResidenceAddress) && patientInfo.PermanentResidenceAddress != request.PermanentResidenceAddress)
  65. {
  66. logBuilder.AppendLine($"户籍地址从{patientInfo.PermanentResidenceAddress}变更为{request.PermanentResidenceAddress}");
  67. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.PermanentResidenceAddress, _encryptInstance.Encrypt(request.PermanentResidenceAddress)));
  68. }
  69. if (!string.IsNullOrWhiteSpace(request.Phone) && patientInfo.Phone != request.Phone)
  70. {
  71. logBuilder.AppendLine($"居民电话从{patientInfo.Phone}变更为{request.Phone}");
  72. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.Phone, _encryptInstance.Encrypt(request.Phone)));
  73. }
  74. if (!string.IsNullOrWhiteSpace(request.EmergencyName) && patientInfo.EmergencyName != request.EmergencyName)
  75. {
  76. logBuilder.AppendLine($"居民紧急联系人从{patientInfo.EmergencyName}变更为{request.EmergencyName}");
  77. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.EmergencyName, _encryptInstance.Encrypt(request.EmergencyName)));
  78. }
  79. if (!string.IsNullOrWhiteSpace(request.EmergencyPhone) && patientInfo.EmergencyPhone != request.EmergencyPhone)
  80. {
  81. logBuilder.AppendLine($"居民紧急联系电话从{patientInfo.EmergencyPhone}变更为{request.EmergencyPhone}");
  82. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.EmergencyPhone, _encryptInstance.Encrypt(request.EmergencyPhone)));
  83. }
  84. if (!string.IsNullOrWhiteSpace(request.Nationality) && patientInfo.Nationality != request.Nationality)
  85. {
  86. logBuilder.AppendLine($"民族从{patientInfo.Nationality}变更为{request.Nationality}");
  87. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.Nationality, request.Nationality));
  88. }
  89. if (request.Birthday != null && patientInfo.Birthday != request.Birthday)
  90. {
  91. logBuilder.AppendLine($"出生日期从{patientInfo.Birthday.ToString("yyyy-MM-dd")}变更为{request.Birthday.ToString("yyyy-MM-dd")}");
  92. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.Birthday, request.Birthday));
  93. }
  94. if (patientInfo.PatientGender != request.PatientGender)
  95. {
  96. logBuilder.AppendLine($"性别从{patientInfo.PatientGender}变更为{request.PatientGender}");
  97. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.PatientGender, request.PatientGender));
  98. }
  99. if (!string.IsNullOrWhiteSpace(entity.CreatedDoctor) && patientInfo.CreatedDoctor != entity.CreatedDoctor)
  100. {
  101. logBuilder.AppendLine($"建档医生从'{patientInfo.CreatedDoctor}'变更为'{entity.CreatedDoctor}';");
  102. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CreatedDoctor, entity.CreatedDoctor));
  103. AddDoctorCode(patientInfo.CreatedDoctor);
  104. }
  105. if (!string.IsNullOrWhiteSpace(entity.CreatedOrgCode) && patientInfo.CurrentOrgCode != entity.CreatedOrgCode)
  106. {
  107. logBuilder.AppendLine($"归档机构从'{patientInfo.CurrentOrgCode}'变更为'{entity.CreatedOrgCode}';");
  108. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CurrentOrgCode, entity.CreatedOrgCode));
  109. }
  110. if (!string.IsNullOrWhiteSpace(entity.CreatedTeamCode) && patientInfo.CurrentTeamCode != entity.CreatedTeamCode)
  111. {
  112. logBuilder.AppendLine($"归档团队从'{patientInfo.CurrentTeamCode}'变更为'{entity.CreatedTeamCode}';");
  113. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CurrentTeamCode, entity.CreatedTeamCode));
  114. }
  115. if (!AreEqual(patientInfo.CrowdLabels, entity.CrowdLabels))
  116. {
  117. logBuilder.AppendLine($"人群分类从'{string.Join(";", patientInfo.CrowdLabels ?? new List<string>())}'变更为'{string.Join(";", entity.CrowdLabels ?? new List<string>())}';");
  118. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CrowdLabels, entity.CrowdLabels ?? new List<string>()));
  119. }
  120. if (!string.IsNullOrWhiteSpace(entity.ArchivedDoctorName) && patientInfo.ArchivedDoctorName != entity.ArchivedDoctorName)
  121. {
  122. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.ArchivedDoctorName, entity.ArchivedDoctorName));
  123. }
  124. Logger.WriteLineWarn($"VitalPatientDBService CreatePatientAsync update, request: {Newtonsoft.Json.JsonConvert.SerializeObject(entity)}");
  125. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.IsDelete, false));
  126. if (logBuilder.Length > 0)
  127. {
  128. Logger.WriteLineInfo($"{logBuilder}");
  129. }
  130. var updateAll = Builders<PatientEntity>.Update.Combine(patientsUpdate);
  131. await _patientDBRepository.UpdateOneAsync(patientFilter, updateAll, false);
  132. return patientInfo.Code;
  133. }
  134. }
  135. entity = Encrypt(entity);
  136. entity.CurrentOrgCode = entity.CreatedOrgCode;
  137. entity.CurrentTeamCode = entity.CreatedTeamCode;
  138. Logger.WriteLineWarn($"VitalPatientDBService CreatePatientAsync insert, request: {Newtonsoft.Json.JsonConvert.SerializeObject(entity)}");
  139. return await _patientDBRepository.InsertOneAsync(entity);
  140. }
  141. catch (Exception ex)
  142. {
  143. Logger.WriteLineWarn($"VitalPatientDBService CreatePatientAsync failed, ex:{ex}, request: {Newtonsoft.Json.JsonConvert.SerializeObject(request)}");
  144. }
  145. return string.Empty;
  146. }
  147. /// <summary>
  148. /// 根据编码获取居民数据
  149. /// </summary>
  150. /// <param name="request">获取请求</param>
  151. /// <returns></returns>
  152. public async Task<PatientDTO> GetPatientDetailAsync(GetPatientDBRequest request)
  153. {
  154. var filter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  155. if (request.IsValidOperationDoctor)
  156. {
  157. filter = await AddPermissionPatientFilter(filter, request.OperationDoctor);
  158. }
  159. var result = await _patientDBRepository.FindOneAsync(filter);
  160. return await ConvertToDTO(result);
  161. }
  162. /// <summary>
  163. /// 根据编码获取居民数据
  164. /// </summary>
  165. /// <param name="request">获取请求</param>
  166. /// <returns></returns>
  167. public async Task<PatientDTO> GetPatientByCodeAsync(GetPatientByCodeDBRequest request)
  168. {
  169. var filter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  170. var result = await _patientDBRepository.FindOneAsync(filter);
  171. return await ConvertToDTO(result);
  172. }
  173. /// <summary>
  174. /// 根据编码获取居民数据如非同一团队则迁移人员
  175. /// </summary>
  176. /// <param name="request">获取请求</param>
  177. /// <returns></returns>
  178. public async Task<PatientDTO> GetPatientDetailOrMoveAsync(GetPatientDBRequest request)
  179. {
  180. var filter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  181. filter = await AddPermissionPatientFilter(filter, request.OperationDoctor);
  182. var result = await _patientDBRepository.FindOneAsync(filter);
  183. if (result == null)
  184. {
  185. filter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  186. var patientInfo = await _patientDBRepository.FindOneAsync(filter);
  187. if (patientInfo != null)
  188. {
  189. string doctorChange = string.Empty;
  190. string orgChange = string.Empty;
  191. string teamChange = string.Empty;
  192. var oldPatientInfo = Decrypt(patientInfo);
  193. var newPatientInfo = new PatientEntity();
  194. await SetPatientRequestCreatedFrom(newPatientInfo, request.OperationDoctor);
  195. var patientFilter = Builders<PatientEntity>.Filter.Eq(x => x.Code, request.Code);
  196. var patientsUpdate = new List<UpdateDefinition<PatientEntity>>();
  197. if (!string.IsNullOrWhiteSpace(newPatientInfo.CreatedDoctor) && patientInfo.CreatedDoctor != newPatientInfo.CreatedDoctor)
  198. {
  199. doctorChange = $"建档医生从'{patientInfo.CreatedDoctor}'变更为'{newPatientInfo.CreatedDoctor}';";
  200. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CreatedDoctor, newPatientInfo.CreatedDoctor));
  201. }
  202. if (!string.IsNullOrWhiteSpace(newPatientInfo.CreatedOrgCode) && patientInfo.CurrentOrgCode != newPatientInfo.CreatedOrgCode)
  203. {
  204. orgChange = $"建档机构从'{patientInfo.CurrentOrgCode}'变更为'{newPatientInfo.CreatedOrgCode}';";
  205. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CurrentOrgCode, newPatientInfo.CreatedOrgCode));
  206. }
  207. if (!string.IsNullOrWhiteSpace(newPatientInfo.CreatedTeamCode) && patientInfo.CurrentTeamCode != newPatientInfo.CreatedTeamCode)
  208. {
  209. teamChange = $"建档团队从'{patientInfo.CurrentTeamCode}'变更为'{newPatientInfo.CreatedTeamCode}';";
  210. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.CurrentTeamCode, newPatientInfo.CreatedTeamCode));
  211. }
  212. if (!string.IsNullOrWhiteSpace(newPatientInfo.ArchivedDoctorName) && patientInfo.ArchivedDoctorName != newPatientInfo.ArchivedDoctorName)
  213. {
  214. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.ArchivedDoctorName, newPatientInfo.ArchivedDoctorName));
  215. }
  216. patientsUpdate.Add(Builders<PatientEntity>.Update.Set(x => x.IsDelete, false));
  217. if (!string.IsNullOrWhiteSpace(doctorChange) || !string.IsNullOrWhiteSpace(orgChange) || !string.IsNullOrWhiteSpace(teamChange))
  218. {
  219. Logger.WriteLineInfo($"{orgChange}{teamChange}{doctorChange}");
  220. }
  221. var updateAll = Builders<PatientEntity>.Update.Combine(patientsUpdate);
  222. if (await _patientDBRepository.UpdateOneAsync(filter, updateAll, false) > 0)
  223. {
  224. await SetPatientRequestCreatedFrom(patientInfo, request.OperationDoctor);
  225. result = patientInfo;
  226. }
  227. }
  228. }
  229. return await ConvertToDTO(result);
  230. }
  231. /// <summary>
  232. /// 根据关键字段获取居民数据
  233. /// </summary>
  234. /// <param name="request">获取请求</param>
  235. /// <returns></returns>
  236. public async Task<PatientDTO> GetPatientDetailByKeyAsync(GetPatientByKeyDBRequest request)
  237. {
  238. var filter = Builders<PatientEntity>.Filter.Eq(request.Key, request.Value);
  239. filter = await AddPermissionPatientFilter(filter, request.OperationDoctor);
  240. var result = await _patientDBRepository.FindOneAsync(filter);
  241. return await ConvertToDTO(result);
  242. }
  243. /// <summary>
  244. /// 获取居民数据分页
  245. /// </summary>
  246. /// <param name="request">分页请求</param>
  247. /// <returns></returns>
  248. public async Task<PageCollection<PatientDTO>> GetPatientPageAsync(PatientPageDBRequest request)
  249. {
  250. var filter = await _patientDBRepository.GetPageFilter(request);
  251. filter = await AddPermissionPatientFilter(filter, request.OperationDoctor);
  252. if (request.CrowdLabels != null && request.CrowdLabels.Count > 0)
  253. {
  254. var crowdLabelsFilter = Builders<PatientEntity>.Filter.AnyIn(f => f.CrowdLabels, request.CrowdLabels);
  255. filter = Builders<PatientEntity>.Filter.And(filter, crowdLabelsFilter);
  256. }
  257. if (request.PatientCodes != null && request.PatientCodes.Count > 0)
  258. {
  259. var patientCodesFilter = Builders<PatientEntity>.Filter.In(f => f.Code, request.PatientCodes);
  260. filter = Builders<PatientEntity>.Filter.And(filter, patientCodesFilter);
  261. }
  262. var pageFilter = new DBPageRequest<PatientEntity>
  263. {
  264. PageIndex = request.PageIndex,
  265. PageSize = request.PageSize,
  266. Filter = filter,
  267. Sort = Builders<PatientEntity>.Sort.Descending(x => x.UpdateTime)
  268. };
  269. var result = await _patientDBRepository.GetPages(pageFilter);
  270. var data = await ConvertToDTOPage(result);
  271. return data;
  272. }
  273. /// <summary>
  274. /// 删除居民数据
  275. /// </summary>
  276. /// <param name="request">删除请求</param>
  277. /// <returns></returns>
  278. public async Task<bool> RemovePatientAsync(RemovePatientDBRequest request)
  279. {
  280. AddDoctorCode(request.OperationDoctor);
  281. var filter2 = Builders<PatientEntity>.Filter.Eq(f => f.Code, request.Code);
  282. var update = Builders<PatientEntity>.Update
  283. .Set(f => f.IsDelete, true)
  284. .Set(f => f.Photos, new List<string>())
  285. .Set(f => f.UpdateTime, DateTime.UtcNow);
  286. return await _patientDBRepository.UpdateOneAsync(filter2, update, false) > 0;
  287. }
  288. /// <summary>
  289. /// 删除多个居民数据
  290. /// </summary>
  291. /// <param name="request">删除请求</param>
  292. /// <returns></returns>
  293. public async Task<long> RemovePatientListAsync(RemovePatientListDBRequest request)
  294. {
  295. AddDoctorCode(request.OperationDoctor);
  296. var filter = new List<(string key, string val)>();
  297. foreach (var code in request.Codes)
  298. {
  299. filter.Add(("Code", code));
  300. }
  301. return await _patientDBRepository.DeleteAllAsync(filter);
  302. }
  303. /// <summary>
  304. /// 获取居民数据列表
  305. /// </summary>
  306. /// <param name="request">列表请求</param>
  307. /// <returns></returns>
  308. public async Task<List<PatientDTO>> GetPatientListAsync(GetPatientListDBRequest request)
  309. {
  310. var filter = Builders<PatientEntity>.Filter.In(f => f.Code, request.Codes);
  311. if (request.IsValidOperationDoctor)
  312. {
  313. filter = await AddPermissionPatientFilter(filter, request.OperationDoctor);
  314. }
  315. var result = await _patientDBRepository.FindAllAsync(filter, new FindOptions<PatientEntity> { Sort = Builders<PatientEntity>.Sort.Descending(f => f.UpdateTime) });
  316. return await ConvertToDTOList(result);
  317. }
  318. /// <summary>
  319. /// 根据关键字段获取居民数据列表
  320. /// </summary>
  321. /// <param name="request">列表请求</param>
  322. /// <returns></returns>
  323. public async Task<List<PatientDTO>> GetPatientListByKeyAsync(GetPatientListByKeyDBRequest request)
  324. {
  325. var filter = Builders<PatientEntity>.Filter.Eq(request.Key, request.Value);
  326. filter = await AddPermissionPatientFilter(filter, request.OperationDoctor);
  327. var result = await _patientDBRepository.FindAllAsync(filter, new FindOptions<PatientEntity> { Sort = Builders<PatientEntity>.Sort.Descending(f => f.UpdateTime) });
  328. return await ConvertToDTOList(result);
  329. }
  330. /// <summary>
  331. /// 更新居民数据
  332. /// </summary>
  333. /// <param name="request">更新请求</param>
  334. /// <returns></returns>
  335. public async Task<bool> UpdatePatientAsync(UpdatePatientDBRequest request)
  336. {
  337. AddDoctorCode(request.OperationDoctor);
  338. var filter = Builders<PatientEntity>.Filter.Eq(f => f.Code, request.Code);
  339. var updates = new List<UpdateDefinition<PatientEntity>>();
  340. if (request.PatientName != "-1")
  341. {
  342. updates.Add(Builders<PatientEntity>.Update.Set(f => f.PatientName, _encryptInstance.Encrypt(request.PatientName)));
  343. }
  344. if (request.Phone != "-1")
  345. {
  346. updates.Add(Builders<PatientEntity>.Update.Set(f => f.Phone, _encryptInstance.Encrypt(request.Phone)));
  347. }
  348. if (request.EmergencyPhone != "-1")
  349. {
  350. updates.Add(Builders<PatientEntity>.Update.Set(f => f.EmergencyPhone, _encryptInstance.Encrypt(request.EmergencyPhone)));
  351. }
  352. if (request.EmergencyName != "-1")
  353. {
  354. updates.Add(Builders<PatientEntity>.Update.Set(f => f.EmergencyName, _encryptInstance.Encrypt(request.EmergencyName)));
  355. }
  356. if (request.CardNo != "-1")
  357. {
  358. updates.Add(Builders<PatientEntity>.Update.Set(f => f.CardNo, _encryptInstance.Encrypt(request.CardNo)));
  359. }
  360. if (request.Nationality != "-1")
  361. {
  362. updates.Add(Builders<PatientEntity>.Update.Set(f => f.Nationality, request.Nationality));
  363. }
  364. if (request.PatientAddress != "-1")
  365. {
  366. updates.Add(Builders<PatientEntity>.Update.Set(f => f.PatientAddress, _encryptInstance.Encrypt(request.PatientAddress)));
  367. }
  368. if (request.PermanentResidenceAddress != "-1")
  369. {
  370. updates.Add(Builders<PatientEntity>.Update.Set(f => f.PermanentResidenceAddress, _encryptInstance.Encrypt(request.PermanentResidenceAddress)));
  371. }
  372. if (request.TeamRegionCode != "-1")
  373. {
  374. updates.Add(Builders<PatientEntity>.Update.Set(f => f.TeamRegionCode, request.TeamRegionCode));
  375. }
  376. if (request.ContractedDoctor != "-1")
  377. {
  378. updates.Add(Builders<PatientEntity>.Update.Set(f => f.ContractedDoctor, request.ContractedDoctor));
  379. }
  380. if (request.PatientGender != null)
  381. {
  382. updates.Add(Builders<PatientEntity>.Update.Set(f => f.PatientGender, request.PatientGender));
  383. }
  384. if (request.CardType != null)
  385. {
  386. updates.Add(Builders<PatientEntity>.Update.Set(f => f.CardType, request.CardType));
  387. }
  388. if (request.CrowdLabels != null)
  389. {
  390. updates.Add(Builders<PatientEntity>.Update.Set(f => f.CrowdLabels, request.CrowdLabels));
  391. }
  392. if (request.Birthday != null)
  393. {
  394. updates.Add(Builders<PatientEntity>.Update.Set(f => f.Birthday, request.Birthday));
  395. }
  396. updates.Add(Builders<PatientEntity>.Update.Set(f => f.IsDelete, false));
  397. var update = Builders<PatientEntity>.Update.Combine(updates);
  398. return await _patientDBRepository.UpdateOneAsync(filter, update) > 0;
  399. }
  400. /// <summary>
  401. /// 更新居民照片数据
  402. /// </summary>
  403. /// <param name="request">更新请求</param>
  404. /// <returns>true</returns>
  405. public async Task<bool> UpdatePatientPhotosAsync(UpdatePatientPhotosDBRequest request)
  406. {
  407. var filter = Builders<PatientEntity>.Filter.Eq(f => f.Code, request.Code);
  408. var update = Builders<PatientEntity>.Update.Set(s => s.Photos, request.Photos).Set(s => s.UpdateTime, DateTime.UtcNow);
  409. return await _patientDBRepository.UpdateOneAsync(filter, update) > 0;
  410. }
  411. public async Task<PatientStatisticDTO> GetPatientStatisticDBAsync(GetPatientStatisticDBRequest request)
  412. {
  413. var filter = Builders<UserEntity>.Filter.Eq(f => f.Code, request.OperationDoctor);
  414. var user = await _userDBRepository.FindOneAsync(filter);
  415. var teamCode = user.TeamCode;
  416. var teamPatientsFilter = Builders<PatientEntity>.Filter.Eq(f => f.CurrentTeamCode, teamCode);
  417. var teamPatients = await _patientDBRepository.FindAllAsync(teamPatientsFilter, new FindOptions<PatientEntity> { Projection = Builders<PatientEntity>.Projection.Include(p => p.CreateTime).Include(p => p.Code) });
  418. var dto = new PatientStatisticDTO();
  419. dto.Count = teamPatients.Count();
  420. dto.TodayCount = teamPatients.Where(w => w.CreateTime.ToLocalTime().Date == DateTime.Now.Date).Count();
  421. return dto;
  422. }
  423. /// <summary>
  424. /// 分页查询增量居民信息集合
  425. /// </summary>
  426. /// <returns></returns>
  427. public async Task<PageCollection<PatientDTO>> FindPatientByUpdateTimeDBAsync(FindCollectionByTimeDBRequest request)
  428. {
  429. var startTime = request.StartTime;
  430. var pageIndex = request.PageIndex;
  431. var pageSize = request.PageSize;
  432. var builder = Builders<PatientEntity>.Filter;
  433. var filter = builder.Where(c => c.UpdateTime > startTime);
  434. var pageFilter = new DBPageRequest<PatientEntity>
  435. {
  436. PageIndex = request.PageIndex,
  437. PageSize = request.PageSize,
  438. Filter = filter,
  439. Sort = Builders<PatientEntity>.Sort.Ascending(x => x.UpdateTime)
  440. };
  441. var pagedResult = await _patientDBRepository.GetPages(pageFilter, onlyNotDeleted: false);
  442. var pageData = new List<PatientDTO>();
  443. if (pagedResult.PageData?.Any() ?? false)
  444. {
  445. foreach (var entity in pagedResult.PageData)
  446. {
  447. var dto = entity.MappingTo<PatientDTO>();
  448. pageData.Add(dto);
  449. }
  450. }
  451. var result = new PageCollection<PatientDTO>
  452. {
  453. DataCount = pagedResult.DataCount,
  454. CurrentPage = pagedResult.CurrentPage,
  455. PageSize = pagedResult.PageSize,
  456. PageData = pageData,
  457. };
  458. return result;
  459. }
  460. /// <summary>
  461. /// 保存居民记录
  462. /// </summary>
  463. /// <returns></returns>
  464. public async Task<bool> SavePatientInfoDBAsync(PatientDTO request)
  465. {
  466. try
  467. {
  468. var code = request.Code;
  469. var patientDO = request.MappingTo<PatientEntity>();
  470. var filter = Builders<PatientEntity>.Filter.Eq(f => f.Code, code);
  471. var entity = await _patientDBRepository.FindOneAsync(filter, onlyNotDeleted: false);
  472. if (entity != null && !string.IsNullOrWhiteSpace(entity.Code))
  473. {
  474. var filter2 = Builders<PatientEntity>.Filter.Eq(f => f.Code, code);
  475. var update = Builders<PatientEntity>.Update
  476. .Set(f => f.RecordNo, patientDO.RecordNo)
  477. .Set(f => f.PatientName, patientDO.PatientName)
  478. .Set(f => f.Phone, patientDO.Phone)
  479. .Set(f => f.EmergencyPhone, patientDO.EmergencyPhone)
  480. .Set(f => f.EmergencyName, patientDO.EmergencyName)
  481. .Set(f => f.CardNo, patientDO.CardNo)
  482. .Set(f => f.Nationality, patientDO.Nationality)
  483. .Set(f => f.Birthday, patientDO.Birthday)
  484. .Set(f => f.CrowdLabels, patientDO.CrowdLabels)
  485. .Set(f => f.CardType, patientDO.CardType)
  486. .Set(f => f.PatientGender, patientDO.PatientGender)
  487. .Set(f => f.PatientAddress, patientDO.PatientAddress)
  488. .Set(f => f.PermanentResidenceAddress, patientDO.PermanentResidenceAddress)
  489. .Set(f => f.TeamRegionCode, patientDO.TeamRegionCode)
  490. .Set(f => f.ContractedDoctor, patientDO.ContractedDoctor)
  491. .Set(f => f.Status, patientDO.Status)
  492. .Set(f => f.Photos, patientDO.Photos)
  493. .Set(f => f.CurrentTeamCode, patientDO.CurrentTeamCode)
  494. .Set(f => f.CurrentOrgCode, patientDO.CurrentOrgCode)
  495. .Set(f => f.CreatedOrgCode, patientDO.CreatedOrgCode)
  496. .Set(f => f.CreatedTeamCode, patientDO.CreatedTeamCode)
  497. .Set(f => f.CreatedDoctor, patientDO.CreatedDoctor)
  498. .Set(f => f.ArchivedDoctorName, patientDO.ArchivedDoctorName)
  499. .Set(f => f.IsDelete, patientDO.IsDelete)
  500. .Set(f => f.CreateTime, patientDO.CreateTime)
  501. .Set(f => f.UpdateTime, patientDO.UpdateTime);
  502. await _patientDBRepository.UpdateOneAsync(filter2, update, false, false);
  503. }
  504. else
  505. {
  506. await _patientDBRepository.InsertOneAsync(patientDO, false);
  507. }
  508. }
  509. catch (Exception ex)
  510. {
  511. Logger.WriteLineWarn($"ExamDBService SavePatientInfoDBAsync failed, ex:{ex}");
  512. }
  513. return true;
  514. }
  515. /// <summary>
  516. /// 加密
  517. /// </summary>
  518. /// <param name="entity"></param>
  519. /// <returns></returns>
  520. private PatientEntity Encrypt(PatientEntity entity)
  521. {
  522. if (!string.IsNullOrWhiteSpace(entity.CardNo))
  523. {
  524. entity.CardNo = _encryptInstance.Encrypt(entity.CardNo);
  525. }
  526. if (!string.IsNullOrWhiteSpace(entity.PatientAddress))
  527. {
  528. entity.PatientAddress = _encryptInstance.Encrypt(entity.PatientAddress);
  529. }
  530. if (!string.IsNullOrWhiteSpace(entity.PermanentResidenceAddress))
  531. {
  532. entity.PermanentResidenceAddress = _encryptInstance.Encrypt(entity.PermanentResidenceAddress);
  533. }
  534. if (!string.IsNullOrWhiteSpace(entity.PatientName))
  535. {
  536. entity.PatientName = _encryptInstance.Encrypt(entity.PatientName);
  537. }
  538. if (!string.IsNullOrWhiteSpace(entity.Phone))
  539. {
  540. entity.Phone = _encryptInstance.Encrypt(entity.Phone);
  541. }
  542. if (!string.IsNullOrWhiteSpace(entity.EmergencyPhone))
  543. {
  544. entity.EmergencyPhone = _encryptInstance.Encrypt(entity.EmergencyPhone);
  545. }
  546. if (!string.IsNullOrWhiteSpace(entity.EmergencyName))
  547. {
  548. entity.EmergencyName = _encryptInstance.Encrypt(entity.EmergencyName);
  549. }
  550. return entity;
  551. }
  552. /// <summary>
  553. /// 解密
  554. /// </summary>
  555. /// <param name="entity"></param>
  556. /// <returns></returns>
  557. private PatientDTO Decrypt(PatientDTO dto)
  558. {
  559. if (!string.IsNullOrWhiteSpace(dto.CardNo))
  560. {
  561. dto.CardNo = _encryptInstance.Decrypt(dto.CardNo);
  562. }
  563. if (!string.IsNullOrWhiteSpace(dto.PatientAddress))
  564. {
  565. dto.PatientAddress = _encryptInstance.Decrypt(dto.PatientAddress);
  566. }
  567. if (!string.IsNullOrWhiteSpace(dto.PermanentResidenceAddress))
  568. {
  569. dto.PermanentResidenceAddress = _encryptInstance.Decrypt(dto.PermanentResidenceAddress);
  570. }
  571. if (!string.IsNullOrWhiteSpace(dto.PatientName))
  572. {
  573. dto.PatientName = _encryptInstance.Decrypt(dto.PatientName);
  574. }
  575. if (!string.IsNullOrWhiteSpace(dto.Phone))
  576. {
  577. dto.Phone = _encryptInstance.Decrypt(dto.Phone);
  578. }
  579. if (!string.IsNullOrWhiteSpace(dto.EmergencyPhone))
  580. {
  581. dto.EmergencyPhone = _encryptInstance.Decrypt(dto.EmergencyPhone);
  582. }
  583. if (!string.IsNullOrWhiteSpace(dto.EmergencyName))
  584. {
  585. dto.EmergencyName = _encryptInstance.Decrypt(dto.EmergencyName);
  586. }
  587. return dto;
  588. }
  589. /// <summary>
  590. /// 解密
  591. /// </summary>
  592. /// <param name="entity"></param>
  593. /// <returns></returns>
  594. private PatientEntity Decrypt(PatientEntity entity)
  595. {
  596. if (!string.IsNullOrWhiteSpace(entity.CardNo))
  597. {
  598. entity.CardNo = _encryptInstance.Decrypt(entity.CardNo);
  599. }
  600. if (!string.IsNullOrWhiteSpace(entity.PatientAddress))
  601. {
  602. entity.PatientAddress = _encryptInstance.Decrypt(entity.PatientAddress);
  603. }
  604. if (!string.IsNullOrWhiteSpace(entity.PermanentResidenceAddress))
  605. {
  606. entity.PermanentResidenceAddress = _encryptInstance.Decrypt(entity.PermanentResidenceAddress);
  607. }
  608. if (!string.IsNullOrWhiteSpace(entity.PatientName))
  609. {
  610. entity.PatientName = _encryptInstance.Decrypt(entity.PatientName);
  611. }
  612. if (!string.IsNullOrWhiteSpace(entity.Phone))
  613. {
  614. entity.Phone = _encryptInstance.Decrypt(entity.Phone);
  615. }
  616. if (!string.IsNullOrWhiteSpace(entity.EmergencyName))
  617. {
  618. entity.EmergencyName = _encryptInstance.Decrypt(entity.EmergencyName);
  619. }
  620. if (!string.IsNullOrWhiteSpace(entity.EmergencyPhone))
  621. {
  622. entity.EmergencyPhone = _encryptInstance.Decrypt(entity.EmergencyPhone);
  623. }
  624. return entity;
  625. }
  626. private async Task<PatientDTO> ConvertToDTO(PatientEntity entity)
  627. {
  628. if (entity == null) return null;
  629. var dto = entity.MappingTo<PatientDTO>();
  630. if (!string.IsNullOrWhiteSpace(entity.CurrentOrgCode))
  631. {
  632. var filter = Builders<OrganizationEntity>.Filter.Eq(f => f.Code, entity.CurrentOrgCode);
  633. var org = await _organizationDBRepository.FindOneAsync(filter);
  634. dto.CreatedOrgName = org?.OrganizationName;
  635. }
  636. if (!string.IsNullOrWhiteSpace(entity.CurrentTeamCode))
  637. {
  638. var filter = Builders<TeamEntity>.Filter.Eq(f => f.Code, entity.CurrentTeamCode);
  639. var team = await _teamDBRepository.FindOneAsync(filter);
  640. dto.CreatedTeamName = team?.TeamName;
  641. }
  642. if (!string.IsNullOrWhiteSpace(entity.Code))
  643. {
  644. var filter = Builders<ContractRecordEntity>.Filter.Eq(f => f.ContractedPatient, entity.Code);
  645. var contractRecord = await _contractRecordDBRepository.FindOneAsync(filter);
  646. if (!string.IsNullOrWhiteSpace(contractRecord?.ContractedDoctor))
  647. {
  648. var filterUser = Builders<UserEntity>.Filter.Eq(f => f.Code, contractRecord?.ContractedDoctor);
  649. var userInfo = await _userDBRepository.FindOneAsync(filterUser);
  650. dto.ContractedDoctorName = !string.IsNullOrWhiteSpace(userInfo.RealName) ? userInfo.RealName : userInfo.UserName;
  651. }
  652. }
  653. if (!string.IsNullOrWhiteSpace(entity.CreatedDoctor))
  654. {
  655. var filter = Builders<UserEntity>.Filter.Eq(f => f.Code, entity.CreatedDoctor);
  656. var userInfo = await _userDBRepository.FindOneAsync(filter);
  657. if (userInfo != null && !string.IsNullOrWhiteSpace(userInfo.Code))
  658. {
  659. dto.CreatedDoctorName = !string.IsNullOrWhiteSpace(userInfo.RealName) ? userInfo.RealName : userInfo.UserName;
  660. }
  661. }
  662. if (string.IsNullOrWhiteSpace(dto.CreatedDoctorName))
  663. {
  664. dto.CreatedDoctorName = dto.ArchivedDoctorName;
  665. }
  666. FillingPersopnType(entity);
  667. dto.CrowdLabels = entity.CrowdLabels;
  668. if (entity.CrowdLabels != null && entity.CrowdLabels.Count > 0)
  669. {
  670. var filterLabel = Builders<LabelEntity>.Filter.In(f => f.LabelTypeKey, new List<string> { "RQFL", "CJJB", "TSZG" });
  671. var labels = await _labelDBRepository.FindAllAsync(filterLabel);
  672. dto.LabelNames = labels?.Where(w => entity.CrowdLabels.Contains(w.Code)).Select(f => f.LabelName).ToList();
  673. }
  674. if (!string.IsNullOrWhiteSpace(entity.Code))
  675. {
  676. var contractFilter = Builders<ContractRecordEntity>.Filter.Eq(f => f.ContractedPatient, entity.Code);
  677. var contract = await _contractRecordDBRepository.FindOneAsync(contractFilter, new FindOptions<ContractRecordEntity> { Sort = Builders<ContractRecordEntity>.Sort.Descending(f => f.UpdateTime) });
  678. dto.ContractState = contract?.ContractState ?? ContractStateEnum.Unsigned;
  679. }
  680. return Decrypt(dto);
  681. }
  682. private async Task<List<PatientDTO>> ConvertToDTOList(List<PatientEntity> entitys)
  683. {
  684. if (entitys == null || entitys.Count == 0) return new List<PatientDTO>();
  685. var userCodes = entitys.Select(f => f.ContractedDoctor).Union(entitys.Select(f => f.CreatedDoctor)).Distinct();
  686. var filterUsers = Builders<UserEntity>.Filter.In(f => f.Code, userCodes);
  687. var usersInfo = await _userDBRepository.FindAllAsync(filterUsers);
  688. var orgCodes = usersInfo.Select(u => u.OrganizationCode).Union(entitys.Select(f => f.CreatedOrgCode)).Union(entitys.Select(f => f.CurrentOrgCode)).Distinct();
  689. var filterOrgs = Builders<OrganizationEntity>.Filter.In(f => f.Code, orgCodes);
  690. var orgsInfo = await _organizationDBRepository.FindAllAsync(filterOrgs);
  691. var teamCodes = entitys.Select(f => f.CurrentTeamCode).Union(entitys.Select(f => f.CreatedTeamCode)).Union(entitys.Select(f => f.CurrentTeamCode)).Distinct();
  692. var filterTeams = Builders<TeamEntity>.Filter.In(f => f.Code, teamCodes);
  693. var teamsInfo = await _teamDBRepository.FindAllAsync(filterTeams);
  694. var filterLabel = Builders<LabelEntity>.Filter.In(f => f.LabelTypeKey, new List<string> { "RQFL", "CJJB", "TSZG" });
  695. var labels = await _labelDBRepository.FindAllAsync(filterLabel);
  696. var patientCodes = entitys.Select(f => f.Code).Distinct();
  697. var contractFilter = Builders<ContractRecordEntity>.Filter.In(f => f.ContractedPatient, patientCodes);
  698. var contracts = await _contractRecordDBRepository.FindAllAsync(contractFilter, new FindOptions<ContractRecordEntity> { Projection = Builders<ContractRecordEntity>.Projection.Exclude(f => f.ContractedFileUrl).Exclude(f => f.Photos) });
  699. var resultList = new List<PatientDTO>();
  700. foreach (var entity in entitys)
  701. {
  702. if (entity == null)
  703. {
  704. continue;
  705. }
  706. var record = entity.MappingTo<PatientDTO>();
  707. if (!string.IsNullOrWhiteSpace(entity.ContractedDoctor))
  708. {
  709. var userInfo = usersInfo.FirstOrDefault(w => w.Code == entity.ContractedDoctor);
  710. record.ContractedDoctorName = !string.IsNullOrWhiteSpace(userInfo?.RealName) ? userInfo.RealName : userInfo?.UserName;
  711. }
  712. if (!string.IsNullOrWhiteSpace(entity.CreatedDoctor))
  713. {
  714. var userInfo = usersInfo.FirstOrDefault(w => w.Code == entity.CreatedDoctor);
  715. record.CreatedDoctorName = !string.IsNullOrWhiteSpace(userInfo?.RealName) ? userInfo.RealName : userInfo?.UserName;
  716. }
  717. if (string.IsNullOrWhiteSpace(record.CreatedDoctorName))
  718. {
  719. record.CreatedDoctorName = record.ArchivedDoctorName;
  720. }
  721. if (!string.IsNullOrWhiteSpace(entity.CurrentOrgCode))
  722. {
  723. var orgInfo = orgsInfo.FirstOrDefault(w => w.Code == entity.CurrentOrgCode);
  724. record.CreatedOrgName = orgInfo?.OrganizationName;
  725. }
  726. if (!string.IsNullOrWhiteSpace(entity.CurrentTeamCode))
  727. {
  728. var teamInfo = teamsInfo.FirstOrDefault(w => w.Code == entity.CurrentTeamCode);
  729. record.CreatedTeamName = teamInfo?.TeamName;
  730. }
  731. FillingPersopnType(entity);
  732. record.CrowdLabels = entity.CrowdLabels;
  733. if (entity.CrowdLabels != null && entity.CrowdLabels.Count > 0)
  734. {
  735. record.LabelNames = labels?.Where(w => entity.CrowdLabels?.Contains(w.Code) == true).Select(f => f.LabelName).ToList();
  736. }
  737. if (!string.IsNullOrWhiteSpace(entity.Code))
  738. {
  739. record.ContractState = contracts?.Where(w => entity.Code == w.ContractedPatient).OrderByDescending(o => o.UpdateTime).FirstOrDefault()?.ContractState ?? ContractStateEnum.Unsigned;
  740. }
  741. resultList.Add(Decrypt(record));
  742. }
  743. return resultList;
  744. }
  745. private async Task<PageCollection<PatientDTO>> ConvertToDTOPage(PageCollection<PatientEntity> entitys)
  746. {
  747. var resultPage = new PageCollection<PatientDTO>
  748. {
  749. DataCount = entitys.DataCount,
  750. CurrentPage = entitys.CurrentPage,
  751. PageSize = entitys.PageSize,
  752. PageData = await ConvertToDTOList(entitys.PageData)
  753. };
  754. return resultPage;
  755. }
  756. private async Task<FilterDefinition<PatientEntity>> AddPermissionPatientFilter(FilterDefinition<PatientEntity> filter, string userCode, bool skipTeamVerify = false)
  757. {
  758. var (user, org, team) = await VerifyPermission(userCode, skipTeamVerify);
  759. if (user.RoleCode != "Role_SystemAdministrator")
  760. {
  761. FilterDefinition<PatientEntity> orFilter = null;
  762. if (user.RoleCode != "Role_HeadOfInstitution")
  763. {
  764. orFilter = Builders<PatientEntity>.Filter.Or(
  765. Builders<PatientEntity>.Filter.And(Builders<PatientEntity>.Filter.Eq(x => x.CurrentOrgCode, user.OrganizationCode), Builders<PatientEntity>.Filter.Eq(x => x.CurrentTeamCode, user.TeamCode)),
  766. Builders<PatientEntity>.Filter.And(Builders<PatientEntity>.Filter.Exists(x => x.CurrentOrgCode, false), Builders<PatientEntity>.Filter.Exists(x => x.CurrentTeamCode, false)),
  767. Builders<PatientEntity>.Filter.And(Builders<PatientEntity>.Filter.Eq(x => x.CurrentOrgCode, null), Builders<PatientEntity>.Filter.Eq(x => x.CurrentTeamCode, null))
  768. );
  769. }
  770. else
  771. {
  772. orFilter = Builders<PatientEntity>.Filter.Or(
  773. Builders<PatientEntity>.Filter.Eq(x => x.CurrentOrgCode, user.OrganizationCode),
  774. Builders<PatientEntity>.Filter.And(Builders<PatientEntity>.Filter.Exists(x => x.CurrentOrgCode, false)),
  775. Builders<PatientEntity>.Filter.And(Builders<PatientEntity>.Filter.Eq(x => x.CurrentOrgCode, null))
  776. );
  777. }
  778. List<FilterDefinition<PatientEntity>> filterList = new()
  779. {
  780. filter,
  781. orFilter
  782. };
  783. return Builders<PatientEntity>.Filter.And(filterList);
  784. }
  785. return filter;
  786. }
  787. private async Task<(UserEntity user, OrganizationEntity org, TeamEntity team)> SetPatientRequestCreatedFrom(PatientEntity entity, string userCode, bool skipTeamVerify = false)
  788. {
  789. var (user, org, team) = await VerifyPermission(userCode, skipTeamVerify);
  790. entity.CreatedDoctor = user?.Code;
  791. entity.CreatedOrgCode = org?.Code;
  792. entity.CreatedTeamCode = team?.Code;
  793. entity.CurrentOrgCode = org?.Code;
  794. entity.CurrentTeamCode = team?.Code;
  795. entity.ArchivedDoctorName = user?.RealName ?? string.Empty;
  796. return (user, org, team);
  797. }
  798. public bool AreEqual(List<string> array1, List<string> array2)
  799. {
  800. try
  801. {
  802. if (array1 == null || array2 == null)
  803. return array1 == array2;
  804. array1 = array1.OrderBy(x => x).ToList();
  805. array2 = array2.OrderBy(x => x).ToList();
  806. return array1.SequenceEqual(array2);
  807. }
  808. catch (Exception ex)
  809. {
  810. Logger.WriteLineWarn($"PatientDBService AreEqual failed, ex:{ex}");
  811. return false;
  812. }
  813. }
  814. private void FillingPersopnType(PatientEntity entity)
  815. {
  816. try
  817. {
  818. entity.CrowdLabels = entity.CrowdLabels?.ToList() ?? new List<string>();
  819. var idCardNo = entity.Code;
  820. if (entity.CrowdLabels.Contains("CJJB_TNB") && entity.CrowdLabels.Contains("CJJB_TNB_Suspected"))
  821. {
  822. entity.CrowdLabels = entity.CrowdLabels.Where(x => x != "CJJB_TNB_Suspected")?.ToList() ?? new List<string>();
  823. }
  824. if (entity.CrowdLabels.Contains("CJJB_GXY") && entity.CrowdLabels.Contains("CJJB_GXY_Suspected"))
  825. {
  826. entity.CrowdLabels = entity.CrowdLabels.Where(x => x != "CJJB_GXY_Suspected")?.ToList() ?? new List<string>();
  827. }
  828. if (!string.IsNullOrWhiteSpace(idCardNo) && Regex.IsMatch(idCardNo, @"^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$"))
  829. {
  830. var birthDay = new DateTime(Convert.ToInt32(idCardNo.Substring(6, 4)), Convert.ToInt32(idCardNo.Substring(10, 2)), Convert.ToInt32(idCardNo.Substring(12, 2)));
  831. var childDay = DateTime.Now.AddYears(-6);
  832. var childLabel = "RQFL_ET";
  833. if (birthDay >= childDay)
  834. {
  835. if (!entity.CrowdLabels.Contains(childLabel))
  836. {
  837. entity.CrowdLabels.Add(childLabel);
  838. }
  839. }
  840. else
  841. {
  842. if (entity.CrowdLabels.Contains(childLabel))
  843. {
  844. entity.CrowdLabels = entity.CrowdLabels.Where(x => x != childLabel)?.ToList() ?? new List<string>();
  845. }
  846. }
  847. var lnrDay = DateTime.Now.AddYears(-65);
  848. var lnrLabel = "RQFL_LNR";
  849. if (birthDay <= lnrDay)
  850. {
  851. if (!entity.CrowdLabels.Contains(lnrLabel))
  852. {
  853. entity.CrowdLabels.Add(lnrLabel);
  854. }
  855. }
  856. else
  857. {
  858. if (entity.CrowdLabels.Contains(lnrLabel))
  859. {
  860. entity.CrowdLabels = entity.CrowdLabels.Where(x => x != lnrLabel)?.ToList() ?? new List<string>();
  861. }
  862. }
  863. }
  864. }
  865. catch (Exception ex)
  866. {
  867. Logger.WriteLineDebug($"FillingPersopnType error,{entity.CardNo}," + ex);
  868. }
  869. }
  870. }
  871. }