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();
}
}
}