0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

接單流程設(shè)計(jì)探索

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

作者:京東物流 呂順

背景

在物流系統(tǒng)中,接單是信息流的關(guān)鍵和重要的一環(huán),每個(gè)業(yè)務(wù)場景都會(huì)對(duì)應(yīng)一種標(biāo)準(zhǔn)接單流程,例如銷售出、采購入等等。標(biāo)準(zhǔn)接單包括統(tǒng)一接口定義、統(tǒng)一數(shù)據(jù)模型、標(biāo)準(zhǔn)接單核心應(yīng)用職責(zé)劃分。而這個(gè)標(biāo)準(zhǔn)并不是在接口定義的初期就規(guī)劃好的,通常會(huì)經(jīng)歷業(yè)務(wù)不斷增長而帶來的需求迭代、業(yè)務(wù)融合、組織架構(gòu)調(diào)整或升級(jí)引起的流程優(yōu)化與拆分。這樣一些系列事件下來,可能一個(gè)接單應(yīng)用會(huì)流轉(zhuǎn)到多個(gè)部門,接單流程就會(huì)越來越豐富,可能包括多業(yè)務(wù)、多場景、個(gè)性化、各種開關(guān)、五花八門的擴(kuò)展實(shí)現(xiàn)。

?

問題

在大接入背景下,我們聚焦在一個(gè)接單應(yīng)用的一個(gè)接單方法上?;蚨嗷蛏僭诠ぷ髦卸紩?huì)遇到一下幾種問題:

?瀑布式迭代,一個(gè)方法最終三五千行,難以閱讀理解,牽一發(fā)動(dòng)全身。

?大量個(gè)性化邏輯散落在下單得每個(gè)環(huán)節(jié),梳理起來無從下手。

?方法串聯(lián)時(shí)上下文樣式各異,如果當(dāng)初沒有擴(kuò)展性,后期改動(dòng)變動(dòng)大。

?

思路

針對(duì)這些問題,可以分為兩個(gè)層面思考,戰(zhàn)略和戰(zhàn)術(shù)。

戰(zhàn)略

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

戰(zhàn)術(shù)

圍繞著工作臺(tái)模式,可以提煉的一下幾個(gè)關(guān)鍵點(diǎn):

?組件定義

?上下文

?執(zhí)行規(guī)則

?

組件定義

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

?

組件定義通常還有一個(gè)值得關(guān)注的就是組件的數(shù)量,哪些邏輯可以歸類到一個(gè)組件中,哪些需要分開。這里沒有標(biāo)準(zhǔn)答案,有兩個(gè)思路僅供參考:

1.如果訂單已經(jīng)歸類不同子域,例如發(fā)貨、收貨、承運(yùn)、產(chǎn)品、貨品等,那就按照對(duì)應(yīng)子域劃分組件。這樣更容易達(dá)成語言統(tǒng)一。

2.根據(jù)流程中寫動(dòng)作來定義組件,例如寫庫、下發(fā)wms、下配等。

上下文

在組件定義的時(shí)候都會(huì)定義上下文作為執(zhí)行流程中出入?yún)⒌妮d體。上下文得定義通常需要具備幾個(gè)特點(diǎn):

?傳遞性

?共享性

?動(dòng)態(tài)性

每個(gè)組件都只關(guān)心上下文中與自己相關(guān)的內(nèi)容,可以進(jìn)行讀取和更新,然后在流程中不斷傳遞下去。并且在需求迭代過程中支持?jǐn)U展上下文。

?

執(zhí)行規(guī)則

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

?

答案

在不斷實(shí)踐和學(xué)習(xí)中,我發(fā)現(xiàn)了一個(gè)具備上述所有能力的開源組件LiteFlow。

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

?

?

?

?

例子

要實(shí)現(xiàn)下面的流程:

?

?

流程規(guī)則:



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


代碼結(jié)構(gòu):

.
├── 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


業(yè)務(wù)類型判斷:

@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();
    }
}

循環(huán)執(zhí)行:

@Slf4j
@LiteflowComponent("goodsItem")
public class GoodsItemCmp extends NodeComponent {
    @Override
    public void process() throws Exception {
        log.info("goods item index = {}", this.getLoopIndex());
        //獲取當(dāng)前循環(huán)對(duì)象
        Goods goods = this.getCurrLoopObj();
        //賦值為當(dāng)前循環(huán)索引
        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));
        //參數(shù)1為流程標(biāo)識(shí),參數(shù)2為初始入?yún)?,參?shù)3為上下文類型約定
        LiteflowResponse liteflowResponse = flowExecutor.execute2Resp("chain1",request, OrderContext.class);
        //結(jié)果中獲取上下文
        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";
    }

特點(diǎn)

個(gè)人覺得LiteFlow的特點(diǎn)包括一下幾點(diǎn):

?組件定義統(tǒng)一: 所有的邏輯都是組件,為所有的邏輯提供統(tǒng)一化的組件實(shí)現(xiàn)方式

?規(guī)則持久化: 框架原生支持把規(guī)則存儲(chǔ)在標(biāo)準(zhǔn)結(jié)構(gòu)化數(shù)據(jù)庫,Nacos,Etcd,Zookeeper,Apollo,Redis、自定義擴(kuò)展。

?上下文隔離機(jī)制: 可靠的上下文隔離機(jī)制,無需擔(dān)心高并發(fā)情況下的數(shù)據(jù)串流

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

?規(guī)則輕量: 基于規(guī)則文件來編排流程,學(xué)習(xí)規(guī)則門檻低

?

總結(jié)

LiteFlow是強(qiáng)大的流程規(guī)則框架,之所以沒有直接把LiteFlow放在標(biāo)題中,是跟大家一起透過問題看本質(zhì),最終找到合適的解決方案,而LiteFlow通過設(shè)計(jì)和抽象能力解決問題,更加值得借鑒和學(xué)習(xí)。

?審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    504

    瀏覽量

    17787
  • 物流系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    10687
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    接單片機(jī)工作

    誠信盡責(zé),承接單片機(jī)工作,或兼職。如需合作,請(qǐng)聯(lián)系 QQ : 1513306473 。8、16、32位單片機(jī)開發(fā)上位機(jī)開發(fā)
    發(fā)表于 08-23 11:18

    接單片機(jī)開發(fā) 畢業(yè)設(shè)計(jì)

    接單片機(jī)開發(fā)QQ:623145061
    發(fā)表于 04-14 20:34

    PSoC 4試用+探索

    入門。Cypress也把對(duì)芯片底層的一些繁瑣重復(fù)的工作進(jìn)行了封裝,自動(dòng)產(chǎn)生了很多的代碼。個(gè)人覺得這也會(huì)使使用者丟失對(duì)整體流程的掌握,在出現(xiàn)bug時(shí)不容易定位。以上是自己對(duì)今晚探索的總結(jié),明天繼續(xù)。
    發(fā)表于 10-30 23:22

    接單片機(jī)項(xiàng)目!

    本人承接單片機(jī)項(xiàng)目、畢業(yè)設(shè)計(jì)、仿真,私聊1002925094
    發(fā)表于 12-13 12:09

    外推接單yilong

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

    接單片機(jī)項(xiàng)目

    接單片機(jī)項(xiàng)目、Arduino、Proteus仿真等。有需要詳聊 1002925094,非誠勿擾!
    發(fā)表于 10-23 21:26

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

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

    OpenHarmony終端智能設(shè)備開發(fā)實(shí)現(xiàn)流程探索

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

    Agent Technologies實(shí)現(xiàn)應(yīng)用流程再造

    論文旨在研究自助服務(wù)系統(tǒng)應(yīng)用流程再造的設(shè)計(jì)與實(shí)現(xiàn),并探索Agent 技術(shù)在其中的應(yīng)用。關(guān)鍵詞:Agent;流程再造;業(yè)務(wù)無關(guān)性;
    發(fā)表于 06-01 11:04 ?6次下載

    CH452與4線接口連接單片機(jī)電路

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

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

    近日,芯片電阻龍頭國巨旗下的國益宣布停止芯片電阻接單。業(yè)界人士認(rèn)為國益停止接單,將會(huì)影響芯片電阻供應(yīng)量下降,勢(shì)必會(huì)出現(xiàn)巨大的缺口,漲價(jià)已成定局。國益卻表示因市場需求已經(jīng)過大,為了平衡交貨服務(wù)水平將暫時(shí)停止接單,恢復(fù)正常
    發(fā)表于 12-27 15:19 ?1808次閱讀

    旺宏接單報(bào)捷 NOR Flash獲ST采用

    旺宏接單報(bào)捷,旗下編碼型快閃存儲(chǔ)器( NOR Flash)獲意法半導(dǎo)體(STM)新款微控制器采用,導(dǎo)入汽車、工業(yè)及消費(fèi)電子等領(lǐng)域。
    發(fā)表于 03-30 11:14 ?1066次閱讀

    義隆:年后MCU產(chǎn)品全面暫停接單

    據(jù)臺(tái)媒報(bào)道,包括義隆、盛群、凌通等在內(nèi)的 MCU廠商又掀起了新一輪的漲價(jià)潮,除再次漲價(jià)外,還傳出了要求先收訂金才能下單,甚至?xí)和?b class='flag-5'>接單的消息 。
    的頭像 發(fā)表于 02-24 16:31 ?2538次閱讀

    華秋PCB、SMT等業(yè)務(wù)暫不受疫情影響,正常接單發(fā)貨!

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

    Simcenter HEEDS設(shè)計(jì)空間探索和優(yōu)化軟件

    SimcenterHEEDSHEEDS是一款功能強(qiáng)大的設(shè)計(jì)空間探索和優(yōu)化軟件,可與CAD和CAE工具連接并推動(dòng)產(chǎn)品創(chuàng)新。HEEDS通過自動(dòng)化分析工作流程、實(shí)現(xiàn)可用計(jì)算硬件和軟件資源的高效利用、高效
    的頭像 發(fā)表于 11-12 16:11 ?60次閱讀
    Simcenter HEEDS設(shè)計(jì)空間<b class='flag-5'>探索</b>和優(yōu)化軟件