111
k94314517
2025-03-20 280cf5981dbcc7b1ca392b7c0e7985aa042b3195
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.constants.Constants;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
@@ -28,6 +29,8 @@
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberRides;
import com.doumee.dao.business.vo.BikeIncomeDetailReportVO;
import com.doumee.dao.business.vo.BikeIncomeReportVO;
import com.doumee.dao.business.vo.GoodsorderExportVO;
import com.doumee.dao.business.vo.GoodsorderTotalDataVO;
import com.doumee.dao.business.web.request.*;
@@ -58,10 +61,14 @@
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.sql.Ref;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
@@ -72,8 +79,6 @@
@Service
@Slf4j
public class GoodsorderServiceImpl implements GoodsorderService {
    @Autowired
    private GoodsorderMapper goodsorderMapper;
@@ -201,7 +206,9 @@
            MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Goodsorder.class);
            queryWrapper.selectAs(Member::getOpenid, Goodsorder::getOpenid);
            queryWrapper.selectAs(BaseParam::getType, Goodsorder::getBikeType);
            queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
            queryWrapper.leftJoin(BaseParam.class, BaseParam::getId  ,Goodsorder::getParamId);
            queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and r.status=2 ) as refund_date");
            queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status=2) as refund_money");
            //时间段筛选
@@ -215,6 +222,9 @@
            queryWrapper.eq(Goodsorder::getPayStatus,Constants.ONE);
            queryWrapper.orderByAsc(Goodsorder::getPayDate);
            goodsorderExportVOIPage = goodsorderJoinMapper.selectJoinPage(page, GoodsorderExportVO.class, queryWrapper);
        }else{
            MPJLambdaWrapper<Refund> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAs(Refund::getMoney,GoodsorderExportVO::getRefundMoney);
@@ -242,6 +252,7 @@
        if (!CollectionUtils.isEmpty(goodsorderExportVOIPage.getRecords())){
            goodsorderExportVOIPage.getRecords().forEach(s->{
                s.setBikeType(s.getType()==Constants.ZERO?s.getBikeType():Constants.ONE);
                s.setMoney(Constants.translateMoney(s.getMoney()));
                s.setRefundMoney(Constants.translateMoney(s.getRefundMoney()));
                s.setCloseMoney(Constants.translateMoney(s.getCloseMoney()).compareTo(s.getMoney()) > 0 ? s.getMoney() : Constants.translateMoney(s.getCloseMoney()));
@@ -259,7 +270,6 @@
            MPJLambdaWrapper<Goodsorder> queryWrapper = initQueryParamByModel(model);
            queryWrapper.orderByAsc(Goodsorder::getPayDate);
           goodsorderList = goodsorderJoinMapper.selectJoinList(GoodsorderExportVO.class,queryWrapper);
        }else{
            MPJLambdaWrapper<Refund> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAs(Refund::getMoney,GoodsorderExportVO::getRefundMoney);
@@ -286,6 +296,7 @@
        }
        if (!CollectionUtils.isEmpty(goodsorderList)){
            goodsorderList.forEach(s->{
                s.setBikeType(s.getType()==Constants.ZERO?s.getBikeType():Constants.ONE);
                s.setMoney(Constants.translateMoney(s.getMoney()));
                s.setCloseMoney(Constants.translateMoney(s.getCloseMoney()).compareTo(s.getMoney()) > 0 ? s.getMoney() : Constants.translateMoney(s.getCloseMoney()));
                s.setRefundMoney(Constants.translateMoney(s.getRefundMoney()));
@@ -299,10 +310,13 @@
        queryWrapper.selectAll(Goodsorder.class);
        queryWrapper.selectAs(Member::getOpenid, Goodsorder::getOpenid);
        queryWrapper.selectAs(DiscountMember::getName, Goodsorder::getDiscountName);
        queryWrapper.selectAs(BaseParam::getType, Goodsorder::getBikeType);
        queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
        queryWrapper.leftJoin(DiscountMember.class, DiscountMember::getId  ,Goodsorder::getObjId);
        queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and  r.status in(0,1)) as refund_date");
        queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status in(0,1)) as refund_money");
        queryWrapper.leftJoin(DiscountMember.class, DiscountMember::getGoodsorderId  ,Goodsorder::getId);
        queryWrapper.leftJoin(BaseParam.class, BaseParam::getId  ,Goodsorder::getParamId);
        queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and  r.status in(0,2)) as refund_date");
        queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status in(0,2)) as refund_money");
        queryWrapper.select("(select  sum(d.ride_price)  from discount_log d where d.goodsorder_id=t.id and d.type = 0) as discountMoney");
        //时间段筛选
        if (Objects.nonNull(model.getStartDate())){
            queryWrapper.ge(Goodsorder::getPayDate, Utils.Date.getStart(model.getStartDate()));
@@ -310,15 +324,18 @@
        if (Objects.nonNull(model.getEndDate())){
            queryWrapper.le( Goodsorder::getPayDate, Utils.Date.getEnd(model.getEndDate()));
        }
        queryWrapper.eq(model.getPayStatus() !=null,Goodsorder::getPayStatus,model.getPayStatus());
        queryWrapper.eq(Objects.nonNull(model.getBikeType()),BaseParam::getType,model.getBikeType());
        queryWrapper.eq(Constants.equalsInteger(model.getType(),Constants.ONE)&&model.getPayStatus() !=null,Goodsorder::getPayStatus,model.getPayStatus());
        queryWrapper.like(model.getCode() !=null,Goodsorder::getCode,model.getCode());
        queryWrapper.like(model.getId() !=null,Goodsorder::getId,model.getId());
        queryWrapper.eq(model.getStatus() !=null,Goodsorder::getStatus,model.getStatus());
        queryWrapper.eq(model.getPayWay() !=null,Goodsorder::getPayWay,model.getPayWay());
        queryWrapper.like(model.getOnlineOrderid() !=null,Goodsorder::getOnlineOrderid,model.getOnlineOrderid());
        queryWrapper.like(model.getOpenid() !=null,Member::getOpenid,model.getOpenid());
        queryWrapper.eq(Goodsorder::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(Goodsorder::getPayStatus,Constants.ONE);
        //如果是骑行订单只显示支付成功的
        queryWrapper.eq(Constants.equalsInteger(model.getType(),Constants.ZERO),Goodsorder::getPayStatus,Constants.ONE);
        queryWrapper.in(Constants.equalsInteger(model.getType(),Constants.ONE),Goodsorder::getStatus,Constants.ONE,Constants.ZERO);
        return  queryWrapper;
    }
@@ -330,8 +347,11 @@
        MPJLambdaWrapper<Goodsorder> queryWrapper = initQueryParamByModel(pageWrap.getModel());
        queryWrapper.orderByDesc(Goodsorder::getPayDate);
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Goodsorder::getType,pageWrap.getModel().getType());
        queryWrapper.select("(select  sum(er.discount_price) from member_rides  er  where er.ordre_id=t.id and er.isdeleted=0) as discountMoney," +
                "(select  er.status from member_rides  er  where er.ordre_id=t.id order by er.create_date desc limit 1) as memberRidesStatus");
        queryWrapper.select("( select s.realname from refund r left join system_user s on r.creator = s.id where r.obj_id = t.id order by r.id desc  limit 1  ) ",Goodsorder::getRefundUserName);
        if(Objects.nonNull(pageWrap.getModel().getCloseStatus()) && pageWrap.getModel().getCloseStatus().equals(Constants.ZERO)){
            queryWrapper.ne(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.CLOSE.getKey());
@@ -339,7 +359,7 @@
        if(Objects.nonNull(pageWrap.getModel().getCloseStatus()) && pageWrap.getModel().getCloseStatus().equals(Constants.ONE)){
            queryWrapper.eq(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.CLOSE.getKey());
        }
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDiscountName()),Goodsorder::getDiscountName,pageWrap.getModel().getDiscountName());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDiscountName()),DiscountMember::getName,pageWrap.getModel().getDiscountName());
        IPage<Goodsorder> goodsorderIPage = goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class, queryWrapper);
        if (!CollectionUtils.isEmpty(goodsorderIPage.getRecords())){
            goodsorderIPage.getRecords().forEach(s->{
@@ -351,7 +371,6 @@
        }
        return PageData.from(goodsorderIPage);
    }
    @Override
    public long count(Goodsorder goodsorder) {
@@ -375,6 +394,7 @@
        homeResponse.setIsStopServe(this.checkTemporaryStop()?1:0);
        homeResponse.setIsBusiness(this.checkBusiness()?0:1);
        homeResponse.setUnBusinessTips("营业时间为"+ systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.BUSINESS_STARTTIME).getCode() +" ~ "+systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.BUSINESS_ENDTIME).getCode()+",请在营业时间内使用本系统");
        homeResponse.setEleBusinessArea(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PARK_LAT_LNG_LIST).getCode());
        homeResponse.setAdList(adMapper.selectList(new QueryWrapper<Ad>()
                .eq("isdeleted",Constants.ZERO)
@@ -385,6 +405,7 @@
                discountMapper.selectList(new QueryWrapper<Discount>().lambda()
                        .eq(Discount::getIsdeleted,Constants.ZERO)
                        .eq(Discount::getStatus,Constants.ZERO)
                        .apply(" now() BETWEEN start_date and  ( end_date   + INTERVAL '1 day' )  ")
                        .orderByDesc(Discount::getId)
                        .last(" limit 3 ")
                )
@@ -404,6 +425,7 @@
        Goodsorder goodsorder = this.goodsorderMapper.selectOne(new QueryWrapper<Goodsorder>()
                .eq("member_id",memberId)
                .eq("status",Constants.goodsorderStatus.pay)
                .eq("type",0)
                .last(" limit 1 "));
        homeResponse.setDepositStatus(Constants.ZERO);
        if(goodsorder!=null){
@@ -454,7 +476,7 @@
                        memberRidesResponse.setVoltageStatus(this.getVoltageStatus(bikes));
                    }
                    //查询当前的骑行套餐
                    memberRidesResponse.setDiscountMember(this.getUseDiscount(memberId,Constants.ZERO));
                    memberRidesResponse.setDiscountMember(this.getUseDiscount(memberId,Constants.ZERO,memberRides.getType()));
                    homeResponse.setMemberRidesResponse(memberRidesResponse);
                }
            }
@@ -465,11 +487,11 @@
    @Override
    public Integer getVoltageStatus(Bikes bikes){
        //低电量电压
        BigDecimal lowVoltage = new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.LOW_VOLTAGE).getCode());
        BigDecimal lowVoltage = new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.LOW_BIKE_VOLTAGE).getCode());
        if(Objects.isNull(bikes)||Objects.isNull(bikes.getVoltage())||Objects.isNull(lowVoltage)){
            return 0;
        }
        return bikes.getVoltage().compareTo(lowVoltage)>0?0:1;
        return bikes.getVoltage().compareTo(lowVoltage)>=0?0:1;
    }
@@ -536,13 +558,16 @@
        if(Constants.equalsInteger(goodsorder.getType(),Constants.ZERO)){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED);
        }
        goodsorder.setMoney(Constants.translateMoney(goodsorder.getMoney()));
        goodsorderDetailVO.setGoodsOrder(goodsorder);
        Member member = memberMapper.selectById(goodsorder.getMemberId());
        if(Objects.nonNull(member)){
            goodsorderDetailVO.setMember(member);
        }
        //查询商品信息
        DiscountMember discountMember = discountMemberMapper.selectById(goodsorder.getObjId());
        DiscountMember discountMember = discountMemberMapper.selectOne(new QueryWrapper<DiscountMember>().lambda()
                .eq(DiscountMember::getIsdeleted,Constants.ZERO)
                .eq(DiscountMember::getGoodsorderId,goodsorder.getId()));
        if(Objects.nonNull(discountMember)){
            goodsorderDetailVO.setDiscountMember(discountMember);
        }
@@ -555,6 +580,13 @@
                        .eq(Refund::getObjId,goodsorder.getId())
                        .orderByDesc(Refund::getId)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(refunds)){
            for (Refund refund:refunds) {
                if(Objects.nonNull(refund.getMoney())){
                    refund.setMoney(Constants.translateMoney(refund.getMoney()));
                }
            }
        }
        goodsorderDetailVO.setRefundList(refunds);
        return goodsorderDetailVO;
@@ -614,7 +646,8 @@
                freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
            }catch (Exception e){
            }
            closeMoney = getCloseMoneyByRides(memberRides,freeTime,true,goodsorder.getMoney(),goodsorder.getMemberId()).getAmount();
            closeMoney = getCloseMoneyByRides(memberRides,freeTime,true,goodsorder.getMoney(),goodsorder.getMemberId(),true).getAmount();
            //实际结算价格,记录在最高车型记录上
//            memberRides.get(0).setActualPrice(closeMoney);
        }
@@ -661,6 +694,31 @@
                memberRidesJoinMapper.updateById(up);
            }
        }
        int durationSum = 0;
        int freeTime = 0;
        try {
            freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
        }catch (Exception e){
        }
        //最高价格车型的骑行记录
        //MemberRides topRides = this.getMaxRides(memberRides,durationSum,freeTime,true);
        MemberRides topRides =null;
        for(MemberRides rides : memberRides){
            if ( true && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前订单有未完成的骑行,无法强制结算");
            }
            durationSum += Constants.formatIntegerNum(rides.getDuration());//累计骑行(计费)时长
            if(durationSum-freeTime > 0 ){//只算超出免费时长的数据
                if(topRides == null ||( Constants.formatIntegerNum(topRides.getSortnum())<Constants.formatIntegerNum(rides.getSortnum())
                        && Constants.formatIntegerNum(rides.getDuration())>0)){
                    topRides = rides;
                }
            }
        }
        //无超过免费时长的骑行记录 查询最后一条记录
        if(Objects.isNull(topRides)){
             topRides = memberRidesJoinMapper.selectOne(new QueryWrapper<MemberRides>().lambda().eq(MemberRides::getOrdreId,goodsorder.getId()).orderByDesc(MemberRides::getCreateDate).last("limit 1"));
        }
//        BigDecimal closeMoney =( Constants.formatDecimalNum(goodsorder.getMoney()).subtract(refund.getMoney()));
        //退款乐行
//       int type =Constants.formatIntegerNum(refund.getType());
@@ -668,10 +726,12 @@
        update.setId(goodsorder.getId());
        update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey());
        update.setCloseMoney(closeMoney);
        update.setParamId(Objects.nonNull(topRides)?topRides.getParamId():null);
        update.setCloseStatus(Constants.ONE);
        update.setCloseDate(new Date());
        update.setCloseInfo(Constants.REFUND_TYPE.get(type).getInfo());
        update.setCloseUserId(goodsorder.getEditor());
        update.setType(Constants.ZERO);
        if(Constants.REFUND_TYPE.PLAT_FORCE.getKey() == type){
            //如果是强制结算
            update.setCloseType(Constants.ONE);
@@ -703,6 +763,23 @@
        transactionsMapper.insert(transactions);
        //修改订单信息
        goodsorderMapper.updateById(update);
    }
    public MemberRides getMaxRides(List<MemberRides> memberRides,Integer durationSum,Integer freeTime,boolean isClose){
        MemberRides topRides =null;
        for(MemberRides rides : memberRides){
            if ( isClose && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前订单有未完成的骑行,无法强制结算");
            }
            durationSum += Constants.formatIntegerNum(rides.getDuration());//累计骑行(计费)时长
            if(durationSum-freeTime > 0 ){//只算超出免费时长的数据
                if(topRides == null ||( Constants.formatIntegerNum(topRides.getSortnum())<Constants.formatIntegerNum(rides.getSortnum())
                        && Constants.formatIntegerNum(rides.getDuration())>0)){
                    topRides = rides;
                }
            }
        }
        return topRides;
    }
    /**
     * 退款成功回调
@@ -778,95 +855,6 @@
        transactionsMapper.insert(transactions);
    }
    private RidesDetailResponse  getCloseMoneyByRides(List<MemberRides> memberRides,int freeTime,boolean isClose,BigDecimal yjMoney,String memberId) {
        RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
        ridesDetailResponse.setHaveDisCount(Constants.ZERO);
        BigDecimal closeMoney = new BigDecimal(0.00);
        int durationSum = 0;
        MemberRides topRides =null;
        //取最高车型计算方案结算订单
        for(MemberRides rides : memberRides){
            if ( isClose && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前订单有未完成的骑行,无法强制结算");
            }
            durationSum += Constants.formatIntegerNum(rides.getDuration());//累计骑行(计费)时长
            if(durationSum-freeTime > 0 ){//只算超出免费时长的数据
                if(topRides == null ||( Constants.formatIntegerNum(topRides.getSortnum())<Constants.formatIntegerNum(rides.getSortnum())
                        && Constants.formatIntegerNum(rides.getDuration())>0)){
                    topRides = rides;
                }
            }
        }
        //计算应付金额
        if( topRides != null){
            int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
            closeMoney = Constants.formatDecimalNum(topRides.getBasePrice());
            //如果是一口价方式,价格直接为一口价baseMoney,如果不是计算正常价格
            if(baseTime != -1){//不是一口价
                if(durationSum > baseTime && Constants.formatIntegerNum(topRides.getUnitTime())>0){
                    //如果超出了起步价格,计算超出价格
                    BigDecimal unit = new BigDecimal(durationSum-baseTime).divide(new BigDecimal(topRides.getUnitTime()), 0, BigDecimal.ROUND_UP);
                    //计算金额累计超出部门价格(超出时间单位*超出单位时间价格)
                    closeMoney = closeMoney.add(unit.multiply(Constants.formatDecimalNum(topRides.getUnitPrice())));
                }
            }
            topRides.setActualPrice(closeMoney);
        }
        //查询是否存在套餐信息
        DiscountMember discountMember = this.getUseDiscount(memberId,durationSum);
        //计算抵扣金额
        if(Objects.nonNull(discountMember) && discountMember.getSurplusTime() > Constants.ZERO && Objects.nonNull(topRides)){
            //存储抵扣记录
            DiscountLog discountLog = new DiscountLog();
            discountLog.setIsdeleted(Constants.ZERO);
            discountLog.setCreator(memberId);
            discountLog.setCreateDate(new Date());
            discountLog.setDiscountMemberId(discountMember.getId());
            discountLog.setType(Constants.ZERO);
            discountLog.setInfo("骑行抵扣");
            discountLog.setEditInfo("骑行抵扣");
            discountLog.setGoodsorderId(topRides.getOrdreId());
            //如果骑行时间小于等于剩余时间 则直接添加 骑行卡使用数据  修正实际支付金额
            if(discountMember.getSurplusTime() >= durationSum){
                discountLog.setRideTime(durationSum);
                discountLog.setRidePrice(closeMoney);
                discountLogMapper.insert(discountLog);
                topRides.setActualPrice(BigDecimal.ZERO);
                closeMoney = BigDecimal.ZERO;
            }else{
                int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
                BigDecimal closeDisCountMoney = Constants.formatDecimalNum(topRides.getBasePrice());
                //如果是一口价方式,价格直接为一口价baseMoney,如果不是计算正常价格
                Integer durationDisCountSum = durationSum - discountMember.getSurplusTime();
                discountLog.setRideTime(discountMember.getSurplusTime());
                if(baseTime != -1){//不是一口价
                    if(durationDisCountSum > baseTime && Constants.formatIntegerNum(topRides.getUnitTime())>0){
                        //如果超出了起步价格,计算超出价格
                        BigDecimal unit = new BigDecimal(durationSum-baseTime).divide(new BigDecimal(topRides.getUnitTime()), 0, BigDecimal.ROUND_UP);
                        //计算金额累计超出部门价格(超出时间单位*超出单位时间价格)
                        closeDisCountMoney = closeDisCountMoney.add(unit.multiply(Constants.formatDecimalNum(topRides.getUnitPrice())));
                    }
                    discountLog.setRidePrice(closeMoney.subtract(closeDisCountMoney));
                }else{
                    discountLog.setRidePrice(BigDecimal.ZERO);
                }
            }
            discountLogMapper.insert(discountLog);
            ridesDetailResponse.setHaveDisCount(Constants.ONE);
            ridesDetailResponse.setDisCountMoney(discountLog.getRidePrice());
        }
        //如果订单价格封顶了,取订单 价格
        if(Constants.compareBigdecimal(closeMoney, yjMoney) ==1){
            closeMoney = yjMoney;
        }
        ridesDetailResponse.setDuration(durationSum);
        ridesDetailResponse.setAmount(closeMoney);
        ridesDetailResponse.setBikeType(topRides!=null?topRides.getParamName():"-");
        return ridesDetailResponse;
    }
    @Override
    public List<MemberRides> getMemberRidesForClose(String id) {
        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
@@ -883,12 +871,113 @@
        return memberRides;
    }
    private RidesDetailResponse  getCloseMoneyByRides(List<MemberRides> memberRides,int freeTime,boolean isClose,BigDecimal yjMoney,String memberId,Boolean unOver) {
        RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
        ridesDetailResponse.setHaveDisCount(Constants.ZERO);
        BigDecimal closeMoney = new BigDecimal(0.00);
        int durationSum = 0;
        //最高价格车型的骑行记录
        //MemberRides topRides = this.getMaxRides(memberRides,durationSum,freeTime,isClose);
        MemberRides topRides =null;
        for(MemberRides rides : memberRides){
            if ( isClose && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前订单有未完成的骑行,无法强制结算");
            }
            durationSum += Constants.formatIntegerNum(rides.getDuration());//累计骑行(计费)时长
            if(durationSum-freeTime > 0 ){//只算超出免费时长的数据
                if(topRides == null ||( Constants.formatIntegerNum(topRides.getSortnum())<Constants.formatIntegerNum(rides.getSortnum())
                        && Constants.formatIntegerNum(rides.getDuration())>0)){
                    topRides = rides;
                }
            }
        }
        //计算应付金额
        if( topRides != null){
            int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
            closeMoney = Constants.formatDecimalNum(topRides.getBasePrice());
            //如果是一口价方式,价格直接为一口价baseMoney,如果不是计算正常价格
            if(baseTime != -1){//不是一口价
                if(durationSum > baseTime && Constants.formatIntegerNum(topRides.getUnitTime())>0){
                    //如果超出了起步价格,计算超出价格
                    BigDecimal unit = new BigDecimal(durationSum-baseTime).divide(new BigDecimal(topRides.getUnitTime()), 0, BigDecimal.ROUND_UP);
                    //计算金额累计超出部门价格(超出时间单位*超出单位时间价格)
                    closeMoney = closeMoney.add(unit.multiply(Constants.formatDecimalNum(topRides.getUnitPrice())));
                }
            }
            topRides.setActualPrice(closeMoney);
            //2025年3月18日11:28:38 返回骑行价格最高的车型
            ridesDetailResponse.setParamId(topRides.getParamId());
        }
        //查询是否存在套餐信息
        DiscountMember discountMember = this.getUseDiscount(memberId,durationSum,Objects.nonNull(topRides)?topRides.getType():null);
        //计算抵扣金额
        //unOver 是否未结算 未结算的订单根据当前套餐查询  已结算的订单根据已生成的数据进行查询
        if(Objects.nonNull(discountMember) && Objects.nonNull(topRides) && unOver){
            //存储抵扣记录
            DiscountLog discountLog = new DiscountLog();
            discountLog.setIsdeleted(Constants.ZERO);
            discountLog.setCreator(memberId);
            discountLog.setCreateDate(new Date());
            discountLog.setDiscountMemberId(discountMember.getId());
            discountLog.setType(Constants.ZERO);
            discountLog.setInfo("骑行抵扣");
            discountLog.setEditInfo("骑行抵扣");
            discountLog.setGoodsorderId(topRides.getOrdreId());
            //如果骑行时间小于等于剩余时间 则直接添加 骑行卡使用数据  修正实际支付金额
            if(Constants.equalsInteger(discountMember.getLimitType(),Constants.ZERO) || discountMember.getSurplusTime() >= durationSum){
                discountLog.setRideTime(durationSum);
                discountLog.setRidePrice(closeMoney);
                topRides.setActualPrice(BigDecimal.ZERO);
                closeMoney = BigDecimal.ZERO;
            }else{
                int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
                BigDecimal closeDisCountMoney = Constants.formatDecimalNum(topRides.getBasePrice());
                //减去优惠时长剩余时长
                Integer durationDisCountSum = durationSum - discountMember.getSurplusTime();
                discountLog.setRideTime(durationDisCountSum<=Constants.ZERO?discountMember.getSurplusTime():Constants.ZERO);
                //如果是一口价方式,价格直接为一口价baseMoney,如果不是计算正常价格
                if(baseTime != -1){//不是一口价
                    if(durationDisCountSum > baseTime && Constants.formatIntegerNum(topRides.getUnitTime())>0){
                        //如果超出了起步价格,计算超出价格
                        BigDecimal unit = new BigDecimal(durationSum-baseTime).divide(new BigDecimal(topRides.getUnitTime()), 0, BigDecimal.ROUND_UP);
                        //计算金额累计超出部门价格(超出时间单位*超出单位时间价格)
                        closeDisCountMoney = closeDisCountMoney.add(unit.multiply(Constants.formatDecimalNum(topRides.getUnitPrice())));
                    }
                    discountLog.setRidePrice(durationDisCountSum<=Constants.ZERO?closeMoney.subtract(closeDisCountMoney):BigDecimal.ZERO);
                }else{
                    discountLog.setRidePrice(BigDecimal.ZERO);
                }
            }
            if(isClose&&discountLog.getRideTime()>Constants.ZERO){
                discountLogMapper.insert(discountLog);
            }
            ridesDetailResponse.setHaveDisCount(discountLog.getRideTime()>Constants.ZERO?Constants.ONE:Constants.ZERO);
            ridesDetailResponse.setDisCountMoney(discountLog.getRidePrice());
        }else if(Objects.nonNull(discountMember) && Objects.nonNull(topRides)
                && !unOver ){
            //已还车则查询是否有 套餐卡使用记录
            List<DiscountLog> discountLogList = discountLogMapper.selectList(new QueryWrapper<DiscountLog>().lambda().eq(DiscountLog::getGoodsorderId,topRides.getOrdreId()).eq(DiscountLog::getType,Constants.ZERO)
                    .eq(DiscountLog::getIsdeleted,Constants.ZERO));
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(discountLogList)){
                ridesDetailResponse.setHaveDisCount(Constants.ONE);
                ridesDetailResponse.setDisCountMoney(discountLogList.stream().map(i->i.getRidePrice()).reduce(BigDecimal.ZERO,BigDecimal::add));
            }
        }
        //如果订单价格封顶了,取订单 价格
        if(Constants.compareBigdecimal(closeMoney, yjMoney) ==1){
            closeMoney = yjMoney;
        }
        ridesDetailResponse.setDuration(durationSum);
        ridesDetailResponse.setAmount(closeMoney);
        ridesDetailResponse.setBikeType(topRides!=null?topRides.getParamName():"-");
        return ridesDetailResponse;
    }
    @Override
    public void backGoodsorder(GoodsorderBackDTO goodsorderBackDTO) {
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(Objects.isNull(goodsorderBackDTO)
        || StringUtils.isBlank(goodsorderBackDTO.getOrderId())
                || StringUtils.isBlank(goodsorderBackDTO.getReason())
                || Objects.isNull(goodsorderBackDTO.getBackType())
                || Objects.isNull(goodsorderBackDTO.getMoney())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -991,6 +1080,7 @@
            model.setPayMoney(new BigDecimal(0.00));
            model.setRefundMoney(new BigDecimal(0.00));
            model.setClosedMoney(new BigDecimal(0.00));
            model.setDiscountMoney(new BigDecimal(0.00));
            model.setUnClosedMoney(new BigDecimal(0.00));
            model.setClosedNum(0);
            model.setUnClosedNum(0);
@@ -1005,28 +1095,36 @@
            }
            queryWrapper.lambda().eq(Goodsorder::getPayStatus, Constants.ONE);//已支付
            queryWrapper.lambda().eq(Goodsorder::getIsdeleted, Constants.ZERO);
            queryWrapper.lambda().groupBy(Goodsorder::getStatus);
            queryWrapper.select( "status ","count(id) as count_num"
            queryWrapper.lambda().groupBy(Goodsorder::getStatus,Goodsorder::getType);
            queryWrapper.select( "type","status ","count(id) as count_num"
                    ,"sum(money) as money","sum(close_money) as close_money" );
            //按订单状态分组统计
            List<Goodsorder> detailList = goodsorderMapper.selectList(queryWrapper);
            for(Goodsorder goodsorder : detailList){
                if(Constants.formatIntegerNum(goodsorder.getStatus()) == Constants.GOODSORDER_STATUS.CLOSE.getKey()){
                    //已结算
                    model.setClosedNum(model.getClosedNum()+goodsorder.getCountNum());
                    //修改bug 结算收入 = 支付金额-退款-未结算
                if(Constants.equalsInteger(goodsorder.getType(),Constants.ZERO)){
                    //如果是骑行订单押金,计算骑行收入
                    if(Constants.formatIntegerNum(goodsorder.getStatus()) == Constants.GOODSORDER_STATUS.CLOSE.getKey()){
                        //已结算
                        model.setClosedNum(model.getClosedNum()+goodsorder.getCountNum());
                        //修改bug 结算收入 = 支付金额-退款-未结算
//                    model.setClosedMoney(model.getClosedMoney().add(Constants.translateMoney(goodsorder.getCloseMoney())));
                    model.setPayNum(model.getPayNum()+goodsorder.getCountNum());
                    model.setPayMoney(model.getPayMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                }else  if(Constants.formatIntegerNum(goodsorder.getStatus()) == Constants.GOODSORDER_STATUS.HAVING_PAY.getKey()){
                    //已支付未结算
                    model.setUnClosedNum(model.getUnClosedNum()+goodsorder.getCountNum());
                    model.setUnClosedMoney(model.getUnClosedMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                        model.setPayNum(model.getPayNum()+goodsorder.getCountNum());
                        model.setPayMoney(model.getPayMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                    }else  if(Constants.formatIntegerNum(goodsorder.getStatus()) == Constants.GOODSORDER_STATUS.HAVING_PAY.getKey()){
                        //已支付未结算
                        model.setUnClosedNum(model.getUnClosedNum()+goodsorder.getCountNum());
                        model.setUnClosedMoney(model.getUnClosedMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                    model.setPayNum(model.getPayNum()+goodsorder.getCountNum());
                    model.setPayMoney(model.getPayMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                        model.setPayNum(model.getPayNum()+goodsorder.getCountNum());
                        model.setPayMoney(model.getPayMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                    }
                }else{
                    //套餐卡收入累计 (交易笔数和交易金额)
                    model.setDiscountNum(model.getDiscountNum()+goodsorder.getCountNum());
                    model.setDiscountMoney(model.getDiscountMoney().add(Constants.translateMoney(goodsorder.getMoney())));
                }
            }
        QueryWrapper<Refund> queryWrapper2 = new QueryWrapper<>();
        if(Objects.nonNull(param.getStartDate())) {
@@ -1044,7 +1142,7 @@
            model.setRefundNum(Constants.formatIntegerNum(refund.getCountNum()));
            model.setRefundMoney(Constants.translateMoney(Constants.formatDecimalNum(refund.getMoney())));
        }
        model.setClosedMoney(model.getPayMoney().subtract(model.getRefundMoney()).subtract(model.getUnClosedMoney()));
        model.setClosedMoney(model.getPayMoney().add(model.getDiscountMoney()).subtract(model.getRefundMoney()).subtract(model.getUnClosedMoney()));
        return  model;
    }
    @Override
@@ -1060,7 +1158,8 @@
                .selectAs(BaseParam::getSortnum,MemberRides::getSortnum)
                .leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId)
                .eq(MemberRides::getOrdreId,id)
                .in(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey(),Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey())
                .in(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()
                        ,Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey(),Constants.MEMBER_RIDES_STATUS.RIDES_PAUSING.getKey())
                .orderByDesc(MemberRides::getCreateDate));
        if (!CollectionUtils.isEmpty(memberRides)){
            //预计结算价格和计算时长
@@ -1096,7 +1195,8 @@
                return memberRidesResponse;
            }).collect(Collectors.toList());
            //累计和预算结算金额
            RidesDetailResponse ridesDetailResponse = getCloseMoneyByRides(memberRides,freeTime,false,goodsorder.getMoney(),goodsorder.getMemberId());
            RidesDetailResponse ridesDetailResponse = getCloseMoneyByRides(memberRides,freeTime,false,goodsorder.getMoney(),goodsorder.getMemberId(),
                    Constants.equalsInteger(goodsorder.getStatus(),Constants.GOODSORDER_STATUS.CLOSE.getKey())?false:true);
            if(Constants.formatIntegerNum(goodsorder.getStatus())!= Constants.goodsorderStatus.pay){
                //如果非已支付但未结算,使用订单金额
                ridesDetailResponse.setAmount(goodsorder.getCloseMoney());
@@ -1118,6 +1218,7 @@
        qry.setStatus(Constants.goodsorderStatus.pay);
        qry.setMemberId(memberId);
        qry.setIsdeleted(Constants.ZERO);
        qry.setType(Constants.ZERO);
        if(goodsorderMapper.selectCount(new QueryWrapper<>(qry))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已支付过定金,无法重复该操作");
        }
@@ -1173,8 +1274,13 @@
        discountMember.setMemberId(memberId);
        discountMember.setStatus(Constants.TWO);
        discountMember.setGoodsorderId(goodsorderId);
        if(!Constants.equalsInteger(discountMember.getUseType(),Constants.ZERO)){
            if(Constants.equalsInteger(discountMember.getUseType(),Constants.ONE)){
                discountMember.setUseStartDate(DateUtil.StringToDateFormat(DateUtil.getCurrDate(),"yyyy-MM-dd"));
            }
            discountMember.setUseEndDate( DateUtil.StringToDateFormat(DateUtil.getXDaysAfter(discountMember.getUseStartDate(),discountMember.getUseDays()-1),"yyyy-MM-dd"));
        }
        discountMemberMapper.insert(discountMember);
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setId(goodsorderId);
        goodsorder.setCreateDate(new Date());
@@ -1206,7 +1312,7 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到套餐信息");
        }
        if(!(Constants.equalsInteger(discount.getIsdeleted(),Constants.ZERO)
            ||Constants.equalsInteger(discount.getStatus(),Constants.ZERO))){
             && Constants.equalsInteger(discount.getStatus(),Constants.ZERO))){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"套餐已下架,无法进行购买,请刷新查看");
        }
        if(!(discount.getStartDate().getTime() < System.currentTimeMillis()
@@ -1214,7 +1320,7 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"套餐开放时间未到,无法进行购买");
        }
        //验证是否超过今日可售卖数量
        if(Objects.nonNull(discount.getSaleDayLimit())){
        if(Objects.nonNull(discount.getSaleDayLimit())&&discount.getSaleDayLimit()>Constants.ZERO){
            if(goodsorderMapper.selectCount(new QueryWrapper<Goodsorder>().lambda()
                    .eq(Goodsorder::getType,Constants.ONE)
                    .eq(Goodsorder::getObjId,discount.getId())
@@ -1224,13 +1330,12 @@
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"套餐今日发行量已售罄,请明日查看!");
            }
        }
        if(Objects.nonNull(discount.getSaleLimit())){
        if(Objects.nonNull(discount.getSaleLimit())&&discount.getSaleLimit()>Constants.ZERO){
            if(goodsorderMapper.selectCount(new QueryWrapper<Goodsorder>().lambda()
                    .eq(Goodsorder::getType,Constants.ONE)
                    .eq(Goodsorder::getObjId,discount.getId())
                    .in(Goodsorder::getStatus,Constants.ZERO,Constants.ONE)
                    .apply(" EXTRACT(YEAR FROM create_date) = EXTRACT(YEAR FROM CURRENT_DATE) ")
            )>=discount.getSaleDayLimit()){
            )>=discount.getSaleLimit()){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"套餐发行量已售罄!");
            }
        }
@@ -1239,8 +1344,8 @@
    private Object getWxPayResponse(Goodsorder goodsorder,String openid){
        Object response = null;
        //调起支付
        Object response = null;
        PrepayRequest request = new PrepayRequest();
        request.setAttach("createGoodsOrder");
        request.setDescription(Constants.equalsInteger(goodsorder.getType(),Constants.ZERO)?"森林公园自行车骑行押金支付":"森林公园自行车购买骑行套餐支付");
@@ -1344,6 +1449,7 @@
    public void autoCloseOrder( ) {
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setIsdeleted(Constants.ZERO);
        goodsorder.setType(Constants.ZERO);
        goodsorder.setStatus(Constants.goodsorderStatus.pay);
        List<Goodsorder> list = findList(goodsorder);
        if (!CollectionUtils.isEmpty(list)){
@@ -1360,13 +1466,14 @@
                }
            });
        }
    }
    @Override
    public void goodsOrderSettlement(String memberId) {
        Goodsorder goodsorder = this.goodsorderMapper.selectOne(new QueryWrapper<Goodsorder>()
                .eq("member_id",memberId)
                .eq("status",Constants.goodsorderStatus.pay)
                .eq("type",Constants.ZERO)
                .last(" limit 1 "));
        if(Objects.isNull(goodsorder)){
            throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"无骑行订单记录");
@@ -1512,7 +1619,11 @@
     * 获取当前可使用的套餐
     * @param memberId
     */
    public DiscountMember getUseDiscount(String memberId,Integer driveTime){
    @Override
    public DiscountMember getUseDiscount(String memberId,Integer driveTime,Integer type){
        if(Objects.isNull(type)){
            return null;
        }
        String today = DateUtil.getToday();
        //判断今天是否为节假日
        Holidays holidays = new Holidays();
@@ -1522,13 +1633,17 @@
        Integer holiday = holidaysMapper.selectCount(new QueryWrapper<>(holidays))>0?1:0;
        List<DiscountMember> discountMemberList = discountMemberMapper.selectJoinList(DiscountMember.class,new MPJLambdaWrapper<DiscountMember>()
                .selectAll(DiscountMember.class)
                .select(" select sum(d.ride_time) from discount_log d  where and d.discount_member_id = discount_member.id " +
                        "and  d.isdeleted = 0 and  d.type = 0 and   EXTRACT(DAY FROM d.create_date) = EXTRACT(DAY FROM CURRENT_DATE) " , DiscountMember::getUseTime)//查询今日已使用时间
                .select(" ( select sum(d.ride_time) from discount_log d  where  d.discount_member_id = t.id " +
                        "and  d.isdeleted = 0 and  d.type = 0 and   EXTRACT(DAY FROM d.create_date) = EXTRACT(DAY FROM CURRENT_DATE) ) " , DiscountMember::getUseTime)//查询今日已使用时间
                .eq(DiscountMember::getStatus,Constants.ZERO)
                .eq(DiscountMember::getMemberId,memberId)
                .ge(DiscountMember::getUseStartDate, Utils.Date.getStart(DateUtil.stringToDate(today,"yyyy-MM-dd")))
                .le(DiscountMember::getUseEndDate, Utils.Date.getEnd(DateUtil.stringToDate(today,"yyyy-MM-dd")))
                .apply("  t.use_start_date <= '"+today+"' and t.use_end_date >= '"+today+"' ")
                .eq(Constants.equalsInteger(holiday,Constants.ZERO),DiscountMember::getUseWorkday,Constants.ONE)
                .eq(Constants.equalsInteger(holiday,Constants.ONE),DiscountMember::getUseHoliday,Constants.ONE)
                .eq(Constants.equalsInteger(type,Constants.ZERO),DiscountMember::getIsbike,Constants.ONE)
                .eq(Constants.equalsInteger(type,Constants.ONE),DiscountMember::getIselecbike,Constants.ONE)
                .orderByDesc(DiscountMember::getLimitType)
                .orderByDesc(DiscountMember::getLimitTime)
        );
@@ -1554,22 +1669,23 @@
                if(list.size()>Constants.ZERO){
                    //d1在前则升序 反之降序
                    list.sort((d1,d2)-> Integer.compare(d2.getSurplusTime(),d1.getSurplusTime()));
                    return list.get(Constants.ZERO);
                }
                return list.get(Constants.ZERO);
            }else{
                //无无期限的套餐 优先查询剩余时长大于骑行时长的信息(取时间最小的套餐) 再查询小于骑行时长的套餐
                List<DiscountMember>  list =  discountMemberList.stream().filter(i->i.getSurplusTime()>=driveTime).collect(Collectors.toList());
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
                    if(list.size()>Constants.ZERO){
                        //d1在前则升序 反之降序
                        list.sort((d1,d2)-> Integer.compare(d2.getSurplusTime(),d1.getSurplusTime()));
                        list.sort((d1,d2)-> Integer.compare(d1.getSurplusTime(),d2.getSurplusTime()));
                        return list.get(Constants.ZERO);
                    }
                    return list.get(Constants.ZERO);
                }
                list =  discountMemberList.stream().filter(i->i.getSurplusTime()<driveTime).collect(Collectors.toList());
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
                    if(list.size()>Constants.ZERO){
                        list.sort((d1,d2)-> Integer.compare(d1.getSurplusTime(),d2.getSurplusTime()));
                        list.sort((d1,d2)-> Integer.compare(d2.getSurplusTime(),d1.getSurplusTime()));
                    }
                    return list.get(Constants.ZERO);
                }
@@ -1579,4 +1695,96 @@
    }
    @Override
    public void autCancel(){
        goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
                .set(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.CANCEL.getKey())
                .set(Goodsorder::getEditDate,DateUtil.getCurrDateTime())
                .eq(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.UN_PAY.getKey())
                .apply(" NOW() >= create_date  + INTERVAL '30 min'  ")
        );
    }
    @Override
    public List<List<String>> getBikeIncomeReportVOList(Date startDate ,Date endDate){
        if( (Objects.isNull(startDate)||Objects.isNull(endDate))
        || startDate.getTime()>endDate.getTime()
        || DateUtil.daysBetweenDates(endDate,startDate) > 30
        )
        {
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        System.out.println( DateUtil.daysBetweenDates(endDate,startDate));
        //获取所有车型信息
        List<BaseParam> baseParamList = baseParamMapper.selectList(new QueryWrapper<BaseParam>().lambda().eq(BaseParam::getIsdeleted,Constants.ZERO)
                .in(BaseParam::getType,Constants.THREE,Constants.FOUR)
                .orderByAsc(BaseParam::getType,BaseParam::getSortnum)
        );
        //获取2个日期下所有天数
        List<Date> dateList = DateUtil.getDateList(startDate,endDate);
        //查询日期内的所有数据
        List<Goodsorder> goodsorderList = goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda().eq(Goodsorder::getType,Constants.ZERO)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .eq(Goodsorder::getStatus,Constants.FOUR)
                .isNotNull(Goodsorder::getParamId)
                .ge(Goodsorder::getPayDate, Utils.Date.getStart(startDate))
                .le( Goodsorder::getPayDate, Utils.Date.getEnd(endDate))
        );
        List<List<String>> parentList = new ArrayList<>();
        for (BaseParam baseParam:baseParamList) {
            List<String> dataChildList = new ArrayList<>();
            dataChildList.add(baseParam.getName()+"(元)");
            BigDecimal totalAmount = BigDecimal.ZERO;
            for (Date date:dateList) {
                BigDecimal amount = goodsorderList.stream()
                        .filter(i->StringUtils.isNotBlank(i.getParamId())&&DateUtil.getShortDateStr(date).equals(DateUtil.getShortDateStr(i.getCreateDate()))&&baseParam.getId().equals(i.getParamId()))
                        .map(i->i.getCloseMoney()).reduce(BigDecimal.ZERO,BigDecimal::add);
                amount = amount.divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP);
                dataChildList.add(amount.toString());
                totalAmount  = amount.add(totalAmount);
            }
            dataChildList.add("¥"+totalAmount);
            parentList.add(dataChildList);
        }
        List<String> dataStrList = new ArrayList<>();
        dataStrList.add("日期");
        for (Date date:dateList) {
            dataStrList.add(DateUtil.getShortDateStr(date));
        }
        dataStrList.add("总计");
        parentList.add(0,dataStrList);
        return parentList;
    }
    @Override
    public void excel(Date startDate , Date endDate, HttpServletResponse response){
        List<List<String>> data = this.getBikeIncomeReportVOList(startDate,endDate);
        try {
            String fileName = "车型收入分析_"+System.currentTimeMillis();
            String encodeFileName = URLEncoder.encode(fileName, Charset.forName("UTF-8").toString()) + ".xlsx";
            response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
            response.setContentType("application/octet-stream");
            response.setHeader("eva-opera-type", "download");
            response.setHeader("eva-download-filename", encodeFileName);
            ExcelExporter.exportList(data, fileName, response.getOutputStream());
        } catch (IOException e) {
            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
        }
    }
}