1.立项背景和目标:外交部签证业务覆盖全球 120 + 国家 / 地区,原系统存在多币种收费精度丢失、汇率实时转换困难、跨国收费统计效率低等问题。需构建支持多币种精准计算、实时汇率对接、高效跨国数据统计的核心财务模块,保障签证收费准确性与可追溯性,支撑日均 2 万 + 签证申请的收费处理。
2.软件功能、核心功能模块的介绍:系统核心模块包括多币种收费计算模块(支持 15 + 币种的签证费精确计算)、实时汇率对接与快照模块(对接国家外汇管理局 API,缓存并固化用户申请时的汇率)、跨国收费统计与报表模块(按地区、币种、时间维度生成多维度统计报表)。
3.业务流程、功能路径描述:用户提交签证申请→系统调用汇率接口获取实时汇率并生成 “汇率快照”→多币种收费计算模块按快照汇率计算应收费用→用户完成缴费→收费数据写入数据库→统计模块按 “地区 / 币种 / 月份” 规则异步生成汇总报表,供财务审计与决策使用。
1.整体架构和设计思路,不同模块使用的技术栈:采用 Spring Boot 微服务架构,拆分 “汇率服务”“收费计算服务”“统计服务” 3 个独立模块;汇率服务通过定时任务 + Redis 缓存国家外汇管理局 API 实时汇率(超时 30 秒);收费计算服务全链路用 BigDecimal 确保精度,封装AmountUtil工具类统一规则;统计服务基于 MySQL“地区 + 年份” 分表设计,配合 MyBatis 动态 SQL 实现多维度查询。
2.我的负责模块和结果(尽可能量化):主导多币种收费计算与实时汇率快照模块开发。多币种计算通过 BigDecimal 替代 double,实现金额精度偏差为 0;汇率快照模块支撑日均 2 万 + 申请的汇率固化,转换准确率 100%;整体模块上线后,跨国收费统计效率提升 60%(从 500ms / 次降至 200ms / 次)。
3. 我遇到的难点、坑,和解决方案:
难点 1:多币种累加精度丢失(如美元、欧元混合计算偏差)。
解决方案:全链路禁用 double/float,封装AmountUtil工具类,强制调用并固定setScale(2, BigDecimal.ROUND_HALF_UP)精度规则,单元测试覆盖所有币种计算场景。
难点 2:汇率波动导致统计偏差。
解决方案:设计 “汇率快照” 机制,用户申请时从 Redis 获取汇率并序列化存储到订单表,后续统计、对账均基于该快照,隔离汇率波动影响。
难点 3:跨国多维度统计查询效率低(单表 2000 万 + 数据,查询 500ms+)。
解决方案:对 MySQL 收费表按 “地区编码 + 年份” 分表,为高频统计字段创建复合索引,结合 MyBatis 动态 SQL,将核心查询响应压降至 200ms 内。