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\("售后政策已校验通过,任务提交成功"\)/);
+});