xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/XpOperationsUserPositionDTO.java
@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; /** * 运维人员查询条件DTO @@ -12,9 +14,11 @@ */ @Data @ApiModel("运维人员状态") @Document(collection = "xp_operations_user_position") public class XpOperationsUserPositionDTO { @ApiModelProperty(value = "运维人员id") @Id private long id; @ApiModelProperty(value = "经度") @@ -23,6 +27,9 @@ @ApiModelProperty(value = "纬度") private double longitude; @ApiModelProperty(value = "地理位置信息,用于MongoDB地理空间查询 [经度, 纬度]") private double[] location; @ApiModelProperty(value = "状态:0在线,1空闲,2上班中") private Integer status; xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -3,6 +3,8 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.account.XpOperationsUserPositionDTO; import com.xiaopeng.api.feignClient.account.XpOperationUserClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.account.XpOperationsUser; @@ -38,7 +40,11 @@ import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; import org.apache.shardingsphere.transaction.core.TransactionType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; 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.transaction.annotation.Transactional; @@ -48,8 +54,10 @@ import javax.validation.Valid; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * <p> @@ -305,14 +313,28 @@ @ApiOperation(value = "可改派的运维人员列表", tags = {"管理后台-运维执行-任务工单-待改派工单"}) @GetMapping("/api/v1/task/reassign/availableUsers") public R<List<XpOperationsUser>> availableReassignUsers(@RequestParam Long taskId) { return R.ok(); XpTask task = xpTaskService.getById(taskId); GeoJsonPoint point = new GeoJsonPoint( task.getVehicleLon().doubleValue(), task.getVehicleLat().doubleValue() ); Query query = new Query(Criteria.where("location").near(point) .maxDistance(new Distance(10, Metrics.KILOMETERS).getNormalizedValue())); query.with(Sort.by(Sort.Direction.ASC, "dis")); List<Long> ids = mongoTemplate.find(query, XpOperationsUserPositionDTO.class) .stream().map(XpOperationsUserPositionDTO::getId).collect(Collectors.toList()); return R.ok(operationUserClient.listByIds(ids).getData()); } @Resource private XpOperationUserClient operationUserClient; @ApiOperation(value = "改派详情", tags = {"管理后台-运维执行-任务工单-待改派工单"}) @GetMapping("/api/v1/task/reassign/detail") public R<TaskReassignDetailVO> reassignDetail(@RequestParam Long taskId) { //包含任务信息和改派日志 return R.ok(); return R.ok(xpTaskService.detail(taskId)); } @ApiOperation(value = "执行保险年检检测定时任务", tags = {"定时任务"}) xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/XpTaskService.java
@@ -16,6 +16,7 @@ import com.xiaopeng.maintenance.model.vo.*; import com.xiaopeng.maintenance.model.query.TaskPageListQuery; import com.xiaopeng.maintenance.vo.TaskDetectionDetailVO; import com.xiaopeng.maintenance.vo.TaskReassignDetailVO; import javax.validation.Valid; import java.io.UnsupportedEncodingException; @@ -103,4 +104,6 @@ void accept(String taskId); PageInfo<TaskVO> reassignTaskPageList(TaskPageListQuery query); TaskReassignDetailVO detail(Long taskId); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -57,6 +57,7 @@ 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; @@ -1412,7 +1413,9 @@ task.setStatus(4); noticeAdministrator(task);//TODO 需要通知管理员手动处理,考虑再AliPushUtil 中给管理员发送消息 } updateById(task); if(StringUtils.isNotBlank(task.getHandleUserId())){ sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit()); } @@ -1486,6 +1489,19 @@ return baseMapper.reassignTaskPageList(query); } @Override public TaskReassignDetailVO detail(Long taskId) { XpTask task = getById(taskId); // 根据taskId去查询XpTaskHandleDetail, // XpTaskHandleDetail taskHandleDetail = xpTaskHandleDetailClient.queryByTaskId(taskId).getData(); // return baseMapper.detail(taskId); // todo return null; } @Value("${robotaxi.sms.app-id:1476153389173952512}") private String smsAppId; @Value("${robotaxi.sms.app-push-config-code:ROBOTAXI_VERIFY_CODE_SMS}") xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskReassignDetailVO.java
@@ -1,4 +1,97 @@ package com.xiaopeng.maintenance.vo; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.api.model.maintenance.XpTaskHandleDetail; import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; public class TaskReassignDetailVO { @ApiModelProperty(value = "自增id") @TableId(value = "id", type = IdType.NONE) private Long id; @ApiModelProperty(value = "任务编号") private String taskCode; @ApiModelProperty(value = "任务类别1常规 2事故") private Integer taskCategory; //1:车辆检查,2:车辆充电,3:车辆整备,4:整备洗车,5:车辆维修,6:车辆保养,7:车辆保险到期,8:车辆年检到期9:车辆运营资质到期 @ApiModelProperty(value = "任务类型id 任务类别为2时对应数据字典,多个逗号分割,为1的时候 枚举1车辆检查 2车辆充电 3车辆整备 4整备洗车 5车辆维修 6车辆保养 7车辆保险到期 8车辆年检到期 9车辆运营资质到期") private String taskTypeId; @ApiModelProperty(value = "任务类型id 任务类别为2时对应数据字典,多个逗号分割,为1的时候 枚举1车辆检查 2车辆充电 3车辆整备 4整备洗车 5车辆维修 6车辆保养 7车辆保险到期 8车辆年检到期 9车辆运营资质到期") private String accidentTypeId; @ApiModelProperty(value = "任务紧急程度 0=P0 1=P1 2=P2 3=P3") private Integer taskUrgencyLevel; @ApiModelProperty(value = "任务描述") private String taskDescription; @ApiModelProperty(value = "任务描述图片") private String taskImage; @ApiModelProperty(value = "车辆id") @TableField(updateStrategy = FieldStrategy.NEVER) private Long vehicleId; @ApiModelProperty(value = "车辆位置") private String vehicleLocation; @ApiModelProperty(value = "车辆经度") private BigDecimal vehicleLon; @ApiModelProperty(value = "车辆纬度") private BigDecimal vehicleLat; @ApiModelProperty(value = "处理人id") private String handleUserId; @ApiModelProperty(value = "处理时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime handleTime; @ApiModelProperty(value = "分配人id") private Long assigneeUserId; @ApiModelProperty(value = "分配时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime assigneeTime; @ApiModelProperty(value = "上报人id") private Long reportUserId; @ApiModelProperty(value = "上报时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime reportTime; @ApiModelProperty(value = "任务时限结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime endTime; @ApiModelProperty(value = "是否已发送过期通知 0=未发送 1=已发送") private Integer expiredNoticeSent; @ApiModelProperty(value = "事故即将超时通知是否已发送 0=未发送 1=已发送") private Integer willTimeoutNoticeSent; @ApiModelProperty(value = "状态 0=待到达 1=待处理 2=已完成 3=已取消 4=改派中") private Integer status; @ApiModelProperty(value = "状态 2=已处理 1=改派中") private Integer reassignmentStatus; @ApiModelProperty(value = "任务来源 1-运维APP 2-管理后台") private Integer taskSource; @ApiModelProperty(value = "申请改派的用户id") @TableField(typeHandler = JacksonTypeHandler.class) private List<Long> excluded; private List<XpTaskHandleDetail> logs; } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/PositionMsgHandler.java
@@ -37,12 +37,16 @@ private void saveToMongo(XpOperationsUserPositionDTO dto) { XpOperationsUserPositionDTO vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("id").is(dto.getId())), XpOperationsUserPositionDTO.class); if (null == vehiclePosition) { double[] location = {dto.getLongitude(), dto.getLatitude()}; dto.setLocation(location); mongoTemplate.save(dto); }else{ Update update = new Update() .set("id",dto.getId()) .set("latitude", dto.getLatitude()) .set("latitude", dto.getLongitude()); .set("longitude", dto.getLongitude()); double[] location = {dto.getLongitude(), dto.getLatitude()}; update.set("location", location); mongoTemplate.updateFirst(new Query(Criteria.where("id").is(dto.getId())), update, XpOperationsUserPositionDTO.class); } }