fix(distribution): 修正商品归属回填、禁止全站灌货并拒绝无效站点头
用货架写入时间与上传来源回滚误标产地,不再依赖绝对时间戳;同步仅收本站上传与显式勾选。
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
-- +goose Up
|
||||
|
||||
-- 补偿 000072 / 000073:货架展示不等于产地,禁止用绝对时间回滚。
|
||||
-- 本站上传特征:无 listing_uploads(外部导入走该表,source_channel=咸鱼/淘宝等),
|
||||
-- 且 distribution_site_accounts 与商品在同一发布事务内写入(created_at 相差不超过 5 秒)。
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'rental_listings' AND COLUMN_NAME = 'source_channel') = 0,
|
||||
'ALTER TABLE rental_listings ADD COLUMN source_channel VARCHAR(64) NOT NULL DEFAULT '''' AFTER distribution_site_id',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 1. 恢复被 000073 时间戳误清空的本站上传归属
|
||||
UPDATE rental_listings l
|
||||
INNER JOIN (
|
||||
SELECT dsa.listing_id, MIN(dsa.site_id) AS site_id
|
||||
FROM distribution_site_accounts dsa
|
||||
INNER JOIN rental_listings l2 ON l2.id = dsa.listing_id
|
||||
LEFT JOIN listing_uploads lu ON lu.listing_id = dsa.listing_id
|
||||
WHERE lu.id IS NULL
|
||||
AND TIMESTAMPDIFF(SECOND, l2.created_at, dsa.created_at) BETWEEN 0 AND 5
|
||||
GROUP BY dsa.listing_id
|
||||
) origin ON origin.listing_id = l.id
|
||||
SET l.distribution_site_id = origin.site_id
|
||||
WHERE l.distribution_site_id IS NULL OR l.distribution_site_id = 0;
|
||||
|
||||
-- 2. 清掉仅因货架回填产生的归属(外部导入,或 DSA 明显晚于商品创建)
|
||||
UPDATE rental_listings l
|
||||
LEFT JOIN listing_uploads lu ON lu.listing_id = l.id
|
||||
LEFT JOIN distribution_site_accounts origin_dsa
|
||||
ON origin_dsa.listing_id = l.id
|
||||
AND origin_dsa.site_id = l.distribution_site_id
|
||||
AND TIMESTAMPDIFF(SECOND, l.created_at, origin_dsa.created_at) BETWEEN 0 AND 5
|
||||
SET l.distribution_site_id = NULL
|
||||
WHERE l.distribution_site_id IS NOT NULL
|
||||
AND l.distribution_site_id <> 0
|
||||
AND (lu.id IS NOT NULL OR origin_dsa.id IS NULL);
|
||||
|
||||
-- 3. 回填来源渠道快照:分销站用 site_code,外部导入用 listing_uploads.source_channel
|
||||
UPDATE rental_listings l
|
||||
INNER JOIN distribution_sites s ON s.id = l.distribution_site_id
|
||||
SET l.source_channel = s.site_code
|
||||
WHERE l.distribution_site_id IS NOT NULL
|
||||
AND l.distribution_site_id <> 0
|
||||
AND l.source_channel = '';
|
||||
|
||||
UPDATE rental_listings l
|
||||
INNER JOIN (
|
||||
SELECT lu.listing_id, MAX(NULLIF(lu.source_channel, '')) AS source_channel
|
||||
FROM listing_uploads lu
|
||||
WHERE lu.listing_id IS NOT NULL
|
||||
GROUP BY lu.listing_id
|
||||
) upload ON upload.listing_id = l.id
|
||||
SET l.source_channel = COALESCE(upload.source_channel, '')
|
||||
WHERE (l.distribution_site_id IS NULL OR l.distribution_site_id = 0)
|
||||
AND l.source_channel = ''
|
||||
AND COALESCE(upload.source_channel, '') <> '';
|
||||
|
||||
-- +goose Down
|
||||
|
||||
SET @sql = IF(
|
||||
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'rental_listings' AND COLUMN_NAME = 'source_channel') > 0,
|
||||
'ALTER TABLE rental_listings DROP COLUMN source_channel',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
Reference in New Issue
Block a user