FeeUpload.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. using Newtonsoft.Json.Linq;
  2. using PTMedicalInsurance.Business;
  3. using PTMedicalInsurance.Helper;
  4. using PTMedicalInsurance.Variables;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Text.RegularExpressions;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. using System.Windows.Forms;
  16. namespace PTMedicalInsurance.Forms
  17. {
  18. public partial class FeeUpload : Form
  19. {
  20. private InvokeHelper invoker = new InvokeHelper();
  21. private MIIrisServices mIS = new MIIrisServices();
  22. private ManualResetEvent manualReset = new ManualResetEvent(true);
  23. private HisIrisServices hIS = new HisIrisServices();
  24. private XmlHelper xmler = new XmlHelper();
  25. private string funNO;
  26. private int singleCount;
  27. private JArray jaFeeDetail;
  28. public string outParam;
  29. public struct userState
  30. {
  31. public int childProgress;
  32. public string description;
  33. public string error;
  34. public string detailHisCode;
  35. public string detailHisName;
  36. public string detailInsuCode;
  37. }
  38. private userState getUserState(int progress,string desc,string err, JToken jt)
  39. {
  40. userState us = new userState();
  41. us.childProgress = progress;
  42. us.description = desc;
  43. us.error = err;
  44. JObject jo = (JObject)jt;
  45. if (jt != null)
  46. {
  47. us.detailHisCode = jo["medins_list_codg"].ToString();
  48. //us.detailHisName = jo["medins_list_desc"].ToString();
  49. us.detailInsuCode = jo["med_list_codg"].ToString();
  50. }
  51. return us;
  52. }
  53. private string convertToXML(JToken jaFeeDetail)
  54. {
  55. try
  56. {
  57. JObject joTmp = new JObject();
  58. joTmp.Add("yka105", jaFeeDetail["feedetl_sn"]);//记账流水号
  59. joTmp.Add("ykd125", jaFeeDetail["medins_list_codg"]); //医院项目流水号
  60. joTmp.Add("ykd126", jaFeeDetail["medins_list_desc"]); //医院项目名称
  61. joTmp.Add("yka002", jaFeeDetail["med_list_codg"]);//医保通用项目编码
  62. joTmp.Add("yka003", jaFeeDetail["med_list_name"]);//医保通用项目名称
  63. joTmp.Add("akc226", jaFeeDetail["cnt"]);//数量
  64. joTmp.Add("akc225", jaFeeDetail["pric"]);//实际价格
  65. joTmp.Add("yka315", jaFeeDetail["det_item_fee_sumamt"]);//明细项目费用总额
  66. joTmp.Add("yka097", jaFeeDetail["bilg_dept_codg"]);//开单科室编码
  67. joTmp.Add("yka098", jaFeeDetail["bilg_dept_name"]);//开单科室名称
  68. joTmp.Add("ykd102", jaFeeDetail["bilg_dr_ID"]);//开单医生公民身份号码
  69. joTmp.Add("ykd103", jaFeeDetail["bilg_dr_codg"]);//国家医保医生编码
  70. joTmp.Add("yka099", jaFeeDetail["bilg_dr_name"]);//开单医生姓名
  71. joTmp.Add("yka100", jaFeeDetail["acord_dept_codg"]);//受单科室编码
  72. joTmp.Add("yka101", jaFeeDetail["acord_dept_name"]);//受单科室名称
  73. joTmp.Add("ykd106", jaFeeDetail["orders_dr_ID"]);//受单医生公民身份号码
  74. joTmp.Add("yka102", jaFeeDetail["orders_dr_name"]);//受单医生姓名
  75. joTmp.Add("yke123", jaFeeDetail["fee_ocur_time"]);//明细发生时间
  76. joTmp.Add("ykc141", Global.user.name);//经办人姓名
  77. joTmp.Add("aae036", jaFeeDetail["fee_ocur_time"]);//经办时间
  78. joTmp.Add("aae013", "");//备注
  79. joTmp.Add("akc229", "");//慢性病药品用药天数
  80. joTmp.Add("yke201", "");//中药使用方式
  81. joTmp.Add("yka295", "");//最小计价单位
  82. joTmp.Add("aka074", "");//规格
  83. joTmp.Add("aka070", "");//剂型
  84. joTmp.Add("yae374", "");//剂型名称
  85. joTmp.Add("yke009", "");//是否医院制剂
  86. joTmp.Add("yke186","1" );//医院审批标志
  87. joTmp.Add("yka821", jaFeeDetail["hosp_appr_flag"]);//项目报销标志
  88. joTmp.Add("yka830", jaFeeDetail["med_list_codg"]);//国家目录编码
  89. joTmp.Add("yka831", jaFeeDetail["med_list_codg"]);//
  90. return joTmp.ToString();
  91. }
  92. catch (Exception ex)
  93. {
  94. return "";
  95. throw;
  96. }
  97. }
  98. public FeeUpload(string funNO, int singleCount, JArray jaFeeDetail)
  99. {
  100. InitializeComponent();
  101. this.funNO = funNO;
  102. this.singleCount = singleCount;
  103. this.jaFeeDetail = jaFeeDetail;
  104. this.pbFee.Maximum = jaFeeDetail.Count;
  105. }
  106. public FeeUpload(string funNO, int singleCount)
  107. {
  108. InitializeComponent();
  109. this.funNO = funNO;
  110. this.singleCount = singleCount;
  111. }
  112. private void btExit_Click(object sender, EventArgs e)
  113. {
  114. this.DialogResult = DialogResult.Cancel;
  115. Close();
  116. }
  117. public void setPos(int pos)
  118. {
  119. pbFee.Value = pos;
  120. }
  121. public void writeError(string error)
  122. {
  123. rtbRecord.AppendText(error + System.Environment.NewLine);
  124. }
  125. private void ProgressBar_Load(object sender, EventArgs e)
  126. {
  127. bgWorker1.WorkerReportsProgress = true;
  128. bgWorker1.WorkerSupportsCancellation = true;
  129. bgWorker1.RunWorkerAsync();
  130. }
  131. private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
  132. {
  133. BackgroundWorker bgWorker = sender as BackgroundWorker;
  134. string errMsg;
  135. int errorCount = 0;
  136. userState us = new userState();
  137. try
  138. {
  139. us = getUserState(0, "获取HIS费用", "......", null);
  140. bgWorker.ReportProgress(0, us);
  141. //获取IS费用
  142. if (hIS.getHisFee(Global.pat, out errMsg) != 0)
  143. {
  144. us = getUserState(0, "获取HIS费用", "失败", null);
  145. bgWorker.ReportProgress(0, us);
  146. outParam = errMsg;
  147. return;
  148. }
  149. else
  150. {
  151. us = getUserState(0, "获取HIS费用", "成功", null);
  152. bgWorker.ReportProgress(0, us);
  153. }
  154. //调用医保平台转换HIS费用(转换医保编码等)
  155. JObject joHisFee = JObject.Parse(errMsg);
  156. us = getUserState(0, "转换HIS费用", "......", null);
  157. bgWorker.ReportProgress(0, us);
  158. if (mIS.convertHisFeeWithInsuCode(joHisFee, out errMsg) != 0)
  159. {
  160. us = getUserState(0, "转换HIS费用", "失败", null);
  161. bgWorker.ReportProgress(0, us);
  162. outParam = errMsg;
  163. return;
  164. }
  165. else
  166. {
  167. us = getUserState(0, "转换HIS费用", "成功", null);
  168. bgWorker.ReportProgress(0, us);
  169. }
  170. JArray jaFeeDetail = JArray.Parse(JsonHelper.getDestValue(JObject.Parse(errMsg), "data"));
  171. if (jaFeeDetail.Count == 0)
  172. {
  173. us = getUserState(0, "转换HIS费用", "失败(有效数据为空)", null);
  174. bgWorker.ReportProgress(0, us);
  175. outParam = errMsg;
  176. return;
  177. }
  178. int feeCount = jaFeeDetail.Count();
  179. this.pbFee.Maximum = jaFeeDetail.Count;
  180. JArray jaTmp = new JArray();
  181. JArray jaTmp2 = new JArray();
  182. for (int i = 0; i < feeCount; i++)
  183. {
  184. manualReset.WaitOne();
  185. if (bgWorker.CancellationPending)
  186. {
  187. e.Cancel = true;
  188. break;
  189. }
  190. jaFeeDetail[i]["chrg_bchno"] = Global.pat.adm_Dr.ToString();
  191. jaFeeDetail[i]["med_type"] = Global.pat.medType;
  192. if (jaFeeDetail[i]["validFlag"].ToString() == "N")
  193. {
  194. bgWorker.ReportProgress(i, null);
  195. continue;
  196. }
  197. JObject joTmp = JObject.Parse(convertToXML(jaFeeDetail[i]));
  198. jaTmp.Add(joTmp);
  199. jaTmp2.Add(jaFeeDetail[i]);
  200. if (((i + 1) % singleCount == 0) || ((i + 1) == jaFeeDetail.Count))
  201. {
  202. JObject joFeeDetail = new JObject();
  203. joFeeDetail.Add("akc190", Global.pat.mdtrtID);
  204. joFeeDetail.Add("aac001", Global.pat.psn_no);
  205. joFeeDetail.Add("aka130", Global.pat.medType);
  206. joFeeDetail.Add("ykb065", Global.pat.insuType);
  207. joFeeDetail.Add("yab003", Global.pat.insuplc_admdvs);
  208. joFeeDetail.Add("prm_yabtch", Global.pat.patExtend.prm_yabtch);
  209. JObject joDataset = new JObject();
  210. joDataset.Add("row", jaTmp);
  211. joFeeDetail.Add("dataset", joDataset);
  212. if (invoker.invokeYHCom("31", joFeeDetail, out errMsg) != 0)
  213. {
  214. outParam = outParam + errMsg + System.Environment.NewLine;
  215. us = getUserState(1, "解析中心返回值", "失败。原因:" + errMsg, jaFeeDetail[i]);
  216. bgWorker.ReportProgress(i, us);
  217. errorCount++;
  218. }
  219. else
  220. {
  221. us = getUserState(1, "解析中心返回值", "成功", jaFeeDetail[i]);
  222. bgWorker.ReportProgress(i, us);
  223. JArray jaRtnDetail = new JArray();
  224. //广州需要检查每条MEMO是否为空
  225. try
  226. {
  227. // errMsg = Regex.Replace(errMsg, "<row",
  228. //"<row xmlns:json=\"http://james.newtonking.com/projects/json\" json:Array=\"true\" ", RegexOptions.IgnoreCase);
  229. string output = xmler.ToJSON(errMsg);
  230. JObject joRtn = JObject.Parse(output);
  231. jaRtnDetail = JArray.Parse(JsonHelper.getDestValue(joRtn, "output.sqldata.row"));
  232. }
  233. catch (Exception ex)
  234. {
  235. Global.writeLog("广州需要检查每条MEMO是否为空" + ex.Message);
  236. }
  237. //foreach (JToken jt in jaRtnDetail)
  238. //{
  239. // if (jt["memo"].ToString() != "")
  240. // {
  241. // outParam = outParam + errMsg + System.Environment.NewLine;
  242. // us = getUserState(2, "中心返回明细报错", jt["memo"].ToString(), jt);
  243. // errorCount++;
  244. // }
  245. //}
  246. //for (int j = 0; j < jaRtnDetail.Count; j++)
  247. //{
  248. // var memo = jaRtnDetail[j]["memo"];
  249. // if ( memo.ToString() != "")
  250. // {
  251. // outParam = outParam + memo + System.Environment.NewLine;
  252. // us = getUserState(2, "中心返回明细报错", memo.ToString(), null);
  253. // bgWorker.ReportProgress(i, us);
  254. // errorCount++;
  255. // }
  256. //}
  257. //成功后插入医保平台
  258. if (mIS.insertFee(jaTmp2, out errMsg) != 0)
  259. {
  260. outParam = outParam + errMsg + System.Environment.NewLine;
  261. us = getUserState(2, "插入医保平台", "失败。原因:" + errMsg, jaFeeDetail[i]);
  262. errorCount++;
  263. }
  264. else
  265. {
  266. // 更新2301返回的数据
  267. if (mIS.updateFee(UpdateHisFeeDetailByCenterRtn(jaTmp2, jaRtnDetail), out errMsg) != 0)
  268. {
  269. outParam = outParam + errMsg + System.Environment.NewLine;
  270. us = getUserState(2, "根据中心返回数据更新费用明细", "失败。原因:" + errMsg, jaFeeDetail[i]);
  271. errorCount++;
  272. }
  273. else
  274. {
  275. us = getUserState(2, "插入&更新医保平台", "成功", jaFeeDetail[i]);
  276. }
  277. //us = getUserState(2, "插入&更新医保平台", "成功", jaFeeDetail[i]);
  278. }
  279. bgWorker.ReportProgress(i, us);
  280. //更新2301返回的数据
  281. //if (mIS.updateFee(JArray.Parse(JsonHelper.getDestValue(joRtn, "output.result")), out errMsg) != 0)
  282. //{
  283. // outParam = outParam + errMsg + System.Environment.NewLine;
  284. // us = getUserState(3, "根据中心返回数据更新费用明细", "失败。原因:" + errMsg, jaFeeDetail[i]);
  285. // errorCount++;
  286. //}
  287. //else
  288. // us = getUserState(3, "根据中心返回数据更新费用明细", "成功", jaFeeDetail[i]);
  289. //bgWorker.ReportProgress(i, us);
  290. }
  291. jaTmp = new JArray();
  292. jaTmp2 = new JArray();
  293. }
  294. bgWorker.ReportProgress(i + 1, null);
  295. }
  296. if ((errorCount == 0) && (e.Cancel == false))
  297. {
  298. Thread.Sleep(1000);
  299. this.DialogResult = DialogResult.OK;
  300. }
  301. else
  302. {
  303. Global.writeLog("outParam:" +outParam);
  304. }
  305. }
  306. catch (Exception ex)
  307. {
  308. outParam = "费用上传异常:" + ex.Message;
  309. }
  310. }
  311. private string getJsonValue(JObject jo,string nodeName)
  312. {
  313. if (!jo.ContainsKey(nodeName))
  314. {
  315. return "0.00";
  316. }
  317. else if (string.IsNullOrEmpty(JsonHelper.getDestValue(jo, nodeName)))
  318. {
  319. return "0.00";
  320. }
  321. else
  322. {
  323. return JsonHelper.getDestValue(jo, nodeName);
  324. }
  325. }
  326. private JArray UpdateHisFeeDetailByCenterRtn(JArray jaHisFeeDetail,JArray jaCenterRtnDetail)
  327. {
  328. JArray jaRtn = new JArray();
  329. foreach (JObject joHisDetail in jaHisFeeDetail)
  330. {
  331. foreach (JObject joCenterDetail in jaCenterRtnDetail)
  332. {
  333. if (joCenterDetail["yka105"].ToString() == joHisDetail["feedetl_sn"].ToString())
  334. {
  335. JObject joTmp = new JObject();
  336. //joTmp.Add("feedetl_sn", joCenterDetail["yka105"].ToString());
  337. //joTmp.Add("fulamt_ownpay_amt", joCenterDetail["yka317"].ToString());
  338. //joTmp.Add("preselfpay_amt", joCenterDetail["yka318"].ToString());
  339. //joTmp.Add("inscp_scp_amt", joCenterDetail["yka319"].ToString());
  340. //joTmp.Add("selfpay_prop", joCenterDetail["SELFPAY_PROP"].ToString());
  341. joTmp.Add("feedetl_sn", getJsonValue(joCenterDetail, "yka105"));
  342. joTmp.Add("fulamt_ownpay_amt", getJsonValue(joCenterDetail, "yka317"));
  343. joTmp.Add("preselfpay_amt", getJsonValue(joCenterDetail, "yka318"));
  344. joTmp.Add("inscp_scp_amt", getJsonValue(joCenterDetail, "yka319"));
  345. joTmp.Add("selfpay_prop", getJsonValue(joCenterDetail, "SELFPAY_PROP"));
  346. joTmp.Add("overlmt_amt", 0);
  347. joTmp.Add("chrgitm_lv", 0);
  348. joTmp.Add("med_chrgitm_type", 0);
  349. joTmp.Add("pric_uplmt_amt", 0);
  350. //joTmp.Add("memo", joCenterDetail["PRMMSG"].ToString());
  351. jaRtn.Add(joTmp);
  352. }
  353. }
  354. }
  355. return jaRtn;
  356. }
  357. //private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
  358. //{
  359. // //BackgroundWorker bgWorker = sender as BackgroundWorker;
  360. // MessageBox.Show("a1");
  361. // string errMsg;
  362. // int feeCount = jaFeeDetail.Count;
  363. // int errorCount = 0;
  364. // try
  365. // {
  366. // JArray jaTmp = new JArray();
  367. // userState us = new userState();
  368. // for (int i = 0; i < feeCount; i++)
  369. // {
  370. // manualReset.WaitOne();
  371. // if (bgWorker1.CancellationPending)
  372. // {
  373. // e.Cancel = true;
  374. // errorCount++;
  375. // break;
  376. // }
  377. // jaFeeDetail[i]["chrg_bchno"] = Global.pat.adm_Dr.ToString();
  378. // jaFeeDetail[i]["med_type"] = Global.pat.medType;
  379. // if (jaFeeDetail[i]["validFlag"].ToString() == "N")
  380. // {
  381. // bgWorker1.ReportProgress(i, null);
  382. // continue;
  383. // }
  384. // jaTmp.Add(jaFeeDetail[i]);
  385. // if (((i + 1) % singleCount == 0) || ((i + 1) == jaFeeDetail.Count))
  386. // {
  387. // JObject joFeeDetail = new JObject();
  388. // joFeeDetail.Add("feedetail", jaTmp);
  389. // JObject joRtn = invoker.invokeCenterService(funNO, JsonHelper.setCenterInpar(funNO, joFeeDetail.ToString()));
  390. // if (JsonHelper.parseCenterRtnValue(joRtn, out errMsg) != 0)
  391. // {
  392. // outParam = outParam + errMsg + System.Environment.NewLine;
  393. // us = getUserState(1, "解析中心返回值", "失败。原因:" + errMsg, jaFeeDetail[i]);
  394. // errorCount++;
  395. // }
  396. // else
  397. // {
  398. // us = getUserState(1, "解析中心返回值", "成功", jaFeeDetail[i]);
  399. // bgWorker1.ReportProgress(i, us);
  400. // //成功后插入医保平台
  401. // if (mIS.insertFee(jaTmp, out errMsg) != 0)
  402. // {
  403. // outParam = outParam + errMsg + System.Environment.NewLine;
  404. // us = getUserState(2, "插入医保平台", "失败。原因:" + errMsg, jaFeeDetail[i]);
  405. // errorCount++;
  406. // }
  407. // else
  408. // us = getUserState(2, "插入医保平台", "成功", jaFeeDetail[i]);
  409. // bgWorker1.ReportProgress(i, us);
  410. // //更新2301返回的数据
  411. // if (mIS.updateFee(JArray.Parse(JsonHelper.getDestValue(joRtn, "output.result")), out errMsg) != 0)
  412. // {
  413. // outParam = outParam + errMsg + System.Environment.NewLine;
  414. // us = getUserState(3, "根据中心返回数据更新费用明细", "失败。原因:" + errMsg, jaFeeDetail[i]);
  415. // errorCount++;
  416. // }
  417. // else
  418. // us = getUserState(3, "根据中心返回数据更新费用明细", "成功", jaFeeDetail[i]);
  419. // bgWorker1.ReportProgress(i, us);
  420. // }
  421. // jaTmp = new JArray();
  422. // }
  423. // bgWorker1.ReportProgress(i + 1, null);
  424. // }
  425. // if (errorCount == 0)
  426. // {
  427. // Thread.Sleep(1000);
  428. // this.DialogResult = DialogResult.OK;
  429. // }
  430. // else
  431. // {
  432. // }
  433. // }
  434. // catch (Exception ex)
  435. // {
  436. // MessageBox.Show(ex.Message);
  437. // }
  438. //}
  439. private void bgWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
  440. {
  441. if (e.ProgressPercentage < 0)
  442. {
  443. setPos(0);
  444. }
  445. else
  446. {
  447. setPos(e.ProgressPercentage);
  448. }
  449. if (e.UserState != null)
  450. {
  451. userState us = (userState)e.UserState;
  452. string upDetailRecord = "";
  453. upDetailRecord = "【His名称:" + us.detailHisName + ";";
  454. upDetailRecord = upDetailRecord + "His编码:" + us.detailHisCode + "; ";
  455. upDetailRecord = upDetailRecord + "医保编码:" + us.detailInsuCode + ";";
  456. upDetailRecord = upDetailRecord + "当前节点:" + us.description + "】";
  457. upDetailRecord = upDetailRecord + us.error + System.Environment.NewLine;
  458. pbDetail.Value = us.childProgress;
  459. this.rtbRecord.AppendText(upDetailRecord);
  460. }
  461. }
  462. private void rtbRecord_TextChanged(object sender, EventArgs e)
  463. {
  464. rtbRecord.SelectionStart = rtbRecord.Text.Length;
  465. rtbRecord.ScrollToCaret();
  466. }
  467. private void btUpload_Click(object sender, EventArgs e)
  468. {
  469. if (!bgWorker1.IsBusy)
  470. {
  471. rtbRecord.Clear();
  472. bgWorker1.RunWorkerAsync();
  473. }
  474. else
  475. {
  476. MessageBox.Show("请点击停止按钮!");
  477. }
  478. }
  479. private void btPause_Click(object sender, EventArgs e)
  480. {
  481. if (btPause.Text == "暂停")
  482. {
  483. manualReset.Reset();//暂停当前线程的工作,发信号给waitOne方法,阻塞
  484. btPause.Text = "继续";
  485. }
  486. else
  487. {
  488. manualReset.Set();//继续某个线程的工作
  489. btPause.Text = "暂停";
  490. }
  491. }
  492. private void btStop_Click(object sender, EventArgs e)
  493. {
  494. if (bgWorker1.IsBusy) bgWorker1.CancelAsync();
  495. }
  496. private void bgWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  497. {
  498. if (e.Cancelled)
  499. { }
  500. if (e.Error != null)
  501. {
  502. outParam = e.Error.ToString();
  503. }
  504. //e.Result
  505. }
  506. }
  507. }