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/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; @@ -357,14 +358,8 @@ cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin()); cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString()); cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber()); // TODO // cancelTaxiPassengerVo.setAppId(); 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()); @@ -377,7 +372,6 @@ reassignOrderDTO.setLongitude(longitude); reassignOrderDTO.setLatitude(latitude); reassignOrderClient.reassignOrder(reassignOrderDTO); // } } } @@ -866,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/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/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
@@ -936,73 +936,6 @@ @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; } 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;