林健 陳銷瀟
摘要:該文介紹了一個(gè)在ORM層面使用EntityFramework的倉庫管理系統(tǒng)的設(shè)計(jì)方案。在表示層使用了ASP.NETMVC5,這個(gè)也是ASP.NETMVC Core之前的最后一個(gè)版本。系統(tǒng)利用了EntityFramwork的一些特性,基于Lambda表達(dá)式設(shè)計(jì)了一些通用的函數(shù),極大地提升了系統(tǒng)的可重用性和可拓展性?;谶@套底層框架,以后可以應(yīng)對(duì)各種不同的需求進(jìn)行快速開發(fā)。
關(guān)鍵詞:EntityFramework;ORM;Lambda表達(dá)式
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)13-0091-02
1項(xiàng)目背景及需求
廣東郵電職業(yè)技術(shù)學(xué)院有2個(gè)大型餐廳為各大師生以及培訓(xùn)人員提供用餐服務(wù)。每天的食材進(jìn)出非常頻繁,而且每月需要導(dǎo)出規(guī)定格式的報(bào)表供財(cái)務(wù)對(duì)賬使用。月度供應(yīng)商需要更新貨品的供應(yīng)品類和對(duì)應(yīng)價(jià)格,并且后續(xù)有供應(yīng)商比價(jià)的需求。而目前市面上的一些ERP軟件,比如用友、金蝶、管家婆等等,其功能都過于繁雜,不利于餐廳管理人員使用,故委托本團(tuán)隊(duì)開發(fā)一套具有針對(duì)性的倉庫管理系統(tǒng),主要功能在于食材的進(jìn)庫、出庫、報(bào)價(jià)、報(bào)表導(dǎo)出的管理。
2系統(tǒng)設(shè)計(jì)
本系統(tǒng)使用了ASP.NET MVC5后端架構(gòu),運(yùn)行在IIS服務(wù)器上。前端主要使用Bootstrap框架實(shí)現(xiàn)用戶界面。數(shù)據(jù)庫使用SQL Server 2008R2,運(yùn)行在阿里云服務(wù)器上。
系統(tǒng)設(shè)計(jì):系統(tǒng)除了用戶表以外,核心業(yè)務(wù)表為產(chǎn)品表、供應(yīng)商表、報(bào)價(jià)表、品類表、進(jìn)出記錄表,具體列設(shè)計(jì)可參考圖1。為了提高數(shù)據(jù)庫性能,我們刪除了大部分外鍵約束,對(duì)象直接關(guān)系通過EntityFramework代碼在實(shí)體類里面體現(xiàn)。
整個(gè)系統(tǒng)使用流程設(shè)計(jì)如下:
1)報(bào)價(jià)單的導(dǎo)入:根據(jù)用戶的使用習(xí)慣,從便利用戶的角度出發(fā)設(shè)計(jì),用戶利用Excel導(dǎo)入供應(yīng)商報(bào)價(jià)單,這里可能會(huì)分別產(chǎn)生產(chǎn)品(食材)表、品類表、供應(yīng)商表、報(bào)價(jià)表幾個(gè)表的數(shù)據(jù),但最終用戶比較關(guān)心的是報(bào)價(jià)表里面的數(shù)據(jù)。用戶不需要關(guān)心產(chǎn)品的ID信息,這個(gè)在導(dǎo)人的Excel里面也沒有體現(xiàn),同一個(gè)供應(yīng)商下面相同名稱的產(chǎn)品會(huì)擁有相同的產(chǎn)品ID;
2)入庫:用戶安裝供應(yīng)商供貨的Excel進(jìn)行導(dǎo)人,實(shí)際的供貨價(jià)格可以跟報(bào)價(jià)有所下降,但不能超出月度報(bào)價(jià)。也支持單條記錄人工錄入,但從實(shí)際應(yīng)用場景來看,單條數(shù)據(jù)錄入的使用幾率不大;
3)出庫:用戶在Web管理界面批量選擇需要出庫的食材,同一批出庫的食材可以來自不同的供應(yīng)商,不同的進(jìn)貨日期。出庫時(shí)貨品數(shù)量安裝先進(jìn)先出的原則進(jìn)行減扣,優(yōu)先消耗較早的食材;
4)月度報(bào)表:每月底,導(dǎo)出本月的進(jìn)出倉記錄,供財(cái)務(wù)部門核對(duì)以及部門進(jìn)貨規(guī)劃使用。
3系統(tǒng)特色
本系統(tǒng)在前后端設(shè)計(jì)領(lǐng)域都有所創(chuàng)新。前端方面,主要是管理后端類型的頁面,原則上是有不少現(xiàn)成的uI框架可以直接套用,比如本團(tuán)隊(duì)之前一直在使用的AdminLTE。但這些框架一般體積都比較大,這樣的弊端是頁面首次加載時(shí)間較長。為了解決這個(gè)問題,我們基于Bootstrap自己寫了一套前端皮膚,效果見圖2。配合我們的后端程序,可以做到類似C/S程序的ComboBox組件,在下拉菜單里實(shí)現(xiàn)輸入選項(xiàng)模糊查詢的功能,這個(gè)功能目前在B/S系統(tǒng)里面都比較少見,但是對(duì)用戶體驗(yàn)有較大的提升。
后端框架設(shè)計(jì)方面,由于EntityFramework已經(jīng)提供了非常便利的上下文(DbContext)類供數(shù)據(jù)庫操作使用了,能夠覆蓋大部分的業(yè)務(wù)場景。唯一不便的就是每個(gè)數(shù)據(jù)表或者視圖的帶條件分頁查詢,為此,我們?cè)O(shè)計(jì)了一個(gè)通用的DAO類,把實(shí)體類作為泛型參數(shù)繼承一下就可以使用,里面包含了通用的分頁函數(shù)。而且借助Lambda表達(dá)式,我們目前做到了后端零SQL語句,所有數(shù)據(jù)庫操作都通過實(shí)體類而不是無法進(jìn)行語法校驗(yàn)的字符串SQL語句。這樣帶來的好處是,萬一系統(tǒng)進(jìn)行升級(jí),數(shù)據(jù)庫結(jié)構(gòu)發(fā)生改變,Lambda表達(dá)式也會(huì)做出相應(yīng)的校驗(yàn),排除了大部分結(jié)構(gòu)升級(jí)帶來的代碼隱患。
4總結(jié)與展望
系統(tǒng)剛投入使用不久,由于設(shè)計(jì)前期投入了大量的調(diào)研工作,歷時(shí)一年進(jìn)行定制開發(fā),用戶表示使用過程流暢舒適,系統(tǒng)功能實(shí)用,界面雖算不上華麗,但也算是整潔干凈,可見我們?cè)跍p少用戶操作、優(yōu)化用戶體驗(yàn)方面的努力沒有白費(fèi)。
未來,該系統(tǒng)還計(jì)劃加入供應(yīng)商橫向比價(jià)、二維碼掃描進(jìn)出庫、食材跟蹤等功能。從技術(shù)角度來看都是可以實(shí)現(xiàn)的,唯一需要考慮的就是項(xiàng)目進(jìn)度的時(shí)間安排而已。