|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|