|
@@ -50,9 +50,16 @@ public class XiangMuLuRuService {
|
|
|
* @return 返回患者费用
|
|
|
*/
|
|
|
public ResultVo<List<ZyDetailCharge>> getHuanZheFeiYong(ZyDetailCharge param) {
|
|
|
- log.info("查询患者费用==》住院号{},住院次数:{},项目名称:{}", param.getInpatientNo(), param.getAdmissTimes(),
|
|
|
- param.getChargeCode());
|
|
|
- List<ZyDetailCharge> list = dao.getHuanZheFeiYong(param.getInpatientNo(), param.getAdmissTimes(), param.getChargeCode());
|
|
|
+ log.info("查询患者费用==》住院号{},住院次数:{},项目名称:{},录入日期:{},费用类型:{}", param.getInpatientNo(), param.getAdmissTimes(),
|
|
|
+ param.getChargeCode(), param.getStartTime(), param.getOrderNo());
|
|
|
+ int infantFlag = 0;
|
|
|
+ if (param.getInpatientNo().contains("$")) {
|
|
|
+ String[] yingEr = param.getInpatientNo().split("\\$");
|
|
|
+ param.setInpatientNo(yingEr[0]);
|
|
|
+ infantFlag = 1;
|
|
|
+ }
|
|
|
+ List<ZyDetailCharge> list = dao.getHuanZheFeiYong(param.getInpatientNo(), param.getAdmissTimes(), param.getChargeCode(), infantFlag,
|
|
|
+ param.getStartTime(), param.getOrderNo());
|
|
|
Map<Integer, Integer> map = new HashMap<>();
|
|
|
for (int i = 0; i < list.size(); i++) {
|
|
|
// 判断一下这一条数据 是否为 退费数据 再把原数据和 本身添加一个退费的 flag
|
|
@@ -94,25 +101,39 @@ public class XiangMuLuRuService {
|
|
|
for (ZyDetailCharge charge : chaKanSFtuiFei) {
|
|
|
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号为:【%s】已退费,请勿重复退费", charge.getOriDetailSn()));
|
|
|
}
|
|
|
+ // 判断是否为婴儿
|
|
|
+ if (param.getInpatientNo().contains("$")) {
|
|
|
+ String[] yingEr = param.getInpatientNo().split("\\$");
|
|
|
+ param.setInpatientNo(yingEr[0]);
|
|
|
+ }
|
|
|
+ // 获取到用户角色
|
|
|
+ List<Integer> yongHuJueSe = dao.huoQuJueSe(TokenUtil.getTokenUserId());
|
|
|
|
|
|
- /**
|
|
|
- * 获取到科室费用
|
|
|
- */
|
|
|
+ //获取到这个人是否属于这个科室
|
|
|
List<String> zhiXinKeShi = dao.chaXunZhiZXinKeShi(param.getDeptCode());
|
|
|
- // 获取最大值
|
|
|
- Integer maxDetailSn = transferInOfExpensesDao.getMaxDetailSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
+
|
|
|
// 获取原来的数据
|
|
|
List<ZyDetailCharge> yuanTuiFeiList = dao.huoQuJuTiFeiYong(param.getInpatientNo(), param.getAdmissTimes(), param.getLedgerSn(), param.getList());
|
|
|
// 获取患者的总费用
|
|
|
BigDecimal sum = new BigDecimal(0);
|
|
|
+ // 退费的list
|
|
|
+ // 获取最大值
|
|
|
+ Integer maxDetailSn = transferInOfExpensesDao.getMaxDetailSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
List<ZyDetailCharge> tuiFeiList = new ArrayList<>();
|
|
|
for (ZyDetailCharge pojo : yuanTuiFeiList) {
|
|
|
// 判断患者的费用是否存在负数
|
|
|
if (pojo.getChargeFee().signum() == -1 || pojo.getChargeAmount().signum() == -1) {
|
|
|
- return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "患者费用存在负数,流水号:{" + pojo.getDetailSn() + "},该数据为退费数据");
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("患者费用存在负数,流水号:【%s】,该数据为退费数据", pojo.getDetailSn()));
|
|
|
+ }
|
|
|
+ // 管理员角色可以无视
|
|
|
+ if (!yongHuJueSe.contains(1)) {
|
|
|
+ if (!zhiXinKeShi.contains(pojo.getExecUnit())) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号为【%s】,请对应的执行科室进行退费。", pojo.getDetailSn()));
|
|
|
+ }
|
|
|
}
|
|
|
- if (!zhiXinKeShi.contains(pojo.getExecUnit())) {
|
|
|
- return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号为【%s】,请对应的执行科室进行退费。", pojo.getDetailSn()));
|
|
|
+ // 判断如果这个药品的医嘱号 大于0 那么就不能退
|
|
|
+ if (pojo.getChargeCode().equals("BILL01") || pojo.getChargeCode().equals("BILL02")) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号为【%s】,中草药费或西药费,无法退费。", pojo.getDetailSn()));
|
|
|
}
|
|
|
sum = sum.add(pojo.getChargeFee().multiply(pojo.getChargeAmount()));
|
|
|
pojo.setChargeFee(pojo.getChargeFee().negate());
|
|
@@ -121,16 +142,23 @@ public class XiangMuLuRuService {
|
|
|
pojo.setOriDetailSn(pojo.getDetailSn());
|
|
|
pojo.setDetailSn(maxDetailSn += 1);
|
|
|
pojo.setOldGenTime(DateUtil.formatDatetime(pojo.getGenTime(), DateUtil.DEFAULT_PATTERN));
|
|
|
+ // 向退费 list 里面添加
|
|
|
tuiFeiList.add(pojo);
|
|
|
}
|
|
|
+ // 总费用计算
|
|
|
FeiYongLeiXin fy = JiSuanFeiYong.jiSuan(yuanTuiFeiList, false);
|
|
|
+ // 计算出这一次 总退的费用
|
|
|
fy.setTotalCharge(sum.negate());
|
|
|
// 执行退费的操作 20 条的退费
|
|
|
- List<List<ZyDetailCharge>> fenGe = ListUtils.partition(tuiFeiList, 20);
|
|
|
- fenGe.forEach(dao::xiangMuTuiFei);
|
|
|
- dao.huanZheZongFeiYong(fy, param.getInpatientNo(), param.getAdmissTimes(), "zy_actpatient");
|
|
|
- log.info("操作项目退费 ==》 操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONString(tuiFeiList));
|
|
|
- return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "项目退费操作成功。");
|
|
|
+ if (tuiFeiList.isEmpty()) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "查询不到患者原数据,请联系管理员。");
|
|
|
+ } else {
|
|
|
+ List<List<ZyDetailCharge>> fenGe = ListUtils.partition(tuiFeiList, 20);
|
|
|
+ fenGe.forEach(dao::xiangMuTuiFei);
|
|
|
+ dao.huanZheZongFeiYong(fy, param.getInpatientNo(), param.getAdmissTimes(), "zy_actpatient");
|
|
|
+ log.info("操作项目退费 ==》 操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONString(tuiFeiList));
|
|
|
+ return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "项目退费操作成功。");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -164,6 +192,12 @@ public class XiangMuLuRuService {
|
|
|
return ResultVoUtil.success(dao.queryXiangMu(pyCode.toUpperCase() + "%"));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 这个项目录入
|
|
|
+ *
|
|
|
+ * @param param 参数
|
|
|
+ * @return 返回提示语句
|
|
|
+ */
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public ResultVo<String> xiangMuFeiYongShangChuan(ZyDetailCharge param) {
|
|
|
if (param.getList().size() > 50) {
|
|
@@ -173,6 +207,15 @@ public class XiangMuLuRuService {
|
|
|
|| StringUtil.isBlank(param.getWard()) || StringUtil.isBlank(param.getDept()) || StringUtil.isBlank(param.getZySerialNo())) {
|
|
|
return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "患者信息不全。");
|
|
|
}
|
|
|
+ // 婴儿 要特殊处理
|
|
|
+ int infantFlag = 0;
|
|
|
+ // 如果带有这个 $ 说明是婴儿
|
|
|
+ if (param.getInpatientNo().contains("$")) {
|
|
|
+ infantFlag = 1;
|
|
|
+ String[] yingEr = param.getInpatientNo().split("\\$");
|
|
|
+ param.setInpatientNo(yingEr[0]);
|
|
|
+ }
|
|
|
+
|
|
|
// 获取最大流水号
|
|
|
Integer maxDetailSn = transferInOfExpensesDao.getMaxDetailSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
// 获取项目的 总费用
|
|
@@ -199,7 +242,7 @@ public class XiangMuLuRuService {
|
|
|
FeiYongLeiXin fy = JiSuanFeiYong.jiSuan(param.getList(), true);
|
|
|
fy.setTotalCharge(sum);
|
|
|
// 在此处 插入费用
|
|
|
- dao.chaRuFeiYong(param, param.getList());
|
|
|
+ dao.chaRuFeiYong(param, param.getList(), infantFlag);
|
|
|
dao.huanZheZongFeiYong(fy, param.getInpatientNo(), param.getAdmissTimes(), "zy_actpatient");
|
|
|
log.info("项目录入费用上传 ==》 操作人:{},数据:{}", param.getOpIdCode(), JSON.toJSONString(param));
|
|
|
return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "费用上传成功。");
|
|
@@ -237,7 +280,7 @@ public class XiangMuLuRuService {
|
|
|
List<ZyDetailCharge> getYiZhuFeiYongFuShu = dao.getYiZhuFeiYong(inpatientNo, admissTimes, "<");
|
|
|
// 需要保存需要匹配的一些流水数据
|
|
|
List<ZyDetailCharge> piPei = new ArrayList<>();
|
|
|
- // 保存正数的 map 用来匹配
|
|
|
+ // 保存正数的数据用 map 来匹配
|
|
|
Map<String, ZyDetailCharge> zhenShuMap = new HashMap<>();
|
|
|
for (ZyDetailCharge zhenShu : getYiZhuFeiYongZhenShu) {
|
|
|
String key = zhenShu.getOrderNo() + DateUtil.formatDatetime(zhenShu.getChargeDate()) + zhenShu.getChargeCodeMx() + zhenShu.getChargeAmount();
|