import zipfile
import os
# 1. Original Schema Content (Extracted from source)
original_sql_content = """
/*
升鲜宝 - 云商品库(原版提取)
对应表前缀: platform_
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- 1. 平台商品品牌表
-- ----------------------------
DROP TABLE IF EXISTS `platform_brand`;
CREATE TABLE `platform_brand` (
`id` bigint NOT NULL COMMENT '主键id',
`brand_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '品牌名称',
`brand_url` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '品牌logo',
`brand_index` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '品牌首字母',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`use_count` int DEFAULT '0' COMMENT '引用次数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品品牌表';
-- ----------------------------
-- 2. 平台商品类别表
-- ----------------------------
DROP TABLE IF EXISTS `platform_category`;
CREATE TABLE `platform_category` (
`id` bigint NOT NULL COMMENT '主键id',
`pid` bigint DEFAULT '0' COMMENT '父id',
`level` int DEFAULT NULL COMMENT '分类级别:1->1级;2->2级',
`category_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型编码',
`category_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型名称',
`category_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类别图像',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`use_count` int DEFAULT '0' COMMENT '引用次数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品类别表';
-- ----------------------------
-- 3. 平台商品表 (核心主档)
-- ----------------------------
DROP TABLE IF EXISTS `platform_material`;
CREATE TABLE `platform_material` (
`id` bigint NOT NULL COMMENT '主键id',
`material_code` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品编码',
`material_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品名称',
`category_id` bigint DEFAULT NULL COMMENT '商品类型id',
`brand_id` bigint DEFAULT NULL COMMENT '商品品牌id',
`unit_id` bigint DEFAULT NULL COMMENT '最小单位id',
`material_property` int DEFAULT NULL COMMENT '商品性质 0=非标品 1=标品',
`gb_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '国标码',
`material_description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '中文描述',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`use_count` int DEFAULT '0' COMMENT '引用次数',
`shelf_status` int DEFAULT '0' COMMENT '上架状态 0=未上架 1=已上架',
`synchronous` tinyint DEFAULT '0' COMMENT '是否已同步 0=未同步 1=已同步',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品表';
-- ----------------------------
-- 4. 已导入的云商品表 (租户关系)
-- ----------------------------
DROP TABLE IF EXISTS `platform_material_goods`;
CREATE TABLE `platform_material_goods` (
`id` bigint NOT NULL COMMENT '主键id',
`material_id` bigint NOT NULL DEFAULT '0' COMMENT '已导入的云商品id',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='已导入的云商品表';
-- ----------------------------
-- 5. 平台商品素材表
-- ----------------------------
DROP TABLE IF EXISTS `platform_media`;
CREATE TABLE `platform_media` (
`id` bigint NOT NULL COMMENT '主键id',
`media_group_id` bigint DEFAULT NULL COMMENT '素材组id',
`media_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '素材名称',
`media_type` int DEFAULT '0' COMMENT '素材类型 0=图片,1=视频,2=文件',
`media_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '素材图片地址',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`use_count` int DEFAULT '0' COMMENT '引用次数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品素材表';
-- ----------------------------
-- 6. 平台商品素材组表
-- ----------------------------
DROP TABLE IF EXISTS `platform_media_group`;
CREATE TABLE `platform_media_group` (
`id` bigint NOT NULL COMMENT '主键id',
`media_group_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '素材组名称',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`use_count` int DEFAULT '0' COMMENT '引用次数',
`category_id` bigint DEFAULT NULL COMMENT '商品分类',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品素材组表';
-- ----------------------------
-- 7. 平台商品素材映射表
-- ----------------------------
DROP TABLE IF EXISTS `platform_media_mapping`;
CREATE TABLE `platform_media_mapping` (
`id` bigint NOT NULL COMMENT '主键id',
`media_id` bigint DEFAULT NULL COMMENT '媒体id=platform_media.id',
`material_id` bigint DEFAULT NULL COMMENT '商品id=platform_material.id',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`major` tinyint(1) DEFAULT '0' COMMENT '是否为主媒体 0=否, 1=是',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品素材映射表';
-- ----------------------------
-- 8. 平台商品单位表
-- ----------------------------
DROP TABLE IF EXISTS `platform_unit`;
CREATE TABLE `platform_unit` (
`id` bigint NOT NULL COMMENT '主键id',
`unit_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '单位名称',
`unit_type` int DEFAULT NULL COMMENT '单位类型(0=计件,1=计重)',
`enabled` int NOT NULL DEFAULT '1' COMMENT '1 启用 0 禁用 默认1',
`del_flag` int NOT NULL DEFAULT '0' COMMENT '1:删除 0:正常',
`sort_code` int NOT NULL DEFAULT '1' COMMENT '排序码',
`creator` bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
`create_date` bigint DEFAULT NULL COMMENT '创建时间',
`updater` bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
`update_date` bigint DEFAULT NULL COMMENT '修改时间',
`remark` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
`use_count` int DEFAULT '0' COMMENT '引用次数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='平台商品单位表';
SET FOREIGN_KEY_CHECKS = 1;
"""
# 2. Optimized Schema Content (Architect Design)
optimized_sql_content = """
/*
升鲜宝 - 云商品库(架构师优化版)
对应表前缀: std_ (Standard)
设计目标: 支持一品多码、行业模版一键初始化、租户订阅同步
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- 1. 标准商品主表 (SPU Core)
-- ----------------------------
DROP TABLE IF EXISTS `std_product_spu`;
CREATE TABLE `std_product_spu` (
`id` bigint NOT NULL COMMENT '主键',
`spu_code` varchar(64) NOT NULL COMMENT '云端唯一编码(系统自动生成)',
`gb_code` varchar(64) DEFAULT NULL COMMENT '国家标准分类码(国标)',
`category_id` bigint NOT NULL COMMENT '标准分类ID',
`brand_id` bigint DEFAULT 0 COMMENT '标准品牌ID',
`product_name` varchar(200) NOT NULL COMMENT '标准名称(如: 可口可乐)',
`product_alias` varchar(500) DEFAULT NULL COMMENT '别名/搜索词(如: 可乐, 快乐水, CocaCola)',
`product_type` tinyint DEFAULT 1 COMMENT '类型: 1=标品(有条码), 2=非标品(生鲜/称重)',
`std_unit_id` bigint NOT NULL COMMENT '基础计量单位ID(最小单位)',
`spec_desc` varchar(100) DEFAULT NULL COMMENT '规格描述(如: 330ml)',
`shelf_life_days` int DEFAULT 0 COMMENT '保质期(天)',
`storage_condition` tinyint DEFAULT 1 COMMENT '存储条件: 1=常温, 2=冷藏, 3=冷冻',
`main_image` varchar(500) DEFAULT NULL COMMENT '官方主图URL',
`status` tinyint DEFAULT 1 COMMENT '1=启用, 0=禁用',
`source_origin` varchar(50) DEFAULT 'SYSTEM' COMMENT '来源: SYSTEM=官方, CROWD=众包',
`created_time` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_spu_code` (`spu_code`),
KEY `idx_name` (`product_name`)
) COMMENT='云端标准商品主表(SPU)';
-- ----------------------------
-- 2. 标准条码库 (核心: 0秒建档)
-- ----------------------------
DROP TABLE IF EXISTS `std_product_barcode`;
CREATE TABLE `std_product_barcode` (
`id` bigint NOT NULL COMMENT '主键',
`spu_id` bigint NOT NULL COMMENT '关联标准SPU',
`barcode` varchar(64) NOT NULL COMMENT 'GTIN/EAN-13条形码',
`unit_id` bigint NOT NULL COMMENT '条码对应的单位ID',
`pack_qty` decimal(10,2) DEFAULT 1.00 COMMENT '包装内的基础单位数量(如: 箱码对应的数量是24)',
`is_primary` tinyint DEFAULT 0 COMMENT '是否为主条码',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_barcode` (`barcode`),
KEY `idx_spu` (`spu_id`)
) COMMENT='云端标准条码库(一品多码)';
-- ----------------------------
-- 3. 标准单位换算库
-- ----------------------------
DROP TABLE IF EXISTS `std_product_unit_convert`;
CREATE TABLE `std_product_unit_convert` (
`id` bigint NOT NULL,
`spu_id` bigint NOT NULL,
`unit_id_from` bigint NOT NULL COMMENT '源单位(如: 箱)',
`unit_id_to` bigint NOT NULL COMMENT '目标单位(如: 瓶)',
`conversion_rate` decimal(12,4) NOT NULL COMMENT '换算率(如: 24)',
`is_standard` tinyint DEFAULT 1 COMMENT '是否行业标准换算',
PRIMARY KEY (`id`),
KEY `idx_spu` (`spu_id`)
) COMMENT='云端多单位换算规则库';
-- ----------------------------
-- 4. 行业/场景模版表 (核心: 裂变赋能)
-- ----------------------------
DROP TABLE IF EXISTS `std_industry_template`;
CREATE TABLE `std_industry_template` (
`id` bigint NOT NULL,
`template_name` varchar(100) NOT NULL COMMENT '模版名称(如: 川菜火锅店, 商务酒店, 企业食堂)',
`industry_type` varchar(50) COMMENT '行业类型',
`cover_image` varchar(500) COMMENT '封面图',
`sku_count` int DEFAULT 0 COMMENT '包含商品数',
`download_count` int DEFAULT 0 COMMENT '引用次数',
`created_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) COMMENT='行业初始化商品模版';
DROP TABLE IF EXISTS `std_industry_template_item`;
CREATE TABLE `std_industry_template_item` (
`id` bigint NOT NULL,
`template_id` bigint NOT NULL COMMENT '关联模版ID',
`spu_id` bigint NOT NULL COMMENT '关联商品SPU',
`recommend_price` decimal(10,2) COMMENT '建议零售价',
`recommend_stock_min` int COMMENT '建议最低库存',
PRIMARY KEY (`id`),
KEY `idx_tpl` (`template_id`)
) COMMENT='行业模版商品明细';
-- ----------------------------
-- 5. 租户订阅关系表 (核心: 数据同步)
-- ----------------------------
DROP TABLE IF EXISTS `std_product_subscription`;
CREATE TABLE `std_product_subscription` (
`id` bigint NOT NULL,
`tenant_id` bigint NOT NULL COMMENT '租户ID(ShopID或CompanyID)',
`spu_id` bigint NOT NULL COMMENT '云端SPU ID',
`local_goods_id` bigint NOT NULL COMMENT '租户本地商品ID',
`sync_strategy` tinyint DEFAULT 1 COMMENT '同步策略: 1=完全跟随, 2=仅同步图片, 3=不更新',
`last_sync_time` bigint COMMENT '最后同步时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_spu` (`tenant_id`, `spu_id`)
) COMMENT='租户商品订阅/引用关系表';
-- ----------------------------
-- 6. 众包审核暂存表 (核心: 库的自动生长)
-- ----------------------------
DROP TABLE IF EXISTS `std_product_audit`;
CREATE TABLE `std_product_audit` (
`id` bigint NOT NULL,
`barcode` varchar(64) NOT NULL,
`product_name` varchar(200) NOT NULL,
`submitter_tenant_id` bigint COMMENT '提交者租户ID',
`submit_images` text COMMENT '提交的图片',
`status` tinyint DEFAULT 0 COMMENT '0=待审核, 1=通过, 2=驳回',
`audit_remark` varchar(200) COMMENT '审核意见',
`created_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_barcode` (`barcode`)
) COMMENT='云商品众包审核暂存表';
SET FOREIGN_KEY_CHECKS = 1;
"""
# 3. Write files
file1_name = "1_original_platform_schema.sql"
file2_name = "2_optimized_std_schema.sql"
zip_name = "Cloud_Product_Library_DB.zip"
with open(file1_name, "w", encoding="utf-8") as f:
f.write(original_sql_content)
with open(file2_name, "w", encoding="utf-8") as f:
f.write(optimized_sql_content)
# 4. Create Zip
with zipfile.ZipFile(zip_name, 'w') as zipf:
zipf.write(file1_name)
zipf.write(file2_name)
# Cleanup source files to keep environment clean
os.remove(file1_name)
os.remove(file2_name)
zip_name