实践开发:老系统新增字段我是如何用枚举优雅兼容历史数据的

背景:

最近在给一个 CRM 系统做升级,新增了一个字段:发票方向(invoiceDirection)。

一开始系统里的发票没区分红冲还是正常,只有一个字段:发票金额。

后来有红冲场景了,我那就简单的说一下红冲:

红冲 = 用一张「负数发票」来冲销一张已经开的正数发票,红冲是财务概念,这里不展开,知道它会导致金额为负就够了。

  • 正常开票

  • 红冲发票(简单理解为:用负数金额冲销原发票)

方案设计:

我最开始的方案(两行代码解决)

我当时的方案非常简单:

  • 金额 > 0:绿色

  • 金额 < 0:红色

前端区分一下展示就行了,两行代码就解决了。

老数据 0 影响,后端 0 改表

说实话,这个方案:简单、直接、完全够用。

if (column.property === 'invoiceMoney') {

const money = Number(row.invoiceMoney || 0)

return money > 0 ? 'xr-money green' : money === 0 ? 'xr-money gray' : 'xr-money red'

}

我到现在也觉得:在这个场景下,其实是 OK 的可能是我经验不足吧。

老大的原话大概意思是:

"颜色只是展示,必须加个字段必须明确区分是不是红冲。加字段。"这不是增加复杂度吗......

但没办法,谁让人家是老大呢 而且你还真不好反驳。

遇到的问题:

字段已经确定要加了,那真正的问题变成:

  • 这是一个 新增字段

  • 历史数据已经存在

  • 不可能全表 update

  • 也不能随便给默认值

如果处理不好,比不加还麻烦

最终方案:我用到了枚举了+兜底处理来处理就数据

  1. 用枚举定义业务边界:

  2. 读数据:不信任数据库,必须兜底

  3. 写数据:通过金额统一推导方向

这样做的好处:用枚举把"发票方向"的业务含义和判断规则集中管理,同时通过兜底逻辑兼容历史数据,避免魔法值扩散,让老系统升级更安全、更可维护。

最后我们在查询的时候做个兜底处理,因为老数据新的字段都是null 就根据发票金额做个兜底是正常开票还是红冲。

private void fillInvoiceDirectionIfAbsent(Map<String, Object> row) {

// 新字段已有值,直接使用

if (row.get("invoiceDirection") != null) {

return;

}

BigDecimal money = Convert.toBigDecimal(row.get("invoiceMoney"), BigDecimal.ZERO);

int direction = InvoiceDirectionEnum.fromMoney(money);

row.put("invoiceDirection", direction);

}

实现的结果:

结语:

这个字段本身,是不是一定非加不可?说实话,我现在依然觉得:不一定。用金额正负 + 前端颜色,

在当时的业务复杂度下,完全可以跑得通。但现实开发里经常是这样:

  • 需求不一定最优

  • 但你得让系统稳住

  • 让历史数据不受影响

  • 让后面接手的人少踩坑

所以最终选择了:

  • 用枚举把业务含义说清楚

  • 用兜底逻辑兼容老数据。

相关推荐
chde2Wang2 小时前
hadoop部署错误-namenode address dfs.namenode.servicerpc-address not configured
java·大数据·hadoop
牛战士coding2 小时前
Java 对象写入 Redis 后类型变了?Jackson 多态序列化问题复盘
java·开发语言·redis
小白的码BUG之路2 小时前
Jenkins -- 配置jdk和maven
java·jenkins·maven
xiaoqiMikko2 小时前
Redis 实战(基础篇):把一个老 RedisUtil 搬到 Spring Boot 4,一路踩出来的坑(真机实测)
java·spring boot·redis
yuniko-n3 小时前
【JUC】读写锁
java·开发语言
yuzhiboyouye3 小时前
后端怎么评估工作量
java
java资料站3 小时前
十五、Spring AI Alibaba · 高级 ·Graph
java·人工智能·spring
金銀銅鐵3 小时前
[Java] 用 GUI 展示 ArrayList 扩容的过程
java·后端·ai编程
磊 子3 小时前
什么是虚假唤醒(spurious wakeup)?从 POSIX 标准讲到 futex 内核
java·开发语言
飘然生3 小时前
traceId链路 skywalking java agent
java·开发语言·skywalking