-- 产品主数据(来源:威狮B2C小包价表.xlsx) -- 导入范围:产品目录 + 各产品 sheet 国家服务明细(尺寸/尾程/时效) -- 不导入:运费/挂号费矩阵、退件重派、申报说明、赔偿标准 SET NAMES utf8mb4; CREATE TABLE IF NOT EXISTS bms_product ( product_id bigint NOT NULL AUTO_INCREMENT COMMENT '产品ID', product_code varchar(20) NOT NULL COMMENT '产品对接代码,如 WSP037', product_name varchar(100) NOT NULL COMMENT '产品名称', service_level varchar(20) DEFAULT NULL COMMENT '时效等级:标准等', cargo_attr varchar(100) DEFAULT NULL COMMENT '走货属性:普货/F普货/带电/敏感等', dest_region varchar(50) DEFAULT NULL COMMENT '目的区域:欧盟等', update_note varchar(500) DEFAULT NULL COMMENT '更新内容说明', tax_mode varchar(20) NOT NULL DEFAULT 'TAX_INCLUDED' COMMENT 'TAX_INCLUDED包税 TAX_EXCLUDED不包税', effective_date date DEFAULT NULL COMMENT '目录生效日期', status char(1) NOT NULL DEFAULT '0' COMMENT '0正常 1停用', source_sheet varchar(100) DEFAULT NULL COMMENT '来源Excel sheet名', remark varchar(500) DEFAULT NULL, tms_id int DEFAULT NULL COMMENT '多租户ID', created_by varchar(50) NOT NULL DEFAULT '', created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_by varchar(50) NOT NULL DEFAULT '', updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (product_id), UNIQUE KEY uk_product_code (product_code), KEY idx_tax_status (tax_mode, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='BMS产品主表-来自产品目录'; CREATE TABLE IF NOT EXISTS bms_product_country ( detail_id bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID', product_code varchar(20) NOT NULL COMMENT '产品代码', country_name varchar(50) NOT NULL COMMENT '国家中文名', country_code char(2) DEFAULT NULL COMMENT 'ISO2,可空待补齐', weight_min decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)', weight_max decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)', size_limit varchar(1000) DEFAULT NULL COMMENT '尺寸限制', last_mile varchar(500) DEFAULT NULL COMMENT '尾程派送说明', lead_time varchar(100) DEFAULT NULL COMMENT '参考时效', effective_date date DEFAULT NULL COMMENT '产品价表生效日期', created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (detail_id), UNIQUE KEY uk_product_country_weight (product_code, country_name, weight_min, weight_max), KEY idx_country_code (country_code), KEY idx_weight_match (product_code, country_code, weight_min, weight_max), CONSTRAINT fk_product_country_code FOREIGN KEY (product_code) REFERENCES bms_product (product_code) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品国家服务明细-重量段+尺寸/尾程/时效(不含运费)'; -- 已建表升级(幂等:列已存在时跳过报错可忽略) -- ALTER TABLE bms_product_country ADD COLUMN weight_min decimal(10,3) DEFAULT NULL COMMENT '重量段最小值KG(含)' AFTER country_code; -- ALTER TABLE bms_product_country ADD COLUMN weight_max decimal(10,3) DEFAULT NULL COMMENT '重量段最大值KG(含)' AFTER weight_min; -- ALTER TABLE bms_product_country DROP INDEX uk_product_country; -- ALTER TABLE bms_product_country ADD UNIQUE KEY uk_product_country_weight (product_code, country_name, weight_min, weight_max); -- ALTER TABLE bms_product_country ADD KEY idx_weight_match (product_code, country_code, weight_min, weight_max); -- 菜单:挂在价格基础 2100 下(order_num=0 置顶) INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) SELECT 2130, N'产品列表', 2100, 0, 'product', 'price/basic/product/index', '', 'PriceProduct', 1, 0, 'C', '0', '0', 'price:product:list', 'shopping', 'admin', sysdate(), N'产品目录与国家服务明细' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2130); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) SELECT 2131, N'产品查询', 2130, 1, '', NULL, 1, 0, 'F', '0', '0', 'price:product:query', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2131); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) SELECT 2132, N'产品新增', 2130, 2, '', NULL, 1, 0, 'F', '0', '0', 'price:product:add', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2132); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) SELECT 2133, N'产品修改', 2130, 3, '', NULL, 1, 0, 'F', '0', '0', 'price:product:edit', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2133); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) SELECT 2134, N'产品删除', 2130, 4, '', NULL, 1, 0, 'F', '0', '0', 'price:product:remove', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2134); INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) SELECT 2135, N'产品导入', 2130, 5, '', NULL, 1, 0, 'F', '0', '0', 'price:product:import', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id=2135); INSERT INTO sys_role_menu(role_id, menu_id) SELECT 1, m.menu_id FROM (SELECT 2130 AS menu_id UNION SELECT 2131 UNION SELECT 2132 UNION SELECT 2133 UNION SELECT 2134 UNION SELECT 2135) m WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id=1 AND rm.menu_id=m.menu_id);