系統需求
首先,我們來講一下背景需求
現在需要做一個中港物流的系統,大致要實現一下功能:
- 從珠三角這邊收貨,錄單,需要上門提貨費、運費、報關費等等
- 然后運送到深圳報關,報關之后運送到香港倉庫
- 香港這邊派貨送貨,需要填寫停車費、過關費、路橋費、壓夜費、上樓費等等
眾所周知,香港那邊實行的是港幣制度,因此那邊填寫的是港幣,但是也不排除人民幣。在大陸這邊發貨,一般都是人民幣,當然,也有少部分是港幣,因為物流運輸過程有時是需要到付的。
系統分析
根據上述的需求分析,我們大致設計出如下的幾張重要的表:
- 運送單:編號、貨物名稱、日期、實收費用、提貨費、運費、報關費
- 派送單:編號(同運送單單號)、日期、停車費、過關費、路橋費、壓夜費、上樓費
這里我們省略了其中一些更為復雜的需求和設計,因為這里主要討論多幣種的實現。分析上面的兩張表,那么問題來了:
- 運送單中的運費有可能是港幣,因為如果是到付,香港人付的是港幣
- 派送單中的各個費用,基本是港幣,但是也不排除是人民幣。因為香港人有可能是付人民幣,也有可能因為是現付而在大陸給的是人民幣
- 對於系統的操作人員,在匯總以及列表顯示時,大陸的希望看到的整體都是人民幣;但是對於香港人,希望看到的是整體的都是港幣
- 匯率是天天都變的,但是在實際操作的過程中,系統的匯率變化會比實際的匯率慢一頭半個月,因為在匯率變化的過程中,也是有一些利潤可圖的。
- 每個單的實際匯率,也有可能是跟標准的匯率是有差別的,因為這里也有利潤可圖。
系統實現
我的實現是這樣的,雖然不是很優美,但是基本滿足了一些需求,不知各位大牛有什么好的設計可以推薦一下:
- 在派送單和運算單都增加兩個字段:幣種,匯率。其中費用字段存入的都是人民幣的價格。比如運費存儲的是100,則表示人民幣是100.另外還存儲當前的匯率,比如是港幣0.78,然后幣種字段存儲為港幣。那么我自然就知道該單就是客戶給的就是港幣,然后轉換為人民幣是100,港幣實際對應的是:128.2.
- 用一個表記錄最新的幣種和匯率。在錄入新的單時,系統自動用當前最新的匯率填入。
對應的ER圖為:
程序的實現如下:
存在的不足
- 如果在派送單中,既有港幣,又有人民幣,則無法處理了。比如派送費為人民幣,而其他的停車費、路橋費、上樓費等都是港幣。
- 如果我發現上個月1號的匯率是0.8的,而不是0.78,那么也無法統一修改所有設置該匯率的發貨單和派送單
改進的設計
一種改進的設計,我是這么考慮的:把幣種、日期保存下來,以幣種和日期生成唯一的Id,然后這個Id賦值給發貨單記錄和派送單記錄,這樣如果匯率錯誤時,就能夠修改到。
如果需要針對某個費用,則在該費用字段的基礎上,增加一個額外的字段,存儲這個“匯率幣種”的Id
但是這個方法,又會引入一個問題:如何針對每一個單來修改當前的匯率呢?
你會怎么做?
如果你有想法,或者有更好的建議,請在評論中回復,大家一起討論改進。