專利名稱:一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的方法、裝置及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計算機領(lǐng)域,尤其涉及一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的方法、裝置及系統(tǒng)。
背景技術(shù):
企業(yè)的各種業(yè)務(wù)之間存在一定的邏輯關(guān)系,而且這種邏輯關(guān)系在不同企業(yè)或企業(yè) 的不同時期是不同的,體現(xiàn)在管理軟件中就是一種業(yè)務(wù)單據(jù)的數(shù)據(jù),是根據(jù)另一業(yè)務(wù)單據(jù) 的數(shù)據(jù)得來的,比如收款一般都是根據(jù)開票的金額決定的;發(fā)票或收款的金額需要做賬生 成憑證等。 單據(jù)轉(zhuǎn)換功能在ERP系統(tǒng)中已經(jīng)開始發(fā)揮越來越重要的作用,在單據(jù)轉(zhuǎn)換的過程 中,由于單據(jù)轉(zhuǎn)換產(chǎn)生的目標(biāo)業(yè)務(wù)單據(jù)與源業(yè)務(wù)單據(jù)之間存在著一定的業(yè)務(wù)邏輯關(guān)系,如 果目標(biāo)業(yè)務(wù)單據(jù)被修改,則源業(yè)務(wù)單據(jù)對應(yīng)的字段也要同步修改,通常稱之為反寫源單,這 種反寫源單往往不僅是簡單的字段賦值操作,而是需要對目標(biāo)業(yè)務(wù)單據(jù)的字段值進(jìn)行一定 的邏輯運算后,才能將結(jié)果反寫到源單,具體可以通過生成公式腳本來配置相應(yīng)的業(yè)務(wù)邏 輯來制定相應(yīng)的轉(zhuǎn)換邏輯,然而,當(dāng)目標(biāo)業(yè)務(wù)單據(jù)被刪除或作廢時,則需要將源業(yè)務(wù)單據(jù)的 狀態(tài)恢復(fù)到反寫前的狀態(tài),此時就需要對原來的正向公式腳本進(jìn)行逆向運算操作,又被稱 為反反寫操作,否則源業(yè)務(wù)單據(jù)的狀態(tài)就可能會發(fā)生錯誤。 例如,銷售訂單可以生成銷售出庫單,假設(shè)銷售出庫單上定義了一個字段叫出庫 數(shù)量,銷售訂單上定義了一個字段叫已出庫金額,初始狀態(tài)下這兩個字段值都是等于O,實 際業(yè)務(wù)中一張銷售訂單可能生成多張銷售出庫單,即出庫行為可能發(fā)生多次,每次出庫其 中一部分?jǐn)?shù)量。 當(dāng)用戶修改并提交了某一張銷售出庫單的出庫數(shù)量時,系統(tǒng)中銷售訂單上的已出 庫金額也需要同時被反寫為出庫數(shù)量*單價,以公式來描述以上反寫邏輯為
源單.已出庫金額=源單.已出庫金額+目標(biāo)單.收貨數(shù)量*目標(biāo)單.單價
當(dāng)刪除此銷售出庫單時,源單的已出庫金額字段值需要修改回來,即相當(dāng)于執(zhí)行 以下公式 源單.已出庫金額=源單.已出庫金額_目標(biāo)單.收貨數(shù)量*目標(biāo)單.單價
由上述內(nèi)容可以看出,對于同一個業(yè)務(wù)場景來說,反寫源單邏輯在單據(jù)轉(zhuǎn)換和單 據(jù)刪除時需要執(zhí)行完全相反的兩種操作。 現(xiàn)有技術(shù),一種通過編寫代碼來實現(xiàn)這兩種相反的業(yè)務(wù)邏輯,但這種方式,開發(fā)成 本很高,并且不具備可維護(hù)性和可擴展性;另一種是寫公式腳本來定義反寫邏輯,但這意味 著用戶除了定義正常的正向公式腳本外,還需要為每種反寫邏輯再定義一種完全相反的逆 向公式腳本,由于實際的應(yīng)用系統(tǒng)中單據(jù)種類很多,各種單據(jù)間的映射關(guān)系都不一樣,正向 公式腳本的內(nèi)容及結(jié)構(gòu)也各不相同,如果每一種公式都需要用戶去分析邏輯關(guān)系,再定義 一套邏輯完全相反的公式出來, 一方面成倍地增加了用戶設(shè)置公式腳本的工作量,另一方 面需要由用戶保證刪除單據(jù)時的公式與定義的正常的正向公式腳本在邏輯上完全地相反, 當(dāng)公式腳本的內(nèi)部邏輯關(guān)系比較復(fù)雜時,風(fēng)險較大,系統(tǒng)穩(wěn)定性差。
發(fā)明內(nèi)容
本發(fā)明實施例的目的在于提供一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的方法,旨在解決在ERP應(yīng)用系 統(tǒng)中,業(yè)務(wù)單據(jù)自動轉(zhuǎn)換過程中公式腳本的逆向運算的問題。 本發(fā)明實施例是這樣實現(xiàn)的,一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的方法,所述方法包括下述步 驟 獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法分析,生成與所述正 向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹; 根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成逆向公式語 法結(jié)構(gòu)樹; 根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯完全相反的逆向公式腳本;
根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字段 轉(zhuǎn)換為反寫前的原始值。
本發(fā)明實施例的另一目的在于提供一種轉(zhuǎn)換裝置,所述轉(zhuǎn)換裝置包括 腳本執(zhí)行引擎,用于獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法
分析,生成與所述正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹; 逆向公式生成器,用于根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹語法結(jié)構(gòu) 樹進(jìn)行逆向操作,生成逆向公式語法結(jié)構(gòu)樹; 逆向公式腳本生成單元,用于根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯 完全相反的逆向公式腳本; 數(shù)據(jù)轉(zhuǎn)換單元,用于根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源 業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。 本發(fā)明實施例的另一目的在于提供一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的系統(tǒng),包括客戶端和業(yè) 務(wù)單據(jù)存儲端,所述系統(tǒng)還包括如上所述的轉(zhuǎn)換裝置。 本發(fā)明實施例,預(yù)先生成用于業(yè)務(wù)單據(jù)之間轉(zhuǎn)換的正向公式腳本,根據(jù)該正向公 式腳本生成逆向公式腳本,調(diào)用逆向公式腳本,將源業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的 原始值,從而不依賴具體的代碼邏輯實現(xiàn)實際場景中各種特殊反寫和反反寫邏輯的需求, 減少了公式腳本配置的工作量,并且具有很好的適應(yīng)性。
圖1是本發(fā)明實施例提供的業(yè)務(wù)單據(jù)轉(zhuǎn)換方法的實現(xiàn)流程圖; 圖2是本發(fā)明實施例提供的業(yè)務(wù)單據(jù)轉(zhuǎn)換系統(tǒng)的結(jié)構(gòu)示意圖; 圖3是本發(fā)明實施例提供的生成的正向公式語法結(jié)構(gòu)樹的示例圖; 圖4是本發(fā)明實施例提供的生成的逆向公式語法結(jié)構(gòu)樹的示意圖; 圖5是本發(fā)明實施例提供的生成的逆向公式語法結(jié)構(gòu)樹的示意圖; 圖6是本發(fā)明實施例提供的生成的逆向公式語法結(jié)構(gòu)樹的示意圖; 圖7是本發(fā)明實施例提供的利用如圖2所示的單據(jù)轉(zhuǎn)換系統(tǒng)實現(xiàn)業(yè)務(wù)單據(jù)的轉(zhuǎn)換
的方法的流程圖。
具體實施例方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對 本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅用以解釋本發(fā)明,并不 用于限定本發(fā)明。 在本發(fā)明實施例中,獲取預(yù)設(shè)的正向公式腳本,并將其轉(zhuǎn)換成邏輯完全相反的逆
向公式腳本;根據(jù)該逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字
段轉(zhuǎn)換為反寫前的原始值,從而不依賴具體的代碼邏輯實現(xiàn)實際場景中各種特殊反寫和反
反寫邏輯的需求,減少了公式腳本配置的工作量,并且具有很好的適應(yīng)性。 本發(fā)明提供了一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的方法、裝置及系統(tǒng) 所述方法包括下述步驟 獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法分析,生成與所述正 向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹; 根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成逆向公式語 法結(jié)構(gòu)樹; 根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯完全相反的逆向公式腳本;
根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字段 轉(zhuǎn)換為反寫前的原始值。
所述轉(zhuǎn)換裝置包括 腳本執(zhí)行引擎,用于獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法 分析,生成與所述正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹; 逆向公式生成器,用于根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹語法結(jié)構(gòu) 樹進(jìn)行逆向操作,生成逆向公式語法結(jié)構(gòu)樹; 逆向公式腳本生成單元,用于根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯 完全相反的逆向公式腳本; 數(shù)據(jù)轉(zhuǎn)換單元,用于根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源 業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。 所述業(yè)務(wù)單據(jù)轉(zhuǎn)換的系統(tǒng),包括客戶端和業(yè)務(wù)單據(jù)存儲端,所述系統(tǒng)還包括如上
所述的轉(zhuǎn)換裝置。
實施例一 圖1是本發(fā)明實施例提供的業(yè)務(wù)單據(jù)轉(zhuǎn)換方法的實現(xiàn)流程,詳述如下 在步驟S101中,獲取預(yù)設(shè)的正向公式腳本,并對正向公式腳本進(jìn)行語法分析,生
成與正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹。 在步驟S102中,根據(jù)二叉樹的結(jié)構(gòu),對正向公式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成 逆向公式語法結(jié)構(gòu)樹。 在步驟S103中,根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯完全相反的 逆向公式腳本。 在步驟S104中,根據(jù)逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)
的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。 實施例二
圖2為本發(fā)明實施例提供的業(yè)務(wù)單據(jù)轉(zhuǎn)換系統(tǒng)的結(jié)構(gòu),為了便于說明,僅示出了 本發(fā)明實施例相關(guān)的部分。該業(yè)務(wù)單據(jù)轉(zhuǎn)換系統(tǒng)可以作為獨立的掛件集成到ERP系統(tǒng)或者 ERP系統(tǒng)的應(yīng)用系統(tǒng)中。該業(yè)務(wù)單據(jù)轉(zhuǎn)換系統(tǒng)包括單據(jù)轉(zhuǎn)換平臺11、正向公式腳本生成裝 置12、轉(zhuǎn)換裝置13和業(yè)務(wù)單據(jù)存儲端14。 其中,正向公式腳本生成裝置12和轉(zhuǎn)換裝置13可以是內(nèi)置于單據(jù)轉(zhuǎn)換平臺11中 的軟件單元、硬件單元或者軟硬件相結(jié)合的單元,或者作為獨立的掛件集成到單據(jù)轉(zhuǎn)換平 臺11中,以實現(xiàn)從業(yè)務(wù)單據(jù)存儲端14調(diào)用目標(biāo)業(yè)務(wù)單據(jù)的數(shù)據(jù),根據(jù)目標(biāo)業(yè)務(wù)單據(jù)的數(shù)據(jù) 的變化更新源業(yè)務(wù)單據(jù),實現(xiàn)業(yè)務(wù)單據(jù)之間的轉(zhuǎn)換。 其中,轉(zhuǎn)換裝置13包括腳本執(zhí)行引擎131、逆向公式生成器132、逆向公式腳本生 成單元133、數(shù)據(jù)轉(zhuǎn)換單元134。 腳本執(zhí)行引擎131獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法分 析,生成與所述正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹。 逆向公式生成器132根據(jù)二叉樹的結(jié)構(gòu),對正向公式語法結(jié)構(gòu)樹語法結(jié)構(gòu)樹進(jìn)行 逆向操作,生成逆向公式語法結(jié)構(gòu)樹。 逆向公式腳本生成單元133根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯 完全相反的逆向公式腳本。 數(shù)據(jù)轉(zhuǎn)換單元134根據(jù)逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單 據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。 下面以這些裝置分別是單獨的部件為例來說明,整個系統(tǒng)的工作過程如下所述 單據(jù)轉(zhuǎn)換平臺11接收用戶輸入的選擇待轉(zhuǎn)換的業(yè)務(wù)單據(jù)的指令,根據(jù)所述指令選擇要進(jìn) 行轉(zhuǎn)換的目標(biāo)業(yè)務(wù)單據(jù)和源業(yè)務(wù)單據(jù);正向公式腳本生成裝置12根據(jù)單據(jù)轉(zhuǎn)換平臺11所 選擇的目標(biāo)業(yè)務(wù)單據(jù)字段和源業(yè)務(wù)單據(jù)字段生成單據(jù)轉(zhuǎn)換的正向公式腳本存儲并返回正 向公式腳本已經(jīng)生成的消息至單據(jù)轉(zhuǎn)換平臺11 ;單據(jù)轉(zhuǎn)換平臺ll接收到該消息后,向正向 公式腳本生成裝置13獲取存儲于其中的正向公式腳本,再調(diào)用轉(zhuǎn)換裝置13將正向公式腳 本轉(zhuǎn)換成邏輯完全相反的逆向公式腳本并存儲,其中,轉(zhuǎn)換裝置13的腳本執(zhí)行引擎131先 對單據(jù)轉(zhuǎn)換平臺11所獲取的單據(jù)轉(zhuǎn)換正向公式腳本進(jìn)行轉(zhuǎn)換,生成正向公式語法結(jié)構(gòu)樹, 再通過逆向公式生成器132根據(jù)二叉樹的結(jié)構(gòu),對腳本執(zhí)行引擎131生成的正向公式語法 結(jié)構(gòu)樹進(jìn)行逆向操作,生成與正向公式腳本邏輯完全相反的逆向公式腳本。此后,當(dāng)需要將 目標(biāo)業(yè)務(wù)單據(jù)的數(shù)據(jù)的變化更新到源業(yè)務(wù)單據(jù)中時,單據(jù)轉(zhuǎn)換平臺ll可以獲取正向公式 腳本生成裝置12中存儲的單據(jù)轉(zhuǎn)換的正向公式腳本,同時向業(yè)務(wù)單據(jù)存儲端14獲取業(yè)務(wù) 單據(jù)的數(shù)據(jù),再調(diào)用轉(zhuǎn)換裝置13,由轉(zhuǎn)換裝置13根據(jù)單據(jù)轉(zhuǎn)換平臺11獲取的正向公式腳本 以及業(yè)務(wù)單據(jù)的數(shù)據(jù)執(zhí)行實際的單據(jù)轉(zhuǎn)換,最后發(fā)送單據(jù)轉(zhuǎn)換后的執(zhí)行結(jié)果至單據(jù)轉(zhuǎn)換平 臺11 ;當(dāng)需要刪除目標(biāo)業(yè)務(wù)單據(jù)時,單據(jù)轉(zhuǎn)換平臺11獲取轉(zhuǎn)換裝置13生成的單據(jù)轉(zhuǎn)換逆 向公式腳本,同時向業(yè)務(wù)單據(jù)存儲端14獲取業(yè)務(wù)單據(jù)的數(shù)據(jù),再調(diào)用轉(zhuǎn)換裝置13,由轉(zhuǎn)換 裝置13根據(jù)單據(jù)轉(zhuǎn)換平臺11獲取的逆向公式腳本以及業(yè)務(wù)單據(jù)的數(shù)據(jù)執(zhí)行實際的單據(jù)轉(zhuǎn) 換,將源業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值,最后發(fā)送單據(jù)轉(zhuǎn)換后的執(zhí)行結(jié)果至 單據(jù)轉(zhuǎn)換平臺11。 其中,為了實現(xiàn)將正向公式腳本生成裝置12生成的公式通過轉(zhuǎn)換裝置13自動生 成逆向公式腳本,需要預(yù)先做一些約定
段;
戈表反寫前/后的源單字
2. 公式腳本內(nèi)容必須為以下格式 SourceFiledAfter =公式表達(dá)式;
3. 公式表達(dá)式中必須出現(xiàn)且僅出現(xiàn)一次SourceFiledBefore ;
4.公式腳本中可以使用括號改變計算優(yōu)先級,并支持以下逆向操作的運算符 運算符 逆向運算符
+ :加 -:減
-:減 + :加
* :乘 / :除
/:除 *:乘
在這里只考慮需要多次反寫源業(yè)務(wù)單據(jù)的情況,這種場景下由于多次反寫時需要 累加,公式內(nèi)容中必定會出現(xiàn)待反寫源業(yè)務(wù)單據(jù)的字段名稱,同時如果公式中出現(xiàn)多個待 反寫源業(yè)務(wù)單據(jù)的字段變量,將導(dǎo)致反反寫邏輯關(guān)系非常地復(fù)雜,大多數(shù)情況下不允許配 置這么復(fù)雜的反寫邏輯,因此,在本發(fā)明實施例中,只討論公式中只出現(xiàn)一次待反寫源業(yè)務(wù) 單據(jù)字段變量名稱的場景,重點描述實現(xiàn)逆向執(zhí)行公式的實現(xiàn)方法。
典型的正向公式腳本如下 SourceFiledAfter = SourceFiledBefore+Source. price切est. qty
上述公式的邏輯為每次在源業(yè)務(wù)單據(jù)字段SourceFiledBefore的當(dāng)前值基礎(chǔ)上, 加上源單.單價*目標(biāo)單.數(shù)量,這樣每次目標(biāo)業(yè)務(wù)單據(jù)執(zhí)行反寫后,源業(yè)務(wù)單據(jù)的對應(yīng)字 段值SourceFiledAfter就不斷增加。 反過來,當(dāng)刪除目標(biāo)業(yè)務(wù)單據(jù)后,對應(yīng)的源業(yè)務(wù)單據(jù)的字段需要把當(dāng)前業(yè)務(wù)單據(jù) 所增加的那一部分減回來,此時不能影響其它目標(biāo)業(yè)務(wù)單據(jù)所增加的那部分值,因此逆向 執(zhí)行公式可理解為就是要把執(zhí)行公式前的SourceFiledBefore字段值算出來,只需要實現(xiàn) 將普通的正向公式腳本生成逆向公式腳本,然后由轉(zhuǎn)換裝置14直接執(zhí)行逆向公式腳本即可。 具體的轉(zhuǎn)換裝置13將正向公式腳本生成裝置12生成的正向公式腳本轉(zhuǎn)換成逆向 公式腳本的步驟是 首先,轉(zhuǎn)換裝置13的腳本執(zhí)行引擎131對單據(jù)轉(zhuǎn)換平臺11所獲取的單據(jù)轉(zhuǎn)換正 向公式腳本進(jìn)行轉(zhuǎn)換,生成正向公式語法結(jié)構(gòu)樹,腳本執(zhí)行引擎131解析正向公式腳本,并 據(jù)此建立相應(yīng)的正向公式語法結(jié)構(gòu)樹,簡稱為A樹,該樹有且僅有一個根節(jié)點,樹的每個葉 子節(jié)點為具體的字段值,而非葉子節(jié)點則為運算符,例如,對于反寫邏輯源單.待反寫字 段=(源單.待反寫字段X(目標(biāo)單.字段八+目標(biāo)單.字段B))-目標(biāo)單.CX(源單.D+源 單.E)X17X,替換預(yù)定義公式變量后,實際的正向公式腳本可以表示為
SourceFiledAfter = (SourceFiledBefore X(目標(biāo)單.字段A十目標(biāo)單.字段 B))-目標(biāo)單.CX(源單.D+源單.E) X 17%,對該公式腳本,通過腳本執(zhí)行引擎131生成的 正向語法結(jié)構(gòu)樹如圖3所示。 其次,轉(zhuǎn)換裝置13的逆向公式生成器132根據(jù)二叉樹的結(jié)構(gòu)對腳本執(zhí)行引擎131 'A式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成邏輯完全相反的逆向公式腳本。具體的步驟
生成的么、是 1.創(chuàng)建一個空的逆向公式語法結(jié)構(gòu)樹,簡稱為B樹,并創(chuàng)建一個根結(jié)點,該節(jié)點為 一個賦值運算符,設(shè)置根節(jié)點為B樹的當(dāng)前節(jié)點,如圖4所示。 2.遍歷A樹的所有節(jié)點,找到SourceFiledBefore節(jié)點,將A樹 上的SourceFiledBefore節(jié)點移除,增加為B樹當(dāng)前節(jié)點的左側(cè)子節(jié)點,設(shè) 置SourceFiledBefore節(jié)點的父節(jié)點為A樹的當(dāng)前節(jié)點,根據(jù)前面的約定, SourceFiledBefore必須出現(xiàn)且只能出現(xiàn)一次,因此一定可以找到。 3. A樹當(dāng)前節(jié)點是父節(jié)點,因此一定是一個運算符節(jié)點,將A樹當(dāng)前節(jié)點的運算符 修改為相反的運算符,然后連同子樹一次復(fù)制到B樹,增加為B樹當(dāng)前節(jié)點下的右側(cè)子樹, 得到的B樹的結(jié)構(gòu),如圖5所示。 4.移除A樹當(dāng)前節(jié)點及其子樹,并設(shè)置其父節(jié)點為A樹新的當(dāng)前節(jié)點,并設(shè)置B樹 的反向運算符節(jié)點為B樹新的當(dāng)前節(jié)點。 5.繼續(xù)處理A樹的當(dāng)前節(jié)點,如果是運算符節(jié)點,則將A樹當(dāng)前節(jié)點的運算符修改 為相反的運算符,然后連同子樹一次復(fù)制到B樹,增加為B樹當(dāng)前節(jié)點下的左側(cè)子節(jié)點。
6.移除A樹當(dāng)前節(jié)點及其子樹,并設(shè)置其父節(jié)點為A樹新的當(dāng)前節(jié)點,并設(shè)置B樹 的反向運算符節(jié)點為B樹新的當(dāng)前節(jié)點。 7.重復(fù)執(zhí)行步驟5至6,直到A樹的當(dāng)前節(jié)點為根節(jié)點,根據(jù)前面的約定,根節(jié)點 一定是運算符節(jié)點且左側(cè)子節(jié)點一定是SourceFiledAf ter,將A樹節(jié)點全部移除,在B樹當(dāng) 前節(jié)點下增加SourceFiledAfter節(jié)點作為左側(cè)子節(jié)點,得到的B樹的結(jié)構(gòu),如圖6所示。
8.逆向公式語法結(jié)構(gòu)樹生成完畢,按照優(yōu)先級遍歷該逆向公式語法結(jié)構(gòu)樹,生成 逆向公式腳本。 本發(fā)明實施例提供的單據(jù)轉(zhuǎn)換系統(tǒng)使用正向正向公式腳本來描述業(yè)務(wù)單據(jù)間各
種復(fù)雜的反寫映射關(guān)系,再根據(jù)描述反寫映射關(guān)系的正向公式腳本自動生成逆向公式腳
本,來描述業(yè)務(wù)單據(jù)間各種復(fù)雜的反反寫映射關(guān)系,不依賴具體的代碼邏輯實現(xiàn),解決了實
際場景中各種特殊反寫和反反寫邏輯的需求,減少了公式腳本配置的工作量,并且具有很
好的適應(yīng)性。
實施例三 圖7是本發(fā)明實施例提供的采用如圖2所示的業(yè)務(wù)單據(jù)轉(zhuǎn)換系統(tǒng)實現(xiàn)單據(jù)轉(zhuǎn)換的 方法的流程,詳述如下 1、單據(jù)轉(zhuǎn)換平臺根接收到的單據(jù)轉(zhuǎn)換請求指令,選擇要進(jìn)行轉(zhuǎn)換的目標(biāo)業(yè)務(wù)單據(jù) 和源業(yè)務(wù)單據(jù)。 作為本發(fā)明的一個實施例,單據(jù)轉(zhuǎn)換平臺接收用戶輸入的選擇待轉(zhuǎn)換業(yè)務(wù)單據(jù)的 指令,選擇源業(yè)務(wù)單據(jù)和目標(biāo)業(yè)務(wù)單據(jù),選擇好后,即可確定目標(biāo)業(yè)務(wù)單據(jù)和源業(yè)務(wù)單據(jù)字 段之間的邏輯關(guān)系。 2、正向公式腳本生成裝置根據(jù)選擇的目標(biāo)業(yè)務(wù)單據(jù)字段和源業(yè)務(wù)單據(jù)字段生成 單據(jù)轉(zhuǎn)換的正向公式腳本并存儲。 正向公式腳本生成裝置根據(jù)目標(biāo)業(yè)務(wù)單據(jù)字段和源業(yè)務(wù)單據(jù)字段生成單據(jù)轉(zhuǎn)換 的正向公式腳本,單據(jù)轉(zhuǎn)換公式內(nèi)容為按類JAVA語法定義一個計算表達(dá)式,支持各種運算 符和括號等,例如
為了便于閱讀,這里我們首先作一些約定
SourceFiledBefore :代表反寫前的源業(yè)務(wù)單據(jù)的字段
SourceFiledAfter :代表反寫后的源業(yè)務(wù)單據(jù)的字段
典型的正向公式腳本如下 SourceFiledAfter = SourceFiledBefore+Source. price切est. qty 具體進(jìn)行業(yè)務(wù)單據(jù)之間的轉(zhuǎn)換時,計算出結(jié)果SourceFiledAfter并賦值給預(yù)定
的源業(yè)務(wù)單據(jù)的屬性字段即可。具體情況如上所述,在此不再贅述。 3、單據(jù)轉(zhuǎn)換平臺獲取正向公式腳本生成裝置存儲的單據(jù)轉(zhuǎn)換的正向公式腳本。 4、轉(zhuǎn)換裝置獲取單據(jù)轉(zhuǎn)換平臺從正向公式腳本生成裝置讀取的正向公式腳本。 5、轉(zhuǎn)換裝置根據(jù)正向公式腳本生成單據(jù)轉(zhuǎn)換的逆向公式腳本。 作為本發(fā)明的一個實施例,單據(jù)轉(zhuǎn)換平臺首先調(diào)用轉(zhuǎn)換裝置的腳本執(zhí)行引擎對獲
取的正向公式腳本進(jìn)行語法解析,生成正向公式語法結(jié)構(gòu)樹,然后再調(diào)用逆向公式生成器,
根據(jù)二叉樹的結(jié)構(gòu),對生成的正向公式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成邏輯完全相反的逆
向公式腳本。具體的步驟是 1).創(chuàng)建一個空的逆向公式語法結(jié)構(gòu)二叉樹,簡稱為B樹,并創(chuàng)建一個根結(jié)點,該 節(jié)點為一個賦值運算符,設(shè)置根節(jié)點為B樹的當(dāng)前節(jié)點,如圖3所示。 2).遍歷A樹的所有節(jié)點,找到SourceFiledBefore節(jié)點,將A樹 上的SourceFiledBefore節(jié)點移除,增加為B樹當(dāng)前節(jié)點的左側(cè)子節(jié)點,設(shè) 置SourceFiledBefore節(jié)點的父節(jié)點為A樹的當(dāng)前節(jié)點,根據(jù)前面的約定, SourceFiledBefore必須出現(xiàn)且只能出現(xiàn)一次,因此一定可以找到。 3).A樹當(dāng)前節(jié)點是父節(jié)點,因此一定是一個運算符節(jié)點,將A樹當(dāng)前節(jié)點的運算 符修改為相反的運算符,然后連同子樹一次復(fù)制到B樹,增加為B樹當(dāng)前節(jié)點下的右側(cè)子 樹,如圖4所示。 4).移除A樹當(dāng)前節(jié)點及其子樹,并設(shè)置其父節(jié)點為A樹新的當(dāng)前節(jié)點,并設(shè)置B 樹的反向運算符節(jié)點為B樹新的當(dāng)前節(jié)點。 5).繼續(xù)處理A樹的當(dāng)前節(jié)點,如果是運算符節(jié)點,則將A樹當(dāng)前節(jié)點的運算符修 改為相反的運算符,然后連同子樹一次復(fù)制到B樹,增加為B樹當(dāng)前節(jié)點下的左側(cè)子節(jié)點。
6).移除A樹當(dāng)前節(jié)點及其子樹,并設(shè)置其父節(jié)點為A樹新的當(dāng)前節(jié)點,并設(shè)置B 樹的反向運算符節(jié)點為B樹新的當(dāng)前節(jié)點,如圖5所示。 7).重復(fù)執(zhí)行步驟5)至6),直到A樹的當(dāng)前節(jié)點為根節(jié)點,根據(jù)前面的約定,根節(jié) 點一定是運算符節(jié)點且左側(cè)子節(jié)點一定是SourceFiledAfter,將A樹節(jié)點全部移除,在B樹 當(dāng)前節(jié)點下增加SourceFiledAfter節(jié)點作為左側(cè)子節(jié)點,如圖6所示,其中,生成逆向公式 腳本的完整示例圖見圖7。 8).逆向公式語法結(jié)構(gòu)樹生成完畢,按照優(yōu)先級遍歷該逆向公式語法結(jié)構(gòu)樹,輸出 逆向公式腳本。 6、單據(jù)轉(zhuǎn)換平臺獲取轉(zhuǎn)換裝置生成的單據(jù)轉(zhuǎn)換逆向公式腳本。 7 、單據(jù)轉(zhuǎn)換平臺獲取業(yè)務(wù)單據(jù)存儲端存儲的業(yè)務(wù)單據(jù)的數(shù)據(jù)。 8、當(dāng)接收到所述單據(jù)轉(zhuǎn)換平臺發(fā)送的執(zhí)行單據(jù)反寫的指令時,轉(zhuǎn)換裝置根據(jù)所述
單據(jù)轉(zhuǎn)換平臺獲取的單據(jù)轉(zhuǎn)換的正向公式腳本以及業(yè)務(wù)單據(jù)的數(shù)據(jù)執(zhí)行單據(jù)轉(zhuǎn)換。
10
9、當(dāng)接收到所述單據(jù)轉(zhuǎn)換平臺發(fā)送的刪除目標(biāo)業(yè)務(wù)單據(jù)的指令時,轉(zhuǎn)換裝置根據(jù) 所述單據(jù)轉(zhuǎn)換平臺獲取的單據(jù)轉(zhuǎn)換的逆向公式腳本以及源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù) 的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。 10、轉(zhuǎn)換裝置發(fā)送單據(jù)轉(zhuǎn)換的執(zhí)行結(jié)果至單據(jù)轉(zhuǎn)換平臺。 在本發(fā)明實施例中,獲取預(yù)設(shè)的正向公式腳本,并將其轉(zhuǎn)換成邏輯完全相反的逆 向公式腳本;根據(jù)該逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字 段轉(zhuǎn)換為反寫前的原始值,從而不依賴具體的代碼邏輯實現(xiàn)實際場景中各種特殊反寫和反 反寫邏輯的需求,減少了公式腳本配置的工作量,并且具有很好的適應(yīng)性;此外,單據(jù)轉(zhuǎn)換 的逆向公式腳本的生成支持運行期動態(tài)生成,不需要修改代碼,公式內(nèi)容可以由熟悉業(yè)務(wù) 場景的業(yè)務(wù)人員根據(jù)需要來添加/修改,提高了系統(tǒng)的可擴展性;另外,通過動態(tài)轉(zhuǎn)換正向 公式語法結(jié)構(gòu)樹的方式來生成逆向公式腳本,結(jié)構(gòu)性強,便于將來擴展更多的語法支持和 特性。 以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精 神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
一種業(yè)務(wù)單據(jù)的轉(zhuǎn)換方法,其特征在于,所述方法包括下述步驟獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法分析,生成與所述正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹;根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成逆向公式語法結(jié)構(gòu)樹;根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯完全相反的逆向公式腳本;根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。
2. 如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語 法結(jié)構(gòu)樹進(jìn)行逆向操作,生成逆向公式語法結(jié)構(gòu)樹的步驟具體為創(chuàng)建一個空的逆向公式語法結(jié)構(gòu)樹,并創(chuàng)建一個根結(jié)點,該節(jié)點為一個賦值運算符,設(shè) 置根節(jié)點為該逆向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點;遍歷正向公式語法結(jié)構(gòu)樹的所有節(jié)點,找到反寫前的源單據(jù)字段的節(jié)點,將正向公式 語法結(jié)構(gòu)樹上的反寫前的源單據(jù)字段的節(jié)點移除,增加為逆向公式語法結(jié)構(gòu)樹當(dāng)前節(jié)點的 左側(cè)子節(jié)點,設(shè)置反寫前的源單據(jù)字段的節(jié)點的父節(jié)點為正向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié) 點;將正向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點的運算符修改為邏輯相反的運算符,然后連同子樹 一次復(fù)制到逆向公式語法結(jié)構(gòu)樹,增加為逆向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點下的右側(cè)子樹;移除正向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點及其子樹,設(shè)置其父節(jié)點為新的當(dāng)前節(jié)點,并設(shè) 置逆向公式語法結(jié)構(gòu)樹的反向運算符節(jié)點為新的當(dāng)前節(jié)點;繼續(xù)處理正向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點,如果是運算符節(jié)點,則將正向公式語法結(jié) 構(gòu)樹的當(dāng)前節(jié)點的運算符修改為邏輯相反的運算符,然后連同子樹一次復(fù)制到逆向公式語 法結(jié)構(gòu)樹,增加為逆向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點下的左側(cè)子節(jié)點;移除正向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點及其子樹,并設(shè)置其父節(jié)點為新的當(dāng)前節(jié)點,并 設(shè)置逆向公式語法結(jié)構(gòu)樹的反向運算符節(jié)點為新的當(dāng)前節(jié)點;重復(fù)上述兩個步驟,直到正向公式語法結(jié)構(gòu)樹的當(dāng)前節(jié)點為根節(jié)點,在逆向公式語法 結(jié)構(gòu)樹的當(dāng)前節(jié)點下增加反寫后的源單據(jù)字段節(jié)點作為左側(cè)子節(jié)點。
3. 如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向 公式腳本邏輯完全相反的逆向公式腳本的步驟具體為按照優(yōu)先級遍歷逆向公式語法結(jié)構(gòu)樹,生成與正向公式腳本邏輯完全相反的逆向公式
4. 一種轉(zhuǎn)換裝置,其特征在于,所述轉(zhuǎn)換裝置包括腳本執(zhí)行引擎,用于獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法分析, 生成與所述正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹;逆向公式生成器,用于根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹語法結(jié)構(gòu)樹進(jìn) 行逆向操作,生成逆向公式語法結(jié)構(gòu)樹;逆向公式腳本生成單元,用于根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯完全 相反的逆向公式腳本;數(shù)據(jù)轉(zhuǎn)換單元,用于根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。
5. —種業(yè)務(wù)單據(jù)轉(zhuǎn)換的系統(tǒng),包括客戶端和業(yè)務(wù)單據(jù)存儲端,其特征在于,所述系統(tǒng) 還包括如權(quán)利要求4所述的轉(zhuǎn)換裝置。
6. 如權(quán)利要求5所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括正向公式腳本生成裝置,用于根據(jù)預(yù)先選擇的目標(biāo)業(yè)務(wù)單據(jù)字段和源業(yè)務(wù)單據(jù)字段生 成單據(jù)轉(zhuǎn)換的正向公式腳本。
7. 如權(quán)利要求5所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括單據(jù)轉(zhuǎn)換平臺,用于根據(jù)客戶端發(fā)送的生成單據(jù)轉(zhuǎn)換公式的請求指令,選擇目標(biāo)業(yè)務(wù) 單據(jù)字段和源業(yè)務(wù)單據(jù)字段。
全文摘要
本發(fā)明適用于計算機領(lǐng)域,提供了一種業(yè)務(wù)單據(jù)轉(zhuǎn)換的方法、裝置及系統(tǒng),所述方法包括下述步驟獲取預(yù)設(shè)的正向公式腳本,并對所述正向公式腳本進(jìn)行語法分析,生成與所述正向公式腳本對應(yīng)的正向公式語法結(jié)構(gòu)樹;根據(jù)二叉樹的結(jié)構(gòu),對所述正向公式語法結(jié)構(gòu)樹進(jìn)行逆向操作,生成逆向公式語法結(jié)構(gòu)樹;根據(jù)逆向公式語法結(jié)構(gòu)樹生成與正向公式腳本邏輯完全相反的逆向公式腳本;根據(jù)所述逆向公式腳本以及獲取的源業(yè)務(wù)單據(jù)的數(shù)據(jù),將源業(yè)務(wù)單據(jù)的相應(yīng)字段轉(zhuǎn)換為反寫前的原始值。本發(fā)明中,可以不依賴具體的代碼邏輯實現(xiàn)實際場景中各種特殊反寫和反反寫邏輯的需求,減少了公式腳本配置的工作量,并且具有很好的適應(yīng)性。
文檔編號G06F17/22GK101763340SQ20091018923
公開日2010年6月30日 申請日期2009年12月22日 優(yōu)先權(quán)日2009年12月22日
發(fā)明者張俊 申請人:金蝶軟件(中國)有限公司