wecom-fullstack
0824efc8ed
ci/woodpecker/push/main Pipeline failed
feat(data-quality): 规则配置可编辑入口 + 经营口径排除接线(ASK-20260928-05 尾项)
依据:任总 2026-09-29 08:49「P1和P2批」放行 P1-cma-dq-rule-config-approval-20260923 ①③
(派单件 0-P1-project-20260929-qrc-write-entry-and-demo-exclusion-fullstack)
三处尾项(本单):
1) 前端可编辑入口(补拍板件 ① 未被上轮覆盖的部分)
- frontend/src/views/DataQuality.vue:规则配置 Tab 由「只读」改为
ceo/it 可编辑、finance/business 只读(角色口径与 router/index.ts:45 及
系统设置页一致);新增「操作/编辑」列(平台级项仅 it 可点、演示账套禁用);
编辑走 MyDialog(业务弹窗铁律),必填变更理由(>=10 字),取值区间/枚举
由后端返回字段呈现,越界/非法一律如实回显后端 detail,前端不自造校验通过。
2) scope.excluded_entities 接线 + 出厂默认 [3,4,5,6](拍板件 ③-2「排除」)
- app/dq_rule_config.py:默认由 [] 改为 [3,4,5,6];新增单一事实源
EXCLUDED_ENTITIES_KEY / EXCLUDED_ENTITIES_FIELD、normalize_entity_ids()、
excluded_entities_from_resolution()、excluded_entity_ids()、
is_excluded_from_business_caliber()。
- app/api/data_quality.py:新增 _excluded_clause()(仅全账套口径 eid=0 生效,
COALESCE(col,1) NOT IN (...) 参数化,NULL 归属不吞行)与 _business_excluded();
七条规则的明细查询与 _detail_count 全部叠加排除子句;_plan_id_set /
_pending_alert_plan_links 支持 excluded(播报口径同源)。
- 响应新增 business_caliber{caliber,exclusion_applied,excluded_entities,included}
与 scope_excluded_entities;单账套查询保持展示、仅标注不计入经营口径。
- PUT /rule-config:平台级项改写全账套模板行(entity_id=0),审计 detail 与响应
增 target_entity_id;GET 增 scope_note 与 write_contract{roles,platform_roles,
min_reason_len,entity_config_entities,bot_channel_write,endpoint}。
3) 修复两处实现缺陷(本单测试新增用例的 RED 驱动)
- excluded_entities_from_resolution() 取键与 resolve()["scope"] 的归组形态不一致
(配了 scope. 全名去取已归组后的短名字典)⇒ 恒返回空集,接线静默失效;
改为短名优先、全名兼容(EXCLUDED_ENTITIES_FIELD)。
- upsert_param() 全局项 before 取值多一层 rule_key 查找 ⇒ before 恒 None;
改为全局项直接以 param_key 为键。
4) 测试:tests/test_dq_rule_config_20260928.py 3 处既有断言按新口径更新 +
新增 E 类 8 例(排除默认/单一事实源、全账套与单账套两种口径面、A/B 聚合差异
只来自被排除账套、明细计数同源、平台级项改名单即时生效、平台级写落模板行)。
不改:判定表达式本体 / 级别归属 / 评分函数 / 规则集(DAMA §4 锁死 10 类)、
unit_check.amount_threshold(保持 10000)、virtual_pollution 关键词表与来源白名单。
边界:本提交只含 4 文件(backend/app/dq_rule_config.py、
backend/app/api/data_quality.py、backend/tests/test_dq_rule_config_20260928.py、
frontend/src/views/DataQuality.vue);未裹挟他人在制件
(audit_log.py / migrate_subjects_entity_id_20260923.py / package.json)。
证据:pending-tasks/_evidence/ask5-tail-20260929/
(pytest 全量 1 failed/1516 passed + 失败项归因 A/B、vue-tsc rc=0、
ab-exclusion-pre-write.json 只读 A/B 原始输出、gate dry-run 等)
2026-09-29 13:00:48 +08:00
..
2026-05-28 17:42:15 +08:00
2026-07-12 17:46:08 +08:00
2026-09-18 17:33:25 +08:00
2026-08-27 12:50:30 +08:00
2026-09-18 20:03:55 +08:00
2026-09-18 20:12:46 +08:00
2026-09-21 15:13:27 +08:00
2026-07-27 17:16:01 +08:00
2026-09-18 21:04:30 +08:00
2026-09-15 18:36:46 +08:00
2026-09-25 10:39:18 +08:00
2026-09-19 11:12:31 +08:00
2026-09-19 11:12:31 +08:00
2026-09-25 10:39:18 +08:00
2026-09-25 14:06:38 +08:00
2026-07-27 17:16:01 +08:00
2026-09-22 11:06:02 +08:00
2026-09-15 17:00:52 +08:00
2026-09-25 22:42:25 +08:00
2026-09-15 17:00:52 +08:00
2026-09-15 17:00:52 +08:00
2026-08-30 19:16:19 +08:00
2026-09-25 22:42:25 +08:00
2026-09-25 22:42:25 +08:00
2026-08-27 10:59:56 +08:00
2026-09-23 18:29:52 +08:00
2026-09-15 18:36:46 +08:00
2026-09-25 10:39:18 +08:00
2026-09-14 20:37:12 +08:00
2026-09-13 07:38:58 +08:00
2026-09-25 22:42:25 +08:00
2026-09-15 18:36:46 +08:00
2026-09-03 01:22:46 +08:00
2026-08-27 15:51:19 +08:00
2026-09-23 01:03:19 +08:00
2026-09-05 09:10:35 +08:00
2026-09-18 18:15:22 +08:00
2026-09-18 19:03:49 +08:00
2026-09-18 19:34:59 +08:00
2026-09-21 09:37:38 +08:00
2026-09-21 10:36:02 +08:00
2026-09-21 14:56:43 +08:00
2026-09-10 09:56:50 +08:00
2026-09-14 17:39:53 +08:00
2026-08-26 07:51:39 +08:00
2026-09-14 17:39:53 +08:00
2026-08-30 10:27:01 +08:00
2026-07-27 17:16:01 +08:00
2026-09-18 20:33:39 +08:00
2026-09-24 01:07:29 +08:00
2026-09-29 13:00:48 +08:00
2026-09-23 21:39:24 +08:00
2026-09-23 23:08:26 +08:00
2026-09-15 17:00:52 +08:00
2026-09-15 18:12:05 +08:00
2026-08-26 06:53:25 +08:00
2026-09-15 17:00:52 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 18:12:38 +08:00
2026-07-27 17:16:01 +08:00
2026-09-14 17:39:53 +08:00
2026-09-16 14:48:06 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-09-25 16:34:52 +08:00
2026-09-22 11:06:02 +08:00
2026-07-12 17:46:08 +08:00
2026-09-26 02:42:04 +08:00
2026-07-12 17:46:08 +08:00
2026-09-21 10:36:02 +08:00
2026-08-20 06:57:24 +08:00
2026-08-30 23:13:32 +08:00
2026-09-18 20:23:53 +08:00
2026-09-18 17:33:25 +08:00
2026-09-16 01:17:09 +08:00
2026-09-15 17:00:52 +08:00
2026-09-25 22:42:25 +08:00
2026-09-15 18:36:46 +08:00
2026-09-14 17:39:53 +08:00
2026-09-14 17:39:53 +08:00
2026-08-25 23:59:33 +08:00
2026-09-21 10:36:02 +08:00
2026-09-11 17:25:24 +08:00
2026-09-11 17:27:12 +08:00
2026-08-20 06:57:24 +08:00
2026-07-12 17:46:08 +08:00
2026-07-12 17:46:08 +08:00
2026-07-12 17:46:08 +08:00
2026-09-14 19:05:16 +08:00
2026-09-14 19:05:16 +08:00
2026-09-22 11:21:24 +08:00