|  | @@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  |  import org.apache.commons.collections4.ListUtils;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | -import org.springframework.web.client.RestTemplate;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.config.exception.BizException;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.config.exception.ExceptionEnum;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.constants.Capacity;
 | 
	
	
		
			
				|  | @@ -221,9 +220,12 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public ResultVo<Map<String, Object>> confirmOrders(XinZhenYiZhu param) {
 | 
	
		
			
				|  |  |          QueryWrapper<?> qw = new QueryWrapper<>();
 | 
	
		
			
				|  |  | -        qw.eq("a.inpatient_no", param.getInpatientNo()).eq("a.admiss_times", param.getAdmissTimes());
 | 
	
		
			
				|  |  | -        qw.eq("a.status_flag", "1");
 | 
	
		
			
				|  |  | -        qw.eq("a.enter_oper", TokenUtil.getTokenUserId());
 | 
	
		
			
				|  |  | +        qw.eq("a.inpatient_no", param.getInpatientNo())
 | 
	
		
			
				|  |  | +                .eq("a.admiss_times", param.getAdmissTimes())
 | 
	
		
			
				|  |  | +                .eq("a.status_flag", "1")
 | 
	
		
			
				|  |  | +                .eq("a.enter_oper", TokenUtil.getTokenUserId())
 | 
	
		
			
				|  |  | +                // 排除出院带药的医嘱
 | 
	
		
			
				|  |  | +                .ne("a.self_buy", "4");
 | 
	
		
			
				|  |  |          param.setList(dao.huoQuYiZhuShuJu(qw));
 | 
	
		
			
				|  |  |          List<XinZhenYzActOrder> yiZhuList = param.getList();
 | 
	
		
			
				|  |  |          if (ListUtil.isBlank(yiZhuList)) {
 | 
	
	
		
			
				|  | @@ -233,8 +235,6 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |          Set<String> yaoPingCode = new HashSet<>();
 | 
	
		
			
				|  |  |          // 项目的 code
 | 
	
		
			
				|  |  |          Set<String> xiangMuCode = new HashSet<>();
 | 
	
		
			
				|  |  | -        // 出院带药需要生成药单 key 是不同的药房。不同的药房就要
 | 
	
		
			
				|  |  | -        Map<String, List<XinZhenYzActOrder>> takeTheMedicineList = new HashMap<>(Capacity.TWO);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          for (XinZhenYzActOrder item : yiZhuList) {
 | 
	
		
			
				|  |  |              if (ITEM.equals(item.getSerial())) {
 | 
	
	
		
			
				|  | @@ -242,16 +242,6 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  yaoPingCode.add(item.getOrderCode().trim() + item.getSerial().trim());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            // 费用标志为 4 的就是出院带药
 | 
	
		
			
				|  |  | -            if ("4".equals(item.getSelfBuy())) {
 | 
	
		
			
				|  |  | -                if (takeTheMedicineList.containsKey(item.getGroupNo())) {
 | 
	
		
			
				|  |  | -                    takeTheMedicineList.get(item.getGroupNo()).add(item);
 | 
	
		
			
				|  |  | -                } else {
 | 
	
		
			
				|  |  | -                    List<XinZhenYzActOrder> temp = new ArrayList<>();
 | 
	
		
			
				|  |  | -                    temp.add(item);
 | 
	
		
			
				|  |  | -                    takeTheMedicineList.put(item.getGroupNo(), temp);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 合理用药校验
 | 
	
	
		
			
				|  | @@ -301,10 +291,11 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |                  if (!isThereAnyErrorMessage && errorMessageMap.containsKey("error")) {
 | 
	
		
			
				|  |  |                      isThereAnyErrorMessage = true;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                map.put(item.getId(), errorMessageMap);
 | 
	
		
			
				|  |  |                  errorMessageMap.put("data", item);
 | 
	
		
			
				|  |  | +                map.put(item.getId(), errorMessageMap);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          if (isThereAnyErrorMessage) {
 | 
	
		
			
				|  |  |              return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改错误的医嘱", map);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -316,7 +307,6 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              dao.stopOrder(param.getInpatientNo(), param.getAdmissTimes(), excludeOrders, userCode, orderNo);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        dischargeMedicineList(takeTheMedicineList, huanZheXinXi);
 | 
	
		
			
				|  |  |          for (BigDecimal decimal : confirmOrderInformation) {
 | 
	
		
			
				|  |  |              dao.confirmOrders(decimal, userCode, new Date());
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -344,7 +334,6 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |              dao.summarySheetOfDrugs(pageNo, huanZheXinXi, userCode, entry.getKey());
 | 
	
		
			
				|  |  |              dao.insertDetailedMedicineList(pageNo, huanZheXinXi, userCode, entry.getKey(), entry.getValue());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -378,7 +367,6 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |          if (data.getParentNo() != null) {
 | 
	
		
			
				|  |  |              data.setSupplyCode("044");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          // 药品的 code
 | 
	
		
			
				|  |  |          Set<String> yaoPingCode = new HashSet<>();
 | 
	
		
			
				|  |  |          // 项目的 code
 | 
	
	
		
			
				|  | @@ -1062,10 +1050,6 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |                          item.setDrugOcc(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize(), 2), total));
 | 
	
		
			
				|  |  |                          item.setDrugQuan(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize()), total));
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                    dao.updateThePickup(item);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    log.info("领量:{},occ:{},天数:{},服用次数:{}", item.getDrugQuan(), item.getDrugOcc(), day, total);
 | 
	
		
			
				|  |  | -                    log.info("出院带药确认频次:{},一天服用次数:{}", item.getFrequCode(), times);
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      // 计算普通药品的领量 durg_quan durg_occ
 | 
	
		
			
				|  |  |                      calculateDrugAmount(item, feiYongXinXi, 错误信息);
 | 
	
	
		
			
				|  | @@ -1520,4 +1504,145 @@ public class YiZhuLuRuServer {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 批量检验医嘱是否正确
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param list         医嘱数据
 | 
	
		
			
				|  |  | +     * @param huanZheXinXi 患者信息
 | 
	
		
			
				|  |  | +     * @param rationalUse  是否要用合理用药
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public Map<String, Object> batchVerification(List<XinZhenYzActOrder> list,
 | 
	
		
			
				|  |  | +                                                 XinZhenYiZhu huanZheXinXi,
 | 
	
		
			
				|  |  | +                                                 boolean rationalUse) {
 | 
	
		
			
				|  |  | +        Map<String, Object> returnMap = new HashMap<>();
 | 
	
		
			
				|  |  | +        // 药品 code
 | 
	
		
			
				|  |  | +        Set<String> yaoPingCode = new HashSet<>();
 | 
	
		
			
				|  |  | +        // 项目的 code
 | 
	
		
			
				|  |  | +        Set<String> xiangMuCode = new HashSet<>();
 | 
	
		
			
				|  |  | +        huanZheXinXi.setList(list);
 | 
	
		
			
				|  |  | +        // 合理用药校验
 | 
	
		
			
				|  |  | +        Map<String, List<String>> rationalUseOfMedicine = rationalUse ? rationalUseServer.jiaoYan(huanZheXinXi) : new HashMap<>(list.size());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (XinZhenYzActOrder item : list) {
 | 
	
		
			
				|  |  | +            if (ITEM.equals(item.getSerial())) {
 | 
	
		
			
				|  |  | +                xiangMuCode.add(item.getOrderCode());
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                yaoPingCode.add(item.getOrderCode().trim() + item.getSerial().trim());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        String userCode = TokenUtil.getTokenUserId();
 | 
	
		
			
				|  |  | +        // 获取医生开药品的权限
 | 
	
		
			
				|  |  | +        Integer doctorLevel = dao.huoQuYiShenDengJi(userCode);
 | 
	
		
			
				|  |  | +        Map<String, XinZhenYzActOrder> drug = getDrugInformation(yaoPingCode, huanZheXinXi.getZkWard());
 | 
	
		
			
				|  |  | +        Map<String, List<XinZhenYzActOrder>> project = getProjectInformation(xiangMuCode);
 | 
	
		
			
				|  |  | +        for (XinZhenYzActOrder item : list) {
 | 
	
		
			
				|  |  | +            String key = item.getId();
 | 
	
		
			
				|  |  | +            Map<String, Object> errorMessageMap = checkData(item, drug, project, huanZheXinXi, doctorLevel);
 | 
	
		
			
				|  |  | +            if (rationalUseOfMedicine.containsKey(key)) {
 | 
	
		
			
				|  |  | +                List<String> temp = (List<String>) errorMessageMap.get("error");
 | 
	
		
			
				|  |  | +                if (temp == null) {
 | 
	
		
			
				|  |  | +                    errorMessageMap.put("error", rationalUseOfMedicine.get(key));
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    temp.addAll(rationalUseOfMedicine.get(key));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (!errorMessageMap.isEmpty()) {
 | 
	
		
			
				|  |  | +                if (errorMessageMap.get("error") != null) {
 | 
	
		
			
				|  |  | +                    errorMessageMap.put("data", item);
 | 
	
		
			
				|  |  | +                    returnMap.put(item.getId(), errorMessageMap);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return returnMap;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 确认出院带药医嘱
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param patNo
 | 
	
		
			
				|  |  | +     * @param times
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public ResultVo<Map<String, Object>> confirmTheDoctorSOrderWithMedicine(String patNo, Integer times) {
 | 
	
		
			
				|  |  | +        QueryWrapper<?> qw = new QueryWrapper<>();
 | 
	
		
			
				|  |  | +        qw.eq("a.inpatient_no", patNo)
 | 
	
		
			
				|  |  | +                .eq("a.admiss_times", times)
 | 
	
		
			
				|  |  | +                .eq("a.status_flag", "1")
 | 
	
		
			
				|  |  | +                .eq("a.enter_oper", TokenUtil.getTokenUserId())
 | 
	
		
			
				|  |  | +                .eq("a.self_buy", "4");
 | 
	
		
			
				|  |  | +        XinZhenYiZhu patInfo = dao.huoQuHuanZheXinXi(patNo, times);
 | 
	
		
			
				|  |  | +        patInfo.setList(dao.huoQuYiZhuShuJu(qw));
 | 
	
		
			
				|  |  | +        if (dao.obtainTheNumberOfDischargedDrugs(patNo, times) > 4) {
 | 
	
		
			
				|  |  | +            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "出院带药医嘱不得超过 4 种,且不得超过 15 天。");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        String userCode = TokenUtil.getTokenUserId();
 | 
	
		
			
				|  |  | +        // 出院带药需要生成药单 key 是不同的药房。不同的药房就要
 | 
	
		
			
				|  |  | +        Map<String, List<XinZhenYzActOrder>> takeTheMedicineList = new HashMap<>(Capacity.TWO);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (XinZhenYzActOrder item : patInfo.getList()) {
 | 
	
		
			
				|  |  | +            XinZhenYzActOrder feiYongXinXi = dao.getDrugOne(item.getOrderCode() + item.getSerial(), item.getGroupNo());
 | 
	
		
			
				|  |  | +            int day = 1;
 | 
	
		
			
				|  |  | +            // 如果是临时医嘱 开了就结束了.
 | 
	
		
			
				|  |  | +            if ("ONCE".equals(item.getFrequCode())) {
 | 
	
		
			
				|  |  | +                item.setEndTime(item.getStartTime());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (item.getStartTime() != null && item.getEndTime() != null) {
 | 
	
		
			
				|  |  | +                long cha = item.getEndTime().getTime() - item.getStartTime().getTime();
 | 
	
		
			
				|  |  | +                long nd = 1000 * 24 * 60 * 60;
 | 
	
		
			
				|  |  | +                day = (int) (cha / nd);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // 计算出院带药的领量
 | 
	
		
			
				|  |  | +            Map<String, Short> numberOfTimesADay = dao.numberOfTimesADay(item.getFrequCode());
 | 
	
		
			
				|  |  | +            int tempTimes = 1;
 | 
	
		
			
				|  |  | +            for (Map.Entry<String, Short> entry : numberOfTimesADay.entrySet()) {
 | 
	
		
			
				|  |  | +                if (entry.getValue() != null) {
 | 
	
		
			
				|  |  | +                    tempTimes += entry.getValue();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // 最小天数一天
 | 
	
		
			
				|  |  | +            BigDecimal total = new BigDecimal((day <= 0 ? 1 : day) * tempTimes);
 | 
	
		
			
				|  |  | +            if (StringUtil.notBlank(feiYongXinXi.getDrugWeightUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getDrugWeightUnit().trim())) {
 | 
	
		
			
				|  |  | +                item.setDrugOcc(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getDrugWeight(), 2), total));
 | 
	
		
			
				|  |  | +                item.setDrugQuan(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getDrugWeight()), total));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            } else if (StringUtil.notBlank(feiYongXinXi.getDrugVolUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getDrugVolUnit())) {
 | 
	
		
			
				|  |  | +                item.setDrugOcc(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getDrugVolume(), 2), total));
 | 
	
		
			
				|  |  | +                item.setDrugQuan(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getDrugVolume()), total));
 | 
	
		
			
				|  |  | +            } else if (StringUtil.notBlank(feiYongXinXi.getPackUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getPackUnit())) {
 | 
	
		
			
				|  |  | +                item.setDrugOcc(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize(), 2), total));
 | 
	
		
			
				|  |  | +                item.setDrugQuan(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize()), total));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // 在这里更新出院带药领量
 | 
	
		
			
				|  |  | +            dao.updateThePickup(item);
 | 
	
		
			
				|  |  | +            // 费用标志为 4 的就是出院带药
 | 
	
		
			
				|  |  | +            if ("4".equals(item.getSelfBuy())) {
 | 
	
		
			
				|  |  | +                if (takeTheMedicineList.containsKey(item.getGroupNo())) {
 | 
	
		
			
				|  |  | +                    takeTheMedicineList.get(item.getGroupNo()).add(item);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    List<XinZhenYzActOrder> temp = new ArrayList<>();
 | 
	
		
			
				|  |  | +                    temp.add(item);
 | 
	
		
			
				|  |  | +                    takeTheMedicineList.put(item.getGroupNo(), temp);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Map<String, Object> check = batchVerification(patInfo.getList(), patInfo, true);
 | 
	
		
			
				|  |  | +        if (check.isEmpty()) {
 | 
	
		
			
				|  |  | +            for (XinZhenYzActOrder order : patInfo.getList()) {
 | 
	
		
			
				|  |  | +                // 确认医嘱
 | 
	
		
			
				|  |  | +                dao.confirmOrders(order.getActOrderNo(), userCode, new Date());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // 生成药单
 | 
	
		
			
				|  |  | +            dischargeMedicineList(takeTheMedicineList, patInfo);
 | 
	
		
			
				|  |  | +            return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", check);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |