ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

无人机飞手接单源码开发,报价竞价模块拆解

无人机飞手接单源码开发,报价竞价模块拆解

无人机飞手接单源码开发,报价竞价模块拆解

无人机航拍、巡检、植保这类低空非标项目,单纯固定套餐很难覆盖个性化需求,报价竞价模块提供两种模式:标准化一键报价和需求发布、飞手多轮竞价。模块需要前置资质过滤、价格上下限风控、竞价周期控制、报价快照留存,兼顾用户比价需求,同时防止低价恶性竞争,和空域、资质、派单模块联动。本文基于SpringBoot拆解模块模型、竞价流程、风控规则与落地方案。

后端技术栈:SpringBoot + MyBatis-Plus + Redis + Redisson + RabbitMQ,竞价模块独立服务,Redis缓存竞价单状态与实时报价列表,Redisson分布式锁控制并发出价,MQ处理竞价结束通知、订单流转事件,报价记录持久归档用于对账溯源。

整体业务流程:用户发布需求,选择模式(套餐报价/竞价模式),填写作业位置、时间、机型、预算上限、最低保护价;系统先做空域粗校验,筛选符合资质、档期空闲的飞手进入竞价池;飞手在有效期内提交报价,可修改出价;竞价截止或者延时结束后,用户查看全部有效报价,自主选定飞手成交;成交后生成订单与价格快照;竞价流拍则自动转入智能派单或者重新发布需求;每一条出价记录都留存,不可删除。

下面是竞价出价、竞价截止判定核心Java示例代码:

@Service public class DroneBiddingService { @Autowired private BiddingDemandMapper biddingDemandMapper; private BiddingRecordMapper biddingRecordMapper; private PilotMatchService pilotMatchService; @Autowired private RedissonClient redissonClient; @Autowired private RabbitTemplate rabbitTemplate; /** * 飞手提交竞价出价 */ @Transactional(rollbackFor = Exception.class) public ResultDTO<Boolean> submitBid(Long demandId, Long pilotId, BigDecimal bidPrice, String bidRemark){ BiddingDemand demand = biddingDemandMapper.selectById(demandId); if(demand == null || !demand.getBiddingStatus().equals(1)){ return ResultDTO.fail("竞价单不存在或已结束"); } // 价格风控:不能高于预算上限、不能低于平台保护底价 if(bidPrice.compareTo(demand.getMaxBudget()) > 0){ return ResultDTO.fail("报价不能超过预算上限"); } if(bidPrice.compareTo(demand.getMinProtectPrice()) < 0){ return ResultDTO.fail("报价低于平台最低保护价,禁止提交"); } // 校验飞手资质、档期是否满足需求 boolean matchPass = pilotMatchService.checkPilotMatch(demand, pilotId); if(!matchPass){ return ResultDTO.fail("飞手资质、机型或档期不满足本次需求,无法出价"); } String lockKey = "bidding:lock:" + demandId; RLock lock = redissonClient.getLock(lockKey); boolean locked = lock.tryLock(2,10,TimeUnit.SECONDS); if(!locked){ return ResultDTO.fail("竞价繁忙,请稍后重试"); } try { // 写入出价记录,支持多次修改,保留历史版本 BiddingRecord record = new BiddingRecord(); record.setDemandId(demandId); record.setPilotId(pilotId); record.setBidPrice(bidPrice); record.setBidRemark(bidRemark); record.setCreateTime(LocalDateTime.now()); biddingRecordMapper.insert(record); // 更新缓存内报价列表 rabbitTemplate.convertAndSend("bidding.change.notify","bid.new",record); return ResultDTO.success(true); }finally { lock.unlock(); } } /** * 竞价结束,自动关闭竞价通道 */ @Transactional(rollbackFor = Exception.class) public ResultDTO<Void> closeBidding(Long demandId){ BiddingDemand demand = biddingDemandMapper.selectById(demandId); if(!demand.getBiddingStatus().equals(1)){ return ResultDTO.success(); } demand.setBiddingStatus(2); biddingDemandMapper.updateById(demand); // 推送竞价结束事件,通知用户查看报价列表 rabbitTemplate.convertAndSend("bidding.finish.exchange","bidding.end",demand); return ResultDTO.success(); } }

两种交易模式模型设计,模块同时支持套餐直购和竞价模式,由用户发布需求时选择。套餐直购复用基础报价模块,适合标准化航拍;竞价模式适合大型测绘、巡检、长期外包这类非标项目。竞价单主表存储需求信息、预算上限、底价、竞价起止时间、延时开关;出价记录表采用追加写入,飞手每次修改报价都会新增一条记录,前端展示最新报价,后台可以查看全部历史出价轨迹。

竞价池准入前置过滤,不是所有飞手都能看到并出价。进入竞价池需要多重校验:执照等级匹配作业类型、设备机型满足需求、作业时段无档期冲突、飞手账号正常未冻结。过滤逻辑复用资质核验、档期校验能力,避免资质不合规飞手参与竞价,防止后续空域、起飞环节出现合规风险。竞价池飞手列表会缓存到Redis,定时刷新。

竞价周期与延时机制,支持固定时长竞价,同时开启延时规则:竞价截止前N分钟有新出价,自动顺延竞价窗口。延时可以避免最后一刻压价,提升竞价充分度。后台可以配置延时开关、延时时长、最大延时次数。竞价到期后自动关闭出价入口,飞手不能继续提交报价;如果有效出价飞手数量为0,标记流拍。

价格风控与底价保护,为了避免恶性低价竞争,平台设置最低保护价,低于底价直接拦截出价;同时设置用户预算上限,报价不能超过预算。后台可以配置飞手报价浮动区间,附加费(空域报备、差旅、后期剪辑)可以单独填写并展示明细,不全部打包进总价,用户能看清报价构成。飞手报价时可以填写备注,说明包含的交付物、服务标准。

用户选单与成交快照,竞价结束后,用户端展示所有有效飞手报价,附带飞手评分、距离、历史履约记录,用户自主选择飞手成交。一旦确认成交,系统锁定这条报价,生成订单,同时生成报价竞价快照,快照包含竞价单信息、选中的出价记录、全部参与报价列表。后续结算、纠纷仲裁都以快照为准,即使平台价格规则改动,历史成交不受影响。

缓存、并发与事件解耦,竞价列表属于高频读取数据,放在Redis缓存,出价、竞价状态变更时刷新缓存。出价接口加分布式锁,防止同一飞手短时间重复提交、并发脏数据。竞价结束、用户选中成交、流拍事件全部通过MQ异步分发,通知订单中心、调度模块、消息推送模块,主出价接口保持轻量。

权限隔离设计,发布需求的用户可以查看所有飞手报价,但看不到其他飞手的联系方式;飞手只能看到自己的出价记录,看不到其他竞争者的报价(也可以配置为匿名比价模式);管理员可以查看完整竞价单、全部出价记录、操作日志,用于监管和纠纷核查。报价备注、交付说明等内容需要敏感词过滤。

上下游模块联动,竞价模块读取空域预约结果,管制空域的竞价单提示额外报备成本;调用资质接口做飞手准入校验;成交后推送订单事件给作业跟踪模块,开启订单跟踪链路;流拍的竞价需求自动流转到智能派单服务,由系统自动匹配高分飞手;报价快照同步给结算模块,作为佣金、飞手分佣的计算基准。

异常场景处理,竞价过程中空域审批驳回,直接终止竞价,通知用户;飞手在竞价期间资质过期、档期被占用,自动失效,已提交报价标记无效;用户中途主动关闭竞价单,停止接收新出价;成交之后,飞手临时无法履约,订单退回,竞价单可以标记重新开放竞价。

竞价模块的核心价值,是在标准化套餐之外,给非标低空项目提供比价渠道,同时用准入过滤、底价保护机制控制风险。它和套餐报价、资质审核、空域预约、智能派单一起,形成一套“固定报价+竞价选飞手”的混合交易体系,适配航拍、巡检、植保等多样化低空业务。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进