建立:2026-07-18(site-regression D-3 查證後開案) 狀態:設計拍板(A 案),待 spec review → implementation plan 背景查證:D-3 調查定案(2026-07-18)——子題 pid BE 完整實作有真實資料;flowRules v2 零持久化;v1 曾有 goto 跳題機制上線(options JSONB
goto_question/goto_page_1/goto_page_2,2025-05~09 真實資料)。v2 重寫斷鏈非「從未做過」。
問卷設計者要能設定「依答案決定後續要答什麼」:
現況問題:v2 Designer 有 flowRules 編輯 UI 殼,但設定存檔即蒸發(BE 零持久化、填答端零引擎)——使用者以為設好了,實際問卷完全不跳,比沒有功能更傷信任。
| 案 | 內容 | 判定 |
|---|---|---|
| A(採用) | 復刻 v1 跳題語意、v2 資料形狀重做;填答端用「可見性計算」實作 | ✅ 符合原規格與使用者心智模型;v1 雙 page 槽位一般化為陣列後混合情境原生支援 |
| B 純條件顯示(Qualtrics 式) | 條件掛在題/題組上 | ❌ 偏離原規格與現有 UI 殼,設計者要換心智模型 |
| C 只做題組級跳轉 | 同組內跳題後期補 | ❌ 「A-1 跳第 5 題」是真實需求,切掉半套 |
關鍵設計決策:跳題語意、可見性實作。 對外語意是「跳題」(設計者設「答 X 跳第 N 題」),內部引擎是純函數:可見集合 = f(全部規則, 全部當前答案),答案任何變動即全量重算。語意細則(已定案):
totalRequired(進度分母)與提交檢核(isRequired && !isAnswered 擋 submit/close)都是全量掃描——FR-049 後兩者一律改以可見集合為母集:被規則略過的必填題不擋提交、不算分母。同一個可見性純函數餵三個消費點(渲染/進度/必填檢核),禁止各算各的(否則會出現「畫面上看不到的必填題擋住提交」的死結)。沿 v1 內嵌模式:規則直接掛在 options JSONB 的每個選項物件上,換新鍵名。v1 真實資料形狀(DEV 實查)是 {key, name, content, goto_page_1: {uid,name}, goto_page_2: {uid,name}}——選項本身無 uid,內嵌設計天然迴避「option 識別」問題(獨立欄位需 option index/uid 對應,index 重排即壞)。
options JSONB 每個選項物件(v2 新鍵,僅單選題):
{
"name": "雲端",
...既有鍵...,
"goto_question_uid": "<同題組內目標題 uid>" | 缺省,
"goto_page_uids": ["<題組 uid>", ...] | 缺省 # v1 goto_page_1/2 一般化為陣列
}
| 段 | 內容 |
|---|---|
| ① BE(jedi-survey) | flow_rules 持久化 + serializer + 驗證(單選限定、目標存在性、禁止自指);v1 goto 遺留資料不遷移(v1 問卷已退役,資料留檔即可) |
| ② Designer | 既有 flowRules UI 殼接 BE(存讀);目標選擇補「題組(多選)」;子題接線(D-3a:AddQuestionDialog parentId→parentDbId 送出、清單 render subQuestions) |
| ③ 填答端 | 可見性計算引擎(監聽單選答案 → 重算可見題/題組集合);進度計算只算可見題;被隱藏題答案保留標不適用 |
| ④ 稽核檢視端 | 略過題呈現「不適用(依 X-N 作答略過)」,與漏答視覺區分 |
/survey/preview/:id(預覽)與 /survey/fill(任務抽屜開的填答頁)都掛同一個 SurveyPreview.vue。可見性引擎做在 SurveyPreview(或其 composable)一處即三入口(預覽/獨立填答/任務填答)全生效,無第二處要改。site-regression/features/modules/survey/,另派):Designer 設規則→填答跳題→混合情境→改答案重算;survey-v2 既有 47 條(survey-v2-manage/designer/fill.feature)回歸不紅survey-v2-designer.feature 子題 @known-bug(D-3a 修復後);flowRules 新 scenario 補進 survey-v2-designer + survey-v2-fill 兩 feature