Files
kefu/im/backend/migrations/037_pet_adoption_mating.sql
T
Your NameandClaude Opus 5 46a60ffac3 宠物板块二到四期:领养、配种、上门代喂与收益账户
领养是信息服务:没有金额字段,文案里出现收费话术或短期内连续送养都会转人工,
送出时按 30/90 天建好回访任务。配种同样只做信息展示,且默认关闭。

代喂是这个模块里唯一动钱的部分,顺序是它的安全边界:先付款再进大厅,选定
之后才解密门牌与电话,每次上门按到达/喂食/离开留照片,主人确认或超时自动确认
后才结算。结算只走账本,(user, biz_type, biz_id) 唯一键让重复结算付不出第二次;
申诉会冻结自动确认,由客服裁定全付、部分付或全退。

提现按方案默认关闭:收益先只记账,等分账通道与资质到位再在管理端开闸。

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

89 lines
4.9 KiB
SQL

SET NAMES utf8mb4;
-- 送养帖。平台只做信息与撮合,任何金额字段都不存在——不给"变相售卖"留位置。
CREATE TABLE IF NOT EXISTS pet_adoptions (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
pet_id BIGINT UNSIGNED NOT NULL,
owner_user_id BIGINT UNSIGNED NOT NULL,
city_code VARCHAR(20) NOT NULL DEFAULT '',
city_name VARCHAR(50) NOT NULL DEFAULT '',
reason VARCHAR(500) NOT NULL DEFAULT '' COMMENT '送养原因',
requirements VARCHAR(500) NOT NULL DEFAULT '' COMMENT '对领养人的要求',
status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '0 已下架 1 招领中 2 已送出',
moderation_status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 待审核 1 通过 2 驳回',
moderation_note VARCHAR(255) NOT NULL DEFAULT '',
review_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '转人工的原因,给审核员看',
application_count INT UNSIGNED NOT NULL DEFAULT 0,
adopter_user_id BIGINT UNSIGNED NULL,
completed_at DATETIME(3) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
deleted_at DATETIME(3) NULL,
PRIMARY KEY (id),
KEY idx_adoptions_listing (status, moderation_status, id),
KEY idx_adoptions_owner (owner_user_id, id),
KEY idx_adoptions_city (city_code, status, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 一个人对同一条送养只能申请一次:unique 让重复申请在数据库层面就不可能。
CREATE TABLE IF NOT EXISTS pet_adoption_applications (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
adoption_id BIGINT UNSIGNED NOT NULL,
applicant_user_id BIGINT UNSIGNED NOT NULL,
answers_json TEXT NOT NULL,
message VARCHAR(500) NOT NULL DEFAULT '',
status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 待处理 1 已选定 2 已婉拒 3 已撤回',
decided_at DATETIME(3) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_adoption_applicant (adoption_id, applicant_user_id),
KEY idx_applications_applicant (applicant_user_id, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 回访:送出之后才是责任的开始,到期提醒领养人交一次近况。
CREATE TABLE IF NOT EXISTS pet_adoption_followups (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
adoption_id BIGINT UNSIGNED NOT NULL,
adopter_user_id BIGINT UNSIGNED NOT NULL,
due_at DATETIME(3) NOT NULL,
submitted_at DATETIME(3) NULL,
content VARCHAR(500) NOT NULL DEFAULT '',
media_json TEXT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
KEY idx_followups_due (submitted_at, due_at),
KEY idx_followups_adopter (adopter_user_id, due_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 配种信息:只展示与联系,不参与交易,所以同样没有金额字段。
CREATE TABLE IF NOT EXISTS pet_mating_listings (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
pet_id BIGINT UNSIGNED NOT NULL,
owner_user_id BIGINT UNSIGNED NOT NULL,
city_code VARCHAR(20) NOT NULL DEFAULT '',
city_name VARCHAR(50) NOT NULL DEFAULT '',
expectation VARCHAR(500) NOT NULL DEFAULT '' COMMENT '对对方的期望',
vaccine_media VARCHAR(500) NOT NULL DEFAULT '' COMMENT '免疫证明照片',
status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '0 已下架 1 展示中',
moderation_status TINYINT UNSIGNED NOT NULL DEFAULT 0,
moderation_note VARCHAR(255) NOT NULL DEFAULT '',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
deleted_at DATETIME(3) NULL,
PRIMARY KEY (id),
KEY idx_mating_listing (status, moderation_status, id),
KEY idx_mating_owner (owner_user_id, id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO system_configs(config_key,config_value,value_type,description) VALUES
('pet.adoption_enabled','true','boolean','是否开放送养与领养'),
('pet.adoption_min_photos','3','integer','发布送养所需的最少照片数'),
('pet.adoption_review_words','元,钱,价,押金,费用,红包,转账,收费,出售,买,卖,微信,QQ,电话','string','送养文案命中这些词时转人工审核,逗号分隔'),
('pet.adoption_batch_days','90','integer','统计送养只数的时间窗口(天)'),
('pet.adoption_batch_limit','3','integer','窗口内送养超过这个只数即转人工审核'),
('pet.adoption_followup_days','30,90','string','送出后的回访节点,天数逗号分隔'),
('pet.mating_enabled','false','boolean','是否开放配种撮合;开启前请确认动物福利与舆情风险'),
('pet.mating_min_age_months','12','integer','可发布配种的最小月龄')
ON DUPLICATE KEY UPDATE description=VALUES(description);