InvokeHelper.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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.IO;
  15. using System.Net;
  16. using System.Windows.Forms;
  17. using Newtonsoft.Json;
  18. using PTMedicalInsurance.Common;
  19. using PTMedicalInsurance.Variables;
  20. using PTMedicalInsurance.Forms;
  21. using PTMedicalInsurance.APIGATEWAY_SDK;
  22. namespace PTMedicalInsurance.Helper
  23. {
  24. public class InvokeHelper
  25. {
  26. private string serviceURL;
  27. private string authorization;
  28. public InvokeHelper()
  29. {
  30. IniFile ini = new IniFile(Global.curEvt.path + @"\CenterServiceURL.ini");
  31. //Global.inf.centerURL = ini.ReadValue("CENTER", "url");
  32. //Global.inf.uploadURL = ini.ReadValue("CENTER", "upload");
  33. //Global.inf.downURL = ini.ReadValue("CENTER", "download");
  34. //Global.inf.ecURL = ini.ReadValue("CENTER", "ecToken");
  35. }
  36. #region 内部服务调用
  37. /// <summary>
  38. /// iris服务调用的封装
  39. /// </summary>
  40. /// <param name="data"></param>
  41. /// <returns></returns>
  42. public JObject invokeIrisService(string data, string serviceDesc)
  43. {
  44. string rtn = "", url = "";
  45. JObject joRtn = new JObject();
  46. try
  47. {
  48. //先根据用户请求的uri构造请求地址
  49. url = serviceURL;
  50. ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
  51. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
  52. //创建Web访问对象
  53. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  54. //把用户传过来的数据转成“UTF-8”的字节流
  55. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  56. //添加头部信息
  57. myRequest.Method = "POST";
  58. myRequest.ContentLength = buf.Length;
  59. myRequest.ContentType = "application/json";
  60. myRequest.Headers.Add("Authorization", authorization);
  61. myRequest.MaximumAutomaticRedirections = 1;
  62. myRequest.AllowAutoRedirect = true;
  63. //发送请求
  64. Stream stream = myRequest.GetRequestStream();
  65. stream.Write(buf, 0, buf.Length);
  66. stream.Close();
  67. //获取接口返回值
  68. //通过Web访问对象获取响应内容
  69. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  70. rtn = getResponseData(myResponse);
  71. joRtn = JObject.Parse(rtn);
  72. return joRtn;
  73. }
  74. catch (Exception ex)
  75. {
  76. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  77. rtn = JsonConvert.SerializeObject(joRtn);
  78. return joRtn;
  79. }
  80. }
  81. /// <summary>
  82. /// HIS服务调用的封装
  83. /// </summary>
  84. /// <param name="data"></param>
  85. /// <returns></returns>
  86. ///
  87. public JObject invokeHISService(string data, string serviceDesc)
  88. {
  89. JObject joRtn = new JObject();
  90. try
  91. {
  92. //先根据用户请求的uri构造请求地址
  93. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  94. authorization = Global.hisConfig.authorization;
  95. joRtn = invokeIrisService(data, serviceDesc);
  96. return joRtn;
  97. }
  98. catch (Exception ex)
  99. {
  100. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  101. return joRtn;
  102. }
  103. finally
  104. {
  105. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  106. }
  107. }
  108. /// <summary>
  109. /// 医保平台服务调用的封装
  110. /// </summary>
  111. /// <param name="data"></param>
  112. /// <returns></returns>
  113. public JObject invokeInsuService(string data, string serviceDesc)
  114. {
  115. string rtn = "";
  116. JObject joRtn = new JObject();
  117. try
  118. {
  119. //先根据用户请求的uri构造请求地址
  120. serviceURL = string.Format("{0}/{1}", Global.insuConfig.ip, Global.insuConfig.url);
  121. authorization = Global.insuConfig.authorization;
  122. joRtn = invokeIrisService(data, serviceDesc);
  123. rtn = JsonConvert.SerializeObject(joRtn);
  124. //if (serviceDesc == "插入签到信息")
  125. //{
  126. // MessageBox.Show("插入签到信息入参:" + data +"|返回值:"+ rtn.ToString()+"|"+ Global.insuConfig.url);
  127. //}
  128. return joRtn;
  129. }
  130. catch (Exception ex)
  131. {
  132. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  133. rtn = JsonConvert.SerializeObject(joRtn);
  134. return joRtn;
  135. }
  136. finally
  137. {
  138. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), rtn);
  139. }
  140. }
  141. private string getResponseData(HttpWebResponse response)
  142. {
  143. string data = "";
  144. if (response != null)
  145. {
  146. Stream s = response.GetResponseStream();
  147. StreamReader sRead = new StreamReader(s);
  148. data = sRead.ReadToEnd();
  149. sRead.Close();
  150. response.Close();
  151. }
  152. return data;
  153. }
  154. #endregion
  155. #region 医保中心调用
  156. private JObject invokeCenterService(string data)
  157. {
  158. JObject joRtn = new JObject();
  159. IInvokeCenter center = InvokeCenterFactory.create();
  160. string outputData = "";
  161. string errMsg = "";
  162. int iInt = center.Init(ref errMsg);
  163. if (iInt == 0)
  164. {
  165. iInt = center.Business(data, ref outputData, ref errMsg);
  166. joRtn = JObject.Parse(outputData);
  167. return joRtn;
  168. }
  169. else
  170. {
  171. joRtn.Add("infcode", -1);
  172. joRtn.Add("err_msg", "医保动态库初始化失败invokeInitByDLL:" + errMsg);
  173. return joRtn;
  174. }
  175. }
  176. private void prepareCallCenter(string funNo)
  177. {
  178. string prefix = Global.inf.centerURL;
  179. //switch (funNo)
  180. //{
  181. // case "9101":
  182. // prefix = Global.inf.uploadURL;
  183. // break;
  184. // case "9102":
  185. // prefix = Global.inf.downURL;
  186. // break;
  187. // default:
  188. // prefix = Global.inf.centerURL;
  189. // break;
  190. //}
  191. Global.curEvt.URL = prefix ;
  192. }
  193. /// <summary>
  194. /// 这个是调用业务服务的invokeCenterService
  195. /// </summary>
  196. /// <param name="funNO"></param>
  197. /// <param name="data"></param>
  198. /// <returns></returns>
  199. public JObject invokeCenterService(string funNO, JObject data)
  200. {
  201. // 动态调试模式
  202. if (Global.curEvt.enabledDebug)
  203. {
  204. CenterResult center = new CenterResult();
  205. center.setTradeNo(funNO);
  206. if (center.ShowDialog() == DialogResult.OK)
  207. {
  208. string outPar = center.returnData;
  209. return JObject.Parse(outPar);
  210. }
  211. }
  212. prepareCallCenter(funNO);
  213. return invokeCenterService(JsonHelper.toJsonString(data));
  214. }
  215. /// <summary>
  216. /// 这个是下载目录用的invokeCenterService
  217. /// </summary>
  218. /// <param name="funNO"></param>
  219. /// <param name="data"></param>
  220. /// <returns></returns>
  221. public JObject invokeCenterService(string funNO, string data)
  222. {
  223. // 动态调试模式
  224. if (Global.curEvt.enabledDebug)
  225. {
  226. CenterResult center = new CenterResult();
  227. center.setTradeNo(funNO);
  228. if (center.ShowDialog() == DialogResult.OK)
  229. {
  230. string outPar = center.returnData;
  231. return JObject.Parse(outPar);
  232. }
  233. }
  234. prepareCallCenter(funNO);
  235. return invokeCenterService(data);
  236. }
  237. /// <summary>
  238. /// 医保目录txt文件下载
  239. /// </summary>
  240. /// <param name="data"></param>
  241. /// <returns></returns>
  242. public JObject DownloadCenterFile(string data)
  243. {
  244. //download file
  245. IInvokeCenter center = InvokeCenterFactory.create();
  246. string outputMsg = "";
  247. JObject joRtn = new JObject();
  248. int rtnCode = center.DownloadFile(data, ref outputMsg);
  249. if(rtnCode==0)
  250. {
  251. joRtn = JObject.Parse(outputMsg);
  252. }
  253. else
  254. {
  255. joRtn.Add("infcode", -1);
  256. joRtn.Add("err_msg", "下载文件失败DownloadFile:" + outputMsg);
  257. }
  258. return joRtn;
  259. }
  260. #endregion
  261. #region 移动
  262. /// <summary>
  263. /// 移动
  264. /// </summary>
  265. /// <param name="funNO"></param>
  266. /// <param name="data"></param>
  267. /// <returns></returns>
  268. public JObject invokeMPService(string funNO, string data)
  269. {
  270. JObject joRtn = new JObject();
  271. String outPar = "";
  272. try
  273. {
  274. Global.curEvt.URL = Global.inf.centerURL + funNO;
  275. joRtn = invokeCenterService(data);
  276. outPar = JsonHelper.Compress(joRtn);
  277. return joRtn;
  278. }
  279. catch (Exception ex)
  280. {
  281. if (joRtn["infcode"] == null)
  282. { joRtn.Add("infcode", -1); }
  283. if (joRtn["err_msg"] == null)
  284. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  285. outPar = JsonHelper.Compress(joRtn);
  286. return joRtn;
  287. }
  288. finally
  289. {
  290. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  291. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  292. }
  293. }
  294. /// <summary>
  295. /// 保存中心交易日志到数据库
  296. /// </summary>
  297. /// <param name="inParam"></param>
  298. /// <param name="outParam"></param>
  299. /// <param name="inParamPlain"></param>
  300. /// <param name="outParamPlain"></param>
  301. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  302. {
  303. dynamic joIris = new JObject();
  304. string sRtn = "";
  305. try
  306. {
  307. //解析postContent,插入医保交易日志表
  308. JObject joInParam = new JObject(JObject.Parse(inParam));
  309. //解包
  310. JObject joIn = Utils.removeWrapper(joInParam);
  311. JObject joOut = new JObject(JObject.Parse(outParam));
  312. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  313. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  314. JArray jaParams = new JArray();
  315. JObject joParam = new JObject();
  316. joParam.Add("inParam", JObject.FromObject(joIn));
  317. joParam.Add("outParam", JObject.FromObject(joOut));
  318. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  319. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  320. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  321. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  322. joParam.Add("updateUserID", Global.user.ID);
  323. joParam.Add("psn_no", Global.pat.psn_no);
  324. jaParams.Add(joParam);
  325. joIris.code = "09010021";
  326. joIris.Add("params", jaParams);
  327. //InvokeHelper invoker = new InvokeHelper();
  328. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  329. }
  330. catch (Exception ex)
  331. {
  332. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  333. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  334. }
  335. }
  336. #endregion
  337. #region 处方流转
  338. /// <summary>
  339. /// 医保电子处方流转调用服务
  340. /// </summary>
  341. /// <param name="data"></param>
  342. /// <returns></returns>
  343. private JObject invokeCenterServicePresCir(string data)
  344. {
  345. string postContent = "";
  346. JObject joRtn = new JObject();
  347. try
  348. {
  349. //内容类型
  350. Signer signer = new Signer();
  351. signer.Key = Global.inf.PresCir.privateKey; //应用编码
  352. signer.Secret = Global.inf.PresCir.secretKey; //secretKey 私钥
  353. string timestamp = TimeStamp.get13().ToString(); //当前时间戳(秒)
  354. string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复)
  355. HttpRequest Resquest = new HttpRequest("POST", new Uri(Global.curEvt.URL));
  356. Resquest.headers.Add("charset", "UTF-8");
  357. //Resquest.headers.Add("x-hw-id", signer.Key);
  358. //Resquest.headers.Add("x-tif-timestamp", timestamp);
  359. //Resquest.headers.Add("x-tif-passid", signer.Key);
  360. //Resquest.headers.Add("x-tif-nonce", nonce);
  361. Resquest.body = data;
  362. string RtnStr;
  363. HttpWebRequest req = signer.Sign(Resquest);
  364. req.ContentType = "application/json;charset=utf8";
  365. req.Timeout = 5 * 10000;
  366. try
  367. {
  368. var writer = new StreamWriter(req.GetRequestStream());
  369. writer.Write(Resquest.body);
  370. writer.Flush();
  371. HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
  372. StreamReader reader = new StreamReader(resp.GetResponseStream());
  373. RtnStr = reader.ReadToEnd();
  374. joRtn = JObject.Parse(RtnStr);//返回Json数据
  375. return joRtn;
  376. }
  377. catch (WebException e)
  378. {
  379. HttpWebResponse resp = (HttpWebResponse)e.Response;
  380. if (resp != null)
  381. {
  382. return JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常(a)", new StreamReader(resp.GetResponseStream()).ReadToEnd() + "异常内容:" + e.Message);
  383. }
  384. else
  385. {
  386. RtnStr = "异常:" + e.Message;
  387. return JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常(b)", e.Message);
  388. }
  389. }
  390. }
  391. catch (Exception ex)
  392. {
  393. postContent = "调用中心服务异常" + ex.Message;
  394. joRtn.Add("infcode", -1);
  395. joRtn.Add("err_msg", "invokeCenterService(Exception_Last):" + ex.Message);
  396. return joRtn;
  397. }
  398. }
  399. /// </summary>
  400. /// <param name="funNO"></param>
  401. /// <param name="data"></param>
  402. /// <returns></returns>
  403. public JObject invokeCenterServicePresCir(string funNO, string data)
  404. {
  405. JObject joRtn = new JObject();
  406. string outPar = "";
  407. try
  408. {
  409. if (funNO == "7101")
  410. {
  411. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/uploadChk";
  412. }
  413. else if (funNO == "7102")
  414. {
  415. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxFixmedinsSign";
  416. }
  417. else if (funNO == "7103")
  418. {
  419. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxFileUpld";
  420. }
  421. else if (funNO == "7104")
  422. {
  423. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxUndo";
  424. }
  425. else if (funNO == "7105")
  426. {
  427. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/hospRxDetlQuery";
  428. }
  429. else if (funNO == "7106")
  430. {
  431. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxChkInfoQuery";
  432. }
  433. else if (funNO == "7107")
  434. {
  435. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxSetlInfoQuery";
  436. }
  437. else if (funNO == "7108")
  438. {
  439. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxChkInfoCallback";
  440. }
  441. else if (funNO == "7109")
  442. {
  443. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxSetlInfoCallback";
  444. }
  445. else if (funNO == "7112") //电子处方药品目录查询
  446. {
  447. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/circDrugQuery";
  448. }
  449. else
  450. {
  451. Global.curEvt.URL = Global.inf.centerURL;
  452. }
  453. //Global.curEvt.URL = Global.inf.centerURL;
  454. joRtn = invokeCenterServicePresCir(data);
  455. outPar = JsonHelper.Compress(joRtn);
  456. return joRtn;
  457. }
  458. catch (Exception ex)
  459. {
  460. if (joRtn["infcode"] == null)
  461. { joRtn.Add("infcode", -1); }
  462. if (joRtn["err_msg"] == null)
  463. { joRtn.Add("err_msg", "invokeCenterServicePresCir(3):" + ex.Message); }
  464. outPar = JsonHelper.Compress(joRtn);
  465. return joRtn;
  466. }
  467. finally
  468. {
  469. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  470. //this.saveCenterLog(JsonHelper.Compress(data), outPar, JsonHelper.Compress(data), outPar);
  471. }
  472. }
  473. #endregion
  474. }
  475. }