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