PrintInfusionCardService.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package thyyxxk.webserver.service.inpatient.nursemodule;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import thyyxxk.webserver.config.exception.ExceptionEnum;
  6. import thyyxxk.webserver.dao.his.inpatient.nursemodule.PrintInfusionCardDao;
  7. import thyyxxk.webserver.entity.ResultVo;
  8. import thyyxxk.webserver.entity.inpatient.nursemodule.request.CardType;
  9. import thyyxxk.webserver.entity.inpatient.nursemodule.request.InfusionInsert;
  10. import thyyxxk.webserver.entity.inpatient.nursemodule.request.UpdatePrintStatus;
  11. import thyyxxk.webserver.entity.inpatient.nursemodule.response.*;
  12. import thyyxxk.webserver.entity.inpatient.nursemodule.request.QueryInfusionCard;
  13. import thyyxxk.webserver.utils.DateUtil;
  14. import thyyxxk.webserver.utils.ResultVoUtil;
  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. @Slf4j
  20. @Service
  21. public class PrintInfusionCardService {
  22. private final PrintInfusionCardDao dao;
  23. @Autowired
  24. public PrintInfusionCardService(PrintInfusionCardDao dao) {
  25. this.dao = dao;
  26. }
  27. public ResultVo<List<PatientBed>> getPatientBeds(String wardCode) {
  28. return ResultVoUtil.success(dao.selectPatientBedList(wardCode));
  29. }
  30. public ResultVo<List<PatientInfusionInfo>> queryInfusionCardOrBottleCard(QueryInfusionCard params) {
  31. String bedNos = makeBedNos(params.getBedNos());
  32. InfusionInsert insert = getInfusionInsert(params, params.getWardCode(), bedNos);
  33. if (params.getCardType() == CardType.INFUSION_CARD) {
  34. return queryInfusionCard(insert);
  35. }
  36. return queryBottleCard(insert);
  37. }
  38. private ResultVo<List<PatientInfusionInfo>> queryInfusionCard(InfusionInsert insert) {
  39. String wardCode = insert.getWardCode();
  40. List<PatientBriefInfo> targetPatients = dao.selectTargetPatients(wardCode, insert.getBedNos());
  41. String prefix = "▲";
  42. dao.deleteOldInfusion(wardCode);
  43. dao.insertNewInfusion(insert);
  44. dao.insertInfusionAgain(wardCode);
  45. List<YzActOccInfusionNew> mainDrugs = dao.selectMainDrugs(wardCode);
  46. if (mainDrugs.isEmpty()) {
  47. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "没有当天的输液卡。");
  48. }
  49. List<YzActOccInfusionNew> sideDrugs = dao.selectSideDrugs(wardCode);
  50. Map<String, List<YzActOccInfusionNew>> sideDrugMap = new HashMap<>();
  51. sideDrugs.forEach(drug -> {
  52. drug.setDrugName(prefix + drug.getDrugName());
  53. String key = drug.getParentNo();
  54. if (sideDrugMap.containsKey(key)) {
  55. sideDrugMap.get(key).add(drug);
  56. } else {
  57. List<YzActOccInfusionNew> tempList = new ArrayList<>();
  58. tempList.add(drug);
  59. sideDrugMap.put(key, tempList);
  60. }
  61. });
  62. List<InfusionCard> list = new ArrayList<>();
  63. for (YzActOccInfusionNew item : mainDrugs) {
  64. InfusionCard card = new InfusionCard();
  65. card.setMainDrug(item);
  66. List<YzActOccInfusionNew> sideDrugList = sideDrugMap.get(item.getActOrderNo());
  67. if (null == sideDrugList) {
  68. list.add(card);
  69. continue;
  70. }
  71. card.setSideDrugs(sideDrugList);
  72. list.add(card);
  73. }
  74. Map<String, PatientInfusionInfo> tempMap = new HashMap<>();
  75. for (InfusionCard card : list) {
  76. String key = card.getMainDrug().getInpatientNo();
  77. if (tempMap.containsKey(key)) {
  78. tempMap.get(key).getDrugGroups().add(card);
  79. } else {
  80. PatientInfusionInfo infusionInfo = new PatientInfusionInfo();
  81. List<InfusionCard> tempList = new ArrayList<>();
  82. tempList.add(card);
  83. infusionInfo.setDrugGroups(tempList);
  84. tempMap.put(key, infusionInfo);
  85. }
  86. }
  87. List<PatientInfusionInfo> response = new ArrayList<>();
  88. targetPatients.forEach(target -> {
  89. PatientInfusionInfo infusionInfo = tempMap.get(target.getPatNo());
  90. if (null != infusionInfo) {
  91. target.setAgeLabel(DateUtil.calculateAgeLabelByDays(target.getAgeDays()));
  92. infusionInfo.setPatInfo(target);
  93. response.add(infusionInfo);
  94. }
  95. });
  96. return ResultVoUtil.success(response);
  97. }
  98. private ResultVo<List<PatientInfusionInfo>> queryBottleCard(InfusionInsert insert) {
  99. String wardCode = insert.getWardCode();
  100. List<PatientBriefInfo> targetPatients = dao.selectTargetPatients(wardCode, insert.getBedNos());
  101. Map<String, PatientBriefInfo> patInfoMap = new HashMap<>();
  102. for (PatientBriefInfo info : targetPatients) {
  103. info.setAgeLabel(DateUtil.calculateAgeLabelByDays(info.getAgeDays()));
  104. patInfoMap.put(info.getPatNo(), info);
  105. }
  106. dao.deleteOldInfusion(wardCode);
  107. dao.insertNewBottleCard(insert);
  108. List<YzActOccInfusionNew> mainDrugs = dao.selectMainDrugsForBottleCard(insert);
  109. List<YzActOccInfusionNew> sideDrugs = dao.selectSideDrugsForBottleCard(insert);
  110. List<PatientInfusionInfo> response = new ArrayList<>();
  111. for (YzActOccInfusionNew main : mainDrugs) {
  112. main.setStartHour(DateUtil.formatDatetime(main.getStartTime(), "HH:mm"));
  113. PatientInfusionInfo info = new PatientInfusionInfo();
  114. info.setPatInfo(patInfoMap.get(main.getInpatientNo()));
  115. info.setBottleCardDrugs(fetchDrugsForBottleCard(main, sideDrugs));
  116. response.add(info);
  117. }
  118. // 按bed_no去掉最后一个字符后转为数字排序
  119. response.sort((o1, o2) -> {
  120. // 获取并处理bedNo(去掉最后一个字符)
  121. String bedNo1 = getTrimmedBedNo(o1.getPatInfo());
  122. String bedNo2 = getTrimmedBedNo(o2.getPatInfo());
  123. // 转为数字比较
  124. try {
  125. Integer b1 = bedNo1.isEmpty() ? 0 : Integer.parseInt(bedNo1);
  126. Integer b2 = bedNo2.isEmpty() ? 0 : Integer.parseInt(bedNo2);
  127. return b1.compareTo(b2);
  128. } catch (NumberFormatException e) {
  129. // 非数字格式按处理后的字符串字典序排序
  130. return bedNo1.compareTo(bedNo2);
  131. }
  132. });
  133. return ResultVoUtil.success(response);
  134. }
  135. // 辅助方法:获取去掉最后一个字符的bedNo
  136. private String getTrimmedBedNo(PatientBriefInfo patInfo) {
  137. if (patInfo == null || patInfo.getBedNo() == null || patInfo.getBedNo().length() == 0) {
  138. return "";
  139. }
  140. // 去掉最后一个字符(若长度为1则返回空字符串)
  141. return patInfo.getBedNo().substring(0, patInfo.getBedNo().length() - 1);
  142. }
  143. private List<YzActOccInfusionNew> fetchDrugsForBottleCard(YzActOccInfusionNew main, List<YzActOccInfusionNew> sideDrugs) {
  144. List<YzActOccInfusionNew> list = new ArrayList<>();
  145. list.add(main);
  146. String prefix = "▲";
  147. for (YzActOccInfusionNew drug : sideDrugs) {
  148. if (drug.getParentNo().equals(main.getActOrderNo())) {
  149. drug.setDrugName(prefix + drug.getOrderName());
  150. drug.setStartHour(DateUtil.formatDatetime(drug.getStartTime(), "HH:mm"));
  151. list.add(drug);
  152. }
  153. }
  154. return list;
  155. }
  156. private InfusionInsert getInfusionInsert(QueryInfusionCard params, String wardCode, String bedNos) {
  157. InfusionInsert insert = new InfusionInsert();
  158. insert.setStartTime(params.getExecuteDate() + " 00:00:00.000");
  159. insert.setEndTime(params.getExecuteDate() + " 23:59:59.999");
  160. insert.setWardCode(wardCode);
  161. insert.setBedNos(bedNos);
  162. insert.setAlwaysFlag(params.getFrequency().getLabel());
  163. String printComment = params.getCardType() == CardType.INFUSION_CARD ?
  164. params.getPrintRange().getInfusionLabel() :
  165. params.getPrintRange().getBottleLabel();
  166. insert.setPrintComment(printComment);
  167. insert.setBottleCardType(params.getBottleCardType());
  168. return insert;
  169. }
  170. private String makeBedNos(List<String> bedNos) {
  171. if (null == bedNos || bedNos.isEmpty()) {
  172. return "''";
  173. }
  174. List<String> temp = new ArrayList<>();
  175. StringBuilder sb = new StringBuilder();
  176. for (String bedNo : bedNos) {
  177. if (temp.contains(bedNo)) {
  178. continue;
  179. }
  180. temp.add(bedNo);
  181. sb.append(",'").append(bedNo).append("'");
  182. }
  183. return sb.substring(1);
  184. }
  185. public String updatePrintStatus(UpdatePrintStatus request) {
  186. if (null == request.getOrderNos() || request.getOrderNos().isEmpty()) {
  187. return "empty orderNos";
  188. }
  189. String status = request.getCardType() == CardType.INFUSION_CARD ? "S" : "J";
  190. StringBuilder sb = new StringBuilder();
  191. for (String orderNo : request.getOrderNos()) {
  192. sb.append(",'").append(orderNo).append("'");
  193. }
  194. String orderNos = sb.substring(1);
  195. dao.updateYzActOccPrintStatus(status, orderNos);
  196. return status;
  197. }
  198. }