-- 进件来源标记:区分「商户端自助进件」与「运营在后台纳管的外部进件商户」。 -- -- 编号让位(2026-10-12):本文件原为 V157,与远端已推送的 V157__backfill_premium_service_merchant_types -- 撞号——同一个版本号有两个迁移,Flyway 会直接拒绝启动。改动只在编号与文件名,建列语句一字未动。 -- 已经执行过原 V157 的那份测试库要按 docs/agents/testing.md 重置一次。 -- -- 背景:商户有两条进件路径。一条是商户在我们商户端自助进件(既有能力),另一条是商户直接在汇付侧 -- 完成进件、需要被接进我们的商家(见 .scratch/merchant-external-onboarding/spec.md)。两条路径收敛到 -- 同一套进件记录、分阶段进度与收款就绪判定,只有「来源」不同,所以只加这一列。 -- -- 它决定一件业务规则:纳管进来的进件**全程只查询、不下发**。外部进件商户的口径已由业务要求保持一致, -- 纳管只需核实;而补开微信、绑人才端 AppID、开启延迟入账这些下发操作都不幂等(改支付场景会重建微信 -- 子商户号),且连锁多店共用同一个汇付商户号时各自下发会造成重复下发。所以进度刷新与后续配置推进 -- 都要按这一列让路(见 MerchantManagedOnboardingService 与 MerchantOnboardingProgressService)。 -- -- 默认 'self'(自助进件):存量记录本来就是自助进件,不需要回填。 -- 幂等:先查 INFORMATION_SCHEMA 再决定是否加列,MySQL 5.7 与 8.0 都能直接重复执行, -- 所以这份迁移也可以用 scripts/apply-sql-file.ps1 直接落到开发库(开发库 Flyway 关闭、结构不由迁移维护)。 DELIMITER $$ DROP PROCEDURE IF EXISTS add_merchant_onboarding_source$$ CREATE PROCEDURE add_merchant_onboarding_source() BEGIN DECLARE col_exists INT DEFAULT 0; SELECT COUNT(*) INTO col_exists FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'merchant_onboarding_application' AND COLUMN_NAME = 'source'; IF col_exists = 0 THEN ALTER TABLE merchant_onboarding_application ADD COLUMN source VARCHAR(16) NOT NULL DEFAULT 'self' COMMENT '进件来源:self 商户端自助进件,managed 后台纳管的外部进件' AFTER status; END IF; END$$ CALL add_merchant_onboarding_source()$$ DROP PROCEDURE IF EXISTS add_merchant_onboarding_source$$ DELIMITER ;