孫鑫,張翼鶴
(湖北廣播電視研究所,湖北 武漢 430000)
隨著經(jīng)濟(jì)迅速發(fā)展,企業(yè)需處理的報(bào)銷單據(jù)正在迅速增長(zhǎng)[1]。費(fèi)用報(bào)銷由業(yè)務(wù)部門報(bào)賬員發(fā)起報(bào)銷申請(qǐng),業(yè)務(wù)部門領(lǐng)導(dǎo)和財(cái)務(wù)領(lǐng)導(dǎo)進(jìn)行審批,會(huì)計(jì)校驗(yàn)發(fā)票生成憑證、出納支付等工作流組成一個(gè)完整的報(bào)銷流程。在廣電企業(yè)中,由于業(yè)務(wù)部門人員外出特性和對(duì)報(bào)銷財(cái)務(wù)知識(shí)和規(guī)則不了解,頻道部門會(huì)設(shè)置專職報(bào)賬人職位以便集中處理部門報(bào)銷,但也存在報(bào)賬員工作量大、報(bào)銷時(shí)效性低、人力成本高問題。財(cái)務(wù)部門會(huì)計(jì)需要核對(duì)所有的發(fā)票信息是否符合企業(yè)報(bào)銷規(guī)定,去國(guó)家稅務(wù)總局全國(guó)增值稅發(fā)票平臺(tái)查驗(yàn)發(fā)票真假性,判定重復(fù)發(fā)票,工作量大。
OCR(Optical Character Recognition) 字符識(shí)別技術(shù)是利用光學(xué)技術(shù)和計(jì)算機(jī)技術(shù)通過檢測(cè)字符每個(gè)像素的暗、亮模式確定其形狀,然后用字符識(shí)別方法將形狀翻譯成計(jì)算機(jī)文字的過程[2]。將OCR圖片識(shí)別技術(shù)應(yīng)用于報(bào)銷系統(tǒng)的票據(jù)管理,通過識(shí)別的發(fā)票信息回寫單據(jù)填報(bào)和設(shè)置規(guī)則進(jìn)行票據(jù)校驗(yàn),有效降低填報(bào)和審核工作難度。移動(dòng)報(bào)銷是將報(bào)銷流程從傳統(tǒng)紙質(zhì)或PC 轉(zhuǎn)移到移動(dòng)終端,使得員工可以在任何地方、任何地點(diǎn)、任何時(shí)間進(jìn)行報(bào)銷審批工作,解決了辦公地點(diǎn)和網(wǎng)絡(luò)限制,提高了報(bào)銷效率[3]。
本文采用Spring-Boot 框架實(shí)現(xiàn)后端服務(wù),F(xiàn)lutter搭建跨平臺(tái)客戶端,OCR票據(jù)識(shí)別實(shí)現(xiàn)智能填報(bào)和票據(jù)自動(dòng)化校驗(yàn),構(gòu)建一套移動(dòng)智能報(bào)銷App 系統(tǒng),替代傳統(tǒng)的代報(bào)賬制度,實(shí)現(xiàn)企業(yè)員工自報(bào)賬,提高效率和實(shí)時(shí)性。同時(shí)與用友NC65 財(cái)務(wù)平臺(tái)打通,作為其中一環(huán)實(shí)現(xiàn)完整財(cái)務(wù)管理流程。
基于Spring-Boot 的移動(dòng)智能報(bào)銷App 分成客戶端、代理層、服務(wù)層和存儲(chǔ)層,具體如圖1。
圖1 系統(tǒng)架構(gòu)圖
1) 客戶端基于Flutter 框架和ant Design 組件庫實(shí)現(xiàn)。Flutter 是一種google 公司在2018 年發(fā)布跨平臺(tái)移動(dòng)UI框架[4],可同時(shí)生成iOS和Android兩個(gè)高性能應(yīng)用程序,實(shí)現(xiàn)移動(dòng)端跨平臺(tái)要求。
2) 代理層采用nginx 和keep-alive 實(shí)現(xiàn)系統(tǒng)的代理和高可用。后端部署兩套系統(tǒng),采用keep-alive 綁定一個(gè)浮動(dòng)IP 到后端入口,nginx 代理控制外網(wǎng)可接觸的接口,減小數(shù)據(jù)暴露面。
3) 后端服務(wù)層基于SpringBoot 框架,與OCR 票據(jù)識(shí)別引擎、國(guó)家稅務(wù)總局全國(guó)增值稅發(fā)票查驗(yàn)平臺(tái)、通知服務(wù)第三方服務(wù)平臺(tái)交互,實(shí)現(xiàn)用戶登錄、智能填報(bào)、移動(dòng)審批、消息通知管理、日志管理、版本更新、流程管理等功能。
4) 存儲(chǔ)分為數(shù)據(jù)存儲(chǔ)和文件存儲(chǔ)。報(bào)銷單據(jù)、票據(jù)信息等結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在Oracle,設(shè)備和用戶關(guān)系、短信驗(yàn)證碼等臨時(shí)信息存儲(chǔ)Redis,文件存儲(chǔ)在NAS云存儲(chǔ)。
客戶端與服務(wù)端之間是通信通過集成VPN完成,采用輕量級(jí)數(shù)據(jù)交換格式JSON[5]進(jìn)行數(shù)據(jù)交換。服務(wù)層與財(cái)務(wù)管理平臺(tái)通過接口調(diào)用完成數(shù)據(jù)交互,云存儲(chǔ)則直接掛載到后端服務(wù)器上進(jìn)行文件管理。
系統(tǒng)登錄在賬號(hào)密碼校驗(yàn)的基礎(chǔ)上增加了雙因子驗(yàn)證[6]。用戶在登錄時(shí)校驗(yàn)賬號(hào)密碼,賬號(hào)密碼校驗(yàn)通過后,檢測(cè)Redis 中是否存在當(dāng)前設(shè)備唯一標(biāo)識(shí)和用戶的關(guān)聯(lián)關(guān)系,若不存在則調(diào)用騰訊云短信發(fā)送接口發(fā)送短信驗(yàn)證碼。短信驗(yàn)證碼校驗(yàn)通過后,在Redis中存儲(chǔ)設(shè)備唯一標(biāo)識(shí)和用戶關(guān)聯(lián)關(guān)系及令牌token,返回token給客戶端完成登錄。用戶手動(dòng)退出會(huì)刪除用戶和設(shè)備關(guān)聯(lián)關(guān)系。
智能填報(bào)分為新建單據(jù)、票據(jù)管理、智能回寫、用戶復(fù)核、單據(jù)校驗(yàn)和單據(jù)提交六步順序依次完成。
2.2.1 新建單據(jù)
用戶登錄移動(dòng)智能報(bào)賬App后,進(jìn)入單據(jù)填報(bào)模塊,選擇需要報(bào)銷的單據(jù)類型,新建報(bào)銷單。新建單據(jù)時(shí),會(huì)根據(jù)當(dāng)前登錄人信息自動(dòng)填寫單據(jù)主體的財(cái)務(wù)組織、單據(jù)時(shí)間、費(fèi)用報(bào)銷單位、費(fèi)用報(bào)銷部門、報(bào)銷人單位、報(bào)銷人部門、報(bào)銷人、收款對(duì)象、收款人、收款銀行賬號(hào)等基本信息,減少用戶填寫字段。
2.2.2 票據(jù)管理
票據(jù)管理分為發(fā)票影像上傳和普通資料上傳。普通資料上傳后,文件直接保存到對(duì)應(yīng)的文件夾位置,文件信息寫入數(shù)據(jù)庫。發(fā)票影像上傳后,會(huì)調(diào)用OCR票據(jù)識(shí)別引擎進(jìn)行票據(jù)識(shí)別,獲得的結(jié)構(gòu)化票據(jù)信息存儲(chǔ)在數(shù)據(jù)庫。OCR 票據(jù)識(shí)別類型包括增值稅專票、增值稅普票、卷票、電子發(fā)票、定額發(fā)票、火車票、飛機(jī)票、汽車票、出租車發(fā)票和過路費(fèi)發(fā)票等,對(duì)于其他無法識(shí)別的票據(jù),支持人工錄入票據(jù)信息。
基于識(shí)別的結(jié)構(gòu)化發(fā)票數(shù)據(jù),根據(jù)會(huì)計(jì)校驗(yàn)發(fā)票規(guī)則,移動(dòng)智能報(bào)銷App實(shí)現(xiàn)自動(dòng)化校驗(yàn)。根據(jù)發(fā)票代碼、發(fā)票號(hào)碼、開票日期、開具金額和校驗(yàn)碼調(diào)用國(guó)家稅務(wù)總局增值稅發(fā)票查驗(yàn)平臺(tái)接口實(shí)現(xiàn)近五年增值稅發(fā)票真假查驗(yàn);通過設(shè)置允許的發(fā)票抬頭實(shí)現(xiàn)鑒別增值稅發(fā)票是否符合企業(yè)報(bào)銷購買方校驗(yàn)規(guī)則;根據(jù)發(fā)票代碼和發(fā)票號(hào)碼在數(shù)據(jù)庫中的信息查詢實(shí)現(xiàn)查重校驗(yàn)實(shí)現(xiàn)發(fā)票不能重復(fù)報(bào)銷校驗(yàn);根據(jù)發(fā)票代碼、發(fā)票號(hào)碼和單據(jù)編號(hào)進(jìn)行發(fā)票連號(hào)校驗(yàn)。發(fā)票校驗(yàn)失敗的單據(jù)無法進(jìn)入審批流程,有效避免無效發(fā)票進(jìn)入報(bào)銷系統(tǒng),提高數(shù)據(jù)準(zhǔn)確性。
2.2.3 智能回寫
根據(jù)上一步進(jìn)行的票據(jù)識(shí)別信息,選擇票據(jù)后將會(huì)自動(dòng)根據(jù)票據(jù)信息生成報(bào)銷明細(xì)和部分表頭信息。自動(dòng)生成支持逐行和合并生成兩種方式,逐行生成則是每個(gè)單據(jù)都會(huì)生成一行報(bào)銷明細(xì),合并生成是將所有票據(jù)信息合并生成一行報(bào)銷信息,適用于不同的報(bào)銷情況。
根據(jù)單據(jù)類型和發(fā)票類型,自動(dòng)生成規(guī)則都不一樣。以票據(jù)和使用最多的差旅費(fèi)報(bào)銷單逐行生成報(bào)銷明細(xì)為例,差旅費(fèi)報(bào)銷單自動(dòng)生成規(guī)則如下:
1) 飛機(jī)票。設(shè)置收支項(xiàng)目為差旅費(fèi),出發(fā)日期和到達(dá)日期等于飛機(jī)票的出發(fā)日期,出發(fā)地點(diǎn)為飛機(jī)票出發(fā)站,到達(dá)地點(diǎn)為飛機(jī)票到達(dá)站,出差人數(shù)為1,交通工具設(shè)置為飛機(jī),交通金額為飛機(jī)票金額,交通費(fèi)不計(jì)稅金額是民航發(fā)展基金和其他稅費(fèi)金額總和,客運(yùn)服務(wù)計(jì)算抵扣稅額等于(交通費(fèi)金額-交通費(fèi)不計(jì)算金額)×0.09,報(bào)銷金額等于交通金額。
2) 火車票。收支項(xiàng)目設(shè)置為差旅費(fèi),出發(fā)日期和到達(dá)日期等于火車票的出發(fā)日期,出發(fā)地點(diǎn)為起點(diǎn)站,到達(dá)地點(diǎn)為終點(diǎn)站,出差人數(shù)為1,交通工具設(shè)置為火車,交通金額為火車金額,交通費(fèi)不計(jì)稅金額為0,客運(yùn)服務(wù)計(jì)算抵扣稅額等于交通費(fèi)金額×0.09,報(bào)銷金額等于交通金額。
3) 汽車票。收支項(xiàng)目設(shè)置為差旅費(fèi),出發(fā)日期和到達(dá)日期等于火車票的出發(fā)日期,出發(fā)地點(diǎn)為始發(fā)地,到達(dá)地點(diǎn)為目的地,出差人數(shù)為1,交通工具設(shè)置為汽車,交通金額為汽車票金額,交通費(fèi)不計(jì)稅金額為0,客運(yùn)服務(wù)計(jì)算抵扣稅額等于交通費(fèi)金額×0.03,報(bào)銷金額等于交通金額。
4) 出租車發(fā)票。收支項(xiàng)目設(shè)置為差旅費(fèi),出發(fā)日期和到達(dá)日期等于出租車票的開票時(shí)間,出發(fā)地和到達(dá)地都為出租車發(fā)票地點(diǎn),交通工具設(shè)置為出租車,交通金額為出租車金額,交通費(fèi)不計(jì)稅金額為0,客運(yùn)服務(wù)計(jì)算抵扣稅額等于0,報(bào)銷金額等于交通金額。
5) 過路費(fèi)發(fā)票。收支項(xiàng)目設(shè)置為差旅費(fèi),出發(fā)日期和到達(dá)日期等于過路費(fèi)時(shí)間,出發(fā)地為高速起始收費(fèi)站,到達(dá)地為高速終止收費(fèi)站,交通工具設(shè)置為自駕車,交通金額為過路費(fèi)金額,交通費(fèi)不計(jì)稅金額為0,客運(yùn)服務(wù)計(jì)算抵扣稅額等于0,報(bào)銷金額等于交通金額。
6) 定額發(fā)票。選中的所有定額發(fā)票金額合計(jì)累加到生成的第一行報(bào)銷明細(xì)的其他費(fèi)用中。
7) 增值稅專票。發(fā)票用途是住宿,則將該增值稅專票金額累加到生成的第一行明細(xì)的住宿費(fèi)用字段;發(fā)票用途是會(huì)議或會(huì)展,收支項(xiàng)目設(shè)置為會(huì)議費(fèi),出發(fā)日期和到達(dá)日期為開票時(shí)間,會(huì)議費(fèi)為發(fā)票金額,專票進(jìn)項(xiàng)稅額等于專票稅額,報(bào)銷金額等于會(huì)議費(fèi);發(fā)票用途包含運(yùn)輸認(rèn)為是網(wǎng)約車票據(jù),收支項(xiàng)目為差旅費(fèi),出發(fā)日期和到達(dá)日期為開票時(shí)間,交通工具是網(wǎng)約車,交通費(fèi)金額為發(fā)票金額,專票進(jìn)項(xiàng)稅額等于專票稅額,報(bào)銷金額等于交通費(fèi)金額;其他的增值稅發(fā)票則累加到生成的第一行報(bào)銷明細(xì)的其他費(fèi)用中。
8) 增值稅普票和卷票:累加到生成的第一行報(bào)銷明細(xì)的其他費(fèi)用。
9) 更新報(bào)銷主體的報(bào)銷金額等于所有報(bào)銷明細(xì)的總金額。
2.2.4 用戶復(fù)核
填報(bào)人員進(jìn)入單據(jù)填報(bào)頁面確認(rèn)單據(jù)填報(bào)信息,主要包括以下方面:一是查看自動(dòng)生成的單據(jù)信息,確認(rèn)其與票據(jù)信息是否存在差異;二是若存在無法從票據(jù)獲取的字段,則人工補(bǔ)充;三是確認(rèn)單據(jù)票據(jù)和附件已正確關(guān)聯(lián);四是若存在借款單關(guān)聯(lián)和金額分?jǐn)偳闆r,填寫沖借款信息和分?jǐn)傂畔ⅰ?/p>
2.2.5 單據(jù)校驗(yàn)
單據(jù)校驗(yàn)是根據(jù)設(shè)置的公式或者內(nèi)部數(shù)據(jù)關(guān)系進(jìn)行單據(jù)校驗(yàn),主要包括系統(tǒng)非空字段檢查、預(yù)算控制檢查、報(bào)銷標(biāo)準(zhǔn)校驗(yàn)等。非空校驗(yàn)單據(jù)字段信息是否完整。預(yù)算控制檢查與NC65財(cái)務(wù)平臺(tái)的預(yù)算中心進(jìn)行數(shù)據(jù)交互,確認(rèn)部門年度和月度報(bào)銷金額是否超過預(yù)算。報(bào)銷標(biāo)準(zhǔn)校驗(yàn)與NC65財(cái)務(wù)平臺(tái)的報(bào)銷標(biāo)準(zhǔn)中心進(jìn)行數(shù)據(jù)交互,確認(rèn)是否滿足企業(yè)設(shè)定的報(bào)銷標(biāo)準(zhǔn)。
2.2.6 單據(jù)提交
復(fù)核和校驗(yàn)無誤后,用戶提交,啟動(dòng)單據(jù)審批流程。單據(jù)提交會(huì)根據(jù)單據(jù)關(guān)聯(lián)票據(jù)數(shù)自動(dòng)回寫附件張數(shù)。
移動(dòng)審核是使用activiti流程引擎完成分層審批。管理員設(shè)定審批流程,單據(jù)根據(jù)類型關(guān)聯(lián)的審批流程完成審批。單個(gè)審批結(jié)點(diǎn)支持操作有批準(zhǔn)、駁回、加簽、改派和收回。批準(zhǔn)即同意,單據(jù)進(jìn)入下一個(gè)審批結(jié)點(diǎn)。駁回是因?yàn)樾畔㈠e(cuò)誤或缺少票據(jù)而移動(dòng)至單據(jù)某個(gè)已審批過的結(jié)點(diǎn),由結(jié)點(diǎn)操作人修改后再次進(jìn)入流程。加簽時(shí)審批人無法確認(rèn)單據(jù)是否符合要求,將對(duì)應(yīng)的確認(rèn)人加入審批中,由加簽人確認(rèn)后審批人再進(jìn)行審核。改派則將單據(jù)轉(zhuǎn)移到他人進(jìn)行審批操作。收回是發(fā)現(xiàn)單據(jù)填寫或?qū)徟д`時(shí)將單據(jù)收歸到自己名下,只有已審批或者報(bào)賬員在后續(xù)審批人員未進(jìn)行審批操作的情況下可收回。
審核時(shí)支持用戶在線查看發(fā)票和附件信息,單據(jù)審批歷史結(jié)點(diǎn)和批語,提供完整的單據(jù)信息供審批人使用。
審批完成的單據(jù)會(huì)通過財(cái)務(wù)管理平臺(tái)設(shè)定的轉(zhuǎn)換關(guān)系自動(dòng)進(jìn)入財(cái)務(wù)管理平臺(tái)的支付系統(tǒng)和憑證模塊,進(jìn)入到財(cái)務(wù)管理下一流程。
單據(jù)在審批流程發(fā)生狀態(tài)改變時(shí)拋出消息事件,消息通知服務(wù)通過監(jiān)聽所有消息事件,由事件驅(qū)動(dòng)向相關(guān)審批人發(fā)送消息通知,同時(shí)消息寫入消息表??蛻舳丝刹榭春筒樵兿ⅲ榭聪?huì)改變消息已讀/未讀狀態(tài)。
系統(tǒng)對(duì)未完成的報(bào)銷審批流程提供督辦功能。用戶在客戶端觸發(fā)流程督辦事件后,根據(jù)被督辦對(duì)象登錄時(shí)寫入的用戶和設(shè)備關(guān)聯(lián)關(guān)系向通知服務(wù)器發(fā)送通知,由通知服務(wù)器下發(fā)到客戶端,客戶端收到通知,彈出通知彈框提醒用戶審批單據(jù)。
通過springboot 的事件分發(fā)和監(jiān)聽機(jī)制實(shí)現(xiàn)異步記錄業(yè)務(wù)操作日志,日志存儲(chǔ)于數(shù)據(jù)庫,提供查詢功能。
通過版本號(hào)實(shí)現(xiàn)客戶端自動(dòng)更新,客戶端登錄時(shí)校驗(yàn)客戶端當(dāng)前版本號(hào),版本號(hào)低于當(dāng)前版本號(hào)且屬于強(qiáng)制更新時(shí),客戶端將強(qiáng)制更新,避免客戶端版本導(dǎo)致的功能出錯(cuò)。
本系統(tǒng)設(shè)計(jì)的數(shù)據(jù)表較多,本文列出票據(jù)OCR結(jié)構(gòu)信息存儲(chǔ)表。
表1 (ocr_info)
移動(dòng)智能報(bào)銷App 的填報(bào)功能實(shí)現(xiàn)如圖2、圖3、圖4。
圖2 報(bào)銷單據(jù)類型列表
圖3 填報(bào)頁面
圖4 票據(jù)導(dǎo)入
在大數(shù)據(jù)浪潮下,企業(yè)費(fèi)用報(bào)銷開始轉(zhuǎn)向移動(dòng)化、智能化、自動(dòng)化方向發(fā)展。移動(dòng)智能報(bào)銷App 利用移動(dòng)端便捷性和人工智能的方法實(shí)現(xiàn)智能填報(bào)、移動(dòng)審核、票據(jù)管理等功能,有效降低填報(bào)復(fù)雜度和財(cái)務(wù)工作量,縮短了審批周期,提高報(bào)銷信息的準(zhǔn)確性和透明性,提高信息共享程度,為推廣個(gè)人報(bào)銷制度提供了基礎(chǔ)和條件,在湖北廣播電視臺(tái)投入使用后,極大地降低了工作量,將進(jìn)一步推廣到臺(tái)集團(tuán)下屬企業(yè)。