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.

358 lines
14 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. 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. throw new Exception("作废申请单失败" + result.MsgHeader.Detail);
  153. }
  154. await SetAppChargeRequestFlagAsync(input.ChargeRequestId, ChargeRequestFlag.AlreadyCancelCharge);
  155. return new ChargeRequestPlugInsOut();
  156. }
  157. public override async Task DoWorkAsync()
  158. {
  159. throw new Exception("格尔木DoWorkAsync。。。");
  160. //return base.DoWorkAsync();
  161. }
  162. public override Task DoWork()
  163. {
  164. var queryDaysStr = InterfaceConfig.GetSection("Scheduler").GetSection("QueryDays").Value;
  165. if (string.IsNullOrWhiteSpace(queryDaysStr))
  166. {
  167. queryDaysStr = "1";
  168. }
  169. if(!int.TryParse(queryDaysStr,out int days))
  170. {
  171. days = 1;
  172. }
  173. var chargeRequests = GetRequests(days).Result;
  174. foreach (var chargeRequest in chargeRequests)
  175. {
  176. var hisInput = new HisPayStatusInput()
  177. {
  178. Data = new HisPayStatusDataInput()
  179. {
  180. MsgHeader = new HisMsgHeaderInput()
  181. {
  182. Sender = "PEIS",
  183. MsgType = "SVR_ODS_6105",
  184. MsgVersion = "3.1",
  185. },
  186. Item = new HisPayStatusDataItemInput()
  187. {
  188. Yjxh = chargeRequest.HisChargeNo,
  189. ExamRequestNo = chargeRequest.ChargeRequestNo,
  190. }
  191. }
  192. };
  193. var result = PayStatus(hisInput).Result;
  194. if (result.MsgHeader.Status != "true")
  195. {
  196. throw new Exception("查询支付状态失败" + result.MsgHeader.Detail);
  197. }
  198. //1:已支付,2.已作废3.已退费, 其他:未支付
  199. char charRequstFlag;
  200. if (result.MsgHeader.ErrCode == "1")
  201. {
  202. charRequstFlag = ChargeRequestFlag.AlreadyCharge;
  203. SetAppChargeRequestFlagAsync(chargeRequest.ChargeRequestId, charRequstFlag);
  204. }
  205. else if (result.MsgHeader.ErrCode == "2")
  206. {
  207. charRequstFlag = ChargeRequestFlag.AlreadyCancelCharge;
  208. SetAppChargeRequestFlagAsync(chargeRequest.ChargeRequestId, charRequstFlag);
  209. }
  210. else if (result.MsgHeader.ErrCode == "3")
  211. {
  212. charRequstFlag = ChargeRequestFlag.AlreadyRefund;
  213. SetAppChargeRequestFlagAsync(chargeRequest.ChargeRequestId, charRequstFlag);
  214. }
  215. else
  216. {
  217. throw new Exception("查询支付状态不支持的收费标志" + result.MsgHeader.ErrCode);
  218. }
  219. }
  220. return base.DoWork();
  221. }
  222. public override async Task<ChargeRequestPlugInsOut> RefundRequestAsync(ChargeRequestPlugInsInput input)
  223. {
  224. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  225. if (chargeRequestForPlugIns == null)
  226. {
  227. throw new Exception("没有申请单信息");
  228. }
  229. var hisInput = new HisAgreeRefundInput()
  230. {
  231. Data = new HisAgreeRefundDataInput()
  232. {
  233. MsgHeader = new HisMsgHeaderInput()
  234. {
  235. Sender = "PEIS",
  236. MsgType = "SVR_ODS_6105",
  237. MsgVersion = "3.1",
  238. },
  239. Item = new HisAgreeRefundDataItemInput()
  240. {
  241. Yjxh = chargeRequestForPlugIns.HisChargeNo,
  242. ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo
  243. }
  244. }
  245. };
  246. var result = await AgreeRefund(hisInput);
  247. if (result.MsgHeader.Status != "true")
  248. {
  249. throw new Exception("允许退费申请失败" + result.MsgHeader.Detail);
  250. }
  251. await SetAppChargeRequestFlagAsync(input.ChargeRequestId, ChargeRequestFlag.RefundRequest);
  252. return new ChargeRequestPlugInsOut();
  253. }
  254. public async Task<HisPatientQueryOut> PatientQuery(HisPatientQueryInput input)
  255. {
  256. using (var client = CreateClient())
  257. {
  258. input.SeviceBaseArg.Service = "patientQuery";
  259. var data = XmlHelper.SerializeToXml(input.Data);
  260. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  261. input.SeviceBaseArg.Urid,
  262. input.SeviceBaseArg.Pwd,
  263. data)).@return;
  264. var result = XmlHelper.DeserializeXml<HisPatientQueryOut>(resultStr);
  265. return result;
  266. }
  267. }
  268. public async Task<HisMecSaveOut> MecSave(HisMecSaveInput input)
  269. {
  270. using (var client = CreateClient())
  271. {
  272. input.SeviceBaseArg.Service = "mecSave";
  273. var data = XmlHelper.SerializeToXml(input.Data);
  274. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  275. input.SeviceBaseArg.Urid,
  276. input.SeviceBaseArg.Pwd,
  277. data)).@return;
  278. var result = XmlHelper.DeserializeXml<HisMecSaveOut>(resultStr);
  279. return result;
  280. }
  281. }
  282. public async Task<HisOutBase> CancelQrCode(HisCancelQrCodeInput input)
  283. {
  284. using (var client = CreateClient())
  285. {
  286. input.SeviceBaseArg.Service = "cancelQrCode";
  287. var data = XmlHelper.SerializeToXml(input.Data);
  288. var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service,
  289. input.SeviceBaseArg.Urid,
  290. input.SeviceBaseArg.Pwd,
  291. data)).@return;
  292. var result = XmlHelper.DeserializeXml<HisOutBase>(resultStr);
  293. return result;
  294. }
  295. }
  296. public async Task<HisOutBase> PayStatus(HisPayStatusInput input)
  297. {
  298. using (var client = CreateClient())
  299. {
  300. input.SeviceBaseArg.Service = "payStatus";
  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<HisOutBase>(resultStr);
  307. return result;
  308. }
  309. }
  310. public async Task<HisOutBase> AgreeRefund(HisAgreeRefundInput input)
  311. {
  312. using (var client = CreateClient())
  313. {
  314. input.SeviceBaseArg.Service = "agreeRefund";
  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<HisOutBase>(resultStr);
  321. return result;
  322. }
  323. }
  324. private bstjPortTypeClient CreateClient()
  325. {
  326. return new bstjPortTypeClient(EndpointConfiguration.bstjHttpSoap11Endpoint,
  327. _endpointAddress);
  328. }
  329. }
  330. }