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.

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