CRM系統化整合從N-1做減法實踐

来源:https://www.cnblogs.com/Jcloud/archive/2023/07/24/17576518.html
-Advertisement-
Play Games

京銷易系統已經接入大網、KA以及雲倉三個條線商機,每個條線商機規則差異比較大,當前現狀是獨立實現三套系統分別做支撐。 ...


1 背景

京銷易系統已經接入大網、KA以及雲倉三個條線商機,每個條線商機規則差異比較大,當前現狀是獨立實現三套系統分別做支撐。

2 目標

2022年下半年CRM目標是完成9個新條線業務接入,完成銷售過程線上化,實現銷售規則統一。

3 問題

  • 前端實現數據存儲與邏輯代碼耦合一起,無法復用,無法擴展,組件化拆分難度大。
  • 組件拆分顆粒度較大,業務功能抽象不充分,缺乏復用性。
  • 代碼重覆編寫,相似功能冗餘嚴重,開發和維護效率低。
  • 代碼版本多,介面不統一,開發、運維成本高,難擴展。
  • 每個條線階段、條線內每個商機階段推進規則都是通過代碼單獨實現,開發、維護成本高,規則調整都需要代碼調整並上線,時效性低,同時階段規則維護在代碼中,無法直觀呈現和規則統一收口,運維難度大。

4 實現

4.1 方案調研

方案調研階段,針對業務場景,多次組會對於底層實現方案進行充分討論,列舉每個方案優劣勢,選擇最適合當前業務場景的解決方案,最終選擇上圖的框架升級方案。

4.2 方案設計

4.2.1 設計思路

快速實現相似業務,減少相似代碼,通過前端組件化、後端服務標準化、商機階段配置化技術手段,支持各條線快速復用和靈活擴展。

4.2.2 前端組件化

1.前端現狀

數據存儲與邏輯代碼耦合在一起,無法復用,無法擴展,組件化拆分難度大。表現為mixins邏輯代碼與store數據存儲耦合在一起,既降低了代碼的可讀性,也降低了store數據讀寫的靈活性。舉個慄子,在人員信息集合中,本來可以針對name和sex兩個欄位在各自的組件進行維護即可,可現實是兩個組件不得不調用同一個mixins進行維護。

組件拆分顆粒度較大,業務功能抽象不充分,缺乏復用性。組件的拆分沒有一個清晰的界限,沒有依據業務功能進行拆分,導致有一些組件不夠純粹,不符合單一職責原則,無法復用。在後期的維護過程中組件逐漸變得臃腫不堪。

代碼重覆編寫,相似功能冗餘嚴重,開發和維護效率低。由於組件無法復用,在後期維護過程中,開發人員對於類似的功能,不得不寫了很多相似的代碼,致使整個項目代碼冗餘、重覆,慢慢的變得不可維護。

2.解決方案

針對本次商機條線接入功能,採用現有技術方案很難對後續條線依次接入,一個條線一套代碼實現,接入周期長人力成本高,按期完成目標是一項不可能完成的挑戰。經過技術方案調研,決定搭建一套求同存異(同為各個條線共用部分,異為各個條線單獨部分)的前端組件化方案。依據業務功能,抽象出獨立業務組件模塊,依據條線插拔式組裝,搭建出可維護、可擴展、靈活性高的組件積木化方案,在業務擴展性比較強的前端模塊架構中優勢更加明顯。

組件積木化方案特點如下:

1.方案採用積木化前端組件搭建,其中任何一個組件都可以被替換(webComponent),任何一個父組件都可以擴展n個子組件。以上圖商機信息組件為例,各條線商機信息所包含的欄位存在差異,每個條線所對應的商機信息組件不同,最終會根據條線選擇對應的組件載入。

2.數據統一管理(store),組件和數據之間為更新和依賴關係,當有組件更新數據時,其他組件也會立即更新,而不用相互傳值。以商機詳情組件為例,商機詳情中修改了商機名稱欄位,則所有用到商機名稱的組件都會得到更新。這需要提前對組件和store進行數據依賴更新的建立,通過computed與store雙向依賴和監控機制,當computed監聽store數據變化,將變化的數據更新到組件上,組件中通過store的mutaions更新數據到store上。

商機詳情組件化抽象示意圖如下:

4.2.3 後端標準化後端現狀

由於前期未對條線的領域模型和功能模塊進行抽象,導致煙囪代碼林立;每個條線接入都要重覆開發多套代碼,各端(PC、移動端)介面不統一,前後端聯調對接介面都需要區分多套;各條線獨立開發部署,隨著系統功能的豐富以及產品線持續增加,個性化需求和缺陷修複極大的消耗了研發資源和精力。同時,無法滿足各條線商機階段推進可定製的業務訴求,大致狀態如下圖。

2.解決方案

通過梳理商機流程與功能可以發現,商機中各條線既有相同的功能模塊,也有各自獨有的功能,例如商機創建、關閉、激活等流程每個條線差異不大,但是有些相似的功能模塊各條線也存在差異,例如大宗的關閉商機與服務+中的關閉商機各自的關閉條件就不一樣;那麼基於此種業務場景,首先我們需要將主流程抽象出標準服務能力;例如,商機創建流程,我們將其定義為許可權校驗、參數校驗、額外特殊校驗、補充信息、模型轉換、保存數據、跨區校驗、後續額外處理等標準模板服務;每一個步驟方法都是抽象的,後續每個條線都將繼承它,可以重寫自己的邏輯;這樣一個創建商機流程就標準化了。

上述我們是根據業務特性進行的模板抽象固化,但是如何將整個架構按照條線來走呢,這就需要我們將每個條線的流程進行抽象,例如,幾乎每個條線都有創建商機、關閉商機、激活商機、修改商機等相同的動作,我們需要將這些抽象成固定的介面;然後各自條線都實現該介面並聲明成策略,根據入參的識別自動分流至不同條線策略處理;也就形成了按條線為策略錨點的模式。

所以總體上是利用策略模式 + 模板模式支持各條線快速復用和靈活擴展,整體服務抽象復用及擴展思路形成大致的核心類圖如下圖:

整個商機的後端架構經過單條線多套介面處理的方式調整為適配所有條線統一介面接入;後端整體架構大致分5層,在核心層其實還會細分邏輯層,代理層以及Mapper 層。

首先我們在這次改造過程中統一了介面層,不在區分PC端介面,JME 端介面,統一以JSF介面形式提供出去;然後藉助物流網關配置PC認證以及JME認證並一致以Http協議對接出去,保證了介面層面的統一。在適配層我們是定義了一個策略適配器,它會掃描所有聲明瞭註解@LineType的策略處理器並緩存,然後根據解析入參中的條線進行自動匹配處理器進行分配處理,從而達到請求的自動分配處理。在核心層中其實更多的是模板方法的抽象與封裝,將商機的基本查詢、基礎CMD操作、以及商機相關聯信息操作進行分類抽象。將商機的推進機制建立在規則引擎中,將每個條線的推進規則提前配置在規則引擎的規則表中,併在後端服務中統一提供一個推進入口,所有條線都將基於該入口進行推進,達到推進規則明確,入口統一,階段可配置等可靈活擴展的方式。

通過整體架構的優化和調整後,目前已經可以適配所有條統一接入、商機階段可配置,推進規則可定義、介面統一等優點,大大節省了研發的接入成本。

4.2.4 商機階段配置化

1.場景現狀

每個銷售條線的商機流程階段及相應規則都存在差異,甚至同一個銷售條線也存在多種業務,對應的商機流程階段也不同,為支持多銷售條線的差異化商機業務;要求必須實現每個條線的商機階段個數是可配置的,並且每個階段的規則也是可配置。

2.方案選型

如下圖中所示,列舉了幾個條線的商機階段生命周期,幾乎每個條線的商機生命周期都不一樣,這裡需要說明一下階段與階段之間的推進條件是允許不一樣的,所以會存在不同條線存在相同的階段,但其實到達該階段的前置條件是有可能不一樣的,這就要求階段的規則是可配置的,這也會造成可復用的可能性小。如果通過編碼方式去實現每個條線的階段生命周期會是一個非常複雜的過程,並且也難以維護。

經過調研發現,我們的這種場景模型就是通過多個入參條件決定流程走向(通過、不通過)的一種簡單形式,相對於多入多出的模式還簡單一些,而這種模式正好現在已經有比較好的解決方案(規則引擎),在現有的流程引擎(Flowable、Activity)都有對規則引擎的實現,包括強大的Drools 規則引擎。對比幾款規則引擎幾乎都可以很好的滿足我們的需求,那就要考慮成本問題,畢竟引入一款中間件對系統的維護成本也是比較大的。經過瞭解部門內部已經對Flowable 已經進行二次封裝對外賦能了,所以在這邊我們採用了基於Flowable 流程引擎中的DMN來實現,從模型上來說就是輸入多個入參,然後根據規則配置進行判斷走向,沒有多分支相關聯,所以選擇Flowable 的規則引擎也比較合適。

解決方案:通過規則引擎,配置商機階段和階段推進規則,解決各條線商機階段差異化問題,將變化流程用配置化方式融入到整體流程中。

3.實現效果

在規則引擎中,提供決策表的表達式,決策表分為輸入表達式與輸出表達式兩個主要區域。在輸入表達式中,可以定義變數,用於規則輸入項(input entries)的表達式。可以通過選擇Add Input(添加輸入),定義多個輸入表達式。在輸出表達式中,可以定義選擇表執行結果要創建的變數(變數的值將用於輸出項表達式,在下麵解釋)。可以通過選擇Add Output(添加輸出),定義多個輸出表達式。

規則配置如下圖:(以服務+條線舉例)

服務+ 權授權業務商機推進規則:jd-rule-crm_fwj_chance_authorized_business

服務+ B線上業務商機推進規則:jd-rule-crm_fwj_chance_b_online_business

優勢:

  1. 規則統一收口,每個條線商機階段推進規則可以直觀呈現,規則演化軌跡可以追蹤,避免問題排查時,通過代碼排查方式核對規則,提升運維效率。
  2. 規則調整可以實時生效,避免代碼維護和系統上線,提升研發效率。
  3. 一套代碼實現所有條線階段推進,只需要根據條線添加不同的輸入即可。

5 效果

5.1 提升效率

消滅煙囪系統,一套系統完成所有條線支撐,實現各條線、各端介面統一。

開發成本低,易擴展,提升研發效率,降低運維成本;

按照領域對商機進行拆分解耦,實現商機領域獨立部署,在商機領域內,通過前端組件化、後端服務標準化、商機階段配置化技術手段,支持各條線快速復用和靈活擴展。接入對比結果來看,研發效率提升顯著,同時也降低運維成本。隨著標準流程不斷抽象,底層基礎服務不斷完善,後續條線接入的效率在進一步提升,從後續接入的雲倉生態、物流科技、價值供應鏈,供應鏈金融,新業務-新業務、金融、供應商7個條線來看,平均接入工時維持在30人日左右。

條線接入工時如下:

標準流程和通用基礎服務,提升研測過程效率,其中:服務+條線接入測試工時從最初評估的30人日到實際的23人日,測試階段效率提升23.3%:

大宗條線接入測試評估工時及實際工時,基於服務+接入商機項目的測試經驗,大宗商機接入項目測試階段從原計劃30人日降低到10人日,效率提升66.7%:

5.2 提升質量

服務+較原計劃提前4工作日交付,大宗較原計劃提前11工作日交付,交付演示過程中均未出現任何問題,驗收全程未出現影響整體進度的阻塞性問題。

大宗UAT過程中共提出6個問題,其中5個為頁面調優等優化項,1個為環境引起的無法勾選問題,未出現任何bug類問題,整體驗收過程順暢無阻。

作者:京東物流 姚再毅 孔祥東 樊平安 楊攀 田雷雷

來源:京東雲開發者社區 自猿其說Tech


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 寫在前面的話 在996是福報,“付費上班”的如今。身為信息化進程的一顆螺絲釘,每天的通勤時間要四十幾分鐘(僅僅是在地鐵上哦),漫漫這時候回家路難免顯得有點寂寞有點空虛。這時好學的人會說聽聽有聲書,趁著下班時間提升自己。而我可要優雅的回應道:“老子搬了一天磚了,下班還不能享受享受了”。這不就迷上了各種 ...
  • 最近開始一個React Native的新項目。按慣例,在創建完項目後,先集成CodePush熱更新功能。 這種活已經乾過不止一兩次了,當然沒啥問題,直接上手開乾。 可問題恰恰出在了本以為應該很順利的地方。 首先,在用 cpcn-client 工具給項目安裝 cpcn-react-native 包時, ...
  • 之前的時候大哥就讓我自己搭架子,但是我拖延症,現在用到了,得自己搭了 我的項目都放到了 VuePorjects這個目錄裡面, 一、先進入到指定工作目錄,(不是你要創建的項目的名稱哈) cd VuePorjects/ 二、創建vue3項目,安裝創建項目 npm create vite @latest ...
  • 距離Vue 3.0正式發佈已經過去一段時間了,2月7日Vue團隊正式宣佈Vue 3正式成為新的預設版本。最近接觸的新項目也使用Vue 3.0來開發,因此有必要對它進行一波總結和學習。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 小王,你的頁面白屏了,趕快修複一下。小王排查後發現是服務端傳回來的數據格式不對導致,無數據時傳回來不是 [] 而是 null, 從而導致 forEach 方法報錯導致白屏,於是告訴測試,這是服務端的錯誤導致,要讓服務端來修改,結果測 ...
  • Docker 是什麼 先看看百科的定義: Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的Linux或Windows操作系統的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。 容器引擎?鏡像?容器?虛擬化 ...
  • 一、Array.from使用 通常Array都用於數組去重。下麵是Array的詳細用法: 1.將類似組轉化為真正的數組 函數參數轉化為數組 dom轉化為數組 這裡強調一下, 必須有length屬性,否則返回的是空數組。 索引必須是字元串數字,否則返回的是[undefined,undefined,un ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...