| | |
| | | package com.xiaopeng.order.service.impl; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.IdUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.google.common.collect.ImmutableMap; |
| | | import com.xiaopeng.api.dto.account.GetUserCouponDto; |
| | | import com.xiaopeng.api.dto.account.UcUserInfo; |
| | | import com.xiaopeng.api.dto.account.UseUserCouponDto; |
| | | import com.xiaopeng.api.dto.account.UserResourcesDto; |
| | | import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import com.xiaopeng.api.dto.order.GetOrderNumDto; |
| | |
| | | import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; |
| | | import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; |
| | | import com.xiaopeng.api.feignClient.account.UserResourcesClient; |
| | | import com.xiaopeng.api.feignClient.account.XpAppUserClient; |
| | | import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; |
| | | import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; |
| | | import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient; |
| | |
| | | import com.xiaopeng.api.feignClient.operation.XpPointClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpPricingClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient; |
| | | import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.account.XpAppUser; |
| | | import com.xiaopeng.api.model.maintenance.XpTaskRule; |
| | | import com.xiaopeng.api.model.operation.*; |
| | | import com.xiaopeng.api.model.order.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleet; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.vo.OrderType; |
| | | import com.xiaopeng.api.vo.account.GetUserListByUidsVo; |
| | | import com.xiaopeng.api.vo.account.UserCouponVo; |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | | import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.OrderOperationType; |
| | |
| | | import com.xiaopeng.order.service.IXpOrderReassignService; |
| | | import com.xiaopeng.order.service.IXpOrderService; |
| | | import com.xiaopeng.order.utils.TaxiPricingDemoService; |
| | | import com.xiaopeng.order.utils.TrajectoryGenerator; |
| | | import com.xiaopeng.order.utils.holiday.HolidayUtil; |
| | | import com.xiaopeng.order.vo.OrderDetailVo; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; |
| | | import org.apache.shardingsphere.transaction.core.TransactionType; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | |
| | | import org.springframework.data.mongodb.core.MongoTemplate; |
| | | import org.springframework.data.mongodb.core.query.Criteria; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | |
| | | } |
| | | |
| | | // 4. 批量查询关联数据 |
| | | JSONObject jsonObject = batchGetUsers(userIds); |
| | | Map<String, UcUserInfo> userInfoMap = batchGetUsers(userIds); |
| | | Map<Long, XpVehicle> vehicleMap = batchGetVehicles(vehicleIds); |
| | | Map<Long, XpFleet> fleetMap = batchGetFleets(fleetIds); |
| | | |
| | | // 5. 组装 VO |
| | | List<XpOrderPageVO> voList = pageResult.getRecords().stream() |
| | | .map(order -> convertToPageVO(order, jsonObject, vehicleMap, fleetMap)) |
| | | .map(order -> convertToPageVO(order, userInfoMap, vehicleMap, fleetMap)) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 6. 返回分页结果 |
| | |
| | | |
| | | // 3. 获取用户信息 |
| | | if (Objects.nonNull(order.getAppUserId())) { |
| | | JSONObject jsonObject = batchGetUsers(Collections.singleton(order.getAppUserId())); |
| | | JSONObject userInfo = jsonObject.getJSONObject(order.getAppUserId().toString()); |
| | | if (Objects.nonNull(userInfo)) { |
| | | vo.setNickName(userInfo.getString("nickName")); |
| | | vo.setPhoneNumber(userInfo.getString("mobile")); |
| | | Map<String, UcUserInfo> userInfoMap = batchGetUsers(Collections.singleton(order.getAppUserId())); |
| | | if (CollUtil.isNotEmpty(userInfoMap)) { |
| | | UcUserInfo userInfo = userInfoMap.get(order.getAppUserId()); |
| | | if (Objects.nonNull(userInfo)) { |
| | | vo.setNickName(userInfo.getNickName()); |
| | | vo.setPhoneNumber(userInfo.getMobile()); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // 4. 批量查询关联数据 |
| | | JSONObject jsonObject = batchGetUsers(userIds); |
| | | Map<String, UcUserInfo> userInfoMap = batchGetUsers(userIds); |
| | | Map<Long, XpVehicle> vehicleMap = batchGetVehicles(vehicleIds); |
| | | Map<Long, XpFleet> fleetMap = batchGetFleets(fleetIds); |
| | | |
| | | // 5. 组装 VO |
| | | return orderList.stream() |
| | | .map(order -> convertToPageVO(order, jsonObject, vehicleMap, fleetMap)) |
| | | .map(order -> convertToPageVO(order, userInfoMap, vehicleMap, fleetMap)) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | |
| | | /** |
| | | * 批量获取用户信息 |
| | | */ |
| | | private JSONObject batchGetUsers(Set<Long> userIds) { |
| | | private Map<String, UcUserInfo> batchGetUsers(Set<Long> userIds) { |
| | | if (CollectionUtils.isEmpty(userIds)) { |
| | | return new JSONObject(); |
| | | return new HashMap<>(); |
| | | } |
| | | try { |
| | | GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo(); |
| | | getUserListByUidsVo.setUids(new ArrayList<>(userIds)); |
| | | getUserListByUidsVo.setGetPreCarOwner(Boolean.TRUE); |
| | | UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); |
| | | if (userListByUids.getCode().equals(HttpStatus.SUCCESS)) { |
| | | return JSONObject.parseObject(userListByUids.getData().toString()); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("批量获取用户信息失败: {}", e.getMessage()); |
| | | } |
| | | return new JSONObject(); |
| | | return userResourcesClient.getUserListByUids(new ArrayList<>(userIds), false); |
| | | } |
| | | |
| | | /** |
| | |
| | | * 转换为分页列表 VO |
| | | */ |
| | | private XpOrderPageVO convertToPageVO(XpOrder order, |
| | | JSONObject jsonObject, |
| | | Map<String, UcUserInfo> userInfoMap, |
| | | Map<Long, XpVehicle> vehicleMap, |
| | | Map<Long, XpFleet> fleetMap) { |
| | | XpOrderPageVO vo = new XpOrderPageVO(); |
| | |
| | | vo.setStatus(order.getStatus()); |
| | | |
| | | // 用户信息 |
| | | if (Objects.nonNull(order.getAppUserId()) && jsonObject.containsKey(order.getAppUserId().toString())) { |
| | | JSONObject userInfo = jsonObject.getJSONObject(order.getAppUserId().toString()); |
| | | vo.setNickName(userInfo.getString("nickName")); |
| | | vo.setPhoneNumber(userInfo.getString("mobile")); |
| | | if (Objects.nonNull(order.getAppUserId()) && userInfoMap.containsKey(order.getAppUserId().toString())) { |
| | | UcUserInfo userInfo = userInfoMap.get(order.getAppUserId().toString()); |
| | | vo.setNickName(userInfo.getNickName()); |
| | | vo.setPhoneNumber(userInfo.getMobile()); |
| | | } |
| | | |
| | | // 车辆信息 |
| | |
| | | // 保留2位数小数 |
| | | Double distance = datum.getDistance(); |
| | | datum.setDistance(BigDecimal.valueOf(distance).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | xpOrders.stream().filter(e->e.getStartPointId().equals(datum.getId())).findFirst().ifPresent( |
| | | order->{ |
| | | xpOrders.stream().filter(e -> e.getStartPointId().equals(datum.getId())).findFirst().ifPresent( |
| | | order -> { |
| | | datum.setNum(order.getNum()); |
| | | } |
| | | ); |
| | | } |
| | | data = data.stream().sorted(Comparator.comparingInt(XpHistoryStartPointsVo::getNum).reversed()).collect(Collectors.toList()); |
| | | data = data.stream().sorted(Comparator.comparingInt(XpHistoryStartPointsVo::getNum).reversed()).collect(Collectors.toList()); |
| | | |
| | | return data; |
| | | |
| | |
| | | // 保留2位数小数 |
| | | Double distance = datum.getDistance(); |
| | | datum.setDistance(BigDecimal.valueOf(distance).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | xpOrders.stream().filter(e->e.getEndPointId().equals(datum.getId())).findFirst().ifPresent( |
| | | order->{ |
| | | xpOrders.stream().filter(e -> e.getEndPointId().equals(datum.getId())).findFirst().ifPresent( |
| | | order -> { |
| | | datum.setNum(order.getNum()); |
| | | } |
| | | ); |
| | | } |
| | | data = data.stream().sorted(Comparator.comparingInt(XpHistoryEndPointsVo::getNum).reversed()).collect(Collectors.toList()); |
| | | data = data.stream().sorted(Comparator.comparingInt(XpHistoryEndPointsVo::getNum).reversed()).collect(Collectors.toList()); |
| | | |
| | | return data; |
| | | |
| | |
| | | Page<XpOrderHistoryListVO> page = new Page<>(query.getPageNum(), query.getPageSize()); |
| | | List<XpOrderHistoryListVO> list = this.baseMapper.getHistoryOrderList(page, query, Long.parseLong(uid)); |
| | | XpOrderHistoryVO xpOrderHistoryVO = new XpOrderHistoryVO(); |
| | | if(list.isEmpty()){ |
| | | if (list.isEmpty()) { |
| | | return xpOrderHistoryVO; |
| | | } |
| | | |
| | |
| | | |
| | | for (XpOrderHistoryListVO xpOrderHistoryListVO : value) { |
| | | XpPoint xpPoint = pointList.stream().filter(e -> e.getId().equals(xpOrderHistoryListVO.getStartPointId())).findFirst().orElse(null); |
| | | if(xpPoint!=null){ |
| | | if (xpPoint != null) { |
| | | xpOrderHistoryListVO.setStartPointName(xpPoint.getPointName()); |
| | | xpOrderHistoryListVO.setStartLat(xpPoint.getPointLat()); |
| | | xpOrderHistoryListVO.setStartLon(xpPoint.getPointLon()); |
| | |
| | | } |
| | | |
| | | xpPoint = pointList.stream().filter(e -> e.getId().equals(xpOrderHistoryListVO.getEndPointId())).findFirst().orElse(null); |
| | | if(xpPoint!=null){ |
| | | if (xpPoint != null) { |
| | | xpOrderHistoryListVO.setEndPointName(xpPoint.getPointName()); |
| | | xpOrderHistoryListVO.setEndLat(xpPoint.getPointLat()); |
| | | xpOrderHistoryListVO.setEndLon(xpPoint.getPointLon()); |
| | |
| | | public void cancelOrder(Long orderId, String uid) { |
| | | XpOrder order = this.getById(orderId); |
| | | if (order == null) { |
| | | throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | throw new ServiceException("订单不存在", I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | } |
| | | if (!order.getAppUserId().toString().equals(uid)) { |
| | | throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | throw new ServiceException("订单不存在", I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | } |
| | | if (order.getStatus() > 5 || order.getStatus() < 1) { |
| | | throw new ServiceException("订单状态错误",I18nKeyConstant.ORDER_STATUS_ERROR); |
| | | throw new ServiceException("订单状态错误", I18nKeyConstant.ORDER_STATUS_ERROR); |
| | | } |
| | | if(order.getStatus()==1){ |
| | | if (order.getStatus() == 1) { |
| | | order.setStatus(0); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId); |
| | | XpVehicle xpVehicle = xpVehicleR.getData(); |
| | | if (xpVehicle == null) { |
| | | throw new ServiceException("车辆不存在",I18nKeyConstant.VEHICLE_NOT_EXISTS); |
| | | throw new ServiceException("车辆不存在", I18nKeyConstant.VEHICLE_NOT_EXISTS); |
| | | } |
| | | cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin()); |
| | | cancelTaxiPassengerVo.setUid(order.getAppUserId().toString()); |
| | |
| | | cancelTaxiPassengerVo.setAppId(""); |
| | | |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | if (baseVehicleUserDto==null) { |
| | | if (baseVehicleUserDto == null) { |
| | | // TODO 本地无法调通 |
| | | // throw new RuntimeException("取消订单失败"); |
| | | } |
| | |
| | | } |
| | | |
| | | // 下发命令 |
| | | if(order.getStatus()>1){ |
| | | if (order.getStatus() > 1) { |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setOrderId(order.getId().toString()); |
| | | pushOrderDto.setVin(xpVehicle.getVehicleVin()); |
| | |
| | | public void cancelOrder(String orderId) { |
| | | XpOrder order = this.getById(orderId); |
| | | if (order == null) { |
| | | throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | throw new ServiceException("订单不存在", I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | } |
| | | order.setStatus(0); |
| | | order.setAppUserId(null); |
| | |
| | | log.info("订单取消消息推送完毕"); |
| | | |
| | | // 下发命令 |
| | | if(order.getStatus()>1){ |
| | | if (order.getStatus() > 1) { |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setOrderId(order.getId().toString()); |
| | | pushOrderDto.setVin(xpVehicle.getVehicleVin()); |
| | |
| | | public void comment(XpOrderCommentDto dto, String uid) { |
| | | XpOrder xpOrder = this.getById(dto.getOrderId()); |
| | | if (xpOrder == null) { |
| | | throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | throw new ServiceException("订单不存在", I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | } |
| | | if (!xpOrder.getAppUserId().toString().equals(uid)) { |
| | | throw new ServiceException("订单不存在",I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | throw new ServiceException("订单不存在", I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | } |
| | | if (xpOrder.getStatus() != 9) { |
| | | throw new ServiceException("订单状态错误",I18nKeyConstant.ORDER_STATUS_ERROR); |
| | | throw new ServiceException("订单状态错误", I18nKeyConstant.ORDER_STATUS_ERROR); |
| | | } |
| | | xpOrder.setAppUserId(null); |
| | | xpOrder.setStatus(10); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | // 根据订单所属开通城市id 查询定价 |
| | | R<XpPricing> pricingByCityId = xpPricingClient.getPricingByCid(order.getCityId()); |
| | | XpPricing pricing = pricingByCityId.getData(); |
| | |
| | | // TaxiPricingDemoService.GpsPoint point = new TaxiPricingDemoService.GpsPoint(trajectory.getDistance(), trajectory.getLocatetime()); |
| | | // gpsPoints.add(point); |
| | | // } |
| | | // 补充临时轨迹数据 |
| | | // 补充临时轨迹数据 |
| | | List<TaxiPricingDemoService.GpsPoint> gpsPoints = TaxiPricingDemoService.createMockGpsPoints(DateUtils.toDate(order.getCreateTime())); |
| | | |
| | | |
| | | TaxiPricingDemoService.PricingConfig config = new TaxiPricingDemoService.PricingConfig(); |
| | | JSONArray startingFareJsonArray = JSONArray.parseArray(pricing.getStartingFareJson()); |
| | | if(pricing.getPricingType()==1){ |
| | | if (pricing.getPricingType() == 1) { |
| | | JSONObject basicPricingJson = JSONObject.parseObject(pricing.getBasicPricingJson()); |
| | | config.peaks.add(new TaxiPricingDemoService.PricingRule("高峰期", basicPricingJson.getString("num21").split(" - ")[0], basicPricingJson.getString("num21").split(" - ")[1], Double.parseDouble(basicPricingJson.getString("num24")), Double.parseDouble(basicPricingJson.getString("num25")), Double.parseDouble(basicPricingJson.getString("num26")), Double.parseDouble(basicPricingJson.getString("num27")), Double.parseDouble(basicPricingJson.getString("num28")))); |
| | | config.peaks.add(new TaxiPricingDemoService.PricingRule("高峰期", basicPricingJson.getString("num22").split(" - ")[0], basicPricingJson.getString("num22").split(" - ")[1], Double.parseDouble(basicPricingJson.getString("num24")), Double.parseDouble(basicPricingJson.getString("num25")), Double.parseDouble(basicPricingJson.getString("num26")), Double.parseDouble(basicPricingJson.getString("num27")), Double.parseDouble(basicPricingJson.getString("num28")))); |
| | |
| | | System.err.println("--------------------------"); |
| | | System.err.println("应付总额: " + totalAmount + " 元"); |
| | | BigDecimal startMoney = BigDecimal.ZERO; |
| | | // 默认费率1 |
| | | // 默认费率1 |
| | | double priceRate = 1; |
| | | if (pricing.getIsDynamicPrice() == 1) { |
| | | // 先判断是否已经调价过了 |
| | |
| | | xpOrderDetailMapper.insert(xpOrderDetail); |
| | | } |
| | | for (XpOrderDetail xpOrderDetail : xpOrderDetails) { |
| | | if (xpOrderDetail.getDetailType() == 1){ |
| | | if (xpOrderDetail.getDetailType() == 1) { |
| | | order.setDurationType(xpOrderDetail.getType()); |
| | | order.setDurationMoney(xpOrderDetail.getMoney()); |
| | | order.setDuration(Double.parseDouble(xpOrderDetail.getDuration() + "")); |
| | | }else{ |
| | | } else { |
| | | order.setLongDistanceType(order.getDurationType()); |
| | | order.setLongDistance(xpOrderDetail.getMileage().doubleValue()); |
| | | order.setLongDistancemoney(xpOrderDetail.getMoney()); |
| | |
| | | |
| | | BigDecimal orderMoney = startMoney.add(mileageMoney).add(order.getDurationMoney() != null ? order.getDurationMoney() : BigDecimal.ZERO) |
| | | .add(order.getLongDistancemoney() != null ? order.getLongDistancemoney() : BigDecimal.ZERO) |
| | | .add(order.getWaitMoney()!=null?order.getWaitMoney():BigDecimal.ZERO); |
| | | .add(order.getWaitMoney() != null ? order.getWaitMoney() : BigDecimal.ZERO); |
| | | order.setOrderMoney(orderMoney); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | |
| | | useUserCouponDto.setUserCouponId(order.getCouponId()); |
| | | xpAppUserCouponClient.useUserCoupon(useUserCouponDto); |
| | | } |
| | | // 计算完价格后 挑选优惠券 |
| | | // 计算完价格后 挑选优惠券 |
| | | GetUserCouponDto getUserCouponDto = new GetUserCouponDto(); |
| | | getUserCouponDto.setUserId(Long.valueOf(uid)); |
| | | getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue()); |
| | |
| | | baseMapper.updateById(order); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | // 结束后的车辆操作 |
| | | if(vehicle!=null){ |
| | | if (vehicle != null) { |
| | | // 修改车辆状态 |
| | | vehicle.setState(0); |
| | | |
| | | |
| | | addCruiseMission(vehicle,order); |
| | | addCruiseMission(vehicle, order); |
| | | // // 获取配置 根据配置判断是否该收车 如果是则找到收车点位进行收车操作 |
| | | // R<XpTaskRule> xpTaskRuleR = xpTaskRuleClient.queryDetail(); |
| | | // XpTaskRule xpTaskRule = xpTaskRuleR.getData(); |
| | |
| | | |
| | | /** |
| | | * 添加巡游任务下发命令 |
| | | * |
| | | * @param vehicle |
| | | * @param order |
| | | */ |
| | | |
| | | public void addCruiseMission(XpVehicle vehicle, XpOrder order) { |
| | | |
| | | if(vehicle.getState()!=0 || vehicle.getOperatingStatus()!=1){ |
| | | if (vehicle.getState() != 0 || vehicle.getOperatingStatus() != 1) { |
| | | return; |
| | | } |
| | | |
| | | // 判断是否有计划 |
| | | R<XpCruisePlanVehicle> xpCruisePlanR = xpCruisePlanClient.getCruisePlan(vehicle.getId()); |
| | | if(xpCruisePlanR==null || xpCruisePlanR.getData()==null){ |
| | | if (xpCruisePlanR == null || xpCruisePlanR.getData() == null) { |
| | | return; |
| | | } |
| | | |
| | |
| | | |
| | | // 生成新的巡游单子 回到最新巡游的初始起点位置 |
| | | XpCruiseOrder xpCruiseOrders = xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("limit 1")); |
| | | int temp=0; |
| | | if(xpCruiseOrders==null){ |
| | | temp=1; |
| | | int temp = 0; |
| | | if (xpCruiseOrders == null) { |
| | | temp = 1; |
| | | //特殊情况 可能没有产生终止的订单 (到站点就被正常接单了)所以找正常订单 |
| | | xpCruiseOrders=xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 3).orderByDesc(BaseModel::getCreateTime).last("limit 1")); |
| | | xpCruiseOrders = xpCruiseOrderMapper.selectOne(new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleId, vehicle.getId()).eq(XpCruiseOrder::getStatus, 3).orderByDesc(BaseModel::getCreateTime).last("limit 1")); |
| | | } |
| | | XpCruiseOrder xpCruiseOrder = new XpCruiseOrder(); |
| | | xpCruiseOrder.setVehicleId(vehicle.getId()); |
| | |
| | | xpCruiseOrder.setStartLat(order.getEndLat()); |
| | | |
| | | // 完成的直接走终点 终止的走起点 |
| | | if(temp==0){ |
| | | if (temp == 0) { |
| | | xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId()); |
| | | xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName()); |
| | | xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon()); |
| | | xpCruiseOrder.setEndLat(xpCruiseOrders.getStartLat()); |
| | | }else { |
| | | } else { |
| | | xpCruiseOrder.setEndPointId(xpCruiseOrders.getEndPointId()); |
| | | xpCruiseOrder.setEndPointName(xpCruiseOrders.getEndPointName()); |
| | | xpCruiseOrder.setEndLon(xpCruiseOrders.getEndLon()); |
| | |
| | | xpCruiseOrder.setStatus(0); |
| | | xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId()); |
| | | xpCruiseOrder.setCreateTime(LocalDateTime.now()); |
| | | xpCruiseOrder.setId("XU"+ IdUtil.fastUUID()); |
| | | xpCruiseOrder.setId("XU" + IdUtil.fastUUID()); |
| | | |
| | | // 判断当前时分秒是否大于收车时间 |
| | | LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime(); |
| | |
| | | detail.setTime(xpOrderDetail.getTime()); |
| | | detail.setMileage(xpOrderDetail.getMileage()); |
| | | detail.setDuration(xpOrderDetail.getDuration()); |
| | | if (xpOrderDetail.getDetailType() == 1){ |
| | | if (xpOrderDetail.getDetailType() == 1) { |
| | | start.add(detail); |
| | | }else{ |
| | | } else { |
| | | mileage.add(detail); |
| | | } |
| | | } |
| | | List<FareBreakdownDetailVo> duration = new ArrayList<>(); |
| | | if (order.getDuration()!=null&&order.getDuration()>0){ |
| | | if (order.getDuration() != null && order.getDuration() > 0) { |
| | | FareBreakdownDetailVo durationDetail = new FareBreakdownDetailVo(); |
| | | durationDetail.setType(order.getDurationType()); |
| | | durationDetail.setDuration(order.getDuration()); |
| | |
| | | } |
| | | List<FareBreakdownDetailVo> longDistance = new ArrayList<>(); |
| | | |
| | | if (order.getLongDistance()!=null&&order.getLongDistance()>0){ |
| | | if (order.getLongDistance() != null && order.getLongDistance() > 0) { |
| | | FareBreakdownDetailVo longDistanceDetail = new FareBreakdownDetailVo(); |
| | | longDistanceDetail.setType(order.getLongDistanceType()); |
| | | longDistanceDetail.setMileage(BigDecimal.valueOf(order.getLongDistance())); |
| | | longDistanceDetail.setMoney(order.getLongDistancemoney()); |
| | | longDistance.add(longDistanceDetail); |
| | | } |
| | | res.setStart( start); |
| | | res.setMileage( mileage); |
| | | res.setDuration( duration); |
| | | res.setLongDistance( longDistance); |
| | | res.setStart(start); |
| | | res.setMileage(mileage); |
| | | res.setDuration(duration); |
| | | res.setLongDistance(longDistance); |
| | | res.setRedPacketMoney(order.getRedPacketMoney()); |
| | | res.setCouponMoney(order.getCouponMoney()); |
| | | res.setOrderMoney(order.getOrderMoney()); |
| | | res.setKilometer(order.getMileageKilometers()==null?BigDecimal.ZERO:BigDecimal.valueOf(order.getMileageKilometers())); |
| | | res.setKilometer(order.getMileageKilometers() == null ? BigDecimal.ZERO : BigDecimal.valueOf(order.getMileageKilometers())); |
| | | LocalDateTime createTime = order.getCreateTime(); |
| | | LocalDateTime tripEnd = order.getTripEnd(); |
| | | if (tripEnd==null){ |
| | | if (tripEnd == null) { |
| | | tripEnd = LocalDateTime.now(); |
| | | order.setTripEnd(tripEnd); |
| | | this.updateById(order); |
| | |
| | | XpPricing pricing = pricingByCityId.getData(); |
| | | if (pricing == null) { |
| | | throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS); |
| | | }else{ |
| | | } else { |
| | | return R.ok(pricing.getPriceRule()); |
| | | } |
| | | } |
| | |
| | | * @param dto |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | @ShardingSphereTransactionType(TransactionType.BASE) |
| | | // @Transactional |
| | | // @ShardingSphereTransactionType(TransactionType.BASE) |
| | | public void popOrder(PopOrderDto dto) { |
| | | String orderType = dto.getOrderType(); |
| | | Long orderId = dto.getOrderId(); |
| | | //巡游单处理逻辑 |
| | | if(OrderType.CRUISE_ORDER.equals(orderType)){ |
| | | if (OrderType.CRUISE_ORDER.equals(orderType)) { |
| | | XpCruiseOrder xpCruiseOrder = xpCruiseOrderMapper.selectById(orderId); |
| | | if(xpCruiseOrder!=null){ |
| | | if (xpCruiseOrder != null) { |
| | | xpCruiseOrder.setStatus(1); |
| | | xpCruiseOrderMapper.updateById(xpCruiseOrder); |
| | | } |
| | |
| | | |
| | | } |
| | | //乘客单处理逻辑 |
| | | if(OrderType.USER_ORDER.equals(orderType)){ |
| | | if (OrderType.USER_ORDER.equals(orderType)) { |
| | | XpOrder order = this.getById(orderId); |
| | | Long appUserId = order.getAppUserId(); |
| | | //订单为待接单状态 |
| | | if(order.getStatus() < 4){ |
| | | if (order.getStatus() < 4) { |
| | | AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo(); |
| | | order.setAcceptanceTime(LocalDateTime.now()); |
| | | R<XpVehicle> byVehicleVin = xpVehicleClient.findByVehicleVin(dto.getXpVehicleVin()); |
| | |
| | | userVehicleClient.addTaxiPassenger(addTaxiPassengerVo); |
| | | //推送乘客车辆到达预约点的导航数据 |
| | | sendRoute(addTaxiPassengerVo.getUid(), orderId, "ORDER_NAVIGATION_START_DATA", dto.getXpVehicleVin()); |
| | | }else{ |
| | | } else { |
| | | //推送行起点到终点的驶轨迹给乘客端 |
| | | sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", dto.getXpVehicleVin()); |
| | | } |
| | |
| | | |
| | | /** |
| | | * 发送乘客导航路径数据 |
| | | * |
| | | * @param appUserId |
| | | * @param keyStr |
| | | */ |
| | | public void sendRoute(String appUserId, Long orderId, String keyStr, String vin){ |
| | | public void sendRoute(String appUserId, Long orderId, String keyStr, String vin) { |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class); |
| | | Object cacheObject = redisService.getCacheObject(keyStr + ":" + appUserId); |
| | | if(null != cacheObject){ |
| | | if (null != cacheObject) { |
| | | RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("type", "ORDER_ROUTE"); |
| | |
| | | route.put("duration", routeVo.getDuration()); |
| | | route.put("routeID", routeVo.getRouteID()); |
| | | |
| | | List<JSONObject> collect = routeVo.getPolyline().stream().map(item->{ |
| | | List<JSONObject> collect = routeVo.getPolyline().stream().map(item -> { |
| | | JSONObject point = new JSONObject(); |
| | | point.put("latitude", item.getLatitude()); |
| | | point.put("longitude", item.getLongitude()); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取当前用户正在执行的订单 |
| | | * |
| | |
| | | @Override |
| | | public XpOrderDetailVO getActiveOrder(String uid) { |
| | | XpOrderDetailVO xpOrderDetailVO = new XpOrderDetailVO(); |
| | | XpOrder xpOrder = this.baseMapper.selectOne(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).in(XpOrder::getStatus, Arrays.asList(1,2,3, 4, 5, 6, 7, 8)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1")); |
| | | XpOrder xpOrder = this.baseMapper.selectOne(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).in(XpOrder::getStatus, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1")); |
| | | if (xpOrder == null) { |
| | | return null; |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | if(xpOrder.getVehicleId()!=null){ |
| | | if (xpOrder.getVehicleId() != null) { |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(xpOrder.getVehicleId()); |
| | | xpOrderDetailVO.setPlateNumber(xpVehicleR.getData().getPlateNumber()); |
| | | } |