OutOfAreaPatientClearing.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. using Newtonsoft.Json.Linq;
  2. using PTMedicalInsurance.Common;
  3. using PTMedicalInsurance.Entity.Base.Clearing;
  4. using PTMedicalInsurance.Forms.Clearings;
  5. using PTMedicalInsurance.Helper;
  6. using PTMedicalInsurance.Variables;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.ComponentModel;
  10. using System.Data;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Windows.Forms;
  16. namespace PTMedicalInsurance.Business.Clearing
  17. {
  18. //异地清分
  19. class OutOfAreaPatientClearing
  20. {
  21. private InvokeHelper invoker = new InvokeHelper();
  22. private MIIrisServices mIS = new MIIrisServices();
  23. private string year;
  24. private string month;
  25. private DataTable datatable;
  26. private string transid;
  27. private int totalrow;
  28. private OutOfAreaClearing outOfAreaClearing;
  29. public OutOfAreaPatientClearing(OutOfAreaClearing _outOfAreaClearing)
  30. {
  31. outOfAreaClearing = _outOfAreaClearing;
  32. }
  33. #region 查询相关
  34. /// <summary>
  35. /// 查询医院医保库里的异地数据
  36. /// </summary>
  37. /// <param name="input"></param>
  38. /// <param name="outMsg"></param>
  39. /// <returns></returns>
  40. public int QueryHospitalData(JObject input, out string outMsg)
  41. {
  42. string hospitalDr = JsonHelper.getDestValue(input, "hospitalDr");
  43. DateTime dt = DateTime.Parse(JsonHelper.getDestValue(input, "month"));
  44. year = dt.ToString("yyyy");
  45. month = dt.ToString("MM");
  46. string begin = JsonHelper.getDestValue(input, "beginDate") + "0:00:00";
  47. string end = JsonHelper.getDestValue(input, "endDate") + "23:59:59"; ;
  48. string sqlStr = "Select PatientName,CASE WHEN admType = 1 THEN '门诊' WHEN admType =2 THEN '住院' ELSE '未知' END AS admType,CertificateNO,MdtrtID,SettlementDateTime,SettlementID,Sumamt,FundPaySumamt,'' mdtrt_setl_time ";
  49. sqlStr = sqlStr + ",'' as mdtrt_id,'' as setl_sn,'' as fulamt_advpay_flag,'' mdtrtarea,'' medins_no,'' certno,'' medfee_sumamt,'' optins_pay_sumamt,'1' cnfm_flag ";
  50. sqlStr = sqlStr + $" FROM BS_MedInsuSettlement WHERE ValidFlag = 1 and Hospital_Dr=" + hospitalDr;
  51. sqlStr = sqlStr + $" and OccurTime>='{begin}'";
  52. sqlStr = sqlStr + $" and OccurTime<='{end}'";
  53. sqlStr = sqlStr + " and (left(InsuranceAreaCode,2)<>'44')";
  54. sqlStr = sqlStr + " order by SettlementDateTime ";
  55. JObject joRtn = mIS.DynamicQuery(sqlStr, "查询医院医保库里的异地数据");
  56. return JsonHelper.parseIrisRtnResult(joRtn, out outMsg);
  57. }
  58. /// <summary>
  59. /// 查询中心的异地数据
  60. /// </summary>
  61. /// <param name="input"></param>
  62. /// <param name="outMsg"></param>
  63. /// <returns></returns>
  64. public int QueryCenterData(JObject input, out string outMsg)
  65. {
  66. JObject joRtn = invoker.invokeCenterService(TradeEnum.QueryOutOfAreaClearingDetail, new JObject(new JProperty("data", input)));
  67. if (JsonHelper.parseCenterReturnJson(joRtn, out outMsg) != 0)
  68. {
  69. return -1;
  70. }
  71. else
  72. {
  73. outMsg = joRtn.ToString();
  74. return 0;
  75. }
  76. }
  77. /// <summary>
  78. /// 循环查询中心数据,最后拼接成JARRY
  79. /// </summary>
  80. /// <param name="input"></param>
  81. /// <param name="ja"></param>
  82. /// <param name="outMsg"></param>
  83. /// <returns></returns>
  84. public int Combin3260Data(JObject input, out JArray ja, out string outMsg)
  85. {
  86. QueryOutOfAreaClearingDetailsInput queryInput = new QueryOutOfAreaClearingDetailsInput();
  87. DateTime dt = DateTime.Parse(input["month"].ToString());
  88. queryInput.trt_year = dt.ToString("yyyy");
  89. queryInput.trt_month = dt.ToString("MM");
  90. int startrow = 1;
  91. ja = null;
  92. //var combinedList = new List<QueryOutOfAreaClearingDetailsOutput>();
  93. while (true)
  94. {
  95. queryInput.startrow = startrow;
  96. if (QueryCenterData(queryInput.ToJson(), out outMsg) != 0)
  97. {
  98. return -1;
  99. }
  100. else
  101. {
  102. JObject joRtn = JObject.Parse(outMsg);
  103. JArray jaData = JArray.FromObject(joRtn["output"]["data"]);
  104. totalrow = int.Parse(joRtn["output"]["totalrow"].ToString());
  105. if (ja == null)
  106. {
  107. ja = jaData;
  108. }
  109. else
  110. {
  111. foreach (var jo in jaData)
  112. {
  113. ja.Add(jo);
  114. }
  115. }
  116. startrow = startrow + jaData.Count;
  117. if (jaData.Count < 100)
  118. {
  119. outMsg = "遍历完成,已查询到返回条数小于100!";
  120. return 0;
  121. }
  122. }
  123. }
  124. }
  125. /// <summary>
  126. /// 跟已查询出的医院数据进行匹配,未匹配成功的标记红色,多匹配的标记黄色,并新增行数显示
  127. /// </summary>
  128. /// <param name="dgv"></param>
  129. /// <param name="ja"></param>
  130. /// <param name="outMsg"></param>
  131. /// <returns></returns>
  132. public int MatchCenterData(DataGridView dgv, JArray ja, out string outMsg)
  133. {
  134. outMsg = "";
  135. //JArray jaDgv = (JArray)dgv.DataSource;
  136. DataTable dt = (DataTable)dgv.DataSource;
  137. DataColumn seqnoColumn = new DataColumn("seqno", typeof(int));
  138. seqnoColumn.DefaultValue = 0;
  139. dt.Columns.Add(seqnoColumn);
  140. //先遍历中心数据后遍历医院数据
  141. foreach (var item in ja)
  142. {
  143. bool isExist = false;
  144. JObject joCenter = (JObject)item;
  145. foreach (DataRow dr in dt.Rows)
  146. {
  147. if (dr["SettlementID"].ToString() == joCenter["setl_sn"].ToString())
  148. {
  149. dr["setl_sn"] = joCenter["setl_sn"].ToString();
  150. dr["seqno"] = int.Parse(joCenter["seqno"].ToString());
  151. dr["medfee_sumamt"] = joCenter["medfee_sumamt"].ToString();
  152. dr["fulamt_advpay_flag"] = joCenter["fulamt_advpay_flag"].ToString();
  153. dr["optins_pay_sumamt"] = joCenter["optins_pay_sumamt"].ToString();
  154. dr["mdtrt_setl_time"] = joCenter["mdtrt_setl_time"].ToString();
  155. dr["certno"] = joCenter["certno"].ToString();
  156. dr["mdtrt_id"] = joCenter["mdtrt_id"].ToString();
  157. dr["medins_no"] = joCenter["medins_no"].ToString();
  158. dr["mdtrtarea"] = joCenter["mdtrtarea"].ToString();
  159. isExist = true;
  160. }
  161. }
  162. if (!isExist)
  163. {
  164. // 创建一个新的行
  165. DataRow newRow = dt.NewRow();
  166. // 设置新行的值
  167. newRow["CertificateNO"] = "HIS未查询到,可扩大月份查询";
  168. newRow["MdtrtID"] = "";
  169. newRow["SettlementDateTime"] = "";
  170. newRow["SettlementID"] = joCenter["setl_sn"].ToString();
  171. newRow["Sumamt"] = "";
  172. newRow["FundPaySumamt"] = "";
  173. newRow["setl_sn"] = joCenter["setl_sn"].ToString();
  174. newRow["seqno"] = int.Parse(joCenter["seqno"].ToString());
  175. newRow["medfee_sumamt"] = joCenter["medfee_sumamt"].ToString();
  176. newRow["fulamt_advpay_flag"] = joCenter["fulamt_advpay_flag"].ToString();
  177. newRow["optins_pay_sumamt"] = joCenter["optins_pay_sumamt"].ToString();
  178. newRow["mdtrt_setl_time"] = joCenter["mdtrt_setl_time"].ToString();
  179. newRow["certno"] = joCenter["certno"].ToString();
  180. newRow["mdtrt_id"] = joCenter["mdtrt_id"].ToString();
  181. newRow["medins_no"] = joCenter["medins_no"].ToString();
  182. newRow["mdtrtarea"] = joCenter["mdtrtarea"].ToString();
  183. dt.Rows.Add(newRow);
  184. }
  185. }
  186. // 根据选择,使用 LINQ 对 DataTable 重新筛选排序
  187. var sortedRows = from row in dt.AsEnumerable()
  188. orderby row.Field<int>("seqno")
  189. select row;
  190. if (this.outOfAreaClearing.uploadStatus =="未上传")
  191. {
  192. sortedRows = from row in dt.AsEnumerable()
  193. where row.Field<string>("UploadFlag") == "未上传"
  194. orderby row.Field<int>("seqno")
  195. select row;
  196. }
  197. // 将排序后的行加载到新的 DataTable 中
  198. DataTable sortedTable = (sortedRows != null && sortedRows.Any()) ?(sortedRows.CopyToDataTable()):null;
  199. datatable = sortedTable;
  200. dgv.DataSource = sortedTable;
  201. ////先遍历医院数据,如果未匹配到中心数据则标红
  202. //foreach (DataRow dr in dt.Rows)
  203. //{
  204. //}
  205. return 0;
  206. }
  207. /// <summary>
  208. /// 匹配医保库的上传记录表
  209. /// </summary>
  210. /// <param name="input"></param>
  211. /// <param name="outMsg"></param>
  212. /// <returns></returns>
  213. public int MatchMIUploadRecord(JObject input, out string outMsg)
  214. {
  215. outMsg = "";
  216. return 0;
  217. }
  218. #endregion
  219. #region 上传确认
  220. /// <summary>
  221. /// 组织3261的入参
  222. /// </summary>
  223. /// <param name="outMsg"></param>
  224. /// <returns></returns>
  225. public OutOfAreaClearingConfirmDetail OrgnizeSingle3261Detail(DataRow dr)
  226. {
  227. OutOfAreaClearingConfirmDetail detail = new OutOfAreaClearingConfirmDetail();
  228. detail.certno = dr["CertificateNO"].ToString();
  229. detail.mdtrt_id = dr["MdtrtID"].ToString();
  230. detail.mdtrt_setl_time = dr["SettlementDateTime"].ToString();
  231. detail.setl_sn = dr["SettlementID"].ToString();
  232. detail.medfee_sumamt = decimal.Parse(dr["Sumamt"].ToString());
  233. detail.cnfm_flag = dr["cnfm_flag"].ToString();
  234. detail.optins_pay_sumamt =decimal.Parse(dr["FundPaySumamt"].ToString());
  235. return detail;
  236. }
  237. /// <summary>
  238. /// 将确认结果上传给中心
  239. /// </summary>
  240. /// <param name="input"></param>
  241. /// <param name="outMsg"></param>
  242. /// <returns></returns>
  243. public int UploadToCenter(JObject input, out string outMsg)
  244. {
  245. JObject joRtn = invoker.invokeCenterService(TradeEnum.ConfirmOutOfAreaClearing, input);
  246. if (JsonHelper.parseCenterReturnJson(joRtn, out outMsg) != 0)
  247. {
  248. return -1;
  249. }
  250. else
  251. {
  252. outMsg = joRtn.ToString();
  253. return 0;
  254. }
  255. }
  256. /// <summary>
  257. /// 上传异地清分
  258. /// </summary>
  259. /// <param name="dgv"></param>
  260. /// <param name="rows"></param>
  261. /// <param name="outMsg"></param>
  262. /// <returns></returns>
  263. //public int BatchUpload(DataGridView dgv, int rows, out string outMsg)
  264. //{
  265. // outMsg = "";
  266. // List<OutOfAreaClearingConfirmDetail> details = new List<OutOfAreaClearingConfirmDetail>();
  267. // int rowTotalCount = datatable.Rows.Count;
  268. // for (int i = 0; i < rowTotalCount; i++)
  269. // {
  270. // DataRow dr = datatable.Rows[i];
  271. // JObject joTmp = new JObject();
  272. // if (((i + 1) / rows == 0) || ((i + 1) == rowTotalCount))
  273. // {
  274. // details = new List<OutOfAreaClearingConfirmDetail>();
  275. // //int totalrow = 0;
  276. // //if ((i + 1) / rows == 0)
  277. // //{
  278. // // totalrow = rows;
  279. // //}
  280. // //else
  281. // //{
  282. // // totalrow = rowTotalCount / rows;
  283. // //}
  284. // OutOfAreaClearingConfirmInput input = new OutOfAreaClearingConfirmInput();
  285. // OutOfAreaClearingConfirmData data = new OutOfAreaClearingConfirmData();
  286. // data.trt_year = year;
  287. // data.trt_month = month;
  288. // data.totalrow = totalrow;
  289. // input.detail = details;
  290. // input.data = data;
  291. // JObject joIn = input.ToJson();
  292. // if (UploadToCenter(joIn, out outMsg) != 0)
  293. // {
  294. // }
  295. // else
  296. // {
  297. // UpdateUploadRecord(JArray.Parse(JsonHelper.getDestValue(joIn, "detail")), out outMsg);
  298. // }
  299. // }
  300. // else
  301. // {
  302. // details.Add(OrgnizeSingle3261Detail(dr));
  303. // }
  304. // }
  305. // return 0;
  306. //}
  307. public int BatchUpload(DataGridView dgv, int rows, out string outMsg)
  308. {
  309. int iFalse = 0;outMsg = "";
  310. foreach (DataRow dr in datatable.Rows)
  311. {
  312. string err;
  313. if (dr["MdtrtID"].ToString() == "")
  314. {
  315. continue;
  316. }
  317. if (SingleUpload(dr, out err) != 0)
  318. {
  319. iFalse++;
  320. outMsg = outMsg + "\n" + err;
  321. }
  322. }
  323. return -iFalse;
  324. }
  325. #endregion
  326. #region 更新后台
  327. public int UpdateUploadRecord(JArray ja, out string outMsg)
  328. {
  329. outMsg = "";
  330. int iFalse = 0;
  331. foreach (JObject jo in ja)
  332. {
  333. string err = "";
  334. if (UpdateSingleUploadRecord(jo, out err) != 0)
  335. {
  336. iFalse++;
  337. outMsg = outMsg + "\n;" + err;
  338. }
  339. }
  340. return iFalse;
  341. }
  342. public int UpdateSingleUploadRecord(JObject jo, out string outMsg)
  343. {
  344. JObject joUpdateIn = new JObject();
  345. joUpdateIn.Add("businessCode", "DongGuanOutOfAreaClearing");
  346. joUpdateIn.Add("businessID", jo["setl_sn"].ToString());//单条传,如果批量传,这么处理就有问题
  347. //joUpdateIn.Add("memo", jo["cnfm_flag"].ToString());//单条传,如果批量传,这么处理就有问题
  348. joUpdateIn.Add("memo", transid);//单条传,如果批量传,这么处理就有问题
  349. joUpdateIn.Add("input", jo);
  350. dynamic joOut = new
  351. {
  352. errorCode = "0",
  353. cnfm_flag = jo["cnfm_flag"].ToString()
  354. };
  355. joUpdateIn.Add("output", JObject.FromObject(joOut));
  356. //JoIn包含 起止时间,医院ID,接口ID,患者姓名,患者数电号
  357. JObject joInTmp = JsonHelper.setIrisInpar("02020007", joUpdateIn);
  358. //SELECT *FROM SQLUser.HB_User WHERE Hospital_Dr = 39
  359. joInTmp["session"][0]["userID"] = "278";
  360. joInTmp["session"][0]["hospID"] = Global.inf.hospitalDr;
  361. JObject joRtn = invoker.invokeInsuService(joInTmp.ToString(), "更新通用记录表");
  362. return JsonHelper.parseIrisRtnValue(joRtn, out outMsg);
  363. }
  364. #endregion
  365. #region 取消确认
  366. public int RollBack(JObject input, out string outMsg)
  367. {
  368. JObject joRtn = invoker.invokeCenterService(TradeEnum.RollBackOutOfAreaClearing, new JObject(new JProperty("data",input)));
  369. if (JsonHelper.parseCenterReturnJson(joRtn, out outMsg) != 0)
  370. {
  371. return -1;
  372. }
  373. else
  374. {
  375. outMsg = joRtn.ToString();
  376. return 0;
  377. }
  378. }
  379. #endregion
  380. #region 业务封装
  381. public int Query(JObject input, DataGridView dgv, out string outMsg)
  382. {
  383. if (QueryHospitalData(input, out outMsg) != 0)
  384. {
  385. return -1;
  386. }
  387. else
  388. {
  389. JArray jaData = JArray.Parse(JsonHelper.getDestValue(JObject.Parse(outMsg),"data"));
  390. JObject joRtn = invoker.invokeInsuService(JsonHelper.setIrisInpar("09010129", jaData).ToString(), "根据传入的东莞异地清分记录匹配上传记录表");
  391. JArray jaMatchedData = JArray.FromObject(joRtn["data"]);
  392. dgv.DataSource = (DataTable)jaMatchedData.ToObject(typeof(DataTable));
  393. }
  394. //JArray jaCenter = new JArray();
  395. if (Combin3260Data(input, out JArray jaCenter , out outMsg) != 0 ) return -1;
  396. return MatchCenterData(dgv, jaCenter, out outMsg);
  397. }
  398. public int SingleUpload(DataRow dr, out string outMsg)
  399. {
  400. List<OutOfAreaClearingConfirmDetail> details = new List<OutOfAreaClearingConfirmDetail>();
  401. OutOfAreaClearingConfirmInput input = new OutOfAreaClearingConfirmInput();
  402. OutOfAreaClearingConfirmData data = new OutOfAreaClearingConfirmData();
  403. data.trt_year = year;
  404. data.trt_month = month;
  405. data.totalrow = totalrow;
  406. details.Add(OrgnizeSingle3261Detail(dr));
  407. input.detail = details;
  408. input.data = data;
  409. if (UploadToCenter(input.ToJson(), out outMsg )!= 0)
  410. {
  411. return -1;
  412. }
  413. else
  414. {
  415. transid = Global.curEvt.msgid;
  416. return UpdateSingleUploadRecord(JObject.Parse(JsonHelper.getDestValue(input.ToJson(),"detail[0]")),out outMsg);
  417. }
  418. }
  419. public int Upload(DataGridView dgv, out string outMsg)
  420. {
  421. return BatchUpload(dgv, 100, out outMsg);
  422. }
  423. public int Upload(object[] o, out string errMsg, DataLoader.ProgressCallback callback, DataLoader.ProgressMaxCallback maxCallback, BackgroundWorker worker)
  424. {
  425. int iFalse = 0; errMsg = "";
  426. int i = 0;
  427. maxCallback(datatable.Rows.Count);
  428. foreach (DataRow dr in datatable.Rows)
  429. {
  430. i = i + 1;
  431. // 检查是否应取消操作
  432. if (worker.CancellationPending)
  433. {
  434. errMsg = "操作取消!";
  435. return -1; // 或者其他表示取消的返回值
  436. }
  437. callback(i);
  438. string err;
  439. if (dr["MdtrtID"].ToString() == "")
  440. {
  441. continue;
  442. }
  443. if (SingleUpload(dr, out err) != 0)
  444. {
  445. iFalse++;
  446. errMsg = errMsg + "\n" + err;
  447. }
  448. }
  449. if (iFalse == 0) errMsg = "全部上传成功";
  450. return iFalse;
  451. }
  452. public int RollBackSingle(DataGridView dgv, out string outMsg)
  453. {
  454. OutOfAreaClearingRollBackInput input = new OutOfAreaClearingRollBackInput();
  455. RollBack(input.ToJson(), out outMsg);
  456. return UpdateSingleUploadRecord(input.ToJson(), out outMsg);
  457. }
  458. public int RollBackAll(out string outMsg)
  459. {
  460. OutOfAreaClearingRollBackInput input = new OutOfAreaClearingRollBackInput();
  461. input.trt_month = month;
  462. input.trt_year = year;
  463. input.otransid = "0";
  464. return RollBack(input.ToJson(), out outMsg);
  465. //return UpdateSingleUploadRecord(input.ToJson(), out outMsg);
  466. }
  467. #endregion
  468. #region 导出
  469. public int ExportDataToExcel(object[] o, out string errMsg, DataLoader.ProgressCallback callback, DataLoader.ProgressMaxCallback maxCallback, BackgroundWorker worker)
  470. {
  471. Dataloader_ExportContext exportContext = (Dataloader_ExportContext)o[0];
  472. if ((exportContext.dtExport == null) || (exportContext.dtExport.Rows.Count == 0))
  473. {
  474. errMsg = "查询数据集为空!";
  475. return -1;
  476. }
  477. string LSH = DateTime.Now.ToString("yyyy-MM-dd"); //DateTime.Now.ToString("MMddHHmmssffff");
  478. string filename = exportContext.fileName;
  479. string filepath = Global.curEvt.path + "\\Export\\异地清分";
  480. ; string sFliePathName = $@"{filepath}\{filename}";
  481. //如果不存在目录,则创建目录
  482. if (!Directory.Exists(filepath))
  483. {
  484. //创建文件夹
  485. DirectoryInfo dirInfo = Directory.CreateDirectory(filepath);
  486. }
  487. //如存在同名文件不询问直接删除
  488. if (File.Exists(sFliePathName))
  489. {
  490. File.Delete(sFliePathName);
  491. }
  492. //新版方法,用的EPPLUS,方便
  493. ExportToExcel.ExportDataGridViewToExcel(exportContext.dgv, sFliePathName);
  494. errMsg = ($"导出成功,文件保存路径:{sFliePathName}");
  495. return 0;
  496. }
  497. #endregion
  498. }
  499. class Dataloader_ExportContext
  500. {
  501. public DataTable dtExport;
  502. public DataGridView dgv;
  503. public string filePath;
  504. public string fileName;
  505. }
  506. }