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