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