product_management/mysql.ddl.sql
Hermes Agent e8860401bc feat: 产品模块完整功能实现 — 资源绑定/多供应商路由/包月订购/消耗引擎/成本计算
新增模型: product_resource, product_resource_supplier, product_subscription, product_usage_log
新增API: 15个.dspy端点(资源绑定/供应商管理/订购/超额/消耗/统计)
新增UI: 4个管理界面(资源绑定/供应商关联/订购管理/消费记录)
核心逻辑: ProductManager新增 bind/unbind/subscribe/product_use/check_quota 等完整业务方法
设计文档: DESIGN.md 完整架构规范
2026-06-20 12:10:32 +08:00

258 lines
10 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.

-- ./product_category.json
-- 建库时请用以下语句支持emoji字符
-- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
drop table if exists product_category;
CREATE TABLE product_category
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`parent_id` VARCHAR(32) DEFAULT '0' comment '父类别ID',
`name` VARCHAR(255) NOT NULL comment '类别名称',
`description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '类别描述',
`has_product` CHAR(1) DEFAULT '0' comment '是否可挂产品',
`product_type` VARCHAR(64) comment '产品类型标识',
`product_type_title` VARCHAR(255) comment '产品类型显示名',
`sort_order` int DEFAULT '0' comment '排序序号',
`icon` VARCHAR(255) comment '图标',
`status` CHAR(1) DEFAULT '1' comment '状态',
`org_id` VARCHAR(32) DEFAULT '0' comment '所属机构ID',
`created_by` VARCHAR(32) comment '创建人',
`created_at` datetime NOT NULL comment '创建时间',
`updated_at` datetime NOT NULL comment '更新时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '产品类别树'
;
CREATE INDEX product_category_idx_pc_org_parent ON product_category(org_id,parent_id);
CREATE INDEX product_category_idx_pc_org_status ON product_category(org_id,status);
CREATE INDEX product_category_idx_pc_org_type ON product_category(org_id,product_type);
-- ./product.json
-- 建库时请用以下语句支持emoji字符
-- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
drop table if exists product;
CREATE TABLE product
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`category_id` VARCHAR(32) NOT NULL comment '类别ID',
`product_code` VARCHAR(64) NOT NULL comment '产品编码',
`product_name` VARCHAR(255) NOT NULL comment '产品名称',
`product_type` VARCHAR(64) NOT NULL comment '产品类型标识',
`brief_intro` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '产品简介',
`detail_intro` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '产品详情',
`extra_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '扩展属性',
`enabled_date` date comment '启用日期',
`expired_date` date comment '失效日期',
`status` CHAR(1) DEFAULT '1' comment '状态',
`price_type` CHAR(1) DEFAULT '1' comment '价格类型',
`price` double(15,2) DEFAULT '0.00' comment '价格',
`currency` CHAR(8) DEFAULT 'CNY' comment '货币',
`sort_order` int DEFAULT '0' comment '排序序号',
`org_id` VARCHAR(32) DEFAULT '0' comment '所属机构ID',
`created_by` VARCHAR(32) comment '创建人',
`created_at` datetime NOT NULL comment '创建时间',
`updated_at` datetime NOT NULL comment '更新时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '产品注册表'
;
CREATE INDEX product_idx_product_org_category ON product(org_id,category_id);
CREATE UNIQUE INDEX product_idx_product_org_code ON product(org_id,product_code);
CREATE INDEX product_idx_product_org_type ON product(org_id,product_type);
CREATE INDEX product_idx_product_status ON product(status);
CREATE INDEX product_idx_product_enabled_expired ON product(enabled_date,expired_date);
-- ./product_type_config.json
-- 建库时请用以下语句支持emoji字符
-- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
drop table if exists product_type_config;
CREATE TABLE product_type_config
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`operator_id` VARCHAR(32) NOT NULL comment '运营商用户ID',
`org_id` VARCHAR(32) NOT NULL comment '所属机构ID',
`category_id` VARCHAR(32) NOT NULL comment '产品类别ID',
`config_name` VARCHAR(255) NOT NULL comment '配置名称',
`config_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '配置内容',
`enabled_flg` CHAR(1) DEFAULT '1' comment '是否启用',
`created_by` VARCHAR(32) comment '创建人',
`created_at` datetime NOT NULL comment '创建时间',
`updated_at` datetime NOT NULL comment '更新时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '运营商产品类型配置'
;
CREATE INDEX product_type_config_idx_ptc_org_opr ON product_type_config(org_id,operator_id);
CREATE UNIQUE INDEX product_type_config_idx_ptc_org_cat ON product_type_config(org_id,operator_id,category_id,config_name);
CREATE INDEX product_type_config_idx_ptc_enabled ON product_type_config(enabled_flg);
-- ./product_resource.json
drop table if exists product_resource;
CREATE TABLE product_resource
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`product_id` VARCHAR(32) NOT NULL comment '产品ID',
`resource_type` VARCHAR(32) NOT NULL comment '资源类型',
`resource_ref_id` VARCHAR(32) NOT NULL comment '资源引用ID',
`resource_ref_name` VARCHAR(255) comment '资源显示名',
`quota` double(15,4) DEFAULT '0' comment '配额量',
`quota_unit` VARCHAR(32) comment '配额单位',
`priority` int DEFAULT '1' comment '优先级',
`overflow_product_id` VARCHAR(32) comment '超额后转用产品ID',
`status` CHAR(1) DEFAULT '1' comment '状态',
`created_at` datetime NOT NULL comment '创建时间',
`updated_at` datetime comment '更新时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '产品资源绑定表'
;
CREATE INDEX product_resource_idx_pr_product ON product_resource(product_id);
CREATE INDEX product_resource_idx_pr_resource ON product_resource(resource_type,resource_ref_id);
CREATE INDEX product_resource_idx_pr_status ON product_resource(status);
-- ./product_resource_supplier.json
drop table if exists product_resource_supplier;
CREATE TABLE product_resource_supplier
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`product_resource_id` VARCHAR(32) NOT NULL comment '产品资源绑定ID',
`supplier_org_id` VARCHAR(32) NOT NULL comment '供应商机构ID',
`priority` int DEFAULT '1' comment '优先级',
`weight` int DEFAULT '100' comment '权重',
`status` CHAR(1) DEFAULT '1' comment '状态',
`created_at` datetime NOT NULL comment '创建时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '产品资源供应商关联表'
;
CREATE INDEX product_resource_supplier_idx_prs_resource ON product_resource_supplier(product_resource_id);
CREATE INDEX product_resource_supplier_idx_prs_supplier ON product_resource_supplier(supplier_org_id);
CREATE UNIQUE INDEX product_resource_supplier_idx_prs_unique ON product_resource_supplier(product_resource_id,supplier_org_id);
-- ./product_subscription.json
drop table if exists product_subscription;
CREATE TABLE product_subscription
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`product_id` VARCHAR(32) NOT NULL comment '产品ID',
`user_id` VARCHAR(32) NOT NULL comment '客户用户ID',
`user_org_id` VARCHAR(32) NOT NULL comment '客户机构ID',
`subscription_type` CHAR(1) NOT NULL comment '订购类型',
`status` CHAR(1) NOT NULL DEFAULT '1' comment '状态',
`start_date` date NOT NULL comment '生效日期',
`end_date` date NOT NULL comment '到期日期',
`quota_total` double(15,4) DEFAULT '0' comment '总配额',
`quota_used` double(15,4) DEFAULT '0' comment '已使用量',
`quota_unit` VARCHAR(32) comment '配额单位',
`overflow_mode` CHAR(1) DEFAULT '1' comment '超额模式',
`overflow_rate` double(15,6) DEFAULT '0' comment '超额单价',
`purchase_price` double(15,2) DEFAULT '0' comment '购买价格',
`purchase_currency` CHAR(8) DEFAULT 'CNY' comment '货币',
`created_at` datetime NOT NULL comment '创建时间',
`updated_at` datetime comment '更新时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '客户订购表'
;
CREATE INDEX product_subscription_idx_ps_product ON product_subscription(product_id);
CREATE INDEX product_subscription_idx_ps_user ON product_subscription(user_id,user_org_id);
CREATE INDEX product_subscription_idx_ps_status ON product_subscription(status);
CREATE INDEX product_subscription_idx_ps_dates ON product_subscription(start_date,end_date);
-- ./product_usage_log.json
drop table if exists product_usage_log;
CREATE TABLE product_usage_log
(
`id` VARCHAR(32) NOT NULL comment '主键ID',
`product_id` VARCHAR(32) NOT NULL comment '产品ID',
`subscription_id` VARCHAR(32) comment '订购ID',
`user_id` VARCHAR(32) NOT NULL comment '消费者用户ID',
`user_org_id` VARCHAR(32) NOT NULL comment '消费者机构ID',
`product_resource_id` VARCHAR(32) comment '产品资源绑定ID',
`supplier_org_id` VARCHAR(32) comment '供应商机构ID',
`resource_type` VARCHAR(32) comment '资源类型',
`resource_ref_id` VARCHAR(32) comment '资源引用ID',
`used_amount` double(15,4) NOT NULL comment '消耗量',
`used_unit` VARCHAR(32) comment '消耗单位',
`unit_cost` double(15,8) DEFAULT '0' comment '单位成本',
`total_cost` double(15,6) DEFAULT '0' comment '总成本',
`sell_price` double(15,6) DEFAULT '0' comment '客户售价',
`billing_mode` CHAR(1) NOT NULL comment '计费模式',
`source_ref_table` VARCHAR(64) comment '来源表',
`source_ref_id` VARCHAR(32) comment '来源记录ID',
`use_time` datetime NOT NULL comment '消费时间',
`created_at` datetime NOT NULL comment '创建时间'
,primary key(id)
)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
engine=innodb
comment '产品消费记录表'
;
CREATE INDEX product_usage_log_idx_pul_product ON product_usage_log(product_id);
CREATE INDEX product_usage_log_idx_pul_subscription ON product_usage_log(subscription_id);
CREATE INDEX product_usage_log_idx_pul_user ON product_usage_log(user_id,user_org_id);
CREATE INDEX product_usage_log_idx_pul_supplier ON product_usage_log(supplier_org_id);
CREATE INDEX product_usage_log_idx_pul_time ON product_usage_log(use_time);
CREATE INDEX product_usage_log_idx_pul_source ON product_usage_log(source_ref_table,source_ref_id);