菜单修改优化

This commit is contained in:
supernijia
2026-07-28 13:40:19 +08:00
parent 4ddb8b47b0
commit 7c3c9e53a0
90 changed files with 9388 additions and 1545 deletions
@@ -7,14 +7,15 @@
SPRING_PROFILES_ACTIVE=local
AIIMAGE_INSTANCE_ID=local-121
AIIMAGE_SERVER_PORT=18080
AIIMAGE_INTERNAL_TOKEN=change-me-local-internal-token
AIIMAGE_DB_URL=jdbc:mysql://127.0.0.1:3306/aiimage?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
AIIMAGE_DB_USERNAME=change-me
AIIMAGE_DB_PASSWORD=change-me
AIIMAGE_OSS_REGION=us-east-1
AIIMAGE_OSS_ENDPOINT=http://47.110.241.161:9000
AIIMAGE_OSS_PUBLIC_ENDPOINT=http://47.110.241.161:9000
AIIMAGE_OSS_ENDPOINT=https://oss.aishufu.top
AIIMAGE_OSS_PUBLIC_ENDPOINT=https://oss.aishufu.top
AIIMAGE_OSS_BUCKET=nanri-ai-images
AIIMAGE_IMAGE_VIDEO_OSS_BUCKET=shufu-video
AIIMAGE_DIGITAL_HUMAN_OSS_BUCKET=nanri-ai-digital-human
@@ -85,8 +85,8 @@ aiimage:
request-body-cache-limit-bytes: ${AIIMAGE_INSTANCE_ROUTE_REQUEST_BODY_CACHE_LIMIT_BYTES:104857600}
oss:
region: ${AIIMAGE_OSS_REGION:us-east-1}
endpoint: ${AIIMAGE_OSS_ENDPOINT:http://47.110.241.161:9000}
public-endpoint: ${AIIMAGE_OSS_PUBLIC_ENDPOINT:http://47.110.241.161:9000}
endpoint: ${AIIMAGE_OSS_ENDPOINT:https://oss.aishufu.top}
public-endpoint: ${AIIMAGE_OSS_PUBLIC_ENDPOINT:https://oss.aishufu.top}
bucket: ${AIIMAGE_OSS_BUCKET:nanri-ai-images}
image-video-bucket: ${AIIMAGE_IMAGE_VIDEO_OSS_BUCKET:shufu-video}
digital-human-bucket: ${AIIMAGE_DIGITAL_HUMAN_OSS_BUCKET:nanri-ai-digital-human}
@@ -153,7 +153,7 @@ aiimage:
enabled: ${AIIMAGE_MODULE_CLEANUP_ENABLED:true}
cron: ${AIIMAGE_MODULE_CLEANUP_CRON:0 0 0 * * *}
retention-days: ${AIIMAGE_MODULE_CLEANUP_RETENTION_DAYS:7}
module-types: ${AIIMAGE_MODULE_CLEANUP_MODULE_TYPES:DEDUPE,SPLIT,CONVERT,DELETE_BRAND,PRODUCT_RISK_RESOLVE,PRICE_TRACK,SHOP_MATCH,PATROL_DELETE,QUERY_ASIN,WITHDRAW,APPEARANCE_PATENT,SIMILAR_ASIN,COLLECT_DATA}
module-types: ${AIIMAGE_MODULE_CLEANUP_MODULE_TYPES:DEDUPE,SPLIT,CONVERT,DELETE_BRAND,PRODUCT_RISK_RESOLVE,PRICE_TRACK,SHOP_MATCH,PATROL_DELETE,QUERY_ASIN,SHOP_DATA_CRAWL,WITHDRAW,APPEARANCE_PATENT,SIMILAR_ASIN,COLLECT_DATA}
permission-schema-init:
enabled: ${AIIMAGE_PERMISSION_SCHEMA_INIT_ENABLED:false}
task-pressure:
@@ -247,6 +247,7 @@ aiimage:
security:
shop-credential-key: ${AIIMAGE_SHOP_CREDENTIAL_KEY:change-me-shop-credential-key}
internal-token: ${AIIMAGE_INTERNAL_TOKEN:}
internal-token-file: ${AIIMAGE_INTERNAL_TOKEN_FILE:}
auth:
jwt-secret: ${AIIMAGE_JWT_SECRET:please-change-this-secret-please-rotate-at-least-32-bytes}
jwt-ttl-hours: ${AIIMAGE_AUTH_JWT_TTL_HOURS:168}
@@ -0,0 +1,29 @@
CREATE TABLE IF NOT EXISTS `biz_shop_data_crawl_shop_candidate` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`shop_name` VARCHAR(255) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_shop_data_crawl_candidate_user_shop` (`user_id`, `shop_name`),
KEY `idx_shop_data_crawl_candidate_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `biz_shop_data_crawl_country_pref` (
`user_id` BIGINT NOT NULL,
`country_codes_json` VARCHAR(256) NOT NULL,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`)
SELECT '店铺数据抓取', 'shop_data_crawl', 'app', 'shop-data-crawl', 139
WHERE NOT EXISTS (
SELECT 1 FROM `columns` WHERE `column_key` = 'shop_data_crawl'
);
UPDATE `columns`
SET `name` = '店铺数据抓取',
`menu_type` = 'app',
`route_path` = 'shop-data-crawl',
`sort_order` = 139
WHERE `column_key` = 'shop_data_crawl';
@@ -0,0 +1,220 @@
-- Hierarchical menu permissions. user_column_permission intentionally keeps
-- only direct grants; descendants are expanded by PermissionMenuService.
SET @permission_db_name = DATABASE();
SET @permission_parent_column_exists = (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @permission_db_name
AND TABLE_NAME = 'columns'
AND COLUMN_NAME = 'parent_id'
);
SET @permission_sql = IF(
@permission_parent_column_exists = 0,
'ALTER TABLE `columns` ADD COLUMN `parent_id` INT NULL COMMENT ''直接父菜单 ID'' AFTER `id`',
'SELECT 1'
);
PREPARE permission_stmt FROM @permission_sql;
EXECUTE permission_stmt;
DEALLOCATE PREPARE permission_stmt;
SET @permission_parent_index_exists = (
SELECT COUNT(*)
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = @permission_db_name
AND TABLE_NAME = 'columns'
AND INDEX_NAME = 'idx_columns_parent_sort_id'
);
SET @permission_sql = IF(
@permission_parent_index_exists = 0,
'ALTER TABLE `columns` ADD INDEX `idx_columns_parent_sort_id` (`parent_id`, `sort_order`, `id`)',
'SELECT 1'
);
PREPARE permission_stmt FROM @permission_sql;
EXECUTE permission_stmt;
DEALLOCATE PREPARE permission_stmt;
SET @permission_parent_fk_exists = (
SELECT COUNT(*)
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = @permission_db_name
AND TABLE_NAME = 'columns'
AND CONSTRAINT_NAME = 'fk_columns_parent_id'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
);
SET @permission_sql = IF(
@permission_parent_fk_exists = 0,
'ALTER TABLE `columns` ADD CONSTRAINT `fk_columns_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `columns` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT',
'SELECT 1'
);
PREPARE permission_stmt FROM @permission_sql;
EXECUTE permission_stmt;
DEALLOCATE PREPARE permission_stmt;
-- Normalize older underscore keys. If both spellings already exist, retain the
-- canonical row and move direct grants before deleting the duplicate.
INSERT IGNORE INTO `user_column_permission` (`user_id`, `column_id`)
SELECT direct_grant.`user_id`, canonical.`id`
FROM `user_column_permission` AS direct_grant
JOIN `columns` AS legacy ON legacy.`id` = direct_grant.`column_id`
JOIN (
SELECT 'collect_data' AS legacy_key, 'collect-data' AS canonical_key
UNION ALL SELECT 'appearance_patent', 'appearance-patent'
UNION ALL SELECT 'similar_asin', 'similar-asin'
) AS key_map ON key_map.legacy_key = legacy.`column_key`
JOIN `columns` AS canonical ON canonical.`column_key` = key_map.canonical_key;
DELETE legacy
FROM `columns` AS legacy
JOIN (
SELECT 'collect_data' AS legacy_key, 'collect-data' AS canonical_key
UNION ALL SELECT 'appearance_patent', 'appearance-patent'
UNION ALL SELECT 'similar_asin', 'similar-asin'
) AS key_map ON key_map.legacy_key = legacy.`column_key`
JOIN `columns` AS canonical ON canonical.`column_key` = key_map.canonical_key;
UPDATE `columns` AS legacy
JOIN (
SELECT 'collect_data' AS legacy_key, 'collect-data' AS canonical_key
UNION ALL SELECT 'appearance_patent', 'appearance-patent'
UNION ALL SELECT 'similar_asin', 'similar-asin'
) AS key_map ON key_map.legacy_key = legacy.`column_key`
LEFT JOIN `columns` AS canonical ON canonical.`column_key` = key_map.canonical_key
SET legacy.`column_key` = key_map.canonical_key
WHERE canonical.`id` IS NULL;
-- Video/image workspace. Keep the legacy `wb` key because existing user
-- grants reference that row; its route is the current image-video page.
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '视频', 'wb', 'app', 'image-video', 100, NULL
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE `column_key` = 'wb');
UPDATE `columns`
SET `name` = '视频', `menu_type` = 'app', `route_path` = 'image-video', `sort_order` = 100, `parent_id` = NULL
WHERE `column_key` = 'wb';
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '数字人', 'digital-human', 'app', 'digital-human', 101,
(SELECT id FROM `columns` WHERE column_key = 'wb' LIMIT 1)
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'digital-human');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '带货视频', 'delivery-video', 'app', 'delivery-video', 102,
(SELECT id FROM `columns` WHERE column_key = 'wb' LIMIT 1)
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'delivery-video');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '混剪', 'mix-video', 'app', 'mix-video', 103,
(SELECT id FROM `columns` WHERE column_key = 'wb' LIMIT 1)
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'mix-video');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '图片', 'image', 'app', 'image', 104,
(SELECT id FROM `columns` WHERE column_key = 'wb' LIMIT 1)
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'image');
UPDATE `columns` AS child
JOIN `columns` AS parent ON parent.`column_key` = 'wb'
SET child.`parent_id` = parent.`id`, child.`menu_type` = 'app',
child.`name` = CASE child.`column_key`
WHEN 'digital-human' THEN '数字人' WHEN 'delivery-video' THEN '带货视频'
WHEN 'mix-video' THEN '混剪' WHEN 'image' THEN '图片' ELSE child.`name` END,
child.`route_path` = CASE child.`column_key`
WHEN 'digital-human' THEN 'digital-human' WHEN 'delivery-video' THEN 'delivery-video'
WHEN 'mix-video' THEN 'mix-video' WHEN 'image' THEN 'image' ELSE child.`route_path` END,
child.`sort_order` = CASE child.`column_key`
WHEN 'digital-human' THEN 101 WHEN 'delivery-video' THEN 102
WHEN 'mix-video' THEN 103 WHEN 'image' THEN 104 ELSE child.`sort_order` END
WHERE child.`column_key` IN ('digital-human', 'delivery-video', 'mix-video', 'image');
-- Three APP navigation groups.
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '前端工具', 'brand_front_tools', 'app', 'brand-front-tools', 110, NULL
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE `column_key` = 'brand_front_tools');
UPDATE `columns` SET `name` = '前端工具', `menu_type` = 'app', `route_path` = 'brand-front-tools', `sort_order` = 110, `parent_id` = NULL
WHERE `column_key` = 'brand_front_tools';
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '运营工具', 'brand_operation_tools', 'app', 'brand-operation-tools', 120, NULL
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE `column_key` = 'brand_operation_tools');
UPDATE `columns` SET `name` = '运营工具', `menu_type` = 'app', `route_path` = 'brand-operation-tools', `sort_order` = 120, `parent_id` = NULL
WHERE `column_key` = 'brand_operation_tools';
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '后勤工具', 'brand_logistics_tools', 'app', 'brand-logistics-tools', 130, NULL
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE `column_key` = 'brand_logistics_tools');
UPDATE `columns` SET `name` = '后勤工具', `menu_type` = 'app', `route_path` = 'brand-logistics-tools', `sort_order` = 130, `parent_id` = NULL
WHERE `column_key` = 'brand_logistics_tools';
-- APP children. The key follows the frontend item key (except the existing
-- shop_data_crawl compatibility key); route_path remains the route slug.
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`)
SELECT '采集数据', 'collect-data', 'app', 'collect-data', 111,
(SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1)
WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'collect-data');
UPDATE `columns` AS child
JOIN `columns` AS parent ON parent.`column_key` = 'brand_front_tools'
SET child.`name` = '采集数据', child.`menu_type` = 'app', child.`route_path` = 'collect-data',
child.`sort_order` = 111, child.`parent_id` = parent.`id`
WHERE child.`column_key` = 'collect-data';
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '品牌检测', 'brand', 'app', 'brand', 112, (SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'brand');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '外观专利检测', 'appearance-patent', 'app', 'appearance-patent', 113, (SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'appearance-patent');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '货源查询', 'similar-asin', 'app', 'similar-asin', 114, (SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'similar-asin');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '数据去重', 'dedupe', 'app', 'dedupe', 115, (SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'dedupe');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '数据拆分', 'split', 'app', 'split', 116, (SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'split');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '格式转换', 'convert', 'app', 'convert', 117, (SELECT id FROM `columns` WHERE column_key = 'brand_front_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'convert');
UPDATE `columns` AS child
JOIN `columns` AS parent ON parent.`column_key` = 'brand_front_tools'
SET child.`parent_id` = parent.`id`, child.`menu_type` = 'app',
child.`name` = CASE child.`column_key`
WHEN 'brand' THEN '品牌检测' WHEN 'appearance-patent' THEN '外观专利检测'
WHEN 'similar-asin' THEN '货源查询' WHEN 'dedupe' THEN '数据去重'
WHEN 'split' THEN '数据拆分' WHEN 'convert' THEN '格式转换' ELSE child.`name` END,
child.`route_path` = CASE child.`column_key`
WHEN 'brand' THEN 'brand' WHEN 'appearance-patent' THEN 'appearance-patent'
WHEN 'similar-asin' THEN 'similar-asin' WHEN 'dedupe' THEN 'dedupe'
WHEN 'split' THEN 'split' WHEN 'convert' THEN 'convert' ELSE child.`route_path` END,
child.`sort_order` = CASE child.`column_key`
WHEN 'brand' THEN 112 WHEN 'appearance-patent' THEN 113 WHEN 'similar-asin' THEN 114
WHEN 'dedupe' THEN 115 WHEN 'split' THEN 116 WHEN 'convert' THEN 117 ELSE child.`sort_order` END
WHERE child.`column_key` IN ('brand', 'appearance-patent', 'similar-asin', 'dedupe', 'split', 'convert');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '上架', 'publish', 'app', 'publish', 121, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'publish');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '删除ASIN', 'delete-brand', 'app', 'delete-brand', 122, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'delete-brand');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '商品风险解决', 'product-risk', 'app', 'product-risk', 123, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'product-risk');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '定时匹配', 'shop-match', 'app', 'shop-match', 124, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'shop-match');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '跟价', 'pricing', 'app', 'price-track', 125, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'pricing');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '巡店删除', 'patrol-delete', 'app', 'patrol-delete', 126, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'patrol-delete');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '查询ASIN', 'query-asin', 'app', 'query-asin', 127, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'query-asin');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '店铺数据抓取', 'shop_data_crawl', 'app', 'shop-data-crawl', 128, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'shop_data_crawl');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '取款', 'withdraw', 'app', 'withdraw', 129, (SELECT id FROM `columns` WHERE column_key = 'brand_operation_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'withdraw');
UPDATE `columns` AS child
JOIN `columns` AS parent ON parent.`column_key` = 'brand_operation_tools'
SET child.`parent_id` = parent.`id`, child.`menu_type` = 'app',
child.`name` = CASE child.`column_key`
WHEN 'publish' THEN '上架' WHEN 'delete-brand' THEN '删除ASIN'
WHEN 'product-risk' THEN '商品风险解决' WHEN 'shop-match' THEN '定时匹配'
WHEN 'pricing' THEN '跟价' WHEN 'patrol-delete' THEN '巡店删除'
WHEN 'query-asin' THEN '查询ASIN' WHEN 'shop_data_crawl' THEN '店铺数据抓取'
WHEN 'withdraw' THEN '取款' ELSE child.`name` END,
child.`route_path` = CASE child.`column_key`
WHEN 'publish' THEN 'publish' WHEN 'delete-brand' THEN 'delete-brand'
WHEN 'product-risk' THEN 'product-risk' WHEN 'shop-match' THEN 'shop-match'
WHEN 'pricing' THEN 'price-track' WHEN 'patrol-delete' THEN 'patrol-delete'
WHEN 'query-asin' THEN 'query-asin' WHEN 'shop_data_crawl' THEN 'shop-data-crawl'
WHEN 'withdraw' THEN 'withdraw' ELSE child.`route_path` END,
child.`sort_order` = CASE child.`column_key`
WHEN 'publish' THEN 121 WHEN 'delete-brand' THEN 122 WHEN 'product-risk' THEN 123 WHEN 'shop-match' THEN 124
WHEN 'pricing' THEN 125 WHEN 'patrol-delete' THEN 126 WHEN 'query-asin' THEN 127 WHEN 'shop_data_crawl' THEN 128 WHEN 'withdraw' THEN 129 ELSE child.`sort_order` END
WHERE child.`column_key` IN ('publish', 'delete-brand', 'product-risk', 'shop-match', 'pricing', 'patrol-delete', 'query-asin', 'shop_data_crawl', 'withdraw');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT '采购', 'purchase', 'app', 'purchase', 131, (SELECT id FROM `columns` WHERE column_key = 'brand_logistics_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'purchase');
INSERT INTO `columns` (`name`, `column_key`, `menu_type`, `route_path`, `sort_order`, `parent_id`) SELECT 'ERP', 'erp', 'app', 'erp', 132, (SELECT id FROM `columns` WHERE column_key = 'brand_logistics_tools' LIMIT 1) WHERE NOT EXISTS (SELECT 1 FROM `columns` WHERE column_key = 'erp');
UPDATE `columns` AS child
JOIN `columns` AS parent ON parent.`column_key` = 'brand_logistics_tools'
SET child.`parent_id` = parent.`id`, child.`menu_type` = 'app',
child.`name` = CASE child.`column_key`
WHEN 'purchase' THEN '采购' WHEN 'erp' THEN 'ERP' ELSE child.`name` END,
child.`route_path` = CASE child.`column_key`
WHEN 'purchase' THEN 'purchase' WHEN 'erp' THEN 'erp' ELSE child.`route_path` END,
child.`sort_order` = CASE child.`column_key`
WHEN 'purchase' THEN 131 WHEN 'erp' THEN 132 ELSE child.`sort_order` END
WHERE child.`column_key` IN ('purchase', 'erp');
@@ -0,0 +1,2 @@
ALTER TABLE biz_publish_item
MODIFY COLUMN status_value TEXT NULL COMMENT 'status column';