QueRenYiZhuShouFeiServer.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package thyyxxk.webserver.service.zhuyuanyiji;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.stereotype.Service;
  8. import org.springframework.transaction.annotation.Transactional;
  9. import thyyxxk.webserver.config.exception.ExceptionEnum;
  10. import thyyxxk.webserver.constants.GetDateFormat;
  11. import thyyxxk.webserver.dao.his.zhuyuanyiji.QueRenYiZhuShouFeiDao;
  12. import thyyxxk.webserver.entity.ResultVo;
  13. import thyyxxk.webserver.entity.datamodify.YzActOrder;
  14. import thyyxxk.webserver.entity.yibao.patient.Patient;
  15. import thyyxxk.webserver.service.PublicServer;
  16. import thyyxxk.webserver.service.yibao.PatientService;
  17. import thyyxxk.webserver.utils.*;
  18. import thyyxxk.webserver.websocket.WebSocketServer;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.function.Function;
  23. import java.util.stream.Collectors;
  24. /**
  25. * <p>
  26. * 描述: 确认医嘱收费
  27. * </p>
  28. *
  29. * @author xc
  30. * @date 2021-09-27 11:50
  31. */
  32. @Service
  33. @Slf4j
  34. public class QueRenYiZhuShouFeiServer {
  35. private final QueRenYiZhuShouFeiDao dao;
  36. private final PublicServer publicServer;
  37. private final PatientService patientService;
  38. public QueRenYiZhuShouFeiServer(QueRenYiZhuShouFeiDao dao, PublicServer server, PatientService patientService) {
  39. this.dao = dao;
  40. this.publicServer = server;
  41. this.patientService = patientService;
  42. }
  43. /**
  44. * @param yzActOrder 查询条件 住院号,住院次数,执行科室, 分页
  45. * @return 返回分页数据
  46. */
  47. public ResultVo<IPage<YzActOrder>> getXuQueFeiYiZhu(YzActOrder yzActOrder) {
  48. IPage<YzActOrder> page = new Page<>(yzActOrder.getCurrentPage(), yzActOrder.getPageSize(), false);
  49. List<String> execUnitList = publicServer.getKeShiLieBiaoList(yzActOrder.getExecUnit());
  50. if (StringUtil.isBlank(yzActOrder.getExecUnit())) {
  51. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "科室信息为空 [・_・?]");
  52. }
  53. String liShi = "=";
  54. if (yzActOrder.getLiShi() == 1) {
  55. if (StringUtil.isBlank(yzActOrder.getStartTimeString()) || StringUtil.isBlank(yzActOrder.getEndTimeString())) {
  56. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "查看历史数据时需要携带医嘱时间");
  57. }
  58. liShi = "<>";
  59. }
  60. log.info("查询需确费医嘱:数据:{}", JSON.toJSONString(yzActOrder));
  61. String fenLei = "a.ward_code";
  62. if (yzActOrder.getFenLei() != null && yzActOrder.getFenLei().equals(1)) {
  63. fenLei = "(select count(*) from yz_zy_patient_fee " +
  64. "where op_id = '" + TokenUtil.getTokenUserId() + "' and inpatient_no = a.inpatient_no and admiss_times = a.admiss_times and charge_status <> 3)";
  65. }
  66. page.setTotal(dao.getXuQueFeiYiZhuTotal(yzActOrder.getInpatientNo(), yzActOrder.getWardCode(), execUnitList, yzActOrder.getStartTimeString(), yzActOrder.getEndTimeString(), liShi));
  67. dao.getXuQueFeiYiZhu(page, yzActOrder.getInpatientNo(), yzActOrder.getWardCode(), execUnitList, yzActOrder.getStartTimeString(), yzActOrder.getEndTimeString(),
  68. fenLei, liShi);
  69. if (page.getRecords().isEmpty()) {
  70. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
  71. }
  72. List<YzActOrder> ziJieDian = dao.getXuQueFeiXiangXiXinXi(execUnitList, page.getRecords(), yzActOrder.getStartTimeString(), yzActOrder.getEndTimeString(), liShi);
  73. Map<String, List<YzActOrder>> ziJieDianMap = ziJieDian.stream().collect(
  74. Collectors.groupingBy(item -> item.getInpatientNo() + item.getAdmissTimes())
  75. );
  76. for (int i = 0; i < page.getRecords().size(); i++) {
  77. YzActOrder yz = page.getRecords().get(i);
  78. String key = yz.getInpatientNo() + yz.getAdmissTimes();
  79. if (yz.getList() == null) {
  80. yz.setList(new ArrayList<>());
  81. }
  82. if (ziJieDianMap.containsKey(key)) {
  83. yz.getList().addAll(ziJieDianMap.get(key));
  84. }
  85. }
  86. return ResultVoUtil.success(page);
  87. }
  88. /**
  89. * @param param
  90. * @return
  91. */
  92. @Transactional(rollbackFor = Exception.class)
  93. public ResultVo<String> baoCunYiZhuQueFeiShuJu(YzActOrder param) {
  94. List<Patient> xuYaoFeiYongJieShou = new ArrayList<>();
  95. List<YzActOrder> xuYaoQueFei = new ArrayList<>();
  96. if (ListUtil.isBlank(param.getList())) {
  97. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请选择需要确费的数据 ヽ(ー_ー)ノ");
  98. }
  99. if (StringUtil.isBlank(param.getExecUnit())) {
  100. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "科室信息为空 ∑(っ°Д°;)っ卧槽,不见了");
  101. }
  102. for (YzActOrder yzActOrder : param.getList()) {
  103. if (yzActOrder.getList() != null && !yzActOrder.getList().isEmpty()) {
  104. for (YzActOrder actOrder : yzActOrder.getList()) {
  105. if (actOrder.getChargeStatus().equals("1")) {
  106. xuYaoQueFei.add(actOrder);
  107. Patient xuQueFei = new Patient();
  108. xuQueFei.setInpatientNo(yzActOrder.getInpatientNo());
  109. xuQueFei.setAdmissTimes(yzActOrder.getAdmissTimes());
  110. xuQueFei.setName(yzActOrder.getName());
  111. xuQueFei.setLedgerSn(yzActOrder.getLedgerSn());
  112. if (!xuYaoFeiYongJieShou.contains(xuQueFei)) {
  113. xuYaoFeiYongJieShou.add(xuQueFei);
  114. }
  115. } else if (actOrder.getChargeStatus().equals("2")) {
  116. xuYaoQueFei.add(actOrder);
  117. }
  118. }
  119. }
  120. }
  121. if (xuYaoFeiYongJieShou.isEmpty()) {
  122. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有进行确认操作请勿点击。 ψ(*`ー´)ψ");
  123. } else {
  124. List<YzActOrder> yiQueFei = dao.huoQuLiShiQueFeiXinXi("", "",
  125. publicServer.getKeShiLieBiaoList(param.getExecUnit()), "", xuYaoFeiYongJieShou);
  126. Map<String, YzActOrder> yiQueFeiMap = yiQueFei.stream().collect(
  127. Collectors.toMap(L -> L.getInpatientNo() + L.getAdmissTimes() + DateUtil.formatDatetime(L.getOccTime()) + L.getChargeCode() + L.getChargeFee() + L.getOrderCount(), Function.identity()));
  128. for (YzActOrder yzActOrder : xuYaoQueFei) {
  129. String key = yzActOrder.getInpatientNo() + yzActOrder.getAdmissTimes() + DateUtil.formatDatetime(yzActOrder.getOccTime()) +
  130. yzActOrder.getChargeCode() + yzActOrder.getChargeFee() + yzActOrder.getOrderCount();
  131. if (yiQueFeiMap.containsKey(key)) {
  132. YzActOrder queRenTiShi = yiQueFeiMap.get(key);
  133. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("存在已被确费的项目,请对该项目选择不操作或刷新数据重新加载。 !!!∑(゚Д゚ノ)ノ <br>患者姓名:【%s】<br>项目:【%s】<br> 医嘱号:【%s】<br> 医嘱时间:【%s】<br>执行人:【%s】<br> 操作时间:【%s】", queRenTiShi.getPatientName(),
  134. queRenTiShi.getOrderName(), queRenTiShi.getActOrderNo(), DateUtil.formatDatetime(queRenTiShi.getOccTime()), queRenTiShi.getOpIdName(), DateUtil.formatDatetime(queRenTiShi.getOpDate())));
  135. }
  136. }
  137. }
  138. dao.baoCunYiZhuQueFei(xuYaoQueFei, TokenUtil.getTokenUserId());
  139. for (Patient patient : xuYaoFeiYongJieShou) {
  140. try {
  141. patientService.receiveAndRecalculateCost(patient);
  142. } catch (Exception e) {
  143. JSONObject obj = new JSONObject();
  144. obj.put("name", "systemNotification");
  145. obj.put("message", String.format("患者名字为:【%s】,医嘱确认成功但接受费用失败,请护士重新接受费用", patient.getName()));
  146. String message = obj.toJSONString();
  147. WebSocketServer.sendMessageByUserCode(TokenUtil.getTokenUserId(), message);
  148. }
  149. }
  150. log.info("医嘱确费保存==》操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONStringWithDateFormat(xuYaoQueFei, GetDateFormat.DATE_TIME));
  151. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "操作成功 (๑*◡*๑)");
  152. }
  153. }