InvokeHelper.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  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. default:
  281. prefix = Global.inf.centerURL;
  282. break;
  283. }
  284. // 根据情况确实是否需要加funNo
  285. //Global.curEvt.URL = prefix + Global.curEvt.funNo;
  286. Global.curEvt.URL = prefix;
  287. }
  288. /// <summary>
  289. /// 通过枚举转换要调用的接口
  290. /// </summary>
  291. /// <param name="trade"></param>
  292. /// <param name="data"></param>
  293. /// <returns></returns>
  294. public JObject invokeCenterService(TradeEnum trade, JObject joInput)
  295. {
  296. string funNo = trade.GetCode();
  297. // 入参统一转换
  298. JObject request = Utils.ConvertRequest<JObject>(trade,joInput);
  299. string data = JsonHelper.toJsonString(request);
  300. // 统一封装请求头
  301. if (trade.GetMode() == ModeEnum.REST)
  302. {
  303. data = JsonHelper.setCenterInpar(funNo, request);
  304. }
  305. JObject joRtn = new JObject();
  306. // 调试模式
  307. if (Global.curEvt.enabledDebug)
  308. {
  309. CenterResult center = new CenterResult();
  310. center.setTradeNo(trade.GetCode(), data);
  311. if (center.ShowDialog() == DialogResult.OK)
  312. {
  313. // 接口实际返回数据
  314. string outPar = center.returnData;
  315. joRtn = JObject.Parse(outPar);
  316. }
  317. }
  318. else
  319. {
  320. prepareCallURI(trade);
  321. joRtn = invokeCenterService(data, trade.GetMode());
  322. }
  323. // 返回结果统一转换
  324. joRtn = Utils.ConvertResponse<JObject>(trade,joRtn);
  325. try
  326. {
  327. //保存日志
  328. saveCenterLog(data, joRtn.ToString(), joInput.ToString(), joRtn.ToString());
  329. }
  330. catch (Exception e) {
  331. //日志异常
  332. }
  333. return joRtn;
  334. }
  335. /// <summary>
  336. /// 医保目录txt文件下载
  337. /// </summary>
  338. /// <param name="data"></param>
  339. /// <returns></returns>
  340. public JObject DownloadCenterFile(string data, ModeEnum mode = ModeEnum.REST)
  341. {
  342. //download file
  343. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  344. string outputMsg = "";
  345. JObject joRtn = new JObject();
  346. int rtnCode = center.DownloadFile(data, ref outputMsg);
  347. if(rtnCode==0)
  348. {
  349. joRtn = JObject.Parse(outputMsg);
  350. }
  351. else
  352. {
  353. joRtn.Add("infcode", -1);
  354. joRtn.Add("err_msg", "下载文件失败DownloadFile:" + outputMsg);
  355. }
  356. return joRtn;
  357. }
  358. #endregion
  359. #region 移动
  360. /// <summary>
  361. /// 移动
  362. /// </summary>
  363. /// <param name="funNO"></param>
  364. /// <param name="data"></param>
  365. /// <returns></returns>
  366. public JObject invokeMPService(string funNO, string data)
  367. {
  368. JObject joRtn = new JObject();
  369. String outPar = "";
  370. try
  371. {
  372. Global.curEvt.URL = Global.inf.mobilePayURL;
  373. joRtn = invokeCenterService(data);
  374. outPar = JsonHelper.Compress(joRtn);
  375. return joRtn;
  376. }
  377. catch (Exception ex)
  378. {
  379. if (joRtn["infcode"] == null)
  380. { joRtn.Add("infcode", -1); }
  381. if (joRtn["err_msg"] == null)
  382. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  383. outPar = JsonHelper.Compress(joRtn);
  384. return joRtn;
  385. }
  386. finally
  387. {
  388. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  389. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  390. }
  391. }
  392. /// <summary>
  393. /// 保存中心交易日志到数据库
  394. /// </summary>
  395. /// <param name="inParam"></param>
  396. /// <param name="outParam"></param>
  397. /// <param name="inParamPlain"></param>
  398. /// <param name="outParamPlain"></param>
  399. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  400. {
  401. dynamic joIris = new JObject();
  402. string sRtn = "";
  403. try
  404. {
  405. //解析postContent,插入医保交易日志表
  406. JObject joInParam = new JObject(JObject.Parse(inParam));
  407. //解包
  408. JObject joIn = Utils.removeWrapper(joInParam);
  409. JObject joOut = new JObject(JObject.Parse(outParam));
  410. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  411. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  412. JArray jaParams = new JArray();
  413. JObject joParam = new JObject();
  414. joParam.Add("inParam", JObject.FromObject(joIn));
  415. joParam.Add("outParam", JObject.FromObject(joOut));
  416. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  417. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  418. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  419. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  420. joParam.Add("updateUserID", Global.user.ID);
  421. joParam.Add("psn_no", Global.pat.psn_no);
  422. jaParams.Add(joParam);
  423. joIris.code = "09010021";
  424. joIris.Add("params", jaParams);
  425. //InvokeHelper invoker = new InvokeHelper();
  426. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  427. }
  428. catch (Exception ex)
  429. {
  430. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  431. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  432. }
  433. }
  434. #endregion
  435. }
  436. }