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.

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