Code Map
ODTS 06 — 代码地图:逐项目导航
这篇文档是 ~35 个项目(~/odts1/ 下)的导航索引。每个项目回答三个问题:这个项目做什么?→ 关键包是什么?→ 什么时候会动它?
1. 核心交易系统(三大件)
1.1 eds-web-app — 后端枢纽
系统中最重要的项目。95% 的业务逻辑在这。
业务含义: eds-web-app 宕机 = 交易台无法簿记新交易、无法生成确认书、无法推送 SAC 报告。一次 30 分钟的宕机意味着:交易员无法录入正在电话上敲定的交易,客户在电话里等一个合约号,系统就是给不出来。2018-2021 年间,eds-web-app 因内存泄漏导致的偶发宕机(每季度 1-2 次)平均恢复时间约 20 分钟——这段时间交易台”盲交易”(先做交易,后补录系统),但补录本身增加运营风险。
路径: ~/odts1/eds-web-app/
技术栈: Java 8, Gradle, Spring Boot (edsBoot), ActiveMQ, Protobuf, JFinal(老部分)
| 包 | 职责 |
|---|---|
controller.* | REST API 端点(“新”Spring Boot 层) |
action.* | 早期 Action 类(类 Struts 模式) |
action.contract.* | 合约簿记、估值报告 |
action.contractFile.* | 确认书文档生成 |
action.sacReport.* | SAC 监管报告 |
communication.* | 系统间通信(ACP、Dipper) |
activeMQ.* | 消息队列集成 |
最常用的 Controllers:
ContractController.java— 簿记、确认书、文件生成PreBookController.java— 预簿记工作流OptionExecutionController.java— 期权行权/指派CashVrController.java— 资金变动 CRUDMarginController— 保证金查询ReferenceDataController.java— 参考数据(标的、日历)
什么时候改这个项目: 任何业务规则变化——合约条款、确认书逻辑、报告、定价触发、保证金规则。
1.2 hedging-as — 定价与风险引擎
ODTS 的分析核心。处理所有定价、估值、保证金、EOD 计算。
业务含义: hedging-as 宕机 = EOD 跑不出来 = 第二天交易台的 Greeks 和保证金数据是前一晚的。2022 年曾经有一次 EOD 在凌晨 2 点才跑完,原因是 hedging-as 的估值线程池配置太小,5000 个合约排队处理。交易员第二天开盘用的保证金数据是 18 小时前的——在波动市里”18 小时前的保证金”几乎等于没有。
路径: ~/odts1/hedging-as/
技术栈: Java 8, Gradle, JFinal (web 框架), Protobuf, 0MQ, ActiveMQ
| 包 | 职责 |
|---|---|
pricing.* | 定价引擎:计算、数据、模型、保证金、压力测试 |
edslib.payoff.* | 收益函数——每个产品的数学定义 |
edslib.valuation.* | 估值方法(蒙特卡洛、解析解、PDE) |
action.contract.* | 合约 CRUD(交易领域模型所在地) |
action.quotation.* | 报价入口(PricingService 适配器) |
action.valuation.* | EOD 估值触发 |
action.margin.* | 保证金计算 |
action.eod.* | 日终批处理编排 |
service.contract.* | 核心交易领域:Contract.java、ContractHelper.java |
service.margin.* | 保证金服务层 |
service.eod.* | EOD 批处理服务 |
service.Fixing.* | 定盘/利率重置处理 |
service.event.* | 生命周期事件管理 |
service.stateMachine.* | 交易状态机 (ACTIVE→EXPIRED→TERMINATED) |
cep.* | 复杂事件处理(实时风控) |
关键领域类:
service/contract/model/
├── ContractLegStruct.java — Leg 结构(收/付规则)
├── ContractNotional.java — 名义本金
├── ContractWithLegs.java — 合约 + 所有 leg 聚合
├── ContractInstrumentRelate.java
├── ContractUnderlyingRelate.java
└── ContractMonitor.java
edslib/payoff/
├── SnowballPayoff.java — 雪球结构
├── TrsPayoff.java — 总收益互换
├── NdollarPayoff.java — NDF
├── VanillaOptionPayoff.java
├── BarrierOptionPayoff.java
└── SwapPayoff.java
什么时候改: 加新产品类型、改定价公式、修 EOD batch bug、调保证金方法论。
1.3 edsWeb — 原始 JSP 前端
遗留前端。正在被 new-edsweb 逐步替代。
路径: ~/odts1/edsWeb/
技术栈: Java 8, JSP, Gradle, Struts 式 Action
| 包 | 职责 |
|---|---|
action.* | UI 动作处理器(登录、导航) |
communication.* | 后端 API 桥接 |
global.* | 全局配置 |
framework.* | 自定义框架(数据库、Protobuf) |
什么时候改: 只修 bug。新功能写 new-edsweb + eds-web-app。
2. 前端项目
2.1 new-edsweb — 现代 Vue 2 SPA
核心 EDS 系统的活跃前端。
路径: ~/odts1/new-edsweb/
技术栈: Vue 2, Element UI, VxeTable, Vuex, Vue Router, Axios
| 目录 | 职责 |
|---|---|
src/views/ | 页面级组件 |
src/api/ | 后端 API 调用 |
src/components/common/ | 共享 UI 组件 |
src/components/VxeTable/ | 高级表格组件 |
src/store/ | Vuex 状态管理 |
src/router/ | 路由定义 |
关键页面:
src/views/option-contract/ — 合约簿记
src/views/confirmationStamp/ — 确认书盖章
src/views/cashTransfer/ — 资金变动
src/views/customerInfo/ — 对手方详情
src/views/valuationReport/ — 客户估值报告
src/views/riskIndicators/ — 风控指标仪表盘
src/views/eod/ — EOD 操作视图
src/views/eventManagerNew/ — 生命周期事件管理
src/views/tradingCal/ — 交易日历
src/views/balanceCheckInfo/ — 余额检查
src/views/foreignExchange/ — 外汇敞口
src/views/blackOrWhiteList/ — 制裁/限制名单
什么时候改: 添加或修改核心 EDS 业务流程的 UI。
2.2 odts-option-web — 期权与风控 SPA
独立的 Vue 2 SPA,专注期权合约管理、对冲监控和风险分析。
重复的代价: 两个前端项目加起来约 14 万行 Vue 代码,其中大约 30% 的功能是重复的(合约列表、保证金展示、搜索过滤)。保守估算:一个功能在两套前端各做一遍,每次多花 3-7 天。2021-2023 年间,约 20+ 个功能被做了两遍——这意味着浪费了大约 60-140 人天(3-7 人月),足够做一个完整的共享组件库。
路径: ~/odts1/odts-option-web/
技术栈: Vue 2, Element UI, VxeTable, KoiUI(自研组件库), Axios
| 目录 | 职责 |
|---|---|
modules/option-contract/ | 期权合约管理 |
modules/hedge-monitor/ | 对冲监控仪表盘 |
modules/counterparty/ | 对手方头寸视图 |
modules/market/ | 报价、估值报告、限制名单 |
modules/stress-testing/ | 压力测试 UI |
modules/system/ | 管理后台(用户、角色、菜单、字典) |
components/KoiUI/ | 自研 UI 组件库 |
什么时候改: 建风控/对冲/期权专用的 UI、管理工具。
3. 市场数据与定价基础设施
3.1 eds-price-server
市场数据服务。从外部供应商(路透、彭博)和内部源聚合价格、波动率、利率。
路径: ~/odts1/eds-price-server/
技术栈: Java
什么时候改: 加新市场数据源、修数据源连接问题。
3.2 eds-utility / eds-utilitysrc
跨项目共享的工具库。
什么时候改: 加共享工具类(日期计算、数字格式化等)。
4. CRM 与客户端系统
4.1 AccessApp (accessapp-new)
客户使用的应用程序。用于查看投资组合和头寸、访问交易确认书、管理担保品和保证金追缴、查看对账单和报告。
路径: ~/odts1/accessapp-new/
技术栈: Java, Spring Boot
什么时候改: 客户端功能(不是核心 ODTS API)。
4.2 UnionLogin (unionLogin)
ODTS 生态的统一登录/单点登录 (SSO)。
什么时候改: 认证、SSO 集成。
5. 监管与报告
5.1 ofareg (ofareg-path)
监管报告子系统。处理 SAC 和其他监管报送。
路径: ~/odts1/ofareg-path/
技术栈: Java
做什么: 从 CtrContract 读取活跃交易 → 转换为 SAC 标准 XML → 通过 API 提交到监管系统 → 跟踪提交状态并处理重试。
什么时候改: 新监管要求、报告格式变化。
6. 消息队列与通信
6.1 ActiveMQ 基础设施
ActiveMQ 宕机的连锁反应: 每天 ~50 万条消息通过 ActiveMQ 流转。如果 ActiveMQ 挂了(2019-2020 年间发生过 3-4 次),定价结果传不到 eds-web-app,确认书生成请求发不出去,客户门户看不到更新。最严重的一次 ActiveMQ 宕机(2020 年)持续了 2 小时,导致 EOD 延迟到晚上 23:00 才完成——因为积压的 30 万条消息恢复后洪水般涌入,新消息又被堵住。修复方案是重启 ActiveMQ 并清空部分队列——但清队列意味着丢失了未处理的消息。此后团队给关键队列增加了持久化配置,但 ActiveMQ 的稳定性仍是系统的阿喀琉斯之踵。
多个项目通过 ActiveMQ 做异步消息:
edsWeb (UI 请求) → ActiveMQ → eds-web-app (业务逻辑)
hedging-as (定价) → ActiveMQ → eds-web-app (结果)
eds-web-app → ActiveMQ → AccessApp (客户通知)
6.2 Dipper 通信协议
eds-web-app/src/com/cicc/communication/dipper/ — 用 Protobuf 搭建的自研消息协议。早于 ActiveMQ 迁移,正在逐步淘汰。
7. 数据与存储
7.1 数据库
主要 RDBMS: MySQL / Oracle
关键表:
CtrContract — 交易/合约(核心表)
CtrContractLeg — 交易 legs
CtrContractLegCashFlow — 现金流计划
ContractFile — 确认书文档
CounterParty — 对手方主数据
MarginCall — 保证金追缴记录
ValuationResult — 每日估值快照
7.2 S3 对象存储
存储:确认书 PDF、报告文件、上传的文档。
7.3 Redis
用于:缓存参考数据、会话管理、限流。
8. Protobuf Schema 与代码生成
跨系统的数据合约定义在 Protobuf 中。每个业务领域有自己的 .proto 命名空间:
hedging-as/src/com/framework/protobuf/
├── bookingAs/ — 簿记系统消息
├── gateway/ — 网关协议
├── hedgingAs/ — 对冲应用服务器消息
├── pricingAS/ — 定价 AS 消息
├── reckoning/ — 结算消息
├── trade/ — 交易消息
└── util/ — 共享工具类型
9. 支撑工具
| 项目 | 用途 |
|---|---|
applog/ | 应用日志配置 |
config/ | 共享配置文件 |
diagrams.net/ | 架构图 |
ice/ | ICE 集成(期货/期权交易所) |
jzmq/ | JeroMQ (ZeroMQ Java) 集成 |
new-quota/ | 额度管理 |
tradedesign/ | 交易设计文档 |
快速参考:按业务关注点
| 关注点 | 项目 | 包/路径 |
|---|---|---|
| 交易簿记 | eds-web-app | ContractController.java |
| 定价 | hedging-as | pricing/service/PricingService.java, edslib/payoff/ |
| 确认书 | eds-web-app | action/contractFile/ |
| 估值 (EOD) | hedging-as | action/valuation/ |
| 保证金 | hedging-as | action/margin/, service/margin/ |
| 定盘 | hedging-as | action/Fixing/, service/Fixing/ |
| 公司行为 | hedging-as | ContractDividendHelper.java |
| SAC 报告 | ofareg, eds-web-app | action/sacReport/ |
| 客户门户 | accessapp-new | — |
| 对冲监控 | odts-option-web | modules/hedge-monitor/ |
| 资金管理 | eds-web-app | CashVrController.java |
| 风控仪表盘 | new-edsweb | views/riskIndicators/ |
| 参考数据 | eds-web-app | ReferenceDataController.java |
| 对手方 | eds-web-app | EdsCounterpartyController.java |
内行才知道的:两个服务共享一个 eds-utility,但它不是”免费午餐”
ODTS 的模块边界靠一个共享 JAR 维持:eds-utility(也叫 com.cicc.utils)。hedging-as 和 eds-web-app 都依赖它,里面装着日期工具、金额格式化、全局参数读取、合约字段生成器等”公共件”。
它长什么样
eds-utility/
├── DateUtil.java — 交易日/节假日计算
├── CommonUtil.java — 全局参数读取 (getGlobalParaValueByParaId)
├── MoneyUtil.java — 金额格式化、舍入
└── contract/generator/ — 确认书/交易书字段填充器
├── CommonParamProvider.java
└── SuperAdditionConfoGenerator.java
真实踩坑:改了日期工具,两个系统一起炸
DateUtil 里有一组”交易日历”方法(判断某天是不是交易日、往前推 N 个交易日)。2020 年一个开发者在 DateUtil 里修了一个”清明节调休”的边缘判断,本意是让 hedging-as 的 EOD 定盘日计算更准。但他没意识到 eds-web-app 也在用同一个 DateUtil 算簿记截止日和确认书生成日。
结果:EOD 修对了,但当周的簿记”同日截止”逻辑也跟着变了——有几笔应该在 T+0 截止的交易被系统判定为”已过期需走 T+1”,交易员当天无法簿记,只能走线下特批。更糟的是 CommonParamProvider 里那段 SELECT ELEMENTVALUE AS BSIGNEDPRODUCTSAC 的 SQL 是从全局参数表读”已签署产品”,这类全局读取一旦被 CommonUtil 的缓存改动影响,确认书生成会静默拿到旧产品名——确认书照常出,但产品名字是错的,客户拿到后才发现。
业务启示: 共享库看起来省事,但它把两个系统的”爆炸半径”绑在了一起。在 ODTS 里改 eds-utility 任何东西,正确的做法不是改完自己测一遍,而是同时回归 hedging-as 和 eds-web-app 两条线。这也是为什么很多”只动了一行工具方法”的发布,反而要拉上定价团队和簿记团队一起验。
一个反直觉的事实:common 包里不全是共享的
新人 grep contractFile 时经常误以为所有”合约文件”逻辑都在 eds-web-app 的 action/contractFile/。其实确认书的字段填充发生在 eds-utility 的 generator/ 里,而 eds-web-app 只是调用方。也就是说,确认书”显示什么文字”的真相在共享库,不在业务项目。修确认书模板 bug 时,如果你只改 template/ 下的 docx 却没效果,八成是 SuperAdditionConfoGenerator 里硬编码了某个字段映射——这种 bug 在业务项目里 grep 一整天都找不到。
下一篇:07-Business-Concepts.md —— TRS、NDF、雪球、Swap 到底是什么