|
@@ -17,10 +17,12 @@ import thyyxxk.webserver.dao.his.inpatient.XiangMuLuRuDao;
|
|
|
import thyyxxk.webserver.entity.ResultVo;
|
|
|
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
|
|
|
import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
|
|
|
-import thyyxxk.webserver.entity.medicalinsurance.inpatient.ZyPatientInfo;
|
|
|
import thyyxxk.webserver.entity.inpatient.ZyActpatient;
|
|
|
+import thyyxxk.webserver.entity.login.UserInfo;
|
|
|
+import thyyxxk.webserver.entity.medicalinsurance.inpatient.ZyPatientInfo;
|
|
|
import thyyxxk.webserver.service.PublicServer;
|
|
|
import thyyxxk.webserver.service.medicalinsurance.SiZyService;
|
|
|
+import thyyxxk.webserver.service.redislike.RedisLikeService;
|
|
|
import thyyxxk.webserver.utils.*;
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
@@ -46,11 +48,14 @@ public class XiangMuLuRuService {
|
|
|
private final PublicServer publicServer;
|
|
|
private final SiZyService siZyService;
|
|
|
|
|
|
+ private final RedisLikeService redisLikeService;
|
|
|
+
|
|
|
@Autowired
|
|
|
- public XiangMuLuRuService(XiangMuLuRuDao dao, PublicServer publicServer, SiZyService siZyService) {
|
|
|
+ public XiangMuLuRuService(XiangMuLuRuDao dao, PublicServer publicServer, SiZyService siZyService, RedisLikeService redisLikeService) {
|
|
|
this.dao = dao;
|
|
|
this.publicServer = publicServer;
|
|
|
this.siZyService = siZyService;
|
|
|
+ this.redisLikeService = redisLikeService;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -110,7 +115,9 @@ public class XiangMuLuRuService {
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public ResultVo<String> xiangMuTuiFei(ZyDetailCharge param, Boolean panDuanYaoPing) {
|
|
|
- List<Integer> yongHuJueSe = dao.huoQuJueSe(TokenUtil.getTokenUserId());
|
|
|
+ UserInfo userInfo = redisLikeService.getUserInfoByToken();
|
|
|
+ List<Integer> yongHuJueSe = userInfo.getRoles();
|
|
|
+
|
|
|
if (!yongHuJueSe.contains(36) && !yongHuJueSe.contains(1)) {
|
|
|
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "您没有权限退费。");
|
|
|
}
|
|
@@ -125,80 +132,134 @@ public class XiangMuLuRuService {
|
|
|
if (dao.getHuanZheSFZaiYuan(param.getInpatientNo(), param.getAdmissTimes()) == 0) {
|
|
|
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该患者已出院");
|
|
|
}
|
|
|
-
|
|
|
- int infantFlag = 0;
|
|
|
- // 判断是否为婴儿
|
|
|
- if (param.getInpatientNo().contains("$")) {
|
|
|
- param.setInpatientNo(param.getInpatientNo().split("\\$")[0]);
|
|
|
- infantFlag = 1;
|
|
|
- }
|
|
|
- Integer ledgerSn = publicServer.getLedgerSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
- // 判断数据是否为 退费数据
|
|
|
- List<ZyDetailCharge> chaKanSFtuiFei = dao.chaKanSFYiJingTuiFeiLe(param.getInpatientNo(), param.getAdmissTimes(), ledgerSn, param.getList());
|
|
|
- for (ZyDetailCharge charge : chaKanSFtuiFei) {
|
|
|
- return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号为:【%s】已退费,请勿重复退费。", charge.getOriDetailSn()));
|
|
|
- }
|
|
|
if (dao.getHuanZheSFJieSuan(param.getInpatientNo(), param.getAdmissTimes()) == null || dao.getHuanZheSFJieSuan(param.getInpatientNo(), param.getAdmissTimes()) != 0) {
|
|
|
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该患者已经结算了");
|
|
|
}
|
|
|
+
|
|
|
+ // 判断是否为婴儿
|
|
|
+ int infantFlag = publicServer.getInfantFlag(param.getInpatientNo());
|
|
|
+ // 获取 患者的账页号
|
|
|
+ Integer ledgerSn = publicServer.getLedgerSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
// 获取原来的数据
|
|
|
List<ZyDetailCharge> yuanTuiFeiList = dao.huoQuJuTiFeiYong(param.getInpatientNo(), param.getAdmissTimes(), ledgerSn, param.getList());
|
|
|
- // 获取患者的总费用
|
|
|
- BigDecimal sum = new BigDecimal(0);
|
|
|
- // 退费的list
|
|
|
- // 获取最大值
|
|
|
- Integer maxDetailSn = publicServer.getMaxDetailSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
-
|
|
|
- List<ZyDetailCharge> yaoPingDan = new ArrayList<>();
|
|
|
-
|
|
|
- List<Integer> genXingZhenShuTuiFeiLiuShui = new ArrayList<>();
|
|
|
- List<ZyDetailCharge> tuiFeiList = new ArrayList<>();
|
|
|
- // 获取到用户角色 管理员角色可以无视
|
|
|
+ // 获取当前用户 下面的科室
|
|
|
List<String> zhiXinKeShi = dao.chaXunZhiZXinKeShi(param.getDeptCode());
|
|
|
|
|
|
- for (ZyDetailCharge pojo : yuanTuiFeiList) {
|
|
|
- // 判断患者的费用是否存在负数
|
|
|
- if (pojo.getChargeFee().signum() == -1 || pojo.getChargeAmount().signum() == -1) {
|
|
|
- return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("患者费用存在负数,流水号:【%s】,该数据为退费数据。", pojo.getDetailSn()));
|
|
|
+ // 项目
|
|
|
+ List<ZyDetailCharge> xiangMu = new ArrayList<>();
|
|
|
+ // 药品
|
|
|
+ List<ZyDetailCharge> yaoPin = new ArrayList<>();
|
|
|
+ // 退费的list
|
|
|
+ List<ZyDetailCharge> tuiFeiList = new ArrayList<>();
|
|
|
+ // 医技科室退药单
|
|
|
+ List<ZyDetailCharge> yaoPingDan = new ArrayList<>();
|
|
|
+ // 把原来的更新 为 -1
|
|
|
+ List<Integer> updateItemTags = new ArrayList<>();
|
|
|
+ // 把 药品 改成 -1 代表已经退了 -2 代表申请 -3 代表拒绝
|
|
|
+ List<Integer> updateDrugLabel = new ArrayList<>();
|
|
|
+ // 患者最大的 detail_sn
|
|
|
+ int maxDetailSn = publicServer.getMaxDetailSn(param.getInpatientNo(), param.getAdmissTimes());
|
|
|
+
|
|
|
+ for (ZyDetailCharge item : yuanTuiFeiList) {
|
|
|
+ // 拒绝发药是可以重新申请的
|
|
|
+ if (item.getOriDetailSn() != null && item.getOriDetailSn().equals(-3)) {
|
|
|
+ item.setOriDetailSn(null);
|
|
|
}
|
|
|
- if (pojo.getChargeCode().startsWith("BILL")) {
|
|
|
- yaoPingDan.add(pojo);
|
|
|
+ if (item.getOriDetailSn() != null && item.getOriDetailSn().equals(-2)) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号:【%s】,该药品在申请退药。", item.getDetailSn()));
|
|
|
}
|
|
|
- // 在这里判断执行科室
|
|
|
- ResultVo<String> LOGICAL_ERROR = getStringResultVo(yongHuJueSe, zhiXinKeShi, param, pojo, panDuanYaoPing);
|
|
|
- if (LOGICAL_ERROR != null) {
|
|
|
- return LOGICAL_ERROR;
|
|
|
+ if (item.getOriDetailSn() != null) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号:【%s】,该数据为退费数据。", item.getDetailSn()));
|
|
|
+ }
|
|
|
+ if (BigUtils.bigXiaoYu(item.getChargeFee(), 0) || BigUtils.bigXiaoYu(item.getChargeAmount(), 0)) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号:【%s】,该数据为负数。", item.getDetailSn()));
|
|
|
+ }
|
|
|
+ if ("00".equals(item.getSerial()) && !zhiXinKeShi.contains(item.getExecUnit())) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号:【%s】,请对应的执行科室进行退费。", item.getDetailSn()));
|
|
|
}
|
|
|
// 数据库有个 触发器 如果带了医嘱号且有篆刻那么这里就需要改成 0
|
|
|
- if (BigUtils.bigDaYu(pojo.getOrderNo(), 10)) {
|
|
|
- pojo.setOrderNo(new BigDecimal(0));
|
|
|
+ if (BigUtils.bigDaYu(item.getOrderNo(), 10)) {
|
|
|
+ item.setOrderNo(new BigDecimal(0));
|
|
|
}
|
|
|
- sum = sum.add(pojo.getChargeFee().multiply(pojo.getChargeAmount()));
|
|
|
- pojo.setChargeFee(pojo.getChargeFee().negate());
|
|
|
- pojo.setChargeAmount(pojo.getChargeAmount().negate());
|
|
|
- pojo.setOpIdCode(TokenUtil.getTokenUserId());
|
|
|
- pojo.setOriDetailSn(pojo.getDetailSn());
|
|
|
- pojo.setDetailSn(maxDetailSn += 1);
|
|
|
- pojo.setOldGenTime(DateUtil.formatDatetime(pojo.getGenTime(), DateUtil.DEFAULT_PATTERN));
|
|
|
- // 向退费 list 里面添加
|
|
|
- tuiFeiList.add(pojo);
|
|
|
- genXingZhenShuTuiFeiLiuShui.add(pojo.getOriDetailSn());
|
|
|
- }
|
|
|
- // 执行退费的操作 20 条的退费
|
|
|
- if (tuiFeiList.isEmpty()) {
|
|
|
- return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "查询不到患者原数据。");
|
|
|
- } else {
|
|
|
- log.info("操作项目退费 ==》 操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONString(tuiFeiList));
|
|
|
- List<List<ZyDetailCharge>> fenGe = ListUtils.partition(tuiFeiList, 20);
|
|
|
- if (ListUtil.notBlank(yaoPingDan)) {
|
|
|
- dao.shenQingYaoPing(param, yaoPingDan, infantFlag, publicServer.getLedgerSn(param.getInpatientNo(), param.getAdmissTimes()), TokenUtil.getTokenUserId());
|
|
|
+ if ("00".equals(item.getSerial())) {
|
|
|
+ maxDetailSn = setRefund(xiangMu, tuiFeiList, updateItemTags, maxDetailSn, item);
|
|
|
+ } else {
|
|
|
+ if (item.getOrderNo().equals(new BigDecimal(3))) {
|
|
|
+ // todo 口服药不能退
|
|
|
+ if (!zhiXinKeShi.contains(item.getExecUnit())) {
|
|
|
+ return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("流水号:【%s】,此药品为医技科室录入,请对应的医技科室退费。", item.getDetailSn()));
|
|
|
+ } else {
|
|
|
+ maxDetailSn = setRefund(xiangMu, tuiFeiList, updateItemTags, maxDetailSn, item);
|
|
|
+ yaoPingDan.add(item);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 数量变成负数
|
|
|
+ item.setChargeAmount(item.getChargeAmount().negate());
|
|
|
+ yaoPin.add(item);
|
|
|
+ updateDrugLabel.add(item.getDetailSn());
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ListUtil.notBlank(xiangMu)) {
|
|
|
+ List<List<ZyDetailCharge>> fenGe = ListUtils.partition(xiangMu, 20);
|
|
|
fenGe.forEach(dao::xiangMuTuiFei);
|
|
|
- dao.genXinZhenShuTuiFeiLiuShui(param.getInpatientNo(), param.getAdmissTimes(), publicServer.getLedgerSn(param.getInpatientNo(), param.getAdmissTimes()), genXingZhenShuTuiFeiLiuShui);
|
|
|
- return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "项目退费操作成功。乁( ˙ ω˙乁)");
|
|
|
+ dao.genXinZhenShuTuiFeiLiuShui(param.getInpatientNo(), param.getAdmissTimes(), ledgerSn, updateItemTags, -1);
|
|
|
+ log.info("项目录入==》项目退费,操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONStringWithDateFormat(xiangMu, DateUtil.DEFAULT_PATTERN));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ListUtil.notBlank(yaoPingDan)) {
|
|
|
+ dao.shenQingYaoPing(param, yaoPingDan, infantFlag, ledgerSn, TokenUtil.getTokenUserId());
|
|
|
}
|
|
|
+
|
|
|
+ if (ListUtil.notBlank(yaoPin)) {
|
|
|
+ ZyActpatient 患者信息 = publicServer.huoQuHuanZheXinXi(param.getInpatientNo());
|
|
|
+ Integer pageNo = publicServer.getTheDrugListNo();
|
|
|
+ // 药品单号
|
|
|
+ String groupNo = publicServer.getGroupNo();
|
|
|
+ // 退药单汇总
|
|
|
+ dao.drugReturnForm(pageNo, 患者信息.getWard(), TokenUtil.getTokenUserId(), groupNo);
|
|
|
+ // 退药明细
|
|
|
+ dao.detailsOfDrugReturnForm(yaoPin, 患者信息.getInpatientNo(), 患者信息.getAdmissTimes(),
|
|
|
+ 患者信息.getName(), 患者信息.getBedNo(), 患者信息.getWard(),
|
|
|
+ infantFlag, groupNo, TokenUtil.getTokenUserId(), pageNo, ledgerSn);
|
|
|
+ dao.genXinZhenShuTuiFeiLiuShui(param.getInpatientNo(), param.getAdmissTimes(), ledgerSn, updateDrugLabel, -2);
|
|
|
+ log.info("项目录入==》药品退费,操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONStringWithDateFormat(yaoPin, DateUtil.DEFAULT_PATTERN));
|
|
|
+ }
|
|
|
+
|
|
|
+ return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "退费成功。");
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 退费
|
|
|
+ *
|
|
|
+ * @param xiangMu
|
|
|
+ * @param tuiFeiList
|
|
|
+ * @param updateItemTags
|
|
|
+ * @param maxDetailSn
|
|
|
+ * @param item
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static int setRefund(List<ZyDetailCharge> xiangMu, List<ZyDetailCharge> tuiFeiList, List<Integer> updateItemTags, int maxDetailSn, ZyDetailCharge item) {
|
|
|
+ // 取负数的费用
|
|
|
+ item.setChargeFee(item.getChargeFee().negate());
|
|
|
+ item.setChargeAmount(item.getChargeAmount().negate());
|
|
|
+ // 执行人
|
|
|
+ item.setOpIdCode(TokenUtil.getTokenUserId());
|
|
|
+ item.setOriDetailSn(item.getDetailSn());
|
|
|
+ item.setOldGenTime(DateUtil.formatDatetime(item.getGenTime(), DateUtil.DEFAULT_PATTERN));
|
|
|
+ // 设置 流水号
|
|
|
+ item.setDetailSn(maxDetailSn += 1);
|
|
|
+ // 向退费 list 里面添加
|
|
|
+ tuiFeiList.add(item);
|
|
|
+ xiangMu.add(item);
|
|
|
+ updateItemTags.add(item.getOriDetailSn());
|
|
|
+ return maxDetailSn;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private ResultVo<String> getStringResultVo(List<Integer> yongHuJueSe, List<String> zhiXinKeShi, ZyDetailCharge xuYaoTuiDeShuJu, ZyDetailCharge piPeiDeShuJu, Boolean panDuanYaoPin) {
|
|
|
// 获取到用户角色 管理员角色可以无视
|
|
|
if (!yongHuJueSe.contains(1) && !yongHuJueSe.contains(8)) {
|