bug
jiangping
2023-11-08 d82554bc50065657fd01e29b5aa3b6daf70d0d0a
server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
@@ -23,14 +23,17 @@
import com.github.binarywang.wxpay.bean.result.WxPayBillInfo;
import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import lombok.Synchronized;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
/**
@@ -93,7 +96,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
@@ -101,7 +104,71 @@
        QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill);
        return wxBillMapper.selectList(wrapper);
    }
    @Override
    public  List<WxBill> getTotalBill(WxBill param) {
        //获取汇总统计
        WxBill bill = getTotalDataByDate(param);
        WxBill bill1 = initBillData();//记录交易实收统计数据
        bill1.setSumBill(bill.getSumBill());//订单数量
        bill1.setSumTotalFee(bill.getSumTotalFee());//交易金额
        bill1.setSumCmmsAmt(bill.getSumCmmsAmt());//交易手续费
        bill1.setSumSuccessFee(bill.getSumSuccessFee());//成功交易金额
        WxBill bill2 = initBillData();//记录退款统计数据
        bill2.setSumRefundBill(bill.getSumRefundBill());//退款笔数
        bill2.setSumRefundCmmsAmt(bill.getSumRefundCmmsAmt());//退款手续费
        bill2.setSumRefundFee(bill.getSumRefundFee());//退款金额
        WxBill bill3 = initBillData();
        bill3.setSumBill(bill.getSumBill());
        bill3.setSumSuccessFee(bill.getSumSuccessFee());
        bill3.setSumCmmsAmt(bill.getSumCmmsAmt());
        bill3.setSumTotalFee(bill.getSumTotalFee());
        bill3.setSumRefundBill(bill.getSumRefundBill());//退款笔数
        bill3.setSumRefundCmmsAmt(Constants.formatDecimalNum(bill.getSumRefundCmmsAmt()).add(Constants.formatDecimalNum(bill.getSumCmmsAmt())));//手续费
        bill3.setSumRefundFee(bill.getSumRefundFee());//退款金额
        bill3.setTotal(bill.getTotal());
        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().groupBy(WxBillDetail::getBillStatus);
        queryWrapper.select( "count(id) as sum_bill"
                ,"sum(settlement_total_fee) as settlement_total_fee"
                ,"sum(refund_fee) as refund_fee"
                ,"sum(cmms_amt) as cmms_amt" ,"bill_status");
        List<WxBillDetail> detailList = wxBillDetailMapper.selectList(queryWrapper);
        WxBill bill4 = initBillData();//记录交易实收统计数据
        if(detailList!=null){
            for(WxBillDetail detail : detailList){
                if(StringUtils.equals(detail.getBillStatus(), "SUCCESS")){
                    //实收数据
                    bill4.setSumBill(detail.getSumBill());//交易笔数
                    bill4.setSumSuccessFee(Constants.formatDecimalNum(detail.getSettlementTotalFee()));//交易金额
                    bill4.setSumCmmsAmt(Constants.formatDecimalNum(detail.getCmmsAmt()));//交易手续费
                } else if(StringUtils.equals(detail.getBillStatus(), "REFUND")){
                    //退款数据
                    bill4.setSumRefundBill(detail.getSumBill());//退款笔数
                    bill4.setSumRefundFee(detail.getRefundFee());
                    bill4.setSumRefundCmmsAmt(Constants.formatDecimalNum(detail.getCmmsAmt()));//退款手续费
                }
            }
            //结算金额
            bill4.setTotal(bill4.getSumSuccessFee()
                    .subtract(bill4.getSumRefundFee())
                    .subtract(bill4.getSumCmmsAmt())
                    .subtract(bill4.getSumRefundCmmsAmt()));
        }
        List<WxBill> list = new ArrayList<>();
        list.add(bill1);//实收交易
        list.add(bill2);//退款汇总
        list.add(bill3);//实收退款总计
        list.add(bill4);//非自行车收入
        return list;
    }
    @Override
    public PageData<WxBill> findPage(PageWrap<WxBill> pageWrap) {
        IPage<WxBill> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -143,16 +210,59 @@
        if (pageWrap.getModel().getBikeFee() != null) {
            queryWrapper.lambda().eq(WxBill::getBikeFee, pageWrap.getModel().getBikeFee());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
        queryWrapper.lambda().ge(pageWrap.getModel().getStartDate() !=null,WxBill::getId,DateUtil.getShortDateStr(pageWrap.getModel().getStartDate()));
        queryWrapper.lambda().le(pageWrap.getModel().getEndDate() !=null,WxBill::getId,DateUtil.getShortDateStr(pageWrap.getModel().getEndDate()));
        //按照时间升序显示
        queryWrapper.lambda().orderByAsc(WxBill::getId);
       /* for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(wxBillMapper.selectPage(page, queryWrapper));
        }*/
        return PageData.from(wxBillMapper.selectPage(page, queryWrapper),getTotalDataByDate(pageWrap.getModel()));
    }
    private WxBill getTotalDataByDate(WxBill model) {
        QueryWrapper<WxBill> param = new QueryWrapper<>();
        param.lambda().ge(model.getStartDate() !=null,WxBill::getId,DateUtil.getShortDateStr(model.getStartDate()));
        param.lambda().le(model.getEndDate() !=null,WxBill::getId,DateUtil.getShortDateStr(model.getEndDate()));
        param.select("sum(sum_bill) as sum_bill"
                ,"sum(sum_refund_bill) as sum_refund_bill"
                ,"sum(sum_success_fee) as sum_success_fee"
                ,"sum(sum_refund_fee) as sum_refund_fee"
                ,"sum(sum_cmms_amt) as sum_cmms_amt"
                ,"sum(sum_total_fee) as sum_total_fee"
                ,"sum(sum_apply_refund_fee) as sum_apply_refund_fee"
                ,"sum(sum_total_fee) as sum_total_fee"
                ,"sum(total) as total"
                ,"sum(sum_refund_cmms_amt) as sum_refund_cmms_amt"
                ,"sum(bike_fee) as bike_fee"
                );
        WxBill bill = wxBillMapper.selectOne(param.last("limit 1"));
        if(bill == null){
            bill = initBillData();
        }
        return bill;
    }
    public static WxBill initBillData(){
        WxBill bill = new WxBill();
        bill.setSumBill(0);
        bill.setSumTotalFee(new BigDecimal(0.00));
        bill.setSumSuccessFee(new BigDecimal(0.00));
        bill.setSumRefundFee(new BigDecimal(0.00));
        bill.setSumCouponRefundFee(new BigDecimal(0.00));
        bill.setSumApplyRefundFee(new BigDecimal(0.00));
        bill.setSumCmmsAmt(new BigDecimal(0.00));
        bill.setSumRefundBill(0);
        bill.setSumRefundCmmsAmt(new BigDecimal(0.00));
        bill.setTotal(new BigDecimal(0.00));
        bill.setBikeFee(new BigDecimal(0.00));
        return bill;
    }
    @Override
    public long count(WxBill wxBill) {
        QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill);
@@ -160,11 +270,13 @@
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void getWxBill(String billDate) {
    @Synchronized//单例执行
    public void getWxBill(Date ydate ) {
        isValidDate(ydate);
        // 获取交易账单数据
        WxPayDownloadBillRequest request = new WxPayDownloadBillRequest();
//        String billDate =  DateUtil.beforeDateToStr(1);
        Date ydate = DateUtil.addDaysToDate(new Date(), -1);
        String billDate = DateUtil.getShortDateStr(ydate);
//        Date ydate = DateUtil.addDaysToDate(new Date(), -1);
        request.setBillDate(billDate);
        request.setBillType("SUCCESS");
        WxPayBillResult response = null;
@@ -181,18 +293,9 @@
        }catch (WxPayException e){
        }
        WxBill bill = new WxBill();
        WxBill bill = initBillData();
        //日期作为主键
        bill.setId(billDate);
        bill.setSumBill(0);
        bill.setSumTotalFee(new BigDecimal(0.00));
        bill.setSumSuccessFee(new BigDecimal(0.00));
        bill.setSumRefundFee(new BigDecimal(0.00));
        bill.setSumCouponRefundFee(new BigDecimal(0.00));
        bill.setSumApplyRefundFee(new BigDecimal(0.00));
        bill.setSumCmmsAmt(new BigDecimal(0.00));
        bill.setSumRefundBill(0);
        bill.setSumRefundCmmsAmt(new BigDecimal(0.00));
        List<WxBillDetail> detailList = new ArrayList<>();
        if(response !=null){
//                List<WxPayBillInfo> detailList = response.getBillInfoList();
@@ -203,10 +306,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()));
@@ -215,8 +314,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()));
@@ -232,6 +335,28 @@
            wxBillDetailMapper.insertBatch(detailList);
        }
    }
    private boolean isValidDate(Date ydate) {
        if(ydate == null  ){
            //时间不能为空
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        int days =  DateUtil.daysBetweenDates(new Date(),ydate);
        if(days< 1){
            //只能同步昨天之前的数据
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if( days == 1){
            //只能同步昨天10之前的数据
            Calendar caln = Calendar.getInstance();
            caln.setTime(ydate);
            if(caln.get(Calendar.HOUR_OF_DAY)  > 10){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,最近同步时间只能截止到昨天10点前!");
            }
        }
        return true;
    }
    private void getTotalAndIncome(WxBill bill,Date date) {
        QueryWrapper<Goodsorder> queryWrapper = new QueryWrapper<>();
        queryWrapper.apply("to_char(create_date, 'yyyy-MM-dd') = {0}", date);
@@ -245,6 +370,10 @@
        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" )){
                    //如果是非成功的退款数据,不进行同步
                    continue;
                }
                WxBillDetail detail = new WxBillDetail();
                detail.setId(UUID.randomUUID().toString());
                detail.setPid(bill.getId());
@@ -280,13 +409,18 @@
                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")){
                    //自行车收入累计收款金额(支付成功总金额-退款总金额)
                    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" )){
                        //如果退款成功,扣除退款金额
                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getApplyRefundFee()));
                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getRefundFee()) );
                        bill.setBikeFee(bill.getBikeFee().subtract(detail.getCmmsAmt()) );
                    }
                }
                detailList.add(detail);
            }
        }