fix: 完成售后服务三步实训提交

bugfix/ai-assessment-evidence-rescore
陈沅 1 month ago
parent d0a184a85c
commit 3585edb919

@ -169,7 +169,7 @@
<p v-if="stepThreeResult" class="result-message" :class="{ success: stepThreeResult.valid }">{{ stepThreeResult.message }}</p> <p v-if="stepThreeResult" class="result-message" :class="{ success: stepThreeResult.valid }">{{ stepThreeResult.message }}</p>
<div class="task-actions"> <div class="task-actions">
<button type="button" class="btn-nav" :disabled="savingStepThree" @click="switchStep(2)"><el-icon><ArrowLeft /></el-icon>返回第 2 步</button> <button type="button" class="btn-nav" :disabled="savingStepThree" @click="switchStep(2)"><el-icon><ArrowLeft /></el-icon>返回第 2 步</button>
<button type="button" class="btn-nav btn-submit" :disabled="savingStepThree" @click="validateAndSaveStepThree">{{ savingStepThree ? '保存中…' : '保存并进入第 4 步' }}<el-icon><ArrowRight /></el-icon></button> <button type="button" class="btn-nav btn-submit" :disabled="savingStepThree" @click="validateAndSaveStepThree">{{ savingStepThree ? '提交中…' : '校验并提交任务' }}<el-icon><ArrowRight /></el-icon></button>
</div> </div>
</section> </section>
@ -279,8 +279,11 @@ const POLICY_SUMMARY_ROWS = [
{ id: "response-commitment", label: "响应承诺" }, { id: "response-commitment", label: "响应承诺" },
{ id: "featured-service", label: "特色服务" }, { id: "featured-service", label: "特色服务" },
]; ];
const fallbackSteps = ["故障类型分类", "服务分级与处理方案", "售后服务流程设计", "服务闭环优化"]; const fallbackSteps = ["故障类型分类", "服务分级与处理方案", "售后服务流程设计"];
const trainingSteps = computed(() => parseTrainingArray(taskConfig.value?.steps, 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 taskTitle = computed(() => taskConfig.value?.taskName || basePage.title || "售后服务流程设计");
const taskBackground = computed(() => taskConfig.value?.background || basePage.background); const taskBackground = computed(() => taskConfig.value?.background || basePage.background);
const taskRequirement = computed(() => taskConfig.value?.requirements || basePage.task); const taskRequirement = computed(() => taskConfig.value?.requirements || basePage.task);
@ -337,7 +340,7 @@ function buildStepThreeAnswer() {
updatedAt: new Date().toISOString(), 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 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() { async function loadSavedProgress() {
try { try {
@ -413,7 +416,7 @@ async function validateAndSaveStepThree() {
const answer = buildStepThreeAnswer(); const response = await checkAfterSalesServiceStepThree(answer); const answer = buildStepThreeAnswer(); const response = await checkAfterSalesServiceStepThree(answer);
stepThreeResult.value = response?.data || null; stepThreePassed.value = Boolean(stepThreeResult.value?.valid); stepThreeResult.value = response?.data || null; stepThreePassed.value = Boolean(stepThreeResult.value?.valid);
if (!stepThreePassed.value) { proxy?.$modal?.msgWarning(stepThreeResult.value?.message || "请完成售后政策框架与详情页摘要"); return; } 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; } } catch (error) { proxy?.$modal?.msgError(error?.message || "保存失败,请稍后重试"); } finally { savingStepThree.value = false; }
} }
function switchStep(step) { function switchStep(step) {

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