Files
dax-pay/_config/sql/update-tables.sql
DaxPay Dev 357ee494ee feat(sensitive-word): 新增平台敏感词过滤能力
新增 capability-sensitive-word 模块(词库 CRUD、命中审计、AC 匹配与繁转简规范化),平台配置策略开关,并接入支付标题/商品名与商户应用门店等展示字段校验;同步 DDL、菜单与后端 i18n。
2026-07-16 09:08:37 +08:00

211 lines
13 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 支付风控:黑名单配置 + 风险命中记录daxpay-plugin-risk
-- 升级脚本已部署库执行本文件COMMENT 使用 PG 标准 COMMENT ON
-- ----------------------------
-- Table structure for pay_blacklist
-- ----------------------------
CREATE TABLE IF NOT EXISTS "public"."pay_blacklist" (
"id" int8 NOT NULL,
"type" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"value" varchar(128) COLLATE "pg_catalog"."default" NOT NULL,
"channel" varchar(32) COLLATE "pg_catalog"."default",
"channel_app_id" varchar(64) COLLATE "pg_catalog"."default",
"status" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,
"reason" varchar(255) COLLATE "pg_catalog"."default",
"expire_time" timestamptz(6),
"remark" varchar(255) COLLATE "pg_catalog"."default",
"creator" int8,
"create_time" timestamptz(6),
"last_modifier" int8,
"last_modified_time" timestamptz(6),
"version" int4 DEFAULT 0,
"deleted" bool NOT NULL DEFAULT false
);
COMMENT ON TABLE "public"."pay_blacklist" IS '支付黑名单配置';
COMMENT ON COLUMN "public"."pay_blacklist"."id" IS '主键';
COMMENT ON COLUMN "public"."pay_blacklist"."type" IS '类型: ip/open_id';
COMMENT ON COLUMN "public"."pay_blacklist"."value" IS '名单值(IP或openId)';
COMMENT ON COLUMN "public"."pay_blacklist"."channel" IS '通道族(openId建议wechat/alipay, IP可空)';
COMMENT ON COLUMN "public"."pay_blacklist"."channel_app_id" IS '通道应用AppId(可选)';
COMMENT ON COLUMN "public"."pay_blacklist"."status" IS '状态: enable/disable';
COMMENT ON COLUMN "public"."pay_blacklist"."reason" IS '拉黑原因';
COMMENT ON COLUMN "public"."pay_blacklist"."expire_time" IS '过期时间(空=永久)';
COMMENT ON COLUMN "public"."pay_blacklist"."remark" IS '备注';
COMMENT ON COLUMN "public"."pay_blacklist"."creator" IS '创建者ID';
COMMENT ON COLUMN "public"."pay_blacklist"."create_time" IS '创建时间';
COMMENT ON COLUMN "public"."pay_blacklist"."last_modifier" IS '最后修改者ID';
COMMENT ON COLUMN "public"."pay_blacklist"."last_modified_time" IS '最后修改时间';
COMMENT ON COLUMN "public"."pay_blacklist"."version" IS '版本号';
COMMENT ON COLUMN "public"."pay_blacklist"."deleted" IS '删除标志';
ALTER TABLE "public"."pay_blacklist" DROP CONSTRAINT IF EXISTS "pay_blacklist_pkey";
ALTER TABLE "public"."pay_blacklist" ADD CONSTRAINT "pay_blacklist_pkey" PRIMARY KEY ("id");
CREATE INDEX IF NOT EXISTS "idx_pay_blacklist_type_value" ON "public"."pay_blacklist" ("type", "value");
CREATE INDEX IF NOT EXISTS "idx_pay_blacklist_status_expire" ON "public"."pay_blacklist" ("status", "expire_time");
-- ----------------------------
-- Table structure for pay_risk_hit
-- ----------------------------
CREATE TABLE IF NOT EXISTS "public"."pay_risk_hit" (
"id" int8 NOT NULL,
"phase" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,
"hit_type" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"hit_value" varchar(128) COLLATE "pg_catalog"."default" NOT NULL,
"blacklist_id" int8,
"mch_no" varchar(32) COLLATE "pg_catalog"."default",
"app_id" varchar(32) COLLATE "pg_catalog"."default",
"trade_no" varchar(64) COLLATE "pg_catalog"."default",
"order_no" varchar(64) COLLATE "pg_catalog"."default",
"biz_order_no" varchar(100) COLLATE "pg_catalog"."default",
"trade_type" varchar(32) COLLATE "pg_catalog"."default",
"method" varchar(32) COLLATE "pg_catalog"."default",
"product" varchar(32) COLLATE "pg_catalog"."default",
"channel" varchar(32) COLLATE "pg_catalog"."default",
"client_ip" varchar(64) COLLATE "pg_catalog"."default",
"openid" varchar(128) COLLATE "pg_catalog"."default",
"buyer_id" varchar(128) COLLATE "pg_catalog"."default",
"scene" varchar(32) COLLATE "pg_catalog"."default",
"handle_status" varchar(32) COLLATE "pg_catalog"."default" NOT NULL DEFAULT 'pending',
"handle_remark" varchar(500) COLLATE "pg_catalog"."default",
"handle_user_id" int8,
"handle_time" timestamptz(6),
"remark" varchar(255) COLLATE "pg_catalog"."default",
"creator" int8,
"create_time" timestamptz(6),
"last_modifier" int8,
"last_modified_time" timestamptz(6),
"version" int4 DEFAULT 0,
"deleted" bool NOT NULL DEFAULT false
);
COMMENT ON TABLE "public"."pay_risk_hit" IS '支付风险命中记录';
COMMENT ON COLUMN "public"."pay_risk_hit"."id" IS '主键';
COMMENT ON COLUMN "public"."pay_risk_hit"."phase" IS '阶段: before_pay/after_pay';
COMMENT ON COLUMN "public"."pay_risk_hit"."hit_type" IS '命中类型: ip/open_id';
COMMENT ON COLUMN "public"."pay_risk_hit"."hit_value" IS '命中值快照';
COMMENT ON COLUMN "public"."pay_risk_hit"."blacklist_id" IS '关联黑名单ID';
COMMENT ON COLUMN "public"."pay_risk_hit"."mch_no" IS '商户号';
COMMENT ON COLUMN "public"."pay_risk_hit"."app_id" IS '应用号';
COMMENT ON COLUMN "public"."pay_risk_hit"."trade_no" IS '平台交易号';
COMMENT ON COLUMN "public"."pay_risk_hit"."order_no" IS '容器单号';
COMMENT ON COLUMN "public"."pay_risk_hit"."biz_order_no" IS '商户业务单号';
COMMENT ON COLUMN "public"."pay_risk_hit"."trade_type" IS '交易类型';
COMMENT ON COLUMN "public"."pay_risk_hit"."method" IS '支付方式';
COMMENT ON COLUMN "public"."pay_risk_hit"."product" IS '支付产品';
COMMENT ON COLUMN "public"."pay_risk_hit"."channel" IS '支付通道';
COMMENT ON COLUMN "public"."pay_risk_hit"."client_ip" IS '客户端IP快照';
COMMENT ON COLUMN "public"."pay_risk_hit"."openid" IS '下单openId快照';
COMMENT ON COLUMN "public"."pay_risk_hit"."buyer_id" IS '通道buyerId快照';
COMMENT ON COLUMN "public"."pay_risk_hit"."scene" IS '来源场景: api/gateway/code/manual';
COMMENT ON COLUMN "public"."pay_risk_hit"."handle_status" IS '处理状态: pending/ignored/added_blacklist/merchant_disabled/other';
COMMENT ON COLUMN "public"."pay_risk_hit"."handle_remark" IS '处理说明';
COMMENT ON COLUMN "public"."pay_risk_hit"."handle_user_id" IS '处理人ID';
COMMENT ON COLUMN "public"."pay_risk_hit"."handle_time" IS '处理时间';
COMMENT ON COLUMN "public"."pay_risk_hit"."remark" IS '备注';
COMMENT ON COLUMN "public"."pay_risk_hit"."creator" IS '创建者ID';
COMMENT ON COLUMN "public"."pay_risk_hit"."create_time" IS '创建时间';
COMMENT ON COLUMN "public"."pay_risk_hit"."last_modifier" IS '最后修改者ID';
COMMENT ON COLUMN "public"."pay_risk_hit"."last_modified_time" IS '最后修改时间';
COMMENT ON COLUMN "public"."pay_risk_hit"."version" IS '版本号';
COMMENT ON COLUMN "public"."pay_risk_hit"."deleted" IS '删除标志';
ALTER TABLE "public"."pay_risk_hit" DROP CONSTRAINT IF EXISTS "pay_risk_hit_pkey";
ALTER TABLE "public"."pay_risk_hit" ADD CONSTRAINT "pay_risk_hit_pkey" PRIMARY KEY ("id");
CREATE INDEX IF NOT EXISTS "idx_pay_risk_hit_handle_time" ON "public"."pay_risk_hit" ("handle_status", "create_time");
CREATE INDEX IF NOT EXISTS "idx_pay_risk_hit_type_value" ON "public"."pay_risk_hit" ("hit_type", "hit_value");
CREATE INDEX IF NOT EXISTS "idx_pay_risk_hit_mch_no" ON "public"."pay_risk_hit" ("mch_no");
CREATE INDEX IF NOT EXISTS "idx_pay_risk_hit_trade_no" ON "public"."pay_risk_hit" ("trade_no");
CREATE INDEX IF NOT EXISTS "idx_pay_risk_hit_order_no" ON "public"."pay_risk_hit" ("order_no");
-- ----------------------------
-- 敏感词词库 + 命中审计capability-sensitive-word
-- ----------------------------
CREATE TABLE IF NOT EXISTS "public"."system_sensitive_word" (
"id" int8 NOT NULL,
"word" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
"category" varchar(32) COLLATE "pg_catalog"."default",
"match_mode" varchar(16) COLLATE "pg_catalog"."default" NOT NULL DEFAULT 'contains',
"level" varchar(16) COLLATE "pg_catalog"."default" DEFAULT 'reject',
"status" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,
"remark" varchar(255) COLLATE "pg_catalog"."default",
"creator" int8,
"create_time" timestamptz(6),
"last_modifier" int8,
"last_modified_time" timestamptz(6),
"version" int4 DEFAULT 0,
"deleted" bool NOT NULL DEFAULT false
);
COMMENT ON TABLE "public"."system_sensitive_word" IS '敏感词词库';
COMMENT ON COLUMN "public"."system_sensitive_word"."id" IS '主键';
COMMENT ON COLUMN "public"."system_sensitive_word"."word" IS '敏感词原文(建议简体)';
COMMENT ON COLUMN "public"."system_sensitive_word"."category" IS '分类: politic/porn/violence/ad/custom';
COMMENT ON COLUMN "public"."system_sensitive_word"."match_mode" IS '匹配模式: contains/exact';
COMMENT ON COLUMN "public"."system_sensitive_word"."level" IS '处理级别: reject/warn';
COMMENT ON COLUMN "public"."system_sensitive_word"."status" IS '状态: enable/disable';
COMMENT ON COLUMN "public"."system_sensitive_word"."remark" IS '备注';
COMMENT ON COLUMN "public"."system_sensitive_word"."creator" IS '创建者ID';
COMMENT ON COLUMN "public"."system_sensitive_word"."create_time" IS '创建时间';
COMMENT ON COLUMN "public"."system_sensitive_word"."last_modifier" IS '最后修改者ID';
COMMENT ON COLUMN "public"."system_sensitive_word"."last_modified_time" IS '最后修改时间';
COMMENT ON COLUMN "public"."system_sensitive_word"."version" IS '版本号';
COMMENT ON COLUMN "public"."system_sensitive_word"."deleted" IS '删除标志';
ALTER TABLE "public"."system_sensitive_word" DROP CONSTRAINT IF EXISTS "system_sensitive_word_pkey";
ALTER TABLE "public"."system_sensitive_word" ADD CONSTRAINT "system_sensitive_word_pkey" PRIMARY KEY ("id");
CREATE UNIQUE INDEX IF NOT EXISTS "uk_system_sensitive_word_word" ON "public"."system_sensitive_word" ("word") WHERE deleted = false;
CREATE INDEX IF NOT EXISTS "idx_system_sensitive_word_status" ON "public"."system_sensitive_word" ("status");
CREATE TABLE IF NOT EXISTS "public"."system_sensitive_word_hit" (
"id" int8 NOT NULL,
"word_id" int8,
"hit_word" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
"content_preview" varchar(200) COLLATE "pg_catalog"."default",
"scene" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"source" varchar(32) COLLATE "pg_catalog"."default",
"mch_no" varchar(32) COLLATE "pg_catalog"."default",
"app_id" varchar(50) COLLATE "pg_catalog"."default",
"operator_id" int8,
"client_ip" varchar(64) COLLATE "pg_catalog"."default",
"request_path" varchar(255) COLLATE "pg_catalog"."default",
"remark" varchar(255) COLLATE "pg_catalog"."default",
"creator" int8,
"create_time" timestamptz(6),
"last_modifier" int8,
"last_modified_time" timestamptz(6),
"version" int4 DEFAULT 0,
"deleted" bool NOT NULL DEFAULT false
);
COMMENT ON TABLE "public"."system_sensitive_word_hit" IS '敏感词命中记录';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."id" IS '主键';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."word_id" IS '关联词库ID';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."hit_word" IS '命中词快照';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."content_preview" IS '原文摘要';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."scene" IS '场景: pay_title/goods_name/...';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."source" IS '来源: admin/merchant/unipay/app_admin';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."mch_no" IS '商户号';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."app_id" IS '应用号';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."operator_id" IS '操作人用户ID';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."client_ip" IS '客户端IP';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."request_path" IS '请求路径';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."remark" IS '备注';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."creator" IS '创建者ID';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."create_time" IS '创建时间';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."last_modifier" IS '最后修改者ID';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."last_modified_time" IS '最后修改时间';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."version" IS '版本号';
COMMENT ON COLUMN "public"."system_sensitive_word_hit"."deleted" IS '删除标志';
ALTER TABLE "public"."system_sensitive_word_hit" DROP CONSTRAINT IF EXISTS "system_sensitive_word_hit_pkey";
ALTER TABLE "public"."system_sensitive_word_hit" ADD CONSTRAINT "system_sensitive_word_hit_pkey" PRIMARY KEY ("id");
CREATE INDEX IF NOT EXISTS "idx_system_sensitive_word_hit_time" ON "public"."system_sensitive_word_hit" ("create_time");
CREATE INDEX IF NOT EXISTS "idx_system_sensitive_word_hit_word" ON "public"."system_sensitive_word_hit" ("hit_word");
CREATE INDEX IF NOT EXISTS "idx_system_sensitive_word_hit_mch" ON "public"."system_sensitive_word_hit" ("mch_no", "create_time");
CREATE INDEX IF NOT EXISTS "idx_system_sensitive_word_hit_scene" ON "public"."system_sensitive_word_hit" ("scene");