jiangping
2023-10-12 7a9f4891bfe7ffff37f3578ff564ee5e24e8232d
结算价格
已修改1个文件
136 ■■■■■ 文件已修改
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -328,12 +328,6 @@
    @Override
    public void forceCloseGoodsorder(String orderId) {
        //查询订单 信息
//        int freeTime = 0;
//        try {
//            freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
//        }catch (Exception e){
//
//        }
        if(StringUtils.isBlank(orderId)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST );
        }
@@ -351,44 +345,18 @@
        goodsorder.setEditor(user.getId());
        closeGoodsorder(  goodsorder,Constants.REFUND_TYPE.PLAT_FORCE.getKey());
    }
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    @Override
    public void closeGoodsorder( Goodsorder goodsorder ,int type ) {
        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
        wrapper.eq(MemberRides::getOrdreId,goodsorder.getId());
        wrapper.leftJoin(BaseParam.class, BaseParam::getId, MemberRides::getParamId);
        wrapper.orderByDesc(BaseParam::getSortnum);//取最高车型作为计价方案
        //查询所有骑行记录
        List<MemberRides> memberRides = memberRidesJoinMapper.selectList(wrapper);
        List<MemberRides> memberRides = getMemberRidesForClose(goodsorder.getId());
        //默认结算为押金金额
        BigDecimal closeMoney = new BigDecimal(0.00);
        if (!CollectionUtils.isEmpty(memberRides)){
            //骑行总时长
            int durationSum = 0;
            for(MemberRides rides : memberRides){
                if ( Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前订单有未完成的骑行,无法强制结算");
                }
                durationSum += Constants.formatIntegerNum(rides.getDuration());//累计骑行(计费)时长
            }
            //取最高车型计算方案结算订单
            MemberRides topRides = memberRides.get(0);
            if(durationSum > 0){
                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())));
                    }
                }
            }
            closeMoney = getCloseMoneyByRides(memberRides,true).getAmount();
            //实际结算价格,记录在最高车型记录上
            topRides.setActualPrice(closeMoney);
            memberRides.get(0).setActualPrice(closeMoney);
            for(MemberRides model :memberRides){
                MemberRides up = new MemberRides();
                up.setId(model.getId());
@@ -451,6 +419,50 @@
        //修改订单信息
        goodsorderMapper.updateById(update);
    }
    private RidesDetailResponse    getCloseMoneyByRides(List<MemberRides> memberRides,boolean isClose) {
        RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
        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 > 0 && 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())));
                }
            }
        }
        ridesDetailResponse.setDuration(durationSum);
        ridesDetailResponse.setAmount(closeMoney);
        ridesDetailResponse.setBikeType(topRides.getParamName());
        return ridesDetailResponse;
    }
    private List<MemberRides> getMemberRidesForClose(String id) {
        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
        wrapper.eq(MemberRides::getOrdreId,id);
        wrapper.selectAll(MemberRides.class).selectAs(BaseParam::getName, MemberRides::getParamName);
        wrapper.leftJoin(BaseParam.class, BaseParam::getId, MemberRides::getParamId);
        wrapper.orderByDesc(BaseParam::getSortnum);//取最高车型作为计价方案
        //查询所有骑行记录
        List<MemberRides> memberRides = memberRidesJoinMapper.selectList(wrapper);
        return memberRides;
    }
    @Override
    public void backGoodsorder(String orderId, BigDecimal money,String reason) {
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
@@ -481,8 +493,10 @@
    @Override
    public GoodsorderCanBanlanceDTO getGoodsorderCanBanlanceDTO(String orderId) {
        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
        if(goodsorder ==null){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        QueryWrapper<Refund> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(Refund::getObjId,orderId)
@@ -558,18 +572,30 @@
    }
    @Override
    public RidesDetailResponse getRidesDetailResponse(String id) {
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(MemberRides::getOrdreId,id);
        List<MemberRides> memberRides = memberRidesJoinMapper.selectList(wrapper);
        Goodsorder goodsorder = goodsorderMapper.selectById(id);
        if(goodsorder ==null){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        List<MemberRides> memberRides = getMemberRidesForClose(id);
        if (!CollectionUtils.isEmpty(memberRides)){
            PricingRuleDTO pricingRule = pricingRuleService.getPricingRule(memberRides);
            RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
            //预计结算价格和计算时长
            int freeTime = 0;
            try {
                freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
            }catch (Exception e){
            }
            int finalFreeTime = freeTime;
            List<MemberRidesResponse> collect = memberRides.stream().map(s -> {
                MemberRidesResponse memberRidesResponse = new MemberRidesResponse();
                Date endTime =memberRidesResponse.getRideEndTime();
                if ( Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(s.getStatus()))){
                 //如果是骑行中
                    endTime = new Date();
                }
                int rideTime =DateUtil.betweenMin(s.getRentDate(), endTime);
                memberRidesResponse.setRideStartTime(s.getRentDate());
                memberRidesResponse.setRideEndTime(s.getBackDate());
                memberRidesResponse.setRideTime(DateUtil.betweenMin(memberRidesResponse.getRideStartTime(), memberRidesResponse.getRideEndTime()));
                memberRidesResponse.setRideEndTime(endTime);
                memberRidesResponse.setRideTime(rideTime);
                memberRidesResponse.setDuration(s.getDuration());
                memberRidesResponse.setBikeType(s.getParamName());
                memberRidesResponse.setBikeCode(s.getBikeCode());
@@ -577,19 +603,19 @@
                memberRidesResponse.setBaseTime(s.getBaseTime());
                memberRidesResponse.setUnitPrice(s.getUnitTime());
                memberRidesResponse.setUnitTime(s.getUnitTime());
                if ( Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(s.getStatus()))){
                    //如果是骑行中
                    s.setDuration(rideTime> finalFreeTime ?(rideTime- finalFreeTime):0);
                }
                s.setRideTime(rideTime);
                return memberRidesResponse;
            }).collect(Collectors.toList());
            Integer durationSum = memberRides.stream().filter(s -> s.getDuration() > 0).mapToInt(s -> s.getDuration()).sum();
            if (durationSum > pricingRule.getMemberRides().getBaseTime()){
                BigDecimal basePrice = pricingRule.getMemberRides().getBasePrice();
                BigDecimal multiply = pricingRule.getMemberRides().getUnitPrice().multiply(new BigDecimal((durationSum - pricingRule.getMemberRides().getBaseTime())));
                ridesDetailResponse.setAmount(basePrice.add(multiply));
            }else {
                ridesDetailResponse.setAmount(pricingRule.getMemberRides().getBasePrice());
            //累计和预算结算金额
            RidesDetailResponse ridesDetailResponse =    getCloseMoneyByRides(memberRides,false);;
            if(Constants.formatIntegerNum(goodsorder.getStatus())!= Constants.goodsorderStatus.pay){
                //如果非已支付但未结算,使用订单金额
                ridesDetailResponse.setAmount(goodsorder.getCloseMoney());
            }
            ridesDetailResponse.setBikeType(pricingRule.getBikeType());
            ridesDetailResponse.setDuration(durationSum);
            ridesDetailResponse.setMemberRidesResponseList(collect);
            return ridesDetailResponse;
        }