SurgeryArrangementService.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package thyyxxk.webserver.service.surgicalmanagement;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.stereotype.Service;
  6. import thyyxxk.webserver.config.exception.ExceptionEnum;
  7. import thyyxxk.webserver.dao.his.surgicalmanagement.SurgeryArrangementDao;
  8. import thyyxxk.webserver.entity.ResultVo;
  9. import thyyxxk.webserver.entity.dictionary.CodeName;
  10. import thyyxxk.webserver.entity.surgeryarrangement.QuerySurgeryParams;
  11. import thyyxxk.webserver.entity.surgeryarrangement.request.StatisticsInquiry;
  12. import thyyxxk.webserver.entity.surgeryarrangement.response.SurgeryStatistics;
  13. import thyyxxk.webserver.entity.zhuyuanyisheng.shoushu.OpRecord;
  14. import thyyxxk.webserver.service.hutoolcache.DeptCache;
  15. import thyyxxk.webserver.service.hutoolcache.UserCache;
  16. import thyyxxk.webserver.service.outpatient.wxapi.SendWxInfoService;
  17. import thyyxxk.webserver.utils.*;
  18. import java.util.ArrayList;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. @Service
  23. @Slf4j
  24. public class SurgeryArrangementService {
  25. private final SurgeryArrangementDao dao;
  26. private final SendWxInfoService sendWxInfoService;
  27. private final UserCache userCache;
  28. private final DeptCache deptCache;
  29. private static final String[] OP_RECORD_COLUMNS = {"room_code", "op_datetime", "remark",
  30. "arrangement_executed", "urgent_clinic_flag", "preoperative_visit",
  31. "preoperative_preparation", "tw_flag", "sstc"};
  32. public SurgeryArrangementService(SurgeryArrangementDao dao, SendWxInfoService sendWxInfoService, UserCache userCache, DeptCache deptCache) {
  33. this.dao = dao;
  34. this.sendWxInfoService = sendWxInfoService;
  35. this.userCache = userCache;
  36. this.deptCache = deptCache;
  37. }
  38. public ResultVo<Map<String, List<CodeName>>> getDicList() {
  39. Map<String, List<CodeName>> map = new HashMap<>();
  40. map.put("allRooms", dao.selectSurgeryRooms());
  41. map.put("allWards", dao.getAllSurgicalWard());
  42. map.put("surStaffs", dao.selectStaffsByDeptCode("1300000"));
  43. map.put("aneStaffs", dao.selectStaffsByDeptCode("1120000"));
  44. return ResultVoUtil.success(map);
  45. }
  46. public ResultVo<List<OpRecord>> selectSurgeryArrangements(QuerySurgeryParams param) {
  47. QueryWrapper<?> qw = new QueryWrapper<>();
  48. qw.ge("op_datetime", param.getStartTime());
  49. qw.le("op_datetime", param.getEndTime());
  50. if (param.getJzFlag()) {
  51. qw.eq("urgent_clinic_flag", "1");
  52. }
  53. if (!param.getStatus().equals("0")) {
  54. qw.eq("a.status", param.getStatus());
  55. }
  56. if (StringUtil.notBlank(param.getPatNo())) {
  57. qw.eq("a.inpatient_no", param.getPatNo());
  58. }
  59. if (StringUtil.notBlank(param.getWard())) {
  60. qw.eq("a.ward_code", param.getWard());
  61. }
  62. List<OpRecord> list = dao.selectSurgeryArrangements(qw);
  63. if (ListUtil.isBlank(list)) {
  64. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
  65. }
  66. List<OpRecord> canceled = new ArrayList<>();
  67. list.forEach(item -> {
  68. item.setWardName(deptCache.getDeptName(item.getWardCode()));
  69. item.setDeptName(deptCache.getDeptName(item.getDeptCode()));
  70. item.setApplyDocName(userCache.getEmployeeName(item.getApplyDoc()));
  71. item.setDoctorZdName(userCache.getEmployeeName(item.getDoctorZd()));
  72. item.setDoctor1Name(userCache.getEmployeeName(item.getDoctor1()));
  73. item.setDoctor2Name(userCache.getEmployeeName(item.getDoctor2()));
  74. item.setNurseXhName(userCache.getEmployeeName(item.getNurseXh()));
  75. item.setNurseQxName(userCache.getEmployeeName(item.getNurseQx()));
  76. item.setDoctorMzYsName(userCache.getEmployeeName(item.getDoctorMzYs()));
  77. item.setDoctorMzHsName(userCache.getEmployeeName(item.getDoctorMzHs()));
  78. if (item.getStatus().equals("d")) {
  79. canceled.add(item);
  80. }
  81. });
  82. list.removeIf(item -> item.getStatus().equals("d"));
  83. list.addAll(canceled);
  84. return ResultVoUtil.success(list);
  85. }
  86. public ResultVo<List<CodeName>> getSurgeryRooms() {
  87. return ResultVoUtil.success(dao.selectSurgeryRooms());
  88. }
  89. public ResultVo<String> updateSurgeryStatus(Integer recordId, String status) {
  90. if (hasArrangementPermission()) {
  91. dao.updateSurgeryStatus(recordId, status);
  92. return ResultVoUtil.success("操作成功。");
  93. }
  94. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "操作失败,您没有安排手术的权限。");
  95. }
  96. private boolean isOpRecordColumn(String targetColumn) {
  97. for (String column : OP_RECORD_COLUMNS) {
  98. if (column.equals(targetColumn)) {
  99. return true;
  100. }
  101. }
  102. return false;
  103. }
  104. public ResultVo<String> updateArrangement(Integer recordId, String column, String value) {
  105. if (hasArrangementPermission()) {
  106. String table = isOpRecordColumn(column) ? "op_record" : "op_record_join";
  107. if (value.isEmpty()) {
  108. value = null;
  109. }
  110. dao.updateArrangement(table, column, value, recordId);
  111. return ResultVoUtil.success();
  112. }
  113. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "操作失败,您没有安排手术的权限。");
  114. }
  115. private boolean hasArrangementPermission() {
  116. if (TokenUtil.getInstance().getTokenUserId().equals("01897")) {
  117. return true;
  118. }
  119. Integer count = dao.selectArrangementPermission(TokenUtil.getInstance().getTokenUserId());
  120. return null != count && count > 0;
  121. }
  122. public ResultVo<String> notifyDoctor(OpRecord record) {
  123. List<String> codeRsList = dao.selectCodeRsList(record.getDoctorZd(), record.getApplyDoc(),
  124. record.getDoctorMzYs(),record.getDoctor1(),record.getDoctor2(),record.getNurseXh(),
  125. record.getNurseQx());
  126. if (codeRsList.isEmpty()) {
  127. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "没有查询到手术医生和申请医生的工号。");
  128. }
  129. StringBuilder sb = new StringBuilder();
  130. for (String codeRs : codeRsList) {
  131. sb.append("|").append(codeRs);
  132. }
  133. String touser = sb.substring(1);
  134. String roomName = dao.selectRoomName(record.getRoomCode());
  135. String content = String.format("[%s]申请的住院号[%s]病人姓名[%s]由[%s]主刀的[%s]已安排在[%s][%s]",
  136. record.getApplyDocName(),record.getInpatientNo(),record.getPatientName(),
  137. record.getDoctorZdName(),record.getOpName(),
  138. DateUtil.formatDatetime(record.getOpDatetime()),roomName);
  139. JSONObject response = sendWxInfoService.sendCorpWxMsg(touser, content);
  140. if (null == response) {
  141. return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
  142. }
  143. Integer errcode = response.getInteger("errcode");
  144. if (null == errcode) {
  145. return ResultVoUtil.fail(ExceptionEnum.NETWORK_ERROR);
  146. }
  147. if (errcode == 0) {
  148. return ResultVoUtil.success("推送成功。");
  149. }
  150. String message = "推送失败。" + response.getString("errmsg");
  151. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, message);
  152. }
  153. public SurgeryStatistics queryStatistics(StatisticsInquiry inquiry) {
  154. List<OpRecord> opRecordList = dao.selectOpRecordStatistics(inquiry.getStartDate(), inquiry.getEndDate());
  155. if (opRecordList.isEmpty()) {
  156. return null;
  157. }
  158. SurgeryStatistics response = new SurgeryStatistics();
  159. response.setTotal(opRecordList.size());
  160. Map<String, List<OpRecord>> map = new HashMap<>();
  161. for (OpRecord record : opRecordList) {
  162. String key = getKey(inquiry, record);
  163. if (StringUtil.isBlank(key)) {
  164. continue;
  165. }
  166. if (map.containsKey(key)) {
  167. map.get(key).add(record);
  168. } else {
  169. List<OpRecord> tempList = new ArrayList<>();
  170. tempList.add(record);
  171. map.put(key, tempList);
  172. }
  173. }
  174. response.setSurgeryMap(map);
  175. return response;
  176. }
  177. private static String getKey(StatisticsInquiry inquiry, OpRecord record) {
  178. switch (inquiry.getStatisticsLabel()) {
  179. case BY_SURGERY:
  180. return record.getOpName();
  181. case BY_LEVEL:
  182. return record.getOpScaleName();
  183. case BY_DEPARTMENT:
  184. default:
  185. return record.getDeptName();
  186. }
  187. }
  188. }