修复账号禁用及队列场次状态规则

问题与需求:后台禁用员工后旧会话仍可继续访问;实时队列跨天误读昨日场次;项目暂停后需禁止取号但允许叫号。

修复思路:账号权限变更时撤销会话并同步前端登录态;实时查询统一按项目时区当天场次过滤;拆分取号与叫号的状态校验,并补充前后端及 PostgreSQL 回归测试。
This commit is contained in:
2026-07-30 12:02:05 +08:00
parent 0e1ac400dc
commit 17d296263c
14 changed files with 752 additions and 54 deletions

View File

@@ -116,12 +116,6 @@ func (s *Server) statusByPhone(w http.ResponseWriter, r *http.Request, limitByCl
var tickets []model.QueueTicket
activeSessionStatuses := []string{"RUNNING", "PAUSED"}
latestActiveSession := s.db.Table("queue_sessions AS latest_active_session").
Select("latest_active_session.id").
Where("latest_active_session.project_id = queue_tickets.project_id").
Where("latest_active_session.status IN ?", activeSessionStatuses).
Order("latest_active_session.business_date DESC").
Limit(1)
if err := s.db.WithContext(r.Context()).Model(&model.QueueTicket{}).
Joins("JOIN projects ON projects.id = queue_tickets.project_id").
Joins("JOIN queue_sessions ON queue_sessions.id = queue_tickets.queue_session_id AND queue_sessions.project_id = queue_tickets.project_id").
@@ -130,7 +124,7 @@ func (s *Server) statusByPhone(w http.ResponseWriter, r *http.Request, limitByCl
[]string{model.TicketWaiting, model.TicketCalled, model.TicketArrived},
activeSessionStatuses,
[]string{model.ProjectRunning, model.ProjectPaused}).
Where("queue_tickets.queue_session_id = (?)", latestActiveSession).
Where("queue_sessions.business_date = (? AT TIME ZONE projects.timezone)::date", s.now()).
Order("projects.name ASC, queue_tickets.ticket_number ASC").
Find(&tickets).Error; err != nil {
writeError(w, err)
@@ -306,9 +300,7 @@ func (s *Server) displaySnapshot(w http.ResponseWriter, r *http.Request) {
writeError(w, mapNotFound(err, "DISPLAY_NOT_FOUND", "公示屏绑定不存在"))
return
}
var session model.QueueSession
err = s.db.WithContext(r.Context()).Where("project_id = ? AND status IN ?", project.ID, []string{"RUNNING", "PAUSED"}).
Order("business_date DESC").First(&session).Error
session, err := s.currentQueueSession(s.db.WithContext(r.Context()), project)
if errors.Is(err, gorm.ErrRecordNotFound) {
experiencedPeople, metricErr := s.displayedExperiencedPeople(r.Context(), project, nil)
if metricErr != nil {