From af2c18a546b201415a5c86973e1c077551c6b0d1 Mon Sep 17 00:00:00 2001
From: brother7 <7brother7@gmail.com>
Date: Fri, 31 Jul 2026 17:31:03 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=9A=E5=8F=AB=E5=8F=B7?=
=?UTF-8?q?=E5=86=85=E5=AE=B9=E8=BF=9E=E7=BB=AD=E6=92=AD=E6=8A=A5=E4=B8=89?=
=?UTF-8?q?=E6=AC=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
需求:公屏每次播放叫号声音时重复三遍。
实现:单项目页和多项目公屏均为每个新批次排队三条相同语音,并更新回归测试。
---
web/src/pages/DisplayPage.test.tsx | 16 +++++++++-------
web/src/pages/DisplayPage.tsx | 10 ++++++----
web/src/pages/PublicDisplayCenterPage.test.tsx | 14 ++++++++------
web/src/pages/PublicDisplayCenterPage.tsx | 10 ++++++----
4 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/web/src/pages/DisplayPage.test.tsx b/web/src/pages/DisplayPage.test.tsx
index d4aeeae..74dad2b 100644
--- a/web/src/pages/DisplayPage.test.tsx
+++ b/web/src/pages/DisplayPage.test.tsx
@@ -89,7 +89,7 @@ describe("DisplayPage", () => {
]);
});
- it("新批次出现时只播报一次叫号内容", () => {
+ it("新批次出现时连续播报三次叫号内容", () => {
const speak = vi.fn();
const cancel = vi.fn();
class SpeechSynthesisUtteranceMock {
@@ -118,11 +118,13 @@ describe("DisplayPage", () => {
rerender();
expect(cancel).toHaveBeenCalledOnce();
- expect(speak).toHaveBeenCalledOnce();
- expect(speak.mock.calls[0][0]).toMatchObject({
- text: "请零零零零五号至零零零零六号,前往入口。",
- lang: "zh-CN",
- rate: 0.9,
- });
+ expect(speak).toHaveBeenCalledTimes(3);
+ for (const [utterance] of speak.mock.calls) {
+ expect(utterance).toMatchObject({
+ text: "请零零零零五号至零零零零六号,前往入口。",
+ lang: "zh-CN",
+ rate: 0.9,
+ });
+ }
});
});
diff --git a/web/src/pages/DisplayPage.tsx b/web/src/pages/DisplayPage.tsx
index 06b8f63..ef08299 100644
--- a/web/src/pages/DisplayPage.tsx
+++ b/web/src/pages/DisplayPage.tsx
@@ -68,11 +68,13 @@ export function DisplayPage() {
|| typeof SpeechSynthesisUtterance === "undefined"
) return;
- const utterance = new SpeechSynthesisUtterance(currentAnnouncement);
- utterance.lang = "zh-CN";
- utterance.rate = 0.9;
window.speechSynthesis.cancel();
- window.speechSynthesis.speak(utterance);
+ for (let repeat = 0; repeat < 3; repeat += 1) {
+ const utterance = new SpeechSynthesisUtterance(currentAnnouncement);
+ utterance.lang = "zh-CN";
+ utterance.rate = 0.9;
+ window.speechSynthesis.speak(utterance);
+ }
}, [currentAnnouncement, currentCallKey, hasSnapshot, token]);
const waitingTicketCount = data?.waiting_ticket_count ?? data?.waiting_count ?? 0;
const waitingPeopleCount = data?.waiting_people_count ?? 0;
diff --git a/web/src/pages/PublicDisplayCenterPage.test.tsx b/web/src/pages/PublicDisplayCenterPage.test.tsx
index cdf9e8e..3796e93 100644
--- a/web/src/pages/PublicDisplayCenterPage.test.tsx
+++ b/web/src/pages/PublicDisplayCenterPage.test.tsx
@@ -62,7 +62,7 @@ describe("PublicDisplayCenterPage", () => {
expect(screen.queryByRole("navigation", { name: "管理任务" })).not.toBeInTheDocument();
});
- it("新叫号批次出现时播报项目和号码", () => {
+ it("新叫号批次出现时连续三次播报项目和号码", () => {
const speak = vi.fn();
class SpeechSynthesisUtteranceMock {
text: string;
@@ -95,10 +95,12 @@ describe("PublicDisplayCenterPage", () => {
};
rerender();
- expect(speak).toHaveBeenCalledOnce();
- expect(speak.mock.calls[0][0]).toMatchObject({
- text: "东门观光车,请零零零一六号,前往入口。",
- lang: "zh-CN",
- });
+ expect(speak).toHaveBeenCalledTimes(3);
+ for (const [utterance] of speak.mock.calls) {
+ expect(utterance).toMatchObject({
+ text: "东门观光车,请零零零一六号,前往入口。",
+ lang: "zh-CN",
+ });
+ }
});
});
diff --git a/web/src/pages/PublicDisplayCenterPage.tsx b/web/src/pages/PublicDisplayCenterPage.tsx
index fbe2006..2a5c193 100644
--- a/web/src/pages/PublicDisplayCenterPage.tsx
+++ b/web/src/pages/PublicDisplayCenterPage.tsx
@@ -37,10 +37,12 @@ export function PublicDisplayCenterPage() {
window.speechSynthesis.cancel();
for (const announcement of announcements) {
- const utterance = new SpeechSynthesisUtterance(announcement);
- utterance.lang = "zh-CN";
- utterance.rate = 0.9;
- window.speechSynthesis.speak(utterance);
+ for (let repeat = 0; repeat < 3; repeat += 1) {
+ const utterance = new SpeechSynthesisUtterance(announcement);
+ utterance.lang = "zh-CN";
+ utterance.rate = 0.9;
+ window.speechSynthesis.speak(utterance);
+ }
}
}, [data]);