| | |
| | | @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 ); |
| | | } |
| | |
| | | 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()); |
| | |
| | | //修改订单信息 |
| | | 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(); |
| | |
| | | @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) |
| | |
| | | } |
| | | @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()); |
| | |
| | | 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; |
| | | } |