AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

規(guī)則引擎與商業(yè)CRM的完美邂逅:將智能決策融入商業(yè)擴展

來源: 責編: 時間:2023-11-02 09:09:32 317觀看
導讀一、背景介紹商業(yè)CRM系統(tǒng)的商機模塊業(yè)務(wù)復雜、場景繁多、規(guī)則調(diào)整頻繁,商機流轉(zhuǎn)效率一定程度決定了銷售開單的效率。如何高效配合產(chǎn)品側(cè)完成業(yè)務(wù)規(guī)則調(diào)整,商機流轉(zhuǎn)經(jīng)歷了硬編碼到半配置化的優(yōu)化升級,過程中遇到了一些問

一、背景介紹

商業(yè)CRM系統(tǒng)的商機模塊業(yè)務(wù)復雜、場景繁多、規(guī)則調(diào)整頻繁,商機流轉(zhuǎn)效率一定程度決定了銷售開單的效率。如何高效配合產(chǎn)品側(cè)完成業(yè)務(wù)規(guī)則調(diào)整,商機流轉(zhuǎn)經(jīng)歷了硬編碼到半配置化的優(yōu)化升級,過程中遇到了一些問題,也總結(jié)了一些經(jīng)驗,今天來和大家掰開揉碎了講一講這其中遇到的問題和解決方案。XIB28資訊網(wǎng)——每日最新資訊28at.com

1.1 什么是CRM

先看一下CRM的官方定義:XIB28資訊網(wǎng)——每日最新資訊28at.com

CRM(Customer Relationship Management):客戶關(guān)系管理,是指企業(yè)為提高核心競爭力,利用相應(yīng)的信息技術(shù)以及互聯(lián)網(wǎng)技術(shù)協(xié)調(diào)企業(yè)與顧客間在銷售、營銷和服務(wù)上的交互,從而提升其管理效率,向客戶提供創(chuàng)新式的個性化的客戶交互和服務(wù)的過程。XIB28資訊網(wǎng)——每日最新資訊28at.com

其最終目標是:吸引新客戶、保留老客戶以及將已有客戶轉(zhuǎn)為忠實客戶,增加市場。XIB28資訊網(wǎng)——每日最新資訊28at.com

可以這么簡單的理解,CRM的核心價值就是:將潛在客戶更高效的轉(zhuǎn)化為客戶,將客戶更高效的轉(zhuǎn)化為長期客戶。XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

介紹完什么是CRM,那CRM系統(tǒng)就很容易理解了,用于支撐企業(yè)進行客戶關(guān)系管理的系統(tǒng),就可以稱作CRM系統(tǒng)。這個定義比較寬泛,每個公司對CRM中功能邊界也不完全一樣,大家初步理解這個概念就行。比如轉(zhuǎn)轉(zhuǎn)商業(yè)CRM系統(tǒng),主要包含:商機管理、客戶管理、銷售/運營人員管理、業(yè)績管理、效率監(jiān)控等功能模塊。XIB28資訊網(wǎng)——每日最新資訊28at.com

1.2 商機業(yè)務(wù)介紹

要想把潛在客戶變成客戶,就需要銷售人員進行跟進,對潛在客戶進行產(chǎn)品的售賣,用戶購買產(chǎn)品后,變成客戶。這個潛在客戶,我們稱作“商機”,也就是一次成單的機會,有的CRM系統(tǒng)中,也稱為“線索”。XIB28資訊網(wǎng)——每日最新資訊28at.com

上圖是潛在用戶到客戶簡單的流轉(zhuǎn)圖上圖是潛在用戶到客戶簡單的流轉(zhuǎn)圖XIB28資訊網(wǎng)——每日最新資訊28at.com

從商機生成到最終成單,銷售跟進過程中,涉及一些概念,比如商機池(公海池、私海池)、商機狀態(tài)/來源/類型/等級、商機的流轉(zhuǎn)等。XIB28資訊網(wǎng)——每日最新資訊28at.com

商機池:各種商機的集合。公海池:該集合里的商機當前不歸屬于任何銷售,所有銷售均可以看到公海里的商機。私海池:綁定了特定銷售的商機集合,比如銷售A的商機私海池,只有銷售A可以看到和跟進,其他銷售不可見、不可跟進。商機流轉(zhuǎn):商機在跟進過程中,被不同的銷售跟進,狀態(tài)發(fā)生不同的變化。流轉(zhuǎn)規(guī)則:流轉(zhuǎn)過程中會有各種各樣的業(yè)務(wù)規(guī)則限制,比如銷售最多可以認領(lǐng)100條商機、負責手機類目的銷售不能認領(lǐng)電腦類目的商機、銷售剛放棄的商機不能立馬重新認領(lǐng)、單位時間內(nèi)不進行電話溝通的商機將流出銷售私海等等。XIB28資訊網(wǎng)——每日最新資訊28at.com

二、商機流轉(zhuǎn)遇到的問題

2.1 商機流轉(zhuǎn)業(yè)務(wù)特點

這里舉一個例子來說明商機的流轉(zhuǎn),業(yè)務(wù)背景:商機對應(yīng)用戶主營類目為手機,銷售A、B負責手機類目,銷售C負責電腦類目,銷售D也負責手機類目。XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

這是一個簡單的流程,實際流程比這個復雜。從這個簡易的流程介紹中,可以窺見部分商機流轉(zhuǎn)模塊的業(yè)務(wù)特點,總結(jié)起來有三點:XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 狀態(tài)的多樣性

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 狀態(tài)間轉(zhuǎn)換場景繁多

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 流轉(zhuǎn)規(guī)則復雜多變

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

2.2 商機流轉(zhuǎn)業(yè)務(wù)痛點

之前商業(yè)CRM中關(guān)于流轉(zhuǎn)的處理邏輯,好多都是硬編碼,舉個銷售認領(lǐng)某條商機的例子:XIB28資訊網(wǎng)——每日最新資訊28at.com

//狀態(tài)校驗if(checkClueStatus(param)){ return “狀態(tài)不合法”;}//綁定人校驗if(checkClueBindUser(param)){ return “上一個綁定人不可以為···”;}//私海容量校驗if(checkPrivateClueCount(param)){ return “私海庫已滿,無法操作··”;}//類目校驗if(checkClueCate(param)){ return “類目不匹配,無法操作··”;}//任務(wù)是否完成校驗if(checkClueTaskFinished(param)){ return “任務(wù)未完成,無法操作··”;}  ······bind(param);//綁定操作log();//日志記錄操作

從代碼中可以看出,銷售從公海進行認領(lǐng)一條自己覺得有價值的商機時,并不是直接就讓該商機流入到該銷售私海中,這個過程會有各種規(guī)則的業(yè)務(wù)校驗。XIB28資訊網(wǎng)——每日最新資訊28at.com

2.2.1 痛點

  1. 硬編碼實現(xiàn)的業(yè)務(wù),維護成本大;
  2. 業(yè)務(wù)規(guī)則經(jīng)常調(diào)整,難以應(yīng)對變化,產(chǎn)研配合效率低;
  3. 業(yè)務(wù)規(guī)則調(diào)整需要配合修改代碼,重新上線后生效。

2.2.2 訴求

  1. 規(guī)則抽取成可配置項,調(diào)整方便;
  2. 校驗相關(guān)閾值,可隨時動態(tài)調(diào)整,無需上線;
  3. 代碼優(yōu)雅度適當提高。

帶著我們的痛點和訴求,接下來看看可以找到什么樣的解決方案。然后我們進入了調(diào)研階段,發(fā)現(xiàn)對于這種策略比較密集的業(yè)務(wù),規(guī)則引擎是一個可參考方向,然后就開始了解規(guī)則引擎相關(guān)細節(jié),了解完后,發(fā)現(xiàn)和業(yè)務(wù)問題匹配度很高。接下來,先介紹一下規(guī)則引擎相關(guān)的基本知識。XIB28資訊網(wǎng)——每日最新資訊28at.com

三、什么是規(guī)則引擎

3.1 什么是規(guī)則

規(guī)則就是:條件 --> 推理 --> 結(jié)果。一個完整的規(guī)則是需要這三部分元素的,平時大家討論規(guī)則,某些時候只是在討論第一部分的條件,比如學校的行為規(guī)范,咱們國家的各種法律條文,可能關(guān)注的部分是需要滿足什么條件(不能做什么什么),后面的推理和結(jié)果省去了。比如學生準則里的不辱罵同學,這是一個條件,那怎么算辱罵呢,這是推理過程,辱罵后會發(fā)生什么呢,會受到老師批評,這是結(jié)果。XIB28資訊網(wǎng)——每日最新資訊28at.com

那什么是推理引擎和規(guī)則引擎呢?XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 推理引擎:如果由程序來處理推理過程,那么這個程序就叫做推理機/推理引擎。
  • 規(guī)則引擎:基于規(guī)則的推理機易于理解、易于獲取、易于管理,被廣泛采用。這種推理引擎被稱為“規(guī)則引擎”。是一種嵌入在應(yīng)用程序中的組件,實現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來,并使用預(yù)定義的語義模塊編寫業(yè)務(wù)決策。接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,并根據(jù)業(yè)務(wù)規(guī)則做出業(yè)務(wù)決策。

3.2 推理引擎原理

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 模式匹配器決定選擇執(zhí)行哪個規(guī)則,何時執(zhí)行規(guī)則;
  • 議程管理模式匹配器挑選出來的規(guī)則的執(zhí)行次序;
  • 執(zhí)行引擎負責執(zhí)行規(guī)則和其他動作。

推理引擎通過決定哪些規(guī)則滿足事實或目標,并授予規(guī)則優(yōu)先級,滿足事實或目標的規(guī)則被加入議程,具體過程:XIB28資訊網(wǎng)——每日最新資訊28at.com

  1. 將初始數(shù)據(jù)(fact)輸入至工作內(nèi)存(Working Memory)。
  2. 使用Pattern Matcher將規(guī)則庫(Rules repository)的規(guī)則(rule)和數(shù)據(jù)(fact)比較。
  3. 如果執(zhí)行規(guī)則存在沖突(conflict),即同時激活了多個規(guī)則,將沖突的規(guī)則放入沖突集合。
  4. 解決沖突,將激活的規(guī)則按順序放入Agenda。
  5. 執(zhí)行Agenda中的規(guī)則。
  6. 重復步驟2至5,直到執(zhí)行完畢Agenda中的所有規(guī)則。

推理方式分為正向推理和反向推理XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 正向推理(演繹法):事實驅(qū)動,正向推理,直到無事實可用或者得出結(jié)論為止;
  • 反向推理(歸納法):目標驅(qū)動,提出假設(shè),尋找支持該假設(shè)的證據(jù),如果能找到證明,結(jié)論正確,如果不能,換假設(shè)繼續(xù)。

常見的模式匹配算法有Rete,LFA,TREAI,LEAPS。Rete算法是目前效率最高的一個演繹法推理算法,許多規(guī)則引擎都是基于Rete算法來進行推理計算的。XIB28資訊網(wǎng)——每日最新資訊28at.com

3.3 Rete算法

3.3.1 Rete算法簡介

  1. Rete在拉丁語中是“net”,有網(wǎng)絡(luò)的意思。Rete算法由Carnegie Mellon University的Dr Charles L. Forgy設(shè)計發(fā)明,是一個用來實現(xiàn)產(chǎn)生式規(guī)則系統(tǒng)(production/inference)的高效模式匹配算法。
  2. RETE算法可以分為兩部分:規(guī)則編譯(rule compilation)和運行時執(zhí)行(runtime execution)。
  • 規(guī)則編譯:是指根據(jù)規(guī)則集生成推理網(wǎng)絡(luò)的過程。
  • 運行時執(zhí)行:指將數(shù)據(jù)送入推理網(wǎng)絡(luò)進行篩選的過程。
  1. 相關(guān)概念:
  • 事實(fact):對象之間及對象屬性之間的關(guān)系
  • 規(guī)則(rule):是由條件和結(jié)論構(gòu)成的推理語句,一般表示為if…Then。一個規(guī)則的if部分稱為LHS(left-hand-side),then部分稱為RHS(right hand side)。
  • 模式(module):就是指IF語句的條件。這里IF條件可能是有幾個更小的條件組成的大條件。模式就是指的不能在繼續(xù)分割下去的最小的原子條件。

3.3.2 Rete算法原理

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

這是Rete算法的原理圖,Rete算法涉及兩種網(wǎng)絡(luò)和6種不同作用的節(jié)點。XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 網(wǎng)絡(luò)節(jié)點:Type Node、Select Node、Join Node、Teminal Node、Alpha Memory、Beta Memory
  • alpha網(wǎng)絡(luò):過濾working memory,找出符合規(guī)則中每一個模式的集合,生成alpha memory(滿足該模式的集合)。
  • Beta網(wǎng)絡(luò):有兩種類型的節(jié)點Beta Memory和Join Node。前者主要存儲Join完成后的集合。后者包含兩個輸入口,分別輸入需要匹配的兩個集合,由Join節(jié)點做合并工作傳輸給下一個節(jié)點。

3.3.2.1 Rete推理網(wǎng)絡(luò)生成過程

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  1. 創(chuàng)建root節(jié)點(根節(jié)點),推理網(wǎng)絡(luò)的入口。
  2. 拿到規(guī)則1,從規(guī)則1中取出模式1(模式就是最小的原子條件,所以規(guī)則模式的關(guān)系是1:n)。

a)   檢查模式1中的參數(shù)類型,如果是新類型,添加一個類型節(jié)點。XIB28資訊網(wǎng)——每日最新資訊28at.com

b)   檢查模式1對應(yīng)的Alpha節(jié)點是否存在,如果存在記錄下節(jié)點的位置;如果沒有,將模式1作為一個Alpha節(jié)點加入到網(wǎng)絡(luò)中。同時根據(jù)Alpha節(jié)點建立Alpah內(nèi)存表。XIB28資訊網(wǎng)——每日最新資訊28at.com

c)   重復b,直到處理完所有模式。XIB28資訊網(wǎng)——每日最新資訊28at.com

d)   組合Beta節(jié)點:Beta(2)左輸入節(jié)點為Alpha(1),右輸入節(jié)點為Alpha(2);Beta(i)左輸入節(jié)點是Beta(i-1),右輸入節(jié)點為Alpha(i),并將兩個父節(jié)點的內(nèi)存表內(nèi)聯(lián)成為自己的內(nèi)存表。XIB28資訊網(wǎng)——每日最新資訊28at.com

e)   重復d,直到所有Beta節(jié)點處理完畢。XIB28資訊網(wǎng)——每日最新資訊28at.com

f)   將動作Then部分封裝成最后節(jié)點做為Beta(n)。XIB28資訊網(wǎng)——每日最新資訊28at.com

  1. 重復2,直到所有規(guī)則處理完畢。

3.3.2.2 Rete匹配過程

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 導入需要處理的事實到facts集合中。
  • 如果facts不為空,選擇一個fact進行處理。否則停止匹配過程。
  • 選擇alpha網(wǎng)的第一個節(jié)點運行(建立網(wǎng)絡(luò)的時候設(shè)定的),通過該節(jié)點則進入alpha網(wǎng)的下一個節(jié)點,直到進入alpha memory。否則跳轉(zhuǎn)到下一條判斷路徑。
  • 將alpha memory的結(jié)果加入到beta memory中,如果不為Terminal節(jié)點,則檢測另一個輸入集合中是否存在滿足條件的事實,滿足則執(zhí)行join,進入到下一個beta memory重復執(zhí)行3。若另一個輸入集合無滿足條件的事實,返回到2。如果該節(jié)點為Terminal節(jié)點,執(zhí)行ACT并添加到facts中。

3.3.3 Rete算法實例

上面介紹的這些都偏理論化,可能有一點不太容易理解,沒關(guān)系,接下來咱們用一個具體的例子,看看Rete算法到底是如何運行的。咱們依然以這個選拔籃球苗子的例子來說明。XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 首先看下對應(yīng)的網(wǎng)絡(luò)圖

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • Rete匹配過程
  • 匹配過程詳解

A節(jié)點:拿StudentFact的年級數(shù)值進行年級匹配,如果年級符合條件,則把該StudentFact的引用記錄到A節(jié)點的alpha內(nèi)存區(qū)中,退出年級匹配。XIB28資訊網(wǎng)——每日最新資訊28at.com

B節(jié)點:拿StudentFact的性別內(nèi)容進行性別匹配,如果性別符合條件,則把該StudentFact的引用記錄到B節(jié)點的alpha內(nèi)存區(qū)中,然后找到B節(jié)點左引用的Beta節(jié)點,也就是C節(jié)點。XIB28資訊網(wǎng)——每日最新資訊28at.com

C節(jié)點:C節(jié)點找到自己的左引用也就是A節(jié)點,看看A節(jié)點的alpha內(nèi)存區(qū)中是否存放了StudentFact的引用,如果存放,說明年級和性別兩個條件都符合,則在C節(jié)點的Beta內(nèi)存區(qū)中存放StudentFact的引用,退出性別匹配。XIB28資訊網(wǎng)——每日最新資訊28at.com

D節(jié)點:拿StudentFact的年齡數(shù)值進行年齡條件匹配,如果年齡符合條件,則把該StudentFact的引用記錄到D節(jié)點的alpha的內(nèi)存區(qū)中,然后找到D節(jié)點的左引用的Beta節(jié)點,也就是E節(jié)點。XIB28資訊網(wǎng)——每日最新資訊28at.com

E節(jié)點:E節(jié)點找到自己的左引用也就是C節(jié)點,看看C節(jié)點的Beta內(nèi)存區(qū)中是否存放了StudentFact的引用,如果存放,說明年級,性別,年齡三個條件符合,則在E節(jié)點的Beta內(nèi)存區(qū)中存放StudentFact的引用,退出年齡匹配。XIB28資訊網(wǎng)——每日最新資訊28at.com

F節(jié)點:拿StudentFact的身體數(shù)值進行身體條件匹配,如果身體條件符合,則把該StudentFact的引用記錄到D節(jié)點的alpha的內(nèi)存區(qū)中,然后找到F節(jié)點的左引用的Beta節(jié)點,也就是G節(jié)點。XIB28資訊網(wǎng)——每日最新資訊28at.com

G節(jié)點:G節(jié)點找到自己的左引用也就是E節(jié)點,看看E節(jié)點的Beta內(nèi)存區(qū)中是否存放了StudentFact的引用,如果存放,說明年級,性別,年齡,身體四個條件符合,則在G節(jié)點的Beta內(nèi)存區(qū)中存放StudentFact的引用,退出身體匹配。XIB28資訊網(wǎng)——每日最新資訊28at.com

H節(jié)點:拿StudentFact的身高數(shù)值進行身高條件匹配,如果身高條件符合,則把該StudentFact的引用記錄到H節(jié)點的alpha的內(nèi)存區(qū)中,然后找到H節(jié)點的左引用的Beta節(jié)點,也就是I節(jié)點。XIB28資訊網(wǎng)——每日最新資訊28at.com

I節(jié)點:I節(jié)點找到自己的左引用也就是G節(jié)點,看看G節(jié)點的Beta內(nèi)存區(qū)中是否存放了StudentFact的引用,如果存放了,說明年級,性別,年齡,身體,身高五個條件都符合,則在I節(jié)點的Beta內(nèi)存區(qū)中存放StudentFact引用。同時說明該StudentFact對象匹配了該規(guī)則,形成一個議程,加入到?jīng)_突區(qū),執(zhí)行該條件的結(jié)果部分:該學生是一個籃球苗子。XIB28資訊網(wǎng)——每日最新資訊28at.com

3.3.4 Rete算法的優(yōu)點

  • 可共享node和memory,提高效率;
  • memory存儲中間結(jié)果,空間換時間,避免重復計算;
  • Rete 匹配速度與規(guī)則數(shù)目無直接關(guān)系,因為fact只有滿足本節(jié)點才會繼續(xù)向下沿網(wǎng)絡(luò)傳遞。

3.3.5 Rete算法的缺點

規(guī)則的條件與facts的數(shù)目如果過大,對應(yīng)memory會指數(shù)級升高,極端情況下會耗盡系統(tǒng)資源。XIB28資訊網(wǎng)——每日最新資訊28at.com

3.3.6 Rete算法使用建議

  • 容易變化的規(guī)則盡量置后匹配,可以減少規(guī)則的變化帶來規(guī)則庫的變化。
  • 約束性較為通用或較強的模式盡量置前匹配,可以避免不必要的匹配。
  • 針對 Rete 算法內(nèi)存開銷大和facts增加刪除影響效率的問題,技術(shù)上應(yīng)該在 AlphaMemory 和 BetaMemory 中,只存儲指向內(nèi)存的指針,并對指針建里索引(可用 hash 表或者非平衡二叉樹)。
  • Rete 算法 JoinNode 可以擴展為 AndJoinNode 和 OrJoinNode,兩種節(jié)點可以再進行組合。

看完這個匹配的過程,相信大家對規(guī)則引擎中常用的Rete算法有了一定的了解。回到規(guī)則引擎,那為啥用規(guī)則引擎呢,也就是它有何優(yōu)勢,以及有哪些適用的場景呢?XIB28資訊網(wǎng)——每日最新資訊28at.com

3.4 規(guī)則引擎優(yōu)勢

  1. 高靈活性:規(guī)則保存在知識庫中,規(guī)則變動可以輕易做出修改。
  2. 容易掌控:規(guī)則比過程代碼更易于理解,因此可以有效地來彌補業(yè)務(wù)人員和開發(fā)人員之間的溝通問題。
  3. 降低復雜度:在程序中編寫大量的判斷條件,很可能是會造成一場噩夢。使用規(guī)則引擎卻能夠通過一致的表示形式,更好的處理日益復雜的業(yè)務(wù)邏輯。開發(fā)人員也可以更關(guān)注邏輯處理,而無需過多關(guān)注邏輯判斷。
  4. 可重用性:規(guī)則集中管理,可提高業(yè)務(wù)的規(guī)則的可重用性。而且,傳統(tǒng)的代碼程序通常會添加不必要的變數(shù),很難進行重復利用。
  5. 規(guī)則外部化:即有利于規(guī)則知識的復用,也可避免改變規(guī)則時帶來的代碼變更問題。

3.5 規(guī)則引擎使用場景

一般多用于規(guī)則較多且規(guī)則調(diào)整頻繁的業(yè)務(wù)場景,比如:積分規(guī)則、計費系統(tǒng)、信用風險評估、監(jiān)控告警、工作流系統(tǒng)。XIB28資訊網(wǎng)——每日最新資訊28at.com

3.6 規(guī)則引擎的分類

網(wǎng)上有兩種分類方式,這里我列舉出來,供大家了解。XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 基于實現(xiàn)方式
  • 基于完成度和功能配置

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

四、商機流轉(zhuǎn)問題解決方案

了解了上面這些業(yè)務(wù)背景以及遇到的問題,也熟悉了規(guī)則引擎的理論知識,現(xiàn)在需要制定具體的解決方案了,我們怎么做的呢?市面有各種各樣的規(guī)則引擎,先進行技術(shù)選型,這里列舉下當前主流規(guī)則引擎優(yōu)缺點。XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

通過各方面綜合評估,重點放到了Drools和easyRule兩者,且easyRule最終勝出。XIB28資訊網(wǎng)——每日最新資訊28at.com

4.1 Drools和easyRule對比

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

確定了要使用easyRule就得知道easyRule如何使用的,先介紹下其相關(guān)概念和使用方法。XIB28資訊網(wǎng)——每日最新資訊28at.com

4.2 easyRule插件介紹

4.2.1 規(guī)則說明

  • name:規(guī)則命名空間中的唯一規(guī)則名稱
  • description:規(guī)則的簡要描述
  • priority:規(guī)則的優(yōu)先級
  • facts:觸發(fā)規(guī)則時的一組已知事實
  • conditions:在給定一些事實的情況下,為了應(yīng)用該規(guī)則,需要滿足的一組條件
  • actions:滿足條件時要執(zhí)行的一組操作(可能會添加/刪除/修改事實)

4.2.2 規(guī)則定義方式

  • 通過在POJO上添加注解來聲明
  • 通過RuleBuilder API編程

4.2.3 組合規(guī)則用法

Easy Rules提供了3種CompositeRule的實現(xiàn)。XIB28資訊網(wǎng)——每日最新資訊28at.com

  • UnitRuleGroup:要么應(yīng)用所有規(guī)則,要么不應(yīng)用任何規(guī)則。--要么全用要么不用
  • ActivationRuleGroup:激活規(guī)則組觸發(fā)第一個適用規(guī)則并忽略組中的其他規(guī)則。--首個選用
  • ConditionalRuleGroup:條件規(guī)則組將具有最高優(yōu)先級的規(guī)則作為條件,如果具有最高優(yōu)先級的規(guī)則的計算結(jié)果為true,那么將觸發(fā)其余的規(guī)則。--優(yōu)先級最高說了算

4.2.4 自定義優(yōu)先級

值越低優(yōu)先級越高。要覆蓋此行為,可重寫compareTo()方法以提供自定義優(yōu)先級策略。XIB28資訊網(wǎng)——每日最新資訊28at.com

4.2.5 引擎執(zhí)行模式

  • skipOnFirstAppliedRule:當一個規(guī)則成功應(yīng)用時,跳過余下的規(guī)則。--一個成功,不管其他
  • skipOnFirstFailedRule:當一個規(guī)則失敗時,跳過余下的規(guī)則。--一個失敗,不管其他
  • skipOnFirstNonTriggeredRule:當一個規(guī)則未觸發(fā)時,跳過余下的規(guī)則。--一個不符合,不管其他
  • rulePriorityThreshold:當優(yōu)先級超過指定的閾值時,跳過余下的規(guī)則。--優(yōu)先級達標,不管其他

4.2.6 多種監(jiān)聽器可供選擇

支持自定義規(guī)則監(jiān)聽器、規(guī)則引擎監(jiān)聽器。XIB28資訊網(wǎng)——每日最新資訊28at.com

4.2.7 表達式語言支持

支持MVEL、SPEL表達式語言,可通過編程方式定義規(guī)則。XIB28資訊網(wǎng)——每日最新資訊28at.com

4.2.8 規(guī)則中的錯誤處理

  • 對于條件求值過程中可能發(fā)生的任何運行時異常(丟失事實、表達式中輸入錯誤等),引擎將記錄一個警告,并認為條件求值為false。
  • 對于任何在執(zhí)行操作時可能發(fā)生的運行時異常(丟失事實、表達式中輸入錯誤等),該操作將不會執(zhí)行,引擎將記錄一個錯誤。

4.3 easyRule使用樣例

還是用篩選籃球苗子的例子XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 定義一個學生實體類
public class Student {    /**     * 年級     */    private Integer grade;    /**     * 性別     */    private String gender;    /**     * 年齡     */    private Integer age;    /**     * 是否強壯     */    private Boolean isStrong;    /**     * 身高     */    private Integer height;    /**     * 是否一個好苗子     */    private Boolean isGoodSeed = true;}
  • 定義規(guī)則(有多種方式,我列舉幾種)
//創(chuàng)建規(guī)則1-年級Rule rule1 = new MVELRule()        .name("grade rule")        .description("判斷一個學生是否是一個籃球好苗子-年級")        .priority(1)        .when("student.getGrade() <= 3")        .then("System.out.println(/"年級-不是好苗子/");")        .then("student.setIsGoodSeed(false);");
//創(chuàng)建規(guī)則2-性別Rule rule2 = new MVELRuleFactory(new YamlRuleDefinitionReader()).        createRule(new FileReader(                ResourceUtils.getFile("classpath:gender-rule.yml")));

規(guī)則2需要的yml文件內(nèi)容如下:XIB28資訊網(wǎng)——每日最新資訊28at.com

name: "gender rule"description: "判斷一個學生是否是一個籃球好苗子-性別"priority: 2condition: "student.getGender().equals(/"girl/")"actions:  - "System.out.println(/"性別-不是好苗子/");student.setIsGoodSeed(false);"
//創(chuàng)建規(guī)則3-年齡  Rule rule3 = new MVELRuleFactory(new JsonRuleDefinitionReader()).          createRule(new FileReader(                  ResourceUtils.getFile("classpath:age-rule.json")));
//創(chuàng)建規(guī)則4-是否強壯Condition condition = new MVELCondition("!student.getIsStrong()");Action action = new Action() {    @Override    public void execute(Facts facts) throws Exception {        Student student1 = (Student) facts.get("student");        student1.setIsGoodSeed(false);        System.out.println("強壯-不是好苗子");    }};Rule rule4 = new RuleBuilder()        .name("strong rule")        .description("判斷一個學生是否是一個籃球好苗子-是否強壯")        .priority(4)        .when(condition)        .then(action).build();
@Rule(name = "height rule" ,description = "判斷一個學生是否是一個籃球好苗子-身高")public class HeightRule {    @Condition    public boolean checkHeight(){ return student.getHeight() <= 170;}    @Action    public void action(){        System.out.println("身高-不是好苗子");        student.setIsGoodSeed(false);    }    private Student student;    public HeightRule(Student student){        this.student = student;    }}//創(chuàng)建規(guī)則5-身高HeightRule rule5 = new HeightRule(student);
  • 創(chuàng)建實例(fact)
//創(chuàng)建一個Student實例(Fact)  Student student = new Student(3,"girl",9,true, 160,true);  Facts facts = new Facts();  facts.put("student", student);
  • 創(chuàng)建引擎,并執(zhí)行規(guī)則
//注冊規(guī)則Rules rules = new Rules();rules.register(rule1);rules.register(rule2);//rules.register(rule3);rules.register(rule4);rules.register(rule5);//創(chuàng)建規(guī)則執(zhí)行引擎,并執(zhí)行規(guī)則RulesEngine rulesEngine = new DefaultRulesEngine();System.out.println("開始判斷是否是一個籃球苗子:" + JSON.toJSONString(student));rulesEngine.fire(rules, facts);System.out.println("是否為好苗子:" + student.getIsGoodSeed());
  • 執(zhí)行結(jié)果

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

4.4 商機流轉(zhuǎn)如何接入easyRule

熟悉了easyRule如何使用的,接下來看看我們?nèi)绾卧陧椖恐新涞氐模覀兎至藥撞剑?span style="display:none">XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 將easyRule工具包進行二次改裝,使其執(zhí)行規(guī)則后能有返回值,封裝成jar包,將規(guī)則引擎抽取成通用能力。

初始化規(guī)則相關(guān)配置(首次初始化+定時更新);XIB28資訊網(wǎng)——每日最新資訊28at.com

提供對外public T fire(String ruleId, V v)通用的規(guī)則引擎api接口。XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

這里我們將規(guī)則引擎的處理結(jié)果進行了返回,因為業(yè)務(wù)上很多場景需要,比如不符合規(guī)則時的提醒文案。XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 將現(xiàn)有的流轉(zhuǎn)規(guī)則進行整理提取,將各種判斷條件拆解成單一的指標判斷。
  • 項目中引入easyRule工具。

項目中配置規(guī)則引擎相關(guān)配置;XIB28資訊網(wǎng)——每日最新資訊28at.com

實例化RuleEngineTemplate類;XIB28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)場景,組裝上下文context;XIB28資訊網(wǎng)——每日最新資訊28at.com

調(diào)用ruleEngineTemplate.fire(ruleId,context)方法。XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

引入后,我們的商機流轉(zhuǎn)流程發(fā)生了如下變化:XIB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

4.5 商機解綁流程舉例

  • 商機解綁流程

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

  • 解綁對應(yīng)的規(guī)則配置application.yml
spring:  easy-rule:    priority-threshold: 100    skip-on-first-failed-rule: false    skip-on-first-applied-rule: true    skip-on-first-non-triggered-rule: false    rules:      - rule-id: "opportunity_unbind"        rule-file-location: "opportunity_unbind" #規(guī)則配置文件        rule-config-type: JSON        rule-factory-type: SPEL

具體的規(guī)則配置jsonXIB28資訊網(wǎng)——每日最新資訊28at.com

[      {        "name": "bind_check_cate",        "description": "判斷是否凍結(jié)-72小時",        "condition": "@opportunityUnbindRuleBll.checkOpportunityNeedFreeze(#context.getOpportunityId(), n,m)",        "priority": 4,        "actions": [          "@clueOpporBll.unbindOpportunity(#context,T(OpportunityStatusEnum).UNBIND, T(com.clue.enums.OpportunityMinorStatusEnum).UNBIND_FROZEN)"        ]      },      {        "name": "task_bind_out",        "description": "任務(wù)商機流回公海",        "condition": "#context.getOpportunityStatus() == T(com.enums.OpportunityStatusEnum).TASK && #context.getOperationTypeEnum() == T(com.OpportunityOperationTypeEnum).TASK_BACK_PUBLIC",        "priority": 5,        "actions": [          "@clueBll.unbindOpportunity(#context,T(com.zhuanzhuan.biz.clue.enums.OpportunityStatusEnum).UNBIND, T(com.OpportunityMinorStatusEnum).UNBIND_NORMAL)"        ]      },      {        "name": "unbind_operate",        "description": "判斷解綁后去向,現(xiàn)階段全部回到公海",        "condition": "true",        "priority": 10,        "actions": [          "@clueOpportunityBll.unbindOpportunity(#context,T(com.OpportunityStatusEnum).UNBIND, T(com.enums.OpportunityMinorStatusEnum).UNBIND_NORMAL)"        ]      }    ]  }]
  • 業(yè)務(wù)代碼
public Result<ParallelExecuteDTO> unbindOpportunity(UnbindOpportunityRequest request) {  return parallelExecutor.parallelExecute(request.getOpportunityIds(), (Long opportunityId) -> {            final Result<String> unbindResult = opportunityUnbindRuleBll.unbindOpportunity(opportunityId, request.getOperator(),                  request.getReasonType(), request.getReasonDesc(), request.getOperationType());            logger.info("method=unbindOpportunity, act=unbind, opportunityId={},unbindResult={}", opportunityId, unbindResult);            return unbindResult;            }        );    }

4.6 引入規(guī)則引擎前后效果對比

圖片圖片XIB28資訊網(wǎng)——每日最新資訊28at.com

五、總結(jié)

在easyRule引入商機流轉(zhuǎn)業(yè)務(wù)過程中,從調(diào)研到選型再到最終落地,遇到了各種大大小小的問題,但最終的效果還是比較明顯的,對團隊的整體效率提升非常明顯,這里有幾點總結(jié)與建議與大家分享。XIB28資訊網(wǎng)——每日最新資訊28at.com

  1. 系統(tǒng)引入規(guī)則引擎,一定要場景符合,不能為了引入而引入;
  2. 業(yè)務(wù)規(guī)則轉(zhuǎn)換為抽象的規(guī)則配置,可以多和業(yè)務(wù)人員交流,他們對于規(guī)則的理解可能更深刻;
  3. 選擇規(guī)則引擎方案后,需要定好規(guī)則維護規(guī)范,后續(xù)執(zhí)行按照規(guī)范維護;
  4. 對于集群中沒有直接引用的代碼,不要直接清理,有可能是在規(guī)則文件里有引用。

作者介紹

楊迎,轉(zhuǎn)轉(zhuǎn)商業(yè)后端開發(fā)工程師,目前負責商業(yè)B端相關(guān)業(yè)務(wù)系統(tǒng)開發(fā)(商機線索、客戶運營、銷售運營管理、廣告發(fā)布等)。XIB28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-16530-0.html規(guī)則引擎與商業(yè)CRM的完美邂逅:將智能決策融入商業(yè)擴展

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在Lombok的加持下,“小狗”.Equals(“老狗”) = True

下一篇: 聽說你會架構(gòu)設(shè)計?來,弄一個微信群聊系統(tǒng)

標簽:
  • 熱門焦點
Top