亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理多條件訂單狀態的變化方式?

如何處理多條件訂單狀態的變化方式?

Smart貓小萌 2019-03-20 18:19:06
在一個點餐系統中,有著外賣單,堂食單等。對應不同的訂單與不同的動作和設置會有不同的狀態變化,在代碼中if elseif要寫30-40多行,對于這種情況是否有更好的處理方法?舉例如下:判斷項:商家開啟先食后付 是否自動接單 是否有打印機 打印是否成功 是否自動清臺動作: 下單 接單 拒單 顧客取消單 顧客支付 清臺 結賬狀態: 待確認 待處理 拒絕 完成 取消 進行中 超時 申請退款如上由5種判斷項 組合出多種變化 在每種變化中 不同的動作 改變訂單不同的狀態,像這種狀態模型,除了無數的 if elseif 是否有更好的方法實現?想要實現:輸入動作 輸出狀態想要一個思路,非常感謝!
查看完整描述

4 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

給一個大概思路吧。java實現。可以稍微參考下。



package com.ui;


import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;


public class OrderStatusService {

    

    /**

     * 映射關系列表

     */

    public  static List<OrderStatusMapper> mapperList = new ArrayList<OrderStatusMapper>();

    

    static {

        /**

         * 初始化判斷項、訂單動作到狀態的映射,這里只為演示,實際中映射關系最好保存在配置文件中或者數據庫中,一般在應用啟動的時候,從配置文件或者數據庫加載,保存一份即可。

         * 

         */

        OrderStatusMapper m1 = new OrderStatusMapper();

        m1.addJudgementItems(1,2,4,6) //先吃后付 and 自動接單 and 有打印機 and 打印成功

        .addAction2statusItem(1,6)//下單動作:進行中 

        .addAction2statusItem(7, 4); //結賬動作:已完成

        

        OrderStatusMapper m2 = new OrderStatusMapper();

        m2.addJudgementItems(3,5) 

        .addAction2statusItem(2,1)

        .addAction2statusItem(4, 3); 

        

        mapperList.add(m1);

        mapperList.add(m2);

        

    }

    

    /**

     * 是否是相等的set

     * @param source 

     * @param dest

     * @return

     */

    public boolean  isEqualSet(Set<Integer> source,Set<Integer> dest){

        if(null == source || null == dest){

            return false;

        }

        if(source.size() != dest.size()){

            return false;

        }

        for(Iterator<Integer> it = source.iterator();it.hasNext();){

            if(!dest.contains(it.next())){

                return false;

            }

        }

        return true;

    }

    public static void main(String[] args) {

        Order order = new Order();

        order.setOrderAction(1);//下單

        order.setJudgementItems(new HashSet<Integer>(Arrays.asList(1,2,4,6)));//先吃后付 and 自動接單 and 有打印機 and 打印成功

        //獲取訂單下一個狀態

        System.out.println(new OrderStatusService().getNextOrderStatus(order));//  結果為 6(進行中)

    }

    /**

     * 獲取下一個訂單狀態

     * @param curOrder

     * @return

     */

    public Integer getNextOrderStatus(Order curOrder){

        for(OrderStatusMapper mapper : mapperList){

            if(isEqualSet(curOrder.getJudgementItems(), mapper.getJudgementItems()) &&  null != curOrder.getOrderAction()){

                return mapper.getAction2statusMap().get(curOrder.getOrderAction());

            }

        }

        return null;

    }

    

}


/**

 * 訂單類型,訂單動作到狀態的映射。

 *

 */

class OrderStatusMapper{

    

    /**

     * 判斷項

     */

    private Set<Integer> judgementItems = new HashSet<Integer>();

    

    /**

     * 訂單動作到狀態關系

     */

    private Map<Integer,Integer> action2statusMap = new HashMap<Integer,Integer>();

    

    /**

     * 下一個訂單狀態

     */

    private Integer nextStatus;



    public Set<Integer> getJudgementItems() {

        return judgementItems;

    }


    public OrderStatusMapper addJudgementItems(Integer ...items) {

        if(null == items || items.length <= 0){

            return this;

        }

        for(Integer cur : items){

            this.judgementItems.add(cur);

        }

        return this;

    }


   


    public Map<Integer, Integer> getAction2statusMap() {

        return action2statusMap;

    }


    public OrderStatusMapper addAction2statusItem(Integer action,Integer status) {

        if(null == action || null == status){

            return this;

        }

        this.action2statusMap.put(action, status);

        return this;

    }


    public Integer getNextStatus() {

        return nextStatus;

    }


    public OrderStatusMapper setNextStatus(Integer nextStatus) {

        this.nextStatus = nextStatus;

        return this;

    }

}



class Order{

    /**

     * 判斷項目

     * 1:商家開啟先食后付 ;

     * 2:自動接單;

     * 3:不自動接單

     * 4:有打印機

     * 5:沒有打印機

     * 6:打印成功

     * 7:打印不成功

     * 8:自動清臺

     * 9:不自動清臺

     */

    private Set<Integer> judgementItems;

    

    /**

     * 訂單動作

     * 1:下單 

     * 2:接單 

     * 3:拒單 

     * 4:顧客取消單

     * 5:顧客支付 

     * 6:清臺

     * 7:結賬

     */

    private Integer orderAction;

    

    /**

     * 訂單狀態

     * 1:待確認 

     * 2:待處理 

     * 3:拒絕 

     * 4:完成 

     * 5:取消 

     * 6:進行中 

     * 7:超時 

     * 8:申請退款

     */

    private Integer orderStatus;


    

    public Set<Integer> getJudgementItems() {

        return judgementItems;

    }


    public void setJudgementItems(Set<Integer> judgementItems) {

        this.judgementItems = judgementItems;

    }


    public Integer getOrderAction() {

        return orderAction;

    }


    public void setOrderAction(Integer orderAction) {

        this.orderAction = orderAction;

    }


    public Integer getOrderStatus() {

        return orderStatus;

    }


    public void setOrderStatus(Integer orderStatus) {

        this.orderStatus = orderStatus;

    }

}

 


查看完整回答
反對 回復 2019-04-14
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

試試看位運算可不可以, 每個比特位表示一個條件的狀態.
比如當前狀態為: 0111
某個動作的執行條件為: 0100 即只要第二個狀態位為真的時候執行
運算的時候就判斷 0111 & 0100 == 0100 就可以判斷這個動作要不要執行了
這樣每個動作對應一個 if, 會比原來少一點, 但是狀態轉換的代碼可能會多一點, 這個就看樓主權衡了

查看完整回答
反對 回復 2019-04-14
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

狀態切換和流程控制可以使用有限狀態機定義與處理,相關開源的庫也比較豐富。


查看完整回答
反對 回復 2019-04-14
  • 4 回答
  • 0 關注
  • 788 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號