■田 丹董 玲
(1.沈陽(yáng)工學(xué)院信息與控制學(xué)院,遼寧撫順113122;2.遼寧省農(nóng)牧業(yè)機(jī)械研究所有限公司,遼寧沈陽(yáng)110036)
“民以食為天,食以安為先”,食品是人類生存發(fā)展最基本的物質(zhì)條件,食品安全涉及人類最基本的權(quán)利保障,事關(guān)每個(gè)人的身體健康,也是社會(huì)安全穩(wěn)定的重要組成部分。近年來(lái)從蘇丹紅到三聚氰胺、從抗生素濫用到瘦肉精等重大食品安全問題不斷被爆出,食品安全成為社會(huì)關(guān)注的焦點(diǎn),提高食品安全性已經(jīng)刻不容緩。隨著人民生活水平提高,動(dòng)物性食品在食品的消費(fèi)結(jié)構(gòu)比例越來(lái)越高,飼料作為生產(chǎn)動(dòng)物性食品的主要投入品和安全監(jiān)管的源頭,已成為動(dòng)物性食品安全的前提和關(guān)鍵。近年來(lái),農(nóng)藥、飼料添加劑和動(dòng)物激素等的大量使用,對(duì)促進(jìn)養(yǎng)殖業(yè)發(fā)展和增加養(yǎng)殖業(yè)收入發(fā)揮了重要作用,但也給動(dòng)物性食品安全帶來(lái)了極大隱患[1]。飼料和由此引發(fā)的畜產(chǎn)品安全衛(wèi)生問題日益受到人們關(guān)注,飼料安全即食品安全的理念逐漸被越來(lái)越多的人所接受。目前飼料安全監(jiān)管的技術(shù)含量不高、專業(yè)性不強(qiáng),加之涉及的部門較多,成為我國(guó)食品安全監(jiān)管的薄弱環(huán)節(jié)。
可追溯性是指追溯所考慮對(duì)象的歷史、應(yīng)用情況或所處場(chǎng)所的能力。飼料由生產(chǎn)到使用經(jīng)過(guò)了原料采購(gòu)、飼料生產(chǎn)、飼料貯運(yùn)、飼料銷售和飼料消耗等環(huán)節(jié),生產(chǎn)鏈條長(zhǎng),生產(chǎn)過(guò)程復(fù)雜,每個(gè)環(huán)節(jié)出現(xiàn)問題都會(huì)引起安全問題[2-3]。本文參照食品安全追溯系統(tǒng)構(gòu)建飼料安全追溯系統(tǒng),采用先進(jìn)的計(jì)算機(jī)和互聯(lián)網(wǎng)技術(shù),以農(nóng)業(yè)部2014年第1號(hào)令《飼料質(zhì)量安全管理規(guī)范》為基礎(chǔ),對(duì)飼料生產(chǎn)、流通和消耗的全過(guò)程信息進(jìn)行管理,實(shí)現(xiàn)生產(chǎn)可記錄、來(lái)源可追溯、去向可追蹤、責(zé)任可追究,為企業(yè)提供溯源信息的集中化管理,為政府監(jiān)管提供基礎(chǔ)數(shù)據(jù)支持,為公眾提供查詢溯源信息的窗口,同時(shí)提供診斷預(yù)警和質(zhì)量投訴等功能,架起保障飼料安全的防火墻,促進(jìn)養(yǎng)殖業(yè)的健康發(fā)展,為保障人民健康和提高生活水平服務(wù)。
框架是可復(fù)用的設(shè)計(jì)構(gòu)件,規(guī)定了應(yīng)用的體系結(jié)構(gòu),闡明了系統(tǒng)構(gòu)件之間的依賴關(guān)系和控制流程。MVC是目前最流行的軟件開發(fā)框架,將系統(tǒng)分為模型、視圖和控制器三部分,每部分相互獨(dú)立,具有耦合性低、重用性高、易于維護(hù)和易于擴(kuò)展等特點(diǎn),開發(fā)人員能夠集中精力于業(yè)務(wù)邏輯,有利于軟件工程化管理和提高開發(fā)效率。J2EE領(lǐng)域包含多種MVC框架技術(shù),Struts2、SSH和SSi是主流的應(yīng)用開框架,本系統(tǒng)基于SSi框架開發(fā),框架結(jié)構(gòu)如圖1所示[4-5]。
圖1 SSi框架結(jié)構(gòu)
Struts2是繼承了Struts設(shè)計(jì)思想并加入WebWork而形成的新框架,可以作為獨(dú)立的框架使用,也可以與其他框架整合而形成新框架。本系統(tǒng)將Struts2作為SSi框架的組成部分實(shí)現(xiàn)控制層,接收來(lái)自表示層的請(qǐng)求,調(diào)用業(yè)務(wù)邏輯方法進(jìn)行處理。
Spring是輕量級(jí)容器,是J2EE領(lǐng)域全方位應(yīng)用程序框架,針對(duì)Servlet和EJB等容器存在的部署復(fù)雜、運(yùn)行緩慢、服務(wù)繁多和難以測(cè)試等問題提供了解決方案。本系統(tǒng)將Spring作為SSi框架的組成部分實(shí)現(xiàn)業(yè)務(wù)邏輯層,完成核心業(yè)務(wù)處理。
iBatis是Apache的開源項(xiàng)目,iBatis一詞來(lái)源于“internet”和“abatis”的組合,是O/R Mapping解決方案。iBatis框架針對(duì)SQL語(yǔ)句輸入輸出進(jìn)行映射,從關(guān)系型開始到對(duì)象型的思路來(lái)解決數(shù)據(jù)庫(kù)操作問題,依據(jù)持久化的對(duì)象得到運(yùn)行結(jié)果。
飼料安全追溯系統(tǒng)的目標(biāo)是“源頭可追溯、生產(chǎn)有記錄、流向可跟蹤、信息可查詢、產(chǎn)品可召回、責(zé)任可追究”,實(shí)質(zhì)是飼料安全信息管理系統(tǒng),運(yùn)用計(jì)算機(jī)和網(wǎng)絡(luò)通信技術(shù),對(duì)飼料追溯鏈的信息進(jìn)行管理和監(jiān)控?;诩軜?gòu)的設(shè)計(jì)思想,系統(tǒng)邏輯上由信息采集層、信息處理層、信息服務(wù)層和信息用戶層等構(gòu)成,參照相關(guān)文獻(xiàn)[6-8],設(shè)計(jì)的系統(tǒng)架構(gòu)如圖2所示。
圖2 飼料安全追溯系統(tǒng)架構(gòu)
基于數(shù)據(jù)信息采集技術(shù),將飼料追溯鏈條各環(huán)節(jié)的信息采集到數(shù)據(jù)庫(kù)系統(tǒng)中。信息采集包括兩種方法,一種是自動(dòng)采集,通過(guò)計(jì)算機(jī)串口將數(shù)字化設(shè)備上的信息直接采集到系統(tǒng)中;二是手工錄入,不具備自動(dòng)采集條件的使用這種方法。
信息處理層是系統(tǒng)架構(gòu)的核心,運(yùn)用數(shù)據(jù)編碼技術(shù)、數(shù)據(jù)交換技術(shù)和數(shù)字化管理技術(shù),依據(jù)《飼料質(zhì)量管理規(guī)范》構(gòu)建質(zhì)量安全信息管理系統(tǒng),系統(tǒng)由6個(gè)子系統(tǒng)構(gòu)成。其中,原料采購(gòu)管理子系統(tǒng),管理飼料原料、添加劑和供應(yīng)商等信息;生產(chǎn)過(guò)程控制子系統(tǒng),建立配方標(biāo)準(zhǔn)和設(shè)備檔案數(shù)據(jù)庫(kù),根據(jù)工藝流程記錄生產(chǎn)信息;產(chǎn)品質(zhì)量控制子系統(tǒng),對(duì)質(zhì)量巡查信息實(shí)時(shí)保存,全面保存出廠檢驗(yàn)、質(zhì)量抽查和產(chǎn)品留樣信息;貯存運(yùn)輸管理子系統(tǒng),管理出入庫(kù)記錄、銷售臺(tái)賬和運(yùn)輸車輛等信息;飼料銷售管理子系統(tǒng),管理銷售客戶、產(chǎn)品投訴和產(chǎn)品召回等信息;飼料消耗管理子系統(tǒng),全面記錄飼料消耗的時(shí)間、數(shù)量、環(huán)境和用途等信息。
基于多平臺(tái)追溯技術(shù)和系統(tǒng)集成技術(shù),將信息處理層的信息向用戶提供服務(wù)。信息處理層包括6個(gè)子系統(tǒng),需要將這些功能集成,通過(guò)統(tǒng)一的飼料安全追溯系統(tǒng),并使用局域網(wǎng)絡(luò)、專用網(wǎng)絡(luò)、互聯(lián)網(wǎng)絡(luò)和移動(dòng)網(wǎng)絡(luò)等多種通信方式服務(wù)。
系統(tǒng)包括采購(gòu)、生產(chǎn)、貯運(yùn)、銷售、飼養(yǎng)、監(jiān)管和大眾等多種用戶,為了保證系統(tǒng)安全,通過(guò)統(tǒng)一認(rèn)證和授權(quán)管理為不同用戶提供不同的功能和操作權(quán)限。對(duì)于查詢和跟蹤用戶,可以使用智能手機(jī);對(duì)于信息操作管理用戶,建議使用電腦。
飼料安全追溯系統(tǒng)包括6個(gè)子系統(tǒng),每個(gè)子系統(tǒng)又包括若干功能,限于文章篇幅,本文僅實(shí)現(xiàn)生產(chǎn)過(guò)程控制子系統(tǒng)的營(yíng)養(yǎng)素配比標(biāo)準(zhǔn)模塊,其他模塊實(shí)現(xiàn)可參照本模塊。
數(shù)據(jù)持久化與具體數(shù)據(jù)庫(kù)表的邏輯結(jié)構(gòu)相關(guān)?;赟QLServer數(shù)據(jù)管理系統(tǒng)的營(yíng)養(yǎng)素配比標(biāo)準(zhǔn)表的邏輯結(jié)構(gòu)設(shè)計(jì)結(jié)果如表1所示。
表1 營(yíng)養(yǎng)素配比標(biāo)準(zhǔn)表(Nutrient Ratio Standard)
iBatis持久化主要包括四項(xiàng)工作[9-10]:
① 編寫JDBC連接屬性文件*.properties,用來(lái)配置數(shù)據(jù)庫(kù)連接信息。數(shù)據(jù)庫(kù)連接信息不寫在class中,而是放入JDBC連接屬性文件,程序從屬性文件讀入取值,以實(shí)現(xiàn)“運(yùn)行時(shí)動(dòng)態(tài)加載”。文件內(nèi)容以“鍵=值”(key-value)的格式。通常的配置信息包括數(shù)據(jù)庫(kù)用戶名和密碼、初始化連接數(shù)量和最大連接數(shù)量、連接超時(shí)等待時(shí)間,連接池中最大空閑的連接數(shù)和最小空閑的連接數(shù)等。
② 編寫總體配置文件sqlMapConfig.xml,用來(lái)完成數(shù)據(jù)庫(kù)操作相關(guān)資源配置。SqlMap的配置是iBatis中應(yīng)用的核心,用XML文件統(tǒng)一配置不同的屬性。SqlMapConfig.xml作為總體配置文件,主要負(fù)責(zé)描述數(shù)據(jù)連接信息及Sq1Map.xml的位置。SqlMapConfig.xml文件包括三類結(jié)點(diǎn)[12]:<settings>節(jié)點(diǎn)定義數(shù)據(jù)庫(kù)操作的相關(guān)信息;<transactionManager>節(jié)點(diǎn)定義iBatis的事務(wù)管理器;<sqlMap>節(jié)點(diǎn)指定映射文件的位置。
③編寫實(shí)體類映射文件,用來(lái)填寫SQL語(yǔ)句。實(shí)體類映射文件用于完成對(duì)數(shù)據(jù)庫(kù)對(duì)象的操作,包括要執(zhí)行各種SQL語(yǔ)句,存儲(chǔ)過(guò)程,輸入?yún)?shù)映射,返回結(jié)果映射,緩存機(jī)制,并且能通過(guò)幾種相對(duì)比較復(fù)雜的配置實(shí)現(xiàn)對(duì)象之間的關(guān)聯(lián)關(guān)系和延遲加載,實(shí)現(xiàn)了數(shù)據(jù)存儲(chǔ)邏輯與上層邏輯代碼分離。映射文件包括Mapped Statements、Parameter Maps、Result Maps 和Cache Models等配置。映射文件可以很簡(jiǎn)單,也可以很復(fù)雜,這是iBatis與其他持久化的工具相比具有的靈活性和高性能。
④編寫DAO實(shí)現(xiàn)類,即iBatis要操作的對(duì)象。數(shù)據(jù)訪問對(duì)象(DAO,Data Access Objects)是面向?qū)ο蟮慕涌?,用于完成?duì)數(shù)據(jù)庫(kù)的操作,處于業(yè)務(wù)邏輯與數(shù)據(jù)庫(kù)資源之間,提高了類的獨(dú)立性。數(shù)據(jù)庫(kù)中需要操作的每一張表都需要編寫DAO實(shí)現(xiàn)類。DAO與業(yè)務(wù)邏輯層傳遞的是一個(gè)實(shí)體對(duì)象,是數(shù)據(jù)庫(kù)表在程序中的一個(gè)映射[13-14]。針對(duì)每個(gè)屬性get和set方法作為訪問接口,實(shí)體對(duì)象類不需要繼承iBatis的類或?qū)崿F(xiàn)iBatis接口,提高了類的獨(dú)立性?!盃I(yíng)養(yǎng)素配比標(biāo)準(zhǔn)表NutrientRatioStandard”對(duì)應(yīng)實(shí)體的DAO實(shí)現(xiàn)如下:
系統(tǒng)的業(yè)務(wù)需求決定了業(yè)務(wù)邏輯組件所包含的方法,用戶的每個(gè)業(yè)務(wù)請(qǐng)求通常對(duì)應(yīng)一個(gè)業(yè)務(wù)邏輯方法。實(shí)現(xiàn)具體的業(yè)務(wù)邏輯包括以下三步:
①定義業(yè)務(wù)邏輯組件接口。接口是一系列方法的聲明,提高了軟件系統(tǒng)的靈活性和擴(kuò)展性。營(yíng)養(yǎng)素配比標(biāo)準(zhǔn)管理包括4個(gè)用戶請(qǐng)求,分別是添加、修改、刪除和查詢。業(yè)務(wù)邏輯組件需要定義這4個(gè)方法,系統(tǒng)的控制器組件面向這4個(gè)接口編程,就可實(shí)現(xiàn)控制器組件與業(yè)務(wù)邏輯組件的實(shí)現(xiàn)類分離。
②業(yè)務(wù)邏輯組件實(shí)現(xiàn)類。實(shí)現(xiàn)類就是實(shí)現(xiàn)了接口中那些方法的方法體,業(yè)務(wù)邏輯組件接口必須通過(guò)實(shí)現(xiàn)類來(lái)完成具體的業(yè)務(wù)功能。為了讓業(yè)務(wù)邏輯組件接受Spring容器注入DAO組件,需要為業(yè)務(wù)邏輯組件提供對(duì)應(yīng)的setter方法。業(yè)務(wù)邏輯類通過(guò)數(shù)據(jù)持久層實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,因此,業(yè)務(wù)邏輯方法需要捕獲數(shù)據(jù)持久層異常,并拋出用戶自定義異常,從而為操作者提供更豐富的提示信息。
③配置業(yè)務(wù)邏輯組件。包括三種配置,一,將業(yè)務(wù)邏輯組件實(shí)現(xiàn)類部署在Spring容器中,并為業(yè)務(wù)邏輯方法增加控制;二,配置業(yè)務(wù)邏輯組件所依賴的DAO組件;三,為業(yè)務(wù)邏輯組件增加事務(wù)控制,Spring為BeanNameAutoProxyCreator后處理器傳入事務(wù)攔截器,將目標(biāo)Bean生成事務(wù)代理,因此,首先定義Bean-NameAutoProxyCreator后處理器,然后配置事務(wù)管理器Bean和配置事務(wù)攔截器Bean。
Struts2控制層基于攔截器機(jī)制,F(xiàn)ilterDispacher是核心控制器,負(fù)責(zé)攔截所有的用戶請(qǐng)求,包含了框架內(nèi)部的控制流程和處理機(jī)制。開發(fā)需要編寫相關(guān)的配置文件,供核心控制器使用?!盃I(yíng)養(yǎng)素配比標(biāo)準(zhǔn)查詢”的控制過(guò)程如圖3所示:用戶通過(guò)Web瀏覽器提出請(qǐng)求,過(guò)濾器查找請(qǐng)求并根據(jù)配置文件Struts.xml確定Action,攔截器調(diào)用業(yè)務(wù)邏輯NrsAction.java請(qǐng)求應(yīng)用功能,Action的execute方法用來(lái)獲取查詢結(jié)果,通過(guò)視圖界面queryNRS.jsp返回結(jié)果。
圖3 Struts2控制過(guò)程
針對(duì)當(dāng)前飼料安全監(jiān)督管理的實(shí)際需要,構(gòu)建了符合我國(guó)國(guó)情的飼料安全追溯系統(tǒng),實(shí)現(xiàn)了對(duì)飼料鏈條各環(huán)節(jié)信息的綜合管理,達(dá)到溯源、跟蹤和預(yù)警的目的。通過(guò)設(shè)計(jì)信息采集層、信息處理層、信息服務(wù)層和信息用戶層組成的系統(tǒng)架構(gòu),解決了系統(tǒng)功能和相關(guān)技術(shù)問題;基于SSi框架實(shí)現(xiàn),使得界面展示、業(yè)務(wù)邏輯處理、數(shù)據(jù)讀取完全分離,最大限度地發(fā)揮各自優(yōu)勢(shì),降低了各層間的耦合度,增強(qiáng)了系統(tǒng)的穩(wěn)定性和健壯性,有利于后期的擴(kuò)展與維護(hù)。數(shù)據(jù)采集是本系統(tǒng)開發(fā)的重要工作,涉及到設(shè)備數(shù)字化、協(xié)議、通信和解析等若干問題,本文沒有涉及,需要系統(tǒng)開發(fā)時(shí)進(jìn)一步深入研究。另外,系統(tǒng)用戶較多,知識(shí)水平不同,對(duì)系統(tǒng)的需求也不同,需要用戶的積極配合,提供詳實(shí)可靠的基礎(chǔ)數(shù)據(jù),系統(tǒng)才能有效運(yùn)行。