羅琴華 馬 櫟(中國郵政集團(tuán)公司江西省分公司數(shù)據(jù)中心 江西 南昌 33005)(江西工業(yè)職業(yè)技術(shù)學(xué)院機(jī)電工程分院 江西 南昌 33009)
各家銀行開辦了代理委托方收費(fèi)的中間業(yè)務(wù),通過自建中間業(yè)務(wù)平臺(tái)來代理委托方收付費(fèi)。由于委托方眾多,中間業(yè)務(wù)具有業(yè)務(wù)種類繁多、處理方式各異、接口復(fù)雜多變、交易流程各不相同等特點(diǎn)。大多銀行采用結(jié)構(gòu)化開發(fā)方法開發(fā)中間業(yè)務(wù)平臺(tái)軟件,不利于軟件重用,存在開發(fā)周期長(zhǎng)、進(jìn)度和成本難以控制等問題[5]。
本文以江西省郵儲(chǔ)銀行中間業(yè)務(wù)平臺(tái)建設(shè)為背景開展研究。平臺(tái)要實(shí)現(xiàn)電信、移動(dòng)、聯(lián)通等通信運(yùn)營(yíng)商代收費(fèi),水電煤等公共事業(yè)費(fèi),以及有線電視費(fèi)、汽車票、稅款等各類代收費(fèi),業(yè)務(wù)種類近二十種,委托方涉及三十多家。若采用結(jié)構(gòu)化開發(fā)方法,完成一家委托方業(yè)務(wù)的開發(fā)及上線至少需要1個(gè)半月,那么三十多家委托方業(yè)務(wù)全部完成則需要兩年多時(shí)間。
如何最大化的兼容各類中間業(yè)務(wù),無需軟件開發(fā)或少量開發(fā)即可新增一項(xiàng)中間業(yè)務(wù),這是迫切需要解決的問題。本文提出基于組件的軟件開發(fā)方法[5]來建設(shè)郵儲(chǔ)銀行中間業(yè)務(wù)平臺(tái)。將中間業(yè)務(wù)交易處理流程各環(huán)節(jié)拆分成一個(gè)個(gè)組件,通過接口、組件配置實(shí)現(xiàn)不同業(yè)務(wù)的個(gè)性定義。然后平臺(tái)采用流程驅(qū)動(dòng)引擎從流程配置中依次讀取業(yè)務(wù)交易流程的各個(gè)環(huán)節(jié),從而完成一個(gè)完整交易處理。
中間業(yè)務(wù)的多樣性造就了各業(yè)務(wù)處理流程和處理內(nèi)容的多變性[8]。針對(duì)各業(yè)務(wù)處理流程的多變性進(jìn)行分析,可將業(yè)務(wù)處理流程拆分為一個(gè)個(gè)執(zhí)行環(huán)節(jié),分別對(duì)應(yīng)各個(gè)組件。針對(duì)各業(yè)務(wù)處理內(nèi)容的多變性進(jìn)行分析,抽象出共性與個(gè)性化特性,將共性封裝入組件,個(gè)性通過接口、組件配置實(shí)現(xiàn)個(gè)性化處理。各個(gè)組件之間的數(shù)據(jù)傳輸則采用接口、數(shù)據(jù)總線等方式傳輸,從而支持通過流程配置實(shí)現(xiàn)對(duì)業(yè)務(wù)組件的即插即用。
中間業(yè)務(wù)根據(jù)處理方式可分為信息管理類、現(xiàn)金代收類、卡折代收類、批量代發(fā)類、批量代扣類、聯(lián)機(jī)代收類、脫機(jī)代收類等。根據(jù)委托方可分為電信、移動(dòng)、聯(lián)通、電力、水業(yè)、煤氣、汽運(yùn)等代收費(fèi),根據(jù)接入渠道可分為網(wǎng)點(diǎn)、網(wǎng)上銀行、便民服務(wù)站等渠道繳費(fèi)。通過對(duì)各類業(yè)務(wù)分析,可從以下五個(gè)視角描述中間業(yè)務(wù):
? 交易發(fā)起方:分網(wǎng)點(diǎn)終端發(fā)起、網(wǎng)銀等各類渠道發(fā)起、委托方發(fā)起、中間業(yè)務(wù)后臺(tái)發(fā)起等。
? 交易時(shí)與委托方的連接:實(shí)時(shí)、非實(shí)時(shí)。
? 客戶辦理方式:現(xiàn)金、賬戶折/卡。
? 數(shù)據(jù)來源:終端輸入、來自委托方傳入、自有數(shù)據(jù)。
? 交易處理方式:?jiǎn)喂P、批量。
通過這五個(gè)視角的排列組合,至少排列出31種可能的交易,如終端發(fā)起實(shí)時(shí)單筆現(xiàn)金交易、委托方發(fā)起實(shí)時(shí)單筆賬戶交易等,基本可涵蓋中間業(yè)務(wù)的各類交易。因此將五個(gè)視角涵蓋的內(nèi)容轉(zhuǎn)化為標(biāo)識(shí)代碼,采用業(yè)務(wù)標(biāo)識(shí)+交易代碼來唯一標(biāo)識(shí)各項(xiàng)中間業(yè)務(wù)交易。業(yè)務(wù)標(biāo)識(shí)代表委托方,由區(qū)域代碼+委托方代碼組成,區(qū)域代碼6位,如全省統(tǒng)一業(yè)務(wù)的區(qū)域代碼設(shè)為‘999999’,南昌地區(qū)業(yè)務(wù)的區(qū)域代碼設(shè)為‘360100’等;委托方代碼4位,如電信設(shè)為‘X001’,聯(lián)通設(shè)為‘X002’等。因此‘360100X001’就代表代收南昌電信話費(fèi)業(yè)務(wù)。交易代碼由10位組成,通過交易代碼每一位含義的定義,涵蓋所有交易種類。命名規(guī)則如下:
1) 第1、2位固定為TR。
2) 第3位表示交易發(fā)起方,‘1’:終端或前置發(fā)起;‘2’:委托方發(fā)起;‘3’:中間業(yè)務(wù)后臺(tái)發(fā)起;‘4’:儲(chǔ)蓄主機(jī)發(fā)起。
3) 第4位為渠道接入方式,‘0’:無接入方式;‘1’:終端;‘2’:電話銀行;‘3’:ATM;‘4’:POS;‘5’:自助終端。
4) 第5位為代收付區(qū)分,‘1’:代收;‘2’:代付;‘3’:代理;‘4’:代售;‘5’:國債。
5) 第6、7位為交易種類,‘0x’:查詢類;‘1x’:繳費(fèi)類;‘2x’:兌付類;‘3x’:打印信息類;‘4x’:操作員管理類;‘5x’:空白憑證管理類;‘6x’:加辦/撤消類;‘8x’:管理通知類;‘9x’:特殊處理類。其中x為順序號(hào),為0~Z的數(shù)字或字母。
6) 第8位表示取消區(qū)分,‘0’:正常;‘1’:取消;‘2’:更正;‘3’:沖正;‘4’:恢復(fù);‘5’:重發(fā);‘6’:調(diào)整成功;‘7’:調(diào)整失敗。
7) 第9位表示資金種類,‘0’:無資金種類;‘1’:現(xiàn)金;‘2’:支票;‘3’:存折;‘4’:卡。
8) 第10位:擴(kuò)展。
根據(jù)交易代碼定義,可定義出各類交易,如網(wǎng)點(diǎn)的查詢交易為‘TR11100000’,繳費(fèi)交易為‘TR11110010’。將業(yè)務(wù)標(biāo)識(shí)+交易代碼作為接口參數(shù)傳入組件,從而可在組件中封裝入對(duì)不同業(yè)務(wù)、不同種類交易的各自處理,實(shí)現(xiàn)組件復(fù)用。
分析各類交易的處理流程,對(duì)流程進(jìn)行拆分。如網(wǎng)點(diǎn)終端發(fā)起的查詢交易(涵蓋代收通信資費(fèi)、代收水電費(fèi)等各類中間業(yè)務(wù)的查詢交易),可將一筆交易拆分成終端數(shù)據(jù)輸入、數(shù)據(jù)檢查、發(fā)往委托方報(bào)文、接收委托方報(bào)文、數(shù)據(jù)更新、終端輸出等各個(gè)執(zhí)行環(huán)節(jié)。而網(wǎng)點(diǎn)終端發(fā)起的繳費(fèi)交易則比查詢交易要多一個(gè)單據(jù)打印的環(huán)節(jié),以實(shí)現(xiàn)發(fā)票打印功能。從委托方發(fā)起的中間業(yè)務(wù)交易(如電信發(fā)起的扣繳話費(fèi)),則可拆分成接收委托方報(bào)文、數(shù)據(jù)檢查、發(fā)往儲(chǔ)蓄主機(jī)扣款、數(shù)據(jù)更新、發(fā)往委托方報(bào)文等執(zhí)行環(huán)節(jié)。
各類交易皆按上述方法拆分,可看到大部分交易都存在一些相同的執(zhí)行環(huán)節(jié)。通過提取共性,將各類交易的相同執(zhí)行環(huán)節(jié)對(duì)應(yīng)封裝成一個(gè)組件,使得每個(gè)執(zhí)行環(huán)節(jié)對(duì)應(yīng)一個(gè)組件,從而通過對(duì)組件的拼裝即可組織出各類交易。
組件是能完成特定功能并且相對(duì)獨(dú)立的代碼模塊[8],具有明確的功能定義和訪問接口。如終端數(shù)據(jù)輸入組件:負(fù)責(zé)處理各類業(yè)務(wù)的數(shù)據(jù)輸入,并將數(shù)據(jù)存儲(chǔ)入數(shù)據(jù)總線等;數(shù)據(jù)檢查組件:檢查各類業(yè)務(wù)輸入數(shù)據(jù)的合法性、有效性等,根據(jù)不同種類交易進(jìn)行相關(guān)數(shù)據(jù)準(zhǔn)備。組件訪問接口如下:通過業(yè)務(wù)標(biāo)識(shí)+交易代碼參數(shù)唯一標(biāo)識(shí)一項(xiàng)交易,從而在組件中可針對(duì)不同的交易做出對(duì)應(yīng)的處理。
typedef int (*comfunc_ft)(
//組件訪問接口
char *szBusinessID,
//業(yè)務(wù)標(biāo)識(shí)
char *szTransID,
//交易代碼
char *szEnterpriseID,
//企業(yè)碼
char *szSequenceNum
//Com序列號(hào)
);
組件設(shè)計(jì)需要充分考慮組件獨(dú)立性,采用面向?qū)ο蟮乃枷耄龅綌?shù)據(jù)和操作的緊密結(jié)合。為了減少業(yè)務(wù)數(shù)據(jù)在組件之間的傳遞,提高效率,同時(shí)也為了組件流程的可配置化,平臺(tái)采用數(shù)據(jù)總線的方式實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)在各組件之間共享[8]。即組件1從數(shù)據(jù)總線中讀取數(shù)據(jù),做完相應(yīng)的數(shù)據(jù)處理后再寫回?cái)?shù)據(jù)總線,緊接著組件2也是從數(shù)據(jù)總線中讀取、處理后寫回。下面以數(shù)據(jù)檢查組件為例來闡述組件的設(shè)計(jì)方法。
? 組件名稱:TermInCheck。
? 組件描述:終端輸入電文檢查。
? 接口參數(shù):pBusinessID、pTransID、iSequenceNum。
? 使用范圍:應(yīng)用于終端發(fā)起的單筆交易。
? 使用總線數(shù)據(jù):
此組件使用了交易局號(hào)(tb_tr_midsite)、交易日期(tb_tr_midsys)、網(wǎng)點(diǎn)IP地址、操作員ID、原交易流水號(hào)(取消/更正交易)、原交易日期(取消/更正/沖正交易),結(jié)算局號(hào)。
? 功能概述:
1) 用GetStructData 函數(shù)從數(shù)據(jù)總線上讀網(wǎng)點(diǎn)機(jī)構(gòu)tb_tr_midsite數(shù)據(jù),檢查網(wǎng)點(diǎn)運(yùn)行狀態(tài),終端運(yùn)行標(biāo)志,營(yíng)業(yè)時(shí)間,如設(shè)定了IP地址綁定檢查IP地址。
2) 交易代碼pTransID第6位為‘1’or‘2’or‘6’(即繳費(fèi)類、兌付類、加辦/撤銷類交易)時(shí),獲取賬務(wù)交易日志ZJRZ總線數(shù)據(jù),否則(即查詢類等交易),獲取非賬務(wù)交易日志ZJNRZ總線數(shù)據(jù)。
3) 若業(yè)務(wù)標(biāo)識(shí)pBusinessID不為全零(即涉及委托方業(yè)務(wù)),進(jìn)行委托方信息檢查:檢查委托方運(yùn)行狀態(tài)是否開啟,交易日期是否在范圍內(nèi)等。
4) 交易代碼pTransID第6位為‘1’or‘2’(即繳費(fèi)類、兌付類交易)時(shí),ZJRZ總線的實(shí)繳金額FM0001應(yīng)大于等于應(yīng)繳金額FM0019。
5) 當(dāng)交易代碼pTransID第8位為‘1’or‘2’or‘3’(即取消/沖正/更正類交易),則進(jìn)行原交易信息檢查,檢查原交易應(yīng)存在且業(yè)務(wù)標(biāo)識(shí)、代辦號(hào)碼、交易金額等重要信息應(yīng)正確。
從上述組件功能概述可以看出,組件通過傳入的業(yè)務(wù)標(biāo)識(shí)、交易代碼等參數(shù),針對(duì)各類交易做出對(duì)應(yīng)的處理,實(shí)現(xiàn)組件通用。
不同委托方的相同交易,比如都是查詢交易,雖然交易流程相同,但與不同的委托方交互的數(shù)據(jù)內(nèi)容及傳輸格式都各不相同,終端輸入的內(nèi)容、單據(jù)打印的內(nèi)容等也各不相同。這就要求將終端輸入/輸出組件、單據(jù)打印組件、與委托方交互的請(qǐng)求報(bào)文、響應(yīng)報(bào)文等組件開發(fā)成支持可配置化,支持對(duì)數(shù)據(jù)內(nèi)容、與委托方報(bào)文格式等業(yè)務(wù)規(guī)則的配置,通過組件配置實(shí)現(xiàn)不同委托方業(yè)務(wù)的數(shù)據(jù)定義。
以終端輸入組件為例,支持輸入項(xiàng)、數(shù)據(jù)格式、數(shù)據(jù)源等配置。圖1是代收聯(lián)通話費(fèi)交易的終端輸入組件的配置內(nèi)容,輸入項(xiàng)有服務(wù)類型、用戶號(hào)碼、用戶姓名、往月欠費(fèi)、預(yù)繳費(fèi)等。這些數(shù)據(jù)項(xiàng)的長(zhǎng)度、顯示形式、存儲(chǔ)在總線中哪個(gè)數(shù)據(jù)源,都通過配置確定,這些配置信息按業(yè)務(wù)存儲(chǔ)在數(shù)據(jù)庫中。終端輸入組件程序設(shè)計(jì)為根據(jù)業(yè)務(wù)標(biāo)識(shí)從數(shù)據(jù)庫中讀取該業(yè)務(wù)的終端輸入配置,根據(jù)配置信息將終端輸入的數(shù)據(jù)內(nèi)容按格式寫入數(shù)據(jù)源定義的數(shù)據(jù)總線DATABUS中。

圖1 代收聯(lián)通話費(fèi)繳費(fèi)交易的終端輸入組件配置
下面展示中間業(yè)務(wù)平臺(tái)的具體軟件實(shí)現(xiàn),以代收聯(lián)通話費(fèi)交易為例。
江西聯(lián)通業(yè)務(wù)標(biāo)識(shí):360000X002,繳費(fèi)交易代碼:TR11110010。圖2是代收聯(lián)通話費(fèi)交易的流程配置。由終端輸入電文、總線數(shù)據(jù)更新、輸入電文檢查、委托方請(qǐng)求電文、委托方響應(yīng)電文、終端憑證打印、存儲(chǔ)總線數(shù)據(jù)、組織返回終端電文等組件構(gòu)成,組織出一筆完整交易。將該交易流程中各個(gè)組件按順序存儲(chǔ)在數(shù)據(jù)庫中,對(duì)終端輸入電文、組織委托方請(qǐng)求電文、解析委托方響應(yīng)電文、組織返回終端電文等組件按聯(lián)通繳費(fèi)交易的數(shù)據(jù)內(nèi)容進(jìn)行配置,并將配置信息存入數(shù)據(jù)庫。運(yùn)行時(shí)流程引擎從數(shù)據(jù)庫中依次讀出組件,在調(diào)用終端輸入電文等組件時(shí)再由組件從數(shù)據(jù)庫讀出組件配置,實(shí)現(xiàn)整個(gè)業(yè)務(wù)處理。

圖2 代收聯(lián)通話費(fèi)交易流程配置
程序?qū)崿F(xiàn)如下:
(1) 組件定義:
/*定義組件接口*/
typedef int (*comfunc_ft)(
char *szBusinessID,
//業(yè)務(wù)標(biāo)識(shí)
char *szTransID,
//交易代碼
char *szEnterpriseID,
//企業(yè)碼
char *szSequenceNum
//Com序列號(hào)
);
/*指針數(shù)組變量初始化*/
#define LEN 1024
static CommFunc_t g_tComFuncArr[LEN]={
{3001,ThirdInParse},
{3002,ThirdOutOrgenize},
……
};
#endif
/*在頭文件中對(duì)組件聲明*/
//{3001 解析委托方響應(yīng)電文組件
int ThirdInParse(char * pBusinessID, char * pTransID, char * pEnterpriseID, char * pSequenceNum);
……
(2) 主程序?qū)崿F(xiàn):
/*流程控制函數(shù)*/
TERMDBSS(TPSVCINFO * rqst)
{
/*1.根據(jù)發(fā)起交易的終端畫面號(hào)讀取業(yè)務(wù)標(biāo)識(shí)、交易代碼、企業(yè)碼*/
if (GetTransId(
szTermPageId,
//IN終端畫面號(hào)
szBusinessId,
//OUT業(yè)務(wù)標(biāo)識(shí)
szTransId,
//OUT交易代碼
szEnterpriseId
//OUT企業(yè)碼
) != 0)
goto err_return;
/*2.按業(yè)務(wù)標(biāo)識(shí)、交易代碼從數(shù)據(jù)庫中讀取流程配置,順序讀出各個(gè)組件*/
if (GetComsInvokeQue(
szBusinessId,
//IN業(yè)務(wù)標(biāo)識(shí)
szTransId,
//IN交易代碼
szEnterpriseId,
//IN企業(yè)碼
&tFlowFuns
//OUT組件數(shù)組
) != 0)
goto err_return;
/*3.按順序執(zhí)行終端輸入電文解析、總線數(shù)據(jù)更新等各組件,完成一筆交易*/
for(i=0; i if(NULL == (ftComFuncHandle= GetComFuncHandle(tFlowFuns.m_tFunArr[i].m_iFunSerials))) //根據(jù)組件編號(hào)取得組件名 goto err_return; /*4.調(diào)用組件函數(shù)進(jìn)行業(yè)務(wù)處理*/ if( (*ftComFuncHandle)( szBusinessId, //業(yè)務(wù)標(biāo)識(shí) szTransId, //交易代碼 szEnterpriseId, //企業(yè)碼 tFlowFuns.m_tFunArr[i].m_szRuleSeq //Com序列號(hào) ) != 0 ) goto err_return; } …… tpreturn(TPSUCCESS, 0, rqst->data,rqst->len, 0); } 在添加新組件時(shí),根據(jù)業(yè)務(wù)需求和組件設(shè)計(jì)原則開發(fā)組件[8]。隨著各類功能的組件越來越豐富,可復(fù)用的組件就越多,后期的軟件開發(fā)工作也就越來越少,從而將中間業(yè)務(wù)軟件開發(fā)工作轉(zhuǎn)變?yōu)閺慕M件庫中挑選合適的組件進(jìn)行組裝的過程[8],實(shí)現(xiàn)新業(yè)務(wù)的快速上線。 本中間業(yè)務(wù)平臺(tái)自上線以來,通過配置化,僅7個(gè)多月即快速實(shí)現(xiàn)代收電信、移動(dòng)、聯(lián)通話費(fèi)、水電費(fèi)、稅費(fèi)、煙草款、代理保險(xiǎn)、小額支付等三十多項(xiàng)業(yè)務(wù)開發(fā)上線,強(qiáng)有力支撐了業(yè)務(wù)發(fā)展。 參 考 文 獻(xiàn) [1] Herzum P,Sims O.基于組件的企業(yè)級(jí)開發(fā)[M].韓柯,譯.北京:機(jī)械工業(yè)出版社,2005:2- 6. [2] 何藝.重慶支付信息綜合服務(wù)系統(tǒng)集中代收付子系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].重慶:重慶大學(xué),2015. [3] 蔡則祥,王艷君.商業(yè)銀行中間業(yè)務(wù)[M].中國金融出版社,2011:112- 113. [4] 孫超.基于GAPS的代收付系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].浙江:浙江工商大學(xué),2015. [5] 黃平.基于組件的軟件開發(fā)方法在金融中間業(yè)務(wù)系統(tǒng)中的應(yīng)用[J].浙江理工大學(xué)學(xué)報(bào),2007,24(4):453- 456. [6] 曹俊,林捷.銀行聯(lián)機(jī)交易系統(tǒng)中通訊前置系統(tǒng)的二次開發(fā)[J].上海應(yīng)用技術(shù)學(xué)院學(xué)報(bào),2013,13(2):139- 142. [7] 趙文晉.銀行中間業(yè)務(wù)繳費(fèi)通平臺(tái)的設(shè)計(jì)和開發(fā)[EB/OL].(2011-07-22).[2016-11-25].http://www.docin.com/p-235047130.html. [8] 馬櫟.基于HP-UNIX 11i操作系統(tǒng)的中間業(yè)務(wù)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].南昌:南昌大學(xué),2007.4 結(jié) 語