浏览代码

优化医嘱校验,和确费接口。

xiaochan 2 年之前
父节点
当前提交
b23b6c491c

+ 66 - 0
src/main/java/thyyxxk/webserver/controller/ExternalInterface/MedicalTechnologyApplicationFee.java

@@ -0,0 +1,66 @@
+package thyyxxk.webserver.controller.ExternalInterface;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import thyyxxk.webserver.config.auth.PassToken;
+import thyyxxk.webserver.config.exception.ExceptionEnum;
+import thyyxxk.webserver.dao.his.zhuyuanyiji.QueRenYiZhuShouFeiDao;
+import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.YshYjReq;
+import thyyxxk.webserver.utils.ResultVoUtil;
+import thyyxxk.webserver.utils.StringUtil;
+
+import java.util.Date;
+
+/**
+ * 医技申请确费
+ */
+@RestController
+@RequestMapping("/medicalTechnology")
+public class MedicalTechnologyApplicationFee {
+
+    private final QueRenYiZhuShouFeiDao dao;
+
+    public MedicalTechnologyApplicationFee(QueRenYiZhuShouFeiDao dao) {
+        this.dao = dao;
+    }
+
+    @GetMapping("/confirmFee")
+    @PassToken
+    @Transactional(rollbackFor = Exception.class)
+    @DS("dev")
+    public ResultVo<String> externalConfirmationFees(@RequestParam("confirmId") String confirmId,
+                                                     @RequestParam("reqNo") Integer reqNo,
+                                                     @RequestParam("deptCode") String deptCode) {
+        if (StringUtil.isBlank(confirmId)) {
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "确认人 id 为空");
+        }
+        if (StringUtil.isBlank(deptCode)) {
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "科室不能为空");
+        }
+        if (reqNo == null) {
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "申请号为空");
+        }
+        YshYjReq yshYjReq = dao.selectedYshJyReqOne(reqNo);
+        if (yshYjReq == null) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "未查询到申请单");
+        }
+
+        if (StringUtil.notBlank(yshYjReq.getConfirmFlag())) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请勿重复确认");
+        }
+
+        if (dao.whetherToGenerateAConfirmationFee(yshYjReq.getActOrderNo()) == 0) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "护士未执行");
+        }
+
+        Date date = new Date();
+
+        dao.updateYshYjReqFlag(confirmId, reqNo, date, deptCode);
+        dao.confirmTheIntermediateTable(confirmId, yshYjReq.getActOrderNo(), date, deptCode);
+
+        return ResultVoUtil.success(ExceptionEnum.SUCCESS);
+    }
+
+}

+ 1 - 7
src/main/java/thyyxxk/webserver/controller/zhuyuanyizheng/YizhuLuRuController.java

@@ -148,7 +148,7 @@ public class YizhuLuRuController {
     }
 
     @PostMapping("/singleDataCheck")
-    public ResultVo<Map<String, Object>> singleDataCheck(@RequestBody XinZhenYiZhu param) {
+    public ResultVo<Object> singleDataCheck(@RequestBody XinZhenYiZhu param) {
         return server.singleDataCheck(param);
     }
 
@@ -229,12 +229,6 @@ public class YizhuLuRuController {
         return server.confirmTheDoctorSOrderWithMedicine(patNo, times);
     }
 
-    @GetMapping("/copyTheDoctorSOrder")
-    public ResultVo<String> copyTheDoctorSOrder(@RequestParam("orderNo") BigDecimal orderNo,
-                                                @RequestParam("deptCode") String deptCode) {
-        return server.copyTheDoctorSOrder(orderNo, deptCode);
-    }
-
     @PostMapping("/copyOrder")
     public ResultVo<List<BigDecimal>> copyOrder(@RequestBody copyOrder copyOrder) {
         return server.copyOrder(copyOrder);

+ 36 - 0
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyiji/QueRenYiZhuShouFeiDao.java

@@ -7,7 +7,10 @@ import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 import thyyxxk.webserver.entity.datamodify.YzActOrder;
 import thyyxxk.webserver.entity.inpatient.patient.Patient;
+import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.YshYjReq;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -249,4 +252,37 @@ public interface QueRenYiZhuShouFeiDao {
     List<YzActOrder> huoQuLiShiQueFeiXinXi(
             @Param("list") List<String> execUnitList,
             @Param("yiQueFeiShuJu") List<Patient> yiQueFeiShuJu);
+
+
+    @Select("select act_order_no, confirm_flag " +
+            "from ysh_yj_req where req_no = #{reqNo}")
+    YshYjReq selectedYshJyReqOne(Integer reqNo);
+
+    @Update("update ysh_yj_req " +
+            "set confirm_flag = 1, " +
+            "    confirm_id   = #{confirmId}, " +
+            "    confirm_time = #{date}," +
+            "    exec_dept = #{deptCode} " +
+            "where req_no = #{reqNo} ")
+    int updateYshYjReqFlag(String confirmId,
+                           Integer reqNo,
+                           Date date,
+                           String deptCode);
+
+    @Update("update yz_zy_patient_fee " +
+            "set charge_status = '1', " +
+            "    op_id         = #{confirmId}, " +
+            "    op_date       = #{date}," +
+            "    exec_unit     = #{deptCode} " +
+            "where act_order_no = #{orderNo} ")
+    int confirmTheIntermediateTable(String confirmId,
+                                    BigDecimal orderNo,
+                                    Date date,
+                                    String deptCode);
+
+    @Select("select count(1)\n" +
+            "from yz_zy_patient_fee where act_order_no = #{orderNo} ")
+    int whetherToGenerateAConfirmationFee(BigDecimal orderNo);
+
+
 }

+ 56 - 33
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyisheng/YiZhuLuRuDao.java

@@ -9,6 +9,7 @@ import thyyxxk.webserver.entity.datamodify.YzActOrder;
 import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
 import thyyxxk.webserver.entity.inpatient.patient.Overview;
 import thyyxxk.webserver.entity.inpatient.patient.Patient;
+import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.entity.zhuyuanyisheng.DoctorSOrderFee;
 import thyyxxk.webserver.entity.zhuyuanyisheng.ZyOrderZk;
 import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.*;
@@ -300,7 +301,7 @@ public interface YiZhuLuRuDao {
             "                           consult_physician, " +
             "    physician_name       = (select top (1) rtrim(name) " +
             "                            from a_employee_mi with (NOLOCK) " +
-            "                            where code = physician) /* 开这个医嘱的医生 */, \\\n" +
+            "                            where code = physician) /* 开这个医嘱的医生 */, \\ " +
             "                           exec_unit, " +
             "    exec_unit_name       = (select top (1) rtrim(name) " +
             "                            from zd_unit_code with (NOLOCK) " +
@@ -900,21 +901,13 @@ public interface YiZhuLuRuDao {
     @Select("select cast(isnull(NULLIF(doctor_xz_yp, ''), 0) as int) + 1  from a_employee_mi with (NOLOCK) where code = #{code}")
     Integer huoQuYiShenDengJi(String code);
 
+    @Select("select cast(isnull(NULLIF(doctor_xz_yp, ''), 0) as int) + 1 as doctorLevel, " +
+            "       dept_code," +
+            "       code " +
+            "from a_employee_mi with (NOLOCK) " +
+            "where code = #{code} ")
+    UserInfo selectedUserInfoByCode(String code);
 
-    /**
-     * 出院带药数量
-     *
-     * @param patNo 住院号
-     * @param times 住院次数
-     * @return
-     */
-    @Select("select count(*) " +
-            "from yz_act_order with (NOLOCK) " +
-            "where inpatient_no = #{patNo} " +
-            "  and admiss_times = #{times} " +
-            "  and self_buy = '4' " +
-            "  and status_flag <> '6' ")
-    int obtainTheNumberOfDischargedDrugs(String patNo, Integer times);
 
     @Select("select day_800, day_830, day_900, " +
             "       day_930, day_1000, day_1030, day_1100, day_1130, day_1200, day_1230, day_1300, day_1330, " +
@@ -926,24 +919,6 @@ public interface YiZhuLuRuDao {
             "from yz_order_frequency where code = #{code}")
     Map<String, Short> numberOfTimesADay(String code);
 
-    /**
-     * 出院带药只能要这些给药方式
-     *
-     * @param code 编码
-     * @return 返回数量
-     */
-    @Select("select count(1) " +
-            "from (select b.charge_code, a.* " +
-            "      from yz_supply_type a " +
-            "               left join yz_supply_charge b on a.supply_code = b.supply_code) aa " +
-            "where charge_code is null and supply_code = #{code} ")
-    int dischargeWithMedicationAdministration(String code);
-
-
-    @Update("update yz_act_order set drug_quan = #{item.drugQuan}," +
-            "drug_occ = #{item.drugOcc} where act_order_no = #{item.actOrderNo} ")
-    void updateThePickup(@Param("item") XinZhenYzActOrder item);
-
     @Select("select rtrim(supply_code) code,rtrim(supply_name) name " +
             "from yz_supply_type with (NOLOCK) " +
             "where ps_flag in ('1', '0')")
@@ -1042,6 +1017,54 @@ public interface YiZhuLuRuDao {
             "</script>")
     List<XinZhenYzActOrder> huoQuXiangMuXinXi(Set<String> code);
 
+    @Select("select          b.order_code, " +
+            "                rtrim(c.name)                    order_name, " +
+            "                national_code, " +
+            "    kjyw_flag = 0, " +
+            "                cast(rtrim(isnull(nullif(c.del_flag, " +
+            "                                         ''), " +
+            "                                  0)) as int) as del_flag " +
+            "from yz_order_occurence b with (NOLOCK), " +
+            "     zd_charge_item c with (NOLOCK) " +
+            "where b.order_code = #{code} " +
+            "  and b.occ_code = c.code")
+    List<XinZhenYzActOrder> itemDataOne(String code);
+
+
+    @Select("select                 rtrim(code)                                            order_code, " +
+            "                       rtrim(a.serial)                                     as serial, " +
+            "                       rtrim(group_no)                                     as group_no, " +
+            "                       rtrim(name)                                            order_name, " +
+            "                       case infusion_flag " +
+            "                           when '1' then 'i' " +
+            "                           else " +
+            "                               (case " +
+            "                                    when rtrim(code) >= '30000' and rtrim(code) < " +
+            "                                                                    '50000' then 'z' " +
+            "                                    else 'd' end) end                      as drug_flag, " +
+            "                       mini_unit, " +
+            "                       isnull(weight, 1)                                      drug_weight, " +
+            "                       weigh_unit                                             drug_weight_unit, " +
+            "                       isnull(volum, 1)                                       drug_volume, " +
+            "                       vol_unit                                               drug_vol_unit, " +
+            "                       isnull(pack_size, 1)                                as pack_size, " +
+            "                       pack_unit, " +
+            "                       a.pack_retprice, " +
+            "                       national_code, " +
+            "                       cast(isnull(NULLIF(kjyw_flag, ''), 0) as int)       as kjyw_flag, " +
+            "                       cast(isnull(NULLIF(yp_level, ''), 0) as int)        as yp_level, " +
+            "                       cast(isnull(NULLIF(del_flag, ''), 0) as int)        as del_flag, " +
+            "                       CASE " +
+            "                           WHEN isnull(b.open_virtual2, '') = '1' then isnull(b.stock_amount_virtual2, 0) " +
+            "                           else isnull(stock_amount, 0) end                as stock_amount, " +
+            "                       cast(isnull(nullif(visible_flag_zy, ''), 0) as int) as visible_flag_zy, " +
+            "    deptRestrictions = (select count(1) from yp_zd_dept where code = yp_zd_dept.charge_code and dept_code = '${dept}') " +
+            "from yp_zd_dict a " +
+            "         with (NOLOCK) " +
+            "         left join yp_base_yf b on (code = b.charge_code and a.serial = b.serial) " +
+            "where rtrim(code) + rtrim(a.serial) + rtrim(group_no) = #{code} ")
+    XinZhenYzActOrder drugDataOne(String code, String dept);
+
     @Select("select          rtrim(inpatient_no) as inpatient_no, " +
             "                admiss_times, " +
             "                rtrim(name)         as name, " +

+ 5 - 0
src/main/java/thyyxxk/webserver/entity/login/UserInfo.java

@@ -132,6 +132,11 @@ public class UserInfo {
 
     private List<Integer> roles;
 
+    /**
+     * 医生用药等级
+     */
+    private Integer doctorLevel;
+
     /**
      * 医生兼职科室
      */

+ 8 - 0
src/main/java/thyyxxk/webserver/entity/zhuyuanyisheng/jianyanjiancha/YshYjReq.java

@@ -206,6 +206,14 @@ public class YshYjReq implements Serializable {
      */
     private String ybSelfFlag;
 
+    /**
+     * 确认人 id
+     */
+    private String confirmId;
+
+    private String confirmFlag;
+
+
     public String getReceiveFlagName() {
         if (receiveFlag == null) {
             return "";

+ 2 - 0
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/JianYanJianChaShenQingService.java

@@ -513,6 +513,8 @@ public class JianYanJianChaShenQingService {
             qw.like("order_name", param.getOrderName());
         }
 
+        qw.orderByDesc("act_order_no");
+
         List<YshYjReq> list = dao.huoQuJianYanV2(qw);
         return ResultVoUtil.success(list);
     }

+ 51 - 387
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/YiZhuLuRuServer.java

@@ -39,6 +39,8 @@ import thyyxxk.webserver.service.casefrontsheet.CaseFrontSheetMainService;
 import thyyxxk.webserver.service.externalhttp.DrgWebServices;
 import thyyxxk.webserver.service.heliyongyao.RationalUseServer;
 import thyyxxk.webserver.service.redislike.RedisLikeService;
+import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.Repel;
+import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.YiZhuCheckData;
 import thyyxxk.webserver.utils.*;
 
 import java.math.BigDecimal;
@@ -270,69 +272,44 @@ public class YiZhuLuRuServer {
         if (ListUtil.isBlank(yiZhuList)) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有需要确认的医嘱.");
         }
+        // 把错误的子医嘱更正回来
         correctSubOrders(param.getList());
-        // 药品 code
-        Set<String> yaoPingCode = new HashSet<>();
-        // 项目的 code
-        Set<String> xiangMuCode = new HashSet<>();
-
-        for (XinZhenYzActOrder item : yiZhuList) {
-            if (ITEM.equals(item.getSerial())) {
-                xiangMuCode.add(item.getOrderCode());
-            } else {
-                yaoPingCode.add(item.getOrderCode().trim() + item.getSerial().trim() + item.getGroupNo().trim());
-            }
-        }
 
         String userCode = TokenUtil.getTokenUserId();
         // 获取医生开药品的权限
-        Integer doctorLevel = dao.huoQuYiShenDengJi(userCode);
         XinZhenYiZhu patInfo = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
-        Map<String, XinZhenYzActOrder> drug = getDrugInformation(yaoPingCode, patInfo.getZkWard());
-        Map<String, List<XinZhenYzActOrder>> project = getProjectInformation(xiangMuCode);
 
         // 是否可以确认
-        boolean isThereAnyErrorMessage = false;
-        Map<String, Object> map = new HashMap<>();
         List<BigDecimal> confirmOrderInformation = new ArrayList<>();
 
-        Date excludeOrders = null;
-        BigDecimal orderNo = null;
+        YiZhuCheckData checkData = new YiZhuCheckData(dao);
+        checkData.init(yiZhuList, patInfo).judgeExclusion();
 
-        for (XinZhenYzActOrder item : yiZhuList) {
-            if (ITEM.equals(item.getSerial())) {
-                Integer paiChiYiZhu = dao.shiFouPaiChiYiZhu(item.getOrderCode());
-                if (excludeOrders != null) {
-                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "一次性不能确认多条全排斥医嘱。");
-                }
-                if (paiChiYiZhu != null && paiChiYiZhu.equals(1)) {
-                    excludeOrders = item.getStartTime();
-                    orderNo = item.getActOrderNo();
-                }
-            }
+        Map<String, Object> checkMap = checkData.startCheck((item) -> {
             confirmOrderInformation.add(item.getActOrderNo());
-            Map<String, Object> errorMessageMap = checkData(item, drug, project, patInfo, doctorLevel);
-            if (!errorMessageMap.isEmpty()) {
-                if (!isThereAnyErrorMessage && errorMessageMap.containsKey("error")) {
-                    isThereAnyErrorMessage = true;
-                }
-                errorMessageMap.put("data", item);
-                map.put(item.getId(), errorMessageMap);
-            }
+        });
+
+        if (checkData.multipleExclusions()) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "一次性不能确认多条全排斥医嘱。");
         }
 
-        if (isThereAnyErrorMessage) {
-            return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改错误的医嘱", map);
+        if (checkData.getFailed()) {
+            return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改错误的医嘱", checkMap);
         }
 
-        if (excludeOrders != null) {
-            int count = dao.thereAreUnexecutedOrders(param.getInpatientNo(), param.getAdmissTimes(), orderNo);
+        Repel repel = checkData.getRepel();
+
+        log.info("数据:{}", JSON.toJSONString(repel));
+
+        if (repel != null) {
+            int count = dao.thereAreUnexecutedOrders(param.getInpatientNo(), param.getAdmissTimes(), repel.getOrderNo());
             if (count > 0) {
                 return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "有未确认和未执行的长期医嘱,无法确认全排斥医嘱,请先确认其他医嘱。");
             }
-            dao.stopOrder(param.getInpatientNo(), param.getAdmissTimes(), excludeOrders, userCode, orderNo);
+            dao.stopOrder(param.getInpatientNo(), param.getAdmissTimes(), repel.getDate(), userCode, repel.getOrderNo());
         }
 
+
         for (BigDecimal decimal : confirmOrderInformation) {
             dao.confirmOrders(decimal, userCode, new Date());
         }
@@ -424,25 +401,17 @@ public class YiZhuLuRuServer {
                 return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医嘱录入人不是您,无法修改。");
             }
         }
-        // 获取医生开药品的权限
-        Integer doctorLevel = dao.huoQuYiShenDengJi(userCode);
         XinZhenYiZhu huanZheXinXi = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
         XinZhenYzActOrder data = param.getData();
         if (ITEM.equals(data.getSerial().trim())) {
             data.setGroupNo("00");
         }
-        // 药品的 code
-        Set<String> yaoPingCode = new HashSet<>();
-        // 项目的 code
-        Set<String> xiangMuCode = new HashSet<>();
-        if (ITEM.equals(data.getSerial())) {
-            xiangMuCode.add(data.getOrderCode());
-        } else {
-            yaoPingCode.add(data.getOrderCode().trim() + data.getSerial().trim() + data.getGroupNo().trim());
-        }
-        Map<String, XinZhenYzActOrder> drug = getDrugInformation(yaoPingCode, huanZheXinXi.getZkWard());
-        Map<String, List<XinZhenYzActOrder>> project = getProjectInformation(xiangMuCode);
-        Map<String, Object> errorMessageMap = checkData(data, drug, project, huanZheXinXi, doctorLevel);
+
+        YiZhuCheckData checkData = new YiZhuCheckData(dao);
+
+        Map<String, Object> errorMessageMap = checkData.init(data, huanZheXinXi)
+                .startCheck(null);
+
 
         if (data.getParentNo() != null) {
             XinZhenYzActOrder parentOrder = dao.getActOrderNoOne(data.getParentNo().stripTrailingZeros().toPlainString());
@@ -455,7 +424,7 @@ public class YiZhuLuRuServer {
         // 先删除转科在插入
         dao.deleteTransferOrder(param.getActOrderNo());
 
-        if (errorMessageMap.get("error") == null) {
+        if (checkData.getPassTheAudit()) {
             if (ZK_CODE.equals(data.getOrderCode())) {
                 ZyOrderZk transferData = new ZyOrderZk();
                 transferData
@@ -467,7 +436,7 @@ public class YiZhuLuRuServer {
                 dao.insertDoctorSOrder(transferData);
             }
             // 判断是不是抗菌药物
-            XinZhenYzActOrder kssItem = drug.get(data.getOrderCode().trim() + data.getSerial().trim() + data.getGroupNo().trim());
+            XinZhenYzActOrder kssItem = checkData.getDrugData(data.getOrderCode().trim() + data.getSerial().trim() + data.getGroupNo().trim());
             if (kssItem != null && kssItem.getKjywFlag() != null && kssItem.getKjywFlag() == 1) {
                 YzActRecordKss kss = new YzActRecordKss();
                 kss.setActOrderNo(data.getActOrderNo());
@@ -487,14 +456,8 @@ public class YiZhuLuRuServer {
             dao.howOftenTheSubPhysicianOrderIsModified(param.getData());
         }
 
-        if (!errorMessageMap.isEmpty()) {
-            Map<String, Object> map = new HashMap<>();
-            errorMessageMap.put("data", data);
-            map.put(param.getActOrderNo(), errorMessageMap);
-
-            if (errorMessageMap.containsKey("error")) {
-                return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", map);
-            }
+        if (checkData.getFailed()) {
+            return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", errorMessageMap);
         }
         log.info("医嘱录入日志:{}", JSON.toJSONString(param));
         return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "添加成功.");
@@ -902,21 +865,13 @@ public class YiZhuLuRuServer {
      * @param param 模板数据
      * @return 返回提示信息
      */
-    public ResultVo<Map<String, Object>> singleDataCheck(XinZhenYiZhu param) {
-        //  获取医生开药品的权限
-        Integer doctorLevel = dao.huoQuYiShenDengJi(TokenUtil.getTokenUserId());
-        Set<String> yaoPingCode = new HashSet<>();
-        Set<String> xiangMuCode = new HashSet<>();
-        for (XinZhenYzActOrder item : param.getList()) {
-            if (ITEM.equals(item.getSerial().trim())) {
-                xiangMuCode.add(item.getOrderCode().trim());
-            } else {
-                yaoPingCode.add(item.getOrderCode().trim() + item.getSerial().trim() + item.getGroupNo().trim());
-            }
-        }
-        Map<String, Object> errorMessage = checkData(param.getList().get(0), getDrugInformation(yaoPingCode, null), getProjectInformation(xiangMuCode), null, doctorLevel);
-        errorMessage.put("data", param.getList().get(0));
-        return ResultVoUtil.success(errorMessage);
+    public ResultVo<Object> singleDataCheck(XinZhenYiZhu param) {
+        param.getList().get(0).setActOrderNo(new BigDecimal(param.getList().get(0).getId()));
+        YiZhuCheckData checkData = new YiZhuCheckData(dao);
+        checkData.init(param.getList(), null);
+        Map<String, Object> errorMessage = checkData.startCheck(null);
+        Object map = errorMessage.get(param.getList().get(0).getId());
+        return ResultVoUtil.success(map);
     }
 
 
@@ -996,204 +951,6 @@ public class YiZhuLuRuServer {
         }
     }
 
-    private Map<String, Object> checkData(XinZhenYzActOrder item,
-                                          Map<String, XinZhenYzActOrder> drug,
-                                          Map<String, List<XinZhenYzActOrder>> project,
-                                          XinZhenYiZhu huanZheXinXi,
-                                          Integer doctorLevel) {
-        boolean strictVerification = huanZheXinXi != null;
-        List<String> errorMessage = new ArrayList<>();
-        List<String> warningMessage = new ArrayList<>();
-
-        if (StringUtil.isBlank(item.getGroupNo())) {
-            errorMessage.add("没有药房请重新开。");
-        }
-
-        if (redisLikeService.getDeptName(item.getExecUnit()) == null) {
-            errorMessage.add("执行科室有误,请检查。");
-        }
-
-        if (ITEM.equals(item.getSerial())) {
-            List<XinZhenYzActOrder> projectDetails = project.get(item.getOrderCode());
-            // 如果这个项目下面没有费用明细,那么这就是一条口头医,口头医嘱每次只能开一个
-            if (ListUtil.notBlank(projectDetails)) {
-                for (XinZhenYzActOrder detailed : projectDetails) {
-                    if (detailed.getDelFlag() == 1) {
-                        errorMessage.add(String.format("项目:【%s】,已经被物价停用了", detailed.getOrderName()));
-                    }
-                    if (StringUtil.isBlank(detailed.getNationalCode())) {
-                        warningMessage.add(String.format("项目:【%s】,没有匹配医保码", detailed.getOrderName()));
-                    }
-                }
-            }
-            item.setDrugOcc(item.getDrugQuan());
-        } else {
-            if (BigUtils.bigXiaoYu(item.getDose(), 0)) {
-                errorMessage.add(String.format("医嘱:【%s】,计量不能开负数", item.getOrderName()));
-            }
-
-            if (!groupList.contains(item.getGroupNo())) {
-                errorMessage.add("药房错误,请重新选择药房。");
-            }
-            XinZhenYzActOrder detailsOfDrugs = drug.get(item.getOrderCode().trim() + item.getSerial().trim() + item.getGroupNo().trim());
-            if (detailsOfDrugs != null) {
-                if (StringUtil.isBlank(item.getMiniUnit())) {
-                    if (item.getSerial().equals("01")) {
-                        item.setMiniUnit(detailsOfDrugs.getMiniUnit());
-                    } else {
-                        item.setMiniUnit(detailsOfDrugs.getPackUnit());
-                    }
-                }
-                if (detailsOfDrugs.getDelFlag() == 1) {
-                    errorMessage.add("药品已经被停用了,请联系药剂科");
-                }
-                if (detailsOfDrugs.getYpLevel() > doctorLevel) {
-                    errorMessage.add("您没有开此药品的权限");
-                }
-
-                if (StringUtil.isBlank(detailsOfDrugs.getNationalCode())) {
-                    warningMessage.add("该药品没有医保编码");
-                }
-                if (BigUtils.bigXiaoYu(detailsOfDrugs.getStockAmount(), 10)) {
-                    warningMessage.add(String.format("该药品剩余数量为:【%s】", detailsOfDrugs.getStockAmount().stripTrailingZeros().toPlainString()));
-                }
-                if (BigUtils.bigDaYu(item.getDrugQuan(), detailsOfDrugs.getStockAmount())) {
-                    errorMessage.add("药品领量大于药品的库存,当前库存量" + detailsOfDrugs.getStockAmount().stripTrailingZeros().toPlainString());
-                }
-                if (strictVerification) {
-                    if (detailsOfDrugs.getDeptRestrictions() > 0) {
-                        errorMessage.add("该药品禁止在患者所在的科室使用。");
-                    }
-                    if (detailsOfDrugs.getVisibleFlagZy() == 1) {
-                        errorMessage.add("该药品禁止住院患者使用。");
-                    }
-                    item.setKjywFlag(detailsOfDrugs.getKjywFlag());
-                    if (detailsOfDrugs.getKjywFlag() == 1) {
-                        if (item.getYyfs() == null) {
-                            errorMessage.add("请填写抗菌药物医嘱附注信息录入");
-                        } else if (item.getYyfs() == 1 || item.getYyfs() == 2) {
-                            if (item.getSsqk() == null) {
-                                errorMessage.add("当用药方式为 1 或 2 时,手术切口和用药时间不能为空");
-                            }
-                        }
-                    }
-                }
-                if (item.getSupplyCode() != null && 出院带药.equals(item.getSupplyCode())) {
-                    if (!ONCE.equals(item.getFrequCode())) {
-                        errorMessage.add("出院带药不能是长期医嘱。");
-                    }
-                    // 如果是临时医嘱 开了就结束了.
-//                    if ("ONCE".equals(item.getFrequCode())) {
-//                        item.setEndTime(item.getStartTime());
-//                    }
-//                    if (dao.dischargeWithMedicationAdministration(item.getSupplyCode()) == 0) {
-//                        errorMessage.add("出院带药给药方式不能包含费用。");
-//                    }
-//                    if (item.getStartTime() == null) {
-//                        errorMessage.add("出院带药请输入开始时间。");
-//                    }
-//                    if (item.getEndTime() == null) {
-//                        errorMessage.add("出院带药请输入结束时间。");
-//                    }
-                    item.setDrugOcc(item.getDrugQuan());
-                } else {
-                    // 计算普通药品的领量 durg_quan durg_occ
-                    calculateDrugAmount(item, detailsOfDrugs);
-                }
-
-            }
-        }
-
-        if (StringUtil.isBlank(item.getOrderCode())) {
-            errorMessage.add("项目编码不能为空");
-        }
-        if (StringUtil.isBlank(item.getOrderName())) {
-            errorMessage.add("项目名称不能为空");
-        }
-        if (StringUtil.isBlank(item.getExecUnit())) {
-            errorMessage.add("执行科室不能为空");
-        } else if (item.getExecUnit().startsWith("8")) {
-            errorMessage.add("执行科室不能选择为病区");
-        }
-
-        if (ZK_CODE.equals(item.getOrderCode())) {
-            if (StringUtil.isBlank(item.getZkWardCode())) {
-                errorMessage.add("转科病房不能为空");
-            }
-            if (StringUtil.isBlank(item.getZkDeptCode())) {
-                errorMessage.add("转科科室不能为空");
-            }
-        }
-
-        if (StringUtil.isBlank(item.getFrequCode())) {
-            errorMessage.add("频次不能为空");
-        }
-
-        // 药品的校验
-        if (!ITEM.equals(item.getSerial().trim())) {
-            if (StringUtil.isBlank(item.getDrugSpecification())) {
-                errorMessage.add("药品规格不能为空");
-            }
-            if (StringUtil.isBlank(item.getSupplyCode())) {
-                errorMessage.add("给药方式不能为空");
-            }
-            if (item.getDose() == null || BigUtils.dengYu(item.getDose(), 0)) {
-                errorMessage.add("一次计量不能为空");
-            }
-            if (StringUtil.isBlank(item.getDoseUnit())) {
-                errorMessage.add("计量单位不能为空");
-            }
-            if (StringUtil.isBlank(item.getSerial())) {
-                errorMessage.add("包装大小不能为空");
-            }
-        }
-
-        if (strictVerification) {
-            if (item.getParentNo() != null && item.getActOrderNo() != null) {
-                if (BigUtils.bigXiaoYu(item.getActOrderNo(), item.getParentNo())) {
-                    errorMessage.add("子医嘱的医嘱号,小于父医嘱号,无法成组。【原因如果子医嘱的医嘱号小于父医嘱,会导致打印乱码】");
-                }
-            }
-
-            UserInfo userInfo = redisLikeService.getUserInfoByCode(TokenUtil.getTokenUserId());
-
-            // 获取患者的入院时间
-            if (item.getOrderTime() == null) {
-                errorMessage.add("医嘱时间不能为空");
-            } else if (item.getStartTime() == null) {
-                errorMessage.add("开始时间不能为空");
-            } else if (huanZheXinXi.getAdmissDate() == null) {
-                errorMessage.add("没有查询到患者的入院时间");
-            } else if (DateUtil.shiJianDaXiao(item.getStartTime(), huanZheXinXi.getAdmissDate(), "<")) {
-                errorMessage.add("开始时间不能在患者入院之前,患者入院时间" + DateUtil.formatDatetime(huanZheXinXi.getAdmissDate()));
-            } else if (DateUtil.shiJianDaXiao(item.getStartTime(), item.getOrderTime(), "<") && !userInfo.getDeptCode().equals("1160000")) {
-                errorMessage.add("开始时间不能在开医嘱之前");
-            }
-
-            if (item.getEndTime() != null) {
-                if (ONCE.equals(item.getFrequCode().trim())) {
-                    item.setEndTime(null);
-                } else {
-                    if (DateUtil.shiJianDaXiao(item.getEndTime(), item.getStartTime(), "<")) {
-                        errorMessage.add("结束时间不能在开始时间之前");
-                    } else {
-                        item.setModifier(TokenUtil.getTokenUserId());
-                    }
-                }
-            } else {
-                item.setModifier(null);
-            }
-        }
-
-        Map<String, Object> map = new HashMap<>(Capacity.TWO);
-        if (ListUtil.notBlank(errorMessage)) {
-            map.put("error", errorMessage);
-        }
-        if (ListUtil.notBlank(warningMessage)) {
-            map.put("warning", warningMessage);
-        }
-        return map;
-    }
 
     public ResultVo<JSONObject> getFrequencyCount(String code) {
         // 计算出院带药的领量
@@ -1525,53 +1282,6 @@ public class YiZhuLuRuServer {
         return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "关联成功。");
     }
 
-
-    /**
-     * 批量检验医嘱是否正确
-     *
-     * @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);
-        // 合理用药校验
-
-        for (XinZhenYzActOrder item : list) {
-            if (ITEM.equals(item.getSerial())) {
-                xiangMuCode.add(item.getOrderCode());
-            } else {
-                yaoPingCode.add(item.getOrderCode().trim() + item.getSerial().trim() + item.getGroupNo().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 (!errorMessageMap.isEmpty()) {
-                if (errorMessageMap.get("error") != null) {
-                    errorMessageMap.put("data", item);
-                    returnMap.put(item.getId(), errorMessageMap);
-                }
-            }
-        }
-        return returnMap;
-    }
-
-
     /**
      * 确认出院带药医嘱
      *
@@ -1588,45 +1298,31 @@ public class YiZhuLuRuServer {
                 .eq("isnull(a.supply_code,'0')", 出院带药);
         XinZhenYiZhu patInfo = dao.queryPatientInfo(patNo, times);
         patInfo.setList(dao.selectOrderNo(qw));
+
+        if (ListUtil.isBlank(patInfo.getList())) {
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "未查询到医嘱。");
+        }
+
         String userCode = TokenUtil.getTokenUserId();
         // 出院带药需要生成药单 key 是不同的药房。不同的药房就要
-        Map<String, List<XinZhenYzActOrder>> takeTheMedicineList = new HashMap<>(Capacity.TWO);
 
-        for (XinZhenYzActOrder item : patInfo.getList()) {
-            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);
-            }
-        }
+        YiZhuCheckData checkData = new YiZhuCheckData(dao);
+        checkData.init(patInfo.getList(), patInfo);
+        Map<String, Object> map = checkData.startCheck(null);
 
-        Map<String, Object> check = batchVerification(patInfo.getList(), patInfo, true);
-        if (check.isEmpty()) {
-            List<Integer> pageNoList = new ArrayList<>();
-            for (int i = 0; i < takeTheMedicineList.size(); i++) {
-                pageNoList.add(publicServer.getTheDrugListNo());
-            }
-            sendAMessageToTheNurse(patInfo, userCode, dao.queryPatientInfo(patNo, times), "出院带药");
-            return getThis().getMapResultVo(patInfo, userCode, takeTheMedicineList, pageNoList);
+
+        if (checkData.getPassTheAudit()) {
+            sendAMessageToTheNurse(patInfo, userCode, patInfo, "出院带药");
+            return getThis().getMapResultVo(patInfo, userCode);
         } else {
-            return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", check);
+            return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", map);
         }
 
     }
 
     @NotNull
     @Transactional(rollbackFor = Exception.class)
-    public ResultVo<Map<String, Object>> getMapResultVo(XinZhenYiZhu patInfo, String userCode, Map<String, List<XinZhenYzActOrder>> takeTheMedicineList, List<Integer> pageNoList) {
-        // 根据不同的药房,生成不同的单子.
-//        int index = 0;
-//        for (Map.Entry<String, List<XinZhenYzActOrder>> entry : takeTheMedicineList.entrySet()) {
-//            Integer pageNo = pageNoList.get(index);
-//            dao.summarySheetOfDrugs(pageNo, patInfo, userCode, entry.getKey());
-//            dao.insertDetailedMedicineList(pageNo, patInfo, userCode, entry.getKey(), entry.getValue());
-//            index++;
-//        }
+    public ResultVo<Map<String, Object>> getMapResultVo(XinZhenYiZhu patInfo, String userCode) {
         for (XinZhenYzActOrder order : patInfo.getList()) {
             // 出院带药 确认了直接停止医嘱
             dao.takeMedicineAfterDischargeStopOrder(order.getActOrderNo(), userCode, new Date());
@@ -1634,38 +1330,6 @@ public class YiZhuLuRuServer {
         return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
     }
 
-    @Deprecated
-    public ResultVo<String> copyTheDoctorSOrder(BigDecimal orderNo, String deptCode) {
-        QueryWrapper<?> qw = new QueryWrapper<>();
-        qw.eq("a.act_order_no", orderNo);
-        List<XinZhenYzActOrder> yiZhuList = dao.selectOrderNo(qw);
-        if (ListUtil.isBlank(yiZhuList)) {
-            return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "原医嘱已经不存在了。");
-        }
-        XinZhenYzActOrder fatherOrder = yiZhuList.get(0);
-        QueryWrapper<?> childQw = new QueryWrapper<>();
-        childQw.eq("a.parent_no", fatherOrder.getActOrderNo());
-        List<XinZhenYzActOrder> childOrderList = dao.selectOrderNo(childQw);
-        UserInfo us = redisLikeService.getUserInfoByToken();
-        revertToTheDefaultState(fatherOrder, us, null);
-
-        List<XinZhenYzActOrder> addOrderList = new ArrayList<>();
-        setCopyExecUnit(fatherOrder, deptCode);
-        addOrderList.add(fatherOrder);
-
-        if (ListUtil.notBlank(childOrderList)) {
-            childOrderList.forEach(item -> {
-                setCopyExecUnit(item, deptCode);
-                revertToTheDefaultState(item, us, fatherOrder.getActOrderNo());
-                addOrderList.add(item);
-            });
-        }
-
-        XinZhenYiZhu patInfo = dao.queryPatientInfo(fatherOrder.getInpatientNo(), fatherOrder.getAdmissTimes());
-        getThis().insertATemplate(addOrderList, patInfo);
-        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "复制成功。");
-    }
-
     private void setCopyExecUnit(XinZhenYzActOrder v, String dept) {
         if (StringUtil.notBlank(dept)) {
             v.setExecUnit(dept);

+ 13 - 0
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/yizhuverify/Repel.java

@@ -0,0 +1,13 @@
+package thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class Repel {
+    private int count = 0;
+    private Date date;
+    private BigDecimal orderNo;
+}

+ 345 - 0
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/yizhuverify/YiZhuCheckData.java

@@ -0,0 +1,345 @@
+package thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify;
+
+import lombok.extern.slf4j.Slf4j;
+import thyyxxk.webserver.constants.Capacity;
+import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
+import thyyxxk.webserver.entity.login.UserInfo;
+import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYiZhu;
+import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYzActOrder;
+import thyyxxk.webserver.utils.*;
+
+import java.util.*;
+import java.util.function.Consumer;
+
+@Slf4j
+public class YiZhuCheckData {
+    private final YiZhuLuRuDao dao;
+    /**
+     * 医嘱数组
+     */
+    private List<XinZhenYzActOrder> list;
+    /**
+     * 药品
+     */
+    private final CacheOnce<XinZhenYzActOrder> drug = new CacheOnce<>();
+    /**
+     * 项目
+     */
+    private final CacheOnce<List<XinZhenYzActOrder>> project = new CacheOnce<>();
+    private XinZhenYiZhu patientInformation;
+    private Boolean strictVerification = false;
+    /**
+     * 错误信息
+     */
+    List<String> errorMessage = new ArrayList<>();
+    /**
+     * 警告信息
+     */
+    List<String> warningMessage = new ArrayList<>();
+    Map<String, Object> returnMap = new HashMap<>();
+    private UserInfo userInfo;
+    private Boolean passTheAudit = true;
+    private final List<String> groupList = Arrays.asList("71", "73");
+    private Repel repel = null;
+
+    private String ONCE = "ONCE";
+
+
+    public YiZhuCheckData(YiZhuLuRuDao dao) {
+        this.dao = dao;
+    }
+
+    public YiZhuCheckData init(List<XinZhenYzActOrder> list, XinZhenYiZhu patientInformation) {
+        userInfo = dao.selectedUserInfoByCode(TokenUtil.getTokenUserId());
+        this.list = list;
+        this.patientInformation = patientInformation;
+        strictVerification = patientInformation != null;
+        return this;
+    }
+
+    public YiZhuCheckData init(XinZhenYzActOrder orderData, XinZhenYiZhu patientInformation) {
+        List<XinZhenYzActOrder> temp = new ArrayList<>();
+        temp.add(orderData);
+        init(temp, patientInformation);
+        return this;
+    }
+
+    public void judgeExclusion() {
+        repel = new Repel();
+    }
+
+    public Map<String, Object> startCheck(Consumer<XinZhenYzActOrder> action) {
+
+        for (XinZhenYzActOrder item : list) {
+            clearErrorMessage();
+            if (strictVerification) {
+                strictVerificationFunc(item);
+            }
+            publicCheck(item);
+            String ITEM = "00";
+            if (item.getSerial().equals(ITEM)) {
+                itemCheck(item);
+            } else {
+                drugCheck(item);
+            }
+            if (action != null) {
+                action.accept(item);
+            }
+            setReturnMap(item.getActOrderNo().stripTrailingZeros().toPlainString());
+        }
+
+        return getReturnMap();
+    }
+
+    /**
+     * 公共校验
+     *
+     * @param item 医嘱
+     */
+    private void publicCheck(XinZhenYzActOrder item) {
+        if (StringUtil.isBlank(item.getOrderCode())) {
+            errorMessage.add("项目编码不能为空");
+        }
+        if (StringUtil.isBlank(item.getOrderName())) {
+            errorMessage.add("项目名称不能为空");
+        }
+        if (StringUtil.isBlank(item.getExecUnit())) {
+            errorMessage.add("执行科室不能为空");
+        } else if (item.getExecUnit().startsWith("8")) {
+            errorMessage.add("执行科室不能选择为病区");
+        }
+
+        if (StringUtil.isBlank(item.getFrequCode())) {
+            errorMessage.add("频次不能为空");
+        }
+
+    }
+
+    private void itemCheck(XinZhenYzActOrder item) {
+        List<XinZhenYzActOrder> projectDetails = project.get(item.getOrderCode(), dao::itemDataOne);
+        String ZK_CODE = "06286";
+        if (ZK_CODE.equals(item.getOrderCode())) {
+            if (StringUtil.isBlank(item.getZkWardCode())) {
+                errorMessage.add("转科病房不能为空");
+            }
+            if (StringUtil.isBlank(item.getZkDeptCode())) {
+                errorMessage.add("转科科室不能为空");
+            }
+        }
+        // 如果这个项目下面没有费用明细,那么这就是一条口头医,口头医嘱每次只能开一个
+        if (ListUtil.notBlank(projectDetails)) {
+            for (XinZhenYzActOrder detailed : projectDetails) {
+                if (detailed.getDelFlag() == 1) {
+                    errorMessage.add(String.format("项目:【%s】,已经被物价停用了", detailed.getOrderName()));
+                }
+                if (StringUtil.isBlank(detailed.getNationalCode())) {
+                    warningMessage.add(String.format("项目:【%s】,没有匹配医保码", detailed.getOrderName()));
+                }
+            }
+        }
+
+        if (repel != null) {
+            Integer paiChiYiZhu = dao.shiFouPaiChiYiZhu(item.getOrderCode());
+
+            if (paiChiYiZhu != null && paiChiYiZhu.equals(1)) {
+                repel.setCount(repel.getCount() + 1);
+                repel.setOrderNo(item.getActOrderNo());
+                repel.setDate(item.getStartTime());
+            }
+
+        }
+        item.setDrugOcc(item.getDrugQuan());
+    }
+
+    private void drugCheck(XinZhenYzActOrder item) {
+        String key = item.getOrderCode().trim() + item.getSerial().trim() + item.getGroupNo().trim();
+        XinZhenYzActOrder detailsOfDrugs = getDrugData(key);
+        if (StringUtil.isBlank(item.getGroupNo())) {
+            errorMessage.add("没有药房请重新开。");
+        }
+
+        if (BigUtils.bigXiaoYu(item.getDose(), 0)) {
+            errorMessage.add(String.format("医嘱:【%s】,计量不能开负数", item.getOrderName()));
+        }
+
+        if (!groupList.contains(item.getGroupNo())) {
+            errorMessage.add("药房错误,请重新选择药房。");
+        }
+
+        if (detailsOfDrugs == null) {
+            return;
+        }
+
+        if (StringUtil.isBlank(item.getMiniUnit())) {
+            if (item.getSerial().equals("01")) {
+                item.setMiniUnit(detailsOfDrugs.getMiniUnit());
+            } else {
+                item.setMiniUnit(detailsOfDrugs.getPackUnit());
+            }
+        }
+        if (detailsOfDrugs.getDelFlag() == 1) {
+            errorMessage.add("药品已经被停用了,请联系药剂科");
+        }
+        if (detailsOfDrugs.getYpLevel() > userInfo.getDoctorLevel()) {
+            errorMessage.add("您没有开此药品的权限");
+        }
+
+        if (StringUtil.isBlank(detailsOfDrugs.getNationalCode())) {
+            warningMessage.add("该药品没有医保编码");
+        }
+        if (BigUtils.bigXiaoYu(detailsOfDrugs.getStockAmount(), 10)) {
+            warningMessage.add(String.format("该药品剩余数量为:【%s】", detailsOfDrugs.getStockAmount().stripTrailingZeros().toPlainString()));
+        }
+        if (BigUtils.bigDaYu(item.getDrugQuan(), detailsOfDrugs.getStockAmount())) {
+            errorMessage.add("药品领量大于药品的库存,当前库存量" + detailsOfDrugs.getStockAmount().stripTrailingZeros().toPlainString());
+        }
+        if (strictVerification) {
+            if (detailsOfDrugs.getDeptRestrictions() > 0) {
+                errorMessage.add("该药品禁止在患者所在的科室使用。");
+            }
+            if (detailsOfDrugs.getVisibleFlagZy() == 1) {
+                errorMessage.add("该药品禁止住院患者使用。");
+            }
+            item.setKjywFlag(detailsOfDrugs.getKjywFlag());
+            if (detailsOfDrugs.getKjywFlag() == 1) {
+                if (item.getYyfs() == null) {
+                    errorMessage.add("请填写抗菌药物医嘱附注信息录入");
+                } else if (item.getYyfs() == 1 || item.getYyfs() == 2) {
+                    if (item.getSsqk() == null) {
+                        errorMessage.add("当用药方式为 1 或 2 时,手术切口和用药时间不能为空");
+                    }
+                }
+            }
+        }
+        String 出院带药 = "007";
+        if (item.getSupplyCode() != null && 出院带药.equals(item.getSupplyCode())) {
+            if (!ONCE.equals(item.getFrequCode())) {
+                errorMessage.add("出院带药不能是长期医嘱。");
+            }
+            item.setDrugOcc(item.getDrugQuan());
+        } else {
+            // 计算普通药品的领量 durg_quan durg_occ
+            calculateDrugAmount(item, detailsOfDrugs);
+        }
+
+        if (StringUtil.isBlank(item.getDrugSpecification())) {
+            errorMessage.add("药品规格不能为空");
+        }
+        if (StringUtil.isBlank(item.getSupplyCode())) {
+            errorMessage.add("给药方式不能为空");
+        }
+        if (item.getDose() == null || BigUtils.dengYu(item.getDose(), 0)) {
+            errorMessage.add("一次计量不能为空");
+        }
+        if (StringUtil.isBlank(item.getDoseUnit())) {
+            errorMessage.add("计量单位不能为空");
+        }
+        if (StringUtil.isBlank(item.getSerial())) {
+            errorMessage.add("包装大小不能为空");
+        }
+
+    }
+
+    private void strictVerificationFunc(XinZhenYzActOrder item) {
+        if (item.getParentNo() != null && item.getActOrderNo() != null) {
+            if (BigUtils.bigXiaoYu(item.getActOrderNo(), item.getParentNo())) {
+                errorMessage.add("子医嘱的医嘱号,小于父医嘱号,无法成组。【原因如果子医嘱的医嘱号小于父医嘱,会导致打印乱码】");
+            }
+        }
+
+        // 获取患者的入院时间
+        if (item.getOrderTime() == null) {
+            errorMessage.add("医嘱时间不能为空");
+        } else if (item.getStartTime() == null) {
+            errorMessage.add("开始时间不能为空");
+        } else if (patientInformation.getAdmissDate() == null) {
+            errorMessage.add("没有查询到患者的入院时间");
+        } else if (DateUtil.shiJianDaXiao(item.getStartTime(), patientInformation.getAdmissDate(), "<")) {
+            errorMessage.add("开始时间不能在患者入院之前,患者入院时间" + DateUtil.formatDatetime(patientInformation.getAdmissDate()));
+        } else if (DateUtil.shiJianDaXiao(item.getStartTime(), item.getOrderTime(), "<") && !userInfo.getDeptCode().equals("1160000")) {
+            errorMessage.add("开始时间不能在开医嘱之前");
+        }
+
+        if (item.getEndTime() != null) {
+            if (ONCE.equals(item.getFrequCode().trim())) {
+                item.setEndTime(null);
+            } else {
+                if (DateUtil.shiJianDaXiao(item.getEndTime(), item.getStartTime(), "<")) {
+                    errorMessage.add("结束时间不能在开始时间之前");
+                } else {
+                    item.setModifier(TokenUtil.getTokenUserId());
+                }
+            }
+        } else {
+            item.setModifier(null);
+        }
+    }
+
+
+    public XinZhenYzActOrder getDrugData(String code) {
+        return drug.get(code, (temp) -> dao.drugDataOne(temp, patientInformation != null ? patientInformation.getZkWard() : ""));
+    }
+
+
+    private void calculateDrugAmount(XinZhenYzActOrder item, XinZhenYzActOrder feiYongXinXi) {
+        if (feiYongXinXi == null) {
+            return;
+        }
+        item.setDrugWeight(feiYongXinXi.getDrugWeight());
+        item.setDrugWeightUnit(feiYongXinXi.getDrugWeightUnit());
+
+        item.setDrugVolume(feiYongXinXi.getDrugVolume());
+        item.setDrugVolUnit(feiYongXinXi.getDrugWeightUnit());
+
+        if (StringUtil.notBlank(feiYongXinXi.getDrugWeightUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getDrugWeightUnit().trim())) {
+            item.setDrugOcc(DecimalUtil.divide(item.getDose(), feiYongXinXi.getDrugWeight(), 2));
+        } else if (StringUtil.notBlank(feiYongXinXi.getDrugVolUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getDrugVolUnit())) {
+            item.setDrugOcc(DecimalUtil.divide(item.getDose(), feiYongXinXi.getDrugVolume(), 2));
+        } else if (StringUtil.notBlank(feiYongXinXi.getPackUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getPackUnit())) {
+            item.setDrugOcc(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize(), 2));
+        }
+    }
+
+
+    private void clearErrorMessage() {
+        errorMessage.clear();
+        warningMessage.clear();
+    }
+
+    private void setReturnMap(String orderNo) {
+        Map<String, Object> map = new HashMap<>(Capacity.TWO);
+        if (ListUtil.notBlank(errorMessage)) {
+            map.put("error", errorMessage);
+            passTheAudit = false;
+        }
+        if (ListUtil.notBlank(warningMessage)) {
+            map.put("warning", warningMessage);
+        }
+
+        returnMap.put(orderNo, map);
+    }
+
+    private Map<String, Object> getReturnMap() {
+        return returnMap;
+    }
+
+    public Boolean getPassTheAudit() {
+        return passTheAudit;
+    }
+
+    public Boolean getFailed() {
+        return !passTheAudit;
+    }
+
+    public Repel getRepel() {
+        return repel;
+    }
+
+    public Boolean multipleExclusions() {
+        if (repel == null) {
+            return false;
+        }
+        return repel.getCount() > 1;
+    }
+
+}

+ 6 - 0
src/main/java/thyyxxk/webserver/text/CallBack.java

@@ -0,0 +1,6 @@
+package thyyxxk.webserver.text;
+
+public interface CallBack {
+
+    void callback(String str);
+}

+ 16 - 0
src/main/java/thyyxxk/webserver/text/Person.java

@@ -0,0 +1,16 @@
+package thyyxxk.webserver.text;
+
+
+public class Person implements CallBack {
+    @Override
+    public void callback(String str) {
+        System.out.println(str);
+    }
+
+
+    public void fun() {
+        for (int i = 0; i < 10; i++) {
+            callback("asd");
+        }
+    }
+}

+ 11 - 0
src/main/java/thyyxxk/webserver/text/Text.java

@@ -0,0 +1,11 @@
+package thyyxxk.webserver.text;
+
+public class Text {
+
+    public static void main(String[] args) {
+        Person p = new Person();
+
+        p.fun();
+
+    }
+}