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.

981 lines
38 KiB

2 weeks ago
6 days ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
6 days ago
2 weeks ago
  1. using Dapper;
  2. using Microsoft.Extensions.Configuration;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using Npgsql;
  6. using ServiceReferenceHzcyHis;
  7. using ServiceReferenceYinHai;
  8. using Shentun.Peis.ChargeRequests;
  9. using Shentun.Peis.Enums;
  10. using Shentun.Peis.PlugIns.ChargeRequests;
  11. using Shentun.Peis.PlugIns.Extensions.ChargeRequests.Hzcy;
  12. using Shentun.Peis.PlugIns.Extensions.ChargeRequests.YinHai.FeeBacks;
  13. using Shentun.Peis.PlugIns.Extensions.ChargeRequests.YinHai.His;
  14. using Shentun.Peis.PlugIns.PatientRegisters;
  15. using Shentun.Peis.ThirdInterfaces;
  16. using Shentun.Utilities;
  17. using Spire.Pdf.Exporting.XPS.Schema;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Data.Common;
  21. using System.Linq;
  22. using System.ServiceModel;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using System.Xml;
  26. namespace Shentun.Peis.PlugIns.Extensions.ChargeRequests.YinHai
  27. {
  28. public class ChargeRequestPlugInsYinHai
  29. {
  30. protected IConfiguration? AppConfig;
  31. private readonly string AppConnctionStr;
  32. private readonly IConfiguration? InterfaceConfig;
  33. private readonly ThirdInterfaceDto? _thirdInterfaceDto;
  34. private readonly PluginLogger _logger; // 添加日志实例
  35. static ChargeRequestPlugInsYinHai()
  36. {
  37. Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
  38. }
  39. public ChargeRequestPlugInsYinHai(Guid thirdInterfaceId)
  40. {
  41. _logger = new PluginLogger();
  42. AppConfig = new ConfigurationBuilder()
  43. .SetBasePath(DirectoryHelper.GetAppDirectory()) // 设置基础路径为当前目录
  44. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  45. .Build();
  46. AppConnctionStr = AppConfig.GetSection("ConnectionStrings")
  47. .GetSection("Default").Value;
  48. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  49. {
  50. string sql;
  51. sql = @"
  52. SELECT *
  53. from third_interface
  54. where id =@ThirdInterfaceId
  55. ";
  56. _thirdInterfaceDto = (conn.Query<ThirdInterfaceDto>(sql,
  57. new { ThirdInterfaceId = thirdInterfaceId })).Single();
  58. }
  59. var configurationBuilder = new ConfigurationBuilder()
  60. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(_thirdInterfaceDto.ParmValue)));
  61. InterfaceConfig = configurationBuilder.Build();
  62. }
  63. public ChargeRequestPlugInsYinHai(string parmValue)
  64. {
  65. _logger = new PluginLogger();
  66. AppConfig = new ConfigurationBuilder()
  67. .SetBasePath(DirectoryHelper.GetAppDirectory()) // 设置基础路径为当前目录
  68. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  69. .Build();
  70. AppConnctionStr = AppConfig.GetSection("ConnectionStrings")
  71. .GetSection("Default").Value;
  72. var configurationBuilder = new ConfigurationBuilder()
  73. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  74. InterfaceConfig = configurationBuilder.Build();
  75. }
  76. /// <summary>
  77. /// 发送收费申请
  78. /// </summary>
  79. /// <param name="input"></param>
  80. /// <returns></returns>
  81. /// <exception cref="Exception"></exception>
  82. public async Task<ChargeRequestPlugInsOut> SendChargeRequestAsync(ChargeRequestPlugInsInput input)
  83. {
  84. _logger.Log("银海收费申请", $"收费申请Id:{input.ChargeRequestId}");
  85. try
  86. {
  87. //建立人员档案
  88. var patientRegisterForPlugIns = await GetPatientRegisterAsync(input.ChargeRequestId);
  89. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  90. if (chargeRequestForPlugIns == null)
  91. {
  92. throw new Exception("没有申请单信息");
  93. }
  94. if (!chargeRequestForPlugIns.Asbitems.Any())
  95. {
  96. throw new Exception("申请单没有组合项目信息");
  97. }
  98. if (patientRegisterForPlugIns.BirthDate == null)
  99. {
  100. throw new Exception("出生日期不能为空");
  101. }
  102. var endpointAddress = InterfaceConfig.GetValue("Interface:EndpointAddress", "");
  103. if (string.IsNullOrWhiteSpace(endpointAddress))
  104. {
  105. throw new Exception("接口地址不能为空");
  106. }
  107. string actionName = "fee_call";
  108. string codeName = "peis_server";
  109. using (var client = new WebServiceClient(new BasicHttpBinding(),
  110. new EndpointAddress(endpointAddress)))
  111. {
  112. //// 添加消息拦截器行为
  113. //var behavior = new SoapEndpointBehavior();
  114. //client.Endpoint.EndpointBehaviors.Add(behavior);
  115. var request = new HisFeeCallDto();
  116. #region head
  117. string requestId = new Random().Next(100000, 999999).ToString();
  118. string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
  119. request.Head = new HisFeeCallHeadDto
  120. {
  121. Action = actionName,
  122. Code = codeName,
  123. ObjectSystem = "his",
  124. RequestId = requestId,
  125. Sign = "",
  126. SourceSystem = "peis",
  127. Timestamp = timestamp,
  128. Version = "1"
  129. };
  130. string headString = $"version={request.Head.Version}&timestamp={request.Head.Timestamp}&request_id={request.Head.RequestId}&source_system={request.Head.SourceSystem}&object_system={request.Head.ObjectSystem}&action={request.Head.Action}";
  131. string sign = Convert.ToBase64String(Encoding.UTF8.GetBytes(headString));
  132. request.Head.Sign = sign;
  133. #endregion
  134. var orgCode = InterfaceConfig.GetValue("Interface:OrgCode", "");
  135. var orgName = InterfaceConfig.GetValue("Interface:OrgName", "");
  136. var systemSource = InterfaceConfig.GetValue("Interface:SystemSource", "");
  137. var billingDeptCode = InterfaceConfig.GetValue("Interface:BillingDeptCode", "");
  138. var billingDeptName = InterfaceConfig.GetValue("Interface:BillingDeptName", "");
  139. var commonTableTypeId = InterfaceConfig.GetValue("Interface:CommonTableTypeId", "");
  140. var execDoctorUser = InterfaceConfig.GetValue("Interface:ExecDoctorUser", "");
  141. var chargeUser = await GetUserInfo(patientRegisterForPlugIns.CreatorId);
  142. var dataDetails = new List<HisFeeCallBodyDataDetailDto>();
  143. var dataRequest = new HisFeeCallBodyDataRequestDto
  144. {
  145. OrgCode = orgCode,
  146. OrgName = orgName,
  147. SystemSource = systemSource,
  148. VisitId = patientRegisterForPlugIns.PatientRegisterNo,
  149. PatientId = patientRegisterForPlugIns.PatientNo,
  150. PatientName = patientRegisterForPlugIns.PatientName,
  151. GenderCode = ConvertSex(patientRegisterForPlugIns.SexId),
  152. Birthday = patientRegisterForPlugIns.BirthDate == null ? "" : patientRegisterForPlugIns.BirthDate.Value.ToString("yyyy-MM-dd"),
  153. CheckupType = "0",
  154. SumCost = "0",
  155. RealCost = chargeRequestForPlugIns.Asbitems.Sum(s => s.Charges).ToString(),
  156. BillingDeptCode = billingDeptCode,
  157. BillingDeptName = billingDeptName,
  158. BillingDocCode = chargeUser.UserName,
  159. BillingDocName = chargeUser.Surname,
  160. CheckoutId = chargeRequestForPlugIns.ChargeRequestNo,
  161. Address = "",
  162. CheckupTime = "",
  163. IdCard = patientRegisterForPlugIns.IdNo,
  164. ThisRegisterCount = "",
  165. TeamCheckupTime = "",
  166. Phone = "",
  167. TeamAppointmentNo = "",
  168. TeamCode = "",
  169. TeamName = ""
  170. };
  171. #region 对照关系
  172. var yinHaiHisCommonTableList = await GetCommonTableByTypeId(commonTableTypeId);
  173. #endregion
  174. decimal sumCost = 0M;
  175. foreach (var item in chargeRequestForPlugIns.Asbitems)
  176. {
  177. var dzList = yinHaiHisCommonTableList.Where(f => f.DisplayName == item.AsbitemId.ToString());
  178. if (!dzList.Any())
  179. {
  180. throw new Exception($"项目【{item.AsbitemName},Id:{item.AsbitemId}】没有对照");
  181. }
  182. foreach (var dzEnt in dzList)
  183. {
  184. dataDetails.Add(new HisFeeCallBodyDataDetailDto
  185. {
  186. VisitId = patientRegisterForPlugIns.PatientRegisterNo,
  187. DetailNo = patientRegisterForPlugIns.PatientRegisterNo + dzEnt.HisCode,
  188. CheckoutId = chargeRequestForPlugIns.ChargeRequestNo,
  189. OrgCode = orgCode,
  190. SystemSource = systemSource,
  191. FeeDetailNo = dzEnt.HisCode,
  192. FeeName = dzEnt.HisName,
  193. Price = dzEnt.HisPrice,
  194. Count = dzEnt.HisCount,
  195. DeptId = "",
  196. DeptName = "",
  197. PortfolioNo = "",
  198. RealPrice = item.Charges.ToString()
  199. });
  200. sumCost += (decimal.Parse(dzEnt.HisPrice) * Int32.Parse(dzEnt.HisCount));
  201. }
  202. }
  203. dataRequest.SumCost = sumCost.ToString();
  204. var requestBody = new HisFeeCallBodyDto
  205. {
  206. Data = new HisFeeCallBodyDataDto
  207. {
  208. Request = dataRequest,
  209. RequestDetails = new HisFeeCallBodyDataDetailsDto
  210. {
  211. Details = dataDetails
  212. }
  213. }
  214. };
  215. request.Body = requestBody;
  216. var requestXml = XmlHelper.SerializeToXmlEmpty(request);
  217. var resultP = await client.callBussinessAsync(requestXml);
  218. if (resultP.data.status_code == "1")
  219. {
  220. //成功 回写his_charge_no 就用体检本身的收费申请号,用于区分是否发送过申请
  221. await UpdateChargeRequestHisChargeNo(chargeRequestForPlugIns.ChargeRequestNo);
  222. }
  223. var returnValue = JsonConvert.SerializeObject(resultP.data, Newtonsoft.Json.Formatting.Indented);
  224. _logger.Log("银海收费申请", $"发送结果:{returnValue}");
  225. var yinHaiSendInterfaceLogDto = new YinHaiSendInterfaceLogDto
  226. {
  227. LogName = "发送收费申请",
  228. ExecDoctorUser = Guid.Parse(execDoctorUser),
  229. InterfaceName = $"{codeName}_{actionName}",
  230. ParaValue = requestXml,
  231. RequestNo = dataRequest.CheckoutId,
  232. ReturnParaValue = returnValue
  233. };
  234. await AddSendLog(yinHaiSendInterfaceLogDto);
  235. }
  236. }
  237. catch (Exception ex)
  238. {
  239. // Console.WriteLine(ex.Message);
  240. _logger.Log("银海收费申请", ex, $"发送收费申请异常");
  241. }
  242. return new ChargeRequestPlugInsOut();
  243. }
  244. /// <summary>
  245. /// 取消收费申请
  246. /// </summary>
  247. /// <param name="input"></param>
  248. /// <returns></returns>
  249. /// <exception cref="Exception"></exception>
  250. public async Task<ChargeRequestPlugInsOut> CancelChargeRequestAsync(ChargeRequestPlugInsInput input)
  251. {
  252. _logger.Log("银海取消收费申请", $"收费申请Id:{input.ChargeRequestId}");
  253. try
  254. {
  255. var patientRegisterForPlugIns = await GetPatientRegisterAsync(input.ChargeRequestId);
  256. var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId);
  257. if (chargeRequestForPlugIns == null)
  258. {
  259. throw new Exception("没有申请单信息");
  260. }
  261. var endpointAddress = InterfaceConfig.GetValue("Interface:EndpointAddress", "");
  262. if (string.IsNullOrWhiteSpace(endpointAddress))
  263. {
  264. throw new Exception("接口地址不能为空");
  265. }
  266. string actionName = "fee_delete";
  267. string codeName = "peis_server";
  268. using (var client = new WebServiceClient(new BasicHttpBinding(),
  269. new EndpointAddress(endpointAddress)))
  270. {
  271. var request = new HisFeeDeleteDto();
  272. #region head
  273. string requestId = new Random().Next(100000, 999999).ToString();
  274. string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
  275. request.Head = new HisFeeDeleteHeadDto
  276. {
  277. Action = actionName,
  278. Code = codeName,
  279. ObjectSystem = "his",
  280. RequestId = requestId,
  281. Sign = "",
  282. SourceSystem = "peis",
  283. Timestamp = timestamp,
  284. Version = "1"
  285. };
  286. string headString = $"version={request.Head.Version}&timestamp={request.Head.Timestamp}&request_id={request.Head.RequestId}&source_system={request.Head.SourceSystem}&object_system={request.Head.ObjectSystem}&action={request.Head.Action}";
  287. string sign = Convert.ToBase64String(Encoding.UTF8.GetBytes(headString));
  288. request.Head.Sign = sign;
  289. #endregion
  290. var orgCode = InterfaceConfig.GetValue("Interface:OrgCode", "");
  291. var systemSource = InterfaceConfig.GetValue("Interface:SystemSource", "");
  292. var execDoctorUser = InterfaceConfig.GetValue("Interface:ExecDoctorUser", "");
  293. var dataDetails = new List<HisFeeCallBodyDataDetailDto>();
  294. var dataRequest = new HisFeeDeleteBodyDataRequestDto
  295. {
  296. OrgCode = orgCode,
  297. SystemSource = systemSource,
  298. VisitId = patientRegisterForPlugIns.PatientRegisterNo,
  299. CheckoutId = chargeRequestForPlugIns.ChargeRequestNo
  300. };
  301. var requestBody = new HisFeeDeleteBodyDto
  302. {
  303. Data = new HisFeeDeleteBodyDataDto
  304. {
  305. Request = dataRequest
  306. }
  307. };
  308. request.Body = requestBody;
  309. var requestXml = XmlHelper.SerializeToXmlEmpty(request);
  310. var resultP = await client.callBussinessAsync(requestXml);
  311. var returnValue = JsonConvert.SerializeObject(resultP.data, Newtonsoft.Json.Formatting.Indented);
  312. _logger.Log("银海取消收费申请", $"发送结果:{returnValue}");
  313. var yinHaiSendInterfaceLogDto = new YinHaiSendInterfaceLogDto
  314. {
  315. LogName = "取消收费申请",
  316. ExecDoctorUser = Guid.Parse(execDoctorUser),
  317. InterfaceName = $"{codeName}_{actionName}",
  318. ParaValue = requestXml,
  319. RequestNo = dataRequest.CheckoutId,
  320. ReturnParaValue = returnValue
  321. };
  322. await AddSendLog(yinHaiSendInterfaceLogDto);
  323. }
  324. }
  325. catch (Exception ex)
  326. {
  327. //Console.WriteLine(ex.Message);
  328. _logger.Log("银海取消收费申请", ex, $"发送取消收费申请异常");
  329. }
  330. return new ChargeRequestPlugInsOut();
  331. }
  332. /// <summary>
  333. /// 接收收费状态结果
  334. /// </summary>
  335. /// <param name="input"></param>
  336. /// <returns></returns>
  337. /// <exception cref="Exception"></exception>
  338. public async Task<CallBussinessResponseDetailDto> SyncChargeRequestStatusAsync(InferfaceXmlDataDto input)
  339. {
  340. var res = new CallBussinessResponseDetailDto
  341. {
  342. msg = "失败",
  343. status_code = "-1"
  344. };
  345. //fee_flag 1.成功,0.失败,-1退费
  346. #region 解析xml
  347. var feeBackRequestData = GetFeeBackRequestData(input.message);
  348. #endregion
  349. _logger.LogResult("银海接收收费状态结果", $"收费申请Id:{input.message}");
  350. try
  351. {
  352. var execDoctorUser = InterfaceConfig.GetValue("Interface:ExecDoctorUser", "");
  353. string actionName = "fee_back";
  354. string codeName = "peis_server";
  355. var bodyData = feeBackRequestData.body.data.request;
  356. var chargeRequestNo = bodyData.checkout_id;
  357. var chargeRequestIdDto = await GetChargeRequestIdByChargeRequestNoAsync(chargeRequestNo);
  358. if (chargeRequestIdDto == null)
  359. {
  360. _logger.LogResult("银海接收收费状态结果", $"异常,收费申请单号【{chargeRequestNo}】");
  361. return res;
  362. }
  363. var chargeRequest = await GetChargeRequestAsync(chargeRequestIdDto.ChargeRequestId);
  364. switch (bodyData.fee_flag)
  365. {
  366. case "1":
  367. //收费
  368. await SetAppChargeRequestFlagAsync(chargeRequest, ChargeRequestFlag.AlreadyCharge);
  369. break;
  370. case "-1":
  371. //退费
  372. await SetAppChargeRequestFlagAsync(chargeRequest, ChargeRequestFlag.AlreadyRefund);
  373. break;
  374. }
  375. _logger.LogResult("银海接收收费状态结果", $"处理成功,收费申请单号【{chargeRequest.ChargeRequestNo}】");
  376. var yinHaiSendInterfaceLogDto = new YinHaiSendInterfaceLogDto
  377. {
  378. LogName = "接收收费状态结果",
  379. ExecDoctorUser = Guid.Parse(execDoctorUser),
  380. InterfaceName = $"{codeName}_{actionName}",
  381. ParaValue = input.message,
  382. RequestNo = bodyData.checkout_id,
  383. ReturnParaValue = ""
  384. };
  385. await AddSendLog(yinHaiSendInterfaceLogDto);
  386. res = new CallBussinessResponseDetailDto
  387. {
  388. status_code = "1",
  389. msg = "成功"
  390. };
  391. }
  392. catch (Exception ex)
  393. {
  394. _logger.LogResult("银海接收收费状态结果", ex, $"接收收费状态结果异常");
  395. }
  396. return res;
  397. }
  398. #region 任务计划
  399. /// <summary>
  400. /// 自动任务执行方法
  401. /// </summary>
  402. /// <returns></returns>
  403. public void DoWork()
  404. {
  405. _logger.Log("收费申请自动任务", $"收费申请自动任务开始执行,当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
  406. var queryDaysStr = InterfaceConfig.GetSection("Interface").GetSection("Scheduler").GetSection("QueryDays").Value;
  407. if (string.IsNullOrWhiteSpace(queryDaysStr))
  408. {
  409. queryDaysStr = "1";
  410. }
  411. if (!int.TryParse(queryDaysStr, out int days))
  412. {
  413. days = 1;
  414. }
  415. var chargeRequests = GetRequestsAsync(days).GetAwaiter().GetResult();
  416. _logger.Log("收费申请自动任务", $"获取到需要执行的数量:{chargeRequests.Count}");
  417. foreach (var chargeRequest in chargeRequests)
  418. {
  419. try
  420. {
  421. SendChargeRequestAsync(new ChargeRequestPlugInsInput { ChargeRequestId = chargeRequest.ChargeRequestId })
  422. .GetAwaiter().GetResult();
  423. }
  424. catch (Exception ex)
  425. {
  426. }
  427. }
  428. _logger.Log("收费申请自动任务", $"执行完成,当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
  429. }
  430. #endregion
  431. /// <summary>
  432. /// 获取任务需要发送申请的数据
  433. /// </summary>
  434. /// <param name="days"></param>
  435. /// <returns></returns>
  436. private async Task<List<ChargeRequestForPlugIns>> GetRequestsAsync(int days)
  437. {
  438. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  439. {
  440. string sql;
  441. var startDate = DateTime.Now.Date.AddDays(-days);
  442. sql = @"SELECT id as charge_request_id,
  443. charge_request_no,
  444. his_charge_no,
  445. charge_request_flag,
  446. concurrency_stamp
  447. FROM charge_request
  448. WHERE charge_request_flag = '0' and
  449. creation_time >@StartDate and coalesce(his_charge_no,'')=''
  450. ";
  451. var chargeRequestForPlugInss = (await conn.QueryAsync<ChargeRequestForPlugIns>(sql,
  452. new { StartDate = startDate })).ToList();
  453. return chargeRequestForPlugInss;
  454. }
  455. }
  456. /// <summary>
  457. /// 更新收费申请表的his_charge_no,标记用于是否发送
  458. /// </summary>
  459. /// <param name="UserId"></param>
  460. /// <returns></returns>
  461. private async Task UpdateChargeRequestHisChargeNo(string chargeRequestNo)
  462. {
  463. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  464. {
  465. string sql;
  466. sql = @"update charge_request set his_charge_no=charge_request_no
  467. WHERE charge_request_no =@chargeRequestNo
  468. ";
  469. await conn.ExecuteAsync(sql,
  470. new { chargeRequestNo = chargeRequestNo });
  471. }
  472. }
  473. /// <summary>
  474. /// 获取用户信息
  475. /// </summary>
  476. /// <param name="chargeRequestId"></param>
  477. /// <returns></returns>
  478. private async Task<PatientRegisterForPlugIns> GetPatientRegisterAsync(Guid chargeRequestId)
  479. {
  480. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  481. {
  482. string sql;
  483. sql = @"SELECT DISTINCT patient.id as patient_id,
  484. patient_register.id as patient_register_id,
  485. patient_register.patient_register_no,
  486. patient.patient_no ,
  487. patient_register.his_patient_id,
  488. patient_register.medical_center_id,
  489. patient_register.patient_name,
  490. patient_register.sex_id,
  491. patient_register.marital_status_id,
  492. patient_register.birth_date,
  493. patient_register.age,
  494. patient_register.creator_id,
  495. patient.nation_id,
  496. patient.id_no,
  497. patient.email,
  498. patient.telephone,
  499. patient.mobile_telephone,
  500. patient.address
  501. from patient,patient_register,charge_request
  502. where patient.id = patient_register.patient_id and
  503. patient_register.id = charge_request.patient_register_id and
  504. charge_request.id =@ChargeRequestId
  505. ";
  506. var patientRegisterForPlugIns = (await conn.QueryAsync<PatientRegisterForPlugIns>(sql,
  507. new { ChargeRequestId = chargeRequestId })).SingleOrDefault();
  508. return patientRegisterForPlugIns;
  509. }
  510. }
  511. /// <summary>
  512. /// 获取收费申请id 根据收费申请单号
  513. /// </summary>
  514. /// <param name="chargeRequestNo"></param>
  515. /// <returns></returns>
  516. private async Task<ChargeRequestIdInputDto> GetChargeRequestIdByChargeRequestNoAsync(string chargeRequestNo)
  517. {
  518. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  519. {
  520. string sql;
  521. sql = @"SELECT id as chargeRequestId from charge_request
  522. where charge_request_no = @ChargeRequestNo
  523. ";
  524. var chargeRequestIdInputDto = (await conn.QueryAsync<ChargeRequestIdInputDto>(sql,
  525. new { ChargeRequestNo = chargeRequestNo })).SingleOrDefault();
  526. return chargeRequestIdInputDto;
  527. }
  528. }
  529. /// <summary>
  530. /// 获取申请单信息
  531. /// </summary>
  532. /// <param name="chargeRequestId"></param>
  533. /// <returns></returns>
  534. private async Task<ChargeRequestForPlugIns> GetChargeRequestAsync(Guid chargeRequestId)
  535. {
  536. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  537. {
  538. string sql;
  539. sql = @"SELECT id as charge_request_id,
  540. charge_request_no,
  541. his_charge_no,
  542. charge_request_flag,
  543. concurrency_stamp
  544. FROM charge_request
  545. WHERE id =@ChargeRequestId
  546. ";
  547. var chargeRequestForPlugIns = (await conn.QueryAsync<ChargeRequestForPlugIns>(sql,
  548. new { ChargeRequestId = chargeRequestId })).SingleOrDefault();
  549. if (chargeRequestForPlugIns == null)
  550. {
  551. return null;
  552. }
  553. sql = @"
  554. SELECT register_check_asbitem.asbitem_id,
  555. asbitem.display_name as asbitem_name,
  556. register_check_asbitem.amount * register_check_asbitem.charge_price as charges,
  557. register_check_asbitem.concurrency_stamp
  558. from register_check
  559. JOIN register_check_asbitem on register_check.id = register_check_asbitem.register_check_id
  560. JOIN charge_request on register_check_asbitem.charge_request_id = charge_request.id
  561. JOIN asbitem on register_check_asbitem.asbitem_id = asbitem.id
  562. where
  563. charge_request.id=@ChargeRequestId
  564. ";
  565. chargeRequestForPlugIns.Asbitems = (await conn.QueryAsync<ChargeRequestAsbitemForPlugIns>(sql,
  566. new { ChargeRequestId = chargeRequestId })).ToList();
  567. return chargeRequestForPlugIns;
  568. }
  569. }
  570. /// <summary>
  571. /// 获取收费用户
  572. /// </summary>
  573. /// <param name="UserId"></param>
  574. /// <returns></returns>
  575. private async Task<ChargeUserDto> GetUserInfo(Guid UserId)
  576. {
  577. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  578. {
  579. string sql;
  580. sql = @"select user_name,surname from abp_users
  581. WHERE id =@UserId
  582. ";
  583. var chargeUser = (await conn.QueryAsync<ChargeUserDto>(sql,
  584. new { UserId = UserId })).SingleOrDefault();
  585. if (chargeUser == null)
  586. {
  587. return null;
  588. }
  589. return chargeUser;
  590. }
  591. }
  592. /// <summary>
  593. /// 获取对照数据
  594. /// </summary>
  595. /// <param name="commonTableTypeId"></param>
  596. /// <returns></returns>
  597. private async Task<List<YinHaiHisCommonTableDto>> GetCommonTableByTypeId(string commonTableTypeId)
  598. {
  599. var hisCode = InterfaceConfig.GetValue("Interface:HisCode", "");
  600. var hisName = InterfaceConfig.GetValue("Interface:HisName", "");
  601. var hisPrice = InterfaceConfig.GetValue("Interface:HisPrice", "");
  602. var hisCount = InterfaceConfig.GetValue("Interface:HisCount", "");
  603. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  604. {
  605. string sql;
  606. sql = $@"select display_name,{hisCode} as hisCode,{hisName} as hisName,{hisPrice} as hisPrice,{hisCount} as hisCount from common_table where common_table_type_id='{commonTableTypeId}' ";
  607. var yinHaiHisCommonTableList = (await conn.QueryAsync<YinHaiHisCommonTableDto>(sql)).ToList();
  608. return yinHaiHisCommonTableList;
  609. }
  610. }
  611. /// <summary>
  612. /// 添加日志
  613. /// </summary>
  614. /// <param name="input"></param>
  615. /// <returns></returns>
  616. private async Task AddSendLog(YinHaiSendInterfaceLogDto input)
  617. {
  618. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  619. {
  620. string sql;
  621. sql = $@" insert into interface_send_log (id,log_name,request_no,interface_name,para_value,return_para_value,concurrency_stamp,
  622. creation_time,creator_id,last_modification_time,last_modifier_id) values
  623. (@id,@log_name,@request_no,@interface_name,@para_value,@return_para_value,@concurrency_stamp,
  624. @creation_time,@creator_id,@last_modification_time,@last_modifier_id)
  625. ";
  626. await conn.ExecuteAsync(sql,
  627. new
  628. {
  629. id = Guid.NewGuid(),
  630. log_name = input.LogName,
  631. request_no = input.RequestNo,
  632. interface_name = input.InterfaceName,
  633. para_value = input.ParaValue,
  634. return_para_value = input.ReturnParaValue,
  635. concurrency_stamp = Guid.NewGuid().ToString("N"),
  636. creation_time = DateTime.Now,
  637. creator_id = input.ExecDoctorUser,
  638. last_modification_time = DateTime.Now,
  639. last_modifier_id = input.ExecDoctorUser
  640. });
  641. }
  642. }
  643. /// <summary>
  644. /// 收费 退费 动作
  645. /// </summary>
  646. /// <param name="chargeRequestForPlugIns"></param>
  647. /// <param name="chargeRequestFlag"></param>
  648. /// <returns></returns>
  649. private async Task SetAppChargeRequestFlagAsync(ChargeRequestForPlugIns chargeRequestForPlugIns,
  650. char chargeRequestFlag)
  651. {
  652. using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
  653. {
  654. await conn.OpenAsync();
  655. using (var trans = await conn.BeginTransactionAsync())
  656. {
  657. try
  658. {
  659. string sql;
  660. sql = @" update charge_request set charge_request_flag =" + chargeRequestFlag +
  661. @" where id = @ChargeRequestId and concurrency_stamp = @ConcurrencyStamp
  662. ";
  663. await conn.ExecuteAsync(sql,
  664. new
  665. {
  666. chargeRequestForPlugIns.ChargeRequestId,
  667. chargeRequestForPlugIns.ConcurrencyStamp
  668. }, trans);
  669. foreach (var chargeRequestAsbitem in chargeRequestForPlugIns.Asbitems)
  670. {
  671. if (chargeRequestFlag == ChargeRequestFlag.AlreadyCharge)
  672. {
  673. sql = @" update register_check_asbitem set is_charge = 'Y',pay_type_flag='0'
  674. where charge_request_id = @ChargeRequestId and concurrency_stamp = @ConcurrencyStamp
  675. ";
  676. await conn.ExecuteAsync(sql,
  677. new
  678. {
  679. chargeRequestForPlugIns.ChargeRequestId,
  680. chargeRequestAsbitem.ConcurrencyStamp
  681. }, trans);
  682. }
  683. else if (chargeRequestFlag == ChargeRequestFlag.AlreadyRefund)
  684. {
  685. sql = @" update register_check_asbitem set is_charge = 'N'
  686. where charge_request_id = @ChargeRequestId and concurrency_stamp = @ConcurrencyStamp
  687. ";
  688. await conn.ExecuteAsync(sql,
  689. new
  690. {
  691. chargeRequestForPlugIns.ChargeRequestId,
  692. chargeRequestAsbitem.ConcurrencyStamp
  693. }, trans);
  694. }
  695. }
  696. await trans.CommitAsync();
  697. }
  698. catch (Exception ex)
  699. {
  700. await trans.RollbackAsync();
  701. throw ex;
  702. }
  703. }
  704. }
  705. }
  706. /// <summary>
  707. /// 转换性别
  708. /// </summary>
  709. /// <param name="sexId"></param>
  710. /// <returns></returns>
  711. private string ConvertSex(char sexId)
  712. {
  713. string msg = "";
  714. switch (sexId)
  715. {
  716. case 'M':
  717. msg = "1";
  718. break;
  719. case 'F':
  720. msg = "2";
  721. break;
  722. case 'U':
  723. msg = "0";
  724. break;
  725. default:
  726. msg = "9";
  727. break;
  728. }
  729. return msg;
  730. }
  731. #region 解析xml
  732. private FeeBackRequest GetFeeBackRequestData(string message)
  733. {
  734. try
  735. {
  736. message = message.TrimStart(); // 去除开头的空白字符
  737. var doc = new XmlDocument();
  738. doc.LoadXml(message);
  739. var request = new FeeBackRequest();
  740. var root = doc.DocumentElement;
  741. if (root == null) return null;
  742. // 解析 head
  743. var headNode = root.SelectSingleNode("head");
  744. if (headNode != null)
  745. {
  746. request.head = new CallBussinessRequestHeadDto
  747. {
  748. version = GetNodeValue(headNode, "version"),
  749. timestamp = GetNodeValue(headNode, "timestamp"),
  750. sign = GetNodeValue(headNode, "sign"),
  751. request_id = GetNodeValue(headNode, "request_id"),
  752. source_system = GetNodeValue(headNode, "source_system"),
  753. object_system = GetNodeValue(headNode, "object_system"),
  754. action = GetNodeValue(headNode, "action"),
  755. code = GetNodeValue(headNode, "code")
  756. };
  757. }
  758. // 解析 body
  759. var bodyNode = root.SelectSingleNode("body");
  760. if (bodyNode != null)
  761. {
  762. //按方法
  763. request.body = new FeeBackRequestBody();
  764. var dataNode = bodyNode.SelectSingleNode("data");
  765. if (dataNode != null)
  766. {
  767. request.body.data = new FeeBackRequestData();
  768. var requestNode = dataNode.SelectSingleNode("request");
  769. if (requestNode != null)
  770. {
  771. request.body.data.request = new FeeBackRequestDetail
  772. {
  773. visit_id = GetNodeValue(requestNode, "visit_id"),
  774. checkout_id = GetNodeValue(requestNode, "checkout_id"),
  775. org_code = GetNodeValue(requestNode, "org_code"),
  776. hos_id = GetNodeValue(requestNode, "hos_id"),
  777. system_source = GetNodeValue(requestNode, "system_source"),
  778. fee_flag = GetNodeValue(requestNode, "fee_flag"),
  779. invoice_no = GetNodeValue(requestNode, "invoice_no"),
  780. collr_collector_code = GetNodeValue(requestNode, "collr_collector_code"),
  781. collr_collector_name = GetNodeValue(requestNode, "collr_collector_name"),
  782. collr_collector_date = GetNodeValue(requestNode, "collr_collector_date")
  783. };
  784. }
  785. }
  786. }
  787. return request;
  788. }
  789. catch (Exception ex)
  790. {
  791. //_logger.LogError(ex, "解析 XML 失败");
  792. return null;
  793. }
  794. }
  795. private string GetNodeValue(XmlNode parent, string nodeName)
  796. {
  797. var node = parent.SelectSingleNode(nodeName);
  798. return node?.InnerText ?? "";
  799. }
  800. #endregion
  801. }
  802. }