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.

425 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
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 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
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
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.Gem
  16. {
  17. public class ChargeRequestPlugInsGem : ChargeRequestPlugInsBase
  18. {
  19. private string _endpointAddress = "";
  20. public ChargeRequestPlugInsGem(Guid thirdInterfaceId) : base(thirdInterfaceId)
  21. {
  22. _endpointAddress = InterfaceConfig.GetSection("Interface").GetSection("EndpointAddress").Value;
  23. }
  24. public ChargeRequestPlugInsGem(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 { HisPatientId = result.Patient.PatientId,
  80. PatientRegisterId = patientRegisterForPlugIns.PatientRegisterId
  81. });
  82. }
  83. //发送项目
  84. var hisInput = new HisMecSaveInput()
  85. {
  86. Data = new HisMecSaveDataInput()
  87. {
  88. MsgHeader = new HisMsgHeaderInput()
  89. {
  90. Sender = "PEIS",
  91. MsgType = "SVR_ODS_6101",
  92. MsgVersion = "3.1",
  93. },
  94. Items = new List<HisMecSaveDataItemInput>()
  95. {
  96. new HisMecSaveDataItemInput()
  97. {
  98. ExamRequestNo =chargeRequestForPlugIns.ChargeRequestNo,
  99. FeeType = "1",
  100. EmpId = result.Patient.PatientId,
  101. DeptId = "",
  102. DoctId = "",
  103. ExeDeptId = "",
  104. Tjunit = patientRegisterForPlugIns.CustomerOrgName,
  105. Tjfee = chargeRequestForPlugIns.Asbitems.Sum(o=>o.Charges).ToString(),
  106. Ztxm = "",
  107. Remark = "体检科"
  108. },
  109. }
  110. }
  111. };
  112. var mecSaveResult = await MecSave(hisInput);
  113. if (mecSaveResult.MsgHeader.Status != "true")
  114. {
  115. throw new Exception("建立HIS档案失败" + mecSaveResult.MsgHeader.Detail);
  116. }
  117. //更新申请单信息
  118. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  119. {
  120. conn.Execute(@"update charge_request set his_charge_no = @HisChargeNo
  121. where id = @ChargeRequestId",
  122. new
  123. {
  124. HisChargeNo = mecSaveResult.MsgHeader.Yjxh,
  125. ChargeRequestId = input.ChargeRequestId
  126. });
  127. }
  128. return new ChargeRequestPlugInsOut();
  129. }
  130. public override async Task<ChargeRequestPlugInsOut> CancelChargeRequestAsync(ChargeRequestPlugInsInput input)
  131. {
  132. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  133. if (chargeRequestForPlugIns == null)
  134. {
  135. throw new Exception("没有申请单信息");
  136. }
  137. var hisInput = new HisCancelQrCodeInput()
  138. {
  139. Data = new HisCancelQrCodeDataInput()
  140. {
  141. MsgHeader = new HisMsgHeaderInput()
  142. {
  143. Sender = "PEIS",
  144. MsgType = "SVR_ODS_6105",
  145. MsgVersion = "3.1",
  146. },
  147. Item = new HisCancelQrCodeDataItemInput()
  148. {
  149. Yjxh = chargeRequestForPlugIns.HisChargeNo,
  150. ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo
  151. }
  152. }
  153. };
  154. var result = await CancelQrCode(hisInput);
  155. if (result.MsgHeader.Status != "true")
  156. {
  157. //-1 申请单未找到
  158. if(!(result.MsgHeader.Detail.Contains("未查到开单信息")))
  159. {
  160. var payStatus = await GetPayStatus(chargeRequestForPlugIns.ChargeRequestNo, chargeRequestForPlugIns.HisChargeNo);
  161. if (payStatus == "1")
  162. {
  163. throw new Exception("his已缴费");
  164. }
  165. else if (payStatus == "2")
  166. {
  167. throw new Exception("his已作废");
  168. }
  169. else if (payStatus == "3")
  170. {
  171. throw new Exception("his已退费");
  172. }
  173. }
  174. }
  175. await SetAppChargeRequestFlagAsync(chargeRequestForPlugIns, ChargeRequestFlag.AlreadyCancelCharge);
  176. return new ChargeRequestPlugInsOut();
  177. }
  178. public override async Task DoWorkAsync()
  179. {
  180. throw new Exception("格尔木DoWorkAsync。。。");
  181. //return base.DoWorkAsync();
  182. }
  183. public override async Task<ChargeRequestPlugInsOut> RefundRequestAsync(ChargeRequestPlugInsInput input)
  184. {
  185. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  186. if (chargeRequestForPlugIns == null)
  187. {
  188. throw new Exception("没有申请单信息");
  189. }
  190. var hisInput = new HisAgreeRefundInput()
  191. {
  192. Data = new HisAgreeRefundDataInput()
  193. {
  194. MsgHeader = new HisMsgHeaderInput()
  195. {
  196. Sender = "PEIS",
  197. MsgType = "SVR_ODS_6105",
  198. MsgVersion = "3.1",
  199. },
  200. Item = new HisAgreeRefundDataItemInput()
  201. {
  202. Yjxh = chargeRequestForPlugIns.HisChargeNo,
  203. ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo
  204. }
  205. }
  206. };
  207. var result = await AgreeRefund(hisInput);
  208. if (result.MsgHeader.Status != "true")
  209. {
  210. var payStatus = await GetPayStatus(chargeRequestForPlugIns.ChargeRequestNo, chargeRequestForPlugIns.HisChargeNo);
  211. if (payStatus != "3")
  212. {
  213. throw new Exception("允许退费申请失败" + result.MsgHeader.Detail);
  214. }
  215. }
  216. await SetAppChargeRequestFlagAsync(chargeRequestForPlugIns, ChargeRequestFlag.RefundRequest);
  217. return new ChargeRequestPlugInsOut();
  218. }
  219. public override Task DoWork()
  220. {
  221. var queryDaysStr = InterfaceConfig.GetSection("Scheduler").GetSection("QueryDays").Value;
  222. if (string.IsNullOrWhiteSpace(queryDaysStr))
  223. {
  224. queryDaysStr = "1";
  225. }
  226. if(!int.TryParse(queryDaysStr,out int days))
  227. {
  228. days = 1;
  229. }
  230. var chargeRequests = GetRequests(days).Result;
  231. foreach (var chargeRequest in chargeRequests)
  232. {
  233. try
  234. {
  235. SyncChargeRequestFlagFromInterfaceAsync(chargeRequest.ChargeRequestId)
  236. .GetAwaiter().GetResult();
  237. }
  238. catch(Exception ex)
  239. {
  240. }
  241. }
  242. return base.DoWork();
  243. }
  244. public override async Task SyncChargeRequestFlagFromInterfaceAsync(Guid chargeRequestId)
  245. {
  246. var chargeRequest = await GetChargeRequestAsync(chargeRequestId);
  247. var payStatus = await GetPayStatus(chargeRequest.ChargeRequestNo, chargeRequest.HisChargeNo);
  248. //1:已支付,2.已作废3.已退费, 其他:未支付
  249. char charRequstFlag;
  250. if (payStatus == "1" && chargeRequest.ChargeRequestFlag != ChargeRequestFlag.RefundRequest)
  251. {
  252. charRequstFlag = ChargeRequestFlag.AlreadyCharge;
  253. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  254. }
  255. else if (payStatus == "2")
  256. {
  257. charRequstFlag = ChargeRequestFlag.AlreadyCancelCharge;
  258. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  259. }
  260. else if (payStatus == "3")
  261. {
  262. charRequstFlag = ChargeRequestFlag.AlreadyRefund;
  263. await SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
  264. }
  265. else
  266. {
  267. //throw new Exception("查询支付状态不支持的收费标志" + result.MsgHeader.ErrCode);
  268. }
  269. }
  270. private async Task<string> GetPayStatus(string chargeRequestNo, string hisChargeNo)
  271. {
  272. var hisInput = new HisPayStatusInput()
  273. {
  274. Data = new HisPayStatusDataInput()
  275. {
  276. MsgHeader = new HisMsgHeaderInput()
  277. {
  278. Sender = "PEIS",
  279. MsgType = "SVR_ODS_6105",
  280. MsgVersion = "3.1",
  281. },
  282. Item = new HisPayStatusDataItemInput()
  283. {
  284. Yjxh = hisChargeNo,
  285. ExamRequestNo = chargeRequestNo,
  286. }
  287. }
  288. };
  289. var result = await PayStatus(hisInput);
  290. if (result.MsgHeader.Status != "true")
  291. {
  292. throw new Exception("查询支付状态失败" + result.MsgHeader.Detail);
  293. }
  294. //1:已支付,2.已作废3.已退费, 其他:未支付
  295. return result.MsgHeader.ErrCode;
  296. }
  297. public async Task<HisPatientQueryOut> PatientQuery(HisPatientQueryInput input)
  298. {
  299. using (var client = CreateClient())
  300. {
  301. input.SeviceBaseArg.Service = "patientQuery";
  302. var data = XmlHelper.SerializeToXml(input.Data);
  303. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  304. input.SeviceBaseArg.Urid,
  305. input.SeviceBaseArg.Pwd,
  306. data)).@return;
  307. var result = XmlHelper.DeserializeXml<HisPatientQueryOut>(resultStr);
  308. return result;
  309. }
  310. }
  311. public async Task<HisMecSaveOut> MecSave(HisMecSaveInput input)
  312. {
  313. using (var client = CreateClient())
  314. {
  315. input.SeviceBaseArg.Service = "mecSave";
  316. var data = XmlHelper.SerializeToXml(input.Data);
  317. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  318. input.SeviceBaseArg.Urid,
  319. input.SeviceBaseArg.Pwd,
  320. data)).@return;
  321. var result = XmlHelper.DeserializeXml<HisMecSaveOut>(resultStr);
  322. return result;
  323. }
  324. }
  325. public async Task<HisOutBase> CancelQrCode(HisCancelQrCodeInput input)
  326. {
  327. using (var client = CreateClient())
  328. {
  329. input.SeviceBaseArg.Service = "cancelQrCode";
  330. var data = XmlHelper.SerializeToXml(input.Data);
  331. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  332. input.SeviceBaseArg.Urid,
  333. input.SeviceBaseArg.Pwd,
  334. data)).@return;
  335. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  336. return result;
  337. }
  338. }
  339. public async Task<HisOutBase> PayStatus(HisPayStatusInput input)
  340. {
  341. using (var client = CreateClient())
  342. {
  343. input.SeviceBaseArg.Service = "payStatus";
  344. var data = XmlHelper.SerializeToXml(input.Data);
  345. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  346. input.SeviceBaseArg.Urid,
  347. input.SeviceBaseArg.Pwd,
  348. data)).@return;
  349. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  350. return result;
  351. }
  352. }
  353. public async Task<HisOutBase> AgreeRefund(HisAgreeRefundInput input)
  354. {
  355. using (var client = CreateClient())
  356. {
  357. input.SeviceBaseArg.Service = "agreeRefund";
  358. var data = XmlHelper.SerializeToXml(input.Data);
  359. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  360. input.SeviceBaseArg.Urid,
  361. input.SeviceBaseArg.Pwd,
  362. data)).@return;
  363. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  364. return result;
  365. }
  366. }
  367. private bstjPortTypeClient CreateClient()
  368. {
  369. return new bstjPortTypeClient(EndpointConfiguration.bstjHttpSoap11Endpoint,
  370. _endpointAddress);
  371. }
  372. private string ConverSex(char sexId)
  373. {
  374. switch (sexId)
  375. {
  376. case 'M':
  377. return "1";
  378. case 'F':
  379. return "2";
  380. case 'U':
  381. return "3";
  382. default:
  383. return "3";
  384. }
  385. }
  386. }
  387. }