EcSettlCertUpload.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.IO.Compression;
  8. using System.Linq;
  9. using System.Net.Http;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. using Newtonsoft.Json.Linq;
  14. using PTMedicalInsurance.Business;
  15. using PTMedicalInsurance.Common;
  16. using PTMedicalInsurance.Entity.BaseLine.ElectronicSettlementCertificate;
  17. using PTMedicalInsurance.Forms.Setters.ElectronicSettlementCertificates;
  18. using PTMedicalInsurance.Helper;
  19. using PTMedicalInsurance.Variables;
  20. namespace PTMedicalInsurance.Forms.ElectronicSettlementCertificates
  21. {
  22. public partial class EcSettlCertUpload : Form
  23. {
  24. private ElectronicSettlementCertificate ecSettlCert = new ElectronicSettlementCertificate();
  25. private DataTable dtEcSettlCertList;
  26. private EcSettlCertMainForm mainForm;
  27. private string err;
  28. public EcSettlCertUpload()
  29. {
  30. InitializeComponent();
  31. }
  32. public EcSettlCertUpload(Form frm)
  33. {
  34. InitializeComponent();
  35. InitForm(frm);
  36. }
  37. private void InitForm(Form frm)
  38. {
  39. mainForm = (EcSettlCertMainForm)frm;
  40. CheckForIllegalCrossThreadCalls = false;
  41. // 禁用关闭按钮
  42. this.FormBorderStyle = FormBorderStyle.None;
  43. // 隐藏标题栏
  44. this.ControlBox = false;
  45. // 其他可能需要的配置
  46. this.TopLevel = false;
  47. this.Dock = DockStyle.Fill; // 根据需要设置 Dock 属性
  48. //
  49. SetHeaderOfDgv();
  50. //
  51. dpST.Value = DateTime.Now;
  52. dpED.Value = DateTime.Now;
  53. }
  54. private void SetHeaderOfDgv()
  55. {
  56. GridViewSetter gvs = new GridViewSetter();
  57. gvs.setDgvEcSettlCertList(dgvEcSettlCertList);
  58. }
  59. #region 函数封装
  60. /// <summary>
  61. /// 更新成功后,刷新界面
  62. /// </summary>
  63. private void freshForm()
  64. {
  65. }
  66. /// <summary>
  67. /// 单条上传
  68. /// </summary>
  69. /// <param name="errMsg"></param>
  70. /// <returns></returns>
  71. private int SingleUpload(out String errMsg)
  72. {
  73. int i = dgvEcSettlCertList.CurrentRow.Index;
  74. UploadEcSettlCertIn inpar = new UploadEcSettlCertIn();
  75. JObject joIn = new JObject();
  76. joIn.Add("InvNo", dtEcSettlCertList.Rows[i]["InvNo"].ToString());
  77. joIn.Add("PrintPaymentInvDr", dtEcSettlCertList.Rows[i]["PrintPaymentInvDr"].ToString());
  78. joIn.Add("HospDr", dtEcSettlCertList.Rows[i]["HospDr"].ToString());
  79. //获取HIS 原始入参
  80. JObject joOrignalInput = ecSettlCert.Get4901Input(joIn);
  81. if (JsonHelper.parseIrisRtnValue(joOrignalInput, out err) != 0)
  82. {
  83. errMsg = ("获取4901入参失败:" + err);
  84. return -1;
  85. }
  86. //通过原始入参,转换为接口需要的入参,PDF,XML,编码转换等等
  87. ecSettlCert.SavePath = Global.curEvt.path;
  88. JObject joNeedConvertData = JObject.Parse(JsonHelper.getDestValue(joOrignalInput,"data"));
  89. //joNeedConvertData.Add("fixmedinsCode", Global.inf.hospitalNO);
  90. //joNeedConvertData.Add("fixmedinsName", Global.inf.hospitalName);
  91. joNeedConvertData["fixmedinsCode"] = Global.inf.hospitalNO;
  92. joNeedConvertData["fixmedinsName"] = Global.inf.hospitalName;
  93. //joNeedConvertData["upldBchno"] = DateTime.Now.ToString("yyyyMMdd" + "00001");//上传日期年月日加5位顺序号
  94. joNeedConvertData["filename"] = "";//压缩包文件名称
  95. JArray jaXML = JArray.Parse(JsonHelper.getDestValue(joNeedConvertData, "xml"));
  96. foreach (JObject jo in jaXML)
  97. {
  98. jo["tktextinfo"]["mdtrtInfo"]["fixmedinsCode"] = Global.inf.hospitalNO;
  99. jo["tktextinfo"]["mdtrtInfo"]["fixmedinsName"] = Global.inf.hospitalName;
  100. jo["tktextinfo"]["mdtrtInfo"]["fixBlngAdmdvs"] = Global.inf.areaCode; //票据监管机构区划代码
  101. jo["tktextinfo"]["billInfo"]["supninsCode"] = "420000"; //票据监管机构区划代码
  102. }
  103. joNeedConvertData["xml"] = jaXML;
  104. JObject joConvertedInput = ecSettlCert.Convert4901Input(joNeedConvertData);
  105. JObject joRtn = ecSettlCert.Upload(joConvertedInput);
  106. if (JsonHelper.parseCenterRtnValue(joRtn, out err) != 0)
  107. {
  108. errMsg =("上传失败:" + err);
  109. return -1;
  110. }
  111. else
  112. {
  113. JObject joUpdateIn = new JObject();
  114. joUpdateIn.Add("businessCode","EcSettlCertUpload");
  115. joUpdateIn.Add("businessID", ecSettlCert.ecSettlCertNo);//单条传,如果批量传,这么处理就有问题
  116. joUpdateIn.Add("memo", ecSettlCert.upldBchno);//单条传,如果批量传,这么处理就有问题
  117. joUpdateIn.Add("input", joConvertedInput);
  118. joRtn["errorCode"] = new JObject();
  119. joRtn["errorCode"] = 0;
  120. joUpdateIn.Add("output", joRtn);
  121. JObject joUpdateRtn = ecSettlCert.Update(joUpdateIn);
  122. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out err) != 0)
  123. {
  124. errMsg = ("上传成功但更新后台失败:" + err);
  125. return -1;
  126. }
  127. else
  128. {
  129. errMsg = ("上传成功!");
  130. freshForm();
  131. return 0;
  132. }
  133. }
  134. }
  135. private int QueryStatus(out String errMsg)
  136. {
  137. int i = dgvEcSettlCertList.CurrentRow.Index;
  138. JObject joIn = new JObject();
  139. joIn.Add("fixmedinsCode", Global.inf.hospitalNO);
  140. joIn.Add("fixmedinsName", Global.inf.hospitalName);
  141. joIn.Add("elecSetlCertCode", "");
  142. joIn.Add("elecSetlCertNo", dtEcSettlCertList.Rows[i]["InvNo"].ToString());
  143. joIn.Add("elecSetlCertChkcode","");
  144. joIn.Add("elecSetlCertType", 3);
  145. JObject joRtn = ecSettlCert.QueryUploadStatus(joIn);
  146. string err;
  147. if (JsonHelper.parseCenterRtnValue(joRtn, out err) != 0)
  148. {
  149. errMsg = ("查询状态失败:" + err);
  150. return -1;
  151. }
  152. else
  153. {
  154. errMsg = ("查询状态成功!");
  155. freshForm();
  156. return 0;
  157. }
  158. }
  159. private int QueryUploadResult(out String errMsg)
  160. {
  161. int i = dgvEcSettlCertList.CurrentRow.Index;
  162. string upldBchno = dtEcSettlCertList.Rows[i]["UpldBchno"].ToString();
  163. if (string.IsNullOrEmpty(upldBchno))
  164. {
  165. errMsg =("该记录未上传或上传成功!");
  166. return -1;
  167. }
  168. string printDateStr = dtEcSettlCertList.Rows[i]["PrintDate"].ToString();
  169. JObject joData = new JObject();
  170. joData.Add("fixmedinsCode", Global.inf.hospitalNO);
  171. joData.Add("fixmedinsName", Global.inf.hospitalName);
  172. joData.Add("bizStsb",$"{printDateStr.Replace("-", "")}-{printDateStr.Replace("-", "")}");
  173. joData.Add("upldBchno", dtEcSettlCertList.Rows[i]["UpldBchno"].ToString());
  174. JObject joRtn = ecSettlCert.QueryUploadResult(joData);
  175. string err;
  176. if (JsonHelper.parseCenterRtnValue(joRtn, out err) != 0)
  177. {
  178. errMsg = ("查询上传结果失败:" + err);
  179. return -1;
  180. }
  181. else
  182. {
  183. errMsg = ("查询上传成功!");
  184. freshForm();
  185. return 0;
  186. }
  187. }
  188. private int ReUpload(out String errMsg)
  189. {
  190. int i = dgvEcSettlCertList.CurrentRow.Index;
  191. UploadEcSettlCertIn inpar = new UploadEcSettlCertIn();
  192. JObject joIn = new JObject();
  193. joIn.Add("InvNo", dtEcSettlCertList.Rows[i]["InvNo"].ToString());
  194. joIn.Add("PrintPaymentInvDr", dtEcSettlCertList.Rows[i]["PrintPaymentInvDr"].ToString());
  195. joIn.Add("HospDr", dtEcSettlCertList.Rows[i]["HospDr"].ToString());
  196. //获取HIS 原始入参
  197. JObject joOrignalInput = ecSettlCert.Get4901Input(joIn);
  198. string err;
  199. if (JsonHelper.parseIrisRtnValue(joOrignalInput, out err) != 0)
  200. {
  201. errMsg = ("获取4901入参失败:" + err);
  202. return -1;
  203. }
  204. //通过原始入参,转换为接口需要的入参,PDF,XML,编码转换等等
  205. ecSettlCert.SavePath = Global.curEvt.path;
  206. JObject joNeedConvertData = JObject.Parse(JsonHelper.getDestValue(joOrignalInput, "data"));
  207. //joNeedConvertData.Add("fixmedinsCode", Global.inf.hospitalNO);
  208. //joNeedConvertData.Add("fixmedinsName", Global.inf.hospitalName);
  209. joNeedConvertData["fixmedinsCode"] = Global.inf.hospitalNO;
  210. joNeedConvertData["fixmedinsName"] = Global.inf.hospitalName;
  211. joNeedConvertData["upldBchno"] = DateTime.Now.ToString("yyyyMMdd" + "00001");//上传日期年月日加5位顺序号
  212. joNeedConvertData["filename"] = "";//压缩包文件名称
  213. JArray jaXML = JArray.Parse(JsonHelper.getDestValue(joNeedConvertData, "xml"));
  214. foreach (JObject jo in jaXML)
  215. {
  216. jo["fixmedinsCode"] = Global.inf.hospitalNO;
  217. jo["fixmedinsName"] = Global.inf.hospitalName;
  218. }
  219. JObject joConvertedInput = ecSettlCert.Convert4901Input(joNeedConvertData);
  220. JArray jaRetrmDetlList = JArray.Parse(JsonHelper.getDestValue(joConvertedInput, "upldDetlList"));
  221. foreach (JObject jo in jaRetrmDetlList)
  222. {
  223. jo.Add("initElecSetlCertCode", "");
  224. jo.Add("initElecSetlCertNo", jo["elecSetlCertNo"].ToString());
  225. jo.Add("initUpldWay", "1");//原上传方式 1使用4901医疗机构上传电子结算凭证2使用4903医疗机构上传电子结算凭证基本信息
  226. jo.Add("certCodeNoErrFlag", "0"); //凭证代码号码错误标志 0否(原凭证代码号码与重传凭证代码号码一致)1是(原凭证代码号码与重传凭证代码号码不一致)
  227. jo.Add("rea", "测试"); //理由
  228. }
  229. joConvertedInput.Remove("upldDetlList");
  230. joConvertedInput.Add("reUploadDetlDTOList", jaRetrmDetlList);
  231. JObject joRtn = ecSettlCert.ReUpload(joConvertedInput);
  232. if (JsonHelper.parseCenterRtnValue(joRtn, out err) != 0)
  233. {
  234. errMsg = "重传失败:" + err;
  235. return -1;
  236. }
  237. else
  238. {
  239. JObject joUpdateIn = new JObject();
  240. joUpdateIn.Add("businessCode", "EcSettlCertUpload");
  241. joUpdateIn.Add("businessID", ecSettlCert.ecSettlCertNo);//单条传,如果批量传,这么处理就有问题
  242. joUpdateIn.Add("memo", ecSettlCert.upldBchno);//单条传,如果批量传,这么处理就有问题
  243. joUpdateIn.Add("input", joConvertedInput);
  244. joRtn["errorCode"] = new JObject();
  245. joRtn["errorCode"] = 0;
  246. joUpdateIn.Add("output", joRtn);
  247. JObject joUpdateRtn = ecSettlCert.Update(joUpdateIn);
  248. if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out err) != 0)
  249. {
  250. errMsg = "重成功但更新后台失败:" + err;
  251. return -1;
  252. }
  253. else
  254. {
  255. errMsg = "重传成功!";
  256. freshForm();
  257. return 0;
  258. }
  259. }
  260. }
  261. #endregion
  262. private void btnQuery_Click(object sender, EventArgs e)
  263. {
  264. JObject joIn = new JObject();
  265. joIn.Add("BeginDate", dpST.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  266. joIn.Add("EndDate", dpED.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  267. joIn.Add("HospDr", Global.inf.hospitalDr);
  268. joIn.Add("PatName",tbName.Text);
  269. joIn.Add("InvNo", tbInvNO.Text);
  270. joIn.Add("InterfaceID", Global.inf.interfaceDr);
  271. JObject joRtn = ecSettlCert.QueryEcSettlCertList(joIn);
  272. if (JsonHelper.parseIrisRtnValue(joRtn, out err) != 0)
  273. {
  274. MessageBox.Show(err);
  275. return;
  276. }
  277. dtEcSettlCertList = (DataTable)joRtn["data"].ToObject(typeof(DataTable));
  278. dgvEcSettlCertList.DataSource = dtEcSettlCertList;
  279. }
  280. private void tsmUploadSingle_Click(object sender, EventArgs e)
  281. {
  282. SingleUpload(out err);
  283. MessageBox.Show(err);
  284. }
  285. private void tsmQueryStatus_Click(object sender, EventArgs e)
  286. {
  287. QueryStatus(out err);
  288. MessageBox.Show(err);
  289. }
  290. private void tsReUpload_Click(object sender, EventArgs e)
  291. {
  292. ReUpload(out err);
  293. MessageBox.Show(err);
  294. }
  295. private void btnClose_3_Click(object sender, EventArgs e)
  296. {
  297. mainForm.Close();
  298. }
  299. private void tsmQueryUploadResult_Click(object sender, EventArgs e)
  300. {
  301. QueryUploadResult(out err);
  302. MessageBox.Show(err);
  303. }
  304. private void btnBatchUpload_Click(object sender, EventArgs e)
  305. {
  306. //int errCount = 0;
  307. //List<string> errList = new List<string>();
  308. //for (int i = 0; i < dgvEcSettlCertList.Rows.Count; i++)
  309. //{
  310. // dgvEcSettlCertList.CurrentCell = dgvEcSettlCertList.Rows[i].Cells[0];
  311. // if (SingleUpload(out err) != 0)
  312. // {
  313. // errCount++;
  314. // errList.Add(err);
  315. // }
  316. //}
  317. //if (errCount != 0)
  318. //{
  319. // MessageBox.Show($"批量上传有错误!上传总条数为:{dgvEcSettlCertList.Rows.Count};错误条数为:{errCount}");
  320. //}
  321. //else
  322. //{
  323. // MessageBox.Show($"批量上传成功!上传总条数为:{dgvEcSettlCertList.Rows.Count}");
  324. //}
  325. // 创建 DataLoader 并传递 queryExportData 方法
  326. DataLoader _dataLoader;
  327. _dataLoader = new DataLoader((out string errMsg, DataLoader.ProgressCallback callback) => BachUpload(out errMsg, callback), this);
  328. _dataLoader.StartQueryExportData(dgvEcSettlCertList.Rows.Count, (result, errMsg) =>
  329. {
  330. // 在这里处理结果和错误信息
  331. if (result == 0)
  332. {
  333. MessageBox.Show(errMsg);
  334. }
  335. else
  336. {
  337. MessageBox.Show(errMsg);
  338. }
  339. });
  340. }
  341. private int BachUpload(out string errMsg, DataLoader.ProgressCallback callback)
  342. {
  343. int errCount = 0;
  344. List<string> errList = new List<string>();
  345. for (int i = 0; i < dgvEcSettlCertList.Rows.Count; i++)
  346. {
  347. dgvEcSettlCertList.CurrentCell = dgvEcSettlCertList.Rows[i].Cells[0];
  348. if (SingleUpload(out err) != 0)
  349. {
  350. errCount++;
  351. errList.Add(err);
  352. }
  353. if (callback != null)
  354. {
  355. callback(i + 1);
  356. }
  357. }
  358. if (errCount != 0)
  359. {
  360. errMsg = $"批量上传有错误!上传总条数为:{dgvEcSettlCertList.Rows.Count};错误条数为:{errCount}";
  361. }
  362. else
  363. {
  364. errMsg = $"批量上传成功!上传总条数为:{dgvEcSettlCertList.Rows.Count}";
  365. }
  366. return -errCount;
  367. }
  368. }
  369. }