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.

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