无人机飞手接单管理系统,行程台账方案
无人机低空作业不同于普通外勤工单,行程台账需要串联空域报备、到场打卡、飞行轨迹、交付素材、验收结算等数据,既要支撑飞手日程自查、运营排班统计,也要满足监管溯源、对账审计需求。台账模块统一汇聚订单、空域、履约、结算数据,支持多维度筛选导出,区分飞手个人台账、项目台账、平台汇总台账,避免数据分散在各个业务模块难以核对。本文基于SpringBoot讲解行程台账的数据模型、生成逻辑、权限管控与落地要点。
后端技术栈:SpringBoot + MyBatis-Plus + Redis + RabbitMQ,台账采用事件增量生成,不直接实时联查多张业务大表。基础台账数据持久化入库,高频汇总指标缓存至Redis,业务节点变更通过MQ触发台账更新,导出文件异步生成。
整体业务流程:订单通过派单或竞价成交后,初始化一条行程台账主记录,绑定订单编号、空域编号、飞手信息、作业时间、作业区域;履约过程中,打卡、起飞降落、素材上传、验收、改派、取消等事件触发台账明细更新;台账主表存储核心统计字段,明细表挂载轨迹、报备回执、交付文件链接;支持飞手在小程序查看个人行程,运营后台按片区、时间、作业类型筛选;结算完成后锁定台账,不允许随意修改;台账记录长期归档,支持导出Excel台账报表。
下面是台账初始化、履约节点更新核心Java示例代码:
@Service public class DroneTripBookService { @Autowired private TripBookMapper tripBookMapper; private TripBookItemMapper tripBookItemMapper; @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private RabbitTemplate rabbitTemplate; /** * 初始化行程台账 */ @Transactional(rollbackFor = Exception.class) public ResultDTO<Long> initTripBook(Long orderId, Long pilotId, Long airspaceId){ OrderInfo order = orderMapper.selectById(orderId); AirspaceReserve airspace = airspaceMapper.selectById(airspaceId); TripBook tripBook = new TripBook(); tripBook.setTripNo(UUID.randomUUID().toString().replace("-","")); tripBook.setOrderId(orderId); tripBook.setPilotId(pilotId); tripBook.setAirspaceId(airspaceId); tripBook.setWorkType(order.getWorkType()); tripBook.setWorkAreaWkt(airspace.getWkt()); tripBook.setPlanStartTime(airspace.getStartTime()); tripBook.setPlanEndTime(airspace.getEndTime()); tripBook.setTripStatus(1); tripBook.setCreateTime(LocalDateTime.now()); tripBookMapper.insert(tripBook); // 缓存飞手当日行程计数 String pilotDayKey = "trip:pilot:day:" + pilotId + ":" + LocalDate.now(); redisTemplate.opsForHash().increment(pilotDayKey, "count", 1); return ResultDTO.success(tripBook.getId()); } /** * 履约节点变更,更新台账明细 */ @Transactional(rollbackFor = Exception.class) public ResultDTO<Void> updateTripItem(Long tripId, Integer nodeCode, String nodeName, String attachUrl){ TripBook trip = tripBookMapper.selectById(tripId); if(trip == null){ return ResultDTO.fail("台账记录不存在"); } TripBookItem item = new TripBookItem(); item.setTripId(tripId); item.setNodeCode(nodeCode); item.setNodeName(nodeName); item.setAttachUrl(attachUrl); item.setCreateTime(LocalDateTime.now()); tripBookItemMapper.insert(item); // 更新台账主状态 trip.setTripStatus(nodeCode); tripBookMapper.updateById(trip); rabbitTemplate.convertAndSend("tripbook.update.notify", "trip.change", trip); return ResultDTO.success(); } }台账分层数据模型设计,分为台账主表、节点明细表、台账快照表。台账主表保存固定核心信息:台账编号、订单、飞手、空域编号、作业类型、计划时段、作业地理范围、台账状态、结算金额;节点明细表用于记录履约全流程事件,一条台账对应多条明细,存放打卡位置、轨迹文件、报备回执、交付素材链接;结算确认后生成只读快照,快照用于导出报表,防止后续业务数据变更造成历史台账统计错乱。台账状态包含待履约、进行中、已完成、改派终止、空域驳回、订单取消。
增量更新机制设计,台账不采用定时全量重新统计的方案,避免多表关联查询拖慢性能。每一次业务事件(接单、到场打卡、起飞降落、素材交付、验收、结算、改派)通过MQ推送,触发台账明细追加和主状态更新。对于周期巡检类长期订单,支持按天拆分多条子台账,每天行程独立记录,方便按日出工统计。
多视图台账查询方案,系统提供三类台账视图。飞手个人行程台账:只展示本人行程,支持按日期筛选,查看待办、已完成、已取消任务,用于飞手日程安排;项目台账:以订单/项目为维度,展示整个项目下所有飞行行程、空域材料、交付成果;平台汇总台账:面向运营管理,支持按片区、作业类型、飞手、时间段筛选,统计作业次数、飞行时长、营收数据。
导出与归档方案,导出功能采用异步任务处理,前端提交导出请求后后台生成Excel,文件存入MinIO,生成临时签名链接通知下载。导出字段可配置,基础版包含行程编号、飞手、时间、地址、订单金额;监管台账版本附加空域报备编号、执照编号、飞行轨迹链接。已结算、已完成的台账按月份冷热归档,迁移至历史台账表,减少活跃表数据量,提升查询速度。
权限与数据隔离,飞手仅允许查看、导出自己的行程台账;项目负责人可查看归属项目下全部台账;运营管理员拥有平台汇总台账权限,但敏感证照信息在导出时默认脱敏;台账快照只可读,不支持编辑删除。台账的修改操作留有操作日志,记录修改人、修改内容,防止人为篡改履约记录。
上下游业务模块联动,台账初始化依赖订单模块和空域预约模块,绑定空域资源编号;同步拉取资质信息,台账中标记飞手持照类型;和订单跟踪模块复用履约事件,不需要重复埋点;台账数据同步给结算模块,作为飞手工时、服务费核算依据;监管抽查时,可通过台账编号快速串联订单、空域报备、资质审核、飞行轨迹整套资料。
统计指标与看板支撑,基于台账数据可聚合统计指标:飞手日出勤量、片区作业量、各类业务占比、改派率、流拍率、营收汇总。聚合指标预计算存入Redis,后台管理看板直接读取,不需要实时扫描全量台账数据。指标支持按日、周、月维度切换。
异常台账处理逻辑,订单改派时,原有台账标记终止,新建台账绑定新飞手,两条台账互相关联,备注改派原因;空域审批驳回、天气取消的台账单独打上异常标签,运营可以单独筛选统计;台账数据出现缺失节点时,定时巡检任务扫描并告警,通知运营补录材料。
行程台账方案的核心,是把分散在订单、空域、履约跟踪里的飞行行程信息收拢成统一的结构化档案。既解决飞手日程管理、运营排班统计的内部管理需求,又可以快速导出完整台账材料,满足低空作业监管留痕、财务对账的要求,是整套无人机飞手接单管理系统的收尾汇总模块。