xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpOperationsUserServiceImpl.java
@@ -1,7 +1,6 @@ package com.xiaopeng.account.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -159,23 +158,20 @@ } // 8. 查询角色信息 List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper .selectList(new LambdaQueryWrapper<XpOperationsRole>().eq(XpOperationsRole::getOperationsUserId, userId)); if (CollUtil.isNotEmpty(xpOperationsRoles)) { List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList()); List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery(SysRole.class) .in(SysRole::getId, roleIds)); List<XpOperationsUserProfileVO.RoleInfoVO> roleVOs = sysRoles.stream() .filter(r -> r.getId() != null) List<XpOperationsUserWithRoleVO> userWithRoles = xpOperationsRoleMapper.selectUsersWithRoleByIds(Collections.singletonList(userId)); if (!CollectionUtils.isEmpty(userWithRoles)) { List<XpOperationsUserProfileVO.RoleInfoVO> roleVOs = userWithRoles.stream() .filter(r -> r.getRoleId() != null) .map(r -> { XpOperationsUserProfileVO.RoleInfoVO roleVO = new XpOperationsUserProfileVO.RoleInfoVO(); roleVO.setRoleId(r.getId()); roleVO.setRoleId(r.getRoleId()); roleVO.setRoleName(r.getRoleName()); return roleVO; }) .collect(Collectors.toList()); vo.setRoles(roleVOs); } return vo; } @@ -187,7 +183,6 @@ //保存审核记录 XpQualificationAudit xpQualificationAudit = BeanUtil.copyProperties(dto, XpQualificationAudit.class, "id"); xpQualificationAudit.setAuditStatus(1); xpQualificationAudit.setOperationsUserId(dto.getId()); xpQualificationAuditService.save(xpQualificationAudit); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ReassignOrderDTO.java
@@ -21,15 +21,4 @@ @ApiModelProperty(value = "订单号") private String orderNo; @ApiModelProperty(value = "订单id") private Long orderId; @ApiModelProperty(value = "车辆id") private Long vehicleId; @ApiModelProperty(value = "车队id") private Long fleetId; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpReassignOrderClientFallbackFactory.java
File was deleted xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpReassignOrderClient.java
File was deleted xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpSchedulingDetail.java
@@ -1,5 +1,6 @@ package com.xiaopeng.api.model.maintenance; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -48,6 +49,7 @@ private Boolean isAllDay; @ApiModelProperty(value = "计划时间") @TableField("plan_time") private LocalDate planTime; } xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -36,6 +36,7 @@ com.xiaopeng.api.factory.maintenance.XpClockInClientFallbackFactory com.xiaopeng.api.factory.account.SysGroupMenuClientFallbackFactory com.xiaopeng.api.factory.order.XpCruiseOrderClientFallbackFactory com.xiaopeng.api.factory.order.XpReassignOrderClientFallbackFactory com.xiaopeng.api.factory.operation.SmsClientFallbackFactory com.xiaopeng.api.factory.maintenance.XpTaskHandleDetailRoutineClientFallbackFactory com.xiaopeng.api.factory.maintenance.XpTaskClientFallbackFactory xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -2,23 +2,49 @@ import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.PopOrderDto; import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto; import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpOrder;import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.RTTask; import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.TaskStatus; import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.TaskType; import com.xiaopeng.api.vo.automaticPilot.protobuf.*; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.automaticPilot.util.XPUUtil; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.OrderStatusEnum; import com.xiaopeng.common.core.enums.PushMessageTypeEnum; import com.xiaopeng.common.core.utils.SnowFlake; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.redis.service.RedisService; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Slf4j @@ -83,4 +109,212 @@ } //-----------------------------------------------用户测试阶段模拟车机报文调用流程接口实现业务闭环--------------------------------------// @Resource private XpOrderClient xpOrderClient; @Resource private XpMapClient xpMapClient; @Resource private MongoTemplate mongoTemplate; @Resource public RedisTemplate redisTemplate; @Resource private XpPushMessageClient xpPushMessageClient; /** * 模拟接单 * @param orderId 订单id * @param vehicleId 车辆id * @param startLon 车子当前位置经度 * @param startLat 车子当前位置维度 * @return */ @GetMapping("/base/v1/order/acceptingOrder") public R acceptingOrder(Long orderId, Long vehicleId, Double startLon, Double startLat){ XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData(); XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); dto.setOrderId(orderId); LonLatDto origin = new LonLatDto(); origin.setLongitude(startLon); origin.setLatitude(startLat); dto.setOrigin(origin); LonLatDto destination = new LonLatDto(); destination.setLongitude(xpOrder.getStartLon()); destination.setLatitude(xpOrder.getStartLat()); dto.setDestination(destination); R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); if (200 != routeVoR.getCode()) { throw new RuntimeException("获取订单线路和运费失败"); } RouteVo routeVo = routeVoR.getData(); //缓存数据,用于后续推给乘客导航线路 redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), com.alibaba.fastjson.JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); PopOrderDto dto1 = new PopOrderDto(); dto1.setOrderId(Long.valueOf(orderId)); dto1.setXpVehicleVin(xpVehicle.getVehicleVin()); dto1.setOrderType(com.xiaopeng.api.vo.OrderType.USER_ORDER); R<?> r = xpOrderClient.popOrder(dto1); //构建推送消息 Map<String, Object> params = new HashMap<>(); Map<String, Object> content = new HashMap<>(); content.put("orderId", orderId); content.put("status", 3); params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc()); params.put("content", JSONObject.toJSONString(content)); params.put("timestamp", System.currentTimeMillis() + ""); String message = JSONObject.toJSONString(params); Long appUserId = xpOrder.getAppUserId(); SendMessageDTO dto2 = new SendMessageDTO(); dto2.setAppUserId(appUserId + ""); dto2.setMessage(message); R<String> stringR = xpPushMessageClient.sendStatus(dto2); if (R.isError(stringR)) { log.error("推送消息失败:{}", stringR.getMsg()); } xpOrderClient.updateOrderStatus(orderId, OrderStatusEnum.PICK_UP.getCode()); return r; } /** * 推送司机接驾轨迹和实时位置 * @param orderId */ @GetMapping("/base/v1/order/pushStartDriverLocation") private void pushStartDriverLocation(Long vehicleId, Long orderId){ XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData(); XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); String vin = xpVehicle.getVehicleVin(); Long appUserId = xpOrder.getAppUserId(); Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId()); RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1000)); threadPoolExecutor.execute(() -> { //等待10秒后开始执行车子位移 try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } List<LonLatDto> polyline = routeVo.getPolyline(); for (LonLatDto lonLatDto : polyline) { Double latitude = lonLatDto.getLatitude(); Double longitude = lonLatDto.getLongitude(); //保存车辆实时位置到redis redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new GeoJsonPoint(longitude, latitude), vin); //保存车辆实时信息到mongodb VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class); if (null == vehiclePosition) { vehiclePosition = new VehiclePosition(); } vehiclePosition.setVin(vin); vehiclePosition.setPoint(new GeoJsonPoint(longitude, latitude)); vehiclePosition.setCourse(60D); vehiclePosition.setAlt(100F); //车辆动态信息 vehiclePosition.setSpeed(50F); vehiclePosition.setCurrentElectricity(80); vehiclePosition.setMileageRange(300f); vehiclePosition.setOrderId(orderId); mongoTemplate.save(vehiclePosition); //调用推送服务接口 if (null != orderId) { PushOrderRouteDTO dto = new PushOrderRouteDTO(); dto.setOrderId(orderId); dto.setRouteType(1); dto.setLongitude(longitude); dto.setLatitude(latitude); //TODO 这两个字段现在拿不到 // dto.setDuration(rtTripInfo.getRemaining_time()); // dto.setDistance(rtTripInfo.getRemaining_distance().intValue()); xpPushMessageClient.pushOrderRoute(dto); } //5秒钟循环一次 try { Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } } //构建推送消息 Map<String, Object> params = new HashMap<>(); Map<String, Object> content = new HashMap<>(); content.put("orderId", orderId); content.put("status", 4); params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc()); params.put("content", JSONObject.toJSONString(content)); params.put("timestamp", System.currentTimeMillis() + ""); String message = JSONObject.toJSONString(params); SendMessageDTO dto2 = new SendMessageDTO(); dto2.setAppUserId(appUserId + ""); dto2.setMessage(message); R<String> stringR = xpPushMessageClient.sendStatus(dto2); if (R.isError(stringR)) { log.error("推送消息失败:{}", stringR.getMsg()); } xpOrderClient.updateOrderStatus(orderId, OrderStatusEnum.PICK_UP_GUESTS.getCode()); }); } /** * 修改订单状态 * @param orderId * @param status * @return */ @GetMapping("/base/v1/order/updateOrderStatus") public R updateOrderStatus(Long orderId, Integer status) { XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); //构建推送消息 Map<String, Object> params = new HashMap<>(); Map<String, Object> content = new HashMap<>(); content.put("orderId", orderId); content.put("status", status); params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc()); params.put("content", JSONObject.toJSONString(content)); params.put("timestamp", System.currentTimeMillis() + ""); String message = JSONObject.toJSONString(params); SendMessageDTO dto2 = new SendMessageDTO(); dto2.setAppUserId(xpOrder.getAppUserId() + ""); dto2.setMessage(message); R<String> stringR = xpPushMessageClient.sendStatus(dto2); if (R.isError(stringR)) { log.error("推送消息失败:{}", stringR.getMsg()); } xpOrderClient.updateOrderStatus(orderId, status); return R.ok(); } } xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -30,7 +30,8 @@ import com.xiaopeng.api.vo.automaticPilot.protobuf.*; import com.xiaopeng.api.vo.automaticPilot.protobuf.AbnormalReason; import com.xiaopeng.api.vo.automaticPilot.protobuf.GearLevel; import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderPhase;import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderStatusInfo; import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderPhase; import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderStatusInfo; import com.xiaopeng.api.vo.automaticPilot.protobuf.RealtimePose; import com.xiaopeng.api.vo.automaticPilot.protobuf.ResponseMessage; import com.xiaopeng.api.vo.automaticPilot.protobuf.RtTripInfo; @@ -346,7 +347,7 @@ log.info("车辆故障,开始处理故障"); // TODO 添加异常任务 // 解绑用户与车辆关系 // CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); String orderId = systemRuntimeStatus.getRunningOrderStatusInfo().getOrderId(); XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData(); XpVehicle vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); @@ -354,17 +355,11 @@ // 修改车辆状态 vehicle.setOperatingStatus(4); xpVehicleClient.updateVehicleById(vehicle); // cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin()); // cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString()); // cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber()); // // TODO //// cancelTaxiPassengerVo.setAppId(); // userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin()); cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString()); cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber()); userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); } // 取消订单 // R<?> r = xpOrderClient.cancelOrder(String.valueOf(xpOrder.getId())); // if (r.getCode() == R.SUCCESS){ log.info("取消订单成功"); // TODO 重新派单 ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO(); reassignOrderDTO.setUid(xpOrder.getAppUserId().toString()); @@ -376,15 +371,7 @@ Double longitude = naviPose.getLongitude(); reassignOrderDTO.setLongitude(longitude); reassignOrderDTO.setLatitude(latitude); reassignOrderDTO.setVehicleId(xpOrder.getVehicleId()); reassignOrderDTO.setOrderId(xpOrder.getId()); reassignOrderDTO.setFleetId(xpOrder.getFleetId()); reassignOrderClient.reassignOrder(reassignOrderDTO); // } } } @@ -873,7 +860,7 @@ com.xiaopeng.api.vo.automaticPilot.protobuf.RtTask.Builder taskBuilder = com.xiaopeng.api.vo.automaticPilot.protobuf.RtTask.newBuilder(); RtTask.Builder taskBuilder = RtTask.newBuilder(); taskBuilder.setOrderId(lastXpCruiseOrder.getId()); taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID()); taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE); xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -125,7 +125,6 @@ xpTaskService.saveVehicleAccident(dto, xpOperationsUser); return R.ok(); } @ApiOperation(value = "车辆事故任务详情", tags = "运维APP-任务中心") @GetMapping("/api/v1/task/vehicleAccidentDetail") public R<TaskAccidentDetailVO> vehicleAccidentDetail(Long id) { xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -167,9 +167,6 @@ xpTaskService.saveTask(dto, reportUserId); return R.ok(); } @ApiOperation(value = "任务详情") @GetMapping("/taskDetail") public R<TaskManagementDetailVO> taskDetail(Long id) { xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/exportExcel/XpTaskExportExcel.java
@@ -25,7 +25,7 @@ @Excel(name = "车牌号",width = 20) private String plateNumber; @ApiModelProperty(value = "任务类别1常规 2事故") @Excel(name = "任务类别",width = 20,replace = {"常规_1","事故_2"}) @Excel(name = "任务类别",width = 20) private Integer taskCategory; @ApiModelProperty(value = "类型") @Excel(name = "类型",width = 40) xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/TaskManagementPreparationDetailVO.java
@@ -69,8 +69,6 @@ @ApiModelProperty(value = "遗失物品") private String lostItems; @ApiModelProperty(value = "遗失物品说明") private String lostItemsDetail; @ApiModelProperty(value = "备注") private String remarks; xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -91,7 +91,4 @@ */ XpTask queryInfoByVehicleId(Long vehicleId); void saveVehicleAccidentError(Long vehicleId); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpSchedulingDetailServiceImpl.java
@@ -398,7 +398,7 @@ @Override public R saveSchedulingDetail(SaveSchedulingVo vo, Long userId) { String month = vo.getMonth(); List<XpSchedulingDetail> list = this.list(new QueryWrapper<XpSchedulingDetail>().eq("is_deleted", 0).last(" and DATE_FORMAT(planTime,'%Y-%m') = '" + month + "'")); List<XpSchedulingDetail> list = this.list(new QueryWrapper<XpSchedulingDetail>().eq("is_deleted", 0).last(" and DATE_FORMAT(plan_time,'%Y-%m') = '" + month + "'")); //保存排班数据 XpScheduling xpScheduling = xpSchedulingService.getOne(new QueryWrapper<XpScheduling>().eq("is_deleted", 0).last(" and DATE_FORMAT(schedulingDate,'%Y-%m') = '" + month + "'")); if(null == xpScheduling){ xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -4,7 +4,6 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO; @@ -89,8 +88,6 @@ private XpVehicleRepairMapper vehicleRepairMapper; @Autowired private XpVehiclePreparationMapper vehiclePreparationMapper; @Autowired private XpVehicleDescriptionMapper vehicleDescriptionMapper; @Autowired private XpVehicleDetectionMapper vehicleDetectionMapper; @@ -939,151 +936,12 @@ @Override public List<TaskManagementPageListVO> exportList(TaskManagementPageListQuery query) { List<TaskManagementPageListVO> list = this.baseMapper.exportList(query); for (TaskManagementPageListVO taskManagementPageListVO : list) { if (org.springframework.util.StringUtils.hasLength(taskManagementPageListVO.getHandleUserId())){ String[] split = taskManagementPageListVO.getHandleUserId().split(","); List<XpOperationsUser> users = operationUserClient.listByIds(Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList())).getData(); if (users!=null){ StringBuilder handleUserName = new StringBuilder(); for (XpOperationsUser user : users) { handleUserName.append(user.getNickName()).append(";"); } taskManagementPageListVO.setHandleUserName(handleUserName.toString()); } } if (taskManagementPageListVO.getTaskCategory() == 1) { switch (taskManagementPageListVO.getTaskTypeId()) { case "1": taskManagementPageListVO.setTaskTypeName("车辆检查"); break; case "2": taskManagementPageListVO.setTaskTypeName("车辆充电"); break; case "3": taskManagementPageListVO.setTaskTypeName("车辆整备"); break; case "4": taskManagementPageListVO.setTaskTypeName("整备洗车"); break; case "5": taskManagementPageListVO.setTaskTypeName("车辆维修"); break; case "6": taskManagementPageListVO.setTaskTypeName("车辆保养"); break; case "7": taskManagementPageListVO.setTaskTypeName("车辆保险到期"); break; case "8": taskManagementPageListVO.setTaskTypeName("车辆年检到期"); break; case "9": taskManagementPageListVO.setTaskTypeName("车辆运营资质到期"); break; default: taskManagementPageListVO.setTaskTypeName(""); break; } } else { StringBuilder taskTypeName = new StringBuilder(); String[] typeIds = taskManagementPageListVO.getTaskTypeId().split(","); List<XpErrorType> xpErrorTypes = errorTypeMapper.selectList(new LambdaQueryWrapper<XpErrorType>() .in(XpErrorType::getId, Arrays.asList(typeIds)).orderByAsc(XpErrorType::getParentId)); List<XpErrorType> parents = new ArrayList<>(); for (XpErrorType xpErrorType : xpErrorTypes) { if (xpErrorType.getParentId() == 0) { parents.add(xpErrorType); } } for (XpErrorType parent : parents) { List<XpErrorType> children = xpErrorTypes.stream().filter(e -> e.getParentId().equals(parent.getId())).collect(Collectors.toList()); taskTypeName.append(parent.getErrorName()).append(">"); for (XpErrorType child : children) { taskTypeName.append(child.getErrorName()).append(";"); } } taskManagementPageListVO.setTaskTypeName(taskTypeName.substring(0, taskTypeName.length() - 1)); } } return list; } @Override public XpTask queryInfoByVehicleId(Long vehicleId) { return this.baseMapper.queryInfoByVehicleId(vehicleId); } @Override public void saveVehicleAccidentError(Long vehicleId) { XpTask xpTask = new XpTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); xpTask.setTaskCode(code); xpTask.setTaskCategory(2); // todo 事故类型待客户确定 xpTask.setTaskTypeId("1"); xpTask.setTaskUrgencyLevel(0); xpTask.setTaskDescription("车辆发生异常"); XpVehicle vehicle = xpVehicleClient.queryById(xpTask.getVehicleId()).getData(); if (vehicle!=null){ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class); if (vehiclePosition != null) { double x = vehiclePosition.getPoint().getX(); double y = vehiclePosition.getPoint().getY(); xpTask.setVehicleLon(new BigDecimal(x)); xpTask.setVehicleLat(new BigDecimal(y)); } } xpTask.setVehicleId(vehicleId); // 系统上传异常任务标识 xpTask.setReportUserId(0L); xpTask.setReportTime(LocalDateTime.now()); xpTask.setStatus(0); xpTask.setCreateBy("admin"); XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one(); XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one(); if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) { throw new ServiceException("未配置车辆事故任务分配规则"); } R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId()); if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) { List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList()); xpTask.setHandleUserId(StringUtils.join(userIds, ",")); } // 根据事故处理限时配置设置任务截止时间 LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()); xpTask.setEndTime(endTime); this.save(xpTask); // 发送消息通知 List<Long> userIds = Arrays.stream(xpTask.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList()); if (CollUtil.isNotEmpty(userIds)) { R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds); List<XpOperationsUser> data = xpOperationUserResult.getData(); if (CollUtil.isNotEmpty(data)) { String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : ""; // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接} String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), taskRule.getProcessingTimeLimit()); List<XpOperationsUserNotification> notifications = data.stream().map(item -> { XpOperationsUserNotification notification = new XpOperationsUserNotification(); notification.setOperationsUserId(item.getId()); notification.setNotificationContent(content); notification.setReadStatus(0); notification.setCreateTime(LocalDateTime.now()); return notification; }).collect(Collectors.toList()); xpOperationUserNotificationClient.addNotificationBatch(notifications); // 发送阿里云推送 Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream().collect(Collectors.groupingBy(XpOperationsUser::getDeviceType)); for (Map.Entry<Integer, List<XpOperationsUser>> integerListEntry : operationUserMap.entrySet()) { List<XpOperationsUser> value = integerListEntry.getValue(); pushAliMessage(value, content, xpTask); } } } } @Override @@ -1099,8 +957,7 @@ @Override public void saveTask(SaveErrorTaskDto dto, Long reportUserId) { List<Long> vehicleIds = dto.getVehicleIds(); List<XpVehicle> vehicles = xpVehicleClient.listByIds(vehicleIds).getData(); List<XpTask> saveTask = new ArrayList<>(); for (Long vehicleId : dto.getVehicleIds()) { XpTask task = new XpTask(); @@ -1116,18 +973,8 @@ task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit())); } task.setTaskCategory(2); XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one(); if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) { throw new ServiceException("未配置车辆事故任务分配规则"); } R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId()); if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) { List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList()); task.setHandleUserId(StringUtils.join(userIds, ",")); } // 根据事故处理限时配置设置任务截止时间 LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()); task.setEndTime(endTime); // todo 临时处理 task.setHandleUserId("1"); task.setTaskTypeId(dto.getTaskTypeId()); task.setTaskUrgencyLevel(dto.getTaskUrgencyLevel()); task.setTaskDescription(dto.getTaskDescription()); @@ -1139,39 +986,8 @@ task.setReportUserId(reportUserId); task.setReportTime(LocalDateTime.now()); saveTask.add(task); // 发送消息通知 List<Long> userIds = Arrays.stream(task.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList()); if (CollUtil.isNotEmpty(userIds)) { XpVehicle vehicle = vehicles.stream().filter(e -> e.getId().equals(vehicleId)).findFirst().orElse(null); R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds); List<XpOperationsUser> data = xpOperationUserResult.getData(); if (CollUtil.isNotEmpty(data)) { String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : ""; // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接} String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, task.getVehicleLocation(), taskRule.getProcessingTimeLimit()); List<XpOperationsUserNotification> notifications = data.stream().map(item -> { XpOperationsUserNotification notification = new XpOperationsUserNotification(); notification.setOperationsUserId(item.getId()); notification.setNotificationContent(content); notification.setReadStatus(0); notification.setCreateTime(LocalDateTime.now()); return notification; }).collect(Collectors.toList()); xpOperationUserNotificationClient.addNotificationBatch(notifications); // 发送阿里云推送 Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream().collect(Collectors.groupingBy(XpOperationsUser::getDeviceType)); for (Map.Entry<Integer, List<XpOperationsUser>> integerListEntry : operationUserMap.entrySet()) { List<XpOperationsUser> value = integerListEntry.getValue(); pushAliMessage(value, content, task); } } } } this.saveBatch(saveTask); } @@ -1297,12 +1113,6 @@ XpVehiclePreparation vehiclePreparation = vehiclePreparationMapper.selectOne(new LambdaQueryWrapper<XpVehiclePreparation>() .eq(XpVehiclePreparation::getTaskId, id).last("limit 1")); XpVehicleDescription xpVehicleDescription = vehicleDescriptionMapper.selectOne( new LambdaQueryWrapper<XpVehicleDescription>().eq(XpVehicleDescription::getDescriptionType, 5) ); if (xpVehicleDescription != null) { taskManagementPreparationDetailVO.setLostItemsDetail(xpVehicleDescription.getDescriptionContent()); } if (vehiclePreparation != null) { taskManagementPreparationDetailVO.setLeftFrontWheel(vehiclePreparation.getLeftFrontWheel()); taskManagementPreparationDetailVO.setRightFrontWheel(vehiclePreparation.getRightFrontWheel()); xp-robotaxi-maintenance-boot/src/main/resources/bootstrap.yml
@@ -29,6 +29,7 @@ namespace: 5185ac4b-6369-48eb-a21b-a7cbc441c5f1 username: nacos password: nacos ip: 192.168.110.85 config: # 配置中心地址 server-addr: 192.168.110.80:8848 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/ReassignOrderController.java
@@ -1,8 +1,5 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.feignClient.order.XpReassignOrderClient; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.api.dto.operation.ReassignOrderDTO; import com.xiaopeng.operation.utils.TaskOrderUtil; @@ -11,8 +8,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; /** * token 控制 @@ -24,21 +19,9 @@ public class ReassignOrderController { @Autowired private TaskOrderUtil taskOrderUtil; @Autowired private XpReassignOrderClient xpReassignOrderClient; @PostMapping("/inner/v1/order/reassignOrder") public R<String> reassignOrder(@RequestBody ReassignOrderDTO dto) { //新增改派数据 XpOrderReassign xpOrderReassign = new XpOrderReassign(); xpOrderReassign.setOrderId(dto.getOrderId()); xpOrderReassign.setOperationTime(LocalDateTime.now()); xpOrderReassign.setOldVehicleId(dto.getVehicleId()); xpOrderReassign.setOldFleetId(dto.getFleetId()); xpOrderReassign.setReassignReason("异常改派"); xpReassignOrderClient.saveReassignOrder(xpOrderReassign); taskOrderUtil.reassignPushOrder(dto.getCount(),dto.getUid(),dto.getLongitude(),dto.getLatitude(),dto.getOrderNo()); return R.ok(); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -10,7 +10,6 @@ import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.order.XpOrderReassign; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.order.FareBreakdownVo; @@ -33,7 +32,6 @@ import com.xiaopeng.order.model.vo.XpOrderDetailVO; import com.xiaopeng.order.model.vo.XpOrderHistoryVO; import com.xiaopeng.order.model.vo.XpOrderPageVO; import com.xiaopeng.order.service.IXpOrderReassignService; import com.xiaopeng.order.service.IXpOrderService; import com.xiaopeng.order.vo.OrderDetailVo; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; @@ -69,7 +67,6 @@ private final IXpOrderService xpOrderService; private final RedisService redisService; private final IXpOrderReassignService xpOrderReassignService; /** * 获取订单统计数据(内部接口) @@ -282,18 +279,6 @@ dto.getReassignReason() ); return R.ok(); } /** * 保存改派 * @param xpOrderReassign * @return */ @PostMapping("/inner/v1/order/reassignOrder") public R<Long> saveReassignOrder(@RequestBody XpOrderReassign xpOrderReassign){ xpOrderReassignService.save(xpOrderReassign); return R.ok(xpOrderReassign.getId()); } /** xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java
@@ -11,7 +11,6 @@ import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.account.XpAppUser; import com.xiaopeng.api.model.operation.XpFeedbackType; import com.xiaopeng.api.model.operation.XpInvitationCode; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.model.order.XpOrder; @@ -139,26 +138,22 @@ GetUserListByUidsVo getUserListByUidsVo = new GetUserListByUidsVo(); getUserListByUidsVo.setUids(userIds); getUserListByUidsVo.setGetPreCarOwner(false); // todo 查不到用户信息 // UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) { // Object data = userListByUids.getData(); Object data = userListByUids.getData(); // 转化为jsonArray // JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data)); // for (Object o : jsonArray) { // // 转化为JsonObject // JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o)); // String mobile = jsonObject.getString("mobile"); // String nickName = jsonObject.getString("nickName"); // String headImage = jsonObject.getString("headImage"); // orderEvaluateManagementPageListVO.setPhoneNumber(mobile); // orderEvaluateManagementPageListVO.setNickName(nickName); // orderEvaluateManagementPageListVO.setHeadImage(headImage); // } XpFeedbackType feedbackType = systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId()).getData(); if (feedbackType!=null){ orderEvaluateManagementPageListVO.setFeedbackTypeName(feedbackType.getFeedbackType()); JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(data)); for (Object o : jsonArray) { // 转化为JsonObject JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(o)); String mobile = jsonObject.getString("mobile"); String nickName = jsonObject.getString("nickName"); String headImage = jsonObject.getString("headImage"); orderEvaluateManagementPageListVO.setPhoneNumber(mobile); orderEvaluateManagementPageListVO.setNickName(nickName); orderEvaluateManagementPageListVO.setHeadImage(headImage); } systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId()); } pageInfo.setRecords(list); return pageInfo; xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -870,7 +870,7 @@ 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; } @@ -894,7 +894,7 @@ 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()); @@ -903,7 +903,7 @@ } 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()); @@ -933,13 +933,13 @@ 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); } order.setStatus(0); @@ -949,7 +949,7 @@ 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()); @@ -958,7 +958,7 @@ cancelTaxiPassengerVo.setAppId(""); BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); if (baseVehicleUserDto == null) { if (baseVehicleUserDto==null) { // TODO 本地无法调通 // throw new RuntimeException("取消订单失败"); } @@ -982,7 +982,7 @@ } // 下发命令 if (order.getStatus() > 1) { if(order.getStatus()>1){ PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setOrderId(order.getId().toString()); pushOrderDto.setVin(xpVehicle.getVehicleVin()); @@ -997,7 +997,7 @@ 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); baseMapper.updateById(order); @@ -1030,7 +1030,7 @@ log.info("订单取消消息推送完毕"); // 下发命令 if (order.getStatus() > 1) { if(order.getStatus()>1){ PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setOrderId(order.getId().toString()); pushOrderDto.setVin(xpVehicle.getVehicleVin()); @@ -1051,13 +1051,13 @@ 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); @@ -1176,6 +1176,7 @@ } // 根据订单所属开通城市id 查询定价 R<XpPricing> pricingByCityId = xpPricingClient.getPricingByCid(order.getCityId()); XpPricing pricing = pricingByCityId.getData(); @@ -1194,13 +1195,13 @@ // 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")))); @@ -1235,7 +1236,7 @@ System.err.println("--------------------------"); System.err.println("应付总额: " + totalAmount + " 元"); BigDecimal startMoney = BigDecimal.ZERO; // 默认费率1 // 默认费率1 double priceRate = 1; if (pricing.getIsDynamicPrice() == 1) { // 先判断是否已经调价过了 @@ -1383,11 +1384,11 @@ 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()); @@ -1397,7 +1398,7 @@ 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); @@ -1410,7 +1411,7 @@ useUserCouponDto.setUserCouponId(order.getCouponId()); xpAppUserCouponClient.useUserCoupon(useUserCouponDto); } // 计算完价格后 挑选优惠券 // 计算完价格后 挑选优惠券 GetUserCouponDto getUserCouponDto = new GetUserCouponDto(); getUserCouponDto.setUserId(Long.valueOf(uid)); getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue()); @@ -1424,8 +1425,11 @@ baseMapper.updateById(order); // 结束后的车辆操作 if (vehicle != null) { if(vehicle!=null){ // 修改车辆状态 vehicle.setState(0); @@ -1435,11 +1439,11 @@ // 生成新的巡游单子 回到最新巡游的初始起点位置 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()); @@ -1453,12 +1457,12 @@ 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()); @@ -1469,7 +1473,7 @@ xpCruiseOrder.setStatus(1); xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId()); xpCruiseOrder.setCreateTime(LocalDateTime.now()); xpCruiseOrder.setId("XU" + IdUtil.fastUUID()); xpCruiseOrder.setId("XU"+ IdUtil.fastUUID()); // 判断当前时分秒是否大于收车时间 LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime(); @@ -1502,6 +1506,15 @@ } } @@ -1726,14 +1739,14 @@ 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()); @@ -1742,24 +1755,24 @@ } 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); @@ -1912,7 +1925,7 @@ XpPricing pricing = pricingByCityId.getData(); if (pricing == null) { throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS); } else { }else{ return R.ok(pricing.getPriceRule()); } } @@ -1930,34 +1943,17 @@ String orderType = dto.getOrderType(); Long orderId = dto.getOrderId(); //巡游单处理逻辑 if (OrderType.CRUISE_ORDER.equals(orderType)) { if(OrderType.CRUISE_ORDER.equals(orderType)){ // todo 需要处理巡游的逻辑 } //乘客单处理逻辑 if (OrderType.USER_ORDER.equals(orderType)) { if(OrderType.USER_ORDER.equals(orderType)){ XpOrder order = this.getById(orderId); // 判断是否改派的 查看是否有车信息 if (order.getVehicleId() != null) { R<XpVehicle> oldVehicleR = xpVehicleClient.queryById(order.getVehicleId()); XpVehicle oldVehicle = oldVehicleR.getData(); if (oldVehicle != null) { // 解绑 CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); cancelTaxiPassengerVo.setVin(oldVehicle.getVehicleVin()); cancelTaxiPassengerVo.setUid(order.getAppUserId().toString()); cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber()); // TODO cancelTaxiPassengerVo.setAppId(""); userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); } } //订单为待接单状态 if (order.getStatus() == 1) { if(order.getStatus() == 1){ AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo(); order.setAcceptanceTime(LocalDateTime.now()); R<XpVehicle> byVehicleVin = xpVehicleClient.findByVehicleVin(dto.getXpVehicleVin()); @@ -1992,7 +1988,7 @@ userVehicleClient.addTaxiPassenger(addTaxiPassengerVo); //推送乘客车辆到达预约点的导航数据 sendRoute(order.getAppUserId().toString(), orderId, "ORDER_NAVIGATION_START_DATA"); } else { }else{ //推送行起点到终点的驶轨迹给乘客端 sendRoute(order.getAppUserId().toString(), orderId, "ORDER_NAVIGATION_END_DATA"); } @@ -2005,9 +2001,9 @@ * @param appUserId * @param keyStr */ public void sendRoute(String appUserId, Long orderId, String keyStr) { public void sendRoute(String appUserId, Long orderId, String keyStr){ 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"); @@ -2020,7 +2016,7 @@ 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()); @@ -2038,6 +2034,8 @@ } /** * 获取当前用户正在执行的订单 * @@ -2047,7 +2045,7 @@ @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; }