|  | @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  | -import org.apache.commons.collections4.ListUtils;
 | 
	
		
			
				|  |  | +import org.jetbrains.annotations.NotNull;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.config.exception.ExceptionEnum;
 | 
	
	
		
			
				|  | @@ -16,7 +16,6 @@ import thyyxxk.webserver.dao.his.zhuyuanyisheng.CaoYaoYiZhuDao;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.ResultVo;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
 | 
	
		
			
				|  |  | -import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.CaoYaoChaXunTiaoJian;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.YzActOrderCy;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.YzActOrderCyDetail;
 | 
	
	
		
			
				|  | @@ -25,6 +24,7 @@ import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYiZhu;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYzActOrder;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.YiZhuMingChen;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.service.PublicServer;
 | 
	
		
			
				|  |  | +import thyyxxk.webserver.service.hospitalizationCosts.HospitalizationCostsService;
 | 
	
		
			
				|  |  |  import thyyxxk.webserver.utils.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.math.BigDecimal;
 | 
	
	
		
			
				|  | @@ -46,13 +46,15 @@ public class CaoYaoYiZhuService {
 | 
	
		
			
				|  |  |      private final YiZhuLuRuDao yiZhuLuRuDao;
 | 
	
		
			
				|  |  |      private final YiZhuLuRuServer yiZhuLuRuServer;
 | 
	
		
			
				|  |  |      private final XiangMuLuRuDao xiangMuLuRuDao;
 | 
	
		
			
				|  |  | +    private final HospitalizationCostsService hospitalizationCostsService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public CaoYaoYiZhuService(CaoYaoYiZhuDao dao, PublicServer publicServer, YiZhuLuRuDao yiZhuLuRuDao, YiZhuLuRuServer yiZhuLuRuServer, XiangMuLuRuDao xiangMuLuRuDao) {
 | 
	
		
			
				|  |  | +    public CaoYaoYiZhuService(CaoYaoYiZhuDao dao, PublicServer publicServer, YiZhuLuRuDao yiZhuLuRuDao, YiZhuLuRuServer yiZhuLuRuServer, XiangMuLuRuDao xiangMuLuRuDao, HospitalizationCostsService hospitalizationCostsService) {
 | 
	
		
			
				|  |  |          this.dao = dao;
 | 
	
		
			
				|  |  |          this.publicServer = publicServer;
 | 
	
		
			
				|  |  |          this.yiZhuLuRuDao = yiZhuLuRuDao;
 | 
	
		
			
				|  |  |          this.yiZhuLuRuServer = yiZhuLuRuServer;
 | 
	
		
			
				|  |  |          this.xiangMuLuRuDao = xiangMuLuRuDao;
 | 
	
		
			
				|  |  | +        this.hospitalizationCostsService = hospitalizationCostsService;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private CaoYaoYiZhuService getThis() {
 | 
	
	
		
			
				|  | @@ -175,26 +177,7 @@ public class CaoYaoYiZhuService {
 | 
	
		
			
				|  |  |          for (int i = 0; i < param.getList().size(); i++) {
 | 
	
		
			
				|  |  |              YzActOrderCyDetail item = param.getList().get(i);
 | 
	
		
			
				|  |  |              XinZhenYzActOrder feiYongXinXi = drug.get(item.getChargeCode().trim() + item.getSerial().trim() + item.getGroupNo().trim());
 | 
	
		
			
				|  |  | -            List<String> errorMessage = new ArrayList<>();
 | 
	
		
			
				|  |  | -            if (feiYongXinXi == null) {
 | 
	
		
			
				|  |  | -                errorMessage.add("没有找到药品信息,请联系药剂药房。");
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                if (feiYongXinXi.getDelFlag() == 1) {
 | 
	
		
			
				|  |  | -                    errorMessage.add("药品已经被停用了,请联系药剂科");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (feiYongXinXi.getYpLevel() > doctorLevel) {
 | 
	
		
			
				|  |  | -                    errorMessage.add("您没有开此药品的权限");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (BigUtils.bigDaYu(item.getQuantity(), feiYongXinXi.getStockAmount())) {
 | 
	
		
			
				|  |  | -                    errorMessage.add("药品领量大于药品的库存,当前库存量" + feiYongXinXi.getStockAmount().stripTrailingZeros().toPlainString());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (feiYongXinXi.getDeptRestrictions() > 0) {
 | 
	
		
			
				|  |  | -                    errorMessage.add("该药品禁止在患者所在的科室使用。");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (feiYongXinXi.getVisibleFlagZy() == 1) {
 | 
	
		
			
				|  |  | -                    errorMessage.add("该药品禁止住院患者使用。");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            List<String> errorMessage = limitation(feiYongXinXi, doctorLevel, item);
 | 
	
		
			
				|  |  |              if (ListUtil.notBlank(errorMessage)) {
 | 
	
		
			
				|  |  |                  errorMap.put("第" + (i + 1) + "个,名称:" + item.getChargeCodeName(), errorMessage);
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -222,6 +205,31 @@ public class CaoYaoYiZhuService {
 | 
	
		
			
				|  |  |          return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @NotNull
 | 
	
		
			
				|  |  | +    private static List<String> limitation(XinZhenYzActOrder feiYongXinXi, Integer doctorLevel, YzActOrderCyDetail item) {
 | 
	
		
			
				|  |  | +        List<String> errorMessage = new ArrayList<>();
 | 
	
		
			
				|  |  | +        if (feiYongXinXi == null) {
 | 
	
		
			
				|  |  | +            errorMessage.add("没有找到药品信息,请联系药剂药房。");
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            if (feiYongXinXi.getDelFlag() == 1) {
 | 
	
		
			
				|  |  | +                errorMessage.add("药品已经被停用了,请联系药剂科");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (feiYongXinXi.getYpLevel() > doctorLevel) {
 | 
	
		
			
				|  |  | +                errorMessage.add("您没有开此药品的权限");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (BigUtils.bigDaYu(item.getQuantity(), feiYongXinXi.getStockAmount())) {
 | 
	
		
			
				|  |  | +                errorMessage.add("药品领量大于药品的库存,当前库存量" + feiYongXinXi.getStockAmount().stripTrailingZeros().toPlainString());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (feiYongXinXi.getDeptRestrictions() > 0) {
 | 
	
		
			
				|  |  | +                errorMessage.add("该药品禁止在患者所在的科室使用。");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (feiYongXinXi.getVisibleFlagZy() == 1) {
 | 
	
		
			
				|  |  | +                errorMessage.add("该药品禁止住院患者使用。");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return errorMessage;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      public void generateHerbs(YzActOrderCy param, XinZhenYiZhu huanZheXinXi) {
 | 
	
		
			
				|  |  |          dao.chaRuCaoYaoYiZhu(param, huanZheXinXi.getDeptCode(), huanZheXinXi.getDeptCode(), param.getExecDept());
 | 
	
	
		
			
				|  | @@ -276,36 +284,9 @@ public class CaoYaoYiZhuService {
 | 
	
		
			
				|  |  |          log.info("删除草药==》操作人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONStringWithDateFormat(cy, GetDateFormat.DATE_TIME));
 | 
	
		
			
				|  |  |          dao.genXingCaoYaoShanChuBiaoZhi(patNo, times, orderNo);
 | 
	
		
			
				|  |  |          dao.shanChuYiZhu(orderNo);
 | 
	
		
			
				|  |  | -        feeRefunds(cy);
 | 
	
		
			
				|  |  | +        // 根据医嘱号退费
 | 
	
		
			
				|  |  | +        hospitalizationCostsService.refundsByPatientOrder(cy.getInpatientNo(), cy.getAdmissTimes(), cy.getOrderNo());
 | 
	
		
			
				|  |  |          return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 草药退费
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param cy 草药信息
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    private void feeRefunds(YzActOrderCy cy) {
 | 
	
		
			
				|  |  | -        List<ZyDetailCharge> cyList = dao.caoYaoFeiYong(cy);
 | 
	
		
			
				|  |  | -        int maxDetailSn = publicServer.getMaxDetailSn(cy.getInpatientNo(), cy.getAdmissTimes());
 | 
	
		
			
				|  |  | -        String userCode = TokenUtil.getTokenUserId();
 | 
	
		
			
				|  |  | -        if (ListUtil.notBlank(cyList)) {
 | 
	
		
			
				|  |  | -            List<ZyDetailCharge> refundArray = new ArrayList<>(cyList.size());
 | 
	
		
			
				|  |  | -            for (ZyDetailCharge item : cyList) {
 | 
	
		
			
				|  |  | -                item.setChargeFee(item.getChargeFee().negate());
 | 
	
		
			
				|  |  | -                item.setChargeAmount(item.getChargeAmount().negate());
 | 
	
		
			
				|  |  | -                item.setOpIdCode(userCode);
 | 
	
		
			
				|  |  | -                item.setOriDetailSn(item.getDetailSn());
 | 
	
		
			
				|  |  | -                // 设置 流水号
 | 
	
		
			
				|  |  | -                item.setDetailSn(maxDetailSn += 1);
 | 
	
		
			
				|  |  | -                item.setOrderNo(item.getOrderNo());
 | 
	
		
			
				|  |  | -                item.setNewOrderNo(item.getOrderNo());
 | 
	
		
			
				|  |  | -                refundArray.add(item);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            List<List<ZyDetailCharge>> fenGe = ListUtils.partition(refundArray, 20);
 | 
	
		
			
				|  |  | -            fenGe.forEach(xiangMuLuRuDao::xiangMuTuiFei);
 | 
	
		
			
				|  |  | -            dao.modifyTheExpenseFlag(cy);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  }
 |