Explorar o código

系统自动匹配退费。

xiaochan %!s(int64=3) %!d(string=hai) anos
pai
achega
788e57c0b8

+ 86 - 84
src/main/java/thyyxxk/webserver/service/yibao/XiangMuLuRuService.java

@@ -20,7 +20,10 @@ import thyyxxk.webserver.utils.*;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -452,89 +455,89 @@ public class XiangMuLuRuService {
         inpatientNo = publicServer.getInpatientNo(inpatientNo);
         Integer ledgerSn = publicServer.getLedgerSn(inpatientNo, admissTimes);
 
-//        // 获取正的医嘱费用
-//        List<ZyDetailCharge> getYiZhuFeiYongZhenShu = dao.getYiZhuFeiYong(inpatientNo, admissTimes, ledgerSn, ">", infantFlag);
-//        // 获取负的医嘱费用
-//        List<ZyDetailCharge> getYiZhuFeiYongFuShu = dao.getYiZhuFeiYong(inpatientNo, admissTimes, ledgerSn, "<", infantFlag);
-//        // 获取负数的退费数据 主要是用来判断 这一条正的是否退费了。
-//        List<ZyDetailCharge> tuiFeiList = dao.tuiFeiList(inpatientNo, admissTimes, infantFlag);
-//        if (!tuiFeiList.isEmpty()) {
-//            Map<Integer, Integer> map = new HashMap<>();
-//            for (ZyDetailCharge zyDetailCharge : tuiFeiList) {
-//                map.put(zyDetailCharge.getOriDetailSn(), zyDetailCharge.getDetailSn());
-//            }
-//            getYiZhuFeiYongZhenShu.forEach(item -> {
-//                if (map.containsKey(item.getDetailSn())) {
-//                    item.setTuiFeiFlag(1);
-//                }
-//            });
-//        }
-//        // 需要保存需要匹配的一些流水数据
-//        List<ZyDetailCharge> piPei = new ArrayList<>();
-//        // 此处是需要二次匹配的 list
-//        List<ZyDetailCharge> erCiPiPei = new ArrayList<>();
-//        // 用map 来保存正数的信息,但是有可能匹配的条件中map 的 key会一致 所以在这里使用 java8 的新特性 stream 流来进行分组 这样就不会因为key 一样导致数据被覆盖了
-//        // 第一次 匹配 根据 医嘱号 收费时间 项目编码 数量 账页号
-//        Map<String, List<ZyDetailCharge>> zhenShuMap = getYiZhuFeiYongZhenShu.stream().collect(
-//                Collectors.groupingBy(item -> item.getOrderNo() + DateUtil.formatDatetime(item.getChargeDate()) + item.getChargeCodeMx() + item.getChargeAmount() + item.getChargeFee() + item.getLedgerSn())
-//        );
-//        // 用负数拼接的 key 去查找
-//        for (ZyDetailCharge fuShu : getYiZhuFeiYongFuShu) {
-//            String key = fuShu.getOrderNo() + DateUtil.formatDatetime(fuShu.getChargeDate()) + fuShu.getChargeCodeMx() + fuShu.getChargeAmount().negate()
-//                    + fuShu.getChargeFee().negate() + fuShu.getLedgerSn();
-//            if (zhenShuMap.containsKey(key)) {
-//                for (ZyDetailCharge zyDetailCharge : zhenShuMap.get(key)) {
-//                    if (zyDetailCharge.getTuiFeiFlag() == null && zyDetailCharge.getOriDetailSn() == null) {
-//                        fuShu.setOriDetailSn(zyDetailCharge.getDetailSn());
-//                        zyDetailCharge.setTuiFeiFlag(1);
-//                        piPei.add(fuShu);
-//                        log.info("第一次匹配==》流水:{},匹配流水:{},", fuShu.getDetailSn(), fuShu.getOriDetailSn());
-//                        break;
-//                    }
-//                }
-//            } else {
-//                // 这个是需要进行二次匹配的
-//                erCiPiPei.add(fuShu);
-//            }
-//        }
-//        // 下面是二次匹配
-//        if (erCiPiPei.size() > 0) {
-//            // 二次匹配 条件为 执行科室 项目编码 数量 账页号
-//            Map<String, List<ZyDetailCharge>> erCiPiPeiZhenShu = getYiZhuFeiYongZhenShu.stream().collect(
-//                    Collectors.groupingBy(item -> item.getExecUnit() + item.getChargeCodeMx() + item.getChargeAmount() + item.getChargeFee() + item.getLedgerSn())
-//            );
-//            // 开始二次匹配
-//            for (ZyDetailCharge zyDetailCharge : erCiPiPei) {
-//                String key = zyDetailCharge.getExecUnit() + zyDetailCharge.getChargeCodeMx() + zyDetailCharge.getChargeAmount().negate()
-//                        + zyDetailCharge.getChargeFee().negate() + zyDetailCharge.getLedgerSn();
-//                if (erCiPiPeiZhenShu.containsKey(key)) {
-//                    for (ZyDetailCharge detailCharge : erCiPiPeiZhenShu.get(key)) {
-//                        if (detailCharge.getTuiFeiFlag() == null && detailCharge.getOriDetailSn() == null) {
-//                            zyDetailCharge.setOriDetailSn(detailCharge.getDetailSn());
-//                            detailCharge.setTuiFeiFlag(1);
-//                            piPei.add(zyDetailCharge);
-//                            log.info("第二次匹配==》流水:{},匹配流水:{}", zyDetailCharge.getDetailSn(), zyDetailCharge.getOriDetailSn());
-//                            break;
-//                        }
-//                    }
-//                }
-//            }
-//        }
-//        // 开始匹配
-//        if (piPei.size() > 0) {
-//            // 100 条的更新  ListUtils.partition 用来拆分 list size 是拆分的条数
-//            List<List<ZyDetailCharge>> fenDuan = ListUtils.partition(piPei, 100);
-//            for (List<ZyDetailCharge> list : fenDuan) {
-//                dao.yiZhuTuiFeiPiPei(inpatientNo, admissTimes, list, infantFlag);
-//            }
-//            publicServer.genXingYuanLiuShuiBiaoZhi(inpatientNo, admissTimes, ledgerSn);
-//            log.info("医嘱退费匹配 ==》 操作人:{},住院号:{},住院次数:{}", TokenUtil.getTokenUserId(), inpatientNo, admissTimes);
-//            return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION,
-//                    String.format("匹配成功共:{%d}条,匹配成功:{%s}条", getYiZhuFeiYongFuShu.size(), piPei.size()));
-//        }
+        // 获取正的医嘱费用
+        List<ZyDetailCharge> getYiZhuFeiYongZhenShu = dao.getYiZhuFeiYong(inpatientNo, admissTimes, ledgerSn, ">", infantFlag);
+        // 获取负的医嘱费用
+        List<ZyDetailCharge> getYiZhuFeiYongFuShu = dao.getYiZhuFeiYong(inpatientNo, admissTimes, ledgerSn, "<", infantFlag);
+        // 获取负数的退费数据 主要是用来判断 这一条正的是否退费了。
+        List<ZyDetailCharge> tuiFeiList = dao.tuiFeiList(inpatientNo, admissTimes, infantFlag);
+        if (!tuiFeiList.isEmpty()) {
+            Map<Integer, Integer> map = new HashMap<>();
+            for (ZyDetailCharge zyDetailCharge : tuiFeiList) {
+                map.put(zyDetailCharge.getOriDetailSn(), zyDetailCharge.getDetailSn());
+            }
+            getYiZhuFeiYongZhenShu.forEach(item -> {
+                if (map.containsKey(item.getDetailSn())) {
+                    item.setTuiFeiFlag(1);
+                }
+            });
+        }
+        // 需要保存需要匹配的一些流水数据
+        List<ZyDetailCharge> piPei = new ArrayList<>();
+        // 此处是需要二次匹配的 list
+        List<ZyDetailCharge> erCiPiPei = new ArrayList<>();
+        // 用map 来保存正数的信息,但是有可能匹配的条件中map 的 key会一致 所以在这里使用 java8 的新特性 stream 流来进行分组 这样就不会因为key 一样导致数据被覆盖了
+        // 第一次 匹配 根据 医嘱号 收费时间 项目编码 数量 账页号
+        Map<String, List<ZyDetailCharge>> zhenShuMap = getYiZhuFeiYongZhenShu.stream().collect(
+                Collectors.groupingBy(item -> item.getOrderNo() + DateUtil.formatDatetime(item.getChargeDate()) + item.getChargeCodeMx() + item.getChargeAmount() + item.getChargeFee() + item.getLedgerSn())
+        );
+        // 用负数拼接的 key 去查找
+        for (ZyDetailCharge fuShu : getYiZhuFeiYongFuShu) {
+            String key = fuShu.getOrderNo() + DateUtil.formatDatetime(fuShu.getChargeDate()) + fuShu.getChargeCodeMx() + fuShu.getChargeAmount().negate()
+                    + fuShu.getChargeFee().negate() + fuShu.getLedgerSn();
+            if (zhenShuMap.containsKey(key)) {
+                for (ZyDetailCharge zyDetailCharge : zhenShuMap.get(key)) {
+                    if (zyDetailCharge.getTuiFeiFlag() == null && zyDetailCharge.getOriDetailSn() == null) {
+                        fuShu.setOriDetailSn(zyDetailCharge.getDetailSn());
+                        zyDetailCharge.setTuiFeiFlag(1);
+                        piPei.add(fuShu);
+                        log.info("第一次匹配==》流水:{},匹配流水:{},", fuShu.getDetailSn(), fuShu.getOriDetailSn());
+                        break;
+                    }
+                }
+            } else {
+                // 这个是需要进行二次匹配的
+                erCiPiPei.add(fuShu);
+            }
+        }
+        // 下面是二次匹配
+        if (erCiPiPei.size() > 0) {
+            // 二次匹配 条件为 执行科室 项目编码 数量 账页号
+            Map<String, List<ZyDetailCharge>> erCiPiPeiZhenShu = getYiZhuFeiYongZhenShu.stream().collect(
+                    Collectors.groupingBy(item -> item.getExecUnit() + item.getChargeCodeMx() + item.getChargeAmount() + item.getChargeFee() + item.getLedgerSn())
+            );
+            // 开始二次匹配
+            for (ZyDetailCharge zyDetailCharge : erCiPiPei) {
+                String key = zyDetailCharge.getExecUnit() + zyDetailCharge.getChargeCodeMx() + zyDetailCharge.getChargeAmount().negate()
+                        + zyDetailCharge.getChargeFee().negate() + zyDetailCharge.getLedgerSn();
+                if (erCiPiPeiZhenShu.containsKey(key)) {
+                    for (ZyDetailCharge detailCharge : erCiPiPeiZhenShu.get(key)) {
+                        if (detailCharge.getTuiFeiFlag() == null && detailCharge.getOriDetailSn() == null) {
+                            zyDetailCharge.setOriDetailSn(detailCharge.getDetailSn());
+                            detailCharge.setTuiFeiFlag(1);
+                            piPei.add(zyDetailCharge);
+                            log.info("第二次匹配==》流水:{},匹配流水:{}", zyDetailCharge.getDetailSn(), zyDetailCharge.getOriDetailSn());
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        // 开始匹配
+        if (piPei.size() > 0) {
+            // 100 条的更新  ListUtils.partition 用来拆分 list size 是拆分的条数
+            List<List<ZyDetailCharge>> fenDuan = ListUtils.partition(piPei, 100);
+            for (List<ZyDetailCharge> list : fenDuan) {
+                dao.yiZhuTuiFeiPiPei(inpatientNo, admissTimes, list, infantFlag);
+            }
+            publicServer.genXingYuanLiuShuiBiaoZhi(inpatientNo, admissTimes, ledgerSn);
+            log.info("医嘱退费匹配 ==》 操作人:{},住院号:{},住院次数:{}", TokenUtil.getTokenUserId(), inpatientNo, admissTimes);
+            return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION,
+                    String.format("匹配成功共:{%d}条,匹配成功:{%s}条", getYiZhuFeiYongFuShu.size(), piPei.size()));
+        }
         publicServer.genXingYuanLiuShuiBiaoZhi(inpatientNo, admissTimes, ledgerSn);
-        return ResultVoUtil.success();
-        //return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, String.format("该患者有【%d】条,未能匹配 |д・)っ", getYiZhuFeiYongFuShu.size()));
+
+        return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, String.format("该患者有【%d】条,未能匹配 |д・)っ", getYiZhuFeiYongFuShu.size()));
     }
 
     /**
@@ -610,6 +613,7 @@ public class XiangMuLuRuService {
         if (BigUtils.bigDaYu(dao.zhenFuXingDiFeiYong(inpatientNo, admissTimes, ledger), 0)) {
             dao.chongXingZhengFuXiangDi(inpatientNo, admissTimes, ledger);
         }
+        // 这里退药 医嘱 有可能会没有携带 执行科室
         List<ZyDetailCharge> huoQuYaoPingZhongKeShiWeiKongDe = dao.huoQuYaoPingZhongKeShiWeiKongDe(inpatientNo, admissTimes, ledger);
         if (!huoQuYaoPingZhongKeShiWeiKongDe.isEmpty()) {
             dao.yiZhuTuiFeiGenXingZhiXingKeShi(inpatientNo, admissTimes, ledger, huoQuYaoPingZhongKeShiWeiKongDe);
@@ -676,8 +680,6 @@ public class XiangMuLuRuService {
         }
         return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR,
                 String.format("负数费用:{%.2f},匹配费用:{%.2f} <br> 负数数量:{%.2f},匹配数量:{%.2f}", zy.getChargeFee().negate(), chargeFeeSum, zy.getChargeAmount().negate(), chargeAmountSum));
-
-
     }
 }