10 KiB
10 KiB
货币格式化需求
元数据
- 需求编号:2026-01-21-002-05
- 创建时间:2026-01-21
- 创建人:SSOT 架构师
- 状态:进行中
- 优先级:中
- 父需求:2026-01-21-002-项目国际化需求
需求概述
实现货币格式化功能,支持根据用户地区显示货币,支持常用货币符号、货币小数位格式化、货币千分位分隔符。
目标
- 货币符号支持:支持常用货币符号(如:¥、$、€ 等)
- 小数位格式化:支持货币小数位格式化
- 千分位分隔符:支持货币千分位分隔符
- 自动选择:根据用户地区偏好自动选择货币格式
- 自定义格式:支持自定义货币格式
- 多货币显示:支持多货币显示和实时汇率转换
- 后端统一处理:通过 AOP 在 Service 层统一处理货币格式化
业务上下文
当前问题
- 货币显示格式固定,无法根据用户地区自动调整
- 缺乏货币格式化功能,用户体验不佳
业务场景
货币格式化
├─ 货币符号
│ ├─ 人民币:¥
│ ├─ 美元:$
│ ├─ 欧元:€
│ └─ 英镑:£
├─ 小数位
│ ├─ 两位小数:1,234.56
│ └─ 三位小数:1,234.567
├─ 千分位分隔符
│ ├─ 逗号分隔:1,234.56
│ └─ 点分隔:1.234,56
└─ 多货币显示
├─ 单一货币:¥100.00
├─ 多货币显示:¥100.00 ($14.50, €13.20)
└─ 实时汇率转换:根据实时汇率自动转换
应用场景
- 财务数据:显示财务数据时,需要符合用户地区的货币格式
- 商品价格:显示商品价格时,需要符合用户地区的货币格式
- 订单金额:显示订单金额时,需要符合用户地区的货币格式
- 报表统计:生成报表时,需要符合用户地区的货币格式
功能需求
核心功能
功能 1:货币符号支持
- 描述:支持常用货币符号
- 验收标准:
- 支持人民币符号(¥)
- 支持美元符号($)
- 支持欧元符号(€)
- 支持英镑符号(£)
- 支持日元符号(¥)
- 优先级:高
- 依赖关系:无
功能 2:小数位格式化
- 描述:支持货币小数位格式化
- 验收标准:
- 支持两位小数格式化
- 支持三位小数格式化
- 支持自定义小数位
- 小数位四舍五入
- 优先级:高
- 依赖关系:无
功能 3:千分位分隔符
- 描述:支持货币千分位分隔符
- 验收标准:
- 支持逗号分隔符(,)
- 支持点分隔符(.)
- 支持空格分隔符( )
- 支持自定义分隔符
- 优先级:高
- 依赖关系:无
功能 4:自动选择格式
- 描述:根据用户地区偏好自动选择货币格式
- 验收标准:
- 根据用户地区偏好自动选择货币符号
- 根据用户地区偏好自动选择小数位
- 根据用户地区偏好自动选择千分位分隔符
- 格式选择准确无误
- 优先级:高
- 依赖关系:依赖用户语言偏好表
功能 5:自定义格式
- 描述:支持用户自定义货币格式
- 验收标准:
- 支持用户自定义货币符号
- 支持用户自定义小数位
- 支持用户自定义千分位分隔符
- 自定义格式立即生效
- 优先级:中
- 依赖关系:依赖用户语言偏好表
功能 6:多货币显示
- 描述:支持多货币显示和实时汇率转换
- 验收标准:
- 支持单一货币显示(例如:¥100.00)
- 支持多货币显示(例如:¥100.00 ($14.50, €13.20))
- 支持实时汇率转换
- 汇率数据准确可靠
- 汇率更新及时
- 优先级:高
- 依赖关系:依赖汇率数据表
功能 7:后端统一处理
- 描述:通过 AOP 在 Service 层统一处理货币格式化
- 验收标准:
- 使用 AOP 切面拦截 Service 方法返回值
- 自动识别 BigDecimal 类型字段
- 根据用户货币偏好自动格式化
- 支持多货币显示和汇率转换
- 格式化逻辑统一,避免重复代码
- 优先级:高
- 依赖关系:依赖 AOP 框架
非功能需求
性能需求
- 格式化时间:货币格式化时间 < 10ms
兼容性需求
- 浏览器兼容性:支持主流浏览器(Chrome、Firefox、Edge、Safari)
- 国际化库:使用成熟的国际化库(如:Intl.NumberFormat)
可维护性需求
- 代码可读性:代码符合项目编码规范,注释完整
- 测试覆盖率:单元测试覆盖率 ≥ 80%
数据需求
数据依赖
- 依赖用户表(sys_user),扩展 currency_code 字段
- 依赖汇率数据表(sys_exchange_rate)
- 依赖系统配置文件(application.yml)
数据流转需求
货币显示
└─ 读取用户货币偏好(currency_code)
└─ 读取系统默认货币配置
└─ 读取实时汇率数据
└─ Service 层 AOP 拦截返回值
└─ 识别 BigDecimal 类型字段
└─ 根据用户货币偏好和汇率进行格式化
└─ 支持单一货币或多货币显示
└─ 返回格式化后的货币数据
业务规则
- 货币偏好优先级:用户货币偏好(currency_code)优先于系统默认货币
- 格式化准确性:货币格式化必须准确无误
- 四舍五入:货币小数位四舍五入
- 自定义格式权限:所有用户都可以自定义货币格式
- 多货币显示规则:支持单一货币显示和多货币显示
- 汇率转换规则:根据实时汇率自动转换,汇率数据准确可靠
- AOP 处理规则:Service 层统一处理货币格式化,避免重复代码
技术约束
- Spring Boot 版本:3.5.7
- Java 版本:21
- 国际化库:java.text.DecimalFormat
- AOP 框架:Spring AOP
- 必须使用现有的认证授权机制:不能引入新的认证方式
- 数据类型:货币数据使用 BigDecimal 类型
成功标准
- 支持常用货币符号
- 支持小数位格式化
- 支持千分位分隔符
- 支持自动选择格式
- 支持自定义格式
- 支持多货币显示
- 支持实时汇率转换
- 货币格式化时间 < 10ms
- 单元测试覆盖率 ≥ 80%
- Service 层 AOP 统一处理货币格式化
风险评估
| 风险 | 影响程度 | 发生概率 | 缓解措施 |
|---|---|---|---|
| 货币格式化错误 | 中 | 低 | 使用成熟的国际化库,充分测试 |
| 汇率数据不准确 | 高 | 中 | 选择可靠的汇率数据源,定期验证汇率数据 |
| 汇率更新延迟 | 中 | 中 | 实现汇率自动更新机制,设置合理的更新频率 |
| AOP 拦截失败 | 中 | 低 | 充分测试 AOP 切面,添加异常处理机制 |
依赖关系
- 依赖用户表(sys_user),扩展 currency_code 字段
- 依赖汇率数据表(sys_exchange_rate)
- 依赖系统配置文件(application.yml)
- 依赖现有的 Spring Boot 框架
- 依赖现有的认证授权机制
- 依赖 AOP 框架(Spring AOP)
相关文档
- 父需求
- 设计文档 - 货币格式化技术方案设计
- 架构决策记录 - ADR-005: 货币格式化架构决策
- SQL 脚本 - 货币格式化 SQL 脚本
- 数据库结构说明 - 货币格式化数据库结构说明
- 提示词文档 - 货币格式化功能实现专用提示词
- 变更日志 - 货币格式化功能变更记录
- 复盘文档 - 货币格式化功能复盘文档
- API 文档 - 货币格式化功能 API 文档
最优方案说明
1. 货币偏好存储方案
选择方案:扩展 sys_user 表,添加 currency_code 字段
理由:
- 用户货币偏好是用户级别的配置,应该存储在用户表中
- 复用现有的用户表,避免创建额外的关联表
- 支持用户级别的货币偏好覆盖系统默认设置
- 与现有的 lang_code 字段保持一致,便于管理
2. 系统默认货币配置方案
选择方案:在配置文件中设置系统默认货币
理由:
- 系统默认货币是全局配置,适合在配置文件中设置
- 配置文件修改方便,不需要重启服务即可生效(使用 Spring Cloud Config)
- 便于不同环境(开发、测试、生产)配置不同的默认货币
- 与现有的系统配置保持一致
3. 货币格式化实现方案
选择方案:后端使用 java.text.DecimalFormat,通过 AOP 在 Service 层统一处理
理由:
- java.text.DecimalFormat 是 Java 内置的国际化库,成熟稳定
- 后端实现可以保证格式化逻辑的一致性
- 通过 AOP 在 Service 层统一处理,避免重复代码
- 支持自动识别 BigDecimal 类型字段,减少手动标注的工作量
- 与现有的时区国际化实现保持一致(使用 AOP)
4. 多货币显示方案
选择方案:支持多货币显示和实时汇率转换
理由:
- 多货币显示可以满足不同地区用户的需求
- 实时汇率转换可以保证货币数据的准确性
- 提升用户体验,用户可以选择自己熟悉的货币查看数据
- 支持单一货币和多货币显示两种模式,灵活适应不同场景
5. 汇率数据管理方案
选择方案:创建汇率数据表(sys_exchange_rate),支持实时汇率更新
理由:
- 汇率数据需要持久化存储,便于查询和审计
- 支持实时汇率更新,保证汇率数据的及时性
- 可以记录汇率历史数据,便于追溯和分析
- 支持多种汇率来源(央行、第三方 API)
6. 性能和安全性方案
选择方案:不考虑性能和安全性问题(根据用户要求)
理由:
- 用户明确表示不考虑性能和安全性问题
- 专注于功能实现,简化开发流程
- 后续可以根据实际需求进行优化
7. 数据类型方案
选择方案:货币数据使用 BigDecimal 类型
理由:
- BigDecimal 可以保证货币数据的精度
- 避免浮点数计算带来的精度问题
- 符合金融行业的最佳实践
- 与现有的货币数据处理保持一致