diff --git a/src/views/product/after-sales-service.vue b/src/views/product/after-sales-service.vue index 6e027fd..80f69ae 100644 --- a/src/views/product/after-sales-service.vue +++ b/src/views/product/after-sales-service.vue @@ -169,7 +169,7 @@

{{ stepThreeResult.message }}

- +
@@ -279,8 +279,11 @@ const POLICY_SUMMARY_ROWS = [ { id: "response-commitment", label: "响应承诺" }, { id: "featured-service", label: "特色服务" }, ]; -const fallbackSteps = ["故障类型分类", "服务分级与处理方案", "售后服务流程设计", "服务闭环优化"]; -const trainingSteps = computed(() => parseTrainingArray(taskConfig.value?.steps, fallbackSteps)); +const fallbackSteps = ["故障类型分类", "服务分级与处理方案", "售后服务流程设计"]; +const trainingSteps = computed(() => { + const configuredSteps = parseTrainingArray(taskConfig.value?.steps, fallbackSteps); + return fallbackSteps.map((fallbackStep, index) => configuredSteps[index] || fallbackStep); +}); const taskTitle = computed(() => taskConfig.value?.taskName || basePage.title || "售后服务流程设计"); const taskBackground = computed(() => taskConfig.value?.background || basePage.background); const taskRequirement = computed(() => taskConfig.value?.requirements || basePage.task); @@ -337,7 +340,7 @@ function buildStepThreeAnswer() { updatedAt: new Date().toISOString(), }; } -async function persist(saveAction = "SAVE") { await saveStudentTrainingAnswer(TASK_KEY, { saveAction, currentStep: currentStep.value, step1Answer: JSON.stringify(buildStepOneAnswer()), step2Answer: JSON.stringify(buildStepTwoAnswer()), step3Answer: JSON.stringify(buildStepThreeAnswer()) }); } +async function persist(saveAction = "SAVE") { await saveStudentTrainingAnswer(TASK_KEY, { saveAction, currentStep: currentStep.value, submitted: saveAction === "SUBMIT", step1Answer: JSON.stringify(buildStepOneAnswer()), step2Answer: JSON.stringify(buildStepTwoAnswer()), step3Answer: JSON.stringify(buildStepThreeAnswer()) }); } async function loadTaskConfig() { try { const response = await getTrainingTaskByKey(TASK_KEY); taskConfig.value = response?.data || null; currentStep.value = normalizeStep(currentStep.value); } catch (error) { taskConfig.value = null; } } async function loadSavedProgress() { try { @@ -413,7 +416,7 @@ async function validateAndSaveStepThree() { const answer = buildStepThreeAnswer(); const response = await checkAfterSalesServiceStepThree(answer); stepThreeResult.value = response?.data || null; stepThreePassed.value = Boolean(stepThreeResult.value?.valid); if (!stepThreePassed.value) { proxy?.$modal?.msgWarning(stepThreeResult.value?.message || "请完成售后政策框架与详情页摘要"); return; } - currentStep.value = normalizeStep(4); await persist("SAVE"); proxy?.$modal?.msgSuccess("售后政策已保存,已进入第 4 步"); + currentStep.value = normalizeStep(3); await persist("SUBMIT"); proxy?.$modal?.msgSuccess("售后政策已校验通过,任务提交成功"); } catch (error) { proxy?.$modal?.msgError(error?.message || "保存失败,请稍后重试"); } finally { savingStepThree.value = false; } } function switchStep(step) { diff --git a/tests/after-sales-three-step-submit.static.test.cjs b/tests/after-sales-three-step-submit.static.test.cjs new file mode 100644 index 0000000..aa81c55 --- /dev/null +++ b/tests/after-sales-three-step-submit.static.test.cjs @@ -0,0 +1,20 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs"); +const path = require("node:path"); +const test = require("node:test"); + +const source = fs.readFileSync(path.join(__dirname, "../src/views/product/after-sales-service.vue"), "utf8"); + +test("实训任务14只定义三个步骤,末步不再指向第4步", () => { + assert.match(source, /const fallbackSteps = \["故障类型分类", "服务分级与处理方案", "售后服务流程设计"\];/); + assert.match(source, /const trainingSteps = computed\(\(\) => \{\s*const configuredSteps = parseTrainingArray\(taskConfig\.value\?\.steps, fallbackSteps\);\s*return fallbackSteps\.map\(\(fallbackStep, index\) => configuredSteps\[index\] \|\| fallbackStep\);\s*\}\);/); + assert.doesNotMatch(source, /保存并进入第 4 步/); + assert.doesNotMatch(source, /已进入第 4 步/); +}); + +test("实训任务14第3步校验通过后提交成果", () => { + assert.match(source, /校验并提交任务/); + assert.match(source, /currentStep\.value = normalizeStep\(3\);\s*await persist\("SUBMIT"\);/); + assert.match(source, /async function persist\(saveAction = "SAVE"\) \{ await saveStudentTrainingAnswer\(TASK_KEY, \{ saveAction, currentStep: currentStep\.value, submitted: saveAction === "SUBMIT",/); + assert.match(source, /msgSuccess\("售后政策已校验通过,任务提交成功"\)/); +});