feat: add party-size queueing and call modes

This commit is contained in:
wangxuming
2026-07-16 11:40:34 +08:00
parent 7f751bebae
commit 66951b4dc3
53 changed files with 3348 additions and 533 deletions

View File

@@ -0,0 +1,4 @@
DELETE FROM users AS public_user
WHERE public_user.username = 'public-visitor'
AND NOT EXISTS (SELECT 1 FROM queue_tickets WHERE created_by = public_user.id)
AND NOT EXISTS (SELECT 1 FROM idempotency_keys WHERE user_id = public_user.id);

View File

@@ -0,0 +1,3 @@
INSERT INTO users (username, password_hash, role, active)
VALUES ('public-visitor', '!', 'STAFF', false)
ON CONFLICT (username) DO NOTHING;

View File

@@ -0,0 +1,5 @@
ALTER TABLE projects
DROP CONSTRAINT IF EXISTS projects_experienced_people_start_check;
ALTER TABLE projects
DROP COLUMN IF EXISTS experienced_people_start;

View File

@@ -0,0 +1,6 @@
ALTER TABLE projects
ADD COLUMN experienced_people_start integer NOT NULL DEFAULT 0;
ALTER TABLE projects
ADD CONSTRAINT projects_experienced_people_start_check
CHECK (experienced_people_start BETWEEN 0 AND 1000000000);

View File

@@ -0,0 +1,34 @@
ALTER TABLE call_batches
DROP CONSTRAINT IF EXISTS call_batches_people_count_check,
DROP CONSTRAINT IF EXISTS call_batches_ticket_count_check,
DROP CONSTRAINT IF EXISTS call_batches_requested_count_check,
DROP CONSTRAINT IF EXISTS call_batches_call_mode_check;
ALTER TABLE call_batches
DROP COLUMN IF EXISTS people_count,
DROP COLUMN IF EXISTS ticket_count,
DROP COLUMN IF EXISTS requested_count,
DROP COLUMN IF EXISTS call_mode;
ALTER TABLE queue_tickets
DROP CONSTRAINT IF EXISTS queue_tickets_party_size_check;
ALTER TABLE queue_tickets
DROP COLUMN IF EXISTS party_size;
ALTER TABLE projects
DROP CONSTRAINT IF EXISTS projects_party_size_range_check,
DROP CONSTRAINT IF EXISTS projects_min_party_size_check,
DROP CONSTRAINT IF EXISTS projects_call_people_default_limit_check,
DROP CONSTRAINT IF EXISTS projects_max_call_people_count_check,
DROP CONSTRAINT IF EXISTS projects_call_ticket_default_limit_check,
DROP CONSTRAINT IF EXISTS projects_max_call_ticket_count_check,
DROP CONSTRAINT IF EXISTS projects_call_mode_check;
ALTER TABLE projects
DROP COLUMN IF EXISTS max_party_size,
DROP COLUMN IF EXISTS min_party_size,
DROP COLUMN IF EXISTS max_call_people_count,
DROP COLUMN IF EXISTS default_call_people_count,
DROP COLUMN IF EXISTS max_call_ticket_count,
DROP COLUMN IF EXISTS call_mode;

View File

@@ -0,0 +1,59 @@
ALTER TABLE projects
ADD COLUMN call_mode varchar(16) NOT NULL DEFAULT 'BOTH',
ADD COLUMN max_call_ticket_count integer NOT NULL DEFAULT 100,
ADD COLUMN default_call_people_count integer NOT NULL DEFAULT 1,
ADD COLUMN max_call_people_count integer NOT NULL DEFAULT 100,
ADD COLUMN min_party_size integer NOT NULL DEFAULT 1,
ADD COLUMN max_party_size integer NOT NULL DEFAULT 10;
ALTER TABLE projects
ADD CONSTRAINT projects_call_mode_check
CHECK (call_mode IN ('TICKET', 'PEOPLE', 'BOTH')),
ADD CONSTRAINT projects_max_call_ticket_count_check
CHECK (max_call_ticket_count BETWEEN 1 AND 10000),
ADD CONSTRAINT projects_call_ticket_default_limit_check
CHECK (call_batch_size <= max_call_ticket_count),
ADD CONSTRAINT projects_max_call_people_count_check
CHECK (max_call_people_count BETWEEN 1 AND 10000),
ADD CONSTRAINT projects_call_people_default_limit_check
CHECK (default_call_people_count BETWEEN 1 AND max_call_people_count),
ADD CONSTRAINT projects_min_party_size_check
CHECK (min_party_size BETWEEN 1 AND 10000),
ADD CONSTRAINT projects_party_size_range_check
CHECK (max_party_size BETWEEN min_party_size AND 10000);
ALTER TABLE queue_tickets
ADD COLUMN party_size integer NOT NULL DEFAULT 1;
ALTER TABLE queue_tickets
ADD CONSTRAINT queue_tickets_party_size_check
CHECK (party_size BETWEEN 1 AND 10000);
ALTER TABLE call_batches
ADD COLUMN call_mode varchar(16) NOT NULL DEFAULT 'TICKET',
ADD COLUMN requested_count integer NOT NULL DEFAULT 1,
ADD COLUMN ticket_count integer NOT NULL DEFAULT 1,
ADD COLUMN people_count integer NOT NULL DEFAULT 1;
UPDATE call_batches AS batch
SET ticket_count = totals.ticket_count,
people_count = totals.people_count
FROM (
SELECT cbt.call_batch_id,
count(*)::integer AS ticket_count,
COALESCE(sum(ticket.party_size), 0)::integer AS people_count
FROM call_batch_tickets AS cbt
JOIN queue_tickets AS ticket ON ticket.id = cbt.ticket_id
GROUP BY cbt.call_batch_id
) AS totals
WHERE totals.call_batch_id = batch.id;
ALTER TABLE call_batches
ADD CONSTRAINT call_batches_call_mode_check
CHECK (call_mode IN ('TICKET', 'PEOPLE')),
ADD CONSTRAINT call_batches_requested_count_check
CHECK (requested_count > 0),
ADD CONSTRAINT call_batches_ticket_count_check
CHECK (ticket_count > 0),
ADD CONSTRAINT call_batches_people_count_check
CHECK (people_count > 0);

View File

@@ -0,0 +1,6 @@
ALTER TABLE projects
DROP CONSTRAINT projects_batch_size_check;
ALTER TABLE projects
ADD CONSTRAINT projects_batch_size_check
CHECK (call_batch_size BETWEEN 1 AND 100);

View File

@@ -0,0 +1,6 @@
ALTER TABLE projects
DROP CONSTRAINT projects_batch_size_check;
ALTER TABLE projects
ADD CONSTRAINT projects_batch_size_check
CHECK (call_batch_size BETWEEN 1 AND 10000);