会议室预约功能模块大概可以分为三大部分
预约模块
黑名单模块
日志模块
预约模块
- 请求占用时间表,验证请求时间是否被占用,没有则进行第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
日志模块
- 因为预约会议室的行为是一种资源操作的行为
- 对于这种行为我们是要纪录日志的
- 纪录日志确实非常简单,就是在每一步操作后,向
日志表
纪录谁谁谁,什么什么时候,干了什么什么即可