duidui_mini_program/pages/camp_task_essay_question/modules/task-service.js
2026-03-27 10:41:46 +08:00

182 lines
5.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 申论题任务服务模块
* 负责任务详情和进度相关的 API 调用
*/
import { campApi } from '../../../config/camp_api.js';
import { questionApi } from '../../../config/question_api.js';
/**
* 静默获取用户任务进度
* @param {String} userId - 用户ID
* @param {String} taskId - 任务ID
* @returns {Promise} 任务进度
*/
export function fetchProgressSilent(userId, taskId) {
// 使用 Fiber 后端的接口
return campApi.getProgressDetail(userId, taskId).then(function(res) {
// 统一返回格式
if (res && res.success === true) {
return res;
} else if (res && res.code === 200) {
return {
success: true,
progress: res.data || res.progress
};
}
return res;
}).catch(function(err) {
// 静默失败,返回 null
return null;
});
}
/**
* 获取任务详情
* @param {String} taskId - 任务ID
* @returns {Promise} 任务详情
*/
export function getTaskDetail(taskId) {
return campApi.getTaskDetailById(taskId).then(function(taskDetail){
if (!taskDetail || taskDetail.success !== true || !taskDetail.task) {
return null;
}
var task = taskDetail.task;
// 接口返回的 content 和 condition 是直接对象,不是嵌套在 essay 中
var content = task.content || {};
var condition = task.condition || {};
// 兼容两种格式:直接在 content 中,或嵌套在 content.essay 中
var paperId = content.exam_id || content.paper_id || null;
if (!paperId && content.essay) {
paperId = content.essay.exam_id || content.essay.paper_id || null;
}
// 兼容两种格式:直接在 condition 中,或嵌套在 condition.essay 中
var needReview = !!condition.need_review;
if (!needReview && condition.essay) {
needReview = !!condition.essay.need_review;
}
return {
paperId: paperId,
needReview: needReview
};
});
}
/**
* 获取试卷内容
* @param {String} paperId - 试卷ID
* @returns {Promise} 试卷数据
*/
export function fetchPaperData(paperId) {
return questionApi.getPaperDetail(paperId).then(function(res){
if (!res || res.success !== true || !res.paper) {
throw new Error('获取试卷内容失败');
}
var paper = res.paper;
var questions = paper.questions || [];
var problems = questions.map(function(q) {
return {
problem_id: String(q.id),
problem_content: q.content || q.title || '',
title: q.title || '',
type: q.type,
material_id: q.material_id || null, // 保留题目关联的材料ID
options: q.options || [],
explanation: q.explanation || '',
answer: q.answer || '',
submittedImages: [],
tempImages: [],
totalImageCount: 0,
allowResubmit: true,
teacherFeedback: {
comment: '',
images: [],
review_time: ''
}
};
});
// 提取 paper 级别的材料列表(与客观题页面保持一致)
var materials = Array.isArray(paper.materials) ? paper.materials : [];
return {
problems: problems,
materials: materials,
title: paper.title || '作业详情'
};
});
}
/**
* 提交答案(单题提交,保留用于兼容)
* @param {String} userId - 用户ID
* @param {String} taskId - 任务ID
* @param {Array} answerImages - 答案图片URL数组
* @returns {Promise} 提交结果
*/
export function submitAnswer(userId, taskId, answerImages) {
const formatDateTimeString = (date) => {
var d = date || new Date();
var year = d.getFullYear();
var month = String(d.getMonth() + 1).padStart(2, '0');
var day = String(d.getDate()).padStart(2, '0');
var hours = String(d.getHours()).padStart(2, '0');
var minutes = String(d.getMinutes()).padStart(2, '0');
var seconds = String(d.getSeconds()).padStart(2, '0');
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
};
var submitData = {
user_id: String(userId),
task_id: String(taskId),
is_completed: true,
completed_at: formatDateTimeString(new Date()),
answer_images: answerImages
};
return campApi.updateCampProgress(submitData);
}
/**
* 申论题提交 / 暂存:按题目顺序提交答案图片;支持部分题目暂存(后端会与已有进度合并)
* @param {String} userId - 用户ID
* @param {String} taskId - 任务ID
* @param {Array<Array<String>>} essayAnswerImages - 按题目顺序的答案图片数组,如 [ [url, url], [url], [] ],空题可为 []
* @param {Boolean} allFilled - 是否全部题目都已作答(用于设置 is_completed不传则根据 essayAnswerImages 推断)
* @returns {Promise} 提交结果
*/
export function submitEssayAnswer(userId, taskId, essayAnswerImages, allFilled) {
const formatDateTimeString = (date) => {
var d = date || new Date();
var year = d.getFullYear();
var month = String(d.getMonth() + 1).padStart(2, '0');
var day = String(d.getDate()).padStart(2, '0');
var hours = String(d.getHours()).padStart(2, '0');
var minutes = String(d.getMinutes()).padStart(2, '0');
var seconds = String(d.getSeconds()).padStart(2, '0');
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
};
if (typeof allFilled !== 'boolean') {
allFilled = (essayAnswerImages || []).every(function(arr) { return Array.isArray(arr) && arr.length > 0; });
}
var submitData = {
user_id: String(userId),
task_id: String(taskId),
is_completed: allFilled,
completed_at: formatDateTimeString(new Date()),
essay_answer_images: essayAnswerImages,
essay_question_count: essayAnswerImages.length
};
return campApi.updateCampProgress(submitData);
}