| | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.google.common.collect.Lists; |
| | | import com.xiaopeng.api.dto.account.XpOperationsUserPositionDTO; |
| | | import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO; |
| | | import com.xiaopeng.api.feignClient.account.SysUserClient; |
| | | import com.xiaopeng.api.feignClient.account.XpOperationUserClient; |
| | | import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient; |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | | import com.xiaopeng.api.feignClient.operation.SmsClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.WebSocketMessageClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient; |
| | |
| | | import com.xiaopeng.api.model.maintenance.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.vo.XpTaskVO; |
| | | import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO; |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | | import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants; |
| | | import com.xiaopeng.api.vo.operation.RouteVo; |
| | | import com.xiaopeng.api.vo.operation.SmsVo; |
| | | import com.xiaopeng.common.core.constant.AliPushTypeConstant; |
| | | import com.xiaopeng.common.core.domain.R; |
| | |
| | | import com.xiaopeng.maintenance.model.query.XpTaskRecordPageQuery; |
| | | import com.xiaopeng.maintenance.model.vo.*; |
| | | import com.xiaopeng.maintenance.repo.XpOperationsUserRepository; |
| | | import com.xiaopeng.maintenance.service.IXpClockInService; |
| | | import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService; |
| | | import com.xiaopeng.maintenance.service.IXpTaskRuleService; |
| | | import com.xiaopeng.maintenance.service.XpTaskService; |
| | |
| | | import com.xiaopeng.maintenance.vo.TaskCleanDetailVO; |
| | | import com.xiaopeng.maintenance.vo.TaskDetectionDetailVO; |
| | | import com.xiaopeng.maintenance.vo.TaskReassignmentVo; |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; |
| | |
| | | |
| | | @Resource |
| | | private WebSocketMessageClient xpWebSocketMessageClient; |
| | | |
| | | @Resource |
| | | private IXpClockInService xpClockInService; |
| | | |
| | | @Override |
| | | public PageInfo<WorkBenchVO> workbench(WorkBenchQuery query) throws UnsupportedEncodingException { |
| | |
| | | List<Long> userIds = xpOperationsRoleResult.getData().stream().filter(x -> ids.contains(x.getOperationsUserId())) |
| | | .map(XpOperationsRole::getOperationsUserId) |
| | | .distinct().collect(Collectors.toList()); |
| | | xpTask.setHandleUserId(StringUtils.join(userIds, ",")); |
| | | //获取首选人的实时定位,计算每个人到事故车辆位置的导航距离 |
| | | List<Operations> operationsList = new ArrayList<>(); |
| | | for (Long userId : userIds) { |
| | | Operations operations = new Operations(); |
| | | operations.setUserId(userId); |
| | | XpOperationsUserPositionDTO vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("id").is(userId)), XpOperationsUserPositionDTO.class); |
| | | if(null != vehiclePosition){ |
| | | LonLatDto start = new LonLatDto(vehiclePosition.getLongitude(), vehiclePosition.getLatitude()); |
| | | LonLatDto end = new LonLatDto(xpTask.getVehicleLon().doubleValue(), xpTask.getVehicleLat().doubleValue()); |
| | | RouteVo routeVo = gdMapGeocodingUtil.getDistanceAndTime(start, end, null, null, null, null); |
| | | operations.setDistance(routeVo.getDistance()); |
| | | } |
| | | operationsList.add(operations); |
| | | } |
| | | //对距离进行排序,去距离最近的人员 |
| | | operationsList.sort((o1, o2) -> o1.getDistance().compareTo(o2.getDistance()) * -1); |
| | | Operations operations = operationsList.get(0); |
| | | Long userId = operations.getUserId(); |
| | | //如果多人距离相同,可按照上班状态>空闲状态>工号排序 |
| | | List<Operations> collect = operationsList.stream().filter(s -> s.getDistance().equals(operations.getDistance())).collect(Collectors.toList()); |
| | | if(collect.size() > 1){ |
| | | //查询已经上班打卡了的人员 |
| | | List<XpClockIn> xpClockIns = xpClockInService.list(new QueryWrapper<XpClockIn>().in("app_user_id", collect) |
| | | .isNull("clock_out_result").last(" and DATE(now()) = DATE(clock_in_time)")); |
| | | if(xpClockIns.size() == 1){ |
| | | userId = xpClockIns.get(0).getAppUserId(); |
| | | }else if(xpClockIns.size() > 1){ |
| | | //查询有任务的人员 |
| | | List<Long> collect1 = xpClockIns.stream().map(XpClockIn::getAppUserId).collect(Collectors.toList()); |
| | | List<XpTask> list1 = this.list(new QueryWrapper<XpTask>().eq("task_category", 2).in("handle_user_id", collect1) |
| | | .in("status", Arrays.asList(0, 1, 4))); |
| | | if(list1.size() > 0){ |
| | | //对工号进行排序 |
| | | List<String> collect2 = list1.stream().map(XpTask::getHandleUserId).collect(Collectors.toList()); |
| | | //找出没有任务的人员 |
| | | List<Long> collect3 = collect1.stream().filter(s -> !collect2.contains(s.toString())).collect(Collectors.toList()); |
| | | //查询人员数据,对其进行工号排序 |
| | | XpOperationsUserQueryDTO dto1 = new XpOperationsUserQueryDTO(); |
| | | dto1.setIds(collect3); |
| | | List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.findList(dto1).getData(); |
| | | data.sort((o1, o2) -> o1.getUniqueNumber().compareTo(o2.getUniqueNumber()) * -1); |
| | | userId = data.get(0).getId(); |
| | | } |
| | | } |
| | | } |
| | | xpTask.setHandleUserId(userId.toString()); |
| | | } |
| | | // 根据事故处理限时配置设置任务截止时间 |
| | | LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()); |
| | |
| | | return xpTask; |
| | | } |
| | | |
| | | |
| | | @Data |
| | | class Operations { |
| | | /** |
| | | * 候选人id |
| | | */ |
| | | private Long userId; |
| | | /** |
| | | * 距离 |
| | | */ |
| | | private Integer distance; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 异步发送事故通知 |
| | | * @param xpTask 任务信息 |