☰
无人机飞手接单系统开发,智能匹配派单方案
2026/10/15 9:18:37 网站建设 项目流程

无人机飞手接单系统开发,智能匹配派单方案

无人机飞手接单系统区别于普通同城跑腿派单,需要兼顾空域约束、执照资质、设备型号、作业能力、档期资源、距离、口碑评分多重约束,不能单纯按远近分配订单。智能匹配派单方案以规则过滤前置、多维度打分排序、抢单兜底、异常改派为核心,过滤掉不合规飞手之后,对候选集合量化打分择优推送,同时保留完整调度日志,保障低空作业合规,减少订单爽约、交付不合格问题。本文基于SpringBoot讲解整套落地方案。

后端技术栈:SpringBoot + MyBatis-Plus + RedisGeo + Redisson + RabbitMQ,派单服务独立部署,接收订单中心的派单事件,依赖资质核验、空域预约模块做前置校验。Redis存储飞手实时位置、在线状态、档期占用,MQ异步推送接单通知、记录调度轨迹。

整体业务流程:订单支付成功并且空域预约预审通过后,向派单服务下发派单事件;系统根据订单作业类型、机型要求、作业片区、空域信息,先做硬规则过滤,剔除资质失效、设备不符、档期冲突、不在服务片区的飞手;剩余候选飞手通过打分模型计算综合分值,按分数从高到低依次推送接单通知;飞手接单后锁定档期,订单流转至履约环节;飞手拒绝或者超时未接单,订单自动回流候选池,顺延推送下一名飞手;多次推送失败后转入抢单池,同片区符合条件飞手可自主抢单;紧急订单支持后台人工指派。

下面是飞手过滤、打分排序核心Java示例代码:

@Service public class PilotMatchDispatchService { @Autowired private RedisTemplate<String, Object> redisTemplate; private PilotInfoMapper pilotInfoMapper; private PilotScheduleMapper pilotScheduleMapper; @Autowired private RabbitTemplate rabbitTemplate; /** * 筛选符合硬性条件的候选飞手 */ public List<PilotMatchDTO> filterValidPilot(DispatchQueryDTO dispatchDTO) { String geoKey = "pilot:geo:area:" + dispatchDTO.getAreaId(); GeoResults<RedisGeoCommands.GeoLocation<String>> geoResult = redisTemplate.opsForGeo() .radius(geoKey, new Point(dispatchDTO.getLng(), dispatchDTO.getLat()), dispatchDTO.getSearchRadius(), Metrics.KILOMETERS); if (geoResult == null) { return Collections.emptyList(); } List<Long> pilotIdList = geoResult.getContent().stream() .map(item -> Long.valueOf(item.getContent().getName())) .collect(Collectors.toList()); if (pilotIdList.isEmpty()) { return Collections.emptyList(); } List<PilotMatchDTO> pilotList = pilotInfoMapper.selectBatchPilot(pilotIdList); // 资质、机型、档期过滤 return pilotList.stream() .filter(pilot -> pilot.getOnlineStatus() == 1) .filter(pilot -> pilot.getCertValid() == 1) .filter(pilot -> pilot.getSupportWorkTypes().contains(dispatchDTO.getWorkTypeId())) .filter(pilot -> pilot.getDroneModelIds().contains(dispatchDTO.getRequireModelId())) .filter(pilot -> !pilotScheduleMapper.isScheduleBusy(pilot.getId(), dispatchDTO.getWorkStartTime(), dispatchDTO.getWorkEndTime())) .collect(Collectors.toList()); } /** * 飞手综合打分,分值越高优先推送 */ public double calculateScore(PilotMatchDTO pilot, double distance) { // 距离权重、当前负载权重、历史好评权重、准时率权重 double weightDistance = 0.3; double weightLoad = 0.25; double weightScore = 0.3; double weightOnTime = 0.15; double distanceScore = Math.max(0, 10 - distance); double loadScore = Math.max(0, 10 - pilot.getOngoingTaskCount() * 2); double starScore = pilot.getAvgStar(); double onTimeScore = pilot.getOnTimeRate() * 10; return distanceScore * weightDistance + loadScore * weightLoad + starScore * weightScore + onTimeScore * weightOnTime; } /** * 执行智能派单主逻辑 */ @Transactional(rollbackFor = Exception.class) public ResultDTO<Void> doDispatch(DispatchOrderDTO orderDTO) { List<PilotMatchDTO> candidateList = filterValidPilot(orderDTO); if (candidateList.isEmpty()) { transferToGrabPool(orderDTO); return ResultDTO.success("无匹配飞手,转入抢单池"); } // 计算分数并降序排序 for (PilotMatchDTO item : candidateList) { double dist = getDistance(item.getLng(), item.getLat(), orderDTO.getLng(), orderDTO.getLat()); item.setTotalScore(calculateScore(item, dist)); } candidateList.sort((a, b) -> Double.compare(b.getTotalScore(), a.getTotalScore())); PilotMatchDTO bestPilot = candidateList.get(0); // 绑定订单,推送通知 orderDTO.setPilotId(bestPilot.getId()); orderMapper.updatePilotId(orderDTO.getId(), bestPilot.getId()); // 锁定档期 pilotScheduleMapper.lockSchedule(bestPilot.getId(), orderDTO.getWorkStartTime(), orderDTO.getWorkEndTime(), orderDTO.getId()); rabbitTemplate.convertAndSend("pilot.dispatch.notify", "dispatch.send", orderDTO); saveDispatchLog(orderDTO, bestPilot.getId(), "自动派单成功"); return ResultDTO.success("派单推送完成"); } }

硬性规则前置过滤设计,硬规则是低空派单的第一道防线,不参与打分,不满足直接剔除。规则包含飞手在线状态、执照是否在有效期、是否具备该作业类型资质、名下是否有匹配机型、作业时间段是否存在档期冲突、是否在服务片区范围内。这样可以大幅缩小候选集,避免给不合规飞手推送订单,从派单环节规避无证飞行、设备不匹配的合规风险。硬性规则支持后台可视化配置,不同作业类型可以启用不同的校验条件。

多维打分模型设计,过滤后的候选飞手进入打分环节,模型包含四个核心维度。距离分代表飞手抵达作业点位的通勤成本;负载分衡量当前手上在执行订单数量,防止飞手任务过载;好评分来源于历史订单用户评价;准时率分统计过往作业是否按时到场、按时交付。权重参数后台可配置,测绘巡检等高标准订单可以调高好评和准时率权重;短途航拍订单提高距离权重。应急加急订单支持单独开启加急权重,优先分配给响应速度快的飞手。

档期锁定与资源隔离,无人机作业是预约制,时间资源需要严格隔离。飞手接单之后,系统在schedule表和Redis中锁定对应时段,同一段时间内不再分配其他订单。如果飞手拒绝接单、主动取消订单,或者订单被用户取消,定时任务自动释放档期资源。针对多机协同项目,派单支持批量匹配多名飞手,统一锁定同一作业时段。

超时流转和抢单兜底机制,订单推送后设置接单超时时间,超时未确认自动收回订单,顺延推送下一个高分飞手。连续多轮推送失败,订单转入片区抢单池,只有满足资质、设备、档期条件的飞手才可以看到抢单列表。抢单接口增加分布式锁,防止同一订单被多名飞手同时抢到。抢单模式适合淡季、偏远点位、小众特种作业订单,弥补智能匹配找不到合适飞手的场景。

人工指派与审批通道,自动派单适用于常规航拍、植保订单。应急抢险、大型测绘、跨空域作业等高风险订单,管理员可以直接人工指派飞手。人工指派会记录指派人和指派原因,写入调度日志。部分管制空域、夜间飞行订单,指派完成后还需要联动资质、空域模块二次审批,审批通过飞手才能开始作业。

飞手状态和位置管理,飞手登录APP后切换在线/离线状态,移动端定时上报GPS坐标,位置数据写入RedisGeo结构,用于快速空间检索。系统区分作业中和空闲状态,正在飞行作业的飞手会降低打分权重。为节省带宽,空闲飞手可以降低定位上报频率。

日志溯源与数据统计,每一次过滤、打分、推送、接单、拒单、改派都生成调度日志,记录候选飞手列表、每个飞手得分、调度结果。日志和订单溯源打通,后续发生纠纷、安全事件时可以回溯派单过程。后台报表统计飞手接单率、拒单率、准时交付率,数据反哺打分模型,长期表现差的飞手会在匹配时被压低分值。

上下游模块联动,派单服务依赖空域预约模块确认空域审批状态,空域未审批通过不发起派单;调用资质核验接口做飞手资质二次校验;派单结果回写订单,推送消息通知用户和飞手;报价模块的订单价格明细随派单消息下发给飞手;订单完成后的评价数据回流,持续更新飞手评分指标。

异常场景处理,飞手接单后设备故障、天气原因无法履约,可以发起改派,系统释放档期,订单重新进入智能匹配流程;片区空域临时管制,批量终止待派订单;飞手多次无故拒单、爽约,后台可以设置管控标签,降低派单优先级甚至暂停接单权限;长时间无人承接的订单触发预警,运营对接客户协商更换时间或者作业方案。

智能匹配派单方案的核心,是把低空业务的合规约束放在最前面,先过滤再打分,标准化自动派单搭配抢单和人工指派兜底。相比简单就近派单,这套方案兼顾合规、交付质量、飞手负载均衡,和空域预约、资质核验、报价管理模块一起,构成无人机同城服务平台的履约调度核心。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询