InvokeHelper.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. /******************************************************************************
  2. * 文件名称: InvokeHelper.cs
  3. * 文件说明: 调用助手,调用方法的封装
  4. * 当前版本: V1.0
  5. * 创建日期: 2022-04-12
  6. *
  7. * 2020-04-12: 增加 businessDLLInvoke 方法
  8. * 2020-04-12: 增加 writeLog 方法
  9. * 2020-04-14: 增加 businessDLLInvoke(重载) 方法
  10. * 2020-04-14: 增加 irisServiceInvoke 方法
  11. ******************************************************************************/
  12. using Newtonsoft.Json.Linq;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Net;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. using System.Windows.Forms;
  21. using PTMedicalInsurance.Helper;
  22. using Newtonsoft.Json;
  23. using PTMedicalInsurance.Common;
  24. using PTMedicalInsurance.Variables;
  25. using System.Runtime.InteropServices;
  26. using PTMedicalInsurance.Forms;
  27. using System.Net.Http;
  28. using System.IO.Compression;
  29. namespace PTMedicalInsurance.Helper
  30. {
  31. public class InvokeHelper
  32. {
  33. private string serviceURL;
  34. private string authorization;
  35. public InvokeHelper()
  36. {
  37. LoadCenterURL(false);
  38. }
  39. private void LoadCenterURL(bool reloadFromCfgFile)
  40. {
  41. IniFile ini = new IniFile(Global.curEvt.path + @"\CenterServiceURL.ini");
  42. // 默认采用的是后台配置的地址
  43. if (reloadFromCfgFile)
  44. {
  45. Global.inf.centerURL = ini.ReadValue("CENTER", "url");
  46. Global.inf.uploadURL = ini.ReadValue("CENTER", "upload");
  47. Global.inf.downURL = ini.ReadValue("CENTER", "download");
  48. Global.inf.ecURL = ini.ReadValue("CENTER", "ecToken");
  49. }
  50. Global.inf.mobilePayURL = ini.ReadValue("CENTER", "mobilePay");
  51. Global.inf.ecPrescURL = ini.ReadValue("CENTER", "prescription");
  52. // 移动支付
  53. if (string.IsNullOrEmpty(Global.inf.mobilePayURL))
  54. {
  55. Global.inf.mobilePayURL = "http://10.13.1.26:9001/CSB/hsa-fsi-no";
  56. }
  57. // 电子处方
  58. if (string.IsNullOrEmpty(Global.inf.ecPrescURL))
  59. {
  60. Global.inf.ecPrescURL = "http://10.77.245.22:9001/epc/api";
  61. }
  62. }
  63. #region 内部服务调用
  64. /// <summary>
  65. /// iris服务调用的封装
  66. /// </summary>
  67. /// <param name="data"></param>
  68. /// <returns></returns>
  69. public JObject invokeIrisService(string data, string serviceDesc)
  70. {
  71. string rtn = "", url = "";
  72. JObject joRtn = new JObject();
  73. try
  74. {
  75. //先根据用户请求的uri构造请求地址
  76. url = serviceURL;
  77. ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
  78. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
  79. //创建Web访问对象
  80. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  81. //把用户传过来的数据转成“UTF-8”的字节流
  82. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  83. //添加头部信息
  84. myRequest.Method = "POST";
  85. myRequest.ContentLength = buf.Length;
  86. myRequest.ContentType = "application/json;charset=UTF-8";
  87. myRequest.Headers.Add("Authorization", authorization);
  88. //发送请求
  89. Stream stream = myRequest.GetRequestStream();
  90. stream.Write(buf, 0, buf.Length);
  91. stream.Close();
  92. //获取接口返回值
  93. //通过Web访问对象获取响应内容
  94. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  95. rtn = getResponseData(myResponse);
  96. joRtn = JObject.Parse(rtn);
  97. myResponse?.Close();
  98. myRequest?.Abort();
  99. myResponse = null;
  100. myRequest = null;
  101. return joRtn;
  102. }
  103. catch (Exception ex)
  104. {
  105. Global.writeLog_Iris("访问服务器异常:" + ex.InnerException.Message);
  106. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  107. return joRtn;
  108. }
  109. }
  110. /// <summary>
  111. /// 异步请求调用并返回
  112. /// </summary>
  113. /// <param name="data"></param>
  114. /// <returns></returns>
  115. public JObject invokeServiceAsync(string data)
  116. {
  117. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  118. authorization = Global.hisConfig.authorization;
  119. Global.writeLog_Iris("开始调用:" + serviceURL);
  120. Global.writeLog_Iris(data);
  121. HttpClient client = new HttpClient();
  122. client.Timeout = TimeSpan.FromMinutes(2);
  123. client.DefaultRequestHeaders.Add("Authorization", authorization);
  124. client.DefaultRequestHeaders.Add("User-Agent", "PostmanRuntime/7.26.8");
  125. client.DefaultRequestHeaders.Add("Connection", "keep-alive");
  126. HttpResponseMessage response = client.PostAsync(serviceURL, new StringContent(data,Encoding.UTF8,"application/json")).Result;
  127. var rtn = response.Content.ReadAsStringAsync();
  128. Global.writeLog_Iris("服务返回:" + rtn.Result);
  129. if (response.IsSuccessStatusCode)
  130. {
  131. return JObject.Parse(rtn.Result);
  132. } else
  133. {
  134. Global.writeLog_Iris("服务调用异常!");
  135. }
  136. return JsonHelper.setExceptionJson(-1, "调用HIS服务", "失败!"+ response.StatusCode);
  137. }
  138. /// <summary>
  139. /// HIS服务调用的封装
  140. /// </summary>
  141. /// <param name="data"></param>
  142. /// <returns></returns>
  143. ///
  144. public JObject invokeHISService(string data, string serviceDesc)
  145. {
  146. DateTime startTime = DateTime.Now;
  147. JObject joRtn = new JObject();
  148. try
  149. {
  150. //先根据用户请求的uri构造请求地址
  151. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  152. authorization = Global.hisConfig.authorization;
  153. joRtn = invokeIrisService(data, serviceDesc);
  154. return joRtn;
  155. }
  156. catch (Exception ex)
  157. {
  158. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  159. return joRtn;
  160. }
  161. finally
  162. {
  163. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  164. TimeSpan spendTime = DateTime.Now - startTime;
  165. Global.writeLog_Iris("调用耗时:(s)" + spendTime.TotalSeconds);
  166. }
  167. }
  168. /// <summary>
  169. /// 医保平台服务调用的封装
  170. /// </summary>
  171. /// <param name="data"></param>
  172. /// <returns></returns>
  173. public JObject invokeInsuService(string data, string serviceDesc)
  174. {
  175. string rtn = "";
  176. JObject joRtn = new JObject();
  177. try
  178. {
  179. //先根据用户请求的uri构造请求地址
  180. serviceURL = string.Format("{0}/{1}", Global.insuConfig.ip, Global.insuConfig.url);
  181. authorization = Global.insuConfig.authorization;
  182. joRtn = invokeIrisService(data, serviceDesc);
  183. rtn = JsonConvert.SerializeObject(joRtn);
  184. //if (serviceDesc == "插入签到信息")
  185. //{
  186. // MessageBox.Show("插入签到信息入参:" + data +"|返回值:"+ rtn.ToString()+"|"+ Global.insuConfig.url);
  187. //}
  188. return joRtn;
  189. }
  190. catch (Exception ex)
  191. {
  192. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  193. rtn = JsonConvert.SerializeObject(joRtn);
  194. return joRtn;
  195. }
  196. finally
  197. {
  198. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), rtn);
  199. }
  200. }
  201. private string getResponseData(HttpWebResponse response)
  202. {
  203. string data = "";
  204. if (response != null)
  205. {
  206. Stream s = response.GetResponseStream();
  207. StreamReader sRead = null;
  208. if ("gzip".Equals(response.ContentEncoding))
  209. {
  210. sRead = new StreamReader(new GZipStream(s, CompressionMode.Decompress), Encoding.GetEncoding("utf-8"));
  211. }
  212. else
  213. {
  214. sRead = new StreamReader(s, Encoding.GetEncoding("utf-8"));
  215. }
  216. data = sRead.ReadToEnd();
  217. sRead.Close();
  218. response.Close();
  219. }
  220. return data;
  221. }
  222. #endregion
  223. #region 医保中心调用
  224. private JObject invokeCenterService(string data, ModeEnum mode = ModeEnum.REST)
  225. {
  226. JObject joRtn = new JObject();
  227. try
  228. {
  229. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  230. string outputData = "";
  231. string errMsg = "";
  232. int iInt = center.Init(ref errMsg);
  233. if (iInt == 0)
  234. {
  235. iInt = center.Business(data, ref outputData, ref errMsg);
  236. if (iInt == 0 && !string.IsNullOrEmpty(outputData))
  237. {
  238. try
  239. {
  240. joRtn = JObject.Parse(outputData);
  241. }
  242. catch (Exception ex)
  243. {
  244. joRtn.Add("infcode", iInt);
  245. joRtn.Add("err_msg", "返回参数异常:" + outputData);
  246. }
  247. }
  248. else
  249. {
  250. joRtn.Add("infcode", iInt);
  251. joRtn.Add("err_msg", outputData);
  252. return joRtn;
  253. }
  254. return joRtn;
  255. }
  256. else
  257. {
  258. joRtn.Add("infcode", -1);
  259. joRtn.Add("err_msg", "医保动态库初始化失败invokeInitByDLL:" + errMsg);
  260. return joRtn;
  261. }
  262. }
  263. finally
  264. {
  265. Global.writeLog("调用中心:",data,joRtn.ToString());
  266. }
  267. }
  268. private void prepareCallURI(TradeEnum trade)
  269. {
  270. Global.curEvt.funNo = trade.GetCode() ;
  271. string prefix = Global.inf.centerURL;
  272. switch (trade)
  273. {
  274. case TradeEnum.FileUpload:
  275. prefix = Global.inf.uploadURL;
  276. break;
  277. case TradeEnum.FileDownload:
  278. prefix = Global.inf.downURL;
  279. break;
  280. case TradeEnum.PreAnalysis:
  281. /*
  282. * c济南市参保人事前提醒机构医保正式对接地址:http://10.153.50.218:8001/hsu/mihs/MihsServlet
  283. 济南市参保人事前提醒机构医保测试对接地址:http://10.153.50.179:8001/hsu/mihs/MihsServlet
  284. 省直参保人事前提醒机构医保正式对接地址:http://10.112.63.89:18080/hsu/mihs/MihsServlet
  285. 省直参保人事前提醒机构医保测试对接地址:http://10.112.63.89:8001/hsu/mihs/MihsServlet
  286. * */
  287. if (Global.inf.hospitalDr == 28)
  288. {
  289. prefix = @"http://10.112.63.89:18080/hsu/mihs/MihsServlet "; //省医保正式
  290. }
  291. else
  292. {
  293. prefix = @"http://10.153.50.218:8001/hsu/mihs/MihsServlet"; //市医保正式
  294. //prefix = @"http://10.153.50.179:8001/hsu/mihs/MihsServlet"; //测试
  295. }
  296. break;
  297. default:
  298. prefix = Global.inf.centerURL;
  299. //prefix = @"http://10.153.50.179:8001/hsu/mihs/MihsServlet"; //测试
  300. break;
  301. }
  302. // 根据情况确实是否需要加funNo
  303. //Global.curEvt.URL = prefix + Global.curEvt.funNo;
  304. Global.curEvt.URL = prefix;
  305. }
  306. /// <summary>
  307. /// 通过枚举转换要调用的接口
  308. /// </summary>
  309. /// <param name="trade"></param>
  310. /// <param name="data"></param>
  311. /// <returns></returns>
  312. public JObject invokeCenterService(TradeEnum trade, JObject joInput)
  313. {
  314. string funNo = trade.GetCode();
  315. // 入参统一转换
  316. JObject request = Utils.ConvertRequest<JObject>(trade,joInput);
  317. string data = JsonHelper.toJsonString(request);
  318. // 统一封装请求头
  319. if (trade.GetMode() == ModeEnum.REST)
  320. {
  321. data = JsonHelper.setCenterInpar(funNo, request);
  322. }
  323. JObject joRtn = new JObject();
  324. // 调试模式
  325. if (Global.curEvt.enabledDebug)
  326. {
  327. CenterResult center = new CenterResult();
  328. center.setTradeNo(trade.GetCode(), data);
  329. if (center.ShowDialog() == DialogResult.OK)
  330. {
  331. // 接口实际返回数据
  332. string outPar = center.returnData;
  333. joRtn = JObject.Parse(outPar);
  334. }
  335. }
  336. else
  337. {
  338. prepareCallURI(trade);
  339. joRtn = invokeCenterService(data, trade.GetMode());
  340. }
  341. // 返回结果统一转换
  342. joRtn = Utils.ConvertResponse<JObject>(trade,joRtn);
  343. try
  344. {
  345. //保存日志
  346. saveCenterLog(data, joRtn.ToString(), joInput.ToString(), joRtn.ToString());
  347. }
  348. catch (Exception e) {
  349. //日志异常
  350. }
  351. return joRtn;
  352. }
  353. /// <summary>
  354. /// 医保目录txt文件下载
  355. /// </summary>
  356. /// <param name="data"></param>
  357. /// <returns></returns>
  358. public JObject DownloadCenterFile(string data, ModeEnum mode = ModeEnum.REST)
  359. {
  360. //download file
  361. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  362. string outputMsg = "";
  363. JObject joRtn = new JObject();
  364. int rtnCode = center.DownloadFile(data, ref outputMsg);
  365. if(rtnCode==0)
  366. {
  367. joRtn = JObject.Parse(outputMsg);
  368. }
  369. else
  370. {
  371. joRtn.Add("infcode", -1);
  372. joRtn.Add("err_msg", "下载文件失败DownloadFile:" + outputMsg);
  373. }
  374. return joRtn;
  375. }
  376. #endregion
  377. #region 移动
  378. /// <summary>
  379. /// 移动
  380. /// </summary>
  381. /// <param name="funNO"></param>
  382. /// <param name="data"></param>
  383. /// <returns></returns>
  384. public JObject invokeMPService(string funNO, string data)
  385. {
  386. JObject joRtn = new JObject();
  387. String outPar = "";
  388. try
  389. {
  390. Global.curEvt.URL = Global.inf.mobilePayURL;
  391. joRtn = invokeCenterService(data);
  392. outPar = JsonHelper.Compress(joRtn);
  393. return joRtn;
  394. }
  395. catch (Exception ex)
  396. {
  397. if (joRtn["infcode"] == null)
  398. { joRtn.Add("infcode", -1); }
  399. if (joRtn["err_msg"] == null)
  400. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  401. outPar = JsonHelper.Compress(joRtn);
  402. return joRtn;
  403. }
  404. finally
  405. {
  406. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  407. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  408. }
  409. }
  410. /// <summary>
  411. /// 保存中心交易日志到数据库
  412. /// </summary>
  413. /// <param name="inParam"></param>
  414. /// <param name="outParam"></param>
  415. /// <param name="inParamPlain"></param>
  416. /// <param name="outParamPlain"></param>
  417. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  418. {
  419. dynamic joIris = new JObject();
  420. string sRtn = "";
  421. try
  422. {
  423. //解析postContent,插入医保交易日志表
  424. JObject joInParam = new JObject(JObject.Parse(inParam));
  425. //解包
  426. JObject joIn = Utils.removeWrapper(joInParam);
  427. JObject joOut = new JObject(JObject.Parse(outParam));
  428. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  429. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  430. JArray jaParams = new JArray();
  431. JObject joParam = new JObject();
  432. joIn.Add("infno", JsonHelper.getDestValue(joInParam, "info"));
  433. joParam.Add("inParam", JObject.FromObject(joIn));
  434. joParam.Add("outParam", JObject.FromObject(joOut));
  435. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  436. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  437. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  438. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  439. joParam.Add("updateUserID", Global.user.ID);
  440. joParam.Add("psn_no", Global.pat.psn_no);
  441. jaParams.Add(joParam);
  442. joIris.code = "09010021";
  443. joIris.Add("params", jaParams);
  444. //InvokeHelper invoker = new InvokeHelper();
  445. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  446. }
  447. catch (Exception ex)
  448. {
  449. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  450. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  451. }
  452. }
  453. #endregion
  454. }
  455. }