Improve WeChat MP replies and ship MindSpace/H5 production updates.

Add WeChat service account routing with sync acks, connectivity tests, and context isolation; document deploy runbooks; and bundle related MindSpace, voice, Plaza, and server gateway changes for production rollout.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-06-19 23:06:43 +08:00
parent b0f5d6a51c
commit 229805a070
241 changed files with 13190 additions and 902 deletions
+140
View File
@@ -632,6 +632,28 @@ CREATE TABLE IF NOT EXISTS plaza_featured (
CONSTRAINT fk_plaza_featured_creator FOREIGN KEY (created_by) REFERENCES h5_users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS plaza_user_events (
id CHAR(36) PRIMARY KEY,
user_id CHAR(36) NULL,
session_id VARCHAR(64) NOT NULL,
post_id CHAR(36) NOT NULL,
event_type ENUM(
'impression', 'click', 'view', 'dwell',
'like', 'collect', 'comment', 'share',
'dislike', 'hide'
) NOT NULL,
dwell_ms INT UNSIGNED NULL,
feed_sort VARCHAR(32) NOT NULL DEFAULT '',
feed_category VARCHAR(64) NOT NULL DEFAULT '',
position INT UNSIGNED NULL,
created_at BIGINT NOT NULL,
KEY idx_plaza_event_user_time (user_id, created_at),
KEY idx_plaza_event_session_time (session_id, created_at),
KEY idx_plaza_event_post (post_id, event_type, created_at),
CONSTRAINT fk_plaza_event_post FOREIGN KEY (post_id) REFERENCES plaza_posts(id) ON DELETE CASCADE,
CONSTRAINT fk_plaza_event_user FOREIGN KEY (user_id) REFERENCES h5_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS ops_audit_log (
id CHAR(36) PRIMARY KEY,
operator_id CHAR(36) NOT NULL,
@@ -696,3 +718,121 @@ CREATE TABLE IF NOT EXISTS h5_wechat_pending_binds (
created_at BIGINT NOT NULL,
KEY idx_wechat_pending_expires (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS h5_wechat_agent_routes (
id CHAR(36) PRIMARY KEY,
user_id CHAR(36) NOT NULL,
app_id VARCHAR(32) NOT NULL,
openid VARCHAR(64) NOT NULL,
agent_session_id VARCHAR(128) NOT NULL,
status ENUM('active', 'disabled') NOT NULL DEFAULT 'active',
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY uq_wechat_agent_route (app_id, openid),
KEY idx_wechat_agent_route_user (user_id, updated_at),
CONSTRAINT fk_wechat_agent_route_user FOREIGN KEY (user_id) REFERENCES h5_users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS h5_wechat_mp_messages (
app_id VARCHAR(32) NOT NULL,
openid VARCHAR(64) NOT NULL,
msg_id VARCHAR(128) NOT NULL,
status ENUM('processing', 'done', 'failed') NOT NULL DEFAULT 'processing',
agent_session_id VARCHAR(128) NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
PRIMARY KEY (app_id, openid, msg_id),
KEY idx_wechat_mp_messages_updated (updated_at),
KEY idx_wechat_mp_messages_session (agent_session_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS h5_schedule_items (
id CHAR(36) PRIMARY KEY,
user_id CHAR(36) NOT NULL,
kind ENUM('task', 'event') NOT NULL,
title VARCHAR(255) NOT NULL,
description TEXT NULL,
status ENUM('active', 'completed', 'cancelled', 'deleted') NOT NULL DEFAULT 'active',
start_at BIGINT NULL,
end_at BIGINT NULL,
due_at BIGINT NULL,
all_day TINYINT(1) NOT NULL DEFAULT 0,
timezone VARCHAR(64) NOT NULL DEFAULT 'Asia/Shanghai',
location VARCHAR(255) NULL,
source_channel ENUM('h5', 'wechat', 'agent', 'api') NOT NULL DEFAULT 'agent',
source_session_id VARCHAR(128) NULL,
source_message_id VARCHAR(128) NULL,
source_text TEXT NULL,
metadata_json JSON NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
deleted_at BIGINT NULL,
KEY idx_schedule_user_time (user_id, status, start_at, due_at),
KEY idx_schedule_user_updated (user_id, updated_at),
CONSTRAINT fk_schedule_item_user FOREIGN KEY (user_id) REFERENCES h5_users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS h5_schedule_reminders (
id CHAR(36) PRIMARY KEY,
user_id CHAR(36) NOT NULL,
item_id CHAR(36) NOT NULL,
remind_at BIGINT NOT NULL,
offset_minutes INT NULL,
channel ENUM('wechat', 'in_app') NOT NULL DEFAULT 'wechat',
status ENUM('pending', 'locked', 'sent', 'failed', 'cancelled') NOT NULL DEFAULT 'pending',
attempts INT NOT NULL DEFAULT 0,
last_error VARCHAR(500) NULL,
locked_until BIGINT NULL,
sent_at BIGINT NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY uq_schedule_item_remind_at (item_id, remind_at, channel),
KEY idx_reminder_due (status, remind_at),
KEY idx_reminder_user (user_id, status, remind_at),
CONSTRAINT fk_schedule_reminder_user FOREIGN KEY (user_id) REFERENCES h5_users(id) ON DELETE CASCADE,
CONSTRAINT fk_schedule_reminder_item FOREIGN KEY (item_id) REFERENCES h5_schedule_items(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS h5_schedule_digest_subscriptions (
id CHAR(36) PRIMARY KEY,
user_id CHAR(36) NOT NULL,
digest_type ENUM('todo_day') NOT NULL DEFAULT 'todo_day',
hour TINYINT UNSIGNED NOT NULL,
minute TINYINT UNSIGNED NOT NULL DEFAULT 0,
timezone VARCHAR(64) NOT NULL DEFAULT 'Asia/Shanghai',
channel ENUM('wechat', 'in_app') NOT NULL DEFAULT 'wechat',
status ENUM('active', 'locked', 'failed', 'cancelled') NOT NULL DEFAULT 'active',
next_run_at BIGINT NOT NULL,
last_run_at BIGINT NULL,
attempts INT NOT NULL DEFAULT 0,
locked_until BIGINT NULL,
last_error VARCHAR(500) NULL,
source_channel ENUM('h5', 'wechat', 'agent', 'api') NOT NULL DEFAULT 'agent',
source_session_id VARCHAR(128) NULL,
source_message_id VARCHAR(128) NULL,
source_text TEXT NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY uq_schedule_digest_user_type_channel (user_id, digest_type, channel),
KEY idx_schedule_digest_due (status, next_run_at),
CONSTRAINT fk_schedule_digest_user FOREIGN KEY (user_id) REFERENCES h5_users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS h5_schedule_delivery_logs (
id CHAR(36) PRIMARY KEY,
reminder_id CHAR(36) NULL,
subscription_id CHAR(36) NULL,
user_id CHAR(36) NOT NULL,
channel ENUM('wechat', 'in_app') NOT NULL,
status ENUM('success', 'failed') NOT NULL,
provider_message_id VARCHAR(128) NULL,
error_code VARCHAR(64) NULL,
error_message VARCHAR(500) NULL,
created_at BIGINT NOT NULL,
KEY idx_delivery_reminder (reminder_id, created_at),
KEY idx_delivery_subscription (subscription_id, created_at),
KEY idx_delivery_user (user_id, created_at),
CONSTRAINT fk_schedule_delivery_reminder FOREIGN KEY (reminder_id) REFERENCES h5_schedule_reminders(id) ON DELETE CASCADE,
CONSTRAINT fk_schedule_delivery_subscription FOREIGN KEY (subscription_id) REFERENCES h5_schedule_digest_subscriptions(id) ON DELETE CASCADE,
CONSTRAINT fk_schedule_delivery_user FOREIGN KEY (user_id) REFERENCES h5_users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;