大數(shù)據(jù)、云計(jì)算、分布式存儲(chǔ)系統(tǒng)、區(qū)塊鏈等新技術(shù)的提出,不斷創(chuàng)造出獨(dú)特的新互聯(lián)網(wǎng)模式,同時(shí)也向人們展示了去中心化分散基礎(chǔ)設(shè)施建立的模型?;诙嘣默F(xiàn)代倉(cāng)儲(chǔ)系統(tǒng)也逐漸得到研究與重視,現(xiàn)代化的倉(cāng)儲(chǔ)區(qū)域規(guī)劃與管理的智能化程度直接影響倉(cāng)儲(chǔ)作業(yè)效率和儲(chǔ)存能力[1],這些現(xiàn)象在帶來(lái)海量數(shù)據(jù)頻繁存取問(wèn)題[2]的同時(shí),隨著倉(cāng)儲(chǔ)企業(yè)規(guī)模的不斷擴(kuò)大,也出現(xiàn)了物資可能會(huì)存放于不同部門(mén)、不同地域,尤其是多層級(jí)倉(cāng)庫(kù)的貨品管理及各組織的倉(cāng)庫(kù)資源賬目不能及時(shí)掌控庫(kù)存的情況,導(dǎo)致產(chǎn)生大量繁瑣數(shù)據(jù)、數(shù)據(jù)不統(tǒng)一、無(wú)法及時(shí)統(tǒng)計(jì)分析,造成倉(cāng)儲(chǔ)企業(yè)管理效率低下的現(xiàn)象[3]。為了實(shí)現(xiàn)高效、智能化的企業(yè)倉(cāng)庫(kù)管理,許多學(xué)者針對(duì)智能化倉(cāng)儲(chǔ)管理系統(tǒng)應(yīng)用進(jìn)行了深入研究[4]。復(fù)旦大學(xué)的許嘉勛提出了一種基于云數(shù)據(jù)庫(kù)的企業(yè)資產(chǎn)管理,并以MongoDB數(shù)據(jù)庫(kù)為例,分析了MongoDB數(shù)據(jù)庫(kù)建模的可行性,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于MongoDB數(shù)據(jù)庫(kù)的高可靠、高擴(kuò)展的分布式企業(yè)資產(chǎn)管理系統(tǒng)[5]。
在基于Web的架構(gòu)中,數(shù)據(jù)庫(kù)難以實(shí)現(xiàn)橫向擴(kuò)展[6],非關(guān)系數(shù)據(jù)庫(kù)中利用查詢(xún)語(yǔ)言對(duì)數(shù)據(jù)進(jìn)行查詢(xún)沒(méi)有行的概念,數(shù)據(jù)在存儲(chǔ)的時(shí)候沒(méi)有固定的鍵值模式,一般都是通過(guò)文檔的形式進(jìn)行存儲(chǔ)[7]。朱愛(ài)華等針對(duì)經(jīng)典的倉(cāng)儲(chǔ)信息服務(wù)系統(tǒng)大都使用關(guān)系型數(shù)據(jù)庫(kù),結(jié)合前端交互技術(shù)以及非關(guān)系型數(shù)據(jù)庫(kù)MongoDB來(lái)搭建Web服務(wù),并通過(guò)性能測(cè)試證明了該架構(gòu)比傳統(tǒng)的數(shù)據(jù)庫(kù)操作在處理速度和資源占用上具有更好的性能優(yōu)勢(shì)[8]。文獻(xiàn)[9]也證明了在非關(guān)系型數(shù)據(jù)庫(kù)NoSQL中引入Web的架構(gòu)系統(tǒng),可以利用NoSQL優(yōu)勢(shì)來(lái)彌補(bǔ)關(guān)系型數(shù)據(jù)庫(kù)的不足。
該文在充分研究分析非關(guān)系型數(shù)據(jù)庫(kù)MongoDB在分布式存儲(chǔ)方面的特性,利用前端開(kāi)源框架Angular設(shè)計(jì)實(shí)現(xiàn)軟件邏輯操作功能;通過(guò)將Angular與RFID技術(shù)融合設(shè)計(jì)實(shí)現(xiàn)一種分布式智能倉(cāng)儲(chǔ)管理系統(tǒng),并利用基于MongoDB云數(shù)據(jù)庫(kù)的高可用性構(gòu)架特性將倉(cāng)儲(chǔ)企業(yè)的各分支機(jī)構(gòu)的數(shù)據(jù)存儲(chǔ)系統(tǒng)整合起來(lái)建立一個(gè)私有云,解決對(duì)異地分布的倉(cāng)儲(chǔ)的物資、設(shè)備容量不斷擴(kuò)容的需求與倉(cāng)儲(chǔ)管理運(yùn)營(yíng)成本之間的矛盾,旨在為多站點(diǎn)多倉(cāng)庫(kù)共享數(shù)據(jù)的倉(cāng)儲(chǔ)系統(tǒng)Web管理應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
針對(duì)建立數(shù)據(jù)倉(cāng)庫(kù)時(shí)存在的系統(tǒng)需求不斷變化、語(yǔ)義斷層以及數(shù)據(jù)倉(cāng)庫(kù)改動(dòng)難、代價(jià)大等問(wèn)題,建立數(shù)據(jù)倉(cāng)庫(kù)采用分層架構(gòu)是一種很常見(jiàn)的模式,也叫N層架構(gòu)[10]。該文提出一種4層數(shù)據(jù)倉(cāng)庫(kù)體系結(jié)構(gòu)模型,包括表述層、控制層、業(yè)務(wù)邏輯層、數(shù)據(jù)庫(kù)物理層。系統(tǒng)分層結(jié)構(gòu)示意參見(jiàn)圖1。
建立系統(tǒng)云架構(gòu),首先要解決的就是需對(duì)大量分散的數(shù)據(jù)進(jìn)行分區(qū)存儲(chǔ)的問(wèn)題,即將數(shù)據(jù)拆分并分散儲(chǔ)存在不同的服務(wù)器上。
該文利用MongoDB能夠支持?jǐn)?shù)據(jù)自動(dòng)分區(qū)的特性,將數(shù)據(jù)庫(kù)中的數(shù)據(jù)按相關(guān)屬性劃分成若干數(shù)據(jù)組,并將這些數(shù)據(jù)組分散到若干較大的分區(qū)中,每個(gè)分區(qū)負(fù)責(zé)總數(shù)據(jù)的一部分。系統(tǒng)主控程序中在對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)分區(qū)之前先建立兩個(gè)路由進(jìn)程,一個(gè)是用于對(duì)多個(gè)分區(qū)的數(shù)據(jù)庫(kù)進(jìn)行路由探測(cè)并提出連接申請(qǐng)的進(jìn)程Mongo_sq;另一個(gè)是用于系統(tǒng)在沒(méi)有數(shù)據(jù)分區(qū)(隱藏?cái)?shù)據(jù)分區(qū)的細(xì)節(jié))的時(shí)候提供給客戶(hù)端連接路由的進(jìn)程Mongo_pt,可以實(shí)現(xiàn)在不修改系統(tǒng)程序的情況下對(duì)系統(tǒng)分布的節(jié)點(diǎn)進(jìn)行增加或刪減。
具體的做法是在對(duì)系統(tǒng)進(jìn)行數(shù)據(jù)分區(qū)時(shí),從數(shù)據(jù)屬性集選擇某個(gè)具有代表性的字段作為一個(gè)共享“鍵”(Shard key),該“鍵”的鍵值即作為數(shù)據(jù)分區(qū)的主要依據(jù),并對(duì)這些鍵進(jìn)行編號(hào)(如Shardkey_01,Shardkey_02,……)。如可以使用“倉(cāng)庫(kù)ID”來(lái)定義各倉(cāng)庫(kù)、產(chǎn)品存儲(chǔ)位置、庫(kù)位設(shè)置等數(shù)據(jù)庫(kù)或數(shù)據(jù)表的共享“鍵”,在此基礎(chǔ)上建立不同數(shù)據(jù)的分區(qū),并存放于不同的服務(wù)器或本地計(jì)算機(jī)上,當(dāng)系統(tǒng)查詢(xún)“倉(cāng)庫(kù)ID”如果是屬于“物資庫(kù)存管理”時(shí)即直接將該共享“鍵”有針對(duì)性地發(fā)送到“物資庫(kù)存管理”數(shù)據(jù)分區(qū)所在的服務(wù)器或本地計(jì)算機(jī)上,同樣,如果RFIDI設(shè)備掃描到的產(chǎn)品隸屬于某個(gè)倉(cāng)庫(kù),就直接將該產(chǎn)口的相關(guān)信息發(fā)送到對(duì)應(yīng)的分區(qū)數(shù)據(jù)庫(kù)中。
云數(shù)據(jù)庫(kù)系統(tǒng)用例(包括普通用戶(hù)和管理員用戶(hù))參見(jiàn)圖2。
普通管理員可以按照一定的需求條件申請(qǐng)所需的云數(shù)據(jù)庫(kù)(如果是企業(yè)外的用戶(hù)需繳納一定的費(fèi)用才能獲得),通過(guò)系統(tǒng)自動(dòng)分配成功后,提供給相應(yīng)的普通管理用戶(hù)對(duì)相應(yīng)云數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的地址、端口及數(shù)據(jù)庫(kù)名稱(chēng)等信息;相應(yīng)地,如果普通管理員放棄對(duì)該數(shù)據(jù)庫(kù)的使用權(quán),系統(tǒng)會(huì)根據(jù)自動(dòng)對(duì)相關(guān)數(shù)據(jù)進(jìn)行處理后回收該云數(shù)據(jù)庫(kù)所占用資源。
超級(jí)管理員通過(guò)硬件設(shè)備的管理功能子模塊、對(duì)普通管理員的管理子模塊以及對(duì)云數(shù)據(jù)庫(kù)的管理操作等對(duì)云數(shù)據(jù)庫(kù)進(jìn)行訪(fǎng)問(wèn),包括設(shè)置綁定終端節(jié)點(diǎn)的ip地址,使得僅被綁定的ip才有權(quán)訪(fǎng)問(wèn)選定云數(shù)據(jù)庫(kù)、為普通管理員用戶(hù)設(shè)定初始化的用戶(hù)名、登錄條件及啟/停云數(shù)據(jù)庫(kù)服務(wù)等功能。普通管理員對(duì)云數(shù)據(jù)庫(kù)的操作功能則主要包括通過(guò)啟/停云數(shù)據(jù)庫(kù)、更改用戶(hù)信息、變更數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)權(quán)限、日常功能維護(hù)以及通過(guò)倉(cāng)庫(kù)管理系統(tǒng)對(duì)商品的信息采集與管理等功能模塊對(duì)云數(shù)據(jù)庫(kù)進(jìn)行訪(fǎng)問(wèn)。
系統(tǒng)高可用性架構(gòu)(Replica Set)是MongoDB系統(tǒng)為了構(gòu)建具有自動(dòng)容錯(cuò)及恢復(fù)功能的一項(xiàng)非常實(shí)用的高可用性方案[11]。該文提及的系統(tǒng)設(shè)計(jì)建立的基礎(chǔ)思想是,將一些位于同一地點(diǎn)或不同地點(diǎn)的服務(wù)器集合起來(lái)建立業(yè)務(wù)服務(wù)器云,數(shù)據(jù)庫(kù)層采用分布式的物理結(jié)構(gòu)進(jìn)行云架構(gòu),系統(tǒng)云架構(gòu)示意參見(jiàn)圖3。
系統(tǒng)依據(jù)數(shù)據(jù)庫(kù)的規(guī)模設(shè)定一個(gè)或多個(gè)數(shù)據(jù)分區(qū)并配置相應(yīng)的能夠表明數(shù)據(jù)位于哪個(gè)分區(qū)的共享數(shù)據(jù)元素“鍵”的拷貝,這樣就構(gòu)成了一個(gè)Replica Set節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可進(jìn)一步分為一個(gè)或多個(gè)子節(jié)點(diǎn),但每個(gè)節(jié)點(diǎn)須持有相同數(shù)據(jù)的拷貝。同時(shí),還需定義主從節(jié)點(diǎn),即一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn),其他為從節(jié)點(diǎn),且這些節(jié)點(diǎn)均需具有系統(tǒng)重構(gòu)功能,即如果主節(jié)點(diǎn)出現(xiàn)故障,可選擇一個(gè)從節(jié)點(diǎn)自動(dòng)承擔(dān)主節(jié)點(diǎn)的工作。
每個(gè)節(jié)點(diǎn)服務(wù)器需配置—個(gè)或多個(gè)路由器提出連接申請(qǐng)的進(jìn)程Mongo_sq路由器提供給客戶(hù)端路由申請(qǐng)服務(wù),并將請(qǐng)求分發(fā)到相應(yīng)的數(shù)據(jù)分區(qū)服務(wù)器上。分區(qū)服務(wù)器配置內(nèi)容主要包括服務(wù)器名稱(chēng)、IP地址、端口三個(gè)方面。
其中端口配置的內(nèi)容比較復(fù)雜,主要應(yīng)包括:
(1)整個(gè)系統(tǒng)所有分區(qū)共享“鍵”(Shard key)訪(fǎng)問(wèn)端口的分配(各個(gè)“鍵”可分配同一端口),該“鍵”的鍵值即作為數(shù)據(jù)分區(qū)的主要依據(jù),并對(duì)這些鍵進(jìn)行編號(hào)(如Shardkey_01,Shardkey_02,……);
(2)用于訪(fǎng)問(wèn)沒(méi)有數(shù)據(jù)分區(qū)的時(shí)候提供給客戶(hù)端連接路由的Mongo_pt端口;
(3)用于對(duì)多個(gè)分區(qū)的數(shù)據(jù)庫(kù)進(jìn)行路由探測(cè)并提出連接申請(qǐng)的進(jìn)程Mongo_sq;
(4)服務(wù)器配置詳細(xì)過(guò)程就不贅述。
對(duì)MongoDB數(shù)據(jù)庫(kù)操作必然會(huì)存在對(duì)各節(jié)點(diǎn)的文檔訪(fǎng)問(wèn)操作的均衡性問(wèn)題,而且須對(duì)這個(gè)均衡問(wèn)題進(jìn)行協(xié)調(diào)控制,否則系統(tǒng)很容易因?yàn)閷?duì)某個(gè)節(jié)點(diǎn)文檔的高密度訪(fǎng)問(wèn)而造成數(shù)據(jù)擁堵問(wèn)題。
利用文獻(xiàn)[12]提出的基于數(shù)據(jù)操作的頻率(FODO)改進(jìn)的均衡算法設(shè)計(jì),以解決對(duì)數(shù)據(jù)庫(kù)操作的均衡問(wèn)題,算法可描述如下:
(1)初始化。
設(shè)集群有p個(gè)節(jié)點(diǎn),有d個(gè)文檔塊被集合在一起形成由MongoDB自動(dòng)分隔的集群文檔;
(2)定義變量。
Int i=1,2,…,n;
Int Bi,Oi,Ii,Fi,Ci,DOi,DOi,λ;
Int SUM_DOi,SUM(SUM_DO);
//Bi是文檔塊數(shù),Oi、Ii、Fi、Ci分別存放對(duì)文檔塊的操作頻率、插入操作頻率、查詢(xún)操作頻率和更改操作頻率;DOi表示每個(gè)節(jié)點(diǎn)中文檔塊數(shù)據(jù)某個(gè)操作的頻率;SUM_DOi存放每個(gè)節(jié)點(diǎn)中所有文檔塊數(shù)據(jù)的所有操作頻率之和;λ表示調(diào)節(jié)負(fù)載均衡過(guò)程中分配各節(jié)點(diǎn)各文檔塊數(shù)據(jù)操作的比重參數(shù),SUM(SUM_DO)存放整個(gè)集群分區(qū)各個(gè)節(jié)點(diǎn)中數(shù)據(jù)操作頻率之和[13]。
(3)計(jì)算各節(jié)點(diǎn)各文檔塊數(shù)據(jù)操作頻率。
DOi=Oi∑i=1nOiDΟi=Οi∑i=1nΟi
(4)計(jì)算各節(jié)點(diǎn)各文檔塊數(shù)據(jù)所有操作頻率。
SUM_DOi=Ii∑i=1nIi+Fi∑i=1nFi+Ci∑i=1nCiSUΜ_DΟi=Ιi∑i=1nΙi+Fi∑i=1nFi+Ci∑i=1nCi
(5)計(jì)算帶有均衡修正系數(shù)λ(λ>1)的各節(jié)點(diǎn)各文檔塊數(shù)據(jù)所有操作頻率之和。
SUM_DOi=λIi∑i=1nIi+Fi∑i=1nFi+Ci∑i=1nCiSUΜ_DΟi=λΙi∑i=1nΙi+Fi∑i=1nFi+Ci∑i=1nCi
(6)計(jì)算整個(gè)分區(qū)的操作頻率可以用每個(gè)節(jié)點(diǎn)中所有文檔數(shù)據(jù)的操作頻率之和。
SUM(SUM_DO)=∑i=1nBi(SUM_DOi)_DΟ)=∑i=1nBi(SUΜ_DΟi)
其中λ是為了調(diào)整插入操作與查找、修改操作的均衡關(guān)系參數(shù)。由于MongoDB對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)與修改時(shí)會(huì)對(duì)前一次查詢(xún)過(guò)或修改過(guò)的數(shù)據(jù)進(jìn)行記憶并將其保存到緩存中,當(dāng)下一次需對(duì)這些訪(fǎng)問(wèn)過(guò)的數(shù)據(jù)查詢(xún)或修改時(shí)相當(dāng)于訪(fǎng)問(wèn)的是本地緩存的數(shù)據(jù);MongoDB對(duì)每個(gè)分區(qū)的操作會(huì)提供一個(gè)包含分別承擔(dān)數(shù)據(jù)的寫(xiě)、讀負(fù)載的primary和secondary兩個(gè)節(jié)點(diǎn)的replica set,使數(shù)據(jù)最大限度被利用。因此,MongoDB系統(tǒng)對(duì)數(shù)據(jù)插入操作負(fù)載的影響要比讀和寫(xiě)操作負(fù)載的影響要大得多,尤其是每當(dāng)在進(jìn)行插入數(shù)據(jù)操作時(shí),每一個(gè)數(shù)據(jù)塊所在的節(jié)點(diǎn)中的數(shù)據(jù)信息均會(huì)造成負(fù)載不均衡,而當(dāng)不均衡的數(shù)據(jù)量達(dá)到一定程度時(shí),系統(tǒng)的數(shù)據(jù)遷移閾值會(huì)觸發(fā)啟動(dòng),對(duì)不均衡的現(xiàn)象進(jìn)行調(diào)節(jié),在這個(gè)過(guò)程中,系統(tǒng)資源被極大地浪費(fèi)[14]。因此,為平衡插入與讀寫(xiě)操作的比重,在計(jì)算插入操作頻率中增加一個(gè)系數(shù)調(diào)節(jié)參數(shù)λ(λ>1)[15],確保節(jié)點(diǎn)負(fù)載的均衡。
系統(tǒng)主要由統(tǒng)計(jì)分析、庫(kù)存管理、記錄查詢(xún)、產(chǎn)品管理、RFID讀頭管理、倉(cāng)庫(kù)管理、系統(tǒng)設(shè)置七大部分組成。系統(tǒng)通過(guò)B/S(Browser/Server)結(jié)構(gòu)進(jìn)行布置,物料或貨品的基礎(chǔ)數(shù)據(jù)和系統(tǒng)對(duì)數(shù)據(jù)進(jìn)行管理的程序可分別運(yùn)行于不同的服務(wù)器,系統(tǒng)終端的控制程序可以同時(shí)運(yùn)行于不同的微機(jī)上。
用戶(hù)對(duì)近期出庫(kù)入庫(kù)趨勢(shì)及流動(dòng)物資總量有一個(gè)直接的了解,如庫(kù)存總量、入庫(kù)總量、出庫(kù)總量;
包括物資出庫(kù)、入庫(kù)、調(diào)撥、移庫(kù)、報(bào)損、盤(pán)點(diǎn)等功能;
針對(duì)物資操作后的記錄進(jìn)行查詢(xún),通過(guò)不同的搜索條件聚合查詢(xún),快速準(zhǔn)確地定位到用戶(hù)需要的記錄信息;
主要對(duì)批量標(biāo)簽綁定商品的管理,設(shè)置了產(chǎn)品型號(hào)管理和商品添加功能,可以實(shí)現(xiàn)對(duì)單獨(dú)一個(gè)型號(hào)的產(chǎn)品管理;
依據(jù)不同環(huán)境下對(duì)不同的讀著性能進(jìn)行調(diào)整設(shè)置;
每個(gè)倉(cāng)庫(kù)中包含了多個(gè)門(mén),門(mén)與讀頭屬于對(duì)應(yīng)關(guān)系,以表明其出庫(kù)還是入庫(kù)屬性,倉(cāng)庫(kù)內(nèi)也有很多個(gè)庫(kù)位,庫(kù)位也包含了庫(kù)位容量、庫(kù)位屬性等屬性的設(shè)置、修改與綁定等功能;
超級(jí)管理員才有操作權(quán)限,可以添加普通管理員,修改賬號(hào)信息等。
頂層數(shù)據(jù)流主要描述管理員之間的角色數(shù)據(jù)關(guān)系,不同角色對(duì)應(yīng)操作不同功能模塊,并將操作結(jié)果數(shù)據(jù)存儲(chǔ)到云端數(shù)據(jù)庫(kù)。管理員之間的數(shù)據(jù)流(頂層)參見(jiàn)圖4所示。
描述不同管理員與對(duì)應(yīng)功能模塊的數(shù)據(jù)流向關(guān)系。超級(jí)管理員無(wú)權(quán)限限制,包括硬件信息管理、出庫(kù)、入庫(kù)、調(diào)撥、移庫(kù)、報(bào)損、盤(pán)點(diǎn)操作及記錄查詢(xún)、庫(kù)存查詢(xún)、對(duì)產(chǎn)品產(chǎn)品類(lèi)型的定義、添加商品等功能。而普通管理員主要針對(duì)邏輯操作及查詢(xún)功能,沒(méi)有進(jìn)行硬件信息管理的權(quán)限。管理員與對(duì)應(yīng)功能模塊的數(shù)據(jù)流(第二層)參見(jiàn)圖5。
數(shù)據(jù)庫(kù)的設(shè)計(jì)充分考慮業(yè)務(wù)場(chǎng)景、數(shù)據(jù)讀寫(xiě)頻率、安全一致性等方面的需求,以及主節(jié)點(diǎn)服務(wù)器出現(xiàn)系統(tǒng)崩潰后能夠迅速切換到其他節(jié)點(diǎn),采用MongoDB分布式副本集架構(gòu)為基礎(chǔ),共設(shè)計(jì)了6張表:用戶(hù)信息表、倉(cāng)庫(kù)表、商品信息表、倉(cāng)庫(kù)門(mén)信息表、倉(cāng)庫(kù)位信息表、商品庫(kù)存表。
用戶(hù)名、用戶(hù)密碼、用戶(hù)ID、用戶(hù)角色、用戶(hù)郵箱;
倉(cāng)庫(kù)ID、倉(cāng)庫(kù)名稱(chēng)、管理員、倉(cāng)庫(kù)地址、屬性;
商品序列號(hào)、編號(hào)、名稱(chēng)、生產(chǎn)日期、商品EPC碼、商品NFC碼、型號(hào)、類(lèi)別、圖片地址;
門(mén)ID、名稱(chēng)、類(lèi)型,庫(kù)位ID、庫(kù)位名稱(chēng)、庫(kù)位規(guī)模;
所屬倉(cāng)庫(kù)、倉(cāng)庫(kù)位ID、管理員、倉(cāng)庫(kù)地址、倉(cāng)庫(kù)位規(guī)模、當(dāng)前存放量;
商品序列號(hào)、編號(hào)、名稱(chēng)、入庫(kù)時(shí)間、商品EPC碼、商品NFC碼、型號(hào)、類(lèi)別,倉(cāng)庫(kù)編號(hào)、倉(cāng)庫(kù)名稱(chēng)、庫(kù)位編號(hào)、庫(kù)位名稱(chēng)等。
前端使用Angular封裝的httpClient模塊,在ng-alain中又被封裝成更為便捷的httpClient方法,可以很方便地自動(dòng)添加請(qǐng)求頭并處理返回的對(duì)應(yīng)的數(shù)據(jù)格式,其實(shí)質(zhì)上仍然還是使用http方法請(qǐng)求數(shù)據(jù),返回的數(shù)據(jù)用rxjs中的observable訂閱處理。該文的數(shù)據(jù)接口用postman軟件進(jìn)行梳理和測(cè)試、調(diào)試,最后將所有項(xiàng)目打包部署在服務(wù)器上。為了數(shù)據(jù)安全,運(yùn)行中的數(shù)據(jù)請(qǐng)求應(yīng)用改為https請(qǐng)求。
著重介紹登錄,RFID讀頭管理,庫(kù)存管理中的入庫(kù)、出庫(kù)、調(diào)撥、移庫(kù)、報(bào)損、盤(pán)點(diǎn),并以登錄功能實(shí)現(xiàn)主要代碼及登錄主界面、RFID讀頭管理主界面截圖(其他模塊的界面圖略)為例。
登錄模塊主要是在用戶(hù)輸入時(shí)進(jìn)行了表單驗(yàn)證和登錄失敗時(shí)提示信息,并且在登錄成功后顯示用戶(hù)頭像、用戶(hù)郵箱等信息。在Session Storage中存儲(chǔ)用戶(hù)角色以及攜帶的Token,Token精度設(shè)置在秒,有效期為兩個(gè)小時(shí)。用戶(hù)登錄主界面參見(jiàn)圖6,實(shí)現(xiàn)代碼可簡(jiǎn)單表述如下(其他功能模塊的實(shí)現(xiàn)代碼詳略)。
//清空路由復(fù)用信息
this.reuseTabService.clear(); //設(shè)置用戶(hù)Token信息
this.tokenService.set(res);
//重新獲取StartupService內(nèi)容,信息一般都會(huì)受當(dāng)前用戶(hù)授權(quán)范圍而影響
const user={
name:res.name,//avatar:res.avatar,avatar:'./assets/tmp/img/avatar.jpg',userId:res.id,
};
this.settingsService.setUser(user);this.startupSrv.load().then(()=>{let url=this.tokenService.referrer.url||'/';
if (url.includes('/passport')) url='/';
this.router.navigateByUrl(url);
});
}
讀頭設(shè)置需要先獲取模式等相關(guān)硬件參數(shù),包括讀寫(xiě)器硬件屬性信息、射頻輸出功率、天線(xiàn)、蜂鳴器、標(biāo)簽過(guò)濾規(guī)則等,可依據(jù)不同的場(chǎng)景的需要調(diào)整讀頭配置。讀頭詳細(xì)功能設(shè)置參見(jiàn)圖7。
利用數(shù)據(jù)實(shí)時(shí)傳輸通信功能的ngx-mqtt插件,獲取倉(cāng)庫(kù)/門(mén)主題并將接收到的數(shù)據(jù)存入數(shù)據(jù)庫(kù)提供給查詢(xún)系統(tǒng),將得到相應(yīng)的商品信息轉(zhuǎn)換成用戶(hù)需要的格式展示在表格中,并在表格的底部顯示匯總統(tǒng)計(jì)信息。操作員確認(rèn)后點(diǎn)擊入庫(kù)按鈕、填寫(xiě)入庫(kù)單號(hào)、選擇庫(kù)位、提交入庫(kù)。
商品出庫(kù)功能先進(jìn)行掃描然后過(guò)濾重復(fù)的商品信息,填寫(xiě)出庫(kù)單號(hào),執(zhí)行出庫(kù)。與入庫(kù)操作不同的是,出庫(kù)時(shí)掃描的商品是在庫(kù)存里查找,入庫(kù)的信息則是在商品信息庫(kù)中查找。
調(diào)撥是物資從一個(gè)倉(cāng)庫(kù)轉(zhuǎn)移到另一個(gè)倉(cāng)庫(kù)的過(guò)程,拆分開(kāi)就是先執(zhí)行出庫(kù)再入庫(kù),在執(zhí)行調(diào)撥時(shí)需要選擇目的倉(cāng)庫(kù),在目的倉(cāng)庫(kù)入庫(kù)時(shí)選擇庫(kù)位就完成了整個(gè)調(diào)撥過(guò)程。
移庫(kù)與調(diào)撥是不同的概念,是在同一個(gè)倉(cāng)庫(kù)內(nèi)不同的庫(kù)位周轉(zhuǎn)的過(guò)程。在確認(rèn)物資信息正確之后選擇新庫(kù)位與舊庫(kù)位,執(zhí)行移庫(kù)操作。
在物資使用或者存放過(guò)程中會(huì)出現(xiàn)損壞情況,報(bào)損功能為了及時(shí)分離這些損壞商品,功能流程與出庫(kù)一致。找出損壞商品,讀頭掃描,執(zhí)行報(bào)損,數(shù)據(jù)庫(kù)實(shí)時(shí)更新報(bào)損數(shù)據(jù),并做統(tǒng)計(jì)。
按照倉(cāng)庫(kù)管理的要求,需要進(jìn)行不定期的盤(pán)點(diǎn)。前端網(wǎng)頁(yè)按照需要盤(pán)點(diǎn)的物資條件查詢(xún)到指定商品,生成盤(pán)點(diǎn)信息單,發(fā)送到手持機(jī),手持機(jī)拉取盤(pán)點(diǎn)單,在指定庫(kù)位進(jìn)行掃描,將掃描結(jié)果進(jìn)行對(duì)比,將結(jié)果展示給操作員。
記錄查詢(xún)主要是搜索條件比較多,接口也相應(yīng)地做了聚合查詢(xún)??梢詥螚l查詢(xún),也可以多條。正因?yàn)樗阉鳁l件較多,為了得到更好的用戶(hù)體驗(yàn)也加上了清除功能,用來(lái)清除表單中已經(jīng)有的值,方便重新輸入。查詢(xún)結(jié)果中,查看按鈕對(duì)應(yīng)每條數(shù)據(jù)的詳情單,可以選擇查看并打印。
調(diào)撥與盤(pán)點(diǎn)、報(bào)損、移庫(kù)搜索條件均為相應(yīng)單號(hào)和操作時(shí)間,搜索結(jié)果以單號(hào)分類(lèi),點(diǎn)擊單條單跳轉(zhuǎn)到相應(yīng)的單詳情頁(yè),所有的詳情單提供導(dǎo)出pdf功能。
在項(xiàng)目中是沒(méi)有出現(xiàn)過(guò)硬件信息這條的,但是因?yàn)閺膫}(cāng)庫(kù)到讀頭、庫(kù)位、門(mén)這些都屬于硬件范疇。而且規(guī)劃好了之后一般是不會(huì)去修改的,所以就把它們統(tǒng)一劃分到硬件范疇,但是功能還是獨(dú)立的,也設(shè)置了單獨(dú)的功能頁(yè)面。
人員管理主要針對(duì)密碼和郵箱的修改。這是只有超級(jí)管理員才有的權(quán)限。如果需要添加超級(jí)管理員賬號(hào)需要聯(lián)系我們?cè)跀?shù)據(jù)庫(kù)添加,這也保證了一定程度的數(shù)據(jù)安全。
通過(guò)非關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)建立分布式云存儲(chǔ)系統(tǒng),針對(duì)在多點(diǎn)多級(jí)倉(cāng)儲(chǔ)管理系統(tǒng)所涉及的復(fù)雜應(yīng)用管理,系統(tǒng)結(jié)合RFID技術(shù)對(duì)物資二維碼標(biāo)簽進(jìn)行唯一性的識(shí)別,以使系統(tǒng)管理的可靠性、穩(wěn)定性得到有力的保證。系統(tǒng)綜合考慮倉(cāng)儲(chǔ)業(yè)務(wù)多元化發(fā)展的需求,探索了在同構(gòu)系統(tǒng)中將分布式數(shù)據(jù)庫(kù)與云存儲(chǔ)原理結(jié)合在倉(cāng)儲(chǔ)企業(yè)的應(yīng)用,對(duì)于異地性、分布式的倉(cāng)儲(chǔ)企業(yè)的大規(guī)模物品管理具有一定的借鑒意義,系統(tǒng)也可拓展應(yīng)用于其他具有分布式需求的企業(yè)倉(cāng)儲(chǔ)管理。下一步將從兩個(gè)方面進(jìn)一步開(kāi)展研究:(1)在異構(gòu)系統(tǒng)中對(duì)信息查詢(xún)?cè)L問(wèn)、數(shù)據(jù)庫(kù)之間的數(shù)據(jù)遷移、數(shù)據(jù)歸并、所定義的數(shù)據(jù)結(jié)構(gòu)等方面的性能評(píng)價(jià)還需做進(jìn)一步的探索與研究;(2)該文只是涉及設(shè)計(jì)實(shí)現(xiàn)分布式倉(cāng)儲(chǔ)管理系統(tǒng)的關(guān)鍵功能,但對(duì)各不同倉(cāng)儲(chǔ)系統(tǒng)的權(quán)限、角色、功能等的可擴(kuò)展性還需進(jìn)一步研究。
權(quán)所有©:上海陽(yáng)合儲(chǔ)運(yùn)
專(zhuān)業(yè)承接上海倉(cāng)庫(kù)租賃、上海倉(cāng)儲(chǔ)配送物流、上海電商倉(cāng)儲(chǔ)企業(yè)服務(wù)與微笑同在"的先進(jìn)理念不斷發(fā)展壯大。