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:
+140
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user