王 珂 中國(guó)鐵路上海局集團(tuán)有限公司收入稽查處
鐵路客票售票系統(tǒng)是由鐵道科學(xué)研究院(下稱鐵科院)開(kāi)發(fā)的中國(guó)鐵路客運(yùn)的制票系統(tǒng)。系統(tǒng)采用導(dǎo)出程序?qū)⒚咳諗?shù)據(jù)導(dǎo)出為接口文件,向各局集團(tuán)公司收入部門(mén)、統(tǒng)計(jì)部門(mén)提供客票售票相關(guān)數(shù)據(jù),以協(xié)助相關(guān)單位利用這些數(shù)據(jù)進(jìn)一步開(kāi)展收入審核、統(tǒng)計(jì)、核算等相關(guān)工作。由于網(wǎng)絡(luò)安全需求設(shè)計(jì),客票售票網(wǎng)與鐵路辦公網(wǎng)物理隔斷,鐵科院設(shè)計(jì)、實(shí)施了接口服務(wù)器設(shè)備,每日從客票網(wǎng)向鐵路辦公網(wǎng)轉(zhuǎn)移客票系統(tǒng)接口文件。每天每個(gè)售票站一般會(huì)產(chǎn)生13個(gè)接口文件,分別是車(chē)站售票存根(LS文件)、車(chē)站退票存根(LR文件)、財(cái)收二匯總數(shù)據(jù)(kcs2文件)、財(cái)收四匯總數(shù)據(jù)(kcs4文件)、退票二號(hào)表數(shù)據(jù)(st2文件)、售票二號(hào)表數(shù)據(jù)(sk2文件)、電子客票交易明細(xì)數(shù)據(jù)(SEPAY文件)、卡務(wù)窗口二號(hào)表數(shù)據(jù)(ZT2文件)、卡務(wù)財(cái)收四數(shù)據(jù)(ZT4文件)、閘機(jī)手續(xù)費(fèi)明細(xì)數(shù)據(jù)(ZT1)、售票廢票數(shù)據(jù)(FP數(shù)據(jù))、外站售本站存根(YS文件)、外站退本站存根(YR文件),這些文件是運(yùn)輸收入后續(xù)審核、核算、列賬的基礎(chǔ),有著十分重要的作用。
上海局集團(tuán)公司是全路第一客運(yùn)企業(yè),2018年日均售票量超過(guò)270萬(wàn)張,日均改簽、退票量合計(jì)超3萬(wàn)張。超過(guò)200個(gè)客運(yùn)營(yíng)業(yè)站單日生成的接口文件尺寸約為4 GiB,合計(jì)每月接口文件數(shù)量超過(guò)4萬(wàn)個(gè),總大小超過(guò)120 GiB,記錄總數(shù)超過(guò)1億條。這樣規(guī)模的數(shù)據(jù)量無(wú)論是數(shù)據(jù)文件的存儲(chǔ)、歸檔、使用都有別于傳統(tǒng)的數(shù)據(jù)文件操作,對(duì)實(shí)施人員的技術(shù)水平是一個(gè)不小的考驗(yàn)。
接口文件是收入核算的原始數(shù)據(jù),根據(jù)會(huì)計(jì)法要求,原始憑證應(yīng)妥善保存15年,為了更好地存儲(chǔ)與備份這些基礎(chǔ)信息,收入稽查處建設(shè)了客票系統(tǒng)接口數(shù)據(jù)歸檔服務(wù)器,存放來(lái)自客票接口服務(wù)器的接口文件。
接口文件以車(chē)站電報(bào)碼作為文件擴(kuò)展名,其內(nèi)容是逗號(hào)分隔的文本文件,每一行代表一條記錄。收入處工作人員在電子支付差異核對(duì)、清算數(shù)據(jù)核對(duì)、特殊售票記錄確認(rèn)等特殊情況下需要直接對(duì)接口文件的內(nèi)容進(jìn)行檢索。采用傳統(tǒng)方式檢索,首先確認(rèn)需要查詢的車(chē)站電報(bào)碼,找到對(duì)應(yīng)時(shí)間區(qū)間的接口文件,并通過(guò)FTP軟件下載到本地。隨后,利用EmEditor或UltraEditor等文本編輯器逐個(gè)打開(kāi)文件,利用編輯器的查找功能,查詢文件內(nèi)的內(nèi)容。
傳統(tǒng)的查詢方式有很多弊端,首先,文件在查閱前,需要逐個(gè)找到并利用FTP工具下載到本地,對(duì)于互聯(lián)網(wǎng)售票或虹橋等大站的售票存根來(lái)說(shuō),下載過(guò)程也需要消耗可觀的時(shí)間。其次,接口文件內(nèi)容以逗號(hào)分隔,利用文本編輯工具打開(kāi)后數(shù)據(jù)緊密排列在一起,沒(méi)有分列顯示,也沒(méi)有字段說(shuō)明,要分析某條數(shù)據(jù),需要依靠人工經(jīng)驗(yàn)并花費(fèi)大量的時(shí)間。最后,檢索工作依賴人工,只能逐個(gè)打開(kāi)查詢,無(wú)法并行檢索,文件數(shù)量大時(shí),檢索相應(yīng)的數(shù)據(jù)需要花費(fèi)大量的精力和時(shí)間,效率很低。
鑒于以上問(wèn)題,本人設(shè)計(jì)并開(kāi)發(fā)了“客票售票系統(tǒng)接口數(shù)據(jù)速查程序”下稱速查程序),程序在規(guī)劃、分析時(shí),著重考慮了以下幾點(diǎn)需求:
(1)跨單位跨時(shí)間段信息通查需求
考慮到信息檢索工作常常需要檢索多個(gè)單位某個(gè)時(shí)間范圍內(nèi)所有的數(shù)據(jù)存根,程序應(yīng)實(shí)現(xiàn)跨單位、跨時(shí)間段信息檢索功能。舉例來(lái)說(shuō),2018年10月份香港跨境高鐵運(yùn)行后,為核對(duì)跨境高鐵收入,收入處審核部希望檢索11月全局范圍內(nèi)所有車(chē)站發(fā)售的G99次列車(chē)車(chē)票,檢索條件是有發(fā)站或到站為“香港西九龍”的售票和退票記錄。這是一個(gè)典型的多站多時(shí)間點(diǎn)的通查要求,數(shù)據(jù)分布在全月12 000多個(gè)接口文件中,通過(guò)傳統(tǒng)手工查詢很難實(shí)現(xiàn)。
(2)并行高速信息查詢需求
在上述信息檢索工作的例子中,12000多個(gè)文件的檢索過(guò)程需要控制在合理的時(shí)間范圍內(nèi),具體來(lái)說(shuō),就是需要客票接口文件速查程序能夠發(fā)揮服務(wù)器主機(jī)多處理器、大內(nèi)存、高速存儲(chǔ)的優(yōu)勢(shì),以并行執(zhí)行的方式對(duì)不同的數(shù)據(jù)文件同時(shí)進(jìn)行地檢索,從而最大程度地減少信息檢索所消耗的時(shí)間。
(3)接口文件格式可擴(kuò)展性需求
隨著客運(yùn)業(yè)務(wù)的不斷變化、客票售票系統(tǒng)的不斷升級(jí),接口文件的格式也在不斷地改變。這就要求速查程序不能對(duì)接口文件的格式硬編碼,需要提供某種方案,讓程序能夠適應(yīng)未來(lái)可能產(chǎn)生的改變。舉例來(lái)說(shuō),鐵路開(kāi)展電子支付業(yè)務(wù)后,售票存根接口增加了電子支付相關(guān)的幾個(gè)數(shù)據(jù)字段,記錄相應(yīng)信息,旅客乘意險(xiǎn)業(yè)務(wù)上線后,接口格式中又加入了乘意險(xiǎn)相關(guān)的幾個(gè)數(shù)據(jù)字段。自客票售票系統(tǒng)投入使用以來(lái),售票接口存根已經(jīng)從最初的50列左右逐步擴(kuò)展為現(xiàn)在的74列,可以預(yù)見(jiàn)的是,這樣的改變今后仍然會(huì)不斷發(fā)生。
(4)SQL語(yǔ)言輸入智能感知需求
接口數(shù)據(jù)文件是具有一定的格式,可以按列進(jìn)行區(qū)分顯示。速查程序最佳的設(shè)計(jì)方案是兼容結(jié)構(gòu)化查詢語(yǔ)言SQL,采用數(shù)據(jù)表的方式,對(duì)數(shù)據(jù)文件進(jìn)行檢索。兼容SQL語(yǔ)言查詢具有顯著的優(yōu)勢(shì),首先,查詢結(jié)果以列表顯示,十分直觀;其次,SQL具有豐富的函數(shù)庫(kù),功能強(qiáng)大;最后,利用SQL的where子句可自由定義查詢條件,實(shí)現(xiàn)檢索條件的邏輯組合以及模糊查詢,非常靈活。
接口文件檢索程序兼容SQL語(yǔ)言的好處顯而易見(jiàn),但仍需要解決一些細(xì)節(jié)問(wèn)題。舉例來(lái)說(shuō),站售客票接口文件有74列,在寫(xiě)SQL的where條件時(shí),明確具體哪一列是什么數(shù)據(jù)類(lèi)型,代表什么意思,就成了一個(gè)非常繁瑣的問(wèn)題。程序需要實(shí)現(xiàn)編程IDE環(huán)境中類(lèi)似Intellisese的功能,對(duì)用戶的輸入進(jìn)行智能感知,給出用戶列名、含義相關(guān)提示,以方便用戶編寫(xiě)SQL語(yǔ)句。
可擴(kuò)展標(biāo)記語(yǔ)言XML,是一種常用的描述性語(yǔ)言。速查程序利用XML語(yǔ)言,對(duì)接口文件的定義、文件中各列的定義進(jìn)行了描述(如圖1)。接口定義XML文件中,一個(gè)File節(jié)描述了一個(gè)接口文件的類(lèi)型、代碼、字段數(shù)量等基本屬性,其下?lián)碛卸鄠€(gè)Column節(jié),分別描述了不同列的名稱、數(shù)據(jù)類(lèi)型等列的基本屬性。接口文件速查程序根據(jù)XML文件中的定義,“理解”各個(gè)接口文件及文件中的內(nèi)容,并據(jù)此將文件檢索結(jié)果展示為數(shù)據(jù)表,以方便最終用戶檢索。
圖1 XML文件描述接口格式
歸檔服務(wù)器中不同時(shí)間段的接口文件按月創(chuàng)建文件夾歸檔存放,當(dāng)月的文件在沒(méi)有歸檔前,存放在默認(rèn)目錄中。在執(zhí)行查詢之前,需要首先確認(rèn)對(duì)應(yīng)的數(shù)據(jù)文件是否存在,存放位置是否默認(rèn)目錄,Oracle數(shù)據(jù)庫(kù)中對(duì)這一目錄是否已經(jīng)創(chuàng)建了目錄對(duì)象,Oracle用戶對(duì)數(shù)據(jù)文件是否有讀權(quán)限。極端特殊的情況是,一些小站如果某些日期沒(méi)有發(fā)生客票售票業(yè)務(wù),將不會(huì)生成對(duì)應(yīng)的接口文件,在這樣的情況下,程序?qū)⑼ㄟ^(guò)SSH協(xié)議訪問(wèn)歸檔服務(wù)器的操作系統(tǒng),檢測(cè)到不存在的數(shù)據(jù)文件,并詢問(wèn)執(zhí)行者是否繼續(xù)進(jìn)行檢索。
Oracle數(shù)據(jù)庫(kù)的外部表功能,可以借助數(shù)據(jù)庫(kù)引擎以表的方式訪問(wèn)平面文件(文本文件),同時(shí),利用外部表直接檢索歸檔服務(wù)器上的接口文件還避免了文件傳輸?shù)奖镜赜?jì)算機(jī)的過(guò)程,節(jié)省了大量的時(shí)間。Oracle支持以數(shù)據(jù)泵Data-Pump引擎或加載器Sqlldr引擎兩種方式定義外部表訪問(wèn)平面文件。sqlldr引擎具有速度快的優(yōu)勢(shì),被選擇作為速查程序使用的解決方案。使用外部表檢索需要做一系列前期準(zhǔn)備工作,速查程序負(fù)責(zé)自動(dòng)將前期所有工作配置妥當(dāng),無(wú)需檢索用戶參與,以降低操作難度。
Oracle數(shù)據(jù)庫(kù)支持并行操作,具體來(lái)說(shuō)是由一組parallel初始化參數(shù)控制了整個(gè)數(shù)據(jù)庫(kù)環(huán)境的并行操作執(zhí)行的過(guò)程。速查程序使用Oracle系統(tǒng)的自動(dòng)并行度,由數(shù)據(jù)庫(kù)根據(jù)操作系統(tǒng)資源使用的情況配置并行計(jì)算使用的資源,這是一個(gè)比較理想的選擇,可以減少由于客戶端“超配”產(chǎn)生的“過(guò)勞”排隊(duì)或其他等待。速查程序通過(guò)對(duì)用戶提交的SQL進(jìn)行改寫(xiě),在語(yǔ)法中增加Parallel相關(guān)的提示,指導(dǎo)Oracle數(shù)據(jù)庫(kù)在查詢時(shí)采用并行方式執(zhí)行,從而最大程度節(jié)省檢索時(shí)間,提高效率。
為了方便用戶SQL語(yǔ)句編寫(xiě)的過(guò)程,速查程序開(kāi)發(fā)了智能感知輸入提示功能,隨著用戶的鍵入過(guò)程,系統(tǒng)不斷跟蹤分析用戶的輸入,對(duì)用戶輸入的內(nèi)容進(jìn)行輔助列表提示(如圖2),智能匹配用戶的輸入。提示列表告知用戶字段名稱及其代表的含義、取值范圍等信息,用戶選中想要的條目,按Tab鍵直接補(bǔ)齊余下的字符,十分方便快捷。
圖2 智能感知輸入提示
系統(tǒng)執(zhí)行流程如圖3所示,用戶首先選擇所需查詢的車(chē)站列表,確認(rèn)數(shù)據(jù)的類(lèi)型和時(shí)間區(qū)間。在select文本框中編輯SQL的select子句,在where文本框中編輯選擇條件,點(diǎn)擊【查詢接口文件】按鈕。系統(tǒng)首先判斷對(duì)應(yīng)的文件是否存在,文件所在目錄是否創(chuàng)建的目錄對(duì)象,然后為每個(gè)數(shù)據(jù)文件創(chuàng)建對(duì)應(yīng)的外部表對(duì)象,最后對(duì)用戶輸入的SQL片段進(jìn)行語(yǔ)法分析,改寫(xiě)、組合成為最終的SQL語(yǔ)句,提交給Oracle服務(wù)器執(zhí)行查詢,并取得最終的查詢結(jié)果。
圖3 軟件執(zhí)行流程
程序投入使用后,大幅度簡(jiǎn)化了接口文件數(shù)據(jù)查詢的過(guò)程,有效提高了相關(guān)工作的效率和精度。經(jīng)測(cè)算,對(duì)上海虹橋及上海站一旬20個(gè)客票存根接口文件進(jìn)行遍歷搜索,查找所有發(fā)售的G99次列車(chē)車(chē)票存根,耗時(shí)約為2 min,時(shí)間經(jīng)濟(jì)性顯著。
綜上,接口文件是應(yīng)用系統(tǒng)之間數(shù)據(jù)交換的一種常用方式,利用SSH服務(wù)結(jié)合Oracle外部表、并行查詢、XML等技術(shù)設(shè)計(jì)的接口文件速查應(yīng)用程序有著靈活的可擴(kuò)展性和優(yōu)異的性能表現(xiàn),是解決類(lèi)似問(wèn)題優(yōu)良的解決方案,希望本文的闡述可以為類(lèi)似需求的應(yīng)用程序設(shè)計(jì)提供有益的啟示。