# 空間結帳流程重構 https://www.figma.com/file/bwDpNzCL0wbo0NS5JzFGny/Diagram---Flow-Chart-(Copy)?node-id=81928%3A467  ## 預訂 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. 回傳畫面 ## 改善  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 } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up