InvokeHelper.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  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. namespace PTMedicalInsurance.Helper
  26. {
  27. class InvokeHelper
  28. {
  29. private string serviceURL;
  30. private string authorization;
  31. /// <summary>
  32. /// iris服务调用的封装
  33. /// </summary>
  34. /// <param name="data"></param>
  35. /// <returns></returns>
  36. public JObject invokeIrisService(string data, string serviceDesc)
  37. {
  38. string rtn = "", url = "";
  39. JObject joRtn = new JObject();
  40. try
  41. {
  42. //先根据用户请求的uri构造请求地址
  43. url = serviceURL;
  44. ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
  45. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
  46. //创建Web访问对象
  47. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  48. //把用户传过来的数据转成“UTF-8”的字节流
  49. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  50. //添加头部信息
  51. myRequest.Method = "POST";
  52. myRequest.ContentLength = buf.Length;
  53. myRequest.ContentType = "application/json";
  54. myRequest.Headers.Add("Authorization", authorization);
  55. myRequest.MaximumAutomaticRedirections = 1;
  56. myRequest.AllowAutoRedirect = true;
  57. //发送请求
  58. Stream stream = myRequest.GetRequestStream();
  59. stream.Write(buf, 0, buf.Length);
  60. stream.Close();
  61. //获取接口返回值
  62. //通过Web访问对象获取响应内容
  63. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  64. //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
  65. StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  66. //string rtn = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
  67. rtn = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
  68. reader.Close();
  69. myResponse.Close();
  70. joRtn = JObject.Parse(rtn);
  71. return joRtn;
  72. }
  73. catch (Exception ex)
  74. {
  75. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  76. rtn = JsonConvert.SerializeObject(joRtn);
  77. return joRtn;
  78. }
  79. }
  80. /// <summary>
  81. /// HIS服务调用的封装
  82. /// </summary>
  83. /// <param name="data"></param>
  84. /// <returns></returns>
  85. public JObject invokeHISService(string data, string serviceDesc)
  86. {
  87. JObject joRtn = new JObject();
  88. try
  89. {
  90. //先根据用户请求的uri构造请求地址
  91. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  92. authorization = Global.hisConfig.authorization;
  93. joRtn = invokeIrisService(data, serviceDesc);
  94. return joRtn;
  95. }
  96. catch (Exception ex)
  97. {
  98. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  99. return joRtn;
  100. }
  101. finally
  102. {
  103. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  104. }
  105. }
  106. /// <summary>
  107. /// 医保平台服务调用的封装
  108. /// </summary>
  109. /// <param name="data"></param>
  110. /// <returns></returns>
  111. public JObject invokeInsuService(string data, string serviceDesc)
  112. {
  113. string rtn = "";
  114. JObject joRtn = new JObject();
  115. try
  116. {
  117. //先根据用户请求的uri构造请求地址
  118. serviceURL = string.Format("{0}/{1}", Global.insuConfig.ip, Global.insuConfig.url);
  119. authorization = Global.insuConfig.authorization;
  120. joRtn = invokeIrisService(data, serviceDesc);
  121. rtn = JsonConvert.SerializeObject(joRtn);
  122. return joRtn;
  123. }
  124. catch (Exception ex)
  125. {
  126. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  127. rtn = JsonConvert.SerializeObject(joRtn);
  128. return joRtn;
  129. }
  130. finally
  131. {
  132. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), rtn);
  133. }
  134. }
  135. private JObject invokeCenterService(string data)
  136. {
  137. string postContent = "";
  138. JObject joRtn = new JObject();
  139. try
  140. {
  141. //创建一个HTTP请求
  142. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  143. //Post请求方式
  144. request.Method = "POST";
  145. //内容类型
  146. request.ContentType = "application/json";
  147. String stamp = TimeStamp.get13().ToString();
  148. string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.Length - 12);
  149. if (apiName.Contains("4101A"))
  150. {
  151. apiName = "h" + apiName;
  152. }
  153. Global.writeLog(apiName);
  154. //南昌增加头部信息
  155. string sTemp = "_api_access_key=" + Global.inf.AK
  156. + "&_api_name=" + apiName
  157. + "&_api_timestamp=" + stamp
  158. + "&_api_version=" + "1.0.0";
  159. string signature = Encrypt.ToBase64hmac(sTemp,Global.inf.SK);
  160. //Global.writeLog(sTemp);
  161. //Global.writeLog(Global.inf.SK);
  162. //Global.writeLog(signature);
  163. request.Headers.Add("_api_version", "1.0.0");
  164. request.Headers.Add("_api_timestamp", stamp);
  165. request.Headers.Add("_api_name",apiName);
  166. request.Headers.Add("_api_signature", signature);
  167. request.Headers.Add("_api_access_key", Global.inf.AK);
  168. //设置参数,并进行URL编码
  169. string paraUrlCoded = data;//System.Web.HttpUtility.UrlEncode(jsonParas);
  170. byte[] payload;
  171. //将Json字符串转化为字节
  172. payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
  173. //设置请求的ContentLength
  174. request.ContentLength = payload.Length;
  175. //发送请求,获得请求流
  176. Stream writer;
  177. writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
  178. //将请求参数写入流
  179. writer.Write(payload, 0, payload.Length);
  180. writer.Close();//关闭请求流
  181. // String strValue = "";//strValue为http响应所返回的字符流
  182. HttpWebResponse response;
  183. try
  184. {
  185. //获得响应流
  186. response = (HttpWebResponse)request.GetResponse();
  187. }
  188. catch (WebException ex)
  189. {
  190. response = ex.Response as HttpWebResponse;
  191. return JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常", ex.Message);
  192. }
  193. Stream s = response.GetResponseStream();
  194. StreamReader sRead = new StreamReader(s);
  195. postContent = sRead.ReadToEnd();
  196. sRead.Close();
  197. joRtn = JObject.Parse(postContent);//返回Json数据
  198. return joRtn;
  199. }
  200. catch (Exception ex)
  201. {
  202. postContent = "调用中心服务异常" + ex.Message;
  203. joRtn.Add("infcode", -1);
  204. joRtn.Add("err_msg", "invokeCenterService(1):" + ex.Message);
  205. return joRtn;
  206. }
  207. }
  208. public JObject invokeCenterService(string funNO, JObject data)
  209. {
  210. JObject joRtn = new JObject();
  211. String outPar = "";
  212. try
  213. {
  214. Global.curEvt.URL = Global.inf.centerURL + "/hsa-fsi-" + funNO;
  215. joRtn = invokeCenterService(data.ToString());
  216. outPar = JsonHelper.Compress(joRtn);
  217. return joRtn;
  218. }
  219. catch (Exception ex)
  220. {
  221. joRtn.Add("infcode", -1);
  222. joRtn.Add("err_msg", "invokeCenterService(2):" + ex.Message);
  223. outPar = JsonHelper.Compress(joRtn);
  224. return joRtn;
  225. }
  226. finally
  227. {
  228. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  229. this.saveCenterLog(JsonHelper.Compress(data), outPar);
  230. }
  231. }
  232. public JObject invokeCenterService(string funNO, string data)
  233. {
  234. JObject joRtn = new JObject();
  235. String outPar = "";
  236. try
  237. {
  238. Global.curEvt.URL = Global.inf.centerURL+ "/hsa-fsi-" + funNO;
  239. joRtn = invokeCenterService(data);
  240. outPar = JsonHelper.Compress(joRtn);
  241. return joRtn;
  242. }
  243. catch (Exception ex)
  244. {
  245. joRtn.Add("infcode", -1);
  246. joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message);
  247. outPar = JsonHelper.Compress(joRtn);
  248. return joRtn;
  249. }
  250. finally
  251. {
  252. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), outPar);
  253. this.saveCenterLog(data, outPar);
  254. }
  255. }
  256. public JObject DownloadCenterFile(string data)
  257. {
  258. string error = string.Empty; int errorCode = 0;
  259. string sRtn = "";
  260. try
  261. {
  262. JObject jsonInParam = JObject.Parse(data);
  263. string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"];
  264. string fileDir = Global.curEvt.path + "\\Download";
  265. string filePath = fileDir + "\\" + fileName;
  266. //如果不存在目录,则创建目录
  267. if (!Directory.Exists(fileDir))
  268. {
  269. //创建文件夹
  270. DirectoryInfo dirInfo = Directory.CreateDirectory(fileDir);
  271. }
  272. if (File.Exists(filePath))
  273. {
  274. File.Delete(filePath);
  275. }
  276. FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
  277. //创建一个HTTP请求
  278. Global.curEvt.URL = Global.inf.centerURL + "/hsa-fsi-9102";
  279. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  280. //Post请求方式
  281. request.Method = "POST";
  282. //内容类型
  283. request.ContentType = "application/json";
  284. String stamp = TimeStamp.get13().ToString();
  285. string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.Length - 12);
  286. //南昌增加头部信息
  287. string sTemp = "_api_access_key=" + Global.inf.AK
  288. + "&_api_name=" + apiName
  289. + "&_api_timestamp=" + stamp
  290. + "&_api_version=" + "1.0.0";
  291. string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.SK);
  292. //Global.writeLog(sTemp);
  293. //Global.writeLog(Global.inf.SK);
  294. //Global.writeLog(signature);
  295. request.Headers.Add("_api_version", "1.0.0");
  296. request.Headers.Add("_api_timestamp", stamp);
  297. request.Headers.Add("_api_name", apiName);
  298. request.Headers.Add("_api_signature", signature);
  299. request.Headers.Add("_api_access_key", Global.inf.AK);
  300. //设置参数,并进行URL编码
  301. string paraUrlCoded = data;//System.Web.HttpUtility.UrlEncode(jsonParas);
  302. byte[] payload;
  303. //将Json字符串转化为字节
  304. payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
  305. //设置请求的ContentLength
  306. request.ContentLength = payload.Length;
  307. Stream writer;
  308. try
  309. {
  310. writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
  311. }
  312. catch (Exception)
  313. {
  314. writer = null;
  315. errorCode = -100;
  316. error = "连接服务器失败!";
  317. }
  318. //将请求参数写入流
  319. writer.Write(payload, 0, payload.Length);
  320. writer.Close();//关闭请求流
  321. // String strValue = "";//strValue为http响应所返回的字符流
  322. //发送请求并获取相应回应数据
  323. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  324. //直到request.GetResponse()程序才开始向目标网页发送Post请求
  325. Stream responseStream = response.GetResponseStream();
  326. //创建本地文件写入流
  327. byte[] bArr = new byte[1024];
  328. int iTotalSize = 0;
  329. int size = responseStream.Read(bArr, 0, (int)bArr.Length);
  330. while (size > 0)
  331. {
  332. iTotalSize += size;
  333. fs.Write(bArr, 0, size);
  334. size = responseStream.Read(bArr, 0, (int)bArr.Length);
  335. }
  336. fs.Close();
  337. responseStream.Close();
  338. dynamic joReturn = new JObject();
  339. joReturn.errorCode = errorCode;
  340. joReturn.error = error;
  341. joReturn.filePath = filePath;
  342. sRtn = joReturn.ToString();
  343. return joReturn;
  344. }
  345. catch (Exception ex)
  346. {
  347. errorCode = -100;
  348. error = ex.Message;
  349. dynamic joReturn = new JObject();
  350. joReturn.errorCode = errorCode;
  351. joReturn.error = error;
  352. sRtn = joReturn.ToString();
  353. return joReturn;
  354. }
  355. finally
  356. {
  357. Global.writeLog("DownloadCenterFile" +"(" + Global.curEvt.URL + ")", data, sRtn);
  358. }
  359. }
  360. public JObject DownloadCenterFile(string fileName, string data)
  361. {
  362. string error = string.Empty; int errorCode = 0;
  363. string sRtn = "";
  364. try
  365. {
  366. string filePath = Global.curEvt.path + "\\Download\\" + fileName;
  367. Global.writeLog(filePath);
  368. //获取文件夹路径
  369. int a = filePath.LastIndexOf('\\');
  370. string dirPath = filePath.Substring(0, a);
  371. Global.writeLog(dirPath);
  372. //如果不存在目录,则创建目录
  373. if (!Directory.Exists(dirPath))
  374. {
  375. //创建文件夹
  376. DirectoryInfo dirInfo = Directory.CreateDirectory(dirPath);
  377. }
  378. if (File.Exists(filePath))
  379. {
  380. File.Delete(filePath);
  381. }
  382. FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
  383. //创建一个HTTP请求
  384. Global.curEvt.URL = Global.inf.centerURL + "/hsa-fsi-9102" ;
  385. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  386. //Post请求方式
  387. request.Method = "POST";
  388. //内容类型
  389. request.ContentType = "application/json";
  390. String stamp = TimeStamp.get13().ToString();
  391. string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.Length - 12);
  392. //南昌增加头部信息
  393. string sTemp = "_api_access_key=" + Global.inf.AK
  394. + "&_api_name=" + apiName
  395. + "&_api_timestamp=" + stamp
  396. + "&_api_version=" + "1.0.0";
  397. string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.SK);
  398. //Global.writeLog(sTemp);
  399. //Global.writeLog(Global.inf.SK);
  400. //Global.writeLog(signature);
  401. request.Headers.Add("_api_version", "1.0.0");
  402. request.Headers.Add("_api_timestamp", stamp);
  403. request.Headers.Add("_api_name", apiName);
  404. request.Headers.Add("_api_signature", signature);
  405. request.Headers.Add("_api_access_key", Global.inf.AK);
  406. //设置参数,并进行URL编码
  407. string paraUrlCoded = data;//System.Web.HttpUtility.UrlEncode(jsonParas);
  408. byte[] payload;
  409. //将Json字符串转化为字节
  410. payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
  411. //设置请求的ContentLength
  412. request.ContentLength = payload.Length;
  413. Stream writer;
  414. try
  415. {
  416. writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
  417. }
  418. catch (Exception)
  419. {
  420. writer = null;
  421. errorCode = -100;
  422. error = "连接服务器失败!";
  423. }
  424. //将请求参数写入流
  425. writer.Write(payload, 0, payload.Length);
  426. writer.Close();//关闭请求流
  427. // String strValue = "";//strValue为http响应所返回的字符流
  428. //发送请求并获取相应回应数据
  429. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  430. //直到request.GetResponse()程序才开始向目标网页发送Post请求
  431. Stream responseStream = response.GetResponseStream();
  432. //创建本地文件写入流
  433. byte[] bArr = new byte[1024];
  434. int iTotalSize = 0;
  435. int size = responseStream.Read(bArr, 0, (int)bArr.Length);
  436. while (size > 0)
  437. {
  438. iTotalSize += size;
  439. fs.Write(bArr, 0, size);
  440. size = responseStream.Read(bArr, 0, (int)bArr.Length);
  441. }
  442. fs.Close();
  443. responseStream.Close();
  444. dynamic joReturn = new JObject();
  445. joReturn.errorCode = errorCode;
  446. joReturn.errorMessage = error;
  447. joReturn.filePath = filePath;
  448. sRtn = joReturn.ToString();
  449. return joReturn;
  450. }
  451. catch (Exception ex)
  452. {
  453. errorCode = -100;
  454. error = ex.Message;
  455. dynamic joReturn = new JObject();
  456. joReturn.errorCode = errorCode;
  457. joReturn.errorMessage = error;
  458. sRtn = joReturn.ToString();
  459. return joReturn;
  460. }
  461. finally
  462. {
  463. Global.writeLog("DownloadCenterFile" + "(" + Global.curEvt.URL + ")", data, sRtn);
  464. }
  465. }
  466. /// <summary>
  467. /// 保存中心交易日志到数据库
  468. /// </summary>
  469. /// <param name="inParam"></param>
  470. /// <param name="outParam"></param>
  471. private void saveCenterLog(string inParam, string outParam)
  472. {
  473. dynamic joIris = new JObject();
  474. string sRtn = "";
  475. try
  476. {
  477. //解析postContent,插入医保交易日志表
  478. JObject joIn = new JObject(JObject.Parse(inParam));
  479. JObject joOut = new JObject(JObject.Parse(outParam));
  480. JArray jaParams = new JArray();
  481. JObject joParam = new JObject();
  482. joParam.Add("inParam", JObject.FromObject(joIn));
  483. joParam.Add("outParam", JObject.FromObject(joOut));
  484. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  485. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  486. joParam.Add("updateUserID", Global.user.ID);
  487. joParam.Add("psn_no", Global.pat.psn_no);
  488. jaParams.Add(joParam);
  489. joIris.code = "09010021";
  490. joIris.Add("params", jaParams);
  491. //InvokeHelper invoker = new InvokeHelper();
  492. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  493. }
  494. catch (Exception ex)
  495. {
  496. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  497. }
  498. }
  499. }
  500. }