新增模型: 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 完整架构规范
258 lines
10 KiB
SQL
258 lines
10 KiB
SQL
|
||
-- ./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);
|
||
|