MrShi
2025-09-15 856f526f823f5dad88c28657d82f971ff66afb1e
server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
@@ -9,6 +9,7 @@
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.core.wx.WxPayProperties;
import com.doumee.dao.business.GoodsorderMapper;
import com.doumee.dao.business.WxBillDetailMapper;
import com.doumee.dao.business.WxBillMapper;
import com.doumee.dao.business.model.Goodsorder;
@@ -33,6 +34,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
/**
@@ -45,6 +47,8 @@
    @Autowired
    private WxBillMapper wxBillMapper;
    @Autowired
    private GoodsorderMapper goodsorderMapper;
    @Autowired
    private WxBillDetailMapper wxBillDetailMapper;
    @Override
@@ -95,7 +99,7 @@
    @Override
    public WxBill findOne(WxBill wxBill) {
        QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill);
        return wxBillMapper.selectOne(wrapper);
        return wxBillMapper.selectOne(wrapper.last(" limit 1"));
    }
    @Override
@@ -112,6 +116,7 @@
        bill1.setSumTotalFee(bill.getSumTotalFee());//交易金额
        bill1.setSumCmmsAmt(bill.getSumCmmsAmt());//交易手续费
        bill1.setSumSuccessFee(bill.getSumSuccessFee());//成功交易金额
        bill1.setDiscountFee(bill.getDiscountFee());//成功交易金额
        WxBill bill2 = initBillData();//记录退款统计数据
        bill2.setSumRefundBill(bill.getSumRefundBill());//退款笔数
@@ -127,11 +132,13 @@
        bill3.setSumRefundCmmsAmt(Constants.formatDecimalNum(bill.getSumRefundCmmsAmt()).add(Constants.formatDecimalNum(bill.getSumCmmsAmt())));//手续费
        bill3.setSumRefundFee(bill.getSumRefundFee());//退款金额
        bill3.setTotal(bill.getTotal());
        bill3.setBikeFee(bill.getBikeFee());
        bill3.setDiscountFee(bill.getDiscountFee());//成功交易金额
        QueryWrapper<WxBillDetail> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().ge(param.getStartDate() !=null,WxBillDetail::getPid,DateUtil.getShortDateStr(param.getStartDate()));
        queryWrapper.lambda().le(param.getEndDate() !=null,WxBillDetail::getPid,DateUtil.getShortDateStr(param.getEndDate()));
        queryWrapper.lambda().ne(WxBillDetail::getAppid, WxMiniConfig.wxPayService.getConfig().getAppId());//非自行车收入统计
        queryWrapper.lambda().ne(WxBillDetail::getAppid, WxMiniConfig.wxPayV2Service.getConfig().getSubAppId());//非自行车收入统计
        queryWrapper.lambda().groupBy(WxBillDetail::getBillStatus);
        queryWrapper.select( "count(id) as sum_bill"
                ,"sum(settlement_total_fee) as settlement_total_fee"
@@ -143,13 +150,14 @@
            for(WxBillDetail detail : detailList){
                if(StringUtils.equals(detail.getBillStatus(), "SUCCESS")){
                    //实收数据
                    bill4.setSumBill(detail.getSumBill());//交易笔数
                    bill4.setSumBill( detail.getSumBill());//交易笔数
                    bill4.setSumSuccessFee(Constants.formatDecimalNum(detail.getSettlementTotalFee()));//交易金额
                    bill4.setSumCmmsAmt(Constants.formatDecimalNum(detail.getCmmsAmt()));//交易手续费
                } else if(StringUtils.equals(detail.getBillStatus(), "REFUND")){
                } else if(StringUtils.equals(detail.getBillStatus(), "REFUND") || StringUtils.equals(detail.getBillStatus(), "REVOKED")){
                    //退款数据
                    bill4.setSumRefundBill(detail.getSumBill());//退款笔数
                    bill4.setSumRefundCmmsAmt(Constants.formatDecimalNum(detail.getCmmsAmt()));//退款手续费
                    bill4.setSumRefundBill(Constants.formatIntegerNum(bill4.getSumRefundBill())+detail.getSumBill());//退款笔数
                    bill4.setSumRefundFee(Constants.formatDecimalNum(bill4.getSumRefundFee()).add(Constants.formatDecimalNum(detail.getRefundFee())));
                    bill4.setSumRefundCmmsAmt(Constants.formatDecimalNum(bill4.getSumRefundCmmsAmt()).add(Constants.formatDecimalNum(Constants.formatDecimalNum(detail.getCmmsAmt()))));//退款手续费
                }
            }
            //结算金额
@@ -237,6 +245,7 @@
                ,"sum(total) as total"
                ,"sum(sum_refund_cmms_amt) as sum_refund_cmms_amt"
                ,"sum(bike_fee) as bike_fee"
                ,"sum(discount_fee) as discount_fee"
                );
        WxBill bill = wxBillMapper.selectOne(param.last("limit 1"));
        if(bill == null){
@@ -259,6 +268,12 @@
        bill.setSumRefundCmmsAmt(new BigDecimal(0.00));
        bill.setTotal(new BigDecimal(0.00));
        bill.setBikeFee(new BigDecimal(0.00));
        bill.setDiscountFee(new BigDecimal(0.00));
        bill.setBikeRefundFee(new BigDecimal(0.00));
        bill.setDiscountRefundFee(new BigDecimal(0.00));
        bill.setDiscountRefundCmmsAmt(new BigDecimal(0.00));
        bill.setBikeRefundCmmsAmt(new BigDecimal(0.00));
        bill.setDiscountFee(new BigDecimal(0.00));
        return bill;
    }
    @Override
@@ -277,9 +292,11 @@
//        Date ydate = DateUtil.addDaysToDate(new Date(), -1);
        request.setBillDate(billDate);
        request.setBillType("SUCCESS");
        request.setSubMchId(WxMiniConfig.wxProperties.getSubMchId());
        WxPayBillResult response = null;
        try {
            response = WxMiniConfig.wxPayService.downloadBill(request);
            response = WxMiniConfig.wxPayV2Service.downloadBill(request);
        }catch (WxPayException e){
        }
@@ -287,7 +304,7 @@
        //请求退款单交易记录汇总数据
        WxPayBillResult responseRefund = null;
        try {
            responseRefund = WxMiniConfig.wxPayService.downloadBill(request);
            responseRefund = WxMiniConfig.wxPayV2Service.downloadBill(request);
        }catch (WxPayException e){
        }
@@ -304,10 +321,6 @@
            bill.setSumTotalFee(formatStringToDecimal(response.getTotalAmount()));
            //应结订单总金额
            bill.setSumSuccessFee(formatStringToDecimal(response.getTotalFee()));
            //退款总金额
            bill.setSumRefundFee(formatStringToDecimal(response.getTotalFee()));
            //退款总金额
            bill.setSumApplyRefundFee(formatStringToDecimal(response.getTotalAppliedRefundFee()));
            //交易总手续费金额
            bill.setSumCmmsAmt(formatStringToDecimal(response.getTotalPoundageFee()));
            detailList.addAll(getDetialModelByInfo(bill,response.getBillInfoList()));
@@ -316,8 +329,12 @@
            //退款单总数累计进入
//                bill.setSumBill(bill.getSumBill()+(Integer.parseInt(response.getTotalRecord()));
            bill.setSumRefundBill(Integer.parseInt(responseRefund.getTotalRecord()));//退款的订单数
            //退款总金额
            bill.setSumRefundFee(formatStringToDecimal(responseRefund.getTotalRefundFee()));
            //退款总金额
            bill.setSumApplyRefundFee(formatStringToDecimal(responseRefund.getTotalAppliedRefundFee()));
            bill.setSumRefundCmmsAmt(formatStringToDecimal(responseRefund.getTotalPoundageFee()));//退款总手续费
            bill.setSumCouponRefundFee(formatStringToDecimal(responseRefund.getTotalCouponFee()));//退款总手续费
            bill.setSumCouponRefundFee(formatStringToDecimal(responseRefund.getTotalCouponFee()));//退款总金额
            detailList.addAll(getDetialModelByInfo(bill,responseRefund.getBillInfoList()));
        }
        wxBillMapper.delete(new UpdateWrapper<WxBill>().lambda().eq( WxBill::getId, bill.getId()));
@@ -330,7 +347,22 @@
//        bill.setBikeFee(bill.getSumSuccessFee().subtract(bill.getSumRefundFee()));
        wxBillMapper.insert(bill);
        if(detailList.size()>0){
            wxBillDetailMapper.insertBatch(detailList);
            int sublistSize = 500;
            int startIndex = 0;
            int endIndex = sublistSize;
            while (startIndex < detailList.size()) {
                if (endIndex > detailList.size()) {
                    endIndex = detailList.size();
                }
                List<WxBillDetail> sublist = detailList.subList(startIndex, endIndex);
                if(sublist.size()>0){
//                    wxBillDetailMapper.insertBatch(sublist);
                    wxBillDetailMapper.insert(sublist);
                }
                startIndex = endIndex;
                endIndex += sublistSize;
            }
        }
    }
@@ -348,7 +380,7 @@
            //只能同步昨天10之前的数据
            Calendar caln = Calendar.getInstance();
            caln.setTime(ydate);
            if(caln.get(Calendar.HOUR_OF_DAY) <= 9){
            if(caln.get(Calendar.HOUR_OF_DAY)  > 10){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,最近同步时间只能截止到昨天10点前!");
            }
        }
@@ -368,7 +400,7 @@
        if(billInfoList!=null){
            for (int i = 0; i <billInfoList.size(); i++) {
                WxPayBillInfo info =billInfoList.get(i);
                if(StringUtils.equals(info.getTradeType(),"REFUND" ) && !StringUtils.equals(info.getRefundState(),"SUCCESS" )){
                if((StringUtils.equals(info.getTradeType(),"REFUND" )||StringUtils.equals(info.getTradeType(),"REVOKED" )) && !StringUtils.equals(info.getRefundState(),"SUCCESS" )){
                    //如果是非成功的退款数据,不进行同步
                    continue;
                }
@@ -406,15 +438,37 @@
                detail.setRefundSuccessDate(DateUtil.getDateFromString2(info.getRefundSuccessTime()));//成功退款时间
                detail.setRefundApplyDate(DateUtil.getDateFromString2(info.getRefundTime())); //申请退款时间
                //计算自行车收入,匹配来自自行车小程序的所有支付成功和退款成功的金额,作为自行车收入(累计收款金额-累计退款成功金额)
                if(StringUtils.equals(detail.getAppid(), WxMiniConfig.wxPayService.getConfig().getAppId())){
                    //自行车收入累计收款金额
                    bill.setBikeFee(bill.getBikeFee().add(detail.getSettlementTotalFee()));
                    if(StringUtils.equals(detail.getRefundSuccessStatus(),"SUCCESS")){
                        //如果退款成功,扣除退款金额
                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getApplyRefundFee()));
                if(StringUtils.equals(detail.getAppid(), WxMiniConfig.wxPayV2Service.getConfig().getSubAppId())){
                    Goodsorder order = goodsorderMapper.selectOne(new QueryWrapper<Goodsorder>().lambda()
                            .eq(Goodsorder::getId,info.getOutTradeNo()));
                    if(Constants.equalsInteger(order.getType(),Constants.ZERO)){
                        //自行车收入累计收款金额(支付成功总金额-退款总金额)
                        if(StringUtils.equals(info.getTradeState(),"SUCCESS")){
                            //如果是交易(包含手续费)
                            bill.setBikeFee(bill.getBikeFee().add(detail.getSettlementTotalFee()));
//                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
                        }else  if(StringUtils.equals(info.getTradeState(),"REFUND" ) || StringUtils.equals(info.getTradeState(),"REVOKED" )){
                            //如果退款成功,扣除退款金额(包含手续费)
                            bill.setBikeFee(bill.getBikeFee().subtract(detail.getRefundFee()) );
                            bill.setBikeRefundFee(bill.getBikeRefundFee().add(detail.getRefundFee()) );
                            bill.setBikeRefundCmmsAmt(bill.getBikeRefundCmmsAmt().add(detail.getCmmsAmt()) );
//                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
                        }
                    }else{
                        //自行车收入累计收款金额(支付成功总金额-退款总金额)
                        if(StringUtils.equals(info.getTradeState(),"SUCCESS")){
                            //如果是交易(包含手续费)
                            bill.setDiscountFee(bill.getDiscountFee().add(detail.getSettlementTotalFee()));
//                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
                        }else  if(StringUtils.equals(info.getTradeState(),"REFUND" ) || StringUtils.equals(info.getTradeState(),"REVOKED" )){
                            //如果退款成功,扣除退款金额(包含手续费)
                            bill.setDiscountFee(bill.getDiscountFee().subtract(detail.getRefundFee()) );
                            bill.setDiscountRefundFee(bill.getDiscountRefundFee().add(detail.getRefundFee()) );
                            bill.setDiscountRefundCmmsAmt(bill.getDiscountRefundCmmsAmt().add(detail.getCmmsAmt()) );
//                          bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
                        }
                    }
                }
                detailList.add(detail);
            }
        }