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.

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