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; } 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; } } private void btnBatchUpload_Click(object sender, EventArgs e) { 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", ELEC_SETL_CERT_NO); joUpdateIn.Add("memo", HisBizNo); joUpdateIn.Add("input", 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 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; } } }