針對(duì)傳統(tǒng)收銀秤系統(tǒng)功能簡(jiǎn)單、操作復(fù)雜的問(wèn)題,研究了在Android開(kāi)發(fā)平臺(tái)下收銀秤系統(tǒng)的設(shè)計(jì)與 實(shí)現(xiàn)。該系統(tǒng)利用Android集成的小型嵌入式數(shù)據(jù)庫(kù)SQLite的開(kāi)發(fā)接口、基于Java語(yǔ)言開(kāi)發(fā)完成,實(shí)現(xiàn)了收銀 秤系統(tǒng)的稱(chēng)重、計(jì)價(jià)和收銀等功能,內(nèi)置了相應(yīng)的商品資料庫(kù),也允許用戶(hù)導(dǎo)入需要的商品,導(dǎo)出相應(yīng)的統(tǒng)計(jì)數(shù) 據(jù),并且已經(jīng)在設(shè)備模擬器上測(cè)試通過(guò)。
0.引言
目前,集稱(chēng)重、打印與收銀機(jī)管理功能于一體的收銀秤已廣泛應(yīng)用于商業(yè)流通領(lǐng)域、百貨超市、 便利店、酒店、餐飲、快餐連鎖等多個(gè)領(lǐng)域。
這些品牌的收銀秤大都以單片機(jī)作為主控CPU, 沒(méi)有使用操作系統(tǒng)或者使用UCOS系統(tǒng),功能較 為簡(jiǎn)單,響應(yīng)速度慢,操作比較復(fù)雜,不適合計(jì)算 機(jī)水平程度較低的操作人員使用。
而使用Wintel系統(tǒng)收銀秤單價(jià)太高,是其難 以取代單片機(jī)或ARM的重要原因。一臺(tái)采用 Intel核心與Microsoft平臺(tái)的收銀秤的到港報(bào)價(jià) 3000?5000元人民幣,終端市場(chǎng)的報(bào)價(jià)6000? 20000元人民幣,對(duì)于規(guī)模較小的生鮮及食品專(zhuān) 賣(mài)店而言是一筆不小的資本負(fù)擔(dān)。
2007年11月,Google推出基于Linux的操作 系統(tǒng)Android。Android開(kāi)放了源代碼,這給全世 界的應(yīng)用程序開(kāi)發(fā)人員提供了開(kāi)放的開(kāi)發(fā)平臺(tái), 出現(xiàn)了基于Android平臺(tái)的各種各樣的應(yīng)用程序, 應(yīng)用領(lǐng)域廣泛、內(nèi)容豐富,也使得Android很快就 統(tǒng)治了手機(jī)、平板電腦等領(lǐng)域。
1.收銀秤系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)
根據(jù)收銀秤的功能需求,系統(tǒng)采用三星公司 高性?xún)r(jià)比的、基于ARM Cortex-A8內(nèi)核的 S5PV210處理器設(shè)計(jì)的硬件平臺(tái)。S5PV210處理 器采用了 32/64位的內(nèi)部總線結(jié)構(gòu)和最大833 MHz的運(yùn)算速度。包括強(qiáng)大的硬件加速器,支持多 種格式的硬件編解碼等。S5PV210開(kāi)發(fā)平臺(tái)具有 豐富的硬件資源,包含如下:512MB NAND Flash, 512MB DDR2 內(nèi)存,HDMI 顯示接口,1 個(gè) USB Host2.0,USB OTG2.0 接口,1 個(gè) SDIO 接 口 (Micro SD卡接口),支持1路RS232串口接口 (調(diào)試串口)等。整個(gè)收銀秤系統(tǒng)硬件總體設(shè)計(jì) 框圖如圖1。利用該片內(nèi)的512 MB的Flash和 512MB的RAM分別實(shí)現(xiàn)控制程序和上萬(wàn)個(gè)商品 PLU信息的存儲(chǔ),外接I/O器件實(shí)現(xiàn)USB以太網(wǎng) 無(wú)線網(wǎng)絡(luò)的通訊以及支持7.0吋(177.80mm)和 10.1吋(256.54mm)規(guī)格的LCD液晶顯示。利用 RS232串口外接電子秤器件和常見(jiàn)的LP-50打印 機(jī)和內(nèi)置連續(xù)熱敏紙打印機(jī)接口,內(nèi)置熱敏標(biāo)簽 打印機(jī)接口,利用PS2接口連接掃描槍等。
2.系統(tǒng)功能和總體架構(gòu)
按照收銀秤系統(tǒng)的功能需求及軟件的特點(diǎn), 本收銀秤系統(tǒng)劃分為5個(gè)功能模塊,每個(gè)模塊有 多個(gè)子模塊,詳細(xì)說(shuō)明如下。
收銀模塊:包含稱(chēng)重、去皮、清零、付款、折 扣、掛單、取單等功能,可接錢(qián)箱,進(jìn)行現(xiàn)金的收支 和管理,可外接掃描槍掃描稱(chēng)重或者非稱(chēng)重商品, 進(jìn)行收銀,可自動(dòng)計(jì)算單品折扣或者總價(jià)的比例 折扣。
基礎(chǔ)數(shù)據(jù)模塊:包含部門(mén)的管理、商品分 組管理、商品類(lèi)別的管理、商品PLU的管理、商品 批量添加和更新管理、商品折扣的管理、會(huì)員管理 和商品庫(kù)存管理等。
系統(tǒng)設(shè)置模塊:1)網(wǎng)絡(luò)設(shè)置;)用戶(hù)權(quán)限 的控制:收銀員的角色管理,包含銷(xiāo)售員、店鋪經(jīng) 理等;收銀員的管理;設(shè)置收銀員的業(yè)務(wù)操作權(quán)限, 包括退貨、退款、掛單、取單、取消商品訂單和刪除 商品訂單等;設(shè)置商店名稱(chēng)、地址和聯(lián)系電話等。
打印設(shè)置模塊:打印機(jī)的配置;打印格式 的配置,如打印頭信息、打印尾信息、打印日期時(shí) 間格式和打印字體信息的配置等。
報(bào)表設(shè)置模塊:可以查看各種銷(xiāo)售報(bào)表, 如實(shí)時(shí)查看單個(gè)商品日銷(xiāo)售報(bào)表、當(dāng)日銷(xiāo)售報(bào)表、 當(dāng)曰銷(xiāo)售明細(xì)報(bào)表和店員銷(xiāo)售統(tǒng)計(jì)報(bào)表等。能對(duì) 銷(xiāo)售的各類(lèi)商品進(jìn)行銷(xiāo)存管理,查看打印商品庫(kù) 存報(bào)表,統(tǒng)計(jì)庫(kù)存量,根據(jù)單據(jù)來(lái)盤(pán)點(diǎn)庫(kù)存,扣除 合理的損耗。
如上所述,該收銀秤系統(tǒng)基本上實(shí)現(xiàn)了市場(chǎng) 上收銀秤的所有功能,甚至包含了簡(jiǎn)單的進(jìn)銷(xiāo)存 和會(huì)員管理功能,能夠滿(mǎn)足大多數(shù)客戶(hù)的需求。
3.系統(tǒng)的關(guān)鍵功能具體實(shí)現(xiàn)
3.1商品管理的實(shí)現(xiàn)
商品管理包含商品名、商品編碼和商品價(jià)格 等基本信息的保存修改操作,它是收銀秤系統(tǒng)的 基礎(chǔ)。對(duì)于小型連鎖生鮮食品店、休閑食品專(zhuān)賣(mài) 店,中小型的商場(chǎng)、超市或商品數(shù)量較多的賣(mài)場(chǎng), 商品管理是一個(gè)很繁重的任務(wù)。用戶(hù)需要將所有 商品進(jìn)行編碼并逐個(gè)錄入到收銀秤系統(tǒng)中,以備 銷(xiāo)售。一個(gè)良好的商品管理模塊應(yīng)能夠提供用戶(hù) 錄入商品,優(yōu)化銷(xiāo)售報(bào)表,方便計(jì)算銷(xiāo)售利潤(rùn)等。
3.1.1商品表的設(shè)計(jì)
商品表是整個(gè)收銀秤系統(tǒng)設(shè)計(jì)的核心與基 礎(chǔ)。通過(guò)梳理實(shí)際銷(xiāo)售業(yè)務(wù)流程,可分析各個(gè)功能 模塊所需要存儲(chǔ)的數(shù)據(jù),整理相互之間的關(guān)聯(lián),從 而設(shè)計(jì)對(duì)應(yīng)的商品表。根據(jù)收銀秤系統(tǒng)的需求,設(shè) 計(jì)了商品管理的數(shù)據(jù)表如表1。
3.1.2表現(xiàn)層設(shè)計(jì)
商品管理列表界面采用LinearLayout布局, 并使用了自定義翻頁(yè)列表組件ListViewPage,該 組件繼承自ListView。ListView是Android界面設(shè)計(jì)中比較常用的組件,它以列表的形式展示數(shù)據(jù) 庫(kù)表中的具體內(nèi)容,并且能夠根據(jù)數(shù)據(jù)的長(zhǎng)度和 屏幕的大小自適應(yīng)顯示。ListView本身沒(méi)有顯示 上一頁(yè)和下一頁(yè)的按鈕,可通過(guò)手滑動(dòng)方式動(dòng)態(tài) 地加載數(shù)據(jù),當(dāng)向下滾動(dòng)時(shí),最下邊顯示Loading …,數(shù)據(jù)加載結(jié)束后,所顯示的Loading底欄消 失。本項(xiàng)目因?yàn)榻?jīng)常會(huì)用到顯示上一頁(yè)和下一頁(yè) 按鈕的分頁(yè)列表,所以自定義了 ListViewPage組 件,可以在多個(gè)模塊的列表中使用。ListViewPage 實(shí)現(xiàn)了 onPrevPage和onNextPage函數(shù),對(duì)應(yīng)兩個(gè) 按鈕“上一頁(yè)”和“下一頁(yè)”的方法。設(shè)置兩個(gè)變 量iPageSize為10、iPageid默認(rèn)為1,代表每頁(yè)只 顯示10條記錄,默認(rèn)從第一頁(yè)開(kāi)始。
商品信息界面采用LinearLayout布局,里面 包含ScrollView支持垂直滾動(dòng)。使用Tablelayout 類(lèi)以表格的形式對(duì)控件進(jìn)行管理,有多個(gè)行和列, 每一行為個(gè)TableRow對(duì)象,在TableRow下根 據(jù)需要添加子控件標(biāo)簽或輸入框或單選框或下拉 框做為列,默認(rèn)情況下,每個(gè)子控件占據(jù)一列。
3.1.3業(yè)務(wù)邏輯層設(shè)計(jì)
針對(duì)收銀秤系統(tǒng)的硬件內(nèi)存等資源有限問(wèn) 題,通過(guò)SQLite嵌入式數(shù)據(jù)庫(kù)引擎來(lái)實(shí)現(xiàn)結(jié)構(gòu) 化數(shù)據(jù)存儲(chǔ),封裝了 SQLite提供的API,編寫(xiě)了 DBHelper工具類(lèi),進(jìn)行數(shù)據(jù)庫(kù)增刪改查和事務(wù)處 理的基本操作。在商品添加或者編輯的界面中,使 用產(chǎn)品類(lèi)別的下拉框。下拉框中的內(nèi)容通過(guò) DBHelper獲取時(shí)間放在字符串?dāng)?shù)組中,將字符串 數(shù)組與ArrayAdapter連接起來(lái),然后通過(guò) setDropDownViewResource可以設(shè)置下拉列表的 風(fēng)格,最后通過(guò)setAdapter將Adapter添加到 Spinner,而使用 setOnltemSelectedListener 為 Spinner添加事件監(jiān)聽(tīng)函數(shù)。為自動(dòng)計(jì)算商品在收 銀銷(xiāo)售主界面的顯示位置,定義getShowPosit()函 數(shù),函數(shù)循環(huán)從數(shù)據(jù)庫(kù)中的同類(lèi)商品中查找該類(lèi) 別商品的頁(yè)面數(shù)及最小的空位置數(shù)。
3.1.4商品的批量增加和更新
針對(duì)收銀秤系統(tǒng)的商品品種較多問(wèn)題,系統(tǒng) 設(shè)計(jì)了商品的批量增加和更新的功能,利用常用 的.txt或者.csv文件保存商品的基本信息,含商品 的PLU碼、類(lèi)別、名稱(chēng)、價(jià)格及計(jì)量單位;同時(shí)將 商品的圖片命名為相應(yīng)的PLU編碼的圖片,如商 品A的PLU編碼為2201134則其圖片名稱(chēng)為 2201134.jpg ;把商品信息和相應(yīng)的圖片存放在同 個(gè)目錄下,通過(guò)網(wǎng)絡(luò)或U盤(pán)將文件夾拷貝到系統(tǒng) 的data目錄中,就可以實(shí)現(xiàn)自動(dòng)導(dǎo)入和更新數(shù)據(jù)。
3.2收銀功能的實(shí)現(xiàn)
收銀功能包含以下子模塊自動(dòng)去皮、稱(chēng)重、修 改商品售價(jià)、修改商品數(shù)量、掛單、取單、會(huì)員折扣、 計(jì)價(jià)、付款、打印、查看日?qǐng)?bào)表和店員銷(xiāo)售報(bào)表等, 并支持收銀員登錄和暫時(shí)離開(kāi)時(shí)對(duì)系統(tǒng)的鎖定。
3.2.1表現(xiàn)層設(shè)計(jì)
收銀秤的收銀界面比較復(fù)雜,筆者采用分層 結(jié)構(gòu),并使用動(dòng)態(tài)生成的方法。最頂層使用 RelativeLayout 布局,設(shè)置 Theme.NoTitleBar. Fullscreen風(fēng)格。讓整個(gè)應(yīng)用窗口是不含標(biāo)題欄并 且全屏的。內(nèi)部的商品顯示界面使用Tab控件,以 實(shí)現(xiàn)在同個(gè)界面中分別顯示不同類(lèi)別的商品。每 個(gè)Tab控件顯示一種類(lèi)別的商品,使用Tab控件 顯示時(shí)首先使用TabActivtiy里的getTabHsot()方 法獲取TabHost對(duì)象,接著調(diào)用tabHost.addTab (TabSpec)方法添加商品類(lèi)別頁(yè)[6]。TabSpec則是通 過(guò) TabHost.newTabSpec (Stringtag)類(lèi)方法來(lái)創(chuàng)建的實(shí)例,實(shí)例化后通過(guò)setIndicator方法可對(duì)其屬 性進(jìn)行設(shè)置,設(shè)置屬性標(biāo)簽頁(yè)的label (顯示的名 字)的值為商品類(lèi)別的值。另外通過(guò)setContent方 法是指定的是Tab的內(nèi)容。內(nèi)容是使用 FrameLayout來(lái)設(shè)置商品顯示的位置和圖片。 FrameLayout 是通過(guò) FragmentManager 來(lái)對(duì) Activity 運(yùn)行時(shí)Fragment的添加、刪除、替換進(jìn)行操作,而 不是在XML布局文件中進(jìn)行定義。
通過(guò)FrameLayout動(dòng)態(tài)顯示商品的位置和圖 片的步驟如下:
通過(guò) Activity 的 getFragmentManager()來(lái) 獲得 FragmentManager 對(duì)象;
通 過(guò) FragmentManager 的 beginFragmentTransaction ()方法獲得一個(gè) FragmentTransaction 對(duì)象;
通過(guò) FsragmentTransaction 的 add()方法來(lái) 添加一個(gè)Fragment到當(dāng)前的Activity中;
通過(guò) FragmentTransaction 的 commit()方 法來(lái)提交保存一個(gè)Fragment到當(dāng)前Activity中。
3.2.2業(yè)務(wù)邏輯層設(shè)計(jì)
收銀功能是核心功能。包含許多子模塊:稱(chēng) 重、計(jì)價(jià)、修改價(jià)格、會(huì)員折扣、掛單、取單和收款 等。稱(chēng)重功能是通過(guò)創(chuàng)建電子秤監(jiān)聽(tīng)服務(wù)類(lèi) ScaleService 來(lái)實(shí)現(xiàn),ScaleService 繼承自 Service 類(lèi)。在Android中Service服務(wù)類(lèi)類(lèi)似于Linux下 的后臺(tái)進(jìn)程,是用來(lái)進(jìn)行后臺(tái)數(shù)據(jù)處理的進(jìn)程,該 進(jìn)程能夠?qū)τ脩?hù)的行動(dòng)進(jìn)行跟蹤,收銀秤系統(tǒng)要 不斷采集電子秤發(fā)送過(guò)來(lái)的稱(chēng)重信息,就需要編 寫(xiě) ScaleServicec 自定義的ScaleService繼承自系 統(tǒng)的Service類(lèi),然后重載其中的OnCreate ()、 OnStart ()、OnDestroy ()三個(gè)方法,并需要在 AndroidManifest.xml 中注冊(cè)。
Activity 通過(guò) Intent 啟動(dòng) ScaleService,如果 ScaleService還沒(méi)有運(yùn)行,則Android先調(diào)用 onCreate ()方法然后調(diào)用OnStart ()方法;如果 ScaleService 已經(jīng)運(yùn)行,則只調(diào)用OnStart(),所以 一個(gè)ScaleService的OnStart()方法可能會(huì)重復(fù)調(diào) 用多次。收銀秤系統(tǒng)關(guān)閉后則調(diào)用stopService()方 法就會(huì)觸發(fā)ScaleService的OnDestroy()方法。
在自定義的 ScaleService 中不能直接訪問(wèn)數(shù) 據(jù)庫(kù),只能通過(guò)ContentResolver訪問(wèn)[8],實(shí)現(xiàn)步驟
如下:
創(chuàng)建 myContentProvider 繼承自ContentProvider 類(lèi);
在AndroidManifest.xml中添加對(duì)應(yīng)權(quán)限 并且注冊(cè);
通過(guò) Activity 的 getContentResolver()返回 的ContentResolver實(shí)例對(duì)應(yīng)的query函數(shù)獲得返 回為Cursor對(duì)象的數(shù)據(jù)集,利用Cursor對(duì)象操作 數(shù)據(jù)庫(kù);
ContentResolver實(shí)例提供的類(lèi)似數(shù)據(jù)庫(kù)的 增刪改查的基本操作,分別對(duì)應(yīng)insert()、delete()、 update()和 query()函數(shù)。
4.仿真結(jié)果和測(cè)試
4.1仿真結(jié)果
在 ADT (Android Developer Tools)開(kāi)發(fā)環(huán)境 下,使用Java語(yǔ)言,設(shè)計(jì)和實(shí)現(xiàn)了基于Android平 臺(tái)的收銀秤系統(tǒng),并在開(kāi)發(fā)板上測(cè)試了各項(xiàng)功能, 均按要求輸出了預(yù)期的結(jié)果,采用的開(kāi)發(fā)板平臺(tái) 是Android4.1。圖2所示為程序在模擬器上運(yùn)行 時(shí)的功能主界面,當(dāng)用戶(hù)登錄后,可以選擇進(jìn)去某 個(gè)模塊。圖3為收銀秤的收銀操作界面,具有計(jì) 價(jià)、稱(chēng)重等功能。
4.2易用性測(cè)試
易用性測(cè)試的目的在于讓用戶(hù)容易接受使用 軟件。因?yàn)橐子眯允欠枪δ苄孕枨?/span>,有很多的主觀 成分無(wú)法量化。筆者使用B/T 16260.2-2006/ ISO/IEC 9126-2:2001軟件工程產(chǎn)品質(zhì)量(第2 部)外部度量”9]中的兩個(gè)指標(biāo):功能學(xué)習(xí)的難易 性(用戶(hù)要用多長(zhǎng)時(shí)間學(xué)習(xí)使用一項(xiàng)功能)及操 作規(guī)程的減少(用戶(hù)能否減少操作規(guī)程)。測(cè)試對(duì) 象選擇CS2(LH51)收銀秤和RM-60 收銀秤在功能學(xué)習(xí)的難易性和的操作規(guī)程的減少 兩個(gè)指標(biāo)上進(jìn)行比較。選擇的功能集中在常用的 功能,含單個(gè)商品銷(xiāo)售、多個(gè)商品銷(xiāo)售、掛單、取 單、會(huì)員打折、修改價(jià)格、單品作廢、交易作廢和退 貨操作。收銀員的培訓(xùn)時(shí)間測(cè)試情況如下:CS2 (LH51), 16h ,RM-60,16h ;Android CRS,2h。培訓(xùn) 時(shí)間從原來(lái)的16h大幅縮短為2h主要是由于智 能手機(jī)的廣泛使用,收銀員對(duì)于Android系統(tǒng)的使 用有著親切感,對(duì)于收銀秤系統(tǒng)更容易上手操作。
根據(jù)《CS2(LH51)收銀秤銷(xiāo)售操作 使用說(shuō)明手冊(cè)》和《 RM-60操作培訓(xùn)手冊(cè)》,估算出收銀秤的在8種 常用的功能上的操作按鍵次數(shù)如表2。
從表2可以看出對(duì)于常用的功能操作,按鍵 次數(shù)減少,可以大幅減少操作員的工作強(qiáng)度,提高 工作效率。由于界面更直觀,還能減少錯(cuò)誤。
4.3響應(yīng)時(shí)間測(cè)試
由于收銀秤的工作特性,在商品數(shù)量達(dá)到1 萬(wàn)個(gè)時(shí),需要收銀秤的響應(yīng)時(shí)間不超過(guò)1s。筆者對(duì) 收銀秤系統(tǒng)的最常用的3個(gè)操作:定位商品、計(jì) 價(jià)、計(jì)重進(jìn)行響應(yīng)時(shí)間測(cè)試。每個(gè)操作分別在100、 1000和10000個(gè)商品的情況下進(jìn)行30次的操 作,分別取其平均響應(yīng)時(shí)間,結(jié)果見(jiàn)表3。
從測(cè)試結(jié)果可以獲知,由于稱(chēng)重過(guò)程需要與 外部串口通信,所以響應(yīng)時(shí)間相對(duì)定位商品和計(jì)價(jià)較多,但是總體上滿(mǎn)足收銀秤操作響應(yīng)時(shí)間不 超過(guò)1s的要求。
5.結(jié)束語(yǔ)
傳統(tǒng)的收銀秤系統(tǒng)一般采用單片機(jī)作為主控 核心,沒(méi)有采用操作系統(tǒng),內(nèi)存容量少,操作不方 便。筆者根據(jù)收銀秤的應(yīng)用需求,采用基于ARM Cortex-A8為內(nèi)核的S5PV210開(kāi)發(fā)板,設(shè)計(jì)了基于 Android的收銀秤硬件系統(tǒng),并實(shí)現(xiàn)了大屏幕、可 視化、易操作的收銀秤軟件系統(tǒng),并已開(kāi)發(fā)出樣 機(jī)。經(jīng)過(guò)整體測(cè)試證明了提供的設(shè)計(jì)方法的可用 性和可靠性。此外,由于需求的不斷豐富和更新, 有些功能仍需完善,如銀聯(lián)卡刷卡消費(fèi)和會(huì)員積 分卡管理等。此外,考慮提高系統(tǒng)的可擴(kuò)展性以滿(mǎn) 足不同的應(yīng)用場(chǎng)景,整個(gè)收銀界面的操作按鍵應(yīng) 該是可配置的。