jxTMS--demo說明

demo說明

jxTMS提供了一個demo組織,其完整的說明了如何用jxTMS開發一個銷售訂單審批流程,用於演示與說明jxTMS如何定製一個業務系統。該流程已經內嵌在鏡像中,所以是開箱即用的,開發者可以對照相關代碼、註釋和界面,通過操作來理解jxTMS的工作機制與編程。

此銷售訂單審批流程的業務需求爲:

  • 銷售、銷售部經理有權發起本流程

  • 本流程包括三步:銷售填寫訂單詳情、銷售部經理審覈、總經理批准

  • 銷售在填寫產品明細時,自動計算單品折扣、根據單價和數量小計、自動彙總、自動計算單子總折扣

  • 針對各個產品類別爲銷售指定相應的折扣權限,銷售所給實際單價超權限則標紅以提示審批人員注意

  • 總折扣低於30%則報總經理審批,高於30%則不需要

  • 審批人員如不同意可打回重做,總經理可選擇打回到銷售還是銷售部經理

  • 總經理如有疑問,可打回銷售或銷售部經理要求做補充說明

  • 流程審批完成後,可通知其他人員進行額外的處理【這種情況,一般都是一個不需要某作業人員介入審批過程,但需要最終進行其進行一些相關的業務操作,如出差審批流程,不需要前臺或hr介入,但最後需要通知他們對申請人的出勤情況做登記;又如報銷審批流程,不要某財務人員批准,但最終需要其打印審批文件和報銷單據裝定到一起作爲憑證】

  • 隨時都可查看該流程的操作日誌、快照、數據變動情況

  • 發起人員可從【我的訂單】中進行查看、銷售部經理和總經理可從【所有訂單】中查看,支持條件查詢搜索特定的訂單

  • 訂單要按銷售、客戶來對銷售額進行彙總

  • 銷售部經理和總經理可按列表和圖表的形式查看銷售額的彙總

代碼量分析

爲實現上述功能,代碼量爲:

  • data文件定義了三個數據類【同步自動映射爲數據庫中的同名數據表】,共71行,其中空行與註釋39行

  • sql文件定義了兩個數據源,共24行,其中空行與註釋15行

  • web文件定義了訂單審批流程、訂單列表查詢、訂單列表統計、訂單圖表統計共4個界面,共141行,其中空行與註釋27行,除少數控件外,基本上一行一個控件,共定義了108個web控件

  • op.py文件定義了5個入口、3個入口鏈接,共58行,其中空行與註釋11行

  • capa.py文件主要實現上述大部分業務邏輯,共279行,其中導包語句33行、空行31行、註釋53行【含業務規則說明兩行】,而剩下的162行業務代碼中甚至還包括5行pass語句

注:前述業務邏輯有很少部分還分散在其它模塊中,如折扣管理、產品分類碼管理、人員管理、角色管理等

數據準備

在tms目錄下的導入文檔模板目錄中,提供了四個文件,爲能正確使用上述功能,應將這四個文件依次導入【demo已導入,開發者如自己新建一個組織來熟悉jxTMS的使用時則需自己導入】:

  • importRole.xls,提供了組織部門架構與角色的導入

注:角色導入會重置所有的部門和角色的關係,所以要保持所有的部門與角色的設置,然後添加部分新的角色設置

  • importUser.xls,導入人員,並設置其角色映射。所以本文件必須在導入角色之後才能導入,否則系統無法正常工作

注1:人員在導入時,會根據登錄名或手機號來查找是否已經導入過該人員了,如果沒有找到則會添加新的人員,所以每次到導入成功後,系統會爲新人員自動創建登錄名,並寫入到一個臨時文件中然後顯示給用戶一個工具條供其下載【下圖左上角處的下載更新後的文件】,應將系統生成的帶有登錄名信息的文件作爲最新的用戶文件替代掉importUser.xls,以避免重複導入
jxTMS架構
注2:不管人員是否是新增加的,其角色映射都會根據本文件的指示重置

  • importStoreClassCode.xls,導入產品分類代碼。demo所演示的銷售訂單審批流程中的產品分類是根據產品代碼的前兩位進行區分的,本文件是一次性導入目前的產品分類代碼

  • importDiscount.xls,導入能發起這個角色的人員在各個產品分類的折扣權限

這些文件在上傳時,將相應的文件,拖入到文件框處即會自動上傳。目前jxTMS限制了文件大小爲10M字節。默認可上傳的文件後綴爲xls,如果需上傳其它類型的文件,則在定義fileInput型控件時指定屬性fileExts爲需要的文件類型後綴即可,例如:fileExts=‘py,c’【可上傳.py的python代碼文件,.c的c語言源文件】。
注:目前jxTMS在操作excel文件時,只使用了xls文件類型,開發者需要注意上傳的文件格式

代碼組織

導入上述文件後【開發者所看到的是已經導入完畢的了】,將代碼放到相應的組織代碼目錄下,熱機刷新後,即可正常使用。這些文件存放在tms目錄下的codeDefine目錄下。jxTMS中最基礎的功能管理是模塊,熱機刷新也是把一個模塊作爲整體加載或卸載的。

任何一個組織其功能都是由代碼空間所組成的,代碼空間又分爲系統空間【所有組織都有的空間】和自有空間【本組織私有的空間】。而空間又是由一個一個的模塊所組成,如demo組織中目前只有一個sales自有空間,而sales空間下有三個模塊。

系統空間又分爲兩類,一類爲自生空間,一類是衍生空間。其中自生空間都爲java代碼實現,是內嵌在jxTMS系統中的,以支持jxTMS的基本運行,但其界面還是通過文本來定義的,存放在tms目錄下的docDefine目錄下,目前包括affair、info、maintain、mgr共四個空間;而衍生空間則是全部由python代碼所定義的,位於codeDefine目錄下,爲所有組織共用,目前包括:manager、msg兩個空間:

  • manager目錄,這是系統目錄,用戶不要修改,其下四個模塊,people模塊負責用戶管理、role模塊負責角色管理,right模塊負責權限管理【折扣就是使用了系統權限功能來實現的】,op提供了熱機刷新功能

  • msg目錄,這也是系統目錄,主要是提供消息管理功能,但目前未使用,用戶也不要修改

每個組織自用的空間,也存放在codeDefine目錄下,以該組織的全名作爲目錄名,如demo組織的所有自用代碼都存放在demo目錄下:

  • demo目錄,除上述兩目錄外,都是以組織全名爲名字的組織自有代碼根目錄,這個目錄下的代碼只出現在該組織的空間中,放什麼樣的文件,熱機刷新後即有什麼樣的功能。demo目前只有一個sales空間,其下有三個模塊:discount管理折扣、storeClassCode管理產品分類碼,order提供訂單的流程管理

所以,demo組織中共有七個代碼空間:

  • affair、info、maintain、mgr、manager、msg六個爲系統空間,開發者如有需要可直接引用。如affair空間提供了所有流程的日誌、快照、數據變化追溯等功能,info空間提供了我正在做的事等任務驅動的功能,此外,如果創建組織、停止組織、賦予人員系統權限等功能都是由這些系統空間所提供的

  • sales自有空間,所以定製的代碼都在自有空間中

在創建了一個組織後,jxTMS會自動爲該組織創建一個自用的數據庫,組織所有的業務數據是獨立而隔離的保存在自己的自用數據庫中的。

jxTMS在創建組織時,會同時創建兩個組織,一個是正式組織,是用於實際業務運行的生產組織,一個是用於測試的組織。

強烈建議:任何定製先在測試組織中進行,完成定製、修改、測試後再同步到正式組織中
注:一個組織有三個名字,全名是組織唯一名,建議使用工商註冊名以避免同名;簡稱,爲相互聯繫的組織間彼此的代稱,主要是全名一般太長,我們都習慣用縮略語來稱呼;系統簡稱,系統根據簡稱生成的一個英文的唯一名,用此名全局通信、識別應訪問哪個數據庫等等

代碼文件

jxTMS一個模塊由五個文件組成【不需要則可省略】:

  • data,文本文件,數據對象的定義,該數據對象中的屬性可被python代碼直接引用,同時jxTMS會自動將其映射到組織自有數據庫中的同名表。jxTMS會自動完成相應的對象創建、加載、保存等數據庫操作,開發者只要記得在修改完後update一下就可以了

  • sql,文本文件,定義如何從數據庫中查詢數據。jxTMS提供了類SQL的語法來降低開發者的學習曲線

  • web,文本文件,定義用戶界面。jxTMS的界面都是用文本一行一個控件由開發者簡單定義而來的

  • op.py,python代碼文件,操作入口的定義,jxTMS中,凡是用戶可點擊的菜單、按鈕、快捷欄都是由開發者在op.py中簡單定義而來到的。同時,開發者通過對每個入口定義有哪些角色可以操作從而實現了對系統的權限管理

  • capa.py,python代碼文件,定義了業務的邏輯處理,這是五個文件中唯一需要編程的文件

jxTMS提供了一個最簡單的編程模型:用戶的一個操作就直接映射爲一個python中的事件函數。所以capa.py文件主要做了三種事:

  • 行爲定義,如定義流程、定義流水號、定義業務規則、定義興趣點、定義統計等

  • 界面顯示的數據裝定,也就是對要顯示的界面進行初始化以及數據的裝定,如訂單信息之類,jxTMS將其映射爲一個prepareDisp事件,開發者只要針對這個界面的prepareDisp進行編程即可

  • 用戶操作代碼,用戶點擊了一個按鈕,jxTMS將其映射爲一個cmd事件,開發者只需定義針對這個事件的業務處理即可

demo中各功能的實現

前述各功能的實現分佈在:

銷售、銷售部經理有權發起本流程

sales.order模塊的op.py文件中定義了銷售訂單->發起申請的操作入口
其中的role定義指出了誰能看到該入口、以及誰能操作該入口,
jxTMS會根據該處的定義來覈驗用戶請求執行該入口時是否有此權限
@biz.OPDescr
def op1(json):
    json.setShortcut('銷售訂單'.decode('utf-8'),'發起申請'.decode('utf-8'))
    json.module('sales').capaname('order')
    json.disp('sfApproveSalesOrder').setParam('notCover','asoSaleApprove')
    json.role('銷售'.decode('utf-8'),'銷售部經理'.decode('utf-8'))

本流程包括三步:銷售填寫、銷售部經理審覈、總經理批准

sales.order模塊的capa.py文件中定義了訂單審批流程
@myModule.simpleFlow('sfApproveSalesOrder')
def sfApproveSalesOrder():
'''
web sfApproveSalesOrder;
node saleApprove 銷售填寫 web asoSaleApprove ;
node managerConfirm 業務主管審覈 web asoManagerConfirm needRole 銷售部經理 ;
node ceoConfirm 總經理審批 web asoCeoConfirm needRole 總經理 ;
'''
pass

銷售在填寫產品明細時,自動計算單品折扣、根據單價和數量小計、自動彙總、自動計算單子總折扣

sales.order模塊的web文件中定義了這些web端自動計算功能,而web端在執行完這些計算後,按jxTMS的工作原理即會自動同步到後臺,開發者用self.getInput函數即可自動獲得結果
with sfApproveSalesOrderD1t2 compute pre row itemDiscount=realPrice / itemPrice * 100;
with sfApproveSalesOrderD1t2 compute pre row itemSum=itemPrice * itemNum;
with sfApproveSalesOrderD1t2 compute pre row realSum=realPrice * itemNum;

with sfApproveSalesOrder compute totalPrice = sum sfApproveSalesOrderD1t2.itemSum;
with sfApproveSalesOrder compute sumPrice = sum sfApproveSalesOrderD1t2.realSum;
with sfApproveSalesOrder compute discoutRatio=sumPrice / totalPrice * 100;

with sfApproveSalesOrder compute realPrice=sumPrice - extDiscount;
with sfApproveSalesOrder compute realDiscoutRatio=realPrice / totalPrice * 100;

注:此處是爲了便於演示,而統一使用了input型控件,這樣用戶就可以在自動計算完畢後手工修改總價等,從而帶來了業務隱患,開發者可以根據業務實際情況使用text型控件,從而完全不允許用戶輸入,從而結果更可靠

針對各個產品類別爲銷售指定相應的折扣權限,銷售所給實際單價超權限則標紅以提示審批人員注意

sales.order模塊的capa.py文件中定義了訂單自動審覈的業務規則
@myModule.rule('checkOrder')
def rule_checkOrder():
    '''
	/* 折扣超權限則標紅以提示審批人員注意 */
with sfApproveSalesOrderD1t2 如果 col.itemDiscount > 0 且 auth.byCreator.discount = getStoreClassByCode( col.itemCode ) > col.itemDiscount
    則 colAttr.itemDiscount.boder = '3px solid red' 否則 colAttr.itemDiscount.boder = '2px solid blue' ;

/* 是否需總經理審批,當然用chech函數直接編程,但這種規則可以和用戶的溝通較爲順暢,而且還業務管控規則集中在一起了 */
如果 field.Discount < 30 則 info.needCEO = true 否則 info.needCEO = false;
    '''
    pass

然後在sales.order模塊的capa.py文件中定義了這些業務規則的使用
    #在銷售點擊申請按鈕後即執行業務合規性檢查
    self.restrict(db,ctx,'checkOrder',self.currentAffair)	

總折扣低於30%則報總經理審批,高於30%則不需要

前述的業務規則定義了總折扣超過30%則設置一個needCEO的業務狀態,然後在流程流轉到是否需總經理審批時堅持該狀態
@myModule.event('sfApproveSalesOrder', 'ceoConfirm', 'check')
def ceoConfirm_check(self, db, ctx,ca,json):
    needCEO=ca.getInfo('needCEO')
    need= (not needCEO is None) and needCEO
    return need

審批人員如不同意可打回重做,總經理可選擇打回到銷售還是銷售部經理

jxTMS流程內置功能,只要在web中簡單定義即可,無需任何編程
with sfApproveSalesOrderD3t1 row 2 col c0 web n type button width=80,text='同意',motion=cmd,
     demand=simpleFlowDual,params={'flowName':'sfApproveSalesOrder','nodeName':'ceoConfirm','active':'accept','signBy':'ceoBy','signDate':'ceoDate'};
with sfApproveSalesOrderD3t1 row 2 col c1 web n type button width=80,text='拒絕',motion=cmd,
     demand=simpleFlowDual,params={'flowName':'sfApproveSalesOrder','nodeName':'ceoConfirm','active':'reject','signBy':'ceoBy','signDate':'ceoDate'},onlyOnce=false,delay=2000;
with sfApproveSalesOrderD3t1 row 2 col c2 web n type button width=80,text='補充說明',motion=cmd,
     demand=simpleFlowDual,params={'flowName':'sfApproveSalesOrder','nodeName':'ceoConfirm','active':'replenish','signBy':'ceoBy','signDate':'ceoDate'},onlyOnce=false,delay=2000,prompt='需要說明';
with sfApproveSalesOrderD3t1 row 2 col c3 web n bind exportAdditional type combobox width=80,values=[{'value':'saleApprove','text':'退回申請人'},{'value':'managerConfirm','text':'退回業務主管'}],notExtant=true;

總經理如有疑問,可打回銷售或銷售部經理要求做補充說明

jxTMS流程內置功能,只要在web中簡單定義即可,無需任何編程
即上面第三行中【補充說明】那行按鈕定義一下即可
被打回者在點開後即會出現一個【補充說明】的工具條,即可填寫相應的說明信息

流程審批完成後,可通知其他人員進行額外的處理【這種情況,一般都是一個不需要某作業人員介入審批過程,但需要最終進行其進行一些相關的業務操作,如出差審批流程,不需要前臺或hr介入,但最後需要通知他們對申請人的出勤情況做登記;又如報銷審批流程,不要某財務人員批准,但最終需要其打印審批文件和報銷單據裝定到一起作爲憑證】

sales.order模塊的capa.py文件中定義了訂單的興趣點,即只要定義爲特殊訂單,則在審批完成後通知財務稽覈角色
def interest_specialOrder():
    '''
    role 財務稽覈 when field.Type=='特殊訂單'
    '''
    pass
定義給財務稽覈看到的信息
def transForInterest(self,ctx,json,jo):
    json.set('affairName',jo.Name)
    json.set('affairCategory',jo.Special)
    json.set('creator',jo.Info.get('creator'))
    json.set('CreateTime',jo.CreateTime)
    json.set('affairState',jo.State)
    json.set("readed", jo.getReadStr(ctx.getCaller().id()))
    json.set('op',self.getViewA(self.getFullName(),self.viewWebInterface(),jo.Name,jo.ID))

隨時都可查看該流程的操作日誌、快照、數據變動情況

jxTMS流程內置功能,只要在op.py中將這些功能鏈接給訂單審批流程即可,無需任何編程
給訂單審批流程鏈接日誌與快照功能
@biz.OPDescr
def opSalePrjreslink1(json):
    json.setBtnList('sales.order.disp.sfApproveSalesOrder', 'affair.mgr.disp.dispAffairLog')

給訂單審批流程鏈接查看補充說明功能
@biz.OPDescr
def opSalePrjreslink2(json):
    json.setBtnList('sales.order.disp.sfApproveSalesOrder', 'affair.mgr.disp.dispReplenish')

給訂單審批流程鏈接查看數據變動記錄功能
@biz.OPDescr
def opSalePrjreslink3(json):
    json.setBtnList('sales.order.disp.sfApproveSalesOrder', 'affair.mgr.disp.dispDataChangeLog')
鏈接後,訂單詳情界面即會出現日誌、補充說明、數據變動這三個工具條,點擊即可查看到這些功能

發起人員可從【我的訂單】中進行查看、銷售部經理和總經理可從【所有訂單】中查看,支持條件查詢搜索特定的訂單

sales.order模塊的op.py文件中定義了這些入口,由於比較簡單,不再抄錄

訂單要按銷售、客戶來對銷售額進行彙總

sales.order模塊的capa.py文件中定義了這些彙總的規則,其中包括了訂單數彙總與銷售額彙總
@myModule.statistics('訂單統計'.decode('utf-8'),'1M',False)
def statisticsSO():
    '''
    訂單數 classify 總數 when salesOrder:field.State == '交付中' ;
    訂單數 classify 按銷售統計數 when salesOrder:field.State == '交付中' 則  cache.ClassifyName = people:field.Name  ;
    訂單數 classify 按客戶統計數 when salesOrder:field.State == '交付中' 則  cache.ClassifyName = salesOrder:field.Custom  ;

    銷售額 classify 總數 when salesOrder:field.State == '交付中' 則  cache.StatValue = salesOrder:field.Amount  ;
    銷售額 classify 按銷售統計 when salesOrder:field.State == '交付中' 則  cache.ClassifyName = people:field.Name , cache.StatValue = salesOrder:field.Amount  ;
    銷售額 classify 按客戶統計 when salesOrder:field.State == '交付中' 則  cache.ClassifyName = salesOrder:field.Custom  , cache.StatValue = salesOrder:field.Amount;
    '''
    pass
    然後在訂單審批完成後,執行這些彙總
	#對訂單進行統計,由於訂單統計需要查詢訂單和銷售的信息,所以必須將這兩者同時提供
	self.statistics(db,ctx,'訂單統計'.decode('utf-8'),self.currentAffair,sales)

銷售部經理和總經理可按列表和圖表的形式查看銷售額的彙總

sales.order模塊的op.py文件中定義了這些入口,由於比較簡單,不再抄錄

目前,jxTMS已經打包爲雲服務器鏡像,開發者開箱即用:
jxTMS-騰訊雲市場​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章