xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -25,7 +25,7 @@
import com.xiaopeng.api.model.account.XpOperationsUserNotification;
import com.xiaopeng.api.model.maintenance.*;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.TaskVO;
import com.xiaopeng.api.vo.XpTaskVO;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
import com.xiaopeng.api.vo.operation.SmsVo;
@@ -57,7 +57,6 @@
import com.xiaopeng.maintenance.utils.UUIDUtil;
import com.xiaopeng.maintenance.vo.TaskCleanDetailVO;
import com.xiaopeng.maintenance.vo.TaskDetectionDetailVO;
import com.xiaopeng.maintenance.vo.TaskReassignDetailVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
@@ -121,22 +120,22 @@
    @Autowired
    private XpVehicleCleanMapper vehicleCleanMapper;
    @Autowired
    @Resource
    private XpOperationUserClient xpOperationUserClient;
    @Autowired
    @Resource
    private SysUserClient sysUserClient;
    @Autowired
    private XpTaskHandleDetailRoutineMapper xpTaskHandleDetailRoutineMapper;
    @Autowired
    @Resource
    private XpVehicleClient xpVehicleClient;
    @Autowired
    private XpTaskRuleMapper xpTaskRuleMapper;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    @Resource
    private XpAliPushMessageClient xpAliPushMessageClient;
    @Autowired
    @Resource
    private XpOperationUserNotificationClient xpOperationUserNotificationClient;
    @Autowired
    private IXpTaskRuleRoleService xpTaskRuleRoleService;
@@ -426,9 +425,9 @@
            log.info("事故通知记录保存成功,共 {} 条", notifications.size());
        }
        TaskVO taskVO = new TaskVO();
        BeanUtil.copyProperties(xpTask, taskVO);
        xpWebSocketMessageClient.pushTask(taskVO);
        XpTaskVO xpTaskVO = new XpTaskVO();
        BeanUtil.copyProperties(xpTask, xpTaskVO);
        xpWebSocketMessageClient.pushTask(xpTaskVO);
        Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream()
                .filter(u -> u.getDeviceType() != null && StringUtils.isNotBlank(u.getPhoneNumber()))
@@ -1389,21 +1388,35 @@
        XpTask task = getById(taskId);
        XpVehicle vehicle = xpVehicleClient.queryById(task.getVehicleId()).getData();
        XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
        List<XpTaskRuleRole> taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).list();
        int type = 9;
        if(task.getTaskCategory() != 2) {
            type = Integer.parseInt(task.getTaskTypeId());
        }
        List<XpTaskRuleRole> taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, type).list();
        if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
            throw new ServiceException("未配置车辆事故任务分配规则");
        }
        List<Long> excludedUserIds = Optional.ofNullable(task.getExcluded()).orElse(new ArrayList<>());
        excludedUserIds.addAll(Arrays.asList(task.getHandleUserId().split(",")).stream().map(Long::parseLong).collect(Collectors.toList()));
        task.setExcluded(excludedUserIds);
        List<XpTask.Reject> rejects = Optional.ofNullable(task.getExcluded()).orElse(new ArrayList<>());
        XpTask.Reject reject = task.reject(msg);
        rejects.add(reject);
        task.setExcluded(rejects);
        task.setReassignmentStatus(2);
        Set<String> excludedUserIds = rejects.stream().map(XpTask.Reject::getRejectUserId).collect(Collectors.toSet());
        Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
        List<Long> roleIds = taskRuleRole.stream().map(XpTaskRuleRole::getRoleId).collect(Collectors.toList());
        List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();
        List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();//TODO 空指针
        String belongUserIds = xpOperationUserClient.getXpOperationsRoleByRoleIds(roleIds).getData().stream()
                .map(XpOperationsRole::getOperationsUserId)
                .filter(ids::contains)
                .filter(id -> !excludedUserIds.contains(id))
                .filter(id -> !excludedUserIds.contains(id.toString()))
                .map(String::valueOf).collect(Collectors.joining(","));
//        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
        VehiclePosition vehiclePosition = new VehiclePosition();
        vehiclePosition.setPoint(new GeoJsonPoint(103.12615621, 30.264561));
@@ -1413,10 +1426,11 @@
            task.setStatus(4);
            noticeAdministrator(task);//TODO 需要通知管理员手动处理,考虑再AliPushUtil 中给管理员发送消息
        }
        updateById(task);
        if(StringUtils.isNotBlank(task.getHandleUserId())){
            List<Long> id = Collections.singletonList(Long.parseLong(task.getHandleUserId()));
            String roleName = xpOperationUserClient.listByIdsWithRole(id).getData().get(0).getRoleName();
            reject.setRejectUserRoleName(roleName);
            sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
        }
    }
@@ -1485,21 +1499,45 @@
    }
    @Override
    public PageInfo<TaskVO> reassignTaskPageList(TaskPageListQuery query) {
        return baseMapper.reassignTaskPageList(query);
    public PageInfo<XpTaskVO> reassignTaskPageList(TaskPageListQuery query) {
        PageInfo<TaskPageListQuery> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        return baseMapper.reassignTaskPageList(pageInfo,query);
    }
    @Override
    public TaskReassignDetailVO detail(Long taskId) {
    public XpTaskVO detail(Long taskId) {
        XpTask task = getById(taskId);
        if (task == null) {
            return null;
        }
        XpTaskVO xpTaskVO = new XpTaskVO();
        BeanUtil.copyProperties(task, xpTaskVO);
        // 根据taskId去查询XpTaskHandleDetail,
//        XpTaskHandleDetail taskHandleDetail = xpTaskHandleDetailClient.queryByTaskId(taskId).getData();
        String taskImage = xpTaskVO.getTaskImage();
        if (StringUtils.isNotBlank(taskImage)) {
            try {
                xpTaskVO.setTaskImage(aliOssDownloadUtil.getPictureJsonArray(taskImage));
            } catch (Exception e) {
                log.error("获取任务图片下载地址失败,taskId={}", taskId, e);
            }
        }
        // 2. 如果有车辆信息,可以补充车辆相关详情(如果需要)
        if (task.getVehicleId() != null) {
            R<XpVehicle> vehicleResult = xpVehicleClient.queryById(task.getVehicleId());
            if (vehicleResult != null && vehicleResult.getData() != null) {
                XpVehicle vehicle = vehicleResult.getData();
                xpTaskVO.setPlateNumber(vehicle.getPlateNumber());
//                xpTaskVO.setVehicleColor(vehicle.getVehicleColor());
//                xpTaskVO.setVehicleCode(vehicle.getVehicleCode());
//                xpTaskVO.setVehicleVin(vehicle.getVehicleVin());
//        return baseMapper.detail(taskId);
        // todo
        return null;
            }
        }
        return xpTaskVO;
    }
    @Value("${robotaxi.sms.app-id:1476153389173952512}")
@@ -1577,6 +1615,7 @@
        } else {
            task.setEndTime(LocalDateTime.now().plusDays(3));
        }
        task.setReassignmentStatus(2);
        task.setAssigneeTime(LocalDateTime.now());
        task.setHandleUserId(handlerUserId.toString());
        task.setVehicleId(null);