---
# System prepended metadata

title: 空間結帳流程重構

---

# 空間結帳流程重構

https://www.figma.com/file/bwDpNzCL0wbo0NS5JzFGny/Diagram---Flow-Chart-(Copy)?node-id=81928%3A467

![](https://i.imgur.com/cgygReU.jpg)

## 預訂 book()
1. setdata() 處理前端取得資料 **使用 $reqeustdata**
    - 初始化 $paymentdata
    - 業主資料預處理 $ownerdata
    - 訂閱者資料處理 $subscribedata **此直接判斷月票體驗並購買**
    - 使用點數的預處理
    - 又分 api 與 web 的流程
2. 條款確認
3. locktable **效能選項由 config 判斷**
4. 確認有綁訂信用卡
5. 確認載具資料
6. 確認優惠卷是否可使用
7. 確認總金額是否正確
8. 判斷走 `日租流程` 或 `時租流程`

## 日租流程 dailyProcess()
1. 確認空間是否可預訂
2. 日期、金額... 前端竄改防呆
3. 建立訂單
4. `訂單詳細狀態`呼叫
5. `結帳流程` **無月票、業主流程**
    

## 時租流程 hourProcess()
1. 確認空間是否鎖時
2. 前端送出訂單時間判斷
3. 金額前端竄改防呆
4. 建立訂單
5. 判斷業主&`業主預訂流程`
6. 判斷月票&`月票預訂流程`
7. `結帳流程`


## 結帳流程 checkoutProcess()
1. 判斷內部帳號&`內部預訂流程結果`
2. 判斷點數流程
    - 又分 api 與 web 流程
    - web 部分只判斷點數足夠直接回傳`點數預訂結果`
3. 建立發票資料
4. 優惠卷處理
5. 依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
6. 判斷是否需要付錢
    - 使用`街口預訂結果`、`信用卡預訂結果`付款
    - 使用`無需付款預訂結果`

## 業主預訂流程 ownerProcess()
1. 判斷業主時數不夠
    - 判斷月票時數是否足夠？
    - 依據是否足夠否呼叫不同`訂單詳細狀態`
    - 足夠呼叫`月票預訂流程`
    - 不足呼叫`結帳流程`
2. 檢查重複預訂
3. 回傳`業主預訂結果`

## 月票預訂流程 subscribeProcess()
1. 判斷月票時數
2. 月票時數足夠
    - 檢查重複預訂
    - 回傳`月票預訂結果`
3. 月票時數不夠`訂單詳細狀態`呼叫
4. `結帳流程`


## 內部預訂流程結果 internalOrderProcessAndResponse()
1. 更新訂單
2. 寄信通知
3. 依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
4. unlocktable
5. 回傳畫面

## 點數預訂結果 enoughPointProcessAndResponse()
1. 點數預訂 **處理點數資料相關
2. 更新訂單
3. 寄信通知
4. 依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
5. unlocktable
6. 回傳畫面

## 街口預訂結果 jkoProcessAndResponse()
1. 街口預訂
2. 導向街口 url

## 信用卡預訂結果 creditCardProcessAndResponse()
1. 信用卡預訂 **處理信用卡綁定等相關資料
2. 判斷重複預訂 
3. 更新資料
4. 優惠卷資料更新
5. 發票處理
6. 更新點數...
7. 寄信通知
8. unlocktable
9. 回傳畫面

## 無需付款預訂結果 notNeedPayResponse() **感覺不會走到**
1. 更新訂單
2. 優惠卷資料更新
3. 寄信通知
4. 回傳畫面


## 業主預訂結果 ownerOrderResponse()
1. 更新訂單
2. 寄信通知
3. 依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
4. unlocktable
5. 回傳畫面

## 月票預訂結果 subscribeProcess()
1. 更新訂單
2. 寄信通知
3. 依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
4. unlocktable
5. 回傳畫面




## 改善
![](https://i.imgur.com/dOyIjPh.jpg)


1. 所有流程獨立一個 class 專注處理自身流程，由外部 state 去控制應該走哪幾個 class
2. 回傳結果應該獨立於 class 之中，每個處理流程處理自己的結果


```php=
<?php

// 結果在流程外
function checkoutprocess() {
    ...
    
    // cheeckoutprocess
        
    // 1. 更新訂單
    // 2. 寄信通知
    // 3. 依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
    // 4. unlocktable
    // 5. 回傳畫面
}

```

```php=
<?php

class process {
    function handle();
    
    function result()
    {
        ??重複預定的判斷
        更新訂單
        寄信通知
        依照上面流程的`訂單詳細狀態`呼叫，產生訂單詳細資料
        unlocktable
        回傳畫面
    };
}



class inner extends process{
    function handle() {
        if(內部帳號) return $this->result
    }
    
}

class owner extends process {
    
    function handle() {
        1. 業主時數跟 state 相比足夠 return this->result();
        
        2. 業主時數不足，改 state.hours = 6
            
    }
    
    function result() {
        ....
    }
}

class subscribe extends process {
    function handle() {
        1. 月票時數跟 state 相比足夠 return this->result();
        
        2. 月票時數不夠，改 state.hours = 3
    }
    
    function result() {
        ....
    }
}

class point extends procss {
    function handle() {
        1. 點數處理，足夠 return this->result();
        
        2. 不夠去改 state
    }
    
    function result() {
        ....
    }
}

class jko extends procss {
    function handle() {
        1. 街口處理 return this->result();
    }
    
    function result() {
        ....
    }
}

class creditcard extends procss {
    function handle() {
        1. 信用卡處理 return this->result();
    }
    
    function result() {
        ....
    }
}

class main {
    $state = {
        ...前端送出的資料
        ...預定流程的資料: {
            amount: 1000,
            hours: 16, 
        }
    };
    
    function checkout() {
        this->inner()
        this->owner()
        this->subscribe()
        this->point()
            
        // this->cash() || use factory...
        this->jko()
        this->creditcard()
            
    }
}
```



## 問題：
1. 此份程式無法做到中間跳離的部分，想像是有一個 state（身份） 可以去呼叫工廠由工廠產生相對應的 class 去做呼叫
2. 如何確保資料的一致性，何時改動資料庫的資料。這邊認為可以由 class 在最後流程走完後的產出直接由 class 最後呼叫！
3. state 傳入後其他類別如何更改此 state？




### 生產者

```php=
<php?
class builder {
      $state = {};

      function inner() {
      
      }
      
      function owner() {
      
      }
      
      function subscribe() {
      
      }
      
      function point() {
      
      }
      
      function jko() {
      
      }
      
      function credit() {
      
      }
      
      function result() {
      
      }
 }
```

```php=
<?php

class combination {
    // 各種組合
    
    function 
}
    

```

