系列文章總目錄
github地址:github地址:https://github.com/gishys/abp.generalreservation
概述
從預約的本質考慮,之所以會存在預約是因為我們所需要辦理的事物是一種稀缺資源,或者我們想提高辦理事物的效率亦或者我們想讓辦理者提高辦理成功概率。在這篇文章中預約場景可以描述為,在某一個時間去某一個地方辦理一種事物。
預約的組成
預約管理信息
首先預約需要一個可以被識別的名稱,在創建預約時還需要配置開放預約天數,以及開放預約的時間段。在關系型數據庫中我們定義預約信息為預約名稱、預約開放天數、預約開放時間、是否包含當天、預約備注、創建預約時間。存儲結構圖1所示。
同時預約唯一標識(Id)在字典中定義為根節點,所有其他配置項以預約信息為父節點。
圖1
預約內容
預約的選擇條件包含三個組成部分,某一個時間段、某一個地方、需要處理的事物。
時間段
為了讓預約這件事情符合它本身的定義,預約的時間段應該盡量保持在一個較小的范圍內,如果這個范圍很大,比如幾天,預約這件事情就失去了意義,所以預約的時間段的最大范圍規定為1天內,也就是說我們預約的事物應該在一天內完結。
在實際使用場景中我們把預約的時間段分得更細,預約時間分為二級或者甚至還有三級的情況,比如選擇某一天之后,還有某一個時間段(9:00-10:30,10:30-12:00),如果時間段分的足夠多,可能我們還需要三級,要在時間段的上面增加上午、下午。
時間段如果存在多級就需要考慮一個問題,我們在實現預約界面的時候需要選擇的級別是不確定的,可能是一個級別,我們只需要選擇某一天,也可能是多個級別。這樣我們設計時間段選擇的時候,是需要根據時間段級別動態的創建多級選擇,基於這個需求,在關系型數據庫中設計存儲結構如(圖2)所示,其實就是把時間段的存儲視為字典的存儲,字典包含主鍵Id、父節點Id、項名稱、項值。
圖2
地點
預約的地點一種情況為辦理網點或者履行預約的位置,在實際使用場景中也有可能存在多級,比如某市某區的某一個街道等等,在關系型數據庫中設計存儲結構如(圖2)所示。
還有一種復雜的使用場景,辦理的地點用字符串數組不能直觀的體現出表達的信息,我們可以通過二維表的形式展現,比如預約的地點為一層以上建築的某一個房間,我們通過表格的形式能更直觀的體現出預約位置信息。
辦理的事物
辦理的事物可以是一段描述,也可以是多個描述,多個描述又可以分為多個級別。比如我們預約不動產登記,我們可以選擇大類轉移登記,還可以進一步選擇,選擇轉移登記里的二手房轉移登記。
預約資源池
預約資源池就是我們可預約的資源,我們可以把預約資源池理解為預約內容描述的資源,在某一個時間段、在某一個地點、需要辦理的事物可以預約的個數或次數,比如以上面的例子來舉例,就是在某一天的某一個辦理地點我可以通過預約的方式可以有多少個用戶來辦理二手房轉移登記。
預約資源池可以通過幾個基本標識來表示,唯一Id、資源總數量、可預約數量、是否可用、是否可以重放、時間Id、地點Id、辦理事物Id、資源池編號。
預約信息
預約用戶信息是我們管理預約記錄的標識信息,最基本的預約信息為電話號碼,通過填寫電話號碼我們可以標記用戶,在一些使用場景我們還可以發送預約通知,打電話通知等。除了基本的預約信息,我們在一些使用場景可能還需要姓名、證件號碼等其他標識信息。如果是預約房間,我們還需要記錄是幾個人赴約等等。
以上的預約用戶信息是為了保證預約能夠准確的履行,保證預約的資源可以正確的分配。我們通過幾個基本信息來表示預約信息:所屬預約資源池Id、預約信息創建時間、預約人電話、預約人姓名、預約人證件類型、預約人證件號碼、預約編號、預約起始時間、預約結束時間、預約狀態(已預約、已取消、爽約、已完成、已關閉)、預約備注。
預約黑名單
在我們履行預約的過程中,由於各種原因,很多用戶在一些特殊情況下不得不取消預約或者爽約。還有一些群體(黃牛)想通過不法手段控制預約資源(稀缺資源)來為自己謀利。我們需要制定完善的機制,來保證第一種情況,可以在后面的時間內繼續申請預約,我們還要制定規則來防范第二種情況對公平的預約環境的破壞。
黑名單就是保護預約行為在公平公正的規則下運行的有力武器,比如我們把爽約(占用了資源而不去使用)的用戶放入黑名單,我們也可以把多次取消預約的人放入黑名單,懲罰破壞規則的人對其他申請用戶起到警醒作用,已達到資源配置最大化。