-- ===================================================================================== -- 1.0.533 · S8 Stage-2「产品设计」KPI 事实层 -- -- ── 链路 ──────────────────────────────────────────────────────────────────────────── -- dwd_order_review_kpi.review_end_time (Stage-1 已有 DWD Authority) -- + mdp_std_action_event (S2_DAILY_PLAN_RELEASE) (Stage-2 End Authority,1.0.532 建立) -- + mdp_std_operation_schedule.status='Y' (历史"已下达"状态佐证,只作旁证不取时间) -- → dwd_product_design_kpi → S8 订单执行档案 PRODUCT_DESIGN -- -- ── 历史语义(本表存在的核心理由)──────────────────────────────────────────────────── -- 1.0.532 之前系统不写「日计划下达」动作事件,因此历史上已下达的订单 -- **只能证明"已经下达",无法证明"何时下达"**。本表用独立状态 END_UNKNOWN 表达这件事, -- 与 IN_PROGRESS 严格区分: -- END_UNKNOWN = 已形成可执行日计划,但历史时间 Authority 缺失 -- IN_PROGRESS = 没有任何证据表明已形成可执行日计划 -- 若把两者都显示成「进行中」,会把历史数据缺口误判成业务未完成。 -- -- 🔴 绝对禁止用 PeriodSequenceDet.UpdateTime / create_time / EffTime / IsConfirm -- 反推历史 End —— UpdateTime 会被后续任意一次 UPDATE 覆盖,拿它当下达时间正是 -- 1.0.532 要消除的问题。END_UNKNOWN 行的 end_time 与 actual_hours 一律 NULL。 -- -- ── 本表不含 ──────────────────────────────────────────────────────────────────────── -- target_hours / kpi_status / 红黄绿阈值 / achievement_rate —— 属另一批次。 -- ===================================================================================== CREATE TABLE IF NOT EXISTS `dwd_product_design_kpi` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '代理主键', `tenant_id` BIGINT NOT NULL COMMENT '租户ID(唯一隔离边界,uk 首列)', `sales_order_id` BIGINT NOT NULL COMMENT '销售订单头ID = crm_seorder.Id(归因权威,来自 mdp_std_so.order_id)', `sales_order_no` VARCHAR(128) NULL COMMENT '销售订单号(仅展示/搜索,不作 JOIN Authority)', `review_end_time` DATETIME NULL COMMENT 'Stage-1 评审结束时刻(原样取自 dwd_order_review_kpi,不重算)', `release_action_run_id` BIGINT NULL COMMENT '被采纳的 S2_DAILY_PLAN_RELEASE 事件ID(FIRST SUCCESS)', `product_design_start_time` DATETIME NULL COMMENT 'Stage-2 开始 = review_end_time', `product_design_end_time` DATETIME NULL COMMENT 'Stage-2 结束 = FIRST SUCCESS 释放事件的 action_end_time;END_UNKNOWN/IN_PROGRESS 时为 NULL', `actual_hours` DECIMAL(12,2) NULL COMMENT '实际耗时(自然 elapsed 小时,2 位小数,不扣夜间/周末/节假日);仅 OK 有值', `calculation_status` VARCHAR(32) NOT NULL COMMENT 'OK / NOT_STARTED / IN_PROGRESS / END_UNKNOWN / INVALID_NO_START / INVALID_TIME_SEQUENCE', `release_success_count` INT NOT NULL DEFAULT 0 COMMENT '该订单的释放事件 SUCCESS 次数(可观测性,不参与计算)', `release_failed_count` INT NOT NULL DEFAULT 0 COMMENT '该订单的释放事件 FAILED 次数(可观测性,不参与计算)', `has_released_schedule` TINYINT NOT NULL DEFAULT 0 COMMENT '中台是否存在该订单已下达(status=Y)的日计划行;仅用于区分 END_UNKNOWN / IN_PROGRESS,不取时间', `calc_batch_id` VARCHAR(100) NULL COMMENT '最近一次重算批次号', `calc_time` DATETIME NULL COMMENT '最近一次重算时刻', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '首次落库时刻', `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '最近一次更新时刻', PRIMARY KEY (`id`), UNIQUE KEY `uk_dwd_product_design_kpi` (`tenant_id`, `sales_order_id`), KEY `idx_dwd_pd_kpi_status` (`tenant_id`, `calculation_status`), KEY `idx_dwd_pd_kpi_no` (`tenant_id`, `sales_order_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DWD-产品设计KPI(Stage-2;本批仅 ActualHours,无 TargetHours)';