SAP 软件的精髓之一:各种各样的决定机制 - Determination Logic
這是 Jerry 2021 年的第 74 篇文章,也是汪子熙公眾號總共第 351 篇原創(chuàng)文章。
本來想寫一篇 SAP UI5 應(yīng)用和 SAP 電商云 UI 開發(fā)的語言決定機(jī)制的,由于文章篇幅原因,最后決定分成兩篇文章來寫。本文是 SAP 軟件決定機(jī)制的概要介紹,下一篇文章再介紹這種決定機(jī)制,在 SAP UI5 中的應(yīng)用。
SAP 軟件中的決定機(jī)制,往往容易被忽視,不是因為這種機(jī)制不重要,而是因為它廣泛應(yīng)用于 SAP 各種軟件的前臺和后臺實現(xiàn)中,可以說是無處不在。這就好比我們都知道空氣對于人類的重要性,但很少有人專門去留意空氣的存在一樣。
所謂決定機(jī)制,就是基于一個輸入集合,經(jīng)過分析和處理,產(chǎn)生一個輸出集合。換言之,決定機(jī)制包含三部分內(nèi)容:
(1) 輸入集合。這個輸入集合的數(shù)據(jù),可能直接來自終端用戶輸入,也可能來自決定機(jī)制的上游業(yè)務(wù)邏輯的輸出。在運行了 SAP 軟件的客戶系統(tǒng)上,輸入集合的排列組合,理論上可能有無窮多種。
(2) 分析處理引擎。針對幾乎無限多種排列組合的輸入集合,分析處理引擎需要能健壯且高效地進(jìn)行處理,以不變應(yīng)萬變。
(3) 輸出集合。分析處理引擎根據(jù)輸入集合處理產(chǎn)生的結(jié)果。這些結(jié)果數(shù)據(jù)有可能直接返回給終端用戶,也可能作為輸入數(shù)據(jù),繼續(xù)傳入下游業(yè)務(wù)的處理邏輯中去。
不難看出,決定機(jī)制模塊實現(xiàn)的核心和難點就是其分析處理引擎。
如何實現(xiàn)一個決定機(jī)制模塊?
不少朋友在大學(xué)第一次學(xué)習(xí)某門編程語言時,想必都寫過如下風(fēng)格的代碼。至少我寫過。
IF 條件1.DO 邏輯1.RETURN 結(jié)果1. ELSEIF 條件2.DO 邏輯2.RETURN 結(jié)果2. ELSEIF 條件3.DO 邏輯3.RETURN 結(jié)果3. ELSEIF ... ENDIF.以上可看作一個簡易的決定機(jī)制模塊實現(xiàn),因為它具備了輸入,處理和輸出三大部分。但它也是一個很蹩腳的實現(xiàn),因為前文提到,決定機(jī)制的輸入集合可能有無限多種可能。如果每次決定機(jī)制的需求發(fā)生變化,要求支持新的輸入,那么通過新增一個 IF 分支來應(yīng)對這種需求變化,顯然不現(xiàn)實,根本達(dá)不到“以不變應(yīng)萬變”的效果。
來看看 SAP 怎么做的。
Jerry 工作后遇到的第一個決定機(jī)制的例子,是 SAP Business ByDesign 的 Form Template 決定機(jī)制。
客戶在 SAP BYD 創(chuàng)建銷售訂單之后,當(dāng)流程走到 SCM 模塊 的發(fā)貨流程時,客戶維護(hù)在系統(tǒng)里的電子郵箱,會收到一封 BYD 系統(tǒng)發(fā)送的交貨單(Delivery Note),格式為 PDF.
上圖這個 PDF 在 SAP BYD 系統(tǒng)里通過 Adobe Document Service 生成,調(diào)用這個 Web Service 時需要兩個輸入,Form 模板和業(yè)務(wù)數(shù)據(jù)。
Form 模板通過 Adobe Form Designer 開發(fā)而成,業(yè)務(wù)數(shù)據(jù)來自 SAP BYD 系統(tǒng)后臺對應(yīng)的 Business Objects.
可不要小看這些看似簡單的 Form 模板,為了實現(xiàn) SAP 產(chǎn)品標(biāo)準(zhǔn)之一的 Internalization,各個不同的國家和地區(qū),因為語言差異和閱讀習(xí)慣的不同,包含同樣業(yè)務(wù)數(shù)據(jù)的一張交貨單,其 Form 模板布局卻存在差異。比如中文地址的排列順序習(xí)慣從大到小,而英文地址的默認(rèn)順序為從小到大排列。又比如某些國家和地區(qū)的閱讀習(xí)慣是從右到左(參看 Jerry 的文章:SAP ABAP 業(yè)務(wù)開關(guān)和 SAP 電商云的 Feature Level),因此 Form 模板布局要能應(yīng)對所有這些差異。
所以,SAP BYD 的客戶,即使對于同一張交貨單模板,往往也在系統(tǒng)中維護(hù)了多個不同版本的模板變體(variants),這些變體通過國家和語言區(qū)分,如下圖所示。
那么問題來了,運行時,負(fù)責(zé)生成 PDF 的 Form Processor 模塊,如何知道它應(yīng)該選擇哪個具體的 Form Template Variant 呢?這就得用到 Form Template 決定機(jī)制了。
由于 SAP BYD 的后臺 ABAP 源代碼對客戶和合作伙伴是不可見的,因此 Jerry 也無法在文章中截圖發(fā)布出來。這里將其邏輯大幅度簡化之后,用文字給大家描述原理。
SAP 決定機(jī)制實現(xiàn)的指導(dǎo)方針,用一句話概括就是:盡量把變化的內(nèi)容放到配置里,而把不變的內(nèi)容用編碼實現(xiàn)。
更精簡地說:Configuration Over Code - 配置優(yōu)于編碼。
在基于 ABAP 技術(shù)棧的 SAP 產(chǎn)品里,最常見的做法是使用數(shù)據(jù)庫表里的一條條記錄存儲配置信息。比如 SAP Business Suite,SAP Cloud for Customer,SAP Business ByDesign,SAP S/4HANA 等等。這一條條記錄叫做 Condition Record(條件記錄),存放這些記錄的表叫做 Condition Table(條件表)。
條件記錄存放了輸入和輸出的映射關(guān)系,或者說定義了從一條輸入數(shù)據(jù)決定出一條輸出數(shù)據(jù)的規(guī)則。
SAP 產(chǎn)品通常會提供專門的 UI 給客戶,作為維護(hù)條件記錄的入口,常見的配置界面有基于 SAPGUI 的 SPRO Customizing 和基于瀏覽器的 Business Configuration.
回到 SAP BYD 的 Form Template 決定機(jī)制實現(xiàn)。精簡過后的條件記錄集合如下圖所示。注意,下圖的數(shù)據(jù)只是 Jerry 為了闡述原理而準(zhǔn)備的測試數(shù)據(jù),和實際業(yè)務(wù)無關(guān)。
國家和語言兩列代表輸入集合,模板變體名稱代表輸出集合。
圖中第二行記錄代表當(dāng)發(fā)貨單的接收方對應(yīng)的 Business Partner BO 的國家和語言字段為 US 和 EN 組合時,生成 PDF 發(fā)貨單使用的模板 ID 為 DELIVERY-NOTE-V1.
以此類推,第三行代表 CN 和 ZH 的組合,使用模板 DELIVERY-NOTE-V2.
第四行中 * 的含義是通配符,如果國家字段有值,但是不為 US 和 CN,并且語言字段有值,但是不為 EN 和 ZH,這種情況下使用模板 DELIVERY-NOTE-VA.
第五行中符號 - 的含義是該字段并未維護(hù)值。這行的含義是,如果國家字段為 US,并且語言字段未維護(hù),此時使用 DELIVERY-NOTE-VB.
第六行代表只維護(hù)了國家字段,且值不為 US,然后語言字段未維護(hù),此時使用 DELIVERY-NOTE-VC.
最后一行意思是,如果國家和語言字段均未維護(hù),作為最后一道防線,使用模板 DELIVERY-NOTE-VZ.
這樣一來,我們成功將可能出現(xiàn)幾乎無限多種國家和語言的排列組合的 IF 條件,從編碼中移到了配置中。客戶只需要修改配置記錄,就能自行增加對新的國家和語言排列組合的支持。
條件表中的條件記錄,按照優(yōu)先級從高到低的順序進(jìn)行存儲。條件信息描述越具體的記錄(比如上圖最前兩行記錄,國家和語言都維護(hù)了對應(yīng)值),優(yōu)先級越高。包含了通配符的記錄次之,那些字段沒有維護(hù)值的條件記錄,優(yōu)先級最低。
優(yōu)先級最低的條件記錄,相當(dāng)于 IF ELSE 語句里最后一個分支,作為 Fall Back 機(jī)制。
決定機(jī)制引擎要做的事情,就是根據(jù)輸入,到條件表中查詢對應(yīng)的條件記錄,從匹配的記錄中解析輸出值。
SAP 客戶關(guān)系管理解決方案比如 SAP CRM,創(chuàng)建銷售訂單輸入 Sold-To Party 字段后,訂單其余的相關(guān) Business Partners 和 Sales Organization 信息都能夠自動被填充上對應(yīng)的值(即 SAP 顧問通常所說的“自動帶出來”):
這種自動填充的行為,通過 SAP CRM Business Partner Determination 和 Organization Unit Determination 機(jī)制完成。
SAP S/4HANA 的產(chǎn)品計價決定邏輯也是另一個大名鼎鼎的決定機(jī)制實現(xiàn)。在 S/4HANA 訂單行項目里維護(hù)產(chǎn)品 ID 和數(shù)量,能根據(jù)訂單信息,自動決定出該行項目的價格信息。
光數(shù)一數(shù)下圖每一行條件記錄的字段數(shù)就令人咂舌了,可想而知計價場景背后的業(yè)務(wù)邏輯有多么復(fù)雜。
Jerry 2017年的時候有幸去 SAP 德國總部工作三個月,參與 SAP CRM One Order 模型的重構(gòu)項目(詳情參考我的文章:Jerry的2017, 編程與游泳)。當(dāng)時我跟著 SAP CRM 首席架構(gòu)師 Carsten 去和 S/4HANA Pricing 的一位專家開會。Carsten 向我介紹這位專家:他在 Pricing 領(lǐng)域已經(jīng)工作了二十多年,熟知各種業(yè)務(wù)場景下的 Pricing 設(shè)計和實現(xiàn),堪稱一部 Pricing Walking Dictionary.
我端詳著眼前這位德國同事,他略顯瘦削,面容清癯,正微笑著注視著我。不算濃密的頭發(fā)已經(jīng)全白,戴一副黑框眼鏡,鏡片后的目光炯炯有神。聽著 Carsten 的介紹,我不由得肅然起敬,他在 Pricing 領(lǐng)域的耕耘時間比我整個職業(yè)生涯都還要長。
如果僅靠一維的條件記錄,不足以滿足決定場景的業(yè)務(wù)需要,那么可以使用一些更加專業(yè)的業(yè)務(wù)規(guī)則決定引擎。
在 SAP ABAP On-Premises 產(chǎn)品工作過的 ABAP 開發(fā)人員,可能都接觸或者聽說過 Business Rule Framework Plus(簡稱 BRF+)這個框架。
SAP BRF+ 主要包含實現(xiàn)存儲功能的規(guī)則倉庫(Rules Repository),以及根據(jù)用戶輸入,分析并執(zhí)行規(guī)則,返回給用戶處理結(jié)果的規(guī)則處理器(Rules Processor)兩部分。同前文介紹的 SAP 條件表技術(shù)相比,SAP BRF+ 支持種類更加多樣的條件數(shù)據(jù)結(jié)構(gòu),比如決策表,決策樹和公式等規(guī)則建模方式。
在 SAP 電商云里,我們選擇的是支持 Java Rules Engine API 標(biāo)準(zhǔn)的開源業(yè)務(wù)規(guī)則引擎和企業(yè)框架 Drools,來作為產(chǎn)品推薦和促銷規(guī)則管理引擎。
在 SAP Business Technology Platform 上,我們還可以利用云端的 Business Rules 服務(wù),維護(hù)好業(yè)務(wù)決定規(guī)則之后,通過 Restful API 調(diào)用的方式,觸發(fā)業(yè)務(wù)規(guī)則決定機(jī)制的執(zhí)行。
關(guān)于更多 SAP BTP Business Rules 服務(wù)的介紹,參考 Jerry 之前的文章:SAP 業(yè)務(wù)技術(shù)平臺(BTP) 上的 Business Rules Service 使用介紹。
如果對傳統(tǒng)的決定機(jī)制這種需要事先人工維護(hù)條件記錄的方式不滿意,可以嘗試更加智能的決定機(jī)制,比如 SAP Cloud for Customer 里借助機(jī)器學(xué)習(xí)實現(xiàn)的 Service Ticket Intelligence.
Service Ticket Intelligence 通過對傳入的客戶 Service Tickets 進(jìn)行分類(Classify)并在機(jī)器學(xué)習(xí)功能的幫助下,提供推薦(Recommend)和情緒分析,從而避免傳統(tǒng)的服務(wù)座席決定機(jī)制里繁瑣的座席分配規(guī)則的維護(hù),幫助客戶自動化其服務(wù)流程并提供更快的解決方案。
總結(jié)
本文首先概述了 SAP 決定機(jī)制實現(xiàn)的思路,接著用 SAP Business ByDesign Form 模板決定機(jī)制作為例子,簡單介紹了其實現(xiàn)原理。最后列舉了 SAP BRF+ 和 SAP BTP Business Rules Service 這些 SAP 自研的業(yè)務(wù)規(guī)則決定引擎,以及開源的 Drools 引擎在 SAP 電商云產(chǎn)品推薦和促銷管理場景中的應(yīng)用。希望對大家理解決定機(jī)制在解決企業(yè)復(fù)雜業(yè)務(wù)流程中所起的作用有一個基礎(chǔ)的理解,感謝閱讀。
有了本文的鋪墊,將來的文章,我會分享 SAP UI5 的語言決定機(jī)制,敬請期待。
更多閱讀
-
淺談 SAP CRM 和 Hybris Commerce里的價格架構(gòu)折扣
-
如何在Web應(yīng)用里消費SAP Leonardo的機(jī)器學(xué)習(xí)API
-
如何對SAP Leonardo上的機(jī)器學(xué)習(xí)模型進(jìn)行重新訓(xùn)練
-
SAP Leonardo圖片處理相關(guān)的機(jī)器學(xué)習(xí)服務(wù)在SAP智能服務(wù)場景中的應(yīng)用
-
使用Java程序消費SAP Leonardo的機(jī)器學(xué)習(xí)API
-
機(jī)器學(xué)習(xí)在SAP Cloud for Customer中的應(yīng)用
-
SAP 業(yè)務(wù)技術(shù)平臺(BTP) 上的 Business Rules Service 使用介紹
-
SAP 業(yè)務(wù)技術(shù)平臺(BTP) Workflow(工作流)功能介紹
更多Jerry的原創(chuàng)文章,盡在:“汪子熙”:
總結(jié)
以上是生活随笔為你收集整理的SAP 软件的精髓之一:各种各样的决定机制 - Determination Logic的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CCSP2021 分赛区
- 下一篇: 安装libssl-dev