會議室預約功能模塊大概可以分爲三大部分
預約模塊
黑名單模塊
日誌模塊
預約模塊
- 請求佔用時間表,驗證請求時間是否被佔用,沒有則進行第2步,有則返回失敗
- 創建預約,並將請求寫入操作日誌
- 向佔用時間表插入數據
- 假設用戶選中
2018-08-30 08:00~09:00
的時間在一號會議室開會 - 在創建訂單的時候我會先從佔用時間表
used_time
查找 一號會議室2018-08-30
裏有沒有08:00
和08:30
- 如果有返回時間已被佔用,創建失敗
- 沒有就創建預約,並紀錄日誌
- 然後再佔用時間表裏插入 一號會議室
2018-08-30
的08:00
和08:30
時間段 - 最後返回
201
給前端
黑名單模塊
- 統計用戶的違約次數,若一個自然季度內違約超過3次,則納入黑名單,一個月內禁止預約
- 什麼爲違約,會議室預定審批通過後,需要在會議開始前30分鐘再次登錄預約平臺確認方可生效,如會議開始後15分鐘仍未做確認,系統自動取消預定申請。被系統自動取消則爲違約
- 怎麼統計一個季度內訂單違約的次數呢,這裏我使用
Mysq
時間函數QUARTER
SELECT id,user,erp,COUNT('status') AS count
FROM `meeting_books`
WHERE QUARTER(DAY) = QUARTER(NOW())
AND YEAR(DAY) = YEAR(NOW())
AND status=5 ANd GROUP BY user HAVING COUNT('user')>3
這裏我是非實時計算,每隔4小時統計一次
如果要實時統計由於使用不了索引效率非常底,因爲這裏使用了內置函數還使用了 GROUP BY HAVING COUNT
- 優化的話可以使用
redis
string類型
的INCR
作爲原子計數器,例如以blacklist:用戶名:用戶id
爲鍵
違約一次就增一,以三個月爲過期時間 ,但要記得控制如果值大於3 了,要控制程序把鍵的值清零
- 這裏還需要考慮的問題是我封禁了用戶一個月是根據他在黑名單,但例如我
1月15號 封禁了用戶 2月15號 就解除了封禁
- 那我需要把之前違約的紀錄給清除掉,不然只要該用戶當季度在違約就會立刻加入黑名單
- 所以我們需要統計預約違約的時候知道這個預約是否之前被納入過黑名單
- 沒有我們就統計,有的話就忽略
- 我的做法是在訂單表加一個字段
is_blacklist
,統計的時候只統計is_blacklist = 0
的,即不在黑名單的 - 但要記得在統計用戶違約紀錄大於3的時候,把用戶違約的預定的
is_blacklist
置爲1
日誌模塊
- 因爲預約會議室的行爲是一種資源操作的行爲
- 對於這種行爲我們是要紀錄日誌的
- 紀錄日誌確實非常簡單,就是在每一步操作後,向
日誌表
紀錄誰誰誰,什麼什麼時候,幹了什麼什麼即可