Browse Source

出院带药领量优化

DESKTOP-0GD05B0\Administrator 2 years ago
parent
commit
d9d80084b3

+ 36 - 23
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyisheng/YiZhuLuRuDao.java

@@ -485,6 +485,16 @@ public interface YiZhuLuRuDao {
             " where act_order_no = #{decimal} ")
     void confirmOrders(BigDecimal decimal, String userCode, Date confirmDate);
 
+
+    @Update("update yz_act_order " +
+            "set confirm_time = #{confirmDate}, " +
+            "    signer       = #{userCode}, " +
+            "    status_time  = #{confirmDate}, " +
+            "    status_flag  = '5'," +
+            "    modifier     = #{userCode} " +
+            " where act_order_no = #{decimal} ")
+    void takeMedicineAfterDischargeStopOrder(BigDecimal decimal, String userCode, Date confirmDate);
+
     @Delete("delete yz_act_record_kss where act_order_no =#{orderNo}; " +
             "delete zy_order_zk where act_order_no =#{orderNo};" +
             "delete op_record where inpatient_no = #{patNo} and act_order_no =#{orderNo};" +
@@ -718,16 +728,17 @@ public interface YiZhuLuRuDao {
             "from yz_act_order with (NOLOCK) " +
             "where inpatient_no = #{patNo} " +
             "  and admiss_times = #{times} " +
-            "  and self_buy = '4' ")
+            "  and self_buy = '4' " +
+            "  and status_flag <> '6' ")
     int obtainTheNumberOfDischargedDrugs(String patNo, Integer times);
 
-    @Select("select day_800, day_830, day_900,\n" +
-            "       day_930, day_1000, day_1030, day_1100, day_1130, day_1200, day_1230, day_1300, day_1330,\n" +
-            "       day_1400, day_1430, day_1500, day_1530, day_1600, day_1630, day_1700, day_1730,\n" +
-            "       day_1800, day_1830, day_1900, day_1930, day_2000, day_2030, day_2100, day_2130,\n" +
-            "       day_2200, day_2230, day_2300, day_2330, day_2400, day_030, day_100, day_130, day_200,\n" +
-            "       day_230, day_300, day_330, day_400, day_430, day_500, day_530, day_600, day_630,\n" +
-            "       day_700, day_730\n" +
+    @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, " +
+            "       day_1400, day_1430, day_1500, day_1530, day_1600, day_1630, day_1700, day_1730, " +
+            "       day_1800, day_1830, day_1900, day_1930, day_2000, day_2030, day_2100, day_2130, " +
+            "       day_2200, day_2230, day_2300, day_2330, day_2400, day_030, day_100, day_130, day_200, " +
+            "       day_230, day_300, day_330, day_400, day_430, day_500, day_530, day_600, day_630, " +
+            "       day_700, day_730 " +
             "from yz_order_frequency where code = #{code}")
     Map<String, Short> numberOfTimesADay(String code);
 
@@ -737,10 +748,10 @@ public interface YiZhuLuRuDao {
      * @param code 编码
      * @return 返回数量
      */
-    @Select("select count(1)\n" +
-            "from (select b.charge_code, a.*\n" +
-            "      from yz_supply_type a\n" +
-            "               left join yz_supply_charge b on a.supply_code = b.supply_code) aa\n" +
+    @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);
 
@@ -766,11 +777,11 @@ public interface YiZhuLuRuDao {
     List<GetDropdownBox> huoQuGeiYaoFangShi(String code);
 
 
-    @Select("select rtrim(supply_code) code, rtrim(supply_name) name\n" +
-            "from (select b.charge_code, a.*\n" +
-            "      from yz_supply_type a\n" +
-            "               left join yz_supply_charge b on a.supply_code = b.supply_code) aa\n" +
-            "where charge_code is null\n" +
+    @Select("select rtrim(supply_code) code, rtrim(supply_name) name " +
+            "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 (py_code like #{code} or d_code like #{code} or supply_name like #{code} or supply_code like #{code})")
     List<GetDropdownBox> getCostFreeDosing(String code);
 
@@ -808,11 +819,13 @@ public interface YiZhuLuRuDao {
             "       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,  " +
-            "       stock_amount," +
+            "       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) " +
+            " left join yp_base_yf b on ( code = b.charge_code and  a.serial = b.serial) " +
             "where rtrim(code) + rtrim(a.serial) in " +
             "<foreach collection='code' item='item' index='index' open='(' close=')' separator=','>" +
             "#{item}" +
@@ -1568,10 +1581,10 @@ public interface YiZhuLuRuDao {
 
     @Insert("<script>" +
             "insert into yz_yp_zy_order (inpatient_no, admiss_times, name, bed_no, dept_code, ward_code, charge_code, " +
-            "  amount, retprice/*药品的单价*/, charge_date, infant_flag, drawer, always_flag, status_flag/*1*/, drug_class,\n" +
-            " serail/*0*/,\n" +
-            " occ_time, act_order_no, page_no, pay_self/*0*/, serial/*serial*/,\n" +
-            " group_no, doctor_name, page_class)\n" +
+            "  amount, retprice/*药品的单价*/, charge_date, infant_flag, drawer, always_flag, status_flag/*1*/, drug_class, " +
+            " serail/*0*/, " +
+            " occ_time, act_order_no, page_no, pay_self/*0*/, serial/*serial*/, " +
+            " group_no, doctor_name, page_class) " +
             "values " +
             "<foreach collection='list' item='item' separator=','>" +
             "(#{patInfo.inpatientNo},#{patInfo.admissTimes},#{patInfo.name},#{patInfo.bedNo},#{patInfo.deptCode},#{patInfo.wardCode},#{item.orderCode}," +

+ 3 - 1
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/CaoYaoYiZhuServer.java

@@ -201,7 +201,7 @@ public class CaoYaoYiZhuServer {
         if (cy == null) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有查询到原来的信息。");
         }
-        if (!cy.getStatusFlag().trim().equals("1")) {
+        if (!"1".equals(cy.getStatusFlag().trim())) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该草药无法删除。");
         }
         log.info("删除草药==》操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONStringWithDateFormat(cy, GetDateFormat.DATE_TIME));
@@ -209,4 +209,6 @@ public class CaoYaoYiZhuServer {
         return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
     }
 
+
+
 }

+ 0 - 1
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/EmrServer.java

@@ -86,7 +86,6 @@ public class EmrServer {
 
     private static void emrArrToTree(JSONArray data, List<JSONObject> tree) {
         Map<String, JSONObject> map = new HashMap<>(data.size());
-
         for (int i = 0; i < data.size(); i++) {
             JSONObject item = data.getJSONObject(i);
             if (item.get("parent") == null) {

+ 33 - 26
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/YiZhuLuRuServer.java

@@ -34,9 +34,9 @@ import thyyxxk.webserver.service.redislike.RedisLikeService;
 import thyyxxk.webserver.utils.*;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * <p>
@@ -65,6 +65,8 @@ public class YiZhuLuRuServer {
      */
     private final String ZK_CODE = "06286";
     private final String ONCE = "ONCE";
+    private final int 出院带药限制天数 = 15;
+    private final int 出院带药限制数量 = 4;
 
     private final String ITEM = "00";
     private final String SMALL_PACKAGE = "01";
@@ -545,23 +547,22 @@ public class YiZhuLuRuServer {
     @Transactional(rollbackFor = Exception.class)
     public ResultVo<String> voidOrders(String orderNo, String reasonForCancellation) {
         XinZhenYzActOrder yz = dao.getActOrderNoOne(orderNo);
-
         if (yz == null) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "原医嘱找不到了。");
         }
-
         if ("6".equals(yz.getStatusFlag())) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医嘱已作废了。");
         }
-
         UserInfo userInfo = redisLikeService.getUserInfoByToken();
-
         if (!DateUtil.within24Hours(yz.getStartTime())) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "只能对24小时内的医嘱进行作废处理");
         }
 
         List<String> list = dao.getTheDoctorSDepartment(userInfo.getDeptCode());
         list.add(userInfo.getDeptCode());
+        if (publicServer.needRule(1)) {
+            list.add(yz.getWardCode());
+        }
 
         if (!list.contains(yz.getWardCode())) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "非本科室开的医嘱不可作废");
@@ -576,9 +577,9 @@ public class YiZhuLuRuServer {
         // 患者最大的 detail_sn
         int maxDetailSn = publicServer.getMaxDetailSn(yz.getInpatientNo(), yz.getAdmissTimes());
         dao.cancelMedicalTechnologyAssuranceFee(TokenUtil.getTokenUserId(), orderNo, yz.getInpatientNo(), yz.getAdmissTimes());
-
         // 如果是药品的话就需要自动退费
         if (!yz.getSerial().equals(ITEM)) {
+            // 获取父子医嘱同时退费
             List<String> parentNoList = dao.getParentChildOrders(orderNo);
             parentNoList.add(orderNo);
             List<ZyDetailCharge> feeList = dao.getExpenseData(yz.getInpatientNo(), yz.getAdmissTimes(), parentNoList);
@@ -927,7 +928,12 @@ public class YiZhuLuRuServer {
             }
             item.setDrugOcc(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize(), 2));
         }
+    }
 
+    public static void main(String[] args) {
+        BigDecimal a = new BigDecimal("1");
+        BigDecimal b = new BigDecimal("0.2");
+        System.out.println(DecimalUtil.divide(a, b));
     }
 
     private Map<String, Object> checkData(XinZhenYzActOrder item, Map<String, XinZhenYzActOrder> drug, Map<String, List<XinZhenYzActOrder>> project, XinZhenYiZhu huanZheXinXi, Integer 医生级别) {
@@ -961,9 +967,12 @@ public class YiZhuLuRuServer {
                 if (StringUtil.isBlank(feiYongXinXi.getNationalCode())) {
                     警告信息.add("该药品没有医保编码");
                 }
-                if (feiYongXinXi.getStockAmount() != null && BigUtils.bigXiaoYu(feiYongXinXi.getStockAmount(), 10)) {
+                if (BigUtils.bigXiaoYu(feiYongXinXi.getStockAmount(), 10)) {
                     警告信息.add(String.format("该药品剩余数量为:【%s】", feiYongXinXi.getStockAmount().stripTrailingZeros().toPlainString()));
                 }
+                if (BigUtils.bigDaYu(item.getDrugQuan(), feiYongXinXi.getStockAmount())) {
+                    错误信息.add("药品领量大于药品的库存,当前库存量" + feiYongXinXi.getStockAmount().stripTrailingZeros().toPlainString());
+                }
                 if (严格校验) {
                     if (feiYongXinXi.getDeptRestrictions() > 0) {
                         错误信息.add("该药品禁止在患者所在的科室使用。");
@@ -1001,24 +1010,23 @@ public class YiZhuLuRuServer {
                         long cha = item.getEndTime().getTime() - item.getStartTime().getTime();
                         long nd = 1000 * 24 * 60 * 60;
                         day = (int) (cha / nd);
-                        if (day > 15) {
+                        if (day > 出院带药限制天数) {
                             错误信息.add("出院带药天数不得超过 15 天,计算方式结束时间减去开始时间。");
                         }
                     }
                     BigDecimal total = getTotal(item, day);
                     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));
-
+                        item.setDrugQuan(DecimalUtil.multiply(item.getDose(), total).divide(feiYongXinXi.getDrugWeight(), 0, RoundingMode.UP));
+                        item.setDrugOcc(item.getDrugQuan());
                     } 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));
+                        item.setDrugQuan(DecimalUtil.multiply(item.getDose(), total).divide(feiYongXinXi.getDrugVolume(), 0, RoundingMode.UP));
+                        item.setDrugOcc(item.getDrugQuan());
                     } else if (StringUtil.notBlank(feiYongXinXi.getPackUnit()) && item.getDoseUnit().trim().equals(feiYongXinXi.getPackUnit())) {
                         if (new BigDecimal(item.getDose().intValue()).compareTo(item.getDose()) != 0) {
                             错误信息.add("已经是最小单位了请不要带小数点");
                         }
-                        item.setDrugOcc(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize(), 2), total));
-                        item.setDrugQuan(DecimalUtil.multiply(DecimalUtil.divide(item.getDose(), feiYongXinXi.getPackSize()), total));
+                        item.setDrugQuan(DecimalUtil.multiply(item.getDose(), total).divide(feiYongXinXi.getPackSize(), 0, RoundingMode.UP));
+                        item.setDrugOcc(item.getDrugQuan());
                     }
                 } else {
                     // 计算普通药品的领量 durg_quan durg_occ
@@ -1118,7 +1126,7 @@ public class YiZhuLuRuServer {
     private BigDecimal getTotal(XinZhenYzActOrder item, int day) {
         // 计算出院带药的领量
         Map<String, Short> numberOfTimesADay = dao.numberOfTimesADay(item.getFrequCode());
-        int times = 1;
+        int times = 0;
         for (Map.Entry<String, Short> entry : numberOfTimesADay.entrySet()) {
             if (entry.getValue() != null) {
                 times += entry.getValue();
@@ -1566,7 +1574,7 @@ public class YiZhuLuRuServer {
                 .eq("isnull(a.self_buy,'0')", "4");
         XinZhenYiZhu patInfo = dao.huoQuHuanZheXinXi(patNo, times);
         patInfo.setList(dao.huoQuYiZhuShuJu(qw));
-        if (dao.obtainTheNumberOfDischargedDrugs(patNo, times) > 4) {
+        if (dao.obtainTheNumberOfDischargedDrugs(patNo, times) > 出院带药限制数量) {
             return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "出院带药医嘱不得超过 4 种,且不得超过 15 天。");
         }
         String userCode = TokenUtil.getTokenUserId();
@@ -1588,15 +1596,14 @@ public class YiZhuLuRuServer {
             // 计算出院带药的领量
             BigDecimal total = getTotal(item, day);
             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));
-
+                item.setDrugQuan(DecimalUtil.multiply(item.getDose(), total).divide(feiYongXinXi.getDrugWeight(), 0, RoundingMode.UP));
+                item.setDrugOcc(item.getDrugQuan());
             } 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));
+                item.setDrugQuan(DecimalUtil.multiply(item.getDose(), total).divide(feiYongXinXi.getDrugVolume(), 0, RoundingMode.UP));
+                item.setDrugOcc(item.getDrugQuan());
             } 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));
+                item.setDrugQuan(DecimalUtil.multiply(item.getDose(), total).divide(feiYongXinXi.getPackSize(), 0, RoundingMode.UP));
+                item.setDrugOcc(item.getDrugQuan());
             }
             // 在这里更新出院带药领量
             dao.updateThePickup(item);
@@ -1615,8 +1622,8 @@ public class YiZhuLuRuServer {
         Map<String, Object> check = batchVerification(patInfo.getList(), patInfo, true);
         if (check.isEmpty()) {
             for (XinZhenYzActOrder order : patInfo.getList()) {
-                // 确认医嘱
-                dao.confirmOrders(order.getActOrderNo(), userCode, new Date());
+                // 出院带药 确认了直接停止医嘱
+                dao.takeMedicineAfterDischargeStopOrder(order.getActOrderNo(), userCode, new Date());
             }
             // 生成药单
             dischargeMedicineList(takeTheMedicineList, patInfo);