-- ===================================================================================== -- 1.0.507 · S0 MASTER DATA PLATFORM · PHASE 2 · BATCH 5 -- -- CustMaster → mdp_stg_s0_customer → dim_customer -- PersonSkill → mdp_stg_s0_person_skill → dim_person_skill -- -- 身份口径(按「当前业务证据优先」判定,**不继承旧物理唯一键**): -- · Customer 身份 = tenant_id + Cust -- - CRUD 查重 = tenant + FactoryRefId + Cust,而 FactoryRefId 由 AdoS0OrgScope 仅按租户解析 -- 并强制 stamp(payload 覆盖)⇒ 等价 tenant + Cust;DomainCode 只是可选列表筛选。 -- - 数据实测:tenant+Cust / +Domain / +factory 三候选租户内重复全部 = 0; -- company/factory 每租户单一取值(常量、零区分力)。 -- - 租户必须入身份:Cust 跨租户碰撞 4 个编码。 -- · PersonSkill 身份 = tenant_id + Code -- - 现有消费方 AdoS0MfgLinePostsController.ResolvePersonSkillCodesAsync 已明确按 (租户, Code) -- 解析,并把「同租户跨公司/工厂重码」当作歧义**报错**,而非两个不同技能。 -- - 数据实测:三候选租户内重复全部 = 0;Code 跨租户碰撞 5 个编码。 -- -- 🔴 源表 CustMaster 另有不含 tenant_id 的旧唯一键 uk_CustMaster_factory_cust(factory_ref_id, Cust), -- 且 factory_ref_id=1000 被两租户共用 —— 属源表治理缺陷(KNOWN-ISSUES I-016)。 -- **本批 NO SOURCE TABLE DDL CHANGE**:不顺手治理它,dim 侧靠自己的 tenant 前缀保证隔离。 -- -- 边界:不复用历史 mdp_stg_customer(即便 0 行,它属 DOPDEMORQ/S1,不是 S0 authority); -- 不碰 mdp_std_item / mdp_std_supplier;不动 S0 CRUD / 前端 / S1–S9 既有对象。 -- ===================================================================================== CREATE TABLE IF NOT EXISTS `mdp_stg_s0_customer` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL DEFAULT 0, `factory_id` bigint DEFAULT NULL, `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL', `source_table` varchar(100) NOT NULL, `source_row_id` varchar(100) NOT NULL, `source_biz_key` varchar(300) DEFAULT NULL, `sync_batch_id` varchar(100) NOT NULL, `sync_time` datetime NOT NULL, `process_status` varchar(20) NOT NULL DEFAULT 'PENDING', `raw_data` json NOT NULL, `process_message` varchar(500) DEFAULT NULL, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_stg_s0_customer` (`tenant_id`,`source_system`,`source_table`,`source_row_id`), KEY `idx_stg_s0_customer_biz` (`source_biz_key`), KEY `idx_stg_s0_customer_batch` (`tenant_id`,`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据贴源:客户(源 CustMaster)'; CREATE TABLE IF NOT EXISTS `mdp_stg_s0_person_skill` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL DEFAULT 0, `factory_id` bigint DEFAULT NULL, `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL', `source_table` varchar(100) NOT NULL, `source_row_id` varchar(100) NOT NULL, `source_biz_key` varchar(300) DEFAULT NULL, `sync_batch_id` varchar(100) NOT NULL, `sync_time` datetime NOT NULL, `process_status` varchar(20) NOT NULL DEFAULT 'PENDING', `raw_data` json NOT NULL, `process_message` varchar(500) DEFAULT NULL, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_stg_s0_person_skill` (`tenant_id`,`source_system`,`source_table`,`source_row_id`), KEY `idx_stg_s0_person_skill_biz` (`source_biz_key`), KEY `idx_stg_s0_person_skill_batch` (`tenant_id`,`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据贴源:人员技能字典(源 PersonSkill)'; CREATE TABLE IF NOT EXISTS `dim_customer` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技术行号;每轮 FULL 重建即变,禁止外部引用', `tenant_id` bigint NOT NULL COMMENT '租户', `customer_code` varchar(100) NOT NULL COMMENT '客户编码(**唯一业务键**)← $.Cust', `customer_name` varchar(200) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.SortName(源 1333/1333 填充)', `domain_code` varchar(50) DEFAULT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;**不是身份**', `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.company_ref_id;f(tenant),**不是身份**', `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.factory_ref_id;f(tenant),**不是身份**', `shipping_lead_time` int DEFAULT NULL COMMENT 'ATTRIBUTE ← $.CustShippingLT(源 1328/1333)', `is_active` tinyint(1) NOT NULL COMMENT '源 IsActive 透传', `is_confirmed` tinyint(1) NOT NULL COMMENT '源 IsConfirm 透传', `source_system` varchar(50) NOT NULL, `source_biz_key` varchar(300) NOT NULL COMMENT '回溯 staging 用', `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime;源 1232/1333,允许 NULL', `sync_batch_id` varchar(64) NOT NULL, `sync_time` datetime NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_dim_customer` (`tenant_id`,`customer_code`), KEY `idx_dim_customer_batch` (`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:客户。源 CustMaster,FULL REPLACE。'; CREATE TABLE IF NOT EXISTS `dim_person_skill` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技术行号;每轮 FULL 重建即变,禁止外部引用', `tenant_id` bigint NOT NULL COMMENT '租户', `skill_code` varchar(100) NOT NULL COMMENT '技能编码(**唯一业务键**)← $.Code', `skill_name` varchar(200) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.Name', `skill_level` varchar(50) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.SkillLevel', `remark` varchar(500) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.Remark', `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.CompanyRefId;**不是身份**', `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.FactoryRefId;**不是身份**', `is_active` tinyint(1) NOT NULL COMMENT '源 IsEnabled 透传', `source_system` varchar(50) NOT NULL, `source_biz_key` varchar(300) NOT NULL COMMENT '回溯 staging 用', `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdatedAt(维护时间;源 5/46 非空 = 只有改过的行才有值)。不得用 CreatedAt 冒充', `sync_batch_id` varchar(64) NOT NULL, `sync_time` datetime NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_dim_person_skill` (`tenant_id`,`skill_code`), KEY `idx_dim_person_skill_batch` (`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:人员技能字典。源 PersonSkill,FULL REPLACE。不设父维度(EmpSkills.SkillNo 与本表 Code 实测 632/650 对不上)。'; SET @src_id = (SELECT `id` FROM `mdp_source` WHERE `source_code` = 'AIDOPDEV_MYSQL' LIMIT 1); INSERT INTO `mdp_entity` (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`, `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`, `biz_key_expr`,`status`,`create_time`,`update_time`) SELECT 0, @src_id, 'S0_CUSTOMER', 'S0 客户主数据入站', 'TABLE', 'CustMaster', 'mdp_stg_s0_customer', 'FULL', NULL, 5000, 'Cust', 1, NOW(), NOW() WHERE @src_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_CUSTOMER'); INSERT INTO `mdp_entity` (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`, `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`, `biz_key_expr`,`status`,`create_time`,`update_time`) SELECT 0, @src_id, 'S0_PERSON_SKILL', 'S0 人员技能字典入站', 'TABLE', 'PersonSkill', 'mdp_stg_s0_person_skill', 'FULL', NULL, 5000, 'Code', 1, NOW(), NOW() WHERE @src_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_PERSON_SKILL'); -- ── 回滚(注释,非可执行)────────────────────────────────────────────────────────── -- DROP TABLE IF EXISTS `dim_person_skill`; -- DROP TABLE IF EXISTS `dim_customer`; -- DROP TABLE IF EXISTS `mdp_stg_s0_person_skill`; -- DROP TABLE IF EXISTS `mdp_stg_s0_customer`; -- DELETE FROM `mdp_entity` WHERE `tenant_id` = 0 AND `entity_code` IN ('S0_CUSTOMER','S0_PERSON_SKILL');