如何才能设计出一个优美的多币种系统?

系统需求

首先,我们来讲一下背景需求

现在需要做一个中港物流的系统,大致要实现一下功能:

  • 从珠三角这边收货,录单,需要上门提货费、运费、报关费等等
  • 然后运送到深圳报关,报关之后运送到香港仓库
  • 香港这边派货送货,需要填写停车费、过关费、路桥费、压夜费、上楼费等等

众所周知,香港那边实行的是港币制度,因此那边填写的是港币,但是也不排除人民币。在大陆这边发货,一般都是人民币,当然,也有少部分是港币,因为物流运输过程有时是需要到付的。

系统分析

根据上述的需求分析,我们大致设计出如下的几张重要的表:

  • 运送单:编号、货物名称、日期、实收费用、提货费、运费、报关费
  • 派送单:编号(同运送单单号)、日期、停车费、过关费、路桥费、压夜费、上楼费

这里我们省略了其中一些更为复杂的需求和设计,因为这里主要讨论多币种的实现。分析上面的两张表,那么问题来了

  1. 运送单中的运费有可能是港币,因为如果是到付,香港人付的是港币
  2. 派送单中的各个费用,基本是港币,但是也不排除是人民币。因为香港人有可能是付人民币,也有可能因为是现付而在大陆给的是人民币
  3. 对于系统的操作人员,在汇总以及列表显示时,大陆的希望看到的整体都是人民币;但是对于香港人,希望看到的是整体的都是港币
  4. 汇率是天天都变的,但是在实际操作的过程中,系统的汇率变化会比实际的汇率慢一头半个月,因为在汇率变化的过程中,也是有一些利润可图的。
  5. 每个单的实际汇率,也有可能是跟标准的汇率是有差别的,因为这里也有利润可图。

系统实现

我的实现是这样的,虽然不是很优美,但是基本满足了一些需求,不知各位大牛有什么好的设计可以推荐一下:

  • 在派送单和运算单都增加两个字段:币种,汇率。其中费用字段存入的都是人民币的价格。比如运费存储的是100,则表示人民币是100.另外还存储当前的汇率,比如是港币0.78,然后币种字段存储为港币。那么我自然就知道该单就是客户给的就是港币,然后转换为人民币是100,港币实际对应的是:128.2.
  • 用一个表记录最新的币种和汇率。在录入新的单时,系统自动用当前最新的汇率填入。

对应的ER图为:

币种设计ER图

程序的实现如下:

存在的不足

  • 如果在派送单中,既有港币,又有人民币,则无法处理了。比如派送费为人民币,而其他的停车费、路桥费、上楼费等都是港币。
  • 如果我发现上个月1号的汇率是0.8的,而不是0.78,那么也无法统一修改所有设置该汇率的发货单和派送单

改进的设计

一种改进的设计,我是这么考虑的:把币种、日期保存下来,以币种和日期生成唯一的Id,然后这个Id赋值给发货单记录和派送单记录,这样如果汇率错误时,就能够修改到。

如果需要针对某个费用,则在该费用字段的基础上,增加一个额外的字段,存储这个“汇率币种”的Id

但是这个方法,又会引入一个问题:如何针对每一个单来修改当前的汇率呢?

你会怎么做?

如果你有想法,或者有更好的建议,请在评论中回复,大家一起讨论改进。

原文地址:https://www.cnblogs.com/marvin/p/howToDesignAGracefulMultiCurrencySystem.html