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