frmEcSettlCertUpload.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Newtonsoft.Json.Linq;
  11. using PTMedicalInsurance.Variables;
  12. using PTMedicalInsurance.Helper;
  13. using PTMedicalInsurance.FormSetter;
  14. using System.Net;
  15. using System.IO;
  16. using System.Text.RegularExpressions;
  17. namespace PTMedicalInsurance.Forms
  18. {
  19. public partial class frmEcSettlCertUpload : Form
  20. {
  21. private DataTable dtEcSettlCertList;
  22. private InvokeHelper invoker = new InvokeHelper();
  23. public frmEcSettlCertUpload()
  24. {
  25. InitializeComponent();
  26. }
  27. private void frmEcSettlCertUpload_Load(object sender, EventArgs e)
  28. {
  29. Global.curEvt.URL = "http://10.1.12.18:17081/ybCommService/v1/func"; //正式环境
  30. Global.inf.SK = "6353F58575D242CC99F84E231578F756"; //电子票据上传接口 SM4加解密密钥
  31. GridViewSetter gvs = new GridViewSetter();
  32. gvs.setDgvEcSettlCertList(dgvEcSettlCertList);
  33. dpST.Text = DateTime.Now.ToString("yyyy-MM-dd");
  34. dpED.Value = DateTime.Now.AddDays(1 - DateTime.Now.Day).AddMonths(1).AddDays(-1);
  35. }
  36. private void btnClose_3_Click(object sender, EventArgs e)
  37. {
  38. this.Close();
  39. }
  40. private void btnQuery_Click(object sender, EventArgs e)
  41. {
  42. JObject joIn = new JObject();
  43. joIn.Add("BeginDate", dpST.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  44. joIn.Add("EndDate", dpED.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  45. joIn.Add("HospDr", Global.inf.hospitalDr);
  46. joIn.Add("PatName", tbName.Text);
  47. joIn.Add("InvNo", tbInvNO.Text);
  48. joIn.Add("InterfaceID", Global.inf.interfaceDr);
  49. JObject joHisRtn = invoker.invokeHISService(JsonHelper.setIrisInpar("05110040", joIn).ToString(), "查询某时间段内或某患者电子结算凭证清单"); //测试服为05110038
  50. string errMsg;
  51. if (JsonHelper.parseIrisRtnValue(joHisRtn, out errMsg) != 0)
  52. {
  53. MessageBox.Show("查询某时间段内或某患者电子结算凭证清单失败!" + errMsg);
  54. return;
  55. }
  56. JArray jaData = JArray.Parse(JsonHelper.getDestValue(joHisRtn, "data"));
  57. JObject joRtn = invoker.invokeInsuService(JsonHelper.setIrisInpar("09010128", jaData).ToString(), "根据传入的电子凭证记录匹配上传记录表");
  58. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  59. {
  60. MessageBox.Show("根据传入的电子凭证记录匹配上传记录表!" + errMsg);
  61. return;
  62. }
  63. dtEcSettlCertList = (DataTable)joRtn["data"].ToObject(typeof(DataTable));
  64. dgvEcSettlCertList.DataSource = dtEcSettlCertList;
  65. }
  66. public static void SaveBase64ToPDF(string base64String, string outputPath)
  67. {
  68. try
  69. {
  70. // 解码Base64字符串
  71. byte[] pdfBytes = Convert.FromBase64String(base64String);
  72. // 保存为PDF文件
  73. File.WriteAllBytes(outputPath, pdfBytes);
  74. //Console.WriteLine($"PDF文件已保存到: {outputPath}");
  75. }
  76. catch (Exception ex)
  77. {
  78. //Console.WriteLine($"解析失败: {ex.Message}");
  79. }
  80. }
  81. private int ConvertPDFurlToBase64(string invNo, string pdfUrl,out string base64PDF,out string errMsg)
  82. {
  83. errMsg = ""; base64PDF = "";
  84. string SavePath = Global.curEvt.path + @"\PDF\"+ invNo+".pdf";
  85. try
  86. {
  87. //创建PDF文件夹
  88. if (!Directory.Exists(Global.curEvt.path + @"\PDF\"))
  89. {
  90. Directory.CreateDirectory(Global.curEvt.path + @"\PDF\");
  91. }
  92. using (WebClient client = new WebClient())
  93. {
  94. byte[] fileData = client.DownloadData(pdfUrl); // 下载文件数据到字节数组中
  95. File.WriteAllBytes(SavePath, fileData); // 将字节数组写入文件系统
  96. //Console.WriteLine("文件已保存到: " + SavePath);
  97. }
  98. base64PDF = ConvertPdfToBase64(SavePath);
  99. //Console.WriteLine(base64String);
  100. if (base64PDF == "")
  101. return -1;
  102. else
  103. return 0;
  104. }
  105. catch(Exception ex)
  106. {
  107. errMsg = ex.ToString();
  108. return -1;
  109. }
  110. }
  111. private string ConvertPdfToBase64(string filePath)
  112. {
  113. try
  114. {
  115. // 读取PDF文件为字节数组
  116. byte[] pdfBytes = File.ReadAllBytes(filePath);
  117. // 将字节数组转换为Base64字符串
  118. string base64String = Convert.ToBase64String(pdfBytes);
  119. return base64String;
  120. }
  121. catch (Exception ex)
  122. {
  123. Console.WriteLine("Error: " + ex.Message);
  124. return null;
  125. }
  126. }
  127. /// <summary>
  128. /// 成功后更新通用上传记录表
  129. /// </summary>
  130. /// <param name="joIn"></param>
  131. /// <returns></returns>
  132. public JObject Update(JObject joIn)
  133. {
  134. //JoIn包含 起止时间,医院ID,接口ID,患者姓名,患者数电号
  135. JObject joInTmp = JsonHelper.setIrisInpar("02020007", joIn);
  136. joInTmp["session"][0]["userID"] = "166";
  137. joInTmp["session"][0]["hospID"] = Global.inf.hospitalDr;
  138. JObject joRtn = invoker.invokeInsuService(joInTmp.ToString(), "更新通用记录表");
  139. return joRtn;
  140. }
  141. private void btnBatchUpload_Click(object sender, EventArgs e)
  142. {
  143. EcSettlBillUpload();
  144. }
  145. public void EcSettlBillUpload()
  146. {
  147. if ((DataTable)dgvEcSettlCertList.DataSource == null)
  148. {
  149. MessageBox.Show("请先查询电子发票信息信息!");
  150. return;
  151. }
  152. string errMsg, base64PDF;
  153. string CureType = "0", Status;
  154. JObject joRtn = new JObject();
  155. int i = dgvEcSettlCertList.CurrentRow.Index;
  156. string PrintPaymentInvDr = dtEcSettlCertList.Rows[i]["PrintPaymentInvDr"].ToString();
  157. string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString();
  158. string InsuTradeNo = dtEcSettlCertList.Rows[i]["InsuTradeNo"].ToString();
  159. string InvoiceFileUrl = dtEcSettlCertList.Rows[i]["InvoiceFileUrl"].ToString(); //发票PDF地址
  160. string PrintDate = dtEcSettlCertList.Rows[i]["PrintDate"].ToString();
  161. string PrintTime = dtEcSettlCertList.Rows[i]["PrintTime"].ToString();
  162. string AdmDesc = dtEcSettlCertList.Rows[i]["AdmDesc"].ToString();
  163. string StatusDesc = dtEcSettlCertList.Rows[i]["StatusDesc"].ToString();
  164. string HospDr = dtEcSettlCertList.Rows[i]["HospDr"].ToString();
  165. decimal BliAmt = decimal.Parse(dtEcSettlCertList.Rows[i]["PatAmount"].ToString());
  166. string HisBizNo = "0515500901" + DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.ToString("HHmmss") + "99" + DateTime.Now.ToString("ffff");
  167. if (AdmDesc == "门诊")
  168. CureType = "0";
  169. else if (AdmDesc == "住院")
  170. CureType = "1";
  171. if (StatusDesc == "正常")
  172. Status = "0";
  173. else if (StatusDesc == "作废")
  174. Status = "1";
  175. else
  176. Status = "3";
  177. if (ConvertPDFurlToBase64(InvNo, InvoiceFileUrl, out base64PDF, out errMsg) != 0)
  178. {
  179. MessageBox.Show("将发票PDF文件转换为base64格式失败!" + errMsg);
  180. return;
  181. }
  182. //获取HIS 原始入参
  183. JObject jo = new JObject();
  184. jo.Add("InvNo", InvNo);
  185. jo.Add("PrintPaymentInvDr", PrintPaymentInvDr);
  186. jo.Add("HospDr", HospDr);
  187. //JoIn包含 患者数电号
  188. joRtn = invoker.invokeHISService(JsonHelper.setIrisInpar("05110041", jo).ToString(), "获取该数电号对应的数电入参"); //测试服05110039
  189. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  190. {
  191. errMsg = ("获取该数电号对应的数电入参失败:" + errMsg);
  192. MessageBox.Show(errMsg);
  193. return;
  194. }
  195. JObject joUpList = JObject.Parse(JsonHelper.getDestValue(joRtn, "data.upldDetlList[0]"));
  196. string ELEC_SETL_CERT_CODE = JsonHelper.getDestValue(joUpList, "elecSetlCertCode");
  197. string ELEC_SETL_CERT_NO = JsonHelper.getDestValue(joUpList, "elecSetlCertNo");
  198. string ELEC_SETL_CERT_CHK_CODE = JsonHelper.getDestValue(joUpList, "elecSetlCertChkcode");
  199. string ELEC_SETL_CERT_TYPE = JsonHelper.getDestValue(joUpList, "elecSetlCertType");
  200. JObject joElecSetInfo = new JObject();
  201. joElecSetInfo.Add("ELEC_SETL_CERT_CODE", ELEC_SETL_CERT_CODE); //电子结算凭证代码 电子结算凭证类型为1-财政电子票据、2-税务电子发票时必填;电子结算凭证类型为3-税务数电票时非必填
  202. joElecSetInfo.Add("ELEC_SETL_CERT_NO", ELEC_SETL_CERT_NO); //电子结算凭证号码
  203. joElecSetInfo.Add("ELEC_SETL_CERT_CHK_CODE", ELEC_SETL_CERT_CHK_CODE); //电子结算凭证校验码 电子结算凭证类型为1-财政电子票据、2-税务电子发票时必填;电子结算凭证类型为3 - 税务数电票时非必填
  204. joElecSetInfo.Add("ELEC_SETL_CERT_TYPE", ELEC_SETL_CERT_TYPE); //电子结算凭证类型 1-财政电子票据2-税务电子发票3-税务数电票
  205. joElecSetInfo.Add("ELEC_SETL_CERT_FLAG", Status); //电子结算凭证标识 0-正常票1-冲红票3-税务数电票
  206. joElecSetInfo.Add("REL_ELEC_SETL_CERT_CODE", ""); //相关电子结算凭证代码 原电子结算凭证代码 冲红票必填
  207. joElecSetInfo.Add("REL_ELEC_SETL_CERT_NO", ""); //相关电子结算凭证号码 原电子结算凭证号码 冲红票必填
  208. joElecSetInfo.Add("BILLER", ""); //开票人
  209. joElecSetInfo.Add("RECHKER", ""); //复核人
  210. joElecSetInfo.Add("BILL_AMT", BliAmt); //开票金额
  211. joElecSetInfo.Add("BILL_DATE", PrintDate); //开票日期
  212. joElecSetInfo.Add("BILL_TIME", PrintTime); //开票时间
  213. JObject joInput = new JObject();
  214. joInput.Add("TRADE_NO", InsuTradeNo); //医保交易流水号
  215. joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号 格式:10位院区编码 + yyyyMMdd(8位日期) + HHmmss(6位时分秒) + 6位序号
  216. joInput.Add("CURE_TYPE", CureType); //医疗类别 0:门诊类(包含普通门急诊)1:住院类
  217. joInput.Add("ELECT_MEDIUM_TYPE", "1"); //1-PDF 2-OFD 3-XML
  218. joInput.Add("ELECT_XML_TYPE", "1"); //0-带XML信息1-不带XML信息电子票据介质类型为OFD或XML时,此字段固定传1(不带XML信息),PDF类型根据实际情况传入
  219. joInput.Add("ELECT_SETL_INFO", joElecSetInfo); //电子结算凭证信息
  220. joInput.Add("ELECT_INVOICE", base64PDF); //将电子发票(PDF格式)的流进行BASE64转码后,所得到的字符串
  221. //上传给中心
  222. string sInput = JsonHelper.setCenterInpar_SX("0301", joInput.ToString());
  223. joRtn = invoker.invokeCenterService_InvNO("0301", sInput);
  224. if (joRtn["ret_code"].ToString() != "0")
  225. {
  226. MessageBox.Show(joRtn["ret_msg"].ToString());
  227. return;
  228. }
  229. else
  230. {
  231. string out_data = joRtn["out_data"].ToString();
  232. //对返回值进行解密
  233. string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK);
  234. JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString));
  235. string Elect_Status = JsonHelper.getDestValue(joElectStatus, "Elect_Status");
  236. if (Elect_Status != "1")
  237. {
  238. MessageBox.Show("调用医保电子票据信息上传接口(报文编号0301)上传失败!");
  239. return;
  240. }
  241. else
  242. {
  243. //更新上传记录表
  244. JObject joUpdateIn = new JObject();
  245. joUpdateIn.Add("businessCode", "EcSettlCertUpload");
  246. joUpdateIn.Add("businessID", InvNo);
  247. joUpdateIn.Add("memo", HisBizNo);
  248. joUpdateIn.Add("input", JObject.Parse(sInput));
  249. joRtn["errorCode"] = new JObject();
  250. joRtn["errorCode"] = 0;
  251. joUpdateIn.Add("output", joRtn);
  252. JObject joUpdateRtn = Update(joUpdateIn);
  253. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out errMsg) != 0)
  254. MessageBox.Show("医保电子票据信息上传成功,但更新后台失败:" + errMsg);
  255. else
  256. MessageBox.Show("医保电子票据信息上传成功!");
  257. }
  258. }
  259. }
  260. public void EcSettlLisGenerationStatus()
  261. {
  262. if ((DataTable)dgvEcSettlCertList.DataSource == null)
  263. {
  264. MessageBox.Show("请先查询电子发票信息!");
  265. return;
  266. }
  267. int i = dgvEcSettlCertList.CurrentRow.Index;
  268. string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString();
  269. string HisBizNo = dtEcSettlCertList.Rows[i]["UpldBchno"].ToString(); //上传批次号-医院业务流水号(0301)
  270. if (string.IsNullOrEmpty(HisBizNo))
  271. {
  272. MessageBox.Show("请先医保电子票据信息上传(报文编号0301)!");
  273. return;
  274. }
  275. JObject joInput = new JObject();
  276. joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号(0301)
  277. //上传给中心
  278. string sInput = JsonHelper.setCenterInpar_SX("0304", joInput.ToString());
  279. JObject joRtn = invoker.invokeCenterService_InvNO("0304", sInput);
  280. if (joRtn["ret_code"].ToString() != "0")
  281. {
  282. MessageBox.Show("调用医保电子结算清单生成状态查询(报文编号0304)失败:" + joRtn["ret_msg"].ToString());
  283. return;
  284. }
  285. else
  286. {
  287. //对返回值进行解密
  288. string out_data = joRtn["out_data"].ToString();
  289. string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK);
  290. JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString));
  291. string HIS_BIZ_NO = JsonHelper.getDestValue(joElectStatus, "HIS_BIZ_NO"); //医院业务流水号
  292. string ELEC_SSR_CODE = JsonHelper.getDestValue(joElectStatus, "ELEC_SSR_CODE"); //医保结算清单获取码
  293. string BIZ_STATUS = JsonHelper.getDestValue(joElectStatus, "BIZ_STATUS"); //处理状态 0-处理中1-已完成
  294. if (BIZ_STATUS == "0")
  295. {
  296. MessageBox.Show("医保电子结算清单生成状态-【0】-处理中,请稍后重新查询!");
  297. return;
  298. }
  299. else
  300. if (BIZ_STATUS == "1")
  301. {
  302. //MessageBox.Show("医保电子结算清单生成状态-【1】-已完成");
  303. //更新上传记录表
  304. JObject joUpdateIn = new JObject();
  305. joUpdateIn.Add("businessCode", "EcSettlLisGenerationStatus");
  306. joUpdateIn.Add("businessID", InvNo);
  307. joUpdateIn.Add("memo", ELEC_SSR_CODE);
  308. joUpdateIn.Add("input", JObject.Parse(sInput));
  309. joRtn["errorCode"] = new JObject();
  310. joRtn["errorCode"] = 0;
  311. joUpdateIn.Add("output", joRtn);
  312. JObject joUpdateRtn = Update(joUpdateIn);
  313. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out string errMsg) != 0)
  314. MessageBox.Show("医保电子结算清单生成状态查询成功,但更新后台失败:" + errMsg);
  315. else
  316. MessageBox.Show("医保电子结算清单生成状态查询成功!");
  317. }
  318. }
  319. }
  320. private void tsmI_0304_Click(object sender, EventArgs e)
  321. {
  322. EcSettlLisGenerationStatus();
  323. }
  324. private void tsmI_0301_Click(object sender, EventArgs e)
  325. {
  326. EcSettlBillUpload();
  327. }
  328. public void EcSettlFileGet()
  329. {
  330. if ((DataTable)dgvEcSettlCertList.DataSource == null)
  331. {
  332. MessageBox.Show("请先查询电子发票信息!");
  333. return;
  334. }
  335. int i = dgvEcSettlCertList.CurrentRow.Index;
  336. string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString();
  337. string HisBizNo = dtEcSettlCertList.Rows[i]["UpldBchno"].ToString(); //上传批次号-医院业务流水号(0301)
  338. if (string.IsNullOrEmpty(HisBizNo))
  339. {
  340. MessageBox.Show("请先将医保电子票据信息上传(报文编号0301)!");
  341. return;
  342. }
  343. JObject joInput = new JObject();
  344. joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号(0301)
  345. //上传给中心
  346. string sInput = JsonHelper.setCenterInpar_SX("0304", joInput.ToString());
  347. JObject joRtn = invoker.invokeCenterService_InvNO("0304", sInput);
  348. if (joRtn["ret_code"].ToString() != "0")
  349. {
  350. MessageBox.Show("调用医保电子结算清单生成状态查询(报文编号0304)失败:" + joRtn["ret_msg"].ToString());
  351. return;
  352. }
  353. else
  354. {
  355. //对返回值进行解密
  356. string out_data = joRtn["out_data"].ToString();
  357. string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK);
  358. JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString));
  359. string HIS_BIZ_NO = JsonHelper.getDestValue(joElectStatus, "HIS_BIZ_NO"); //医院业务流水号
  360. string ELEC_SSR_CODE = JsonHelper.getDestValue(joElectStatus, "ELEC_SSR_CODE"); //医保结算清单获取码
  361. string BIZ_STATUS = JsonHelper.getDestValue(joElectStatus, "BIZ_STATUS"); //处理状态 0-处理中1-已完成
  362. if (BIZ_STATUS == "0")
  363. {
  364. MessageBox.Show("医保电子结算清单生成状态-【0】-处理中,请稍后重新查询!");
  365. return;
  366. }
  367. else
  368. if (BIZ_STATUS == "1")
  369. {
  370. JObject jo = new JObject();
  371. jo.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号(0301)
  372. jo.Add("ELEC_SSR_CODE", ELEC_SSR_CODE); //医保结算清单获取码
  373. //上传给中心
  374. sInput = JsonHelper.setCenterInpar_SX("0305", jo.ToString());
  375. joRtn = invoker.invokeCenterService_InvNO("0305", sInput);
  376. if (joRtn["ret_code"].ToString() != "0")
  377. {
  378. MessageBox.Show("医保电子结算清单文件获取(报文编号0305)失败:" + joRtn["ret_msg"].ToString());
  379. return;
  380. }
  381. else
  382. {
  383. MessageBox.Show("医保电子结算清单文件获取(报文编号0305)成功");
  384. //对返回值进行解密
  385. out_data = joRtn["out_data"].ToString();
  386. encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK);
  387. joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString));
  388. HIS_BIZ_NO = JsonHelper.getDestValue(joElectStatus, "HIS_BIZ_NO"); //医院业务流水号
  389. BIZ_STATUS = JsonHelper.getDestValue(joElectStatus, "BIZ_STATUS"); //处理状态 0-处理中1-已完成
  390. string ELECT_DATA = JsonHelper.getDestValue(joElectStatus, "ELECT_DATA"); //结算票据数据
  391. JObject joElectData = JObject.Parse(ELECT_DATA);
  392. string SETTLEMENT_CODE = JsonHelper.getDestValue(joElectData, "SETTLEMENT_CODE"); //1:门诊费用结算清单2:住院费用清单3:住院费用结算单4:特殊病定额管理费用结算明细表
  393. string SETTLEMENT_NAME = JsonHelper.getDestValue(joElectData, "SETTLEMENT_NAME");
  394. string SETTLEMENT_DATA = JsonHelper.getDestValue(joElectData, "SETTLEMENT_DATA");//将结算票据信息(PDF格式)的流进行BASE64转码后,所得到的字符串
  395. string Path = @"D:\";
  396. SaveBase64ToPDF(SETTLEMENT_DATA, Path);
  397. }
  398. }
  399. }
  400. }
  401. private void tsmI_0305_Click(object sender, EventArgs e)
  402. {
  403. EcSettlFileGet();
  404. }
  405. private void btnEcSettlFileGet_Click(object sender, EventArgs e)
  406. {
  407. EcSettlFileGet();
  408. }
  409. }
  410. }