xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/GroupUserVO.java
@@ -40,4 +40,7 @@ @ApiModelProperty(value = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty(value = "角色名称") private String roleName; } xp-robotaxi-account-boot/src/main/resources/mapper/account/SysGroupMapper.xml
@@ -15,32 +15,62 @@ <!-- 查询权限组绑定用户列表 --> <select id="queryUserPageList" resultType="com.xiaopeng.account.model.vo.GroupUserVO"> SELECT DISTINCT su.id, su.nick_name AS nickName, su.unique_number AS uniqueNumber, su.user_account AS userAccount, su.phone_number AS phoneNumber, su.status, su.remarks, su.create_time AS createTime FROM sys_user su INNER JOIN sys_user_role sur ON su.id = sur.user_id INNER JOIN sys_role sr ON sur.role_id = sr.id LEFT JOIN sys_group sg ON sr.group_id = sg.id WHERE sr.group_id = #{query.groupId} AND sr.is_deleted = 0 AND su.is_deleted = 0 <if test="query.groupType != null"> AND sg.group_type = #{query.groupType} </if> <if test="query.nickName != null and query.nickName != ''"> AND su.nick_name LIKE CONCAT('%', #{query.nickName}, '%') </if> <if test="query.phoneNumber != null and query.phoneNumber != ''"> AND su.phone_number LIKE CONCAT('%', #{query.phoneNumber}, '%') </if> ORDER BY su.create_time DESC <choose> <!-- groupType=1: 管理端用户 --> <when test="query.groupType == 1"> SELECT DISTINCT su.id, su.nick_name AS nickName, su.unique_number AS uniqueNumber, su.user_account AS userAccount, su.phone_number AS phoneNumber, su.status, su.remarks, su.create_time AS createTime, sr.role_name AS roleName FROM sys_user su INNER JOIN sys_user_role sur ON su.id = sur.user_id INNER JOIN sys_role sr ON sur.role_id = sr.id WHERE sr.group_id = #{query.groupId} AND sr.is_deleted = 0 AND su.is_deleted = 0 <if test="query.nickName != null and query.nickName != ''"> AND su.nick_name LIKE CONCAT('%', #{query.nickName}, '%') </if> <if test="query.phoneNumber != null and query.phoneNumber != ''"> AND su.phone_number LIKE CONCAT('%', #{query.phoneNumber}, '%') </if> ORDER BY su.create_time DESC </when> <!-- groupType=2: 运维用户 --> <otherwise> SELECT ou.id, ou.nick_name AS nickName, ou.unique_number AS uniqueNumber, ou.user_account AS userAccount, ou.phone_number AS phoneNumber, ou.status, ou.remarks, ou.create_time AS createTime, GROUP_CONCAT(DISTINCT sr.role_name ORDER BY sr.role_name SEPARATOR ',') AS roleName FROM xp_operations_user ou INNER JOIN xp_operations_role xor ON ou.id = xor.operations_user_id INNER JOIN sys_role sr ON xor.role_id = sr.id WHERE sr.group_id = #{query.groupId} AND sr.is_deleted = 0 AND ou.is_deleted = 0 <if test="query.nickName != null and query.nickName != ''"> AND ou.nick_name LIKE CONCAT('%', #{query.nickName}, '%') </if> <if test="query.phoneNumber != null and query.phoneNumber != ''"> AND ou.phone_number LIKE CONCAT('%', #{query.phoneNumber}, '%') </if> GROUP BY ou.id, ou.nick_name, ou.unique_number, ou.user_account, ou.phone_number, ou.status, ou.remarks, ou.create_time ORDER BY ou.create_time DESC </otherwise> </choose> </select> </mapper> xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/PushOrderRouteDTO.java
@@ -35,4 +35,8 @@ @ApiModelProperty(value = "订单类型 1=实时订单 2=巡游订单") private Integer routeType; @NotNull(message = "方向角不能为空") @ApiModelProperty(value = "方向角 0-359") private Integer direction; } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -167,6 +167,13 @@ xpTaskService.saveTask(dto, reportUserId); return R.ok(); } @ApiOperation(value = "异常情况上传车辆事故") @PostMapping("/inner/v1/task/saveVehicleAccidentError") public R saveVehicleAccidentError(@RequestParam Long vehicleId) { xpTaskService.saveVehicleAccidentError(vehicleId); 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) @Excel(name = "任务类别",width = 20,replace = {"常规_1","事故_2"}) private Integer taskCategory; @ApiModelProperty(value = "类型") @Excel(name = "类型",width = 40) xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleDetectionVO.java
@@ -27,6 +27,9 @@ @ApiModelProperty(value = "开始操作人") private String operatorStartName; @ApiModelProperty(value = "联系电话") private String phoneNumber; @ApiModelProperty(value = "结束操作人") private String operatorEndName; xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -91,4 +91,5 @@ */ XpTask queryInfoByVehicleId(Long vehicleId); void saveVehicleAccidentError(Long vehicleI); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -952,6 +952,73 @@ @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; } @@ -961,6 +1028,78 @@ } @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 public R assigneeTask(Long id, Long handlerUserId, Long assigneeUserId) { XpTask task = this.getById(id); task.setAssigneeTime(LocalDateTime.now()); xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpVehicleDetectionServiceImpl.java
@@ -21,6 +21,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** @@ -117,13 +118,13 @@ .distinct() .collect(Collectors.toList()); // 批量查询操作人信息 Map<Long, String> userNameMap = new HashMap<>(); Map<Long, XpOperationsUser> operationUserMap = new HashMap<>(); if (!CollectionUtils.isEmpty(allUserIds)) { R<List<XpOperationsUser>> userResult = xpOperationUserClient.listByIds(allUserIds); List<XpOperationsUser> users = userResult.getData(); if (!CollectionUtils.isEmpty(users)) { userNameMap = users.stream() .collect(Collectors.toMap(XpOperationsUser::getId, XpOperationsUser::getNickName)); operationUserMap = users.stream() .collect(Collectors.toMap(XpOperationsUser::getId, Function.identity())); } } @@ -135,8 +136,11 @@ // 填充操作人姓名 if (xpVehicleDetection.getOperationsUserId() != null) { String userName = userNameMap.get(xpVehicleDetection.getOperationsUserId()); vo.setOperatorStartName(userName); XpOperationsUser xpOperationsUser = operationUserMap.get(xpVehicleDetection.getOperationsUserId()); if (Objects.nonNull(xpOperationsUser)) { vo.setOperatorStartName(xpOperationsUser.getNickName()); vo.setPhoneNumber(xpOperationsUser.getPhoneNumber()); } } records.add(vo); } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -97,7 +97,7 @@ /** * 批量删除点位 */ @GetMapping("/delete") @GetMapping("/deletePoint") @ResponseBody @ApiOperation(value = "删除点位") // @Transactional xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderEvaluateServiceImpl.java
@@ -129,9 +129,9 @@ @Override public PageInfo<OrderEvaluateManagementPageListVO> managementPageList(OrderEvaluateManagementPageListQuery query) { PageInfo<OrderEvaluateManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize()); List<OrderEvaluateManagementPageListVO> list = this.baseMapper.managementPageList(pageInfo,query); if (list.isEmpty()){ PageInfo<OrderEvaluateManagementPageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); List<OrderEvaluateManagementPageListVO> list = this.baseMapper.managementPageList(pageInfo, query); if (list.isEmpty()) { return new PageInfo<>(); } List<Long> userIds = list.stream().map(OrderEvaluateManagementPageListVO::getUserId).collect(Collectors.toList()); @@ -140,21 +140,25 @@ getUserListByUidsVo.setGetPreCarOwner(false); UserResourcesDto userListByUids = userResourcesClient.getUserListByUids(getUserListByUidsVo); for (OrderEvaluateManagementPageListVO orderEvaluateManagementPageListVO : list) { 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); } // 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); // } orderEvaluateManagementPageListVO.setPhoneNumber("19983174515"); orderEvaluateManagementPageListVO.setNickName("默认用户"); orderEvaluateManagementPageListVO.setHeadImage("[]"); systemSettingClient.getFeedbackTypeById(orderEvaluateManagementPageListVO.getFeedbackTypeId()); } pageInfo.setRecords(list); return pageInfo; } @@ -255,7 +259,7 @@ // 手机号过滤 if (StringUtils.isNotBlank(query.getPhoneNumber())) { if (StringUtils.isBlank(vo.getPhoneNumber()) || !vo.getPhoneNumber().contains(query.getPhoneNumber())) { !vo.getPhoneNumber().contains(query.getPhoneNumber())) { return false; } } @@ -263,7 +267,7 @@ // 车牌号过滤 if (StringUtils.isNotBlank(query.getPlateNumber())) { if (StringUtils.isBlank(vo.getPlateNumber()) || !vo.getPlateNumber().contains(query.getPlateNumber())) { !vo.getPlateNumber().contains(query.getPlateNumber())) { return false; } } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java
@@ -80,6 +80,7 @@ Map<String, Object> content = new HashMap<>(); content.put("orderId",dto.getOrderId()); content.put("routeType",routeType); content.put("direction",dto.getDirection()); content.put("route",JSONObject.toJSONString(route)); // 封装轨迹信息 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -394,7 +394,8 @@ for (XpVehicleExportExcel xpVehicleExportExcel : exportList) { if (StringUtils.isNotBlank(xpVehicleExportExcel.getVehiclePictures())) { JSONObject jsonObject = JSONObject.parseObject(xpVehicleExportExcel.getVehiclePictures()); xpVehicleExportExcel.setVehiclePictures(jsonObject.getString("url")); // xpVehicleExportExcel.setVehiclePictures(jsonObject.getString("url")); xpVehicleExportExcel.setVehiclePictures(null); } } // 3. 生成Excel xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/vo/XpVehicleVO.java
@@ -28,9 +28,9 @@ private LocalDate nextMaintenanceTime; @ApiModelProperty(value = "车辆经度") private Double longitude; private Double longitude=104.056302; @ApiModelProperty(value = "车辆纬度") private Double latitude; private Double latitude=30.586688; } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -15,6 +15,7 @@ import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.model.vehicleConvoy.XpVehicleAnnualRecord; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo; import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandEnum; import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandParamVo; @@ -37,7 +38,10 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.i18n.LocaleContextHolder; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -75,6 +79,8 @@ private XpuVinClient xpuVinClient; @Autowired private RedisService redisService; @Autowired private MongoTemplate mongoTemplate; @Override public List<XpVehicle> listByIds(List<Long> ids) { @@ -149,6 +155,15 @@ xpVehicleVO.setLongitude(geoJsonPoint.getX()); xpVehicleVO.setLatitude(geoJsonPoint.getY()); } // 查询车辆的续航里程 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicleVO.getVehicleVin())), VehiclePosition.class); if(Objects.nonNull(vehiclePosition)){ xpVehicleVO.setMileageRange(vehiclePosition.getMileageRange()); xpVehicleVO.setCurrentElectricity(vehiclePosition.getCurrentElectricity()); }else { xpVehicleVO.setMileageRange(0F); xpVehicleVO.setCurrentElectricity(0); } } pageInfo.setRecords(list);