| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- -- =====================================================================================
- -- 1.0.510 · S0 MASTER DATA PLATFORM · PHASE 2 · dim_item(大数据量门)
- --
- -- ItemMaster → mdp_stg_s0_item → dim_item
- --
- -- 【为什么是 dim_item 而不是复用 mdp_std_item —— 已封板,勿再讨论】
- -- mdp_std_item 是 Supply/S3 的**多源**物料目录:实测混入 ic_item(另一业务域主数据),
- -- 租户 797 有 75 个 item_code 只来自 ic_item、在 ItemMaster 里 0 命中;其写入 SQL
- -- (S3MdpSyncTransformService)取值用 COALESCE($.ItemNum,$.number) 且不过滤 source_table/source_system。
- -- 物理上它也无法当父维度:只有 6 个业务列,无 Domain、无 ItemMaster.RecID,
- -- 两个最大租户的 factory_id/company_id 100% NULL。
- -- dim_item 不是第二份权威,是 ItemMaster 的第一次物化;二者消费方实测零重叠。
- --
- -- 【身份 = tenant_id + ItemNum】
- -- 实测租户内重复 0、空白 0、非法租户 0;ItemNum 跨租户碰撞 663 码 / 1534 行 ⇒ 租户必须入身份。
- -- 旧 UK uk_ItemMaster_factory_item 含 factory_ref_id,**不予继承**:它连 f(tenant) 都不是
- -- (租户 838257186181189 有 3 个取值含 0),且 8010 被三个租户共用。
- --
- -- 【大数据量】单租户最大 16150 行 > 默认 batch_size 5000,AssertNoSourceDuplicateAsync 会硬失败。
- -- 本 entity 的 batch_size 设 50000(3.1x 头寸)。该值是 **entity 级**(取自 mdp_entity.batch_size),
- -- **不影响其它任何维度**,绝不是全局放大。
- --
- -- 【字段取舍】75 列 → 只物化「全库填充率 ≥5% 且全库 distinct ≥2」的列;
- -- 并无条件排除:审计列 · 影子列 · bit(1) 列 · 可空 tinyint(1)。据此排除的典型:
- -- expire_alarm_day 0 填充的影子列(真列是 ExpireAlarmDays 22682)
- -- SuppWarranty bit(1) 且含 2 行 NULL —— Int 会让对账每轮必挂、BoolTrue 会滤掉那 2 行
- -- DEAControlled 可空 tinyint(1),2 行 NULL 会被 BoolTrue 守卫滤掉
- -- Length/Size/Height/Width/cust_supplied/enable_bom_version 全库 distinct=1,零信息
- -- Status 7/22684,且真实状态语义在 IsActive
- -- DefaultShelf/Remark/OwnerApplication/BOMDesignTime/RoutingDesignTime/
- -- drawing_design/design_owner/bom_design/routing_des/bom_version 全库 0 填充
- -- SizeUM(5)/LocationType(1)/PMBOM(797 空) 近空
- -- CreateUser/CreateTime/UpdateUser 审计列
- --
- -- 【legacy_source_id】← RecID,**技术属性**,供 C3 的 ProductStructureMaster.ComponentMaterialId
- -- 这类 legacy 代理键做对账解析。它不是身份;且**绝不能用 dim 的代理 id 建外键** ——
- -- 每轮 FULL REPLACE 后 dim_item.id 都会变。
- -- =====================================================================================
- CREATE TABLE IF NOT EXISTS `mdp_stg_s0_item` (
- `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_item` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
- KEY `idx_stg_s0_item_biz` (`source_biz_key`),
- KEY `idx_stg_s0_item_batch` (`tenant_id`,`sync_batch_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 贴源:物料(源 ItemMaster)';
- CREATE TABLE IF NOT EXISTS `dim_item` (
- `id` bigint NOT NULL AUTO_INCREMENT,
- `tenant_id` bigint NOT NULL,
- `item_code` varchar(100) NOT NULL COMMENT '物料编码(**唯一业务键**)← $.ItemNum',
- `item_name` varchar(200) NOT NULL COMMENT '← $.Descr',
- `item_name_2` varchar(200) DEFAULT NULL COMMENT '← $.Descr1',
- `unit` varchar(50) DEFAULT NULL COMMENT '← $.UM',
- `pur_mfg` varchar(100) DEFAULT NULL COMMENT '采购/制造属性 ← $.PurMfg',
- `item_type` varchar(100) DEFAULT NULL COMMENT '物料类别 ← $.ItemType',
- `commodity_code` varchar(100) DEFAULT NULL COMMENT '← $.CommodityCode',
- `rev` varchar(50) DEFAULT NULL COMMENT '← $.Rev',
- `drawing` varchar(100) DEFAULT NULL COMMENT '← $.Drawing',
- `pkg_code` varchar(50) DEFAULT NULL COMMENT '← $.PkgCode',
- `series` varchar(100) DEFAULT NULL COMMENT '← $.Series',
- `emt_type` varchar(50) DEFAULT NULL COMMENT '← $.EMTType',
- `po_receipt_status` varchar(8) DEFAULT NULL COMMENT '← $.PORcptStatus',
- `warranty_code` varchar(255) DEFAULT NULL COMMENT '← $.WarrantyCode',
- `default_location` varchar(100) DEFAULT NULL COMMENT '← $.Location;软引用 dim_location,无 FK',
- `buyer` varchar(255) DEFAULT NULL COMMENT '← $.Buyer',
- `planner` varchar(100) DEFAULT NULL COMMENT '← $.Planner',
- `net_weight` decimal(18,5) DEFAULT NULL COMMENT '← $.NetWeight;精度必须与源逐位一致',
- `net_weight_um` varchar(50) DEFAULT NULL COMMENT '← $.NetWeightUM',
- `pur_lead_time` int DEFAULT NULL COMMENT '← $.PurLT',
- `ins_lead_time` int DEFAULT NULL COMMENT '← $.InsLT',
- `mfg_lead_time` int DEFAULT NULL COMMENT '← $.MfgLT',
- `mfg_mttr` int DEFAULT NULL COMMENT '← $.MFGMTTR',
- `days_between_pm` int DEFAULT NULL COMMENT '← $.DaysBetweenPM',
- `expire_alarm_days` int DEFAULT NULL COMMENT '← $.ExpireAlarmDays(真列;同表 expire_alarm_day 是 0 填充影子列)',
- `min_order_qty` decimal(18,5) DEFAULT NULL COMMENT '← $.MinOrd',
- `max_order_qty` decimal(18,5) DEFAULT NULL COMMENT '← $.MaxOrd',
- `min_order_qty_sales` decimal(18,5) DEFAULT NULL COMMENT '← $.MinOrdSales',
- `order_multiple` decimal(18,5) DEFAULT NULL COMMENT '← $.OrdMult',
- `safety_stock` decimal(18,5) DEFAULT NULL COMMENT '← $.SafetyStk',
- `stock_turnover` decimal(18,5) DEFAULT NULL COMMENT '← $.StockTurnOver',
- `is_active` tinyint(1) NOT NULL COMMENT '← $.IsActive(真实有效状态,非 Status)',
- `is_confirmed` tinyint(1) NOT NULL COMMENT '← $.IsConfirm',
- `key_item` tinyint(1) NOT NULL COMMENT '← $.KeyItem',
- `inspect_required` tinyint(1) NOT NULL COMMENT '← $.Inspect',
- `issue_policy` tinyint(1) NOT NULL COMMENT '← $.IssuePolicy',
- `install` tinyint(1) NOT NULL COMMENT '← $.Install',
- `lot_serial_control` tinyint(1) NOT NULL COMMENT '← $.LotSerialControl',
- `allocate_single_lot` tinyint(1) NOT NULL COMMENT '← $.AllocateSingleLot',
- `auto_lot_nums` tinyint(1) NOT NULL COMMENT '← $.AutoLotNums',
- `trace_detail` tinyint(1) NOT NULL COMMENT '← $.TraceDetail',
- `is_main_master` tinyint(1) NOT NULL COMMENT '← $.IsMainMas',
- `mrp_required` tinyint(1) NOT NULL COMMENT '← $.MRPRequired',
- `domain_code` varchar(50) DEFAULT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;**不是身份**',
- `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.company_ref_id;**不是身份**',
- `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.factory_ref_id;**不是身份**(连 f(tenant) 都不是)',
- `legacy_source_id` bigint NOT NULL COMMENT '技术属性 ← $.RecID;供 C3 legacy 代理键对账。**不是身份,禁止用 dim.id 建外键**',
- `source_system` varchar(50) NOT NULL,
- `source_biz_key` varchar(300) NOT NULL,
- `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime(源 22682/22684)',
- `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`),
- -- 索引字节 = 8 + 100*4 = 408 < 3072
- UNIQUE KEY `uk_dim_item` (`tenant_id`,`item_code`),
- KEY `idx_dim_item_batch` (`sync_batch_id`),
- -- 供 C3 的 legacy 代理键(如 ProductStructureMaster.ComponentMaterialId)反查
- KEY `idx_dim_item_legacy` (`tenant_id`,`legacy_source_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:物料。源 ItemMaster,FULL REPLACE。**S0 的 Item 权威**,与 Supply/S3 的多源 mdp_std_item 语义不同。';
- 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_ITEM', 'S0 物料主数据入站', 'TABLE',
- 'ItemMaster', 'mdp_stg_s0_item', 'FULL', NULL, 50000,
- 'ItemNum', 1, NOW(), NOW()
- WHERE @src_id IS NOT NULL
- AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM');
- -- ── 回滚(注释,非可执行)──
- -- DROP TABLE IF EXISTS `dim_item`;
- -- DROP TABLE IF EXISTS `mdp_stg_s0_item`;
- -- DELETE FROM `mdp_entity` WHERE `tenant_id` = 0 AND `entity_code` = 'S0_ITEM';
|