1.0.540.verify.sql 6.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. -- 1.0.540.verify.sql — HARD ASSERTIONS,每条 SELECT 都必须返回 1
  2. --
  3. -- ⚠️ AutoVersionUpdate 按分号切分本文件,并把【每一个切片】都当断言、要求返回 1。因此:
  4. -- ① 不得放"仅供排查"的 informational 查询
  5. -- ② 文件必须以最后一条断言的分号结尾,末尾不能留纯注释块
  6. -- ③ 注释里不得出现任何字面分号
  7. --
  8. -- 口径:本批只做【文档级】采购单身份,只断言本批 writer 独占的那一列。
  9. -- 行级身份(PO Line)属 SOURCE CONTRACT GAP —— 上游 FSRCBILLID / FSRCBILLENTRYSEQ 实测 0/4 全空,
  10. -- 本文件因此【刻意不断言】任何 PO 行号,也不断言覆盖率(覆盖率取决于热关注跑批调度)。
  11. -- ── ① 新列已就位,且必须可空 ───────────────────────────────────────────────────────
  12. -- 可空是硬要求:本库 14 行 fixture 分录在上游已不存在,没有权威采购单号可填
  13. SELECT (SELECT COUNT(*) FROM `information_schema`.`COLUMNS`
  14. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'qms_qcp_insappnentry'
  15. AND `COLUMN_NAME` = 'purchase_order_no'
  16. AND `IS_NULLABLE` = 'YES') = 1;
  17. SELECT (SELECT COUNT(*) FROM `information_schema`.`COLUMNS`
  18. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'qms_qcp_insappnentry'
  19. AND `COLUMN_NAME` = 'purchase_order_no'
  20. AND `DATA_TYPE` = 'varchar') = 1;
  21. -- ── ② 不得有默认值:宁可为空,不造假 ───────────────────────────────────────────────
  22. SELECT (SELECT COUNT(*) FROM `information_schema`.`COLUMNS`
  23. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'qms_qcp_insappnentry'
  24. AND `COLUMN_NAME` = 'purchase_order_no'
  25. AND `COLUMN_DEFAULT` IS NOT NULL) = 0;
  26. -- ── ③ 本批不得新增任何 PO 行号载体 ─────────────────────────────────────────────────
  27. -- 行级缺口必须由上游补 FSRCBILLID / FSRCBILLENTRYSEQ,不允许本地自造列顶替
  28. SELECT (SELECT COUNT(*) FROM `information_schema`.`COLUMNS`
  29. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'qms_qcp_insappnentry'
  30. AND `COLUMN_NAME` IN ('purchase_order_line','po_line','purchase_order_entry_seq',
  31. 'source_entry_id','receipt_line')) = 0;
  32. -- ── ④ 既有语义不被破坏:FSRCORDERNUM 仍是收货单号,不得被写成采购单号 ──────────────
  33. -- 判据:凡两列都非空的行,二者不得相等(相等即说明有人把采购单号灌进了收货号列)
  34. SELECT (SELECT COUNT(*) FROM `qms_qcp_insappnentry`
  35. WHERE `purchase_order_no` IS NOT NULL AND `purchase_order_no` <> ''
  36. AND `FSRCORDERNUM` IS NOT NULL AND `FSRCORDERNUM` <> ''
  37. AND `FSRCORDERNUM` = `purchase_order_no`) = 0;
  38. -- ── ⑤ 不得落字面量 'null' / 空串 / 带空白(writer 已做 Trim 归一)──────────────────
  39. SELECT (SELECT COUNT(*) FROM `qms_qcp_insappnentry`
  40. WHERE `purchase_order_no` IN ('null', '')
  41. OR `purchase_order_no` <> TRIM(`purchase_order_no`)) = 0;
  42. -- ── ⑥ 有采购单号的行,租户必须合法 ─────────────────────────────────────────────────
  43. SELECT (SELECT COUNT(*) FROM `qms_qcp_insappnentry`
  44. WHERE `purchase_order_no` IS NOT NULL
  45. AND (`tenant_id` IS NULL OR `tenant_id` <= 0)) = 0;
  46. -- ── ⑦ 采购单号若能命中标准层,必须是【同租户】命中 ─────────────────────────────────
  47. -- 禁止只按单号跨租户关联。表述为:存在跨租户命中、却不存在同租户命中的行 = 0
  48. SELECT (SELECT COUNT(*) FROM `qms_qcp_insappnentry` e
  49. WHERE e.`purchase_order_no` IS NOT NULL
  50. AND EXISTS (SELECT 1 FROM `mdp_std_purchase_order` o
  51. WHERE o.`po_no` = e.`purchase_order_no` AND o.`tenant_id` <> e.`tenant_id`)
  52. AND NOT EXISTS (SELECT 1 FROM `mdp_std_purchase_order` o2
  53. WHERE o2.`po_no` = e.`purchase_order_no` AND o2.`tenant_id` = e.`tenant_id`)) = 0;
  54. -- ── ⑧ 一条分录只能有一个采购单号(列本身保证),且不得出现重复放大 ──────────────────
  55. -- id 是主键,行数必须等于去重后的 id 数 —— 防止镜像扇出造出重复分录
  56. SELECT (SELECT COUNT(*) FROM `qms_qcp_insappnentry`) =
  57. (SELECT COUNT(DISTINCT `id`) FROM `qms_qcp_insappnentry`);
  58. -- ── ⑨ 本批不得改动 IQC 质量语义:pd 仍只允许既有取值 ───────────────────────────────
  59. SELECT (SELECT COUNT(*) FROM `qms_qcp_inspbill`
  60. WHERE `pd` IS NOT NULL AND `pd` NOT IN (0, 1)) = 0;
  61. -- ── ⑩ 1.0.536 采购身份桥不得回归:PR 的订单行 Id 若有值必须仍能同租户命中 ────────────
  62. SELECT (SELECT COUNT(*) FROM `mdp_std_purchase_request` p
  63. WHERE p.`sales_order_entry_id` IS NOT NULL
  64. AND (p.`sales_order_entry_id` <= 0
  65. OR NOT EXISTS (SELECT 1 FROM `mdp_std_so` s
  66. WHERE s.`tenant_id` = p.`tenant_id`
  67. AND s.`order_entry_id` = p.`sales_order_entry_id`))) = 0;
  68. -- ── ⑪ 本批不得建 Stage-3 完成事实表 / 完成事件 ─────────────────────────────────────
  69. SELECT (SELECT COUNT(*) FROM `information_schema`.`TABLES`
  70. WHERE `TABLE_SCHEMA` = DATABASE()
  71. AND `TABLE_NAME` IN ('dwd_procurement_kpi','mdp_std_iqc_inspection','dwd_iqc_completion')) = 0;
  72. SELECT (SELECT COUNT(*) FROM `aidop_action_run_log`
  73. WHERE `action_code` = 'S3_PROCUREMENT_COMPLETE') = 0;