using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json.Linq; using PTMedicalInsurance.Variables; using PTMedicalInsurance.Helper; using PTMedicalInsurance.FormSetter; using System.Net; using System.IO; using System.Text.RegularExpressions; namespace PTMedicalInsurance.Forms { public partial class frmEcSettlCertUpload : Form { private DataTable dtEcSettlCertList; private InvokeHelper invoker = new InvokeHelper(); public frmEcSettlCertUpload() { InitializeComponent(); } private void frmEcSettlCertUpload_Load(object sender, EventArgs e) { Global.curEvt.URL = "http://10.1.12.18:17081/ybCommService/v1/func"; //正式环境 Global.inf.SK = "6353F58575D242CC99F84E231578F756"; //电子票据上传接口 SM4加解密密钥 GridViewSetter gvs = new GridViewSetter(); gvs.setDgvEcSettlCertList(dgvEcSettlCertList); dpST.Text = DateTime.Now.ToString("yyyy-MM-dd"); dpED.Value = DateTime.Now.AddDays(1 - DateTime.Now.Day).AddMonths(1).AddDays(-1); } private void btnClose_3_Click(object sender, EventArgs e) { this.Close(); } private void btnQuery_Click(object sender, EventArgs e) { JObject joIn = new JObject(); joIn.Add("BeginDate", dpST.Value.ToString("yyyy-MM-dd HH:mm:ss")); joIn.Add("EndDate", dpED.Value.ToString("yyyy-MM-dd HH:mm:ss")); joIn.Add("HospDr", Global.inf.hospitalDr); joIn.Add("PatName", tbName.Text); joIn.Add("InvNo", tbInvNO.Text); joIn.Add("InterfaceID", Global.inf.interfaceDr); JObject joHisRtn = invoker.invokeHISService(JsonHelper.setIrisInpar("05110040", joIn).ToString(), "查询某时间段内或某患者电子结算凭证清单"); //测试服为05110038 string errMsg; if (JsonHelper.parseIrisRtnValue(joHisRtn, out errMsg) != 0) { MessageBox.Show("查询某时间段内或某患者电子结算凭证清单失败!" + errMsg); return; } JArray jaData = JArray.Parse(JsonHelper.getDestValue(joHisRtn, "data")); JObject joRtn = invoker.invokeInsuService(JsonHelper.setIrisInpar("09010128", jaData).ToString(), "根据传入的电子凭证记录匹配上传记录表"); if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0) { MessageBox.Show("根据传入的电子凭证记录匹配上传记录表!" + errMsg); return; } dtEcSettlCertList = (DataTable)joRtn["data"].ToObject(typeof(DataTable)); dgvEcSettlCertList.DataSource = dtEcSettlCertList; } public static void SaveBase64ToPDF(string base64String, string outputPath) { try { // 解码Base64字符串 byte[] pdfBytes = Convert.FromBase64String(base64String); // 保存为PDF文件 File.WriteAllBytes(outputPath, pdfBytes); //Console.WriteLine($"PDF文件已保存到: {outputPath}"); } catch (Exception ex) { //Console.WriteLine($"解析失败: {ex.Message}"); } } private int ConvertPDFurlToBase64(string invNo, string pdfUrl,out string base64PDF,out string errMsg) { errMsg = ""; base64PDF = ""; string SavePath = Global.curEvt.path + @"\PDF\"+ invNo+".pdf"; try { //创建PDF文件夹 if (!Directory.Exists(Global.curEvt.path + @"\PDF\")) { Directory.CreateDirectory(Global.curEvt.path + @"\PDF\"); } using (WebClient client = new WebClient()) { byte[] fileData = client.DownloadData(pdfUrl); // 下载文件数据到字节数组中 File.WriteAllBytes(SavePath, fileData); // 将字节数组写入文件系统 //Console.WriteLine("文件已保存到: " + SavePath); } base64PDF = ConvertPdfToBase64(SavePath); //Console.WriteLine(base64String); if (base64PDF == "") return -1; else return 0; } catch(Exception ex) { errMsg = ex.ToString(); return -1; } } private string ConvertPdfToBase64(string filePath) { try { // 读取PDF文件为字节数组 byte[] pdfBytes = File.ReadAllBytes(filePath); // 将字节数组转换为Base64字符串 string base64String = Convert.ToBase64String(pdfBytes); return base64String; } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); return null; } } /// /// 成功后更新通用上传记录表 /// /// /// public JObject Update(JObject joIn) { //JoIn包含 起止时间,医院ID,接口ID,患者姓名,患者数电号 JObject joInTmp = JsonHelper.setIrisInpar("02020007", joIn); joInTmp["session"][0]["userID"] = "166"; joInTmp["session"][0]["hospID"] = Global.inf.hospitalDr; JObject joRtn = invoker.invokeInsuService(joInTmp.ToString(), "更新通用记录表"); return joRtn; } private void btnBatchUpload_Click(object sender, EventArgs e) { EcSettlBillUpload(); } public void EcSettlBillUpload() { if ((DataTable)dgvEcSettlCertList.DataSource == null) { MessageBox.Show("请先查询电子发票信息信息!"); return; } string errMsg, base64PDF; string CureType = "0", Status; JObject joRtn = new JObject(); int i = dgvEcSettlCertList.CurrentRow.Index; string PrintPaymentInvDr = dtEcSettlCertList.Rows[i]["PrintPaymentInvDr"].ToString(); string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString(); string InsuTradeNo = dtEcSettlCertList.Rows[i]["InsuTradeNo"].ToString(); string InvoiceFileUrl = dtEcSettlCertList.Rows[i]["InvoiceFileUrl"].ToString(); //发票PDF地址 string PrintDate = dtEcSettlCertList.Rows[i]["PrintDate"].ToString(); string PrintTime = dtEcSettlCertList.Rows[i]["PrintTime"].ToString(); string AdmDesc = dtEcSettlCertList.Rows[i]["AdmDesc"].ToString(); string StatusDesc = dtEcSettlCertList.Rows[i]["StatusDesc"].ToString(); string HospDr = dtEcSettlCertList.Rows[i]["HospDr"].ToString(); decimal BliAmt = decimal.Parse(dtEcSettlCertList.Rows[i]["PatAmount"].ToString()); string HisBizNo = "0515500901" + DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.ToString("HHmmss") + "99" + DateTime.Now.ToString("ffff"); if (AdmDesc == "门诊") CureType = "0"; else if (AdmDesc == "住院") CureType = "1"; if (StatusDesc == "正常") Status = "0"; else if (StatusDesc == "作废") Status = "1"; else Status = "3"; if (ConvertPDFurlToBase64(InvNo, InvoiceFileUrl, out base64PDF, out errMsg) != 0) { MessageBox.Show("将发票PDF文件转换为base64格式失败!" + errMsg); return; } //获取HIS 原始入参 JObject jo = new JObject(); jo.Add("InvNo", InvNo); jo.Add("PrintPaymentInvDr", PrintPaymentInvDr); jo.Add("HospDr", HospDr); //JoIn包含 患者数电号 joRtn = invoker.invokeHISService(JsonHelper.setIrisInpar("05110041", jo).ToString(), "获取该数电号对应的数电入参"); //测试服05110039 if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0) { errMsg = ("获取该数电号对应的数电入参失败:" + errMsg); MessageBox.Show(errMsg); return; } JObject joUpList = JObject.Parse(JsonHelper.getDestValue(joRtn, "data.upldDetlList[0]")); string ELEC_SETL_CERT_CODE = JsonHelper.getDestValue(joUpList, "elecSetlCertCode"); string ELEC_SETL_CERT_NO = JsonHelper.getDestValue(joUpList, "elecSetlCertNo"); string ELEC_SETL_CERT_CHK_CODE = JsonHelper.getDestValue(joUpList, "elecSetlCertChkcode"); string ELEC_SETL_CERT_TYPE = JsonHelper.getDestValue(joUpList, "elecSetlCertType"); JObject joElecSetInfo = new JObject(); joElecSetInfo.Add("ELEC_SETL_CERT_CODE", ELEC_SETL_CERT_CODE); //电子结算凭证代码 电子结算凭证类型为1-财政电子票据、2-税务电子发票时必填;电子结算凭证类型为3-税务数电票时非必填 joElecSetInfo.Add("ELEC_SETL_CERT_NO", ELEC_SETL_CERT_NO); //电子结算凭证号码 joElecSetInfo.Add("ELEC_SETL_CERT_CHK_CODE", ELEC_SETL_CERT_CHK_CODE); //电子结算凭证校验码 电子结算凭证类型为1-财政电子票据、2-税务电子发票时必填;电子结算凭证类型为3 - 税务数电票时非必填 joElecSetInfo.Add("ELEC_SETL_CERT_TYPE", ELEC_SETL_CERT_TYPE); //电子结算凭证类型 1-财政电子票据2-税务电子发票3-税务数电票 joElecSetInfo.Add("ELEC_SETL_CERT_FLAG", Status); //电子结算凭证标识 0-正常票1-冲红票3-税务数电票 joElecSetInfo.Add("REL_ELEC_SETL_CERT_CODE", ""); //相关电子结算凭证代码 原电子结算凭证代码 冲红票必填 joElecSetInfo.Add("REL_ELEC_SETL_CERT_NO", ""); //相关电子结算凭证号码 原电子结算凭证号码 冲红票必填 joElecSetInfo.Add("BILLER", ""); //开票人 joElecSetInfo.Add("RECHKER", ""); //复核人 joElecSetInfo.Add("BILL_AMT", BliAmt); //开票金额 joElecSetInfo.Add("BILL_DATE", PrintDate); //开票日期 joElecSetInfo.Add("BILL_TIME", PrintTime); //开票时间 JObject joInput = new JObject(); joInput.Add("TRADE_NO", InsuTradeNo); //医保交易流水号 joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号 格式:10位院区编码 + yyyyMMdd(8位日期) + HHmmss(6位时分秒) + 6位序号 joInput.Add("CURE_TYPE", CureType); //医疗类别 0:门诊类(包含普通门急诊)1:住院类 joInput.Add("ELECT_MEDIUM_TYPE", "1"); //1-PDF 2-OFD 3-XML joInput.Add("ELECT_XML_TYPE", "1"); //0-带XML信息1-不带XML信息电子票据介质类型为OFD或XML时,此字段固定传1(不带XML信息),PDF类型根据实际情况传入 joInput.Add("ELECT_SETL_INFO", joElecSetInfo); //电子结算凭证信息 joInput.Add("ELECT_INVOICE", base64PDF); //将电子发票(PDF格式)的流进行BASE64转码后,所得到的字符串 //上传给中心 string sInput = JsonHelper.setCenterInpar_SX("0301", joInput.ToString()); joRtn = invoker.invokeCenterService_InvNO("0301", sInput); if (joRtn["ret_code"].ToString() != "0") { MessageBox.Show(joRtn["ret_msg"].ToString()); return; } else { string out_data = joRtn["out_data"].ToString(); //对返回值进行解密 string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK); JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString)); string Elect_Status = JsonHelper.getDestValue(joElectStatus, "Elect_Status"); if (Elect_Status != "1") { MessageBox.Show("调用医保电子票据信息上传接口(报文编号0301)上传失败!"); return; } else { //更新上传记录表 JObject joUpdateIn = new JObject(); joUpdateIn.Add("businessCode", "EcSettlCertUpload"); joUpdateIn.Add("businessID", InvNo); joUpdateIn.Add("memo", HisBizNo); joUpdateIn.Add("input", JObject.Parse(sInput)); joRtn["errorCode"] = new JObject(); joRtn["errorCode"] = 0; joUpdateIn.Add("output", joRtn); JObject joUpdateRtn = Update(joUpdateIn); if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out errMsg) != 0) MessageBox.Show("医保电子票据信息上传成功,但更新后台失败:" + errMsg); else MessageBox.Show("医保电子票据信息上传成功!"); } } } public void EcSettlLisGenerationStatus() { if ((DataTable)dgvEcSettlCertList.DataSource == null) { MessageBox.Show("请先查询电子发票信息!"); return; } int i = dgvEcSettlCertList.CurrentRow.Index; string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString(); string HisBizNo = dtEcSettlCertList.Rows[i]["UpldBchno"].ToString(); //上传批次号-医院业务流水号(0301) if (string.IsNullOrEmpty(HisBizNo)) { MessageBox.Show("请先医保电子票据信息上传(报文编号0301)!"); return; } JObject joInput = new JObject(); joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号(0301) //上传给中心 string sInput = JsonHelper.setCenterInpar_SX("0304", joInput.ToString()); JObject joRtn = invoker.invokeCenterService_InvNO("0304", sInput); if (joRtn["ret_code"].ToString() != "0") { MessageBox.Show("调用医保电子结算清单生成状态查询(报文编号0304)失败:" + joRtn["ret_msg"].ToString()); return; } else { //对返回值进行解密 string out_data = joRtn["out_data"].ToString(); string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK); JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString)); string HIS_BIZ_NO = JsonHelper.getDestValue(joElectStatus, "HIS_BIZ_NO"); //医院业务流水号 string ELEC_SSR_CODE = JsonHelper.getDestValue(joElectStatus, "ELEC_SSR_CODE"); //医保结算清单获取码 string BIZ_STATUS = JsonHelper.getDestValue(joElectStatus, "BIZ_STATUS"); //处理状态 0-处理中1-已完成 if (BIZ_STATUS == "0") { MessageBox.Show("医保电子结算清单生成状态-【0】-处理中,请稍后重新查询!"); return; } else if (BIZ_STATUS == "1") { //MessageBox.Show("医保电子结算清单生成状态-【1】-已完成"); //更新上传记录表 JObject joUpdateIn = new JObject(); joUpdateIn.Add("businessCode", "EcSettlLisGenerationStatus"); joUpdateIn.Add("businessID", InvNo); joUpdateIn.Add("memo", ELEC_SSR_CODE); joUpdateIn.Add("input", JObject.Parse(sInput)); joRtn["errorCode"] = new JObject(); joRtn["errorCode"] = 0; joUpdateIn.Add("output", joRtn); JObject joUpdateRtn = Update(joUpdateIn); if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out string errMsg) != 0) MessageBox.Show("医保电子结算清单生成状态查询成功,但更新后台失败:" + errMsg); else MessageBox.Show("医保电子结算清单生成状态查询成功!"); } } } private void tsmI_0304_Click(object sender, EventArgs e) { EcSettlLisGenerationStatus(); } private void tsmI_0301_Click(object sender, EventArgs e) { EcSettlBillUpload(); } public void EcSettlFileGet() { if ((DataTable)dgvEcSettlCertList.DataSource == null) { MessageBox.Show("请先查询电子发票信息!"); return; } int i = dgvEcSettlCertList.CurrentRow.Index; string InvNo = dtEcSettlCertList.Rows[i]["InvNo"].ToString(); string HisBizNo = dtEcSettlCertList.Rows[i]["UpldBchno"].ToString(); //上传批次号-医院业务流水号(0301) if (string.IsNullOrEmpty(HisBizNo)) { MessageBox.Show("请先将医保电子票据信息上传(报文编号0301)!"); return; } JObject joInput = new JObject(); joInput.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号(0301) //上传给中心 string sInput = JsonHelper.setCenterInpar_SX("0304", joInput.ToString()); JObject joRtn = invoker.invokeCenterService_InvNO("0304", sInput); if (joRtn["ret_code"].ToString() != "0") { MessageBox.Show("调用医保电子结算清单生成状态查询(报文编号0304)失败:" + joRtn["ret_msg"].ToString()); return; } else { //对返回值进行解密 string out_data = joRtn["out_data"].ToString(); string encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK); JObject joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString)); string HIS_BIZ_NO = JsonHelper.getDestValue(joElectStatus, "HIS_BIZ_NO"); //医院业务流水号 string ELEC_SSR_CODE = JsonHelper.getDestValue(joElectStatus, "ELEC_SSR_CODE"); //医保结算清单获取码 string BIZ_STATUS = JsonHelper.getDestValue(joElectStatus, "BIZ_STATUS"); //处理状态 0-处理中1-已完成 if (BIZ_STATUS == "0") { MessageBox.Show("医保电子结算清单生成状态-【0】-处理中,请稍后重新查询!"); return; } else if (BIZ_STATUS == "1") { JObject jo = new JObject(); jo.Add("HIS_BIZ_NO", HisBizNo); //医院业务流水号(0301) jo.Add("ELEC_SSR_CODE", ELEC_SSR_CODE); //医保结算清单获取码 //上传给中心 sInput = JsonHelper.setCenterInpar_SX("0305", jo.ToString()); joRtn = invoker.invokeCenterService_InvNO("0305", sInput); if (joRtn["ret_code"].ToString() != "0") { MessageBox.Show("医保电子结算清单文件获取(报文编号0305)失败:" + joRtn["ret_msg"].ToString()); return; } else { MessageBox.Show("医保电子结算清单文件获取(报文编号0305)成功"); //对返回值进行解密 out_data = joRtn["out_data"].ToString(); encryptString = JsonHelper.DecryptCenterOutPut(out_data, Global.inf.SK); joElectStatus = JObject.Parse(JsonHelper.ExtractJson(encryptString)); HIS_BIZ_NO = JsonHelper.getDestValue(joElectStatus, "HIS_BIZ_NO"); //医院业务流水号 BIZ_STATUS = JsonHelper.getDestValue(joElectStatus, "BIZ_STATUS"); //处理状态 0-处理中1-已完成 string ELECT_DATA = JsonHelper.getDestValue(joElectStatus, "ELECT_DATA"); //结算票据数据 JObject joElectData = JObject.Parse(ELECT_DATA); string SETTLEMENT_CODE = JsonHelper.getDestValue(joElectData, "SETTLEMENT_CODE"); //1:门诊费用结算清单2:住院费用清单3:住院费用结算单4:特殊病定额管理费用结算明细表 string SETTLEMENT_NAME = JsonHelper.getDestValue(joElectData, "SETTLEMENT_NAME"); string SETTLEMENT_DATA = JsonHelper.getDestValue(joElectData, "SETTLEMENT_DATA");//将结算票据信息(PDF格式)的流进行BASE64转码后,所得到的字符串 string Path = @"D:\"; SaveBase64ToPDF(SETTLEMENT_DATA, Path); } } } } private void tsmI_0305_Click(object sender, EventArgs e) { EcSettlFileGet(); } private void btnEcSettlFileGet_Click(object sender, EventArgs e) { EcSettlFileGet(); } } }