yupeng
2025-03-13 96a7015065775e5c3bc3d6458b86b28ad7bfb46b
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
@@ -1,15 +1,14 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.config.SmsProperties;
import com.ruoyi.common.constant.AmountConstant;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SmsUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.TencentMailUtil;
import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.system.dto.*;
import com.ruoyi.system.mapper.TBillMapper;
@@ -242,41 +241,72 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean checkOfflinePay(OfflinePayCheckDto dto) {
        TBankFlow bankflow = tBankFlowService.getById(dto.getFlowId());
        TBillDto bill = getDetailByBillId(dto.getBillId());
        if (bankflow.getRemainingMoney().compareTo(BigDecimal.ZERO)<=0){
            throw new ServiceException("该流水已无可抵扣剩余金额");
        }
        if (bankflow.getRemainingMoney().compareTo(dto.getAmount())<0){
            throw new ServiceException("实付金额不能高于于流水可抵扣剩余金额");
        }
        //如果实付金额大于欠费金额
        if (dto.getAmount().compareTo(bill.getOutstandingMoney())>=0){
            throw new ServiceException("实付金额不能高于该账单欠费金额");
        }
        if (dto.getPayType()==1){ //银行
            if (StringUtils.isEmpty(dto.getFlowId())){
                throw new ServiceException("银行流水ID不能为空");
            }
            TBankFlow bankflow = tBankFlowService.getById(dto.getFlowId());
            if (bankflow.getRemainingMoney().compareTo(BigDecimal.ZERO)<=0){
                throw new ServiceException("该流水已无可抵扣剩余金额");
            }
            if (bankflow.getRemainingMoney().compareTo(dto.getAmount())<0){
                throw new ServiceException("实付金额不能高于于流水可抵扣剩余金额");
            }
            //如果实付金额大于欠费金额
            if (dto.getAmount().compareTo(bill.getOutstandingMoney())>0){
                throw new ServiceException("实付金额不能高于该账单欠费金额");
            }
            TBill billSave = new TBill();
            billSave.setId(bill.getId());
            billSave.setPayFeesMoney(dto.getAmount());
            billSave.setBankSerialNumber(bankflow.getBankSerialNumber());
            billSave.setPayFeesTime(bankflow.getPayTime());
            billSave.setVoucher(dto.getVoucher());
            billSave.setPayFeesType(2);
            TBill back = lockAndUpdateInfo(billSave, 2);
            TBankFlow saveBankFlow = new TBankFlow();
            saveBankFlow.setId(bankflow.getId());
            saveBankFlow.setDeductionMoney(bankflow.getDeductionMoney().add(dto.getAmount()));
            BigDecimal subtract = bankflow.getRemainingMoney().subtract(dto.getAmount());
            saveBankFlow.setRemainingMoney(subtract);
            if (BigDecimal.ZERO.compareTo(subtract) == 0){
                saveBankFlow.setFlowStatus(1);
            }
            tBankFlowService.updateById(saveBankFlow);
            //更新银行流水的已抵扣金额和剩余可抵扣金额
            //存流水
            TFlowManagement save = new TFlowManagement();
            save.setPayType(3);
            save.setPayer(dto.getPayer());
            save.setPayTime(bankflow.getPayTime());
            save.setSysSerialNumber(OrderNos.getDid(30));
            save.setBankSerialNumber(bankflow.getBankSerialNumber());
            save.setFlowType(2);
            save.setPaymentBillId(back.getId());
            save.setDeductionMoney(back.getDeductionMoney());
            save.setFlowMoney(dto.getAmount());
            save.setRemainingMoney(back.getOutstandingMoney());
            save.setPreOutstand(back.getPreOutstand());
            tFlowManagementService.save(save);
            return true;
        }
        //现金支付
        TBill billSave = new TBill();
        billSave.setId(bill.getId());
        billSave.setPayFeesMoney(dto.getAmount());
        billSave.setBankSerialNumber(bankflow.getBankSerialNumber());
        billSave.setPayFeesTime(bankflow.getPayTime());
        billSave.setPayFeesTime(dto.getPayTime()!=null?dto.getPayTime():DateUtils.dateToLocalDateTime(new Date()));
        billSave.setVoucher(dto.getVoucher());
        billSave.setPayFeesType(2);
        TBill back = lockAndUpdateInfo(billSave, 2);
        //更新银行流水的已抵扣金额和剩余可抵扣金额
        TBankFlow saveBankFlow = new TBankFlow();
        saveBankFlow.setId(bankflow.getId());
        saveBankFlow.setDeductionMoney(bankflow.getDeductionMoney().add(dto.getAmount()));
        saveBankFlow.setRemainingMoney(bankflow.getRemainingMoney().subtract(dto.getAmount()));
        tBankFlowService.updateById(saveBankFlow);
        //存流水
        TFlowManagement save = new TFlowManagement();
        save.setPayType(3);
        save.setPayer(dto.getPayer());
        save.setPayTime(bankflow.getPayTime());
        save.setBankSerialNumber(bankflow.getBankSerialNumber());
        save.setFlowType(2);
        save.setPayTime(billSave.getPayFeesTime());
        save.setSysSerialNumber(OrderNos.getDid(30));
        save.setFlowType(1);
        save.setPaymentBillId(back.getId());
        save.setDeductionMoney(back.getDeductionMoney());
        save.setFlowMoney(dto.getAmount());
@@ -331,6 +361,7 @@
                saveFlow.setPayType(1);
                saveFlow.setPayer(order.getUserId());
                saveFlow.setPayTime(DateUtils.dateToLocalDateTime(save.getPayTime()));
                saveFlow.setSysSerialNumber(OrderNos.getDid(30));
                saveFlow.setBankSerialNumber(save.getPayNo());
                saveFlow.setFlowType(2);
                saveFlow.setPaymentBillId(bill.getId());
@@ -383,7 +414,7 @@
        int failNum = 0;
        for (String billId : dto.getBillIds()) {
            TBillDto bill = getDetailByBillId(billId);
            if (bill.getSmsLastTime()!=null
            if (bill.getSmsLastTime()!=null && bill.getSmsStatus()==1
                    && (System.currentTimeMillis()-bill.getSmsLastTime().getTime()<smsUtil.getPro().getBillSmsDelayPeriod()*60*1000L)){
                throw new ServiceException("有账单最近一次发送的时间是:"+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,bill.getSmsLastTime()));
            }
@@ -394,7 +425,8 @@
            TBill save = new TBill();
            save.setId(bill.getId());
            try {
                smsUtil.sendSms(bill.getPhone(), "2365726", new String[]{bill.getPartyTwoName()});
                String name = bill.getPartyTwoName().length()>5?bill.getPartyTwoName().substring(0,5):bill.getPartyTwoName();
                smsUtil.sendSms(bill.getPhone(), "2365726", new String[]{name});
                save.setSmsStatus(1);
            }catch (ServiceException e){
                failNum++;
@@ -412,7 +444,7 @@
        int failNum = 0;
        for (String billId : dto.getBillIds()) {
            TBillDto bill = getDetailByBillId(billId);
            if (bill.getMailLastTime()!=null
            if (bill.getMailLastTime()!=null && bill.getMailStatus()==1
                    && (System.currentTimeMillis()-bill.getMailLastTime().getTime()<mailUtil.getPro().getBillMailDelayPeriod()*60*1000L)){
                throw new ServiceException("有账单最近一次发送的时间是:"+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,bill.getMailLastTime()));
            }
@@ -463,7 +495,7 @@
                throw new ServiceException("实付金额不能高于于流水可抵扣剩余金额");
            }
            //如果实付金额大于欠费金额
            if (dto.getAmount().compareTo(bill.getOutstandingMoney())>=0){
            if (dto.getAmount().compareTo(bill.getOutstandingMoney())>0){
                throw new ServiceException("实付金额不能高于该账单欠费金额");
            }
        }
@@ -481,7 +513,11 @@
            TBankFlow saveBankFlow = new TBankFlow();
            saveBankFlow.setId(bankflow.getId());
            saveBankFlow.setDeductionMoney(bankflow.getDeductionMoney().add(dto.getAmount()));
            saveBankFlow.setRemainingMoney(bankflow.getRemainingMoney().subtract(dto.getAmount()));
            BigDecimal subtract = bankflow.getRemainingMoney().subtract(dto.getAmount());
            saveBankFlow.setRemainingMoney(subtract);
            if (BigDecimal.ZERO.compareTo(subtract) == 0){
                saveBankFlow.setFlowStatus(1);
            }
            tBankFlowService.updateById(saveBankFlow);
        }
        //存流水
@@ -489,6 +525,7 @@
        save.setPayType(3);
        save.setPayer(dto.getPayer());
        save.setPayTime(bankflow!=null?bankflow.getPayTime():DateUtils.dateToLocalDateTime(new Date()));
        save.setSysSerialNumber(OrderNos.getDid());
        save.setBankSerialNumber(bankflow!=null?bankflow.getBankSerialNumber():null);
        save.setFlowType(dto.getPayType()==1?2:1);
        save.setPaymentBillId(back.getId());
@@ -500,5 +537,20 @@
        return true;
    }
    @Override
    public BillStatisticsDto statistics() {
        BillStatisticsDto dto = new BillStatisticsDto();
        dto.setRent(getBaseMapper().statisticsAllRent());
        dto.setNopay(getBaseMapper().statisticsNoPay());
        dto.setPayed(getBaseMapper().statisticsPayed());
        dto.setOverdue(getBaseMapper().statisticsOverdue());
        return dto;
    }
    @Override
    public Integer batchBillCount(String userId, List<String> billIds) {
        return this.baseMapper.batchBillCount(userId,billIds);
    }
}