摘 要: 以中國(guó)電信行業(yè)計(jì)費(fèi)系統(tǒng)為研究對(duì)象,,從批價(jià)優(yōu)惠業(yè)務(wù)需求層面進(jìn)行分析,提出了基于語(yǔ)法樹(shù)的批價(jià)優(yōu)惠方法,,并在理論和實(shí)踐上給出了一個(gè)電信行業(yè)中應(yīng)用的解決方案,。
關(guān)鍵詞: 計(jì)費(fèi)系統(tǒng);語(yǔ)法樹(shù),;批價(jià),;解決方案
計(jì)費(fèi)系統(tǒng)[1]是電信運(yùn)營(yíng)商業(yè)務(wù)支撐系統(tǒng)中最為核心的部分,,其靈活性、響應(yīng)速度,、支撐能力的高低也在很大程度上決定了前端業(yè)務(wù)模式的多樣性和客戶體驗(yàn)的滿意程度,。隨著電信行業(yè)的發(fā)展,電信運(yùn)營(yíng)商需要構(gòu)建一個(gè)能夠支持3G網(wǎng)絡(luò)多業(yè)務(wù)發(fā)展的融合計(jì)費(fèi)系統(tǒng),,以滿足復(fù)雜的資費(fèi)套餐以及多業(yè)務(wù)融合的需求[2],。
面對(duì)更加復(fù)雜的全業(yè)務(wù)運(yùn)營(yíng)模式,運(yùn)營(yíng)商想要推出適應(yīng)全業(yè)務(wù)運(yùn)營(yíng)環(huán)境下的計(jì)費(fèi)系統(tǒng),,必然需要對(duì)原有的計(jì)費(fèi)系統(tǒng)進(jìn)行整合和改造,。為了提高計(jì)費(fèi)系統(tǒng)性能、支持多業(yè)務(wù)組合,、個(gè)性化資費(fèi)套餐靈活配置的能力,,本文提出了基于語(yǔ)法樹(shù)的批價(jià)優(yōu)惠方法。
1 業(yè)務(wù)介紹
計(jì)費(fèi)系統(tǒng)框架圖如圖1所示,,計(jì)費(fèi)系統(tǒng)的核心是批價(jià)優(yōu)惠處理,,批價(jià)優(yōu)惠分為三種類型:前向優(yōu)惠、優(yōu)惠和后向優(yōu)惠,。傳統(tǒng)上的套餐是指優(yōu)惠,,前向優(yōu)惠和后向優(yōu)惠是優(yōu)惠的補(bǔ)充,主要是針對(duì)所有用戶的計(jì)費(fèi)策略,,可以把其視為標(biāo)準(zhǔn)資費(fèi)的補(bǔ)充,。批價(jià)優(yōu)惠處理的過(guò)程是,首先與局?jǐn)?shù)據(jù)(公共數(shù)據(jù)中心)建立連接進(jìn)行全局零件庫(kù)加載操作(這里的局?jǐn)?shù)據(jù)存儲(chǔ)在內(nèi)存數(shù)據(jù)庫(kù)MDB[3]中),,然后創(chuàng)建業(yè)務(wù)處理線程(如網(wǎng)絡(luò)服務(wù)線程,、讀文件處理線程、業(yè)務(wù)處理線程,、寫文件處理線程等),,根據(jù)業(yè)務(wù)導(dǎo)航將CDR話單類(如語(yǔ)音話單、數(shù)據(jù)業(yè)務(wù)話單,、GPRS話單,、VPMN話單等)分配給不同業(yè)務(wù)處理線程處理,即對(duì)用戶話單中的費(fèi)用進(jìn)行優(yōu)惠,。
用戶訂購(gòu)的每一個(gè)套餐資費(fèi)即記賬資費(fèi)包括多個(gè)子項(xiàng),,這些子項(xiàng)稱之為子記賬資費(fèi),每一個(gè)子記賬資費(fèi)對(duì)應(yīng)的有一個(gè)費(fèi)率方案和一種場(chǎng)景,,每一個(gè)費(fèi)率方案由不同的零件組合而成,,場(chǎng)景是用戶打電話產(chǎn)生的信息,包括用戶品牌、日期,、地區(qū),、呼叫類型、用戶類型,、費(fèi)用類型等,。優(yōu)惠過(guò)程實(shí)質(zhì)上是用記帳計(jì)費(fèi),子記帳資費(fèi)再到優(yōu)惠零件一級(jí)一級(jí)分解任務(wù)并執(zhí)行任務(wù)的過(guò)程,,因此,優(yōu)惠過(guò)程是一個(gè)子記帳資費(fèi)作用效果的描述串,。這里記帳資費(fèi)與子記帳資費(fèi)的關(guān)系通過(guò)語(yǔ)法樹(shù)實(shí)現(xiàn),,每一個(gè)子記帳資費(fèi)唯一地使用一個(gè)優(yōu)惠零件,即優(yōu)惠規(guī)則,,且唯一地匹配一套參數(shù),,理論上,由于采用縱表結(jié)構(gòu)的優(yōu)惠零件具有擴(kuò)展性,,因此所有的優(yōu)惠計(jì)費(fèi)策略都可以通過(guò)優(yōu)惠零件來(lái)實(shí)現(xiàn),。所以在最關(guān)鍵的優(yōu)惠處理過(guò)程中,用戶訂購(gòu)的每一種記帳資費(fèi)都可以通過(guò)優(yōu)惠語(yǔ)法樹(shù)進(jìn)行描述,、解析,、計(jì)算。
2 語(yǔ)法樹(shù)與零件設(shè)計(jì)
2.1 優(yōu)惠語(yǔ)法樹(shù)
2.1.1 語(yǔ)法樹(shù)定義
語(yǔ)法樹(shù)是一棵二叉樹(shù),,其中非葉子節(jié)點(diǎn)的值為子節(jié)點(diǎn)或子樹(shù)之間的關(guān)系,,葉子節(jié)點(diǎn)為記賬資費(fèi)或者子記賬資費(fèi)。定義了以下五種業(yè)務(wù)關(guān)系:
(1)互斥關(guān)系(mut):兩節(jié)點(diǎn)之間只能取一個(gè)節(jié)點(diǎn)執(zhí)行(子記帳資費(fèi)),。先執(zhí)行左節(jié)點(diǎn),,如果符合優(yōu)惠條件則執(zhí)行優(yōu)惠,否則執(zhí)行右節(jié)點(diǎn),。
(2)疊加關(guān)系(add):在左節(jié)點(diǎn)優(yōu)惠的基礎(chǔ)上,,再執(zhí)行右節(jié)點(diǎn)。
(3)最優(yōu)關(guān)系(max):取兩個(gè)節(jié)點(diǎn)最大優(yōu)惠值,。分別執(zhí)行兩個(gè)子節(jié)點(diǎn),,然后進(jìn)行比較,取優(yōu)惠值最大節(jié)點(diǎn),。
(4)最劣關(guān)系(min):取兩個(gè)子節(jié)點(diǎn)最小優(yōu)惠值,,max的逆操作。
(5)特殊疊加關(guān)系(mad):針對(duì)分段的費(fèi)用對(duì)象取最優(yōu)后進(jìn)行組合,,顆粒度更細(xì),,其他關(guān)系針對(duì)整段費(fèi)用對(duì)象做總費(fèi)用判斷。一般針對(duì)打折跟忙閑時(shí)類優(yōu)惠做mad的分時(shí)段最優(yōu)處理。即在add的基礎(chǔ)上,,針對(duì)費(fèi)用對(duì)象分段考慮,。
2.1.2 構(gòu)建語(yǔ)法樹(shù)
假如用戶定購(gòu)了A、B,、C三個(gè)記帳資費(fèi),,A和B兩個(gè)資費(fèi)為互斥關(guān)系,A的子資費(fèi)表達(dá)式為add(F01,, F02),,B的子資費(fèi)表達(dá)式為add(F03,F(xiàn)04),,C的子資費(fèi)表達(dá)式為add(F05,,F(xiàn)06)。記賬資費(fèi)的優(yōu)先順序?yàn)椋篈,、B,、C,所以資費(fèi)表達(dá)式為:add(mut(add(a,,b),,add(c,b)),,add(e,,f)),優(yōu)惠語(yǔ)法樹(shù)構(gòu)造如圖2所示,。
用戶訂購(gòu)的所有套餐需要先按照優(yōu)先級(jí)進(jìn)行排序,,以保證語(yǔ)法樹(shù)的唯一性,然后按照套餐間的關(guān)系以及業(yè)務(wù)類型來(lái)生成記帳資費(fèi)表達(dá)式,。其實(shí)就是將所有的套餐構(gòu)造一顆二叉樹(shù)的過(guò)程,。
2.2 優(yōu)惠零件
(1)優(yōu)惠零件定義
基本零件:也稱簡(jiǎn)單零件,打折,、置費(fèi)率,、減值優(yōu)惠零件,實(shí)現(xiàn)最基礎(chǔ)的操作,。
派生零件:也稱復(fù)雜零件,,是在簡(jiǎn)單零件的基礎(chǔ)上增加條件功能或者輔助邏輯功能,組合成功能更健壯的優(yōu)惠零件,,如圖3所示,。
(2)優(yōu)惠零件模板定義
在計(jì)費(fèi)系統(tǒng)里,具體的計(jì)費(fèi)優(yōu)惠規(guī)則是體現(xiàn)在優(yōu)惠零件里,,根據(jù)優(yōu)惠的業(yè)務(wù)特點(diǎn)把相近的一批優(yōu)惠規(guī)則提煉出來(lái),,用一段簡(jiǎn)單的代碼來(lái)實(shí)現(xiàn)這些規(guī)則,,每一個(gè)優(yōu)惠零件都代表了一種優(yōu)惠規(guī)則。先使用C++模板[4]定義優(yōu)惠零件,,再用零件的有限組合構(gòu)成各種優(yōu)惠類型,。
模板定義如下:
cFavBase:每個(gè)具體的優(yōu)惠零件都需要繼承優(yōu)惠零件基類;
cFav000:對(duì)費(fèi)用對(duì)象賦值的最基本的優(yōu)惠零件,,所有優(yōu)惠零件最后都是歸結(jié)為對(duì)次優(yōu)惠零件的調(diào)用,;
cFav001:基本打折類優(yōu)惠零件;
cFav002:簡(jiǎn)單分段優(yōu)惠零件,;
cFav003:忙閑時(shí)類優(yōu)惠零件,;
cFav004:節(jié)假日簡(jiǎn)單無(wú)階梯話單優(yōu)惠類零件;
cFav005:親情號(hào)碼優(yōu)惠零件,;
cFav006:小區(qū)優(yōu)惠零件,。
因此可以組成多種優(yōu)惠類型,舉例如下:
基本打折類優(yōu)惠零件:cFav001<cFav000>,;
忙閑時(shí)類優(yōu)惠零件:cFav001<cFav003<cFav000, cFav000>>,;
節(jié)假日簡(jiǎn)單無(wú)階梯話單優(yōu)惠類:cFav001<cFav004<cFav000>>,;
親情號(hào)碼優(yōu)惠:cFav001<cFav009<cFav000>>;
所以節(jié)假日,,親情號(hào)碼與忙閑時(shí):
cFav001<cFav004<cFav009<cFav003<cFav000,,cFav000>>>>
3 語(yǔ)法樹(shù)處理的C++實(shí)現(xiàn)
圖4是批價(jià)優(yōu)惠處理的實(shí)現(xiàn)類圖,為了簡(jiǎn)明只給出基本的屬性和方法,,圖中cDataBase是CDR,、cFeeObj、cUserInfoNode,、cStatisObj,、cFavProc的基類。話單基類CDR存放話單的基本信息和中間變量結(jié)構(gòu)體等信息,,費(fèi)用對(duì)象類cFeeObj創(chuàng)建費(fèi)用對(duì)象,,cUserInfoNode用于生成用戶資料節(jié)點(diǎn)地址對(duì)象,引用用戶信息類cUserInfo類來(lái)創(chuàng)建用戶資料節(jié)點(diǎn)上的記帳資費(fèi)語(yǔ)法樹(shù),,cStatisObj類負(fù)責(zé)創(chuàng)建累計(jì)對(duì)象,,cFavProc類負(fù)責(zé)創(chuàng)建優(yōu)惠過(guò)程對(duì)象。
3.1 記賬資費(fèi)表達(dá)式的解析和調(diào)用
首先按照優(yōu)先級(jí)對(duì)cUserInfo中的所有套餐進(jìn)行排序,,然后按照套餐間的關(guān)系以及業(yè)務(wù)類型生成記賬資費(fèi)表達(dá)式,,其實(shí)就是將所有的套餐構(gòu)造成一顆二叉樹(shù)的過(guò)程。下面以語(yǔ)音業(yè)務(wù)的記賬資費(fèi)表達(dá)式為例說(shuō)明表達(dá)式的解析和調(diào)用的過(guò)程,。語(yǔ)音業(yè)務(wù)的優(yōu)惠語(yǔ)法樹(shù)如圖5所示,,生成的記賬資費(fèi)表達(dá)式為2:add(2:add(1:nam1e:index:effdate:expdate:type:id,,1:name:index:effdate:expdate:type:id),0:subname:index),。
從圖5可以看出記賬資費(fèi)表達(dá)式的結(jié)構(gòu)實(shí)際上是一顆二叉樹(shù),,解析記賬資費(fèi)表達(dá)式的過(guò)程是先將表達(dá)式中信息放到一個(gè)結(jié)構(gòu)體p,屬性有節(jié)點(diǎn)類型type,、函數(shù)名稱name,、左子樹(shù)pl、右子樹(shù)pr,、生效日期effDate,、失效日期expDate、索引index等,。下面對(duì)記賬資費(fèi)表達(dá)式構(gòu)成的樹(shù)中的節(jié)點(diǎn)進(jìn)行說(shuō)明:
(1)以“2:”開(kāi)頭,,稱之為函數(shù)節(jié)點(diǎn),表明此節(jié)點(diǎn)有子節(jié)點(diǎn)(記賬資費(fèi)或子記賬資費(fèi)),;“2:add”中的2代表節(jié)點(diǎn)類型,,add代表函數(shù),表示子節(jié)點(diǎn)之間的關(guān)系,,其中“add”表示子節(jié)點(diǎn)之間為疊加關(guān)系,,執(zhí)行左節(jié)點(diǎn)后又執(zhí)行右節(jié)點(diǎn),經(jīng)過(guò)解析之后,,p.type=2,、p.name=函數(shù)名、p.pl=左子樹(shù),、p.pr=右子樹(shù),。
(2)以“1:”開(kāi)頭,稱之為記賬資費(fèi)節(jié)點(diǎn),,此節(jié)點(diǎn)為葉子節(jié)點(diǎn),,比如:1:name:index:effdate:expdate:type:id分別代表的含義為節(jié)點(diǎn)類型、記賬資費(fèi)名稱,、索引,、開(kāi)始時(shí)間、失效時(shí)間,、業(yè)務(wù)類型,、產(chǎn)品id;表達(dá)式經(jīng)過(guò)解析后p.type=1,、p.name=記賬資費(fèi)名稱,、p.index=索引、p.effData=開(kāi)始時(shí)間,、p.expData=失效時(shí)間,。
(3)以“0:”開(kāi)頭,,稱之為子記賬資費(fèi)節(jié)點(diǎn),此節(jié)點(diǎn)為葉子節(jié)點(diǎn),,比如:0:c1:18258分別代表的含義為節(jié)點(diǎn)類型,、子記賬資費(fèi)名稱、索引,,表達(dá)式經(jīng)過(guò)解析后,,p.type=0、p.name=子記賬資費(fèi)名稱,、p.index=索引,。
根據(jù)記賬資費(fèi)表達(dá)式進(jìn)行批價(jià)處理函數(shù)為favProcess(…char*expression,int sFlag..),,先聲明一個(gè)結(jié)構(gòu)體變量p,,對(duì)表達(dá)式expression進(jìn)行解析并將相關(guān)的信息存放到變量p中,然后根據(jù)p.type和p.name做不同的遞歸調(diào)用,。
(1)當(dāng)p.type=2,、p.name=mut:若favProcess(…p.pl,int sFlag..)的返回值不等于0時(shí),,整個(gè)函數(shù)返回整個(gè)返回值,;否則返回favProcess(..p.pr,int sFlag..),;當(dāng)p.name=add、min,、max或者mad時(shí)進(jìn)行不同方式的遞歸調(diào)用,。
(2)當(dāng)p.type=1時(shí),根據(jù)p.index從局?jǐn)?shù)據(jù)中獲取名為p.name記賬資費(fèi)的子記賬資費(fèi)的組合表達(dá)式billpalnexp,,然后遞歸執(zhí)行favProcess(…billpalnexp,,int sFlag..)。
(3)當(dāng)p.type=0時(shí),,根據(jù)p.index從局?jǐn)?shù)據(jù)中獲取名為p.name的子記賬資費(fèi)的詳細(xì)信息,,生成子記賬資費(fèi)費(fèi)率計(jì)劃對(duì)象T_PP_SubPrcPLAN*pSubBillPlan并調(diào)用函數(shù)execSubBillPlan(…expnod.name…,pSubBillPlan,,…),,再將其返回值作為favProcess的返回值;執(zhí)行execSubBillPlan的過(guò)程實(shí)際上就是調(diào)用優(yōu)惠零件的過(guò)程,。
3.2 優(yōu)惠零件調(diào)用
因?yàn)閮?yōu)惠模板種類太多,,挑出其中最基本的cFavBase、cFav000,、cFav001和cFav002作為示例,,類關(guān)系如圖6所示,,圖中,類cFavBase是所有優(yōu)惠零件的基類,,每個(gè)具體的優(yōu)惠零件都由它派生出來(lái),,并實(shí)現(xiàn)其中參數(shù)初始化和優(yōu)惠過(guò)程的接口;cFav000是cFavBase的子類,,它是對(duì)費(fèi)用對(duì)象賦值的最基本的優(yōu)惠零件,,所有優(yōu)惠零件最后都?xì)w結(jié)為對(duì)此優(yōu)惠零件的調(diào)用;cFav001是基本打折類優(yōu)惠零件,;cFav002是簡(jiǎn)單優(yōu)惠分段優(yōu)惠零件,。
調(diào) 用exeSubBillPlan(cFeeObj*pFeeObj…T_PP_ SubPrcPLAN *pSubBillPlan…)函數(shù)時(shí),實(shí)際上是根據(jù)子記賬資費(fèi)調(diào)用優(yōu)惠零件進(jìn)行批價(jià)處理,。不同的子記賬資費(fèi)的優(yōu)惠零件模板可能不一樣,,但是它們的核心處理過(guò)程process最終都會(huì)調(diào)用最簡(jiǎn)單的優(yōu)惠零件(cFav000)的處理函數(shù)。下面以簡(jiǎn)單分段優(yōu)惠零件組合為例,,闡述優(yōu)惠零件的調(diào)用過(guò)程,,圖7為一個(gè)簡(jiǎn)單分段優(yōu)惠的子記賬資費(fèi)的參數(shù)列表。
(1)創(chuàng)建優(yōu)惠零件cFavBase*p=new cFav001<cFav002<cFav000,,cFav000>>:創(chuàng)建零件時(shí),,cFav002< cFav000,cFav000>將被實(shí)例化作為cFav001的成員T* pFavBase,;同時(shí)cFav000和cFav000分別實(shí)例化為T1* pltFavBase(小于等于閾值ThresholdVal用到的具體的優(yōu)惠零件)和T2*pgtFavBase(大于閾值ThresholdVal用到的具體的優(yōu)惠零件),。
(2)參數(shù)初始化p->initPara():從子記賬資費(fèi)參數(shù)中讀出conditionCode和bill_rebill_flag,然后調(diào)用cFav002<cFav000,,cFav000>(pFavBase)的初始化操作,,讀出其中的ThresholdVal、Thresholdtype,、feetype和unit,,同時(shí)調(diào)用兩個(gè)cFav000(pltFavBase和pgtFavBase)的初始化操作,將前綴lt和gt的參數(shù)項(xiàng)分別賦值給pltFavBase和pgtFavBase,。
(3)優(yōu)惠過(guò)程p->process():首先獲取話單的相關(guān)條件信息(如通話類型,,漫游類型,對(duì)端類型,,費(fèi)用類型等)和標(biāo)批二批標(biāo)識(shí),,然后與子記賬中conditionCode限制的相關(guān)條件信息進(jìn)行匹配,若匹配失敗則返回0,;若成功,,繼續(xù)調(diào)用cFav002<cFav000,cFav000>(pPavBase)的優(yōu)惠過(guò)程,,根據(jù)話單中的計(jì)費(fèi)量與閾值的關(guān)系,,最終調(diào)用cFav000的優(yōu)惠過(guò)程,,即將feetype、value,、unit,、favortype等值傳遞給費(fèi)用對(duì)象feeObj,讓其負(fù)責(zé)最后費(fèi)用的計(jì)算,。
本文通過(guò)對(duì)移動(dòng)計(jì)費(fèi)系統(tǒng)批價(jià)優(yōu)惠業(yè)務(wù)的分析,,提出了一種基于語(yǔ)法樹(shù)的優(yōu)惠方法并使用面向?qū)ο笳Z(yǔ)言C++的模板類設(shè)計(jì)了語(yǔ)法樹(shù)的解析和調(diào)用過(guò)程,構(gòu)建優(yōu)惠語(yǔ)法樹(shù)實(shí)現(xiàn)多套餐的疊加優(yōu)惠,,調(diào)用配置好的優(yōu)惠零件使得程序具有更高的靈活性,。該方法實(shí)現(xiàn)了各種復(fù)雜的優(yōu)惠邏輯組合,可以支撐靈活的市場(chǎng)營(yíng)銷策略,,提高了計(jì)費(fèi)系統(tǒng)的支撐能力,,在理論和實(shí)踐上給出了一個(gè)電信行業(yè)計(jì)費(fèi)系統(tǒng)應(yīng)用中的解決方案。
參考文獻(xiàn)
[1] 陳龍,,張春紅,,云亮,等.電信運(yùn)營(yíng)支撐系統(tǒng)[M].北京:人民郵電出版社,,2007.
[2] 倪然.融合計(jì)費(fèi):全業(yè)務(wù)運(yùn)營(yíng)的必由之路[J].通訊世界,,2008(11):88.
[3] 劉全.內(nèi)存數(shù)據(jù)庫(kù)在帳務(wù)后臺(tái)中的應(yīng)用[D].南京:南京理工大學(xué),2004.
[4] LAFORE R. C++面向?qū)ο蟪绦蛟O(shè)計(jì)[M].鄧子梁譯.北京:中國(guó)電力出版社,,2004.