You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

433 lines
16 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 weeks ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using Dapper;
  2. using log4net.Repository.Hierarchy;
  3. using Npgsql;
  4. using ServiceReferenceHzcyHis;
  5. using Shentun.Peis.Enums;
  6. using Shentun.Peis.PlugIns.ChargeRequests;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Data.Common;
  10. using System.Linq;
  11. using System.ServiceModel;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using static ServiceReferenceHzcyHis.bstjPortTypeClient;
  15. namespace Shentun.Peis.PlugIns.Extensions.ChargeRequests.Hzcy
  16. {
  17. public class ChargeRequestPlugInsHzcy : ChargeRequestPlugInsBase
  18. {
  19. private string _endpointAddress = "";
  20. public ChargeRequestPlugInsHzcy(Guid thirdInterfaceId) : base(thirdInterfaceId)
  21. {
  22. _endpointAddress = InterfaceConfig.GetSection("Interface").GetSection("EndpointAddress").Value;
  23. }
  24. public ChargeRequestPlugInsHzcy(string parmValue) : base(parmValue)
  25. {
  26. _endpointAddress = InterfaceConfig.GetSection("Interface").GetSection("EndpointAddress").Value;
  27. }
  28. public override async Task<ChargeRequestPlugInsOut> SendChargeRequestAsync(ChargeRequestPlugInsInput input)
  29. {
  30. //建立人员档案
  31. var patientRegisterForPlugIns = await GetPatientRegisterAsync(input.ChargeRequestId);
  32. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  33. if (chargeRequestForPlugIns == null)
  34. {
  35. throw new Exception("没有申请单信息");
  36. }
  37. if (!chargeRequestForPlugIns.Asbitems.Any())
  38. {
  39. throw new Exception("申请单没有组合项目信息");
  40. }
  41. if (patientRegisterForPlugIns.BirthDate == null)
  42. {
  43. throw new Exception("出生日期不能为空");
  44. }
  45. var hisPatientQueryInput = new HisPatientQueryInput()
  46. {
  47. Data = new HisPatientQueryDataInput()
  48. {
  49. MsgHeader = new HisMsgHeaderInput()
  50. {
  51. Sender = "PEIS",
  52. MsgType = "SVR_ODS_1101",
  53. MsgVersion = "3.1",
  54. },
  55. Patient = new HisPatientQueryPatientInput()
  56. {
  57. IdCard = patientRegisterForPlugIns.IdNo,
  58. IdCardCode = "01",
  59. Name = patientRegisterForPlugIns.PatientName,
  60. Sex = ConverSex(patientRegisterForPlugIns.SexId),
  61. BirthDate = ((DateTime)patientRegisterForPlugIns.BirthDate).ToString("yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.InvariantInfo),
  62. PatientPhone = patientRegisterForPlugIns.MobileTelephone,
  63. EthnicGroupCode = "01",
  64. WorkUnit = patientRegisterForPlugIns.CustomerOrgName,
  65. Address = patientRegisterForPlugIns.Address,
  66. }
  67. }
  68. };
  69. var result = await PatientQuery(hisPatientQueryInput);
  70. if (result.MsgHeader.Status != "true")
  71. {
  72. throw new Exception("建立HIS档案失败" + result.MsgHeader.Detail);
  73. }
  74. //更新人员登记信息
  75. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  76. {
  77. conn.Execute(@"update patient_register set his_patient_id = @HisPatientId
  78. where id = @PatientRegisterId",
  79. new
  80. {
  81. HisPatientId = result.Patient.PatientId,
  82. patientRegisterForPlugIns.PatientRegisterId
  83. });
  84. }
  85. //发送项目
  86. var hisInput = new HisMecSaveInput()
  87. {
  88. Data = new HisMecSaveDataInput()
  89. {
  90. MsgHeader = new HisMsgHeaderInput()
  91. {
  92. Sender = "PEIS",
  93. MsgType = "SVR_ODS_6101",
  94. MsgVersion = "3.1",
  95. },
  96. Items = new List<HisMecSaveDataItemInput>()
  97. {
  98. new HisMecSaveDataItemInput()
  99. {
  100. ExamRequestNo =chargeRequestForPlugIns.ChargeRequestNo,
  101. FeeType = "1",
  102. EmpId = result.Patient.PatientId,
  103. DeptId = "",
  104. DoctId = "",
  105. ExeDeptId = "",
  106. Tjunit = patientRegisterForPlugIns.CustomerOrgName,
  107. Tjfee = chargeRequestForPlugIns.Asbitems.Sum(o=>o.Charges).ToString(),
  108. Ztxm = "",
  109. Remark = "体检科"
  110. },
  111. }
  112. }
  113. };
  114. var mecSaveResult = await MecSave(hisInput);
  115. if (mecSaveResult.MsgHeader.Status != "true")
  116. {
  117. throw new Exception("建立HIS档案失败" + mecSaveResult.MsgHeader.Detail);
  118. }
  119. //更新申请单信息
  120. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  121. {
  122. conn.Execute(@"update charge_request set his_charge_no = @HisChargeNo
  123. where id = @ChargeRequestId",
  124. new
  125. {
  126. HisChargeNo = mecSaveResult.MsgHeader.Yjxh,
  127. input.ChargeRequestId
  128. });
  129. }
  130. return new ChargeRequestPlugInsOut();
  131. }
  132. public override async Task<ChargeRequestPlugInsOut> CancelChargeRequestAsync(ChargeRequestPlugInsInput input)
  133. {
  134. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  135. if (chargeRequestForPlugIns == null)
  136. {
  137. throw new Exception("没有申请单信息");
  138. }
  139. var hisInput = new HisCancelQrCodeInput()
  140. {
  141. Data = new HisCancelQrCodeDataInput()
  142. {
  143. MsgHeader = new HisMsgHeaderInput()
  144. {
  145. Sender = "PEIS",
  146. MsgType = "SVR_ODS_6105",
  147. MsgVersion = "3.1",
  148. },
  149. Item = new HisCancelQrCodeDataItemInput()
  150. {
  151. Yjxh = chargeRequestForPlugIns.HisChargeNo,
  152. ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo
  153. }
  154. }
  155. };
  156. var result = await CancelQrCode(hisInput);
  157. if (result.MsgHeader.Status != "true")
  158. {
  159. //-1 申请单未找到
  160. if (!result.MsgHeader.Detail.Contains("未查到开单信息"))
  161. {
  162. var payStatus = await GetPayStatus(chargeRequestForPlugIns.ChargeRequestNo, chargeRequestForPlugIns.HisChargeNo);
  163. if (payStatus == "1")
  164. {
  165. throw new Exception("his已缴费");
  166. }
  167. else if (payStatus == "2")
  168. {
  169. throw new Exception("his已作废");
  170. }
  171. else if (payStatus == "3")
  172. {
  173. throw new Exception("his已退费");
  174. }
  175. }
  176. }
  177. await SetAppChargeRequestFlagAsync(chargeRequestForPlugIns, ChargeRequestFlag.AlreadyCancelCharge);
  178. return new ChargeRequestPlugInsOut();
  179. }
  180. public override async Task DoWorkAsync()
  181. {
  182. throw new Exception("格尔木DoWorkAsync。。。");
  183. //return base.DoWorkAsync();
  184. }
  185. public override async Task<ChargeRequestPlugInsOut> RefundRequestAsync(ChargeRequestPlugInsInput input)
  186. {
  187. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  188. if (chargeRequestForPlugIns == null)
  189. {
  190. throw new Exception("没有申请单信息");
  191. }
  192. var hisInput = new HisAgreeRefundInput()
  193. {
  194. Data = new HisAgreeRefundDataInput()
  195. {
  196. MsgHeader = new HisMsgHeaderInput()
  197. {
  198. Sender = "PEIS",
  199. MsgType = "SVR_ODS_6105",
  200. MsgVersion = "3.1",
  201. },
  202. Item = new HisAgreeRefundDataItemInput()
  203. {
  204. Yjxh = chargeRequestForPlugIns.HisChargeNo,
  205. ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo
  206. }
  207. }
  208. };
  209. var result = await AgreeRefund(hisInput);
  210. if (result.MsgHeader.Status != "true")
  211. {
  212. var payStatus = await GetPayStatus(chargeRequestForPlugIns.ChargeRequestNo, chargeRequestForPlugIns.HisChargeNo);
  213. if (payStatus != "3")
  214. {
  215. throw new Exception("允许退费申请失败" + result.MsgHeader.Detail);
  216. }
  217. }
  218. await SetAppChargeRequestFlagAsync(chargeRequestForPlugIns, ChargeRequestFlag.RefundRequest);
  219. return new ChargeRequestPlugInsOut();
  220. }
  221. /// <summary>
  222. /// 自动任务执行方法
  223. /// </summary>
  224. /// <returns></returns>
  225. public override Task DoWork()
  226. {
  227. var queryDaysStr = InterfaceConfig.GetSection("Interface").GetSection("Scheduler").GetSection("QueryDays").Value;
  228. if (string.IsNullOrWhiteSpace(queryDaysStr))
  229. {
  230. queryDaysStr = "1";
  231. }
  232. if (!int.TryParse(queryDaysStr, out int days))
  233. {
  234. days = 1;
  235. }
  236. var chargeRequests = GetRequestsAsync(days).Result;
  237. foreach (var chargeRequest in chargeRequests)
  238. {
  239. try
  240. {
  241. SyncChargeRequestFlagFromInterfaceAsync(new ChargeRequestPlugInsInput { ChargeRequestId = chargeRequest.ChargeRequestId })
  242. .GetAwaiter().GetResult();
  243. }
  244. catch (Exception ex)
  245. {
  246. }
  247. }
  248. return base.DoWork();
  249. }
  250. public override async Task SyncChargeRequestFlagFromInterfaceAsync(ChargeRequestPlugInsInput input)
  251. {
  252. var chargeRequest = await GetChargeRequestAsync(input.ChargeRequestId);
  253. var payStatus = await GetPayStatus(chargeRequest.ChargeRequestNo, chargeRequest.HisChargeNo);
  254. //1:已支付,2.已作废3.已退费, 其他:未支付
  255. char charRequstFlag;
  256. if (payStatus == "1" && chargeRequest.ChargeRequestFlag != ChargeRequestFlag.RefundRequest)
  257. {
  258. charRequstFlag = ChargeRequestFlag.AlreadyCharge;
  259. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  260. }
  261. else if (payStatus == "2")
  262. {
  263. charRequstFlag = ChargeRequestFlag.AlreadyCancelCharge;
  264. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  265. }
  266. else if (payStatus == "3")
  267. {
  268. charRequstFlag = ChargeRequestFlag.AlreadyRefund;
  269. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  270. }
  271. else
  272. {
  273. //throw new Exception("查询支付状态不支持的收费标志" + result.MsgHeader.ErrCode);
  274. }
  275. }
  276. private async Task<string> GetPayStatus(string chargeRequestNo, string hisChargeNo)
  277. {
  278. var hisInput = new HisPayStatusInput()
  279. {
  280. Data = new HisPayStatusDataInput()
  281. {
  282. MsgHeader = new HisMsgHeaderInput()
  283. {
  284. Sender = "PEIS",
  285. MsgType = "SVR_ODS_6105",
  286. MsgVersion = "3.1",
  287. },
  288. Item = new HisPayStatusDataItemInput()
  289. {
  290. Yjxh = hisChargeNo,
  291. ExamRequestNo = chargeRequestNo,
  292. }
  293. }
  294. };
  295. var result = await PayStatus(hisInput);
  296. if (result.MsgHeader.Status != "true")
  297. {
  298. throw new Exception("查询支付状态失败" + result.MsgHeader.Detail);
  299. }
  300. //1:已支付,2.已作废3.已退费, 其他:未支付
  301. return result.MsgHeader.ErrCode;
  302. }
  303. public async Task<HisPatientQueryOut> PatientQuery(HisPatientQueryInput input)
  304. {
  305. using (var client = CreateClient())
  306. {
  307. input.SeviceBaseArg.Service = "patientQuery";
  308. var data = XmlHelper.SerializeToXml(input.Data);
  309. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  310. input.SeviceBaseArg.Urid,
  311. input.SeviceBaseArg.Pwd,
  312. data)).@return;
  313. var result = XmlHelper.DeserializeXml<HisPatientQueryOut>(resultStr);
  314. return result;
  315. }
  316. }
  317. public async Task<HisMecSaveOut> MecSave(HisMecSaveInput input)
  318. {
  319. using (var client = CreateClient())
  320. {
  321. input.SeviceBaseArg.Service = "mecSave";
  322. var data = XmlHelper.SerializeToXml(input.Data);
  323. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  324. input.SeviceBaseArg.Urid,
  325. input.SeviceBaseArg.Pwd,
  326. data)).@return;
  327. var result = XmlHelper.DeserializeXml<HisMecSaveOut>(resultStr);
  328. return result;
  329. }
  330. }
  331. public async Task<HisOutBase> CancelQrCode(HisCancelQrCodeInput input)
  332. {
  333. using (var client = CreateClient())
  334. {
  335. input.SeviceBaseArg.Service = "cancelQrCode";
  336. var data = XmlHelper.SerializeToXml(input.Data);
  337. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  338. input.SeviceBaseArg.Urid,
  339. input.SeviceBaseArg.Pwd,
  340. data)).@return;
  341. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  342. return result;
  343. }
  344. }
  345. public async Task<HisOutBase> PayStatus(HisPayStatusInput input)
  346. {
  347. using (var client = CreateClient())
  348. {
  349. input.SeviceBaseArg.Service = "payStatus";
  350. var data = XmlHelper.SerializeToXml(input.Data);
  351. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  352. input.SeviceBaseArg.Urid,
  353. input.SeviceBaseArg.Pwd,
  354. data)).@return;
  355. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  356. return result;
  357. }
  358. }
  359. public async Task<HisOutBase> AgreeRefund(HisAgreeRefundInput input)
  360. {
  361. using (var client = CreateClient())
  362. {
  363. input.SeviceBaseArg.Service = "agreeRefund";
  364. var data = XmlHelper.SerializeToXml(input.Data);
  365. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  366. input.SeviceBaseArg.Urid,
  367. input.SeviceBaseArg.Pwd,
  368. data)).@return;
  369. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  370. return result;
  371. }
  372. }
  373. private bstjPortTypeClient CreateClient()
  374. {
  375. return new bstjPortTypeClient(EndpointConfiguration.bstjHttpSoap11Endpoint,
  376. _endpointAddress);
  377. }
  378. private string ConverSex(char sexId)
  379. {
  380. switch (sexId)
  381. {
  382. case 'M':
  383. return "1";
  384. case 'F':
  385. return "2";
  386. case 'U':
  387. return "3";
  388. default:
  389. return "3";
  390. }
  391. }
  392. }
  393. }