From 3585edb919e57e0ea17906002f0c867e73a76ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B2=85?= <907037276@qq.com> Date: Mon, 31 Aug 2026 12:11:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=8C=E6=88=90=E5=94=AE=E5=90=8E?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=B8=89=E6=AD=A5=E5=AE=9E=E8=AE=AD=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/product/after-sales-service.vue | 13 +++++++----- ...er-sales-three-step-submit.static.test.cjs | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 tests/after-sales-three-step-submit.static.test.cjs 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\("售后政策已校验通过,任务提交成功"\)/); +});