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.

427 lines
16 KiB

2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year 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 year ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year 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. public override Task DoWork()
  222. {
  223. var queryDaysStr = InterfaceConfig.GetSection("Interface").GetSection("Scheduler").GetSection("QueryDays").Value;
  224. if (string.IsNullOrWhiteSpace(queryDaysStr))
  225. {
  226. queryDaysStr = "1";
  227. }
  228. if (!int.TryParse(queryDaysStr, out int days))
  229. {
  230. days = 1;
  231. }
  232. var chargeRequests = GetRequestsAsync(days).Result;
  233. foreach (var chargeRequest in chargeRequests)
  234. {
  235. try
  236. {
  237. SyncChargeRequestFlagFromInterfaceAsync(chargeRequest.ChargeRequestId)
  238. .GetAwaiter().GetResult();
  239. }
  240. catch (Exception ex)
  241. {
  242. }
  243. }
  244. return base.DoWork();
  245. }
  246. public override async Task SyncChargeRequestFlagFromInterfaceAsync(Guid chargeRequestId)
  247. {
  248. var chargeRequest = await GetChargeRequestAsync(chargeRequestId);
  249. var payStatus = await GetPayStatus(chargeRequest.ChargeRequestNo, chargeRequest.HisChargeNo);
  250. //1:已支付,2.已作废3.已退费, 其他:未支付
  251. char charRequstFlag;
  252. if (payStatus == "1" && chargeRequest.ChargeRequestFlag != ChargeRequestFlag.RefundRequest)
  253. {
  254. charRequstFlag = ChargeRequestFlag.AlreadyCharge;
  255. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  256. }
  257. else if (payStatus == "2")
  258. {
  259. charRequstFlag = ChargeRequestFlag.AlreadyCancelCharge;
  260. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  261. }
  262. else if (payStatus == "3")
  263. {
  264. charRequstFlag = ChargeRequestFlag.AlreadyRefund;
  265. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  266. }
  267. else
  268. {
  269. //throw new Exception("查询支付状态不支持的收费标志" + result.MsgHeader.ErrCode);
  270. }
  271. }
  272. private async Task<string> GetPayStatus(string chargeRequestNo, string hisChargeNo)
  273. {
  274. var hisInput = new HisPayStatusInput()
  275. {
  276. Data = new HisPayStatusDataInput()
  277. {
  278. MsgHeader = new HisMsgHeaderInput()
  279. {
  280. Sender = "PEIS",
  281. MsgType = "SVR_ODS_6105",
  282. MsgVersion = "3.1",
  283. },
  284. Item = new HisPayStatusDataItemInput()
  285. {
  286. Yjxh = hisChargeNo,
  287. ExamRequestNo = chargeRequestNo,
  288. }
  289. }
  290. };
  291. var result = await PayStatus(hisInput);
  292. if (result.MsgHeader.Status != "true")
  293. {
  294. throw new Exception("查询支付状态失败" + result.MsgHeader.Detail);
  295. }
  296. //1:已支付,2.已作废3.已退费, 其他:未支付
  297. return result.MsgHeader.ErrCode;
  298. }
  299. public async Task<HisPatientQueryOut> PatientQuery(HisPatientQueryInput input)
  300. {
  301. using (var client = CreateClient())
  302. {
  303. input.SeviceBaseArg.Service = "patientQuery";
  304. var data = XmlHelper.SerializeToXml(input.Data);
  305. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  306. input.SeviceBaseArg.Urid,
  307. input.SeviceBaseArg.Pwd,
  308. data)).@return;
  309. var result = XmlHelper.DeserializeXml<HisPatientQueryOut>(resultStr);
  310. return result;
  311. }
  312. }
  313. public async Task<HisMecSaveOut> MecSave(HisMecSaveInput input)
  314. {
  315. using (var client = CreateClient())
  316. {
  317. input.SeviceBaseArg.Service = "mecSave";
  318. var data = XmlHelper.SerializeToXml(input.Data);
  319. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  320. input.SeviceBaseArg.Urid,
  321. input.SeviceBaseArg.Pwd,
  322. data)).@return;
  323. var result = XmlHelper.DeserializeXml<HisMecSaveOut>(resultStr);
  324. return result;
  325. }
  326. }
  327. public async Task<HisOutBase> CancelQrCode(HisCancelQrCodeInput input)
  328. {
  329. using (var client = CreateClient())
  330. {
  331. input.SeviceBaseArg.Service = "cancelQrCode";
  332. var data = XmlHelper.SerializeToXml(input.Data);
  333. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  334. input.SeviceBaseArg.Urid,
  335. input.SeviceBaseArg.Pwd,
  336. data)).@return;
  337. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  338. return result;
  339. }
  340. }
  341. public async Task<HisOutBase> PayStatus(HisPayStatusInput input)
  342. {
  343. using (var client = CreateClient())
  344. {
  345. input.SeviceBaseArg.Service = "payStatus";
  346. var data = XmlHelper.SerializeToXml(input.Data);
  347. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  348. input.SeviceBaseArg.Urid,
  349. input.SeviceBaseArg.Pwd,
  350. data)).@return;
  351. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  352. return result;
  353. }
  354. }
  355. public async Task<HisOutBase> AgreeRefund(HisAgreeRefundInput input)
  356. {
  357. using (var client = CreateClient())
  358. {
  359. input.SeviceBaseArg.Service = "agreeRefund";
  360. var data = XmlHelper.SerializeToXml(input.Data);
  361. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  362. input.SeviceBaseArg.Urid,
  363. input.SeviceBaseArg.Pwd,
  364. data)).@return;
  365. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  366. return result;
  367. }
  368. }
  369. private bstjPortTypeClient CreateClient()
  370. {
  371. return new bstjPortTypeClient(EndpointConfiguration.bstjHttpSoap11Endpoint,
  372. _endpointAddress);
  373. }
  374. private string ConverSex(char sexId)
  375. {
  376. switch (sexId)
  377. {
  378. case 'M':
  379. return "1";
  380. case 'F':
  381. return "2";
  382. case 'U':
  383. return "3";
  384. default:
  385. return "3";
  386. }
  387. }
  388. }
  389. }