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;
}
}

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