frmEcSettlCertUpload.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. private int ConvertPDFurlToBase64(string invNo, string pdfUrl,out string base64PDF,out string errMsg)
  67. {
  68. errMsg = ""; base64PDF = "";
  69. string SavePath = Global.curEvt.path + @"\PDF\"+ invNo+".pdf";
  70. try
  71. {
  72. //创建PDF文件夹
  73. if (!Directory.Exists(Global.curEvt.path + @"\PDF\"))
  74. {
  75. Directory.CreateDirectory(Global.curEvt.path + @"\PDF\");
  76. }
  77. using (WebClient client = new WebClient())
  78. {
  79. byte[] fileData = client.DownloadData(pdfUrl); // 下载文件数据到字节数组中
  80. File.WriteAllBytes(SavePath, fileData); // 将字节数组写入文件系统
  81. //Console.WriteLine("文件已保存到: " + SavePath);
  82. }
  83. base64PDF = ConvertPdfToBase64(SavePath);
  84. //Console.WriteLine(base64String);
  85. if (base64PDF == "")
  86. return -1;
  87. else
  88. return 0;
  89. }
  90. catch(Exception ex)
  91. {
  92. errMsg = ex.ToString();
  93. return -1;
  94. }
  95. }
  96. private string ConvertPdfToBase64(string filePath)
  97. {
  98. try
  99. {
  100. // 读取PDF文件为字节数组
  101. byte[] pdfBytes = File.ReadAllBytes(filePath);
  102. // 将字节数组转换为Base64字符串
  103. string base64String = Convert.ToBase64String(pdfBytes);
  104. return base64String;
  105. }
  106. catch (Exception ex)
  107. {
  108. Console.WriteLine("Error: " + ex.Message);
  109. return null;
  110. }
  111. }
  112. private void btnBatchUpload_Click(object sender, EventArgs e)
  113. {
  114. string errMsg, base64PDF;
  115. string CureType = "0", Status;
  116. JObject joRtn = new JObject();
  117. int i = dgvEcSettlCertList.CurrentRow.Index;
  118. string PrintPaymentInvDr = dtEcSettlCertList.Rows[i]["PrintPaymentInvDr"].ToString();
  119. string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString();
  120. string InsuTradeNo = dtEcSettlCertList.Rows[i]["InsuTradeNo"].ToString();
  121. string InvoiceFileUrl = dtEcSettlCertList.Rows[i]["InvoiceFileUrl"].ToString(); //发票PDF地址
  122. string PrintDate= dtEcSettlCertList.Rows[i]["PrintDate"].ToString();
  123. string PrintTime = dtEcSettlCertList.Rows[i]["PrintTime"].ToString();
  124. string AdmDesc = dtEcSettlCertList.Rows[i]["AdmDesc"].ToString();
  125. string StatusDesc = dtEcSettlCertList.Rows[i]["StatusDesc"].ToString();
  126. string HospDr = dtEcSettlCertList.Rows[i]["HospDr"].ToString();
  127. decimal BliAmt = decimal.Parse(dtEcSettlCertList.Rows[i]["PatAmount"].ToString());
  128. string HisBizNo = "0515500901" + DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.ToString("HHmmss") + "99" + DateTime.Now.ToString("ffff");
  129. if (AdmDesc == "门诊")
  130. CureType = "0";
  131. else if(AdmDesc == "住院")
  132. CureType = "1";
  133. if (StatusDesc == "正常")
  134. Status = "0";
  135. else if (StatusDesc == "作废")
  136. Status = "1";
  137. else
  138. Status = "3";
  139. if (ConvertPDFurlToBase64(InvNo, InvoiceFileUrl, out base64PDF, out errMsg) != 0)
  140. {
  141. MessageBox.Show("将发票PDF文件转换为base64格式失败!" + errMsg);
  142. return;
  143. }
  144. //获取HIS 原始入参
  145. JObject jo = new JObject();
  146. jo.Add("InvNo", InvNo);
  147. jo.Add("PrintPaymentInvDr", PrintPaymentInvDr);
  148. jo.Add("HospDr", HospDr);
  149. //JoIn包含 患者数电号
  150. joRtn = invoker.invokeHISService(JsonHelper.setIrisInpar("05110041", jo).ToString(), "获取该数电号对应的数电入参"); //测试服05110039
  151. if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0)
  152. {
  153. errMsg = ("获取该数电号对应的数电入参失败:" + errMsg);
  154. MessageBox.Show(errMsg);
  155. return;
  156. }
  157. JObject joUpList = JObject.Parse(JsonHelper.getDestValue(joRtn, "data.upldDetlList[0]"));
  158. string ELEC_SETL_CERT_CODE = JsonHelper.getDestValue(joUpList, "elecSetlCertCode");
  159. string ELEC_SETL_CERT_NO = JsonHelper.getDestValue(joUpList, "elecSetlCertNo");
  160. string ELEC_SETL_CERT_CHK_CODE = JsonHelper.getDestValue(joUpList, "elecSetlCertChkcode");
  161. string ELEC_SETL_CERT_TYPE = JsonHelper.getDestValue(joUpList, "elecSetlCertType");
  162. JObject joElecSetInfo = new JObject();
  163. joElecSetInfo.Add("ELEC_SETL_CERT_CODE", ELEC_SETL_CERT_CODE); //电子结算凭证代码 电子结算凭证类型为1-财政电子票据、2-税务电子发票时必填;电子结算凭证类型为3-税务数电票时非必填
  164. joElecSetInfo.Add("ELEC_SETL_CERT_NO", ELEC_SETL_CERT_NO); //电子结算凭证号码
  165. joElecSetInfo.Add("ELEC_SETL_CERT_CHK_CODE", ELEC_SETL_CERT_CHK_CODE); //电子结算凭证校验码 电子结算凭证类型为1-财政电子票据、2-税务电子发票时必填;电子结算凭证类型为3 - 税务数电票时非必填
  166. joElecSetInfo.Add("ELEC_SETL_CERT_TYPE", ELEC_SETL_CERT_TYPE); //电子结算凭证类型 1-财政电子票据2-税务电子发票3-税务数电票
  167. joElecSetInfo.Add("ELEC_SETL_CERT_FLAG", Status); //电子结算凭证标识 0-正常票1-冲红票3-税务数电票
  168. joElecSetInfo.Add("REL_ELEC_SETL_CERT_CODE", ""); //相关电子结算凭证代码 原电子结算凭证代码 冲红票必填
  169. joElecSetInfo.Add("REL_ELEC_SETL_CERT_NO", ""); //相关电子结算凭证号码 原电子结算凭证号码 冲红票必填
  170. joElecSetInfo.Add("BILLER", ""); //开票人
  171. joElecSetInfo.Add("RECHKER", ""); //复核人
  172. joElecSetInfo.Add("BILL_AMT", BliAmt); //开票金额
  173. joElecSetInfo.Add("BILL_DATE", PrintDate); //开票日期
  174. joElecSetInfo.Add("BILL_TIME", PrintTime); //开票时间
  175. JObject joInput = new JObject();
  176. joInput.Add("TRADE_NO", InsuTradeNo); //医保交易流水号
  177. joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号 格式:10位院区编码 + yyyyMMdd(8位日期) + HHmmss(6位时分秒) + 6位序号
  178. joInput.Add("CURE_TYPE", CureType); //医疗类别 0:门诊类(包含普通门急诊)1:住院类
  179. joInput.Add("ELECT_MEDIUM_TYPE", "1"); //1-PDF 2-OFD 3-XML
  180. joInput.Add("ELECT_XML_TYPE", "1"); //0-带XML信息1-不带XML信息电子票据介质类型为OFD或XML时,此字段固定传1(不带XML信息),PDF类型根据实际情况传入
  181. joInput.Add("ELECT_SETL_INFO", joElecSetInfo); //电子结算凭证信息
  182. joInput.Add("ELECT_INVOICE", base64PDF); //将电子发票(PDF格式)的流进行BASE64转码后,所得到的字符串
  183. //上传给中心
  184. string sInput = JsonHelper.setCenterInpar_SX("0301", joInput.ToString());
  185. joRtn = invoker.invokeCenterService_InvNO("0301", sInput);
  186. if (joRtn["ret_code"].ToString() != "0")
  187. {
  188. MessageBox.Show(joRtn["ret_msg"].ToString());
  189. return;
  190. }
  191. else
  192. {
  193. string out_data = joRtn["out_data"].ToString();
  194. //对返回值进行解密
  195. string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK);
  196. JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString));
  197. string Elect_Status = JsonHelper.getDestValue(joElectStatus, "Elect_Status");
  198. if (Elect_Status != "1")
  199. {
  200. MessageBox.Show("调用医保电子票据信息上传接口(报文编号0301)上传失败!");
  201. return;
  202. }
  203. else
  204. {
  205. //更新上传记录表
  206. JObject joUpdateIn = new JObject();
  207. joUpdateIn.Add("businessCode", "EcSettlCertUpload");
  208. joUpdateIn.Add("businessID", ELEC_SETL_CERT_NO);
  209. joUpdateIn.Add("memo", HisBizNo);
  210. joUpdateIn.Add("input", sInput);
  211. joRtn["errorCode"] = new JObject();
  212. joRtn["errorCode"] = 0;
  213. joUpdateIn.Add("output", joRtn);
  214. JObject joUpdateRtn = Update(joUpdateIn);
  215. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out errMsg) != 0)
  216. {
  217. MessageBox.Show("医保电子票据信息上传成功,但更新后台失败:" + errMsg);
  218. }
  219. else
  220. {
  221. MessageBox.Show("医保电子票据信息上传成功!");
  222. }
  223. }
  224. }
  225. }
  226. /// <summary>
  227. /// 成功后更新记录表
  228. /// </summary>
  229. /// <param name="joIn"></param>
  230. /// <returns></returns>
  231. public JObject Update(JObject joIn)
  232. {
  233. //JoIn包含 起止时间,医院ID,接口ID,患者姓名,患者数电号
  234. JObject joInTmp = JsonHelper.setIrisInpar("02020007", joIn);
  235. joInTmp["session"][0]["userID"] = "166";
  236. joInTmp["session"][0]["hospID"] = Global.inf.hospitalDr;
  237. JObject joRtn = invoker.invokeInsuService(joInTmp.ToString(), "更新通用记录表");
  238. return joRtn;
  239. }
  240. }
  241. }