CIIP是基於XAF開發的開源信息系統框架,經歷了4個月的開發終於可以拉出來見人了。CIIP最常見的應用場景是基於數據庫的企業級應用程序,例如供應鏈系統,ERP系統,MRP系統,CRM系統等。
CIIP支持WEB版本、Windows桌面版本,其中Web版本支持PC浏覽器,也有自適應浏覽器的皮膚,支持平板電腦,手機版本的WEB,同時,基於PhoneGap+WEB的原生手機應用殼+網頁(HTML5)應用的版本正在開發中。
CIIP支持14種數據庫,含MS SqlServer,Oracle,MYSQL等常見數據庫。數據庫訪問層支持XPO和EF兩種ORM,也可以自定義第三方ORM,當然這是高級開發者的選項。在使用了XPO時,切換數據庫的切換(如從sqlserver換到oracle),如果沒有手動調用硬編碼的sql時,是無需修改代碼的。
XAF架構是多語言版本的,CIIP當然也繼承了這個特性,你開發出來的應用程序可以有中文版,英文版。。。。,架構上有了支持,需要做的就是准備應用中使用的字符的語言翻譯文件了,值得一提的是,這個翻譯是可以調用bing.com或google.com的翻譯引擎的。
那麼CIIP干了點什麼事呢?
開源項目地址:https://github.com/tylike/CIIP
那麼,CIIP與XAF又是什麼樣的關系呢?下圖可以看出CIIP與XAF的關系,XAF體系龐大,圖中只包含了部分信息。
前面簡單介紹了CIIP與XAF的關系,下面來說說CIIP中幾個模塊使用的一些關鍵技術:
CIIP中的業務模型是基於ORM的充血模型,我個人很喜歡這種方式,但ORM多數是基於.Net類型的,而.Net又是靜態類型語言,雖然後面.net中增加了dynamic和System.Dynamic.DynamicObject等態類型,但不幸的是xpo中並不支持(EF中是否支持並未考試,也希望了解的朋友留言指點)
題外話:我最想要的是運行時構建業務對象,但又同時使用充血模型的概念,相當於自己構建一個簡單的類型系統,管理這些元數據.我在框架的開發經歷了很多年,由於整體的復雜度,開發周期和個人精力原因,最終先放棄了從零開始構建類型系統的做法.但我有種預感,後面我還會干這個事:D
所以,CIIP的建模功能就是創建ORM對象的過程.CIIP中當前開發了兩種形式的建模:
注:CIIP的定位是在win中做"設計"相關的動作,在Web上面做業務系統的展示,以前我嘗試過在web下面做設計,並且也出了一個開源版本,開源地址:https://github.com/tylike/InfoMatrix 但用起來總感覺不是很舒服.最終決定用win做設計比較好.
上圖中,用戶業務,可以理解成為一個簡單的建表過程,但比表的概念有更多擴展,比如關聯的聚合子表,也可以做操作(相當於建立外鍵).
上圖展示了建立普通用戶業務模型的界面,除了與數據庫建表相類似的界面外,比如名稱,"屬性"即表字段,長度,類型以外,更多使用的是編程中OO的概念,比如"繼承",現在使用的是單根繼承概念,與.net中的類型繼承相同,事實上生成的類與這個界面是對應的.
這個過程就是生成類的過程.再比如:屬性的類型,直接使用了其他新建業務的類型,這也是OO的體現,而不用由用戶想著建立鍵對應關系.
另外,關於繼承的概念,在ORM中,由於.net的限制,只使用了單根繼承,這其實不怎麼樣,而用關系型數據庫中可以多次inner join多個表,對應著多繼承是更好的選擇.可惜啊可惜,我沒有發現哪個ORM干了這事,XAF中的DC機制實現了類似的功能,使用接口做ORM模型,效果很不錯,但,性能又下降了一些,有些行為實現的又不是很好.
接下來再來看看表單的建立:
表單的實質是兩個普通業務對象的相加,即,主子表結構,而這種形式是非常常見的,比如一套ERP中會有N百個表單,所以CIIP把這種形式特殊化,把主子表的內容放到一起,而一些聯系可以自動化的實現出來.
舉個最簡單的例子:表單叫"采購訂單"時,子表內容叫"采購訂單明細",這是有規律的,沒必要一個字一個字打上去,子表的內容自動生成了就好.自動化節省時間.
建立好模型後,工具中有個生成系統的按鈕,按下之後,系統就調用roslyn編譯,並生自動生成加載該dll了.
這時,XAF的機制開始工作了,TA開始生成數據庫,生成表,生成字段,生成界面.是的,這些全是自動化的.
關於建模的另外一些介紹,請點擊這裡.
你為什麼加班?就因為你的工作中有無數個無聊的重復工作在做.程序員每天在幫助業務人員做"自動化",做"智能化",然後他們自己的工作卻沒有這麼自動智能,這個工作就需要框架來做!
你當然會質疑,上面的功能無論如何,只是個建表功能,只是做了一些自動化,現實中的復雜業務,根本不行,這個只能做簡單的東東!
是的,接下來很有必要介紹一下業務邏輯的實現,CIIP中調用了Roslyn+AvalonEdit,TA們可以幫助有代碼經驗的實施人員,或是程序員來書寫業務邏輯.
上圖以"倉庫單據基類"為例,此單據是"對象"當然會有事件,對應的事件將在對應的時刻被觸發,此時,我們可以加入對應的代碼,進行數據控件.
代碼編輯支持智能感知和實時錯誤驗證:
上圖代碼中故意做了一個錯誤,var x = 10/0;按下回車後,下面就會報出錯誤了.
這裡使用的AvalonEdit+Roslyn,以後在CIIP中應用的場景很多,而且功能也超級強大,比如,工資管理軟件中,需要工式的編寫.
這個模塊花費了我很多時間,糾結很多次,最終找到了這個方案,也最為滿意,或是超出意料的滿意,可以擴展的事情太多了,比如自己定義DSL語言都沒有問題.
建模之後,就需要處理流程了:
CIIP中目前內置了供應鏈的一些單據,並內置了一些簡單流程,這些流程是可以運行時配置的,下圖是流程設計器:
下圖是采購詢價單生成采購合同的配置,在上圖中即為一條線:
這裡,主表映射和明細映射下面寫的代碼,即如何做默認附值,CIIP自動根據類型做出對應關系,並由用戶來修改,這裡使用的還是代碼編輯器.
可以看到單據轉換流程中用到了圖形設計器,在CIIP中這個控件使用的也相當廣泛,其中包含:
1.系統導航圖,可設計,也可以由用戶使用進行系統功能的導航.
2.上圖中的單據轉換流程設計器.
3.狀態機設計器
4.單據真實進行情況+狀態機運行情況,以圖形方式展示給用戶查看,非常直觀.
在http://www.uims.top/post/tech1中也簡單介紹了一些流程相關的內容.
CIIP中還包含了商務智能的功能,在CIIP結合供應鏈的DEMO系統中,正在制作此部分的內容,所以還沒有中國式的圖可以截,先上幾張其他系統中全名用的此模塊的,給大家一個直觀的理解吧,這裡是分析結果的顯示界面:
這並沒有什麼,但是Dashboard的設計功能卻是震撼的:
在BI數據分析時,數據源可以直接連接到SQL數據源,同樣支持14種常見數據庫,也可以連接SSIS等專門的數據源,可以從存儲過程\SQL語句查詢結.
而且設計界面,是完全拖拽完成的!
下面簡單上兩張web版本的圖片吧:
可以在手機上運行的響應式布局:
我不能在一篇文章中寫太多內容,後面我會詳細介紹每個模塊的技術問題.
開源項目地址:https://github.com/tylike/CIIP