fix(distribution): 修正商品归属回填、禁止全站灌货并拒绝无效站点头

用货架写入时间与上传来源回滚误标产地,不再依赖绝对时间戳;同步仅收本站上传与显式勾选。
This commit is contained in:
yml2213
2026-09-08 17:30:12 +08:00
parent 96bc6a4db6
commit 31bf6dd3b6
15 changed files with 287 additions and 84 deletions
@@ -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;