JingQiApiHelper.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. using System.Collections.Concurrent;
  2. using Newtonsoft.Json;
  3. using WingInterfaceLibrary.DTO.Vital;
  4. using WingServerCommon.Log;
  5. namespace VitalService.Factury
  6. {
  7. public class JingQiApiHelper : BaseApiHelper
  8. {
  9. private ConcurrentDictionary<string, FacturyOrgModel> _facturyOrgInfos = new ConcurrentDictionary<string, FacturyOrgModel>();
  10. private Func<string, FacturyOrgModel> OnGetFacturyOrgInfo;
  11. private string _serverUrl;
  12. public string RegisterUrl
  13. {
  14. get
  15. {
  16. return $"{_serverUrl}/api/phyreginf";
  17. }
  18. }
  19. public string DeleteRegisterUrl
  20. {
  21. get
  22. {
  23. return $"{_serverUrl}/api/phyregmod";
  24. }
  25. }
  26. public JingQiApiHelper(string serverUrl, Func<string, FacturyOrgModel> funGetFacturyOrgInfo, double seconds = 60) : base(seconds)
  27. {
  28. _serverUrl = serverUrl?.Trim('/') ?? string.Empty;
  29. OnGetFacturyOrgInfo = funGetFacturyOrgInfo;
  30. Logger.WriteLineInfo($"VitalMixtureService JingQiApiHelper init, serverUrl:{_serverUrl}, seconds:{seconds}");
  31. }
  32. public FacturyOrgModel GetFacturyInfo(string token)
  33. {
  34. if (!_facturyOrgInfos.TryGetValue(token, out FacturyOrgModel facturyInfo))
  35. {
  36. facturyInfo = OnGetFacturyOrgInfo.Invoke(token);
  37. if (facturyInfo != null)
  38. {
  39. _facturyOrgInfos.TryAdd(token, facturyInfo);
  40. }
  41. }
  42. return facturyInfo;
  43. }
  44. /// <summary>
  45. /// 体检登记
  46. /// </summary>
  47. /// <param name="request"></param>
  48. /// <param name="headers"></param>
  49. /// <returns></returns>
  50. public async Task<JingQiResult<JingQiExamRegisterResult>> ExamRegisterAsync(JingQiExamRegisterRequest request, Dictionary<string, string> headers, string idCardNo)
  51. {
  52. Logger.WriteLineInfo($"VitalMixtureService JingQiApiHelper ExamRegisterAsync start, idCardNo:{idCardNo}, request:{request}");
  53. return await GetJingQiResult<JingQiExamRegisterResult>(RegisterUrl, JsonConvert.SerializeObject(request), headers, idCardNo);
  54. }
  55. /// <summary>
  56. /// 删除登记记录
  57. /// </summary>
  58. /// <param name="request"></param>
  59. /// <param name="headers"></param>
  60. /// <returns></returns>
  61. public async Task<JingQiResult<JingQiExamDeleteResult>> ExamDeleteAsync(JingQiExamDeleteRequest request, Dictionary<string, string> headers, string idCardNo)
  62. {
  63. Logger.WriteLineInfo($"VitalMixtureService JingQiApiHelper ExamDeleteAsync start, idCardNo:{idCardNo}, request:{request}");
  64. return await GetJingQiResult<JingQiExamDeleteResult>(DeleteRegisterUrl, JsonConvert.SerializeObject(request), headers, idCardNo);
  65. }
  66. /// <summary>
  67. /// 转换中医体质结果
  68. /// </summary>
  69. /// <param name="examInfo"></param>
  70. /// <param name="registerInfo"></param>
  71. /// <param name="url"></param>
  72. /// <returns></returns>
  73. public string GetZYPostContentAsync(RegisterPersonInfoDTO registerInfo, FacturyOrgModel facturyInfo, Dictionary<string, string> examData, DateTime examTime, out string url)
  74. {
  75. url = $"{_serverUrl}/api/phychn";
  76. var jingQiInfos = registerInfo.JingQiExamInfos;
  77. var pyhId = GetValue(jingQiInfos, "pyhid");
  78. var dic = new Dictionary<string, string>();
  79. dic.Add("pyhid", pyhId);
  80. dic.Add("personId", GetValue(jingQiInfos, "PatientID"));
  81. dic.Add("identificationAge", GetInt(jingQiInfos, "PATAGE").ToString());
  82. dic.Add("q1Jlcp", GetValue(examData, "qusition1"));
  83. dic.Add("q2Rypb", GetValue(examData, "qusition2"));
  84. dic.Add("q3Ryjd", GetValue(examData, "qusition3"));
  85. dic.Add("q4Sywl", GetValue(examData, "qusition4"));
  86. dic.Add("q5Qxdc", GetValue(examData, "qusition5"));
  87. dic.Add("q6Jlba", GetValue(examData, "qusition6"));
  88. dic.Add("q7Gdsl", GetValue(examData, "qusition7"));
  89. dic.Add("q8Hpsj", GetValue(examData, "qusition8"));
  90. dic.Add("q9Bmi", GetValue(examData, "qusition9"));
  91. dic.Add("q10Yjgs", GetValue(examData, "qusition10"));
  92. dic.Add("q11Sjfl", GetValue(examData, "qusition11"));
  93. dic.Add("q12Stpl", GetValue(examData, "qusition12"));
  94. dic.Add("q13Nshl", GetValue(examData, "qusition13"));
  95. dic.Add("q14Rygm", GetValue(examData, "qusition14"));
  96. dic.Add("q15Gmlt", GetValue(examData, "qusition15"));
  97. dic.Add("q16Kndh", GetValue(examData, "qusition16"));
  98. dic.Add("q17Rygm", GetValue(examData, "qusition17"));
  99. dic.Add("q18Ryxmz", GetValue(examData, "qusition18"));
  100. dic.Add("q19Qzyb", GetValue(examData, "qusition19"));
  101. dic.Add("q20Rczh", GetValue(examData, "qusition20"));
  102. dic.Add("q21Fcgz", GetValue(examData, "qusition21"));
  103. dic.Add("q22Ztmm", GetValue(examData, "qusition22"));
  104. dic.Add("q23Mbyn", GetValue(examData, "qusition23"));
  105. dic.Add("q24Mkha", GetValue(examData, "qusition24"));
  106. dic.Add("q25Pfsz", GetValue(examData, "qusition25"));
  107. dic.Add("q26Kgyz", GetValue(examData, "qusition26"));
  108. dic.Add("q27Kqyw", GetValue(examData, "qusition27"));
  109. dic.Add("q28Fbfd", GetValue(examData, "qusition28"));
  110. dic.Add("q29Ylbs", GetValue(examData, "qusition29"));
  111. dic.Add("q30Dbnz", GetValue(examData, "qusition30"));
  112. dic.Add("q31Dbgz", GetValue(examData, "qusition31"));
  113. dic.Add("q32Sthn", GetValue(examData, "qusition32"));
  114. dic.Add("q33Sxjmyz", GetValue(examData, "qusition33"));
  115. var physicalConclusion = GetValue(examData, "PhysicalConclusion");
  116. var healthGuidance = GetHealthGuidance(GetValue(examData, "HealthGuidance"));
  117. // 气虚质
  118. var qiScoreValue = GetValue(examData, "Qi_Score");
  119. if (!string.IsNullOrWhiteSpace(qiScoreValue))
  120. {
  121. var score = JsonConvert.DeserializeObject<ZYTZModel>(qiScoreValue);
  122. dic.Add("qxzSf", GetZYTZValue(score.Result).ToString());
  123. dic.Add("qxzDf", score.Value.ToString());
  124. if (physicalConclusion == "Qi_Score")
  125. {
  126. dic.Add("qxzZd", healthGuidance);
  127. }
  128. }
  129. // 阳虚质
  130. var yangScoreValue = GetValue(examData, "Yang_Score");
  131. if (!string.IsNullOrWhiteSpace(yangScoreValue))
  132. {
  133. var score = JsonConvert.DeserializeObject<ZYTZModel>(yangScoreValue);
  134. dic.Add("yaxzSf", GetZYTZValue(score.Result).ToString());
  135. dic.Add("yaxzDf", score.Value.ToString());
  136. if (physicalConclusion == "Yang_Score")
  137. {
  138. dic.Add("yaxzZd", healthGuidance);
  139. }
  140. }
  141. // 阴虚质
  142. var yinScoreValue = GetValue(examData, "Yin_Score");
  143. if (!string.IsNullOrWhiteSpace(yinScoreValue))
  144. {
  145. var score = JsonConvert.DeserializeObject<ZYTZModel>(yinScoreValue);
  146. dic.Add("yixzSf", GetZYTZValue(score.Result).ToString());
  147. dic.Add("yixzDf", score.Value.ToString());
  148. if (physicalConclusion == "Yin_Score")
  149. {
  150. dic.Add("yixzZd", healthGuidance);
  151. }
  152. }
  153. // 痰湿质
  154. var tanScoreValue = GetValue(examData, "Tan_Score");
  155. if (!string.IsNullOrWhiteSpace(tanScoreValue))
  156. {
  157. var score = JsonConvert.DeserializeObject<ZYTZModel>(tanScoreValue);
  158. dic.Add("tszSf", GetZYTZValue(score.Result).ToString());
  159. dic.Add("tszDf", score.Value.ToString());
  160. if (physicalConclusion == "Tan_Score")
  161. {
  162. dic.Add("tszZd", healthGuidance);
  163. }
  164. }
  165. // 湿热质
  166. var shiScoreValue = GetValue(examData, "Shi_Score");
  167. if (!string.IsNullOrWhiteSpace(shiScoreValue))
  168. {
  169. var score = JsonConvert.DeserializeObject<ZYTZModel>(shiScoreValue);
  170. dic.Add("srzSf", GetZYTZValue(score.Result).ToString());
  171. dic.Add("srzDf", score.Value.ToString());
  172. if (physicalConclusion == "Shi_Score")
  173. {
  174. dic.Add("srzZd", healthGuidance);
  175. }
  176. }
  177. // 血瘀质
  178. var xueScoreValue = GetValue(examData, "Xue_Score");
  179. if (!string.IsNullOrWhiteSpace(xueScoreValue))
  180. {
  181. var score = JsonConvert.DeserializeObject<ZYTZModel>(xueScoreValue);
  182. dic.Add("xyzSf", GetZYTZValue(score.Result).ToString());
  183. dic.Add("xyzDf", score.Value.ToString());
  184. if (physicalConclusion == "Xue_Score")
  185. {
  186. dic.Add("xyzZd", healthGuidance);
  187. }
  188. }
  189. // 气郁质
  190. var qiYuScoreValue = GetValue(examData, "Qiyu_Score");
  191. if (!string.IsNullOrWhiteSpace(qiYuScoreValue))
  192. {
  193. var score = JsonConvert.DeserializeObject<ZYTZModel>(qiYuScoreValue);
  194. dic.Add("qyzSf", GetZYTZValue(score.Result).ToString());
  195. dic.Add("qyzDf", score.Value.ToString());
  196. if (physicalConclusion == "Qiyu_Score")
  197. {
  198. dic.Add("qyzZd", healthGuidance);
  199. }
  200. }
  201. // 特禀质
  202. var teScoreValue = GetValue(examData, "Te_Score");
  203. if (!string.IsNullOrWhiteSpace(teScoreValue))
  204. {
  205. var score = JsonConvert.DeserializeObject<ZYTZModel>(teScoreValue);
  206. dic.Add("tbzSf", GetZYTZValue(score.Result).ToString());
  207. dic.Add("tbzDf", score.Value.ToString());
  208. if (physicalConclusion == "Te_Score")
  209. {
  210. dic.Add("tbzZd", healthGuidance);
  211. }
  212. }
  213. // 平和质
  214. var pingScoreValue = GetValue(examData, "Ping_Score");
  215. if (!string.IsNullOrWhiteSpace(pingScoreValue))
  216. {
  217. var score = JsonConvert.DeserializeObject<ZYTZModel>(pingScoreValue);
  218. dic.Add("phzSf", GetZYTZValue(score.Result).ToString());
  219. dic.Add("phzDf", score.Value.ToString());
  220. if (physicalConclusion == "Ping_Score")
  221. {
  222. dic.Add("phzZd", healthGuidance);
  223. }
  224. }
  225. dic.Add("cpjg", GetPhysicalConclusion(physicalConclusion));// 测评结果
  226. dic.Add("entryCode", facturyInfo.FacturyUserCode);
  227. dic.Add("entryName", facturyInfo.FacturyUserName);
  228. dic.Add("entryTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
  229. dic.Add("createCode", facturyInfo.FacturyUserCode);
  230. dic.Add("createName", facturyInfo.FacturyUserName);
  231. dic.Add("createTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
  232. dic.Add("updateCode", facturyInfo.FacturyUserCode);
  233. dic.Add("updateName", facturyInfo.FacturyUserName);
  234. dic.Add("updateTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
  235. dic.Add("updateOrganzationCode", facturyInfo.FacturyOrgCode);
  236. dic.Add("updateOrganzationName", facturyInfo.FacturyOrgName);
  237. return JsonConvert.SerializeObject(dic);
  238. }
  239. private string GetValue(Dictionary<string, string> dic, string key)
  240. {
  241. foreach (var k in dic.Keys)
  242. {
  243. if (k.ToLower() == key.ToLower())
  244. {
  245. var value = dic[k];
  246. return string.IsNullOrWhiteSpace(value) ? "" : value;
  247. }
  248. }
  249. return "";
  250. }
  251. private int GetInt(Dictionary<string, string> dic, string key)
  252. {
  253. var val = GetValue(dic, key);
  254. if (int.TryParse(val, out int res))
  255. {
  256. return res;
  257. }
  258. return 0;
  259. }
  260. private int GetZYTZValue(string result)
  261. {
  262. return result == "是" ? 1 : result == "倾向是" ? 3 : 0;
  263. }
  264. private string GetHealthGuidance(string result)
  265. {
  266. try
  267. {
  268. var guidanceInfos = JsonConvert.DeserializeObject<List<string>>(result);
  269. return string.Join(";", guidanceInfos);
  270. }
  271. catch (Exception ex)
  272. {
  273. }
  274. return string.Empty;
  275. }
  276. private string GetPhysicalConclusion(string physicalConclusion)
  277. {
  278. switch (physicalConclusion)
  279. {
  280. case "Qi_Score":
  281. return "02";
  282. case "Yang_Score":
  283. return "03";
  284. case "Yin_Score":
  285. return "04";
  286. case "Tan_Score":
  287. return "05";
  288. case "Shi_Score":
  289. return "06";
  290. case "Xue_Score":
  291. return "07";
  292. case "Qiyu_Score":
  293. return "082";
  294. case "Te_Score":
  295. return "09";
  296. case "Ping_Score":
  297. return "01";
  298. default:
  299. return "";
  300. }
  301. }
  302. private async Task<JingQiResult<TResult>> GetJingQiResult<TResult>(string url, string request, Dictionary<string, string> headers, string idCardNo)
  303. {
  304. try
  305. {
  306. var res = await GetResult(url, request, headers);
  307. Logger.WriteLineInfo($"VitalMixtureService JingQiApiHelper GetJingQiResult success, idCardNo:{idCardNo}, res:{res}");
  308. if (!string.IsNullOrWhiteSpace(res))
  309. {
  310. var jingQiResult = JsonConvert.DeserializeObject<JingQiResult<TResult>>(res);
  311. if (jingQiResult.status == "0")
  312. {
  313. Logger.WriteLineInfo($"VitalMixtureService JingQiApiHelper GetJingQiResult success, idCardNo:{idCardNo}, ErroMsg:{jingQiResult.ErroMsg}");
  314. }
  315. else
  316. {
  317. Logger.WriteLineError($"VitalMixtureService JingQiApiHelper GetJingQiResult failed, idCardNo:{idCardNo}, status:{jingQiResult.status}, ErroMsg:{jingQiResult.ErroMsg}");
  318. }
  319. return jingQiResult;
  320. }
  321. return new JingQiResult<TResult>
  322. {
  323. status = "",
  324. ErroMsg = "",
  325. };
  326. }
  327. catch (Exception ex)
  328. {
  329. Logger.WriteLineWarn($"VitalMixtureService JingQiApiHelper GetJingQiResult error, idCardNo:{idCardNo}, ex:{ex}");
  330. return new JingQiResult<TResult>
  331. {
  332. status = "error",
  333. ErroMsg = ex.Message,
  334. };
  335. }
  336. }
  337. }
  338. public class FacturyOrgModel
  339. {
  340. public string Token { get; set; }
  341. public string UserCode { get; set; }
  342. public string FacturyOrgCode { get; set; }
  343. public string FacturyUserCode { get; set; }
  344. public string FacturyOrgName { get; set; }
  345. public string FacturyUserName { get; set; }
  346. public Dictionary<string, string> FacturyData { get; set; }
  347. }
  348. public class ZYTZModel
  349. {
  350. public int Value { get; set; }
  351. public string Result { get; set; }
  352. }
  353. public class JingQiResult<TResult>
  354. {
  355. public string status { get; set; }
  356. public string ErroMsg { get; set; }
  357. public TResult data { get; set; }
  358. }
  359. #region 体检登记
  360. public class JingQiExamRegisterRequest
  361. {
  362. /// <summary>
  363. /// 身份证号
  364. /// </summary>
  365. /// <value></value>
  366. public string identity { get; set; }
  367. /// <summary>
  368. /// 机构编码
  369. /// </summary>
  370. /// <value></value>
  371. public string orgcode { get; set; }
  372. /// <summary>
  373. /// 操作人晶奇工号
  374. /// </summary>
  375. /// <value></value>
  376. public string usrcode { get; set; }
  377. /// <summary>
  378. /// 登记日期 2024-05-31 08:15:23
  379. /// </summary>
  380. /// <value></value>
  381. public string phydatetime { get; set; }
  382. }
  383. public class JingQiExamRegisterResult
  384. {
  385. /// <summary>
  386. /// 体检编号
  387. /// </summary>
  388. /// <value></value>
  389. public string phyid { get; set; }
  390. /// <summary>
  391. /// 居民姓名
  392. /// </summary>
  393. /// <value></value>
  394. public string PATNAME { get; set; }
  395. /// <summary>
  396. /// 居民性别,男
  397. /// </summary>
  398. /// <value></value>
  399. public string GRENDER { get; set; }
  400. /// <summary>
  401. /// 居民年龄
  402. /// </summary>
  403. /// <value></value>
  404. public string PATAGE { get; set; }
  405. /// <summary>
  406. /// 联系电话
  407. /// </summary>
  408. /// <value></value>
  409. public string PHONE { get; set; }
  410. /// <summary>
  411. /// 所属社区
  412. /// </summary>
  413. /// <value></value>
  414. public string ORGNAME { get; set; }
  415. /// <summary>
  416. /// 居住地址
  417. /// </summary>
  418. /// <value></value>
  419. public string adress { get; set; }
  420. /// <summary>
  421. /// 人群分类 老年人,高血压
  422. /// </summary>
  423. /// <value></value>
  424. public string lisclu { get; set; }
  425. /// <summary>
  426. /// 登记日期 2024-05-30 10:48:29
  427. /// </summary>
  428. /// <value></value>
  429. public string PHYDATE { get; set; }
  430. /// <summary>
  431. /// 个人档案ID
  432. /// </summary>
  433. /// <value></value>
  434. public string PatientID { get; set; }
  435. /// <summary>
  436. /// 个人档案编号
  437. /// </summary>
  438. /// <value></value>
  439. public string NO { get; set; }
  440. }
  441. #endregion
  442. #region 取消登记
  443. public class JingQiExamDeleteRequest
  444. {
  445. public string phyid { get; set; }
  446. public string modstatus { get; set; } = "1";
  447. }
  448. public class JingQiExamDeleteResult
  449. {
  450. }
  451. #endregion
  452. }