林健 陳銷瀟


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