# 发起审批钉钉式最终路径预览 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 条件字段未齐时底部占位「必填信息填写后,流程将自动显示」;齐后只展示命中审批链。 **Architecture:** `preview_start_flow` 收集条件字段做 `resolved` 门闩;通过后 `_match_condition_group` 单路 walk。API 改为 POST 传 `formData`。前端防抖刷新 + `OaFlowPreview` 占位态。 **Tech Stack:** FastAPI / SQLAlchemy;Vue 3 + Element Plus;pytest **Spec:** `docs/superpowers/specs/2026-07-17-oa-start-flow-preview-resolved-path-design.md` --- ## File map | File | Responsibility | |------|----------------| | `backend/app/services/oa_engine.py` | 字段收集、有值判定、单路 preview walk、`resolved` 返回 | | `backend/app/api/oa_approval.py` | POST `/templates/{id}/flow-preview` | | `backend/tests/test_oa_flow_preview.py` | 纯函数 + preview 逻辑单测 | | `web-admin/src/api/oaApproval.ts` | POST 客户端与类型 | | `web-admin/src/components/oa-approval/OaFlowPreview.vue` | 待确定占位 UI | | `web-admin/src/views/oa-approval/start/index.vue` | formData 防抖刷新 | --- ### Task 1: 后端门闩与单路 walk + 单测 **Files:** - Modify: `backend/app/services/oa_engine.py` - Create: `backend/tests/test_oa_flow_preview.py` - Modify: `backend/app/api/oa_approval.py` - [x] **Step 1:** 实现 `_collect_condition_fields`、`_form_value_present`;改 `_walk_preview_nodes` 条件分支为匹配单路;`preview_start_flow` 返回 `{resolved, message, steps}` - [x] **Step 2:** API 改为 POST,body 含 `formData` / `initiatorSelectUserIds`;保留 GET 转调空 formData(可选兼容) - [x] **Step 3:** 单测覆盖:无条件 resolved;有条件字段空;命中条件1;走默认 - [x] **Step 4:** `pytest backend/tests/test_oa_flow_preview.py` 通过 ### Task 2: 前端 API + 预览组件 + 发起页 **Files:** - Modify: `web-admin/src/api/oaApproval.ts` - Modify: `web-admin/src/components/oa-approval/OaFlowPreview.vue` - Modify: `web-admin/src/views/oa-approval/start/index.vue` - [x] **Step 1:** `fetchOaFlowPreview` 改为 POST;类型加 `resolved` / `message` - [x] **Step 2:** `OaFlowPreview` 支持 `resolved===false` 占位文案 - [x] **Step 3:** `start/index.vue` 传入 formData、防抖 watch、绑定 resolved/message - [x] **Step 4:** 更新 graphify(backend + frontend) ---