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

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

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

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

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

2 回答

?
拉丁的傳說

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

給一個大概思路吧。java實現??梢陨晕⒖枷?。
packagecom.ui;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.HashSet;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjava.util.Set;
publicclassOrderStatusService{
/**
*映射關系列表
*/
publicstaticListmapperList=newArrayList();
static{
/**
*初始化判斷項、訂單動作到狀態的映射,這里只為演示,實際中映射關系最好保存在配置文件中或者數據庫中,一般在應用啟動的時候,從配置文件或者數據庫加載,保存一份即可。
*
*/
OrderStatusMapperm1=newOrderStatusMapper();
m1.addJudgementItems(1,2,4,6)//先吃后付and自動接單and有打印機and打印成功
.addAction2statusItem(1,6)//下單動作:進行中
.addAction2statusItem(7,4);//結賬動作:已完成
OrderStatusMapperm2=newOrderStatusMapper();
m2.addJudgementItems(3,5)
.addAction2statusItem(2,1)
.addAction2statusItem(4,3);
mapperList.add(m1);
mapperList.add(m2);
}
/**
*是否是相等的set
*@paramsource
*@paramdest
*@return
*/
publicbooleanisEqualSet(Setsource,Setdest){
if(null==source||null==dest){
returnfalse;
}
if(source.size()!=dest.size()){
returnfalse;
}
for(Iteratorit=source.iterator();it.hasNext();){
if(!dest.contains(it.next())){
returnfalse;
}
}
returntrue;
}
publicstaticvoidmain(String[]args){
Orderorder=newOrder();
order.setOrderAction(1);//下單
order.setJudgementItems(newHashSet(Arrays.asList(1,2,4,6)));//先吃后付and自動接單and有打印機and打印成功
//獲取訂單下一個狀態
System.out.println(newOrderStatusService().getNextOrderStatus(order));//結果為6(進行中)
}
/**
*獲取下一個訂單狀態
*@paramcurOrder
*@return
*/
publicIntegergetNextOrderStatus(OrdercurOrder){
for(OrderStatusMappermapper:mapperList){
if(isEqualSet(curOrder.getJudgementItems(),mapper.getJudgementItems())&&null!=curOrder.getOrderAction()){
returnmapper.getAction2statusMap().get(curOrder.getOrderAction());
}
}
returnnull;
}
}
/**
*訂單類型,訂單動作到狀態的映射。
*
*/
classOrderStatusMapper{
/**
*判斷項
*/
privateSetjudgementItems=newHashSet();
/**
*訂單動作到狀態關系
*/
privateMapaction2statusMap=newHashMap();
/**
*下一個訂單狀態
*/
privateIntegernextStatus;
publicSetgetJudgementItems(){
returnjudgementItems;
}
publicOrderStatusMapperaddJudgementItems(Integer...items){
if(null==items||items.length<=0){
returnthis;
}
for(Integercur:items){
this.judgementItems.add(cur);
}
returnthis;
}
publicMapgetAction2statusMap(){
returnaction2statusMap;
}
publicOrderStatusMapperaddAction2statusItem(Integeraction,Integerstatus){
if(null==action||null==status){
returnthis;
}
this.action2statusMap.put(action,status);
returnthis;
}
publicIntegergetNextStatus(){
returnnextStatus;
}
publicOrderStatusMappersetNextStatus(IntegernextStatus){
this.nextStatus=nextStatus;
returnthis;
}
}
classOrder{
/**
*判斷項目
*1:商家開啟先食后付;
*2:自動接單;
*3:不自動接單
*4:有打印機
*5:沒有打印機
*6:打印成功
*7:打印不成功
*8:自動清臺
*9:不自動清臺
*/
privateSetjudgementItems;
/**
*訂單動作
*1:下單
*2:接單
*3:拒單
*4:顧客取消單
*5:顧客支付
*6:清臺
*7:結賬
*/
privateIntegerorderAction;
/**
*訂單狀態
*1:待確認
*2:待處理
*3:拒絕
*4:完成
*5:取消
*6:進行中
*7:超時
*8:申請退款
*/
privateIntegerorderStatus;
publicSetgetJudgementItems(){
returnjudgementItems;
}
publicvoidsetJudgementItems(SetjudgementItems){
this.judgementItems=judgementItems;
}
publicIntegergetOrderAction(){
returnorderAction;
}
publicvoidsetOrderAction(IntegerorderAction){
this.orderAction=orderAction;
}
publicIntegergetOrderStatus(){
returnorderStatus;
}
publicvoidsetOrderStatus(IntegerorderStatus){
this.orderStatus=orderStatus;
}
}
                            
查看完整回答
反對 回復 2019-04-27
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

試試看位運算可不可以,每個比特位表示一個條件的狀態.比如當前狀態為:0111某個動作的執行條件為:0100即只要第二個狀態位為真的時候執行運算的時候就判斷0111&0100==0100就可以判斷這個動作要不要執行了這樣每個動作對應一個if,會比原來少一點,但是狀態轉換的代碼可能會多一點,這個就看樓主權衡了
                            
查看完整回答
反對 回復 2019-04-27
  • 2 回答
  • 0 關注
  • 559 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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