Files
kefu/im/backend/migrations/042_admin_broadcast_refund.sql
T
Your NameandClaude Opus 5 0031f79eb3 管理端补上运营真正要用的那几件事
原来 107 个后台接口配的是一套只能看的界面:风险中心 6 行代码全是只读,
动态和消息只能一条一条点,运营想发一句公告没有任何入口。

公告与通知:按全体、会员、城市、喂养者、有宠物的用户或指定名单发系统通知,
发之前能看到会发给多少人,可同时走离线推送。撤回只删还没读的那些——已经
读过的假装收回去只会让统计说谎。

资金总览:把"平台账上哪些钱不是自己的"单独摆出来(任务托管中 + 喂养者余额 +
申诉冻结),旁边才是收入、退款和待打款,最后是按产品和按日的收款。

退款统一到一个入口:会员、代喂、保证金都能分几次退到退完,每笔记一行;
退完最后一分钱才撤销买到的东西,半份会员仍然是会员。

风险中心能动手了:按等级和状态筛,行内直接封禁、冻结、加白(必须写理由)、
跳用户详情,事件可以标记跟进完成。

批量处置:动态、消息、举报支持勾选后批量下架/恢复/驳回,一次最多 100 条。
处罚仍然一条一条来——批量封禁是错封人最快的方式。

敏感词统一词库:消息、动态、送养共用一套,命中是拦截还是转人工由运营定;
转人工的命中会在风险中心留一条,管理端还能拿真实文案先试一遍。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 13:07:58 +08:00

44 lines
2.2 KiB
SQL

SET NAMES utf8mb4;
-- 公告与系统通知群发。发出去的每一条都记一行,因为"给谁发过什么"是事后
-- 唯一能对账的东西;撤回也只撤这一批里还没读的那些。
CREATE TABLE IF NOT EXISTS notification_broadcasts (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content VARCHAR(1000) NOT NULL,
audience VARCHAR(20) NOT NULL COMMENT 'all/users/vip/city/sitters/owners',
audience_ref VARCHAR(500) NOT NULL DEFAULT '' COMMENT '城市编码或用户编号列表',
with_push TINYINT(1) NOT NULL DEFAULT 0,
recipient_count INT UNSIGNED NOT NULL DEFAULT 0,
push_count INT UNSIGNED NOT NULL DEFAULT 0,
status VARCHAR(20) NOT NULL DEFAULT 'SENT' COMMENT 'SENT/REVOKED',
revoked_count INT UNSIGNED NOT NULL DEFAULT 0,
created_by BIGINT UNSIGNED NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
revoked_at DATETIME(3) NULL,
PRIMARY KEY (id),
KEY idx_broadcast_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 订单退款流水。代喂那张 pet_feed_refunds 记的是任务口径,这张记的是订单
-- 口径:会员、保证金、代喂都在这里,一笔订单可以退很多次。
CREATE TABLE IF NOT EXISTS order_refunds (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
order_id BIGINT UNSIGNED NOT NULL,
refund_no VARCHAR(60) NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
amount_cent INT UNSIGNED NOT NULL,
channel VARCHAR(20) NOT NULL DEFAULT 'gateway' COMMENT 'gateway 原路退回 / offline 线下已退',
reason VARCHAR(500) NOT NULL DEFAULT '',
handled_by BIGINT UNSIGNED NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_order_refund_no (refund_no),
KEY idx_order_refunds_order (order_id, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO system_configs(config_key,config_value,value_type,description) VALUES
('notification.broadcast_max_recipients','20000','integer','单次公告的最大接收人数,超过要分批发'),
('notification.broadcast_push_enabled','true','boolean','公告是否允许同时走离线推送')
ON DUPLICATE KEY UPDATE description=VALUES(description);