精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

接單流程設計探索

京東云 ? 來源:京東物流 呂順 ? 作者:京東物流 呂順 ? 2024-10-31 10:56 ? 次閱讀

作者:京東物流 呂順

背景

在物流系統中,接單是信息流的關鍵和重要的一環,每個業務場景都會對應一種標準接單流程,例如銷售出、采購入等等。標準接單包括統一接口定義、統一數據模型、標準接單核心應用職責劃分。而這個標準并不是在接口定義的初期就規劃好的,通常會經歷業務不斷增長而帶來的需求迭代、業務融合、組織架構調整或升級引起的流程優化與拆分。這樣一些系列事件下來,可能一個接單應用會流轉到多個部門,接單流程就會越來越豐富,可能包括多業務、多場景、個性化、各種開關、五花八門的擴展實現。

?

問題

在大接入背景下,我們聚焦在一個接單應用的一個接單方法上?;蚨嗷蛏僭诠ぷ髦卸紩龅揭幌聨追N問題:

?瀑布式迭代,一個方法最終三五千行,難以閱讀理解,牽一發動全身。

?大量個性化邏輯散落在下單得每個環節,梳理起來無從下手。

?方法串聯時上下文樣式各異,如果當初沒有擴展性,后期改動變動大。

?

思路

針對這些問題,可以分為兩個層面思考,戰略和戰術。

戰略

這里的戰略指的是模式,而接單場景可以利用工作臺模式,工人(組件)按順序圍著工作臺(上下文)生產兩件(執行任務),資源(參數)從工作臺拿取,這種模式可以做到組件解耦、穩定、可復用。保證業務流程靈活。

戰術

圍繞著工作臺模式,可以提煉的一下幾個關鍵點:

?組件定義

?上下文

?執行規則

?

組件定義

組件通常被定義為規則執行的最小單元,我們最常見的是普通組件,也就是調用就執行,這是大部分系統目前都在使用的組件。其實在流程規則中,組件就像編譯語言,還應該具備布爾組件、條件組件、循環組件、并行組件、異常捕獲組件等等。由于這些組件都可以包含在普通組件中,通過代碼來實現條件、循環等邏輯。所以在執行流程定義時,無法清晰識別這些本應體現在流程中的邏輯。

?

組件定義通常還有一個值得關注的就是組件的數量,哪些邏輯可以歸類到一個組件中,哪些需要分開。這里沒有標準答案,有兩個思路僅供參考:

1.如果訂單已經歸類不同子域,例如發貨、收貨、承運、產品、貨品等,那就按照對應子域劃分組件。這樣更容易達成語言統一。

2.根據流程中寫動作來定義組件,例如寫庫、下發wms、下配等。

上下文

在組件定義的時候都會定義上下文作為執行流程中出入參的載體。上下文得定義通常需要具備幾個特點:

?傳遞性

?共享性

?動態性

每個組件都只關心上下文中與自己相關的內容,可以進行讀取和更新,然后在流程中不斷傳遞下去。并且在需求迭代過程中支持擴展上下文。

?

執行規則

執行規則就是約定各種組件按照何種規則執行。這里實現方式大多xml方式、Spring注入方式、顯示組裝方式成執行鏈,然后順序執行。這種方案弊端就是無法體現條件判斷、循環、并行。另一個問題就是大家深受SpringBoot思維的“毒害”:約定大于配置,而逐漸放棄xml配置方式,讓執行鏈組裝藏在代碼中。讓執行規則更加不容易被發現,說白了就是執行規則沒有與代碼進行解耦。那么如果將執行規則單獨抽象出來,就可以更進一步支持多種方式存儲,例如數據庫、redis、ducc等,這樣熱更就會成為可能。

?

答案

在不斷實踐和學習中,我發現了一個具備上述所有能力的開源組件LiteFlow。

利用LiteFlow,你可以將瀑布流式的代碼,轉變成以組件為核心概念的代碼結構,這種結構的好處是可以任意編排,組件與組件之間是解耦的,組件可以用腳本來定義,組件之間的流轉全靠規則來驅動。LiteFlow擁有開源規則引擎最為簡單的DSL語法。十分鐘就可上手。

?

?

?

?

例子

要實現下面的流程:

?

?

流程規則:



    
        THEN(
            SWITCH(businessSwitch).TO(
//                中小件子流程
                THEN(smallChain).id("small"),
//                  冷鏈子流程
                THEN(coldChain).id("cold")
            ),
//        迭代執行
            ITERATOR(goodsIterator).DO(goodsItem),
//        選擇器+默認
            SWITCH(kaSwitch).TO(dajiang, lining, nike).DEFAULT(defaultKa)
        );
    
    
//        并行
        WHEN(commonDept, smallWarehouse);
    
    
//        并行
        WHEN(commonDept, coldWarehouse);
    


代碼結構:

.
├── LiteFlowDemoApplication.java
└── demos
    └── web
        ├── BasicController.java
        ├── context
        │ └── OrderContext.java
        ├── dto
        │ ├── Dept.java
        │ ├── Goods.java
        │ ├── Request.java
        │ └── WareHouse.java
        ├── enums
        │ ├── BusinessEnum.java
        │ └── KaEnum.java
        └── node
            ├── BusinessSwitchCmp.java
            ├── ColdWarehouseCmp.java
            ├── CommonDeptCmp.java
            ├── GoodsItemCmp.java
            ├── GoodsIteratorCmp.java
            ├── KaSwitchCmp.java
            ├── SmallWarehouseCmp.java
            └── ka
                ├── DaJiangCmp.java
                ├── DefaultCmp.java
                ├── LiNingCmp.java
                └── NikeCmp.java

8 directories, 21 files


業務類型判斷:

@LiteflowComponent("businessSwitch")
public class BusinessSwitchCmp extends NodeSwitchComponent {
    @Override
    public String processSwitch() throws Exception {
        Request request = this.getRequestData();
        if(Objects.equals(request.getDept().getDeptNo(), "dept1")) {
            return BusinessEnum.SMALL.getBusiness();
        } else {
            return BusinessEnum.COLD.getBusiness();
        }
    }
}

迭代器組件:

@LiteflowComponent("goodsIterator")
public class GoodsIteratorCmp extends NodeIteratorComponent {
    @Override
    public Iterator processIterator() throws Exception {
        Request requestData = this.getRequestData();
        return requestData.getGoodList().iterator();
    }
}

循環執行:

@Slf4j
@LiteflowComponent("goodsItem")
public class GoodsItemCmp extends NodeComponent {
    @Override
    public void process() throws Exception {
        log.info("goods item index = {}", this.getLoopIndex());
        //獲取當前循環對象
        Goods goods = this.getCurrLoopObj();
        //賦值為當前循環索引
        goods.setGoodsId(this.getLoopIndex());
        OrderContext orderContext = this.getContextBean(OrderContext.class);
        List goodsList = orderContext.getData("goods");
        if(goodsList == null) {
            goodsList = new ArrayList();
            this.getContextBean(OrderContext.class).setData("goods", goodsList);
        }
        goodsList.add(goods);
    }
}

測試用例

public String testConfig() {
        Request request = new Request();
        Dept dept = new Dept();
        dept.setDeptNo("nike");
        request.setDept(dept);
        WareHouse wareHouse = new WareHouse();
        request.setWareHouse(wareHouse);
        Goods goods1 = new Goods();
        goods1.setGoodsName("goods1");
        Goods goods2 = new Goods();
        goods2.setGoodsName("goods2");
        request.setGoodList(Arrays.asList(goods1, goods2));
        //參數1為流程標識,參數2為初始入參,參數3為上下文類型約定
        LiteflowResponse liteflowResponse = flowExecutor.execute2Resp("chain1",request, OrderContext.class);
        //結果中獲取上下文
        OrderContext contextBean = liteflowResponse.getContextBean(OrderContext.class);
        List goodsList = contextBean.getData("goods");
        WareHouse warehouse = contextBean.getData("warehouse");
        Dept dept1 = contextBean.getData("dept");
        log.info("=== dept = {}", JsonUtil.toJsonString(dept1));
        log.info("=== warehouse = {}", JsonUtil.toJsonString(warehouse));
        log.info("=== goodsList = {}", JsonUtil.toJsonString(goodsList));
        return "yes";
    }

特點

個人覺得LiteFlow的特點包括一下幾點:

?組件定義統一: 所有的邏輯都是組件,為所有的邏輯提供統一化的組件實現方式

?規則持久化: 框架原生支持把規則存儲在標準結構化數據庫,Nacos,Etcd,Zookeeper,Apollo,Redis、自定義擴展。

?上下文隔離機制: 可靠的上下文隔離機制,無需擔心高并發情況下的數據串流

?支持廣泛: Springboot,Spring還是任何其他java框架都支持。

?規則輕量: 基于規則文件來編排流程,學習規則門檻低

?

總結

LiteFlow是強大的流程規則框架,之所以沒有直接把LiteFlow放在標題中,是跟大家一起透過問題看本質,最終找到合適的解決方案,而LiteFlow通過設計和抽象能力解決問題,更加值得借鑒和學習。

?審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 組件
    +關注

    關注

    1

    文章

    505

    瀏覽量

    17805
  • 物流系統
    +關注

    關注

    0

    文章

    25

    瀏覽量

    10688
收藏 人收藏

    評論

    相關推薦

    接單片機工作

    誠信盡責,承接單片機工作,或兼職。如需合作,請聯系 QQ : 1513306473 。8、16、32位單片機開發上位機開發
    發表于 08-23 11:18

    接單片機開發 畢業設計

    接單片機開發QQ:623145061
    發表于 04-14 20:34

    PSoC 4試用+探索

    入門。Cypress也把對芯片底層的一些繁瑣重復的工作進行了封裝,自動產生了很多的代碼。個人覺得這也會使使用者丟失對整體流程的掌握,在出現bug時不容易定位。以上是自己對今晚探索的總結,明天繼續。
    發表于 10-30 23:22

    接單片機項目!

    本人承接單片機項目、畢業設計、仿真,私聊1002925094
    發表于 12-13 12:09

    外推接單yilong

    yilong接單,QQ:1728369763。承接:外推(按效果計費)、營銷神器注冊群發(頂帖)規則定制、易語言軟件群發定制、百度百科、百度知道(提問加采納)、刪負面、***(永久版)、新聞源(各大
    發表于 01-30 16:05

    接單片機項目

    接單片機項目、Arduino、Proteus仿真等。有需要詳聊 1002925094,非誠勿擾!
    發表于 10-23 21:26

    緊急呼叫單元和無線連接單元介紹

    緊急呼叫單元和無線連接單
    發表于 12-23 06:29

    OpenHarmony終端智能設備開發實現流程探索

    一、簡要說明雖然我們還沒有做出一款完整的OpenHarmony的終端智能設備,但是在各個維度都有進行一些初步探索嘗試。現歸納整體流程如下,不一定正確,歡迎大家討論與指正。二、整體圖示三、詳細說明1.
    發表于 08-16 14:42

    Agent Technologies實現應用流程再造

    論文旨在研究自助服務系統應用流程再造的設計與實現,并探索Agent 技術在其中的應用。關鍵詞:Agent;流程再造;業務無關性;
    發表于 06-01 11:04 ?6次下載

    CH452與4線接口連接單片機電路

    CH452與4線接口連接單片機電路 U2
    發表于 01-07 12:28 ?2253次閱讀
    CH452與4線接口連<b class='flag-5'>接單</b>片機電路

    國巨宣布將停止芯片電阻接單 芯片電阻漲價箭在弦上

    近日,芯片電阻龍頭國巨旗下的國益宣布停止芯片電阻接單。業界人士認為國益停止接單,將會影響芯片電阻供應量下降,勢必會出現巨大的缺口,漲價已成定局。國益卻表示因市場需求已經過大,為了平衡交貨服務水平將暫時停止接單,恢復正常
    發表于 12-27 15:19 ?1812次閱讀

    旺宏接單報捷 NOR Flash獲ST采用

    旺宏接單報捷,旗下編碼型快閃存儲器( NOR Flash)獲意法半導體(STM)新款微控制器采用,導入汽車、工業及消費電子等領域。
    發表于 03-30 11:14 ?1071次閱讀

    義隆:年后MCU產品全面暫停接單

    據臺媒報道,包括義隆、盛群、凌通等在內的 MCU廠商又掀起了新一輪的漲價潮,除再次漲價外,還傳出了要求先收訂金才能下單,甚至暫停接單的消息 。
    的頭像 發表于 02-24 16:31 ?2549次閱讀

    華秋PCB、SMT等業務暫不受疫情影響,正常接單發貨!

    一華秋業務不受影響,正常接單發貨按深圳最新疫情防控要求,企業3月14至20號居家辦公,華秋整體業務不受影響,24小時在線服務,請廣大新老用戶放心:華秋PCB打樣正常接單、SMT打樣及小中批量、鋼網等
    的頭像 發表于 03-15 10:03 ?970次閱讀
    華秋PCB、SMT等業務暫不受疫情影響,正常<b class='flag-5'>接單</b>發貨!

    Simcenter HEEDS設計空間探索和優化軟件

    SimcenterHEEDSHEEDS是一款功能強大的設計空間探索和優化軟件,可與CAD和CAE工具連接并推動產品創新。HEEDS通過自動化分析工作流程、實現可用計算硬件和軟件資源的高效利用、高效
    的頭像 發表于 11-12 16:11 ?179次閱讀
    Simcenter HEEDS設計空間<b class='flag-5'>探索</b>和優化軟件