---
name: 跟单功能重构
overview: 重构跟单功能以对齐普通合约交易口径:按币数量下单、开平仓完整计入手续费与资金费、引入跟单员申请审核流程、补齐实时持仓与跟单关系展示,并将停止跟单设计为异步全平以支持高并发场景。
todos:
- id: align-follow-qty
content: 把跟单配置与执行口径统一为币数量,完成接口校验和旧字段兼容设计
status: pending
- id: refactor-follow-executor
content: 重构跟单开平仓派生执行器,按普通合约流程复用费用与结算,并加入幂等与批量异步编排
status: pending
- id: async-stop-follow
content: 实现停止跟单异步全平、状态流转、失败重试与结果查询
status: pending
- id: trader-audit-square
content: 完善跟单员申请审核与广场可见性过滤,只展示审核通过的跟单员
status: pending
- id: positions-and-views
content: 补齐跟单用户与跟单员两侧的实时持仓和跟单关系查询接口
status: pending
- id: verify-regressions
content: 验证费用结算、钱包扣退、审核过滤、停止跟单和高并发跟单场景
status: pending
OpenAction.amount 已按“币数量”口径接收,ApiContractApplyOrderController.open 直接写入 ContractApplyOrder.volume。TraderFollowUser.volume/volumeMax,语义仍偏“张数/比例”,需要改成“币数量最小值/最大值”并在跟单创建、修改、执行时统一校验。ContractOrderService 成交后触发 TraderFollowUserOrderServiceImpl.traderOpen/traderClose,但实现偏逐个用户串行生成委托。ApiTraderController.apply 写 Trader.checked=0,AdminTraderController.check 审核;但广场查询侧仍需强制只展示 checked=1。TraderFollowUser.volume、volumeMax 的业务语义从“张数/比例”调整为“最小跟单币数量/最大跟单币数量”。save.action、changeFollow.action 增加区间校验:最小值 > 0,最大值 >= 最小值。ContractApplyOrder.volume / volumeOpen,和普通合约 open.action 保持一致。followType 做兼容处理:如果前端和数据库已大量依赖,可先保留字段但废弃“比例跟单”逻辑,仅支持固定币数量模式;旧数据迁移为固定数量。ContractApplyOrderService.saveCreate/open,保证金、手续费、资金费、平仓结算统一走普通合约规则。TraderFollowUserOrder 增加足够字段,确保能追踪“跟单关系 + 跟随委托单/持仓单 + 状态 + 停止来源”,支持后续异步全平和重试。Trader.checked 状态,不另起新审核框架。checked=0;后台审核后更新 checked。checked=1 且 state=1 的交易员。findByPartyIdAndChecked(...,1) 兜底,避免未审核用户即使手工构造数据也能触发跟单。ContractOrder.follow、TraderFollowUser、TraderFollowUserOrder 组合装配,避免新建重复持仓表;确有缺口时只补必要索引或状态字段。cancelFollow.action 改为:TraderFollowUser.state 置为“停止中”。TraderFollowUserOrderServiceImpl.traderOpen/traderClose 为逐用户串行处理,需要重构为“批量拉取跟单关系 + 分片生成任务 + 统一入异步队列”。traderOrderNo + followerPartyId + actionTypefollowRelationId + stopBatchNoflowchart TD
traderFilled[TraderFilled] --> dispatchFollow[DispatchFollowTasks]
dispatchFollow --> followTaskQueue[FollowTaskQueue]
followTaskQueue --> buildApplyOrder[BuildFollowerApplyOrder]
buildApplyOrder --> contractCreate[ContractApplyOrderService.saveCreate]
contractCreate --> contractQueue[NEW_CONTRACT_APPLY_ORDERS]
contractQueue --> contractHandle[ContractApplyOrderHandleJob]
contractHandle --> saveOpenClose[ContractOrderService.saveOpenOrSaveClose]
userStopFollow[UserStopFollow] --> markStopping[MarkFollowStopping]
markStopping --> stopTaskQueue[StopFollowTaskQueue]
stopTaskQueue --> closeFollowerOrders[CreateFollowerCloseOrders]
closeFollowerOrders --> contractQueue
closeFollowerOrders --> markStopped[MarkFollowStopped]
TraderFollowUser 数据需兼容;需要明确旧“比例跟单”是否全部废弃并做一次迁移。ContractApplyOrderHandleJob 的消费能力。TraderServiceImpl.getPaged 过滤条件未生效的问题,避免审核状态和展示结果不一致。