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.

424 lines
16 KiB

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