IPModifyRegistionProcess.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using PTMedicalInsurance.Common;
  4. using PTMedicalInsurance.Forms;
  5. using PTMedicalInsurance.Helper;
  6. using PTMedicalInsurance.Variables;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Data;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. namespace PTMedicalInsurance.Business
  15. {
  16. class IPModifyRegistionProcess : AbstractProcess
  17. {
  18. InpatientRegistration frmReg = new InpatientRegistration() ;
  19. JObject joHisRtnInfo;
  20. public override CallResult Process(JObject input)
  21. {
  22. JObject joReg = new JObject();
  23. //显示登记面板
  24. if (ShowForm(out joReg) == 0)
  25. {
  26. //上传给中心
  27. JObject joRegOut = invoker.invokeCenterService(TradeEnum.InpatientInfoChange, joReg);
  28. //将中心返回的结果返回HIS,调用HIS服务进行保存
  29. if (JsonHelper.parseCenterRtnValue(joRegOut, out errMsg) == 0)
  30. {
  31. // 基线版扩展
  32. joRegOut.Extend("validflag", 1);
  33. joRegOut.Extend("regstate", 1);
  34. joRegOut.Extend("type", 1);
  35. joRegOut.Extend("ExpContent", "");
  36. ////更新患者本次就诊用的参保信息,如果不读卡不用插入
  37. //if (hBus.insertPatCurInsuInfo(patInfo, out outParam) != 0)
  38. //{
  39. // if (DialogResult.Yes == MessageBox.Show(outParam, " 是否继续? ", MessageBoxButtons.YesNo))
  40. // {
  41. // }
  42. // else
  43. // {
  44. // return Exception("插入患者本次就诊用的参保信息,请联系管理员!", outParam);
  45. // }
  46. //}
  47. // 保存时需要公共参数
  48. JObject joRegInput = JObject.Parse(JsonHelper.setCenterInpar("", joReg));
  49. //更新医保平台
  50. if (mIS.UpdateInpatRegisterInfo(joRegInput, out outParam) != 0)
  51. {
  52. return Exception("云平台保存登记信息", outParam);
  53. }
  54. JObject joTmp = new JObject();
  55. joTmp.Add("mdtrtinfo", joReg["adminfo"]);
  56. //返回登记信息,插入HIS
  57. if (hIS.returnRegisterInfo(JObject.Parse(JsonHelper.setCenterInpar("2401", joTmp)), joRegOut, out outParam) != 0)
  58. {
  59. return Exception("HIS平台保存登记信息", outParam);
  60. }
  61. return IrisReturn("登记修改成功", null);
  62. }
  63. else
  64. {
  65. return Exception("展示登记界面", errMsg);
  66. }
  67. }
  68. else
  69. {
  70. return Exception("展示登记界面", joReg.ToString());
  71. }
  72. }
  73. private int LoadInsuInfoToUI(out string err)
  74. {
  75. JObject joPatInfo = new JObject();
  76. JObject joOutput = new JObject();
  77. JObject joBaseInfo = new JObject();
  78. if (mIS.QueryPatCurInsuInfo(out err) != 0)
  79. {
  80. return -1;
  81. }
  82. else
  83. {
  84. JToken jt = JToken.Parse(JsonHelper.getDestValue(JObject.Parse(err), "result.data"));
  85. if (jt is JArray)
  86. {
  87. if ((jt as JArray).Count != 1)
  88. {
  89. err = "查询到登记信息条数不为1!请联系管理员!";
  90. return -1;
  91. }
  92. JObject joRtn = (JObject)(jt as JArray)[0];
  93. joBaseInfo.Add("psn_name", JsonHelper.getDestValue(joRtn, "PatientName"));
  94. joBaseInfo.Add("psn_no", JsonHelper.getDestValue(joRtn, "PersonalNO"));
  95. joBaseInfo.Add("gend", JsonHelper.getDestValue(joRtn, "InsuType"));
  96. joBaseInfo.Add("brdy", JsonHelper.getDestValue(joRtn, "Brdy"));
  97. joBaseInfo.Add("age", JsonHelper.getDestValue(joRtn, "Age"));
  98. }
  99. else
  100. {
  101. err = "返回的信息不是数组!请联系管理员!";
  102. return -1;
  103. }
  104. }
  105. if (mIS.queryRegisterInfo(1, out err) != 0)
  106. {
  107. return -1;
  108. }
  109. else
  110. {
  111. //组织本次获得的相关信息
  112. JObject joRtn = JObject.Parse(JsonHelper.getDestValue(JObject.Parse(err),"data"));
  113. joBaseInfo.Add("psn_cert_type", JsonHelper.getDestValue(joRtn, "CertificateType"));
  114. joBaseInfo.Add("certno", JsonHelper.getDestValue(joRtn, "CertificateNO"));
  115. Global.pat.psn_no = JsonHelper.getDestValue(joRtn, "PersonalNO");
  116. Global.pat.mdtrtcertType = JsonHelper.getDestValue(joRtn, "CertificateType");
  117. Global.pat.certNO = JsonHelper.getDestValue(joRtn, "CertificateNO");
  118. Global.pat.insuplc_admdvs = JsonHelper.getDestValue(joRtn, "InsuranceAreaCode");
  119. Global.pat.insuType = JsonHelper.getDestValue(joRtn, "Insutype");
  120. Global.pat.name = JsonHelper.getDestValue(joRtn, "PatientName");
  121. Global.pat.mdtrtcertType = JsonHelper.getDestValue(joRtn, "CertificateType");
  122. Global.pat.mdtrtcertNO = JsonHelper.getDestValue(joRtn, "CertificateNO");
  123. joPatInfo.Add("baseinfo", joBaseInfo);
  124. joPatInfo.Add("insuinfo", new JArray());
  125. joOutput.Add("output", joPatInfo);
  126. Global.pat.insuType = JsonHelper.getDestValue(joRtn, "InsuType");
  127. Global.pat.medType = JsonHelper.getDestValue(joRtn, "MedicalType");
  128. Global.pat.DiseasecCode = JsonHelper.getDestValue(joRtn, "DiseasecCode");
  129. DataTable dt = (DataTable)frmReg.dblkcbxInsuranceType.DataSource;
  130. // 设置默认值(险种类别)
  131. for (int i = 0; i < dt.Rows.Count; i++)
  132. {
  133. if (dt.Rows[i]["Code"].ToString() == Global.pat.insuType)
  134. {
  135. frmReg.dblkcbxInsuranceType.Text = dt.Rows[i]["Name"].ToString();
  136. frmReg.insuType = dt.Rows[i]["Code"].ToString();
  137. break;
  138. }
  139. }
  140. // 设置默认值(医疗类别)
  141. DataTable dtMedType = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
  142. for (int i = 0; i < dtMedType.Rows.Count; i++)
  143. {
  144. if (dtMedType.Rows[i]["Code"].ToString() == Global.pat.medType)
  145. {
  146. frmReg.dblkcbxMedicalType.Text = dtMedType.Rows[i]["Name"].ToString();
  147. frmReg.med_type = dtMedType.Rows[i]["Code"].ToString();
  148. break;
  149. }
  150. }
  151. //
  152. // 设置默认值(病种)
  153. DataTable dtDisease = (DataTable)frmReg.dblkcbxDisease.DataSource;
  154. for (int i = 0; i < dtDisease.Rows.Count; i++)
  155. {
  156. if (dtDisease.Rows[i]["Code"].ToString() == Global.pat.DiseasecCode)
  157. {
  158. frmReg.dblkcbxDisease.Text = dtDisease.Rows[i]["Name"].ToString();
  159. frmReg.diseCodg = dtDisease.Rows[i]["Code"].ToString();
  160. break;
  161. }
  162. }
  163. frmReg.initBaseInfo(joOutput);
  164. return 0;
  165. }
  166. frmReg.initBaseInfo(joOutput);
  167. return 0;
  168. }
  169. /// <summary>
  170. /// 显示住院患者登记面板,返回登记入参
  171. /// </summary>
  172. /// <param name="regInfo"></param>
  173. /// <returns></returns>
  174. private int ShowForm( out JObject jo)
  175. {
  176. if (LoadInsuInfoToUI(out errMsg) != 0)
  177. {
  178. jo = JsonHelper.setExceptionJson(-1, "", errMsg);
  179. return -1;
  180. }
  181. if (LoadDiagnose(out errMsg) != 0)
  182. {
  183. jo = JsonHelper.setExceptionJson(-1,"",errMsg);
  184. return -1;
  185. }
  186. LoadTypeInfo();
  187. if (GetRegisterInparam(out errMsg) != 0)
  188. {
  189. jo = JsonHelper.setExceptionJson(-1, "", errMsg);
  190. return -1;
  191. }
  192. else
  193. {
  194. jo = JObject.Parse(errMsg);
  195. return 0;
  196. }
  197. }
  198. private int LoadDiagnose(out string err)
  199. {
  200. //调用服务获取门诊诊断信息
  201. string diagnoses;
  202. if (hIS.getPatDiagnoses(Global.pat, out err) != 0)
  203. {
  204. return -1;
  205. }
  206. JObject joRtn = JObject.Parse(err);
  207. joHisRtnInfo = JObject.Parse(err);
  208. DataTable dtDiagnoses = JsonConvert.DeserializeObject<DataTable>(JsonHelper.getDestValue(joRtn, "diseinfo"));
  209. // 添加新列 diag_type_name
  210. if (!dtDiagnoses.Columns.Contains("diag_type_name"))
  211. {
  212. dtDiagnoses.Columns.Add("diag_type_name", typeof(string));
  213. }
  214. // 定义诊断类型映射关系
  215. Dictionary<string, string> diagTypeNameMap = new Dictionary<string, string>
  216. {
  217. { "1", "西医主要诊断" },
  218. { "2", "西医其他诊断" },
  219. { "3", "中医主病诊断" },
  220. { "4", "中医主证诊断" }
  221. };
  222. // 设置 diag_type_name
  223. foreach (DataRow row in dtDiagnoses.Rows)
  224. {
  225. // 从 DataRow 获取 diag_type 字段的值,并转为字符串
  226. string diagType = row["diag_type"]?.ToString();
  227. // 使用 TryGetValue 来获取对应的中文名称
  228. string typeName;
  229. if (diagTypeNameMap.TryGetValue(diagType, out typeName))
  230. {
  231. row["diag_type_name"] = typeName;
  232. }
  233. else
  234. {
  235. row["diag_type_name"] = "未知类型";
  236. }
  237. }
  238. // 使用 LINQ 查询
  239. var query = dtDiagnoses.AsEnumerable();
  240. var selectRows = query
  241. .Where(r => r["diaTypeCode"].ToString() == "ADD");
  242. //
  243. DataTable dtInPatDiagnoses = selectRows != null && selectRows.Any()
  244. ? selectRows.CopyToDataTable()
  245. : null;
  246. selectRows = query
  247. .Where(r => r["diaTypeCode"].ToString() == "OPD" || r["diaTypeCode"].ToString() == "PRE");
  248. DataTable dtOutPatDiagnoses = selectRows != null && selectRows.Any()
  249. ? selectRows.CopyToDataTable()
  250. : null;
  251. if ((dtInPatDiagnoses != null) &&(dtInPatDiagnoses.Rows.Count > 0))
  252. {
  253. frmReg.DtDiagnose = dtInPatDiagnoses;
  254. }
  255. else if ((dtOutPatDiagnoses != null) && (dtOutPatDiagnoses.Rows.Count > 0))
  256. {
  257. frmReg.DtDiagnose = dtOutPatDiagnoses;
  258. }
  259. else
  260. {
  261. err = "未检测到诊断!";
  262. return -1;
  263. }
  264. return 0;
  265. }
  266. private void LoadTypeInfo()
  267. {
  268. string code = "";
  269. FetchDefault(frmReg.dblkcbxInsuranceType,Global.pat.insuType,out code);
  270. frmReg.insuType = code;
  271. //结算方式
  272. FetchDefault(frmReg.dblkcbxSettelmentWay,"01", out code);
  273. frmReg.psn_setlway = code;
  274. //(离院)方式
  275. FetchDefault(frmReg.dblkcbxExitway, "1", out code);
  276. frmReg.iptTypeCode = code;
  277. // 设置默认值(医疗类别)
  278. FetchDefault(frmReg.dblkcbxMedicalType, Global.pat.medType, out code);
  279. frmReg.med_type = code;
  280. }
  281. private void FetchDefault(PTControl.DBLookupCombox dblkcbx,string defaultCode,out string code)
  282. {
  283. code = "";
  284. DataTable dt = (DataTable)dblkcbx.DataSource;
  285. DataRow selectedRow = dt.AsEnumerable()
  286. .FirstOrDefault(row => row.Field<string>("Code") == defaultCode);
  287. if (selectedRow != null)
  288. {
  289. dblkcbx.Text = selectedRow.Field<string>("Name");
  290. code = selectedRow.Field<string>("Code");
  291. }
  292. }
  293. private int GetRegisterInparam(out string err)
  294. {
  295. if (tools.ShowAppDiaglog(frmReg) == DialogResult.OK)
  296. {
  297. JObject ExportObj = new JObject();
  298. ExportObj.Add("local_dise", frmReg.local_dise_code); //本地病种编码
  299. ExportObj.Add("sin_dise_codg", ""); //单病种编码
  300. ExportObj.Add("cla_trt_flag", frmReg.claTrtFlag); //分级诊疗标志
  301. ExportObj.Add("unif_pay_std_typ", frmReg.unifPayStdType); //包干标准类型
  302. ExportObj.Add("bydise_setl_disediag_codg", ""); //按病种付费疾病诊断代码
  303. ExportObj.Add("bydise_setl_oprn_oprt_code", ""); //按病种付费手册操作代码
  304. ExportObj.Add("trum_flag", frmReg.traumaFlag); //外伤标志
  305. ExportObj.Add("medcasno", ""); //病案号
  306. ExportObj.Add("ipt_type", frmReg.iptTypeCode); //住院类型
  307. ExportObj.Add("rel_ttp_flag", frmReg.relTtpFlag); //涉及第三方标志
  308. ExportObj.Add("mdtrt_grp_type", frmReg.mdtrtGrpType); //就诊人群类型
  309. ExportObj.Add("iden_crit_falg", frmReg.dangerFlag);
  310. ExportObj.Add("setl_way", frmReg.psn_setlway); //结算方式
  311. // 合并已有内容
  312. if (!string.IsNullOrEmpty(Global.pat.ExpContent))
  313. {
  314. try
  315. {
  316. JObject jo = JObject.Parse(Global.pat.ExpContent);
  317. ExportObj.Merge(jo, new JsonMergeSettings
  318. {
  319. MergeArrayHandling = MergeArrayHandling.Union
  320. });
  321. }
  322. catch
  323. {
  324. Global.writeLog("转换失败:ExpContent内容不是JSON格式:" + Global.pat.ExpContent);
  325. }
  326. }
  327. Global.pat.ExpContent = ExportObj.ToString();
  328. JObject joMdtrtinfo = new JObject();
  329. joMdtrtinfo.Add("mdtrt_id",Global.pat.mdtrtID); // 就诊ID
  330. joMdtrtinfo.Add("psn_no", Global.pat.psn_no); // 人员编号
  331. joMdtrtinfo.Add("coner_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.coner_name")); // 联系人姓名
  332. joMdtrtinfo.Add("tel", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.tel")); // 联系电话
  333. joMdtrtinfo.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime")); // 开始时间
  334. joMdtrtinfo.Add("endtime", ""); // 结束时间
  335. joMdtrtinfo.Add("mdtrt_cert_type", Global.pat.mdtrtcertType); // 就诊凭证类型(如:医保卡)
  336. joMdtrtinfo.Add("med_type", frmReg.med_type); // 医疗类别(如:门诊手术)
  337. joMdtrtinfo.Add("ipt_otp_no", Global.pat.adm_Dr.ToString()); //住院/门诊号
  338. joMdtrtinfo.Add("medrcdno", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.medrcdno")); //病历号
  339. joMdtrtinfo.Add("atddr_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no")); //主治医生编码
  340. joMdtrtinfo.Add("chfpdr_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name")); //主诊医师姓名
  341. joMdtrtinfo.Add("insutype", frmReg.insuType);
  342. string mainDiagName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name");
  343. string admDiagDescripts = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_diag_dscr");
  344. if (string.IsNullOrEmpty(admDiagDescripts))
  345. {
  346. admDiagDescripts = mainDiagName;
  347. }
  348. joMdtrtinfo.Add("adm_diag_dscr", admDiagDescripts); //入院诊断描述
  349. joMdtrtinfo.Add("adm_dept_codg", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg")); //入院科室编码
  350. joMdtrtinfo.Add("adm_dept_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name")); //入院科室名称
  351. joMdtrtinfo.Add("adm_bed", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_bed")); //入院床位
  352. joMdtrtinfo.Add("dscg_maindiag_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code")); //住院主诊断代码
  353. joMdtrtinfo.Add("dscg_maindiag_name", mainDiagName); //住院主诊断名称
  354. joMdtrtinfo.Add("main_cond_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.main_cond_dscr")); //主要病情描述
  355. joMdtrtinfo.Add("dise_codg", (frmReg.diseCodg == "\u0000") ? "" : frmReg.diseCodg); //病种编码
  356. joMdtrtinfo.Add("dise_name", (frmReg.diseName == "\u0000") ? "" : frmReg.diseName); //病种名称
  357. joMdtrtinfo.Add("oprn_oprt_code", frmReg.oprn_oprt_code ?? ""); //手术操作代码
  358. joMdtrtinfo.Add("oprn_oprt_name", frmReg.oprn_oprt_name ?? ""); //手术操作名称
  359. joMdtrtinfo.Add("fpsc_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fpsc_no")); //计划生育服务证号
  360. joMdtrtinfo.Add("matn_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.matn_type")); //生育类别
  361. joMdtrtinfo.Add("birctrl_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_type")); //计划生育手术类别
  362. joMdtrtinfo.Add("latechb_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.latechb_flag")); //晚育标志
  363. joMdtrtinfo.Add("geso_val", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.geso_val")); //孕周数
  364. joMdtrtinfo.Add("fetts", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetts")); //胎次
  365. joMdtrtinfo.Add("fetus_cnt", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetus_cnt")); //胎儿数
  366. joMdtrtinfo.Add("pret_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.pret_flag")); //早产标志
  367. joMdtrtinfo.Add("birctrl_matn_date", ""); //计划生育手术或生育日期 JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_matn_date") 20230228医保中心校验传正确时间或空
  368. joMdtrtinfo.Add("dise_type_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dise_type_code")); //病种类型
  369. joMdtrtinfo.Add("exp_content", ExportObj); //字段扩展
  370. joMdtrtinfo.Add("ttp_pay_prop", ""); // 第三方自付比例(例如20%)
  371. JObject joReg = new JObject();
  372. joReg.Add("adminfo", joMdtrtinfo);
  373. JArray jaDiseInfo = JArray.Parse(JsonConvert.SerializeObject(frmReg.DtDiagnose));
  374. foreach (JObject jo in jaDiseInfo)
  375. {
  376. jo.Add("mdtrt_id", Global.pat.mdtrtID);
  377. }
  378. joReg.Add("diseinfo", jaDiseInfo);
  379. err = joReg.ToString();
  380. return 0;
  381. }
  382. else
  383. {
  384. err = "收费员取消操作!";
  385. return -1;
  386. }
  387. }
  388. }
  389. }