閆居先
(天津市計劃生育藥具管理中心,天津 300070)
隨著移動互聯(lián)網(wǎng)的迅速發(fā)展與普及,信息化在計生藥具發(fā)放管理服務(wù)中發(fā)揮著越來越重要的作用。為實現(xiàn)計劃生育藥具調(diào)撥、發(fā)放、儲存、質(zhì)量、統(tǒng)計、宣傳等各項業(yè)務(wù)工作相關(guān)數(shù)據(jù)的整合和統(tǒng)一管理,完善計劃生育藥具發(fā)放網(wǎng)絡(luò)和發(fā)放模式,進(jìn)一步提高藥具優(yōu)質(zhì)服務(wù)水平,基于藥具發(fā)放管理服務(wù)功能需求分析,開發(fā)設(shè)計了藥具發(fā)放管理服務(wù)信息平臺。本文主要從軟件基礎(chǔ)架構(gòu)和應(yīng)用服務(wù)器架構(gòu)方面簡述了計劃生育藥具發(fā)放管理服務(wù)平臺架構(gòu)搭建,提出計劃生育藥具發(fā)放管理服務(wù)平臺技術(shù)解決方案。
計劃生育藥具發(fā)放管理服務(wù)平臺由藥具發(fā)放設(shè)備管理系統(tǒng)、藥具免費發(fā)放服務(wù)網(wǎng)站、藥具免費發(fā)放微信公眾服務(wù)系統(tǒng)、藥具語音咨詢服務(wù)熱線管理系統(tǒng)、藥具管理網(wǎng)絡(luò)辦公系統(tǒng)、藥具購調(diào)存業(yè)務(wù)管理信息系統(tǒng)、藥具倉儲環(huán)境遠(yuǎn)程監(jiān)管平臺7個子系統(tǒng)組成,各系統(tǒng)按業(yè)務(wù)管理和發(fā)放服務(wù)需要設(shè)計功能模塊。
該系統(tǒng)是各類藥具發(fā)放終端發(fā)放藥具及相關(guān)統(tǒng)計、查詢、管理和考核的專用系統(tǒng)。主要功能模塊為用戶管理、發(fā)放管理、統(tǒng)計管理、查詢管理、報表管理、考核管理等。
該網(wǎng)站是藥具宣傳咨詢服務(wù)管理的專屬網(wǎng)站,設(shè)服務(wù)、公告、咨詢、視頻4個中心和求助專線,主要欄目包括藥具品種、發(fā)放網(wǎng)點、發(fā)放渠道、兩性知識、健康專欄、視教頻道等,設(shè)計訂單查詢跟蹤系統(tǒng)和緊急避孕援助專線。
微信公眾平臺設(shè)計品種介紹、小貼士、近期活動、兩性健康、微視頻信息等信息欄目。物流查詢欄目設(shè)計發(fā)放藥具功能。
該系統(tǒng)主要由自動語音應(yīng)答、人工座席和數(shù)據(jù)庫三部分組成。自動語音應(yīng)答代替人工自動接聽用戶電話。人工座席主要是為了在自動語音應(yīng)答系統(tǒng)無法解決用戶問題的情況下,向用戶提供人工服務(wù)。數(shù)據(jù)庫系統(tǒng)主要用于保存用戶基本信息、服務(wù)請求信息以及政府部門的業(yè)務(wù)相關(guān)信息。
實現(xiàn)市區(qū)兩級藥具管理服務(wù)機(jī)構(gòu)網(wǎng)絡(luò)辦公和全流程工作管理。功能模塊設(shè)計主要有網(wǎng)絡(luò)辦公系統(tǒng)、信息中心、基礎(chǔ)工作、網(wǎng)點信息、財務(wù)管理、計劃統(tǒng)計、質(zhì)量管理、庫房信息等。
管理市區(qū)兩級藥具購進(jìn)、存儲、調(diào)撥環(huán)節(jié)業(yè)務(wù)。功能模塊包括系統(tǒng)管理、收款管理、計劃管理、藥具管理賬表、入庫管理、數(shù)據(jù)查詢、出庫管理、業(yè)務(wù)監(jiān)管、在庫管理、報表管理、付款管理、數(shù)據(jù)字典等。
管理市區(qū)兩級藥具庫房的溫濕度,由測點終端、管理主機(jī)、不間斷電源以及相關(guān)軟件等組成。各測點終端對周邊環(huán)境溫濕度進(jìn)行數(shù)據(jù)的實時采集、傳送和報警;管理主機(jī)對各測點終端監(jiān)測的數(shù)據(jù)進(jìn)行收集、處理和記錄。
計劃生育藥具發(fā)放管理服務(wù)平臺架構(gòu)如圖1所示。
圖1 計劃生育藥具發(fā)放管理服務(wù)平臺架構(gòu)Fig.1 Framework of management platform for family planning drug delivery
數(shù)據(jù)中心用來存儲藥具領(lǐng)取人個人信息、藥具信息、工作文檔、通知、工作信息等,還存儲發(fā)放單位組織機(jī)構(gòu)信息、組織人員信息等數(shù)據(jù),是整個平臺的基礎(chǔ)。
該系統(tǒng)需要實現(xiàn)系統(tǒng)管理、權(quán)限管理、安全管理、用戶管理、機(jī)構(gòu)管理、人員管理、工作流管理、資訊、公告管理、系統(tǒng)對接管理、消息管理等。
平臺提供與各相關(guān)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)接口,以便進(jìn)行數(shù)據(jù)整合、信息發(fā)布。目前提供與網(wǎng)站、微信公眾賬號、語音服務(wù)熱線(呼叫中心)、自助發(fā)放機(jī)、藥具購調(diào)存系統(tǒng)等均采用數(shù)據(jù)接口進(jìn)行數(shù)據(jù)交互。
對于一個完善的平臺來說,提供的擴(kuò)展性接口以及數(shù)據(jù)服務(wù)都是必不可少的。平臺間的數(shù)據(jù)交換就涉及一個跨平臺的問題。從J2EE平臺到.net平臺是一種典型的跨平臺數(shù)據(jù)交換,WebService就是解決目前跨平臺數(shù)據(jù)交換最常用的方案[1-3]。
業(yè)務(wù)數(shù)據(jù)層完成數(shù)據(jù)存儲的功能。藥具領(lǐng)取人個人信息、發(fā)放藥具信息、工作文檔、通知、工作信息、發(fā)放單位組織機(jī)構(gòu)信息、組織人員信息等數(shù)據(jù),均存放在該層中。
應(yīng)用服務(wù)層是整個平臺業(yè)務(wù)處理的核心部分,基于J2EE標(biāo)準(zhǔn)建設(shè),工作流管理、資訊、公告管理、支付管理等,都采用J2EE業(yè)務(wù)組件實現(xiàn)。
訪問服務(wù)可以支持基于Internet的瀏覽服務(wù),基于Wireless的移動訪問服務(wù),通過聯(lián)通或電信網(wǎng)關(guān)的短信服務(wù)。
支持最終用戶使用瀏覽器、移動設(shè)備、微信進(jìn)行訪問。
多層結(jié)構(gòu)的系統(tǒng)多采用瘦客戶/胖服務(wù)器的架構(gòu),即業(yè)務(wù)邏輯放在服務(wù)器端,而客戶機(jī)僅處理信息的輸入、結(jié)果的顯示和業(yè)務(wù)流程的控制。系統(tǒng)設(shè)計成多層結(jié)構(gòu),不僅擴(kuò)展性好,而且可維護(hù)性也較好。
多層企業(yè)級應(yīng)用框架MTEAF(multi tier enterprise application framework)是基于MVC[4]設(shè)計思想的系統(tǒng)框架。本框架和業(yè)務(wù)邏輯完全無關(guān),目的是使得開發(fā)者在建設(shè)基于J2EE標(biāo)準(zhǔn)的多層結(jié)構(gòu)系統(tǒng)時,能夠在已經(jīng)預(yù)先部署好的框架中進(jìn)行設(shè)計與開發(fā)。MTEAF在系統(tǒng)的整體架構(gòu)上已經(jīng)做了細(xì)致的分層,在嚴(yán)格保證架構(gòu)統(tǒng)一性的同時,又給業(yè)務(wù)邏輯的具體實現(xiàn)方式留出了足夠的靈活性。對于設(shè)計者來說,只需要關(guān)注于業(yè)務(wù)邏輯的合理劃分與如何封裝;對于開發(fā)者來說,只需要關(guān)心某個具體功能的代碼如何編寫,對于框架的工作過程,開發(fā)人員無須掌握每個細(xì)節(jié)。
以B/S結(jié)構(gòu)的JSP/Servlet[5]作前端的表現(xiàn)層開發(fā),系統(tǒng)的客戶端只需要1個瀏覽器即可。通過瀏覽器完成前臺業(yè)務(wù)的相關(guān)操作。系統(tǒng)架構(gòu)也充分考慮到了系統(tǒng)的安全性、可靠性和健壯性。通過設(shè)置系統(tǒng)日志,自動記錄全部操作過程;通過完整的權(quán)限管理機(jī)制,將權(quán)限按系統(tǒng)級、數(shù)據(jù)庫級和業(yè)務(wù)級劃分到每個角色(包括操作員和系統(tǒng)維護(hù)人員),使之在嚴(yán)格規(guī)定的權(quán)限范圍內(nèi)工作。在大多數(shù)B/S結(jié)構(gòu)的Web應(yīng)用中,瀏覽器直接通過HTML或者JSP的形式與用戶交互,響應(yīng)用戶的請求。雖然很直觀,但當(dāng)遇到大批量數(shù)據(jù)應(yīng)用時,隨著代碼的增多會使JSP頁面臃腫不堪,Web服務(wù)器的負(fù)荷過重。MTEAF框架采用多層結(jié)構(gòu)設(shè)計,可使數(shù)據(jù)層與表示層分離,并且設(shè)計充分考慮降低層與層間的耦合[5]。
總之,應(yīng)用系統(tǒng)架構(gòu)在系統(tǒng)易用性、擴(kuò)展性、可維護(hù)性、重用性、可靠性、安全性等方面都進(jìn)行了充分的考慮。這是一種兼顧開發(fā)效率和運(yùn)行效率,同時滿足分布式事件處理功能的系統(tǒng)架構(gòu)。在MVC設(shè)計模式的實現(xiàn)中,視圖采用瀏覽器上顯示的頁面。這種設(shè)計具有B/S/S結(jié)構(gòu)的客戶端零維護(hù)的優(yōu)勢[6]。
在控制層的設(shè)計中分成兩個部分:系統(tǒng)調(diào)用流程控制和系統(tǒng)服務(wù)。
將核心的業(yè)務(wù)做成組件的形式,使業(yè)務(wù)層得到最大限度的重用。并且在組件的數(shù)據(jù)交互接口不變的前提下,如果業(yè)務(wù)邏輯發(fā)生變化則只需要修改組件內(nèi)部邏輯,不用修改系統(tǒng)的其他部分即可。實現(xiàn)了層次間的松耦合,實現(xiàn)了業(yè)務(wù)邏輯的封裝。
調(diào)用模型的設(shè)計主要采用了層次化的設(shè)計思想,主要應(yīng)用了MVC的設(shè)計模式。系統(tǒng)橫向以MVC模式分層。總體調(diào)用層次分為4個大的橫向調(diào)用層次:客戶端層(view)→服務(wù)器框架(controller)→業(yè)務(wù)組件(model)→數(shù)據(jù)庫(model)。MTEAF調(diào)用模型如圖2所示,體現(xiàn)了系統(tǒng)的架構(gòu)模式、調(diào)用順序、調(diào)用層次,使用的技術(shù)及如何分布等一系列重要問題。客戶端采用瀏覽器為解決方案,通過JSP及taglib來實現(xiàn)客戶端的顯示。
圖2 系統(tǒng)運(yùn)行調(diào)用模型Fig.2 Call model of system operation
應(yīng)用服務(wù)器端分成Web控制層、業(yè)務(wù)委派層、商業(yè)邏輯層、持久層。在商業(yè)邏輯層采用EJB。將核心的業(yè)務(wù)做成組件的形式,使業(yè)務(wù)層得到最大限度的重用。并且在組件的數(shù)據(jù)交互接口不變的前提下,如果業(yè)務(wù)邏輯發(fā)生變化則只需要修改組件內(nèi)部邏輯,不用修改系統(tǒng)的其他部分即可。實現(xiàn)了層次間的松耦合,實現(xiàn)了業(yè)務(wù)邏輯的封裝。
表示層即用戶操作界面,在本系統(tǒng)中,用戶只需要使用瀏覽器就可以滿足業(yè)務(wù)的需要。除此之外,對于一些常用的信息瀏覽,系統(tǒng)提供XML數(shù)據(jù)接口,可以通過RSS瀏覽器等工具進(jìn)行瀏覽。
Web控制層是整個應(yīng)用系統(tǒng)的中間層,是應(yīng)用客戶端和業(yè)務(wù)邏輯層之間的中介。由于Web控制層在整個應(yīng)用結(jié)構(gòu)上所占據(jù)的位置,所以在應(yīng)用系統(tǒng)的架構(gòu)設(shè)計上也具有很重要的意義,也是系統(tǒng)架構(gòu)設(shè)計第一個需要解決的問題。
Web控制層作為整個應(yīng)用系統(tǒng)的中間層,同時需要為整個應(yīng)用系統(tǒng)進(jìn)行會話管理、身份驗證、授權(quán)驗證等管理控制任務(wù)。Web控制層作為客戶端請求的入口,根據(jù)整個框架、尤其是業(yè)務(wù)邏輯層的要求對請求進(jìn)行預(yù)處理,負(fù)責(zé)把業(yè)務(wù)請求傳遞到業(yè)務(wù)邏輯層進(jìn)行處理,同時把業(yè)務(wù)邏輯層的處理結(jié)果作為響應(yīng)發(fā)回給客戶端,在客戶端業(yè)務(wù)請求與業(yè)務(wù)邏輯層業(yè)務(wù)處理之間起到了協(xié)調(diào)控制的作用。
Web控制層的主體是由一組 Filter/Servlet[7]構(gòu)成的,它們同時依靠一些支持類庫和工具類庫來正常運(yùn)行。Web控制層主要由最前端的HeadFilter、SaftyFilter、MainServlet組 成 的 過 濾 器 鏈 (Filter Chain)。
Web控制層需要截獲請求,首先由HeadFilter對請求消息進(jìn)行解析、重組后(主要為了驗證請求是否符合通用規(guī)則)轉(zhuǎn)發(fā)請求到SaftyFilter,在這里進(jìn)行用戶身份驗證、用戶授權(quán)和用戶會話的控制管理,最后客戶請求將發(fā)送到MainServlet主控器,MainServlet根據(jù)后端業(yè)務(wù)派遣層和業(yè)務(wù)邏輯層的要求封裝業(yè)務(wù)請求并提交業(yè)務(wù)處理請求,業(yè)務(wù)派遣層最終把業(yè)務(wù)請求傳遞到業(yè)務(wù)邏輯層進(jìn)行處理,同時把業(yè)務(wù)邏輯層的處理結(jié)果封裝后發(fā)回MainServlet,控制權(quán)重新回到Web控制層。MainServlet將請求轉(zhuǎn)發(fā)至 ViewDispatchServlet,ViewDispatchServlet根據(jù)本次請求的 FunctionID和表現(xiàn)層 Web頁面的對應(yīng)關(guān)系,將請求轉(zhuǎn)發(fā)到相應(yīng)的頁面顯示給用戶。處理結(jié)果通過在Request上綁定EventResponse進(jìn)行傳遞。
業(yè)務(wù)委派層作為Web控制層與企業(yè)應(yīng)用層之間的代理,從Web控制層接收業(yè)務(wù)處理請求,然后轉(zhuǎn)交給企業(yè)應(yīng)用層進(jìn)行實際處理,把企業(yè)應(yīng)用層的業(yè)務(wù)處理結(jié)果發(fā)回Web應(yīng)用層。
業(yè)務(wù)委派層采用Command設(shè)計模式來處理業(yè)務(wù)請求的分發(fā)派遣。
業(yè)務(wù)委派層由業(yè)務(wù)處理請求控制器(Request Processor)統(tǒng)一接收Web控制層提交的業(yè)務(wù)處理請求,業(yè)務(wù)處理請求控制器進(jìn)行業(yè)務(wù)處理請求的封裝,從業(yè)務(wù)請求中截取對應(yīng)業(yè)務(wù)處理行為類信息(具體Action子類),并且通過動態(tài)實例化獲得類型為Action的具體業(yè)務(wù)處理行為實例。采用Command模式設(shè)計的BaseAction以及其子類來完成業(yè)務(wù)處理請求的派遣。通過BaseAction接口對業(yè)務(wù)請求處理的一致抽象,RequestProcessor不需知道業(yè)務(wù)請求派遣的具體實現(xiàn)細(xì)節(jié),利用多態(tài)性,業(yè)務(wù)處理請求會準(zhǔn)確傳遞到具體BussinessAction,并進(jìn)一步傳入業(yè)務(wù)邏輯層,最終由數(shù)據(jù)訪問DAO協(xié)同執(zhí)行業(yè)務(wù)處理。
業(yè)務(wù)邏輯層實現(xiàn)了所有的業(yè)務(wù)邏輯處理。
BussinessAction層的設(shè)計使用的是業(yè)務(wù)代表(Business Delegate)的設(shè)計模式,BussinessAction的作用是向表示層提供客戶需要訪問業(yè)務(wù)服務(wù)。
使用BussinessAction作為業(yè)務(wù)代表的好處是可以降低表示層客戶端和業(yè)務(wù)服務(wù)層的耦合,業(yè)務(wù)代表隱藏了業(yè)務(wù)服務(wù)的實現(xiàn)細(xì)節(jié),提供更簡單的、統(tǒng)一的接口更好的向客戶端提供服務(wù)。業(yè)務(wù)邏輯最終通過BussinessAction調(diào)用DAO實現(xiàn),DAO通過更底層的DBUtil和DBTransUtil實現(xiàn)對數(shù)據(jù)庫的操作。
根據(jù)J2EE設(shè)計模式、DAO(data access object)模式、VO(value object)模式、以及ORM(O/R mapping)模式,構(gòu)建核心平臺的持久層。
持久層是數(shù)據(jù)訪問對象DAO。持久層是位于數(shù)據(jù)層之上的一層結(jié)構(gòu),它將所有數(shù)據(jù)連接邏輯封裝到數(shù)據(jù)訪問對象中,隱藏訪問數(shù)據(jù)源的API。使在系統(tǒng)架構(gòu)上建立的應(yīng)用程序不了解數(shù)據(jù)所在的數(shù)據(jù)庫平臺。使應(yīng)用程序與其使用和操縱的數(shù)據(jù)源分離。建立持久層的目的是分開數(shù)據(jù)持久邏輯與表示和業(yè)務(wù)邏輯的整潔機(jī)制。業(yè)務(wù)層與數(shù)據(jù)庫的交互是通過為數(shù)據(jù)訪問對象提供的統(tǒng)一接口和輔助實現(xiàn)類DAO來實現(xiàn)的,取代了使用JDBC之類的數(shù)據(jù)訪問API訪問數(shù)據(jù)庫。
DAO模式和VO模式完全分離業(yè)務(wù)應(yīng)用程序的開發(fā)人員與其在應(yīng)用程序中使用的數(shù)據(jù)源,不需要知道數(shù)據(jù)訪問的API,而是用統(tǒng)一的接口來完成對數(shù)據(jù)庫表的插入、刪除、更新、查詢等數(shù)據(jù)操縱功能。
FunctionID是用來區(qū)分客戶端不同請求的標(biāo)示。每一個需要進(jìn)行業(yè)務(wù)處理的請求,都必須為其定義一個唯一的FunctionID。系統(tǒng)的運(yùn)行依托于和FunctionID相關(guān)的2個重要的對應(yīng)關(guān)系。
FunctionID和BussinessAction的對應(yīng)關(guān)系:每一個FunctionID都必須有一個BussinessAction相對應(yīng)。業(yè)務(wù)委派層中的RequestProcessor通過這種對應(yīng)關(guān)系,找到和請求相對應(yīng)的BussinessAction,調(diào)用BussinessAction.perform (Event),進(jìn)行相關(guān)業(yè)務(wù)處理,從而實現(xiàn)業(yè)務(wù)的分發(fā)。此對應(yīng)關(guān)系可以通過xml文件進(jìn)行定義,也可以保存在數(shù)據(jù)庫中。在進(jìn)行業(yè)務(wù)邏輯部分編程的時候,需要對該對應(yīng)關(guān)系進(jìn)行提前設(shè)計和定義。在MainServlet進(jìn)行初始化的時候進(jìn)行加載,保存在ServletContext上,供全局調(diào)用。
FunctionID和ViewSuccess的對應(yīng)關(guān)系:每一個FunctionID都必須對應(yīng)一組ViewSuccess(實質(zhì)上是一組jsp頁面)。一個業(yè)務(wù)邏輯處理完畢后,控制權(quán)將重新交給MainServlet,MainServlet并不能直接顯示用戶界面,而是將控制權(quán)轉(zhuǎn)給 ViewDispatch-Servlet,ViewDispatchServlet根 據(jù) FunctionID 和ViewSuccess的對應(yīng)關(guān)系,將請求轉(zhuǎn)發(fā)到相應(yīng)的頁面。業(yè)務(wù)處理的結(jié)果通過將ResponseEvent綁定在request上傳遞到JSP頁面進(jìn)行顯示。一般來說,每個FunctionID根據(jù)處理結(jié)果是成功、失敗、錯誤3種情況分別對應(yīng)3個JSP頁面。此對應(yīng)關(guān)系可以通過xml文件進(jìn)行定義,也可以保存在數(shù)據(jù)庫中。進(jìn)行業(yè)務(wù)邏輯部分編程的時候,需要根據(jù)客戶端頁面的開發(fā)情況,對該對應(yīng)關(guān)系進(jìn)行定義。在ViewDispatchServlet進(jìn)行初始化的時候,加載該對應(yīng)關(guān)系,保存在ServletContext上,供全局調(diào)用。
FunctionID和兩個對應(yīng)關(guān)系是本系統(tǒng)架構(gòu)中非常重要的概念,是系統(tǒng)運(yùn)行貫穿始終的紐帶。
上述多個層面的應(yīng)用系統(tǒng)和相
關(guān)技術(shù)再結(jié)合的解決方案,特別是在移動媒體上開創(chuàng)性設(shè)計的微信發(fā)放藥具功能系統(tǒng)緊跟當(dāng)今最新潮流,將計劃生育藥具發(fā)放管理和發(fā)放服務(wù)的所有業(yè)務(wù)領(lǐng)域和各環(huán)節(jié)均納入到信息化平臺中,采用最新軟件開發(fā)技術(shù)路線,應(yīng)用ORACLE數(shù)據(jù)庫,JAVA開發(fā)語言,確保了系統(tǒng)的安全性、穩(wěn)定性和可擴(kuò)展性。
[1] CayS.Horstmann.JAVA核心技術(shù)卷II:高級特性[M].陳昊鵬,等譯.8版.北京:機(jī)械工業(yè)出版社,2008.
[2] Michael Blaha,James Rumbaugh.UML面向?qū)ο蠼Ec設(shè)計[M].車皓陽,楊眉,譯.2版.北京:人民郵電出版社,2006.
[3] Steven John Metsker,William C.Wake.Java設(shè)計模式[M].2版.北京:電子工業(yè)出版,2012.
[4] 孫衛(wèi)琴.精通Struts:基于MVC的Java Web設(shè)計與開發(fā)[M].北京:電子工業(yè)出版社,2004.
[5] 劉曉華,周慧貞.JSP應(yīng)用開發(fā)詳解[M].北京:電子工業(yè)出版社,2007.
[6] 布呂格,迪圖瓦.面向?qū)ο筌浖こ蹋菏褂肬ML、模式與Java[M].葉俊民,汪望珠,等譯.3版.北京:清華大學(xué)出版社,2007.
[7] 昊斯特曼.Java核心技術(shù):卷Ⅰ基礎(chǔ)知識[M].葉乃文,鄺勁筠,杜永萍,譯.8版.北京:機(jī)械工業(yè)出版社,2008.