实现叫号播报并调整现场业务规则

需求描述:发布屏在员工叫号后播放语音;同场次手机号被叫号后可重新取号;登录连续失败限制调整为10次。

实现思路:发布屏按新批次去重触发中文语音;重复手机号仅拦截WAITING号码;登录限流使用10次阈值,并补充前后端回归测试与接口说明。
This commit is contained in:
2026-07-31 16:36:55 +08:00
parent d782227a23
commit 78df07e074
7 changed files with 155 additions and 12 deletions

View File

@@ -131,6 +131,29 @@ func TestPublicCreateTicketIgnoresDuplicateFromEndedSession(t *testing.T) {
t.Fatalf("current-session duplicate status = %d, want 409 DUPLICATE_PHONE; body = %s",
duplicateRecorder.Code, duplicateRecorder.Body.String())
}
calledAt := now
result := db.Model(&model.QueueTicket{}).
Where("project_id = ? AND queue_session_id = ? AND phone_hmac = ? AND status = ?",
projectID, currentSession.ID, phoneHMAC, model.TicketWaiting).
Updates(map[string]any{"status": model.TicketCalled, "called_at": calledAt, "updated_at": calledAt})
if result.Error != nil {
t.Fatal(result.Error)
}
if result.RowsAffected != 1 {
t.Fatalf("called tickets = %d, want 1", result.RowsAffected)
}
afterCallRecorder := httptest.NewRecorder()
afterCallRequest := httptest.NewRequest(http.MethodPost, "/api/public/projects/"+projectID+"/tickets",
strings.NewReader(`{"phone":"13800138000","honorific":"游客","party_size":1,"allow_duplicate":false}`))
afterCallRequest.Header.Set("Idempotency-Key", "public-after-call-"+uuid.NewString())
server.Handler().ServeHTTP(afterCallRecorder, afterCallRequest)
if afterCallRecorder.Code != http.StatusCreated {
t.Fatalf("after-call status = %d, want 201; body = %s", afterCallRecorder.Code, afterCallRecorder.Body.String())
}
}
func TestInternalPhoneLookupUsesLatestActiveSessionPerProject(t *testing.T) {