From 265a4ff4f7ae4934435a9a4adc251cbf3d0db598 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Tue, 28 Jul 2026 09:16:52 +0800 Subject: [PATCH] chore(db): add product brand/alias and brand-level inventory schema Co-authored-by: Cursor --- ...grate_20260727_crm_product_brand_alias.sql | 89 +++++++++++++++ docs/sql/shanxia2.0.sql | 105 +++++++++++++++++- 2 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 backend/scripts/migrate_20260727_crm_product_brand_alias.sql diff --git a/backend/scripts/migrate_20260727_crm_product_brand_alias.sql b/backend/scripts/migrate_20260727_crm_product_brand_alias.sql new file mode 100644 index 000000000..bc6ea0b54 --- /dev/null +++ b/backend/scripts/migrate_20260727_crm_product_brand_alias.sql @@ -0,0 +1,89 @@ +-- backend/scripts/migrate_20260727_crm_product_brand_alias.sql + +CREATE TABLE IF NOT EXISTS `crm_product_brand` ( + `id` varchar(64) NOT NULL COMMENT '主键ID', + `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `brand_name` varchar(100) NOT NULL COMMENT '品牌名称', + `status` char(3) NOT NULL DEFAULT 'on' COMMENT '状态 on/off', + `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号', + `order_num` int(11) DEFAULT NULL COMMENT '排序号', + `remark` varchar(512) DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL, + `create_dept_id` varchar(64) NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `del_flag` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_product_id` (`product_id`), + KEY `idx_tenant` (`tenant_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CRM-产品品牌'; + +CREATE TABLE IF NOT EXISTS `crm_product_alias` ( + `id` varchar(64) NOT NULL COMMENT '主键ID', + `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `alias_name` varchar(200) NOT NULL COMMENT '别名', + `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0', + `order_num` int(11) DEFAULT NULL, + `remark` varchar(512) DEFAULT NULL, + `create_by` varchar(64) DEFAULT NULL, + `create_dept_id` varchar(64) NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `del_flag` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_product_id` (`product_id`), + KEY `idx_tenant` (`tenant_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CRM-产品别名'; + +ALTER TABLE `crm_quote_product` + ADD COLUMN `brand_mode` varchar(20) DEFAULT NULL COMMENT 'required/any' AFTER `product_name`, + ADD COLUMN `brand_id` varchar(64) DEFAULT NULL COMMENT '指定品牌ID' AFTER `brand_mode`, + ADD COLUMN `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名快照' AFTER `brand_id`; + +ALTER TABLE `crm_contract_product` + ADD COLUMN `brand_mode` varchar(20) DEFAULT NULL COMMENT 'required/any' AFTER `product_name`, + ADD COLUMN `brand_id` varchar(64) DEFAULT NULL COMMENT '指定品牌ID' AFTER `brand_mode`, + ADD COLUMN `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名快照' AFTER `brand_id`; + +ALTER TABLE `pl_plan_product` + ADD COLUMN `brand_mode` varchar(20) DEFAULT NULL COMMENT 'required/any' AFTER `product_name`, + ADD COLUMN `brand_id` varchar(64) DEFAULT NULL COMMENT '指定品牌ID' AFTER `brand_mode`, + ADD COLUMN `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名快照' AFTER `brand_id`; + +CREATE TABLE IF NOT EXISTS `pl_plan_product_brand_qty` ( + `id` varchar(64) NOT NULL, + `plan_id` varchar(64) NOT NULL, + `plan_product_id` varchar(64) NOT NULL, + `brand_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空串=无品牌键', + `brand_name` varchar(100) DEFAULT NULL, + `qty` decimal(15,3) NOT NULL DEFAULT '0.000' COMMENT '本品牌归档实际数量', + `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0', + `order_num` int(11) DEFAULT NULL, + `remark` varchar(512) DEFAULT NULL, + `create_by` varchar(64) DEFAULT NULL, + `create_dept_id` varchar(64) NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `del_flag` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_plan_product` (`plan_product_id`), + KEY `idx_plan` (`plan_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计划产品归档品牌数量'; + +ALTER TABLE `pl_inventory` + ADD COLUMN `brand_id` varchar(64) NOT NULL DEFAULT '' COMMENT '品牌ID,无品牌为空串' AFTER `product_id`, + ADD COLUMN `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称' AFTER `brand_id`; + +ALTER TABLE `pl_inventory` DROP INDEX `uk_product_id`; +ALTER TABLE `pl_inventory` ADD UNIQUE KEY `uk_product_brand` (`tenant_no`,`product_id`,`brand_id`,`del_flag`); + +ALTER TABLE `pl_inventory_transaction` + ADD COLUMN `brand_id` varchar(64) NOT NULL DEFAULT '' AFTER `product_id`, + ADD COLUMN `brand_name` varchar(100) DEFAULT NULL AFTER `brand_id`; + +ALTER TABLE `pl_inventory_warning` + ADD COLUMN `brand_id` varchar(64) NOT NULL DEFAULT '' AFTER `product_id`, + ADD COLUMN `brand_name` varchar(100) DEFAULT NULL AFTER `brand_id`; diff --git a/docs/sql/shanxia2.0.sql b/docs/sql/shanxia2.0.sql index b3b5ff996..e9cb590b5 100644 --- a/docs/sql/shanxia2.0.sql +++ b/docs/sql/shanxia2.0.sql @@ -1029,6 +1029,9 @@ CREATE TABLE `crm_contract_product` ( `contract_id` varchar(64) NOT NULL COMMENT '合同ID', `product_id` varchar(64) NOT NULL COMMENT '产品ID', `product_name` varchar(200) NOT NULL COMMENT '产品名称', + `brand_mode` varchar(20) DEFAULT NULL COMMENT 'required/any', + `brand_id` varchar(64) DEFAULT NULL COMMENT '指定品牌ID', + `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名快照', `product_no` varchar(50) DEFAULT NULL COMMENT '产品编号', `category_id` varchar(64) DEFAULT NULL COMMENT '产品分类ID', `category_name` varchar(100) DEFAULT NULL COMMENT '产品分类名称', @@ -2015,6 +2018,63 @@ INSERT INTO `crm_product` (`id`, `product_no`, `product_name`, `category_id`, `c INSERT INTO `crm_product` (`id`, `product_no`, `product_name`, `category_id`, `category_name`, `model`, `unit`, `barcode`, `price`, `cost_price`, `stock`, `low_stock`, `tax_rate`, `is_toxic`, `is_explosive`, `status`, `description`, `images`, `sale_count`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('C9B4E76409104D9DB1B2FA25D7635F3D', 'SXWL007319', '测试产品编号', '1975766458781167617', '无机原料', NULL, NULL, '20260712000004', NULL, NULL, 0, 10, 13.00, 0, 0, 'on', NULL, NULL, 0, 'shanxia2.0', NULL, NULL, 'd3000000000000000000000000000001', '', '2026-07-12 09:43:36', NULL, '2026-07-12 09:43:36', 0); COMMIT; +-- ---------------------------- +-- Table structure for crm_product_alias +-- ---------------------------- +DROP TABLE IF EXISTS `crm_product_alias`; +CREATE TABLE `crm_product_alias` ( + `id` varchar(64) NOT NULL COMMENT '主键ID', + `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `alias_name` varchar(200) NOT NULL COMMENT '别名', + `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0', + `order_num` int(11) DEFAULT NULL, + `remark` varchar(512) DEFAULT NULL, + `create_by` varchar(64) DEFAULT NULL, + `create_dept_id` varchar(64) NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `del_flag` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_product_id` (`product_id`), + KEY `idx_tenant` (`tenant_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CRM-产品别名'; + +-- ---------------------------- +-- Records of crm_product_alias +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for crm_product_brand +-- ---------------------------- +DROP TABLE IF EXISTS `crm_product_brand`; +CREATE TABLE `crm_product_brand` ( + `id` varchar(64) NOT NULL COMMENT '主键ID', + `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `brand_name` varchar(100) NOT NULL COMMENT '品牌名称', + `status` char(3) NOT NULL DEFAULT 'on' COMMENT '状态 on/off', + `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号', + `order_num` int(11) DEFAULT NULL COMMENT '排序号', + `remark` varchar(512) DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL, + `create_dept_id` varchar(64) NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `del_flag` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_product_id` (`product_id`), + KEY `idx_tenant` (`tenant_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CRM-产品品牌'; + +-- ---------------------------- +-- Records of crm_product_brand +-- ---------------------------- +BEGIN; +COMMIT; + -- ---------------------------- -- Table structure for crm_product_category -- ---------------------------- @@ -2197,6 +2257,9 @@ CREATE TABLE `crm_quote_product` ( `quote_id` varchar(64) NOT NULL COMMENT '报价单ID', `product_id` varchar(64) NOT NULL COMMENT '产品ID', `product_name` varchar(200) NOT NULL COMMENT '产品名称', + `brand_mode` varchar(20) DEFAULT NULL COMMENT 'required/any', + `brand_id` varchar(64) DEFAULT NULL COMMENT '指定品牌ID', + `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名快照', `product_no` varchar(50) DEFAULT NULL COMMENT '产品编号', `category_id` varchar(64) DEFAULT NULL COMMENT '产品分类ID', `category_name` varchar(100) DEFAULT NULL COMMENT '产品分类名称', @@ -3066,6 +3129,8 @@ DROP TABLE IF EXISTS `pl_inventory`; CREATE TABLE `pl_inventory` ( `id` varchar(64) NOT NULL COMMENT '主键ID', `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `brand_id` varchar(64) NOT NULL DEFAULT '' COMMENT '品牌ID,无品牌为空串', + `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称', `product_no` varchar(50) NOT NULL COMMENT '产品编号', `product_name` varchar(200) NOT NULL COMMENT '产品名称', `model` varchar(100) DEFAULT NULL COMMENT '规格型号', @@ -3084,7 +3149,7 @@ CREATE TABLE `pl_inventory` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除', PRIMARY KEY (`id`), - UNIQUE KEY `uk_product_id` (`product_id`), + UNIQUE KEY `uk_product_brand` (`tenant_no`,`product_id`,`brand_id`,`del_flag`), KEY `idx_tenant` (`tenant_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存表'; @@ -3101,6 +3166,8 @@ DROP TABLE IF EXISTS `pl_inventory_transaction`; CREATE TABLE `pl_inventory_transaction` ( `id` varchar(64) NOT NULL COMMENT '主键ID', `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `brand_id` varchar(64) NOT NULL DEFAULT '', + `brand_name` varchar(100) DEFAULT NULL, `product_name` varchar(200) NOT NULL COMMENT '产品名称', `transaction_type` varchar(20) NOT NULL COMMENT '事务类型 inbound-入库 outbound-出库', `plan_id` varchar(64) DEFAULT NULL COMMENT '计划ID', @@ -3139,6 +3206,8 @@ DROP TABLE IF EXISTS `pl_inventory_warning`; CREATE TABLE `pl_inventory_warning` ( `id` varchar(64) NOT NULL COMMENT '主键ID', `product_id` varchar(64) NOT NULL COMMENT '产品ID', + `brand_id` varchar(64) NOT NULL DEFAULT '' COMMENT '品牌ID,无品牌为空串', + `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称', `product_name` varchar(200) NOT NULL COMMENT '产品名称', `warning_type` varchar(20) NOT NULL COMMENT '预警类型 low-低于最低 high-高于最高', `current_qty` decimal(15,3) NOT NULL COMMENT '当前库存', @@ -3536,6 +3605,9 @@ CREATE TABLE `pl_plan_product` ( `product_id` varchar(64) NOT NULL COMMENT '产品ID', `product_no` varchar(50) NOT NULL COMMENT '产品编号', `product_name` varchar(200) NOT NULL COMMENT '产品名称', + `brand_mode` varchar(20) DEFAULT NULL COMMENT 'required/any', + `brand_id` varchar(64) DEFAULT NULL COMMENT '指定品牌ID', + `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名快照', `model` varchar(100) DEFAULT NULL COMMENT '规格型号', `unit` varchar(20) NOT NULL DEFAULT '吨' COMMENT '单位', `category_name` varchar(200) DEFAULT NULL COMMENT '产品分类', @@ -3671,6 +3743,37 @@ INSERT INTO `pl_plan_product` (`id`, `plan_id`, `product_id`, `product_no`, `pro INSERT INTO `pl_plan_product` (`id`, `plan_id`, `product_id`, `product_no`, `product_name`, `model`, `unit`, `category_name`, `package_spec`, `delivery_method`, `quantity`, `actual_qty`, `tax_price`, `tax_amount`, `tax_subtotal`, `is_explosive`, `is_toxic`, `purchase_cert_url`, `transport_cert_url`, `legal_use_cert_url`, `inbound_estimate_qty`, `inbound_qty`, `inbound_price`, `inbound_amount`, `outbound_estimate_qty`, `outbound_qty`, `outbound_price`, `outbound_amount`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('FF6353D6EDE44A2391A1D30B35129B08', 'CC2853CC9F7744E7BF34B13D57CC1B42', '2059116006488109057', '2059116006488109057', '98% 工业硫酸', 'AR', 'dun', '其他', '槽罐车', '一票制送到', 20.000, 0.000, 2000.0000, 4601.77, 40000.00, 0, 1, 'pl/plan-cert/202607/05/b16ef57360da45c9bbd6998e08b7c213.pdf', 'pl/plan-cert/202607/11/25888b95be064f45a73acfe46bf16d0d.pdf', NULL, 20.000, NULL, 2000.0000, 40000.00, 20.000, NULL, 2000.0000, 40000.00, 'shanxia2.0', 0, '备注1', 'd3000000000000000000000000000001', 'b13c2be2-4e71-11f1-9f47-00163e3bdd96', '2026-07-05 23:48:36', 'd3000000000000000000000000000001', '2026-07-11 19:29:41', 0); COMMIT; +-- ---------------------------- +-- Table structure for pl_plan_product_brand_qty +-- ---------------------------- +DROP TABLE IF EXISTS `pl_plan_product_brand_qty`; +CREATE TABLE `pl_plan_product_brand_qty` ( + `id` varchar(64) NOT NULL, + `plan_id` varchar(64) NOT NULL, + `plan_product_id` varchar(64) NOT NULL, + `brand_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空串=无品牌键', + `brand_name` varchar(100) DEFAULT NULL, + `qty` decimal(15,3) NOT NULL DEFAULT '0.000' COMMENT '本品牌归档实际数量', + `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0', + `order_num` int(11) DEFAULT NULL, + `remark` varchar(512) DEFAULT NULL, + `create_by` varchar(64) DEFAULT NULL, + `create_dept_id` varchar(64) NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_by` varchar(64) DEFAULT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `del_flag` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_plan_product` (`plan_product_id`), + KEY `idx_plan` (`plan_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='计划产品归档品牌数量'; + +-- ---------------------------- +-- Records of pl_plan_product_brand_qty +-- ---------------------------- +BEGIN; +COMMIT; + -- ---------------------------- -- Table structure for pl_plan_transport -- ----------------------------