测评题库设置锚点区分模板和试卷

parent 22e4e3f4
......@@ -180,7 +180,8 @@ export async function growthMessageList(studentName: string, semesterId: number,
let semester = await getCurrentSemester();
if (semesterId) {
semester = await selectOneDataByParam(TABLENAME.学期表, { id: semesterId });
let semesterData = await selectOneDataByParam(TABLENAME.学期表, { id: semesterId });
semester = semesterData.data ? semesterData.data : null;
}
// 如果没有当前学期,返回空列表
......@@ -260,7 +261,8 @@ export async function meetingList(studentName: string, semesterId: number, teach
let semester = await getCurrentSemester();
if (semesterId) {
semester = await selectOneDataByParam(TABLENAME.学期表, { id: semesterId });
let semesterData = await selectOneDataByParam(TABLENAME.学期表, { id: semesterId });
semester = semesterData.data ? semesterData.data : null;
}
if (!semester) {
......@@ -268,7 +270,7 @@ export async function meetingList(studentName: string, semesterId: number, teach
}
let selectParam: any = {
semester_id: semester.id
semester_id: semesterId ?? semester.id
};
// 时间筛选
......
......@@ -9,8 +9,9 @@ import { BizError } from "../../util/bizError";
import { ERRORENUM } from "../../config/errorEnum";
import { getCurrentSemester } from "../common/semesterService";
import { mysqlModelMap } from "../../model/sqlModelBind";
import { Op, Sequelize } from "sequelize";
import { Op, Sequelize, StringDataType } from "sequelize";
import { hasData } from "../../tools/system";
import { create } from "domain";
/**CASE WHEN 状态计算表达式 */
const STATUS_CASE_SQL = `CASE WHEN start_time IS NOT NULL AND NOW() < start_time THEN 0 WHEN end_time IS NOT NULL AND NOW() > end_time THEN 2 ELSE 1 END`;
......@@ -91,43 +92,54 @@ export async function createSurvey(param: {
/**获取当前学期 */
let semester = await getCurrentSemester();
/**插入 survey 表 */
let surveyData: any = {
name: surveyName,
semester_id: semester.id,
start_time: startTime || null,
end_time: endTime || null,
is_open: isOpen ? true : false,
description: description || null
};
await addData(TABLENAME.测评活动表, surveyData);
insertSurveyInfo(semester.id, surveyName, startTime, endTime, isOpen, description, 1, null);
/**查回自增ID */
let newSurvey = await selectOneDataByParam(TABLENAME.测评活动表, {
name: surveyName,
semester_id: semester.id,
is_temp: 1,
"%orderDesc%": "id",
"%limit%": 1
});
let surveyId = (newSurvey.data as any).id;
/**逐条插入题目 */
for (let i = 0; i < questions.length; i++) {
let q = questions[i];
await addData(TABLENAME.测评题目表, {
survey_id: surveyId,
question_code: q.question_code,
question_type: q.question_type,
question_text: q.question_text,
options: q.options || null,
is_required: q.is_required !== undefined ? (q.is_required ? true : false) : true,
sort_order: i
});
}
insertSurveyDetail(surveyId, questions);
// 新增试卷
insertSurveyInfo(semester.id, surveyName, startTime, endTime, isOpen, description, 2, surveyId);
/**查回自增ID */
let surveyInfo = await selectOneDataByParam(TABLENAME.测评活动表, {
name: surveyName,
semester_id: semester.id,
is_temp: 2,
"%orderDesc%": "id",
"%limit%": 1
});
let survey_id = (surveyInfo.data as any).id;
insertSurveyDetail(survey_id, questions);
return { isSuccess: true };
}
/**
* 修改测评题库是否开放
* @param param
*/
export async function updateIsOpenSurvey(surveyId: number, isOpen: number) {
/**校验测评是否存在 */
let survey = await selectOneDataByParam(TABLENAME.测评活动表, { id: surveyId });
if (!hasData(survey)) {
throw new BizError(ERRORENUM.未找到数据, '测评不存在');
}
/**更新 survey 表 */
await updateManyData(TABLENAME.测评活动表, { id: surveyId }, {
is_open: isOpen ? true : false
});
return { isSuccess: true };
}
/**
* 修改测评题库
......@@ -157,36 +169,43 @@ export async function updateSurvey(param: {
if (!hasData(survey)) {
throw new BizError(ERRORENUM.未找到数据, '测评不存在');
}
updateSurveyInfo(surveyId, surveyName, startTime, endTime, isOpen, description, questions);
/**更新 survey 表 */
await updateManyData(TABLENAME.测评活动表, { id: surveyId }, {
name: surveyName,
start_time: startTime || null,
end_time: endTime || null,
is_open: isOpen ? true : false,
description: description || null
});
/**操作 survey_question 表:先删后加 */
await delData(TABLENAME.测评题目表, { survey_id: surveyId });
// 若是没有更新开始时间,则同步更新试卷
if (survey.data.start_time === startTime) {
// 通过模板id查询试卷,按创建时间倒序取最晚一条
let survey_template = await selectOneDataByParam(TABLENAME.测评活动表, {
is_temp: 2,
temp_id: surveyId,
"%orderDesc%": "created_at",
"%limit%": 1
});
if (hasData(survey_template)) {
let survey_id = (survey_template.data as any).id;
// 更新试卷信息
updateSurveyInfo(survey_id, surveyName, startTime, endTime, isOpen, description, questions);
}
} else {
let semester = await getCurrentSemester();
// 若是更新开始时间,则通过模板创建试卷
let tempId = survey.data.id;
insertSurveyInfo(semester.id, surveyName, startTime, endTime, isOpen, description, 2, tempId);
for (let i = 0; i < questions.length; i++) {
let q = questions[i];
await addData(TABLENAME.测评题目表, {
survey_id: surveyId,
question_code: q.question_code,
question_type: q.question_type,
question_text: q.question_text,
options: q.options || null,
is_required: q.is_required !== undefined ? (q.is_required ? true : false) : true,
sort_order: i
/**查回自增ID */
let newSurvey = await selectOneDataByParam(TABLENAME.测评活动表, {
name: surveyName,
semester_id: semester.id,
"%orderDesc%": "id",
"%limit%": 1
});
let surveyId = (newSurvey.data as any).id;
insertSurveyDetail(surveyId, questions);
}
return { isSuccess: true };
}
/**
* 测评详情
* @param surveyId 测评ID
......@@ -224,3 +243,64 @@ export async function surveyInfo(surveyId: number) {
questions: questionList
};
}
// 内联方法,用于插入测评信息
async function insertSurveyInfo(semesterId: number, surveyName: string, startTime: string,
endTime: string, isOpen: number, description: string, is_temp?: number, tempId?: number){
/**插入 survey 表 */
let surveyData: any = {
name: surveyName,
semester_id: semesterId,
start_time: startTime || null,
end_time: endTime || null,
is_open: isOpen ? true : false,
description: description || null,
is_temp: is_temp,
tempId: tempId || null
};
await addData(TABLENAME.测评活动表, surveyData);
}
// 内联方法,用于插入测评题目列表
async function insertSurveyDetail(surveyId: number, questions: any[]){
/**逐条插入题目 */
for (let i = 0; i < questions.length; i++) {
let q = questions[i];
await addData(TABLENAME.测评题目表, {
survey_id: surveyId,
question_code: q.question_code,
question_type: q.question_type,
question_text: q.question_text,
options: q.options || null,
is_required: q.is_required !== undefined ? (q.is_required ? true : false) : true,
sort_order: i
});
}
}
// 内联方法,用于更新测评信息和题目列表
async function updateSurveyInfo(surveyId: number, surveyName: string, startTime: string,
endTime: string, isOpen: number, description: string, questions: any[]){
/**更新 survey 表 */
await updateManyData(TABLENAME.测评活动表, { id: surveyId }, {
name: surveyName,
start_time: startTime || null,
end_time: endTime || null,
is_open: isOpen ? true : false,
description: description || null
});
/**操作 survey_question 表:先删后加 */
await delData(TABLENAME.测评题目表, { survey_id: surveyId });
for (let i = 0; i < questions.length; i++) {
let q = questions[i];
await addData(TABLENAME.测评题目表, {
survey_id: surveyId,
question_code: q.question_code,
question_type: q.question_type,
question_text: q.question_text,
options: q.options || null,
is_required: q.is_required !== undefined ? (q.is_required ? true : false) : true,
sort_order: i
});
}
}
\ No newline at end of file
......@@ -313,6 +313,7 @@ export async function getTeacherSurvey(studentId: string, surveyName?: string, s
/**查测评活动列表 */
let surveyParam: any = {
semester_id: semester.id,
is_temp: 2, // 只查试卷
is_open: 1
};
let surveyList = await selectDataListByParam(TABLENAME.测评活动表, surveyParam);
......@@ -339,12 +340,22 @@ export async function getTeacherSurvey(studentId: string, surveyName?: string, s
continue;
}
// 时间维度状态: 0=未开始, 1=进行中, 2=已结束
let now = new Date();
let timeStatus = 1; // 默认进行中
if (survey.start_time && now < new Date(survey.start_time)) {
timeStatus = 0; // 未开始
} else if (survey.end_time && now > new Date(survey.end_time)) {
timeStatus = 2; // 已结束
}
resultList.push({
survey_id: survey.id,
name: survey.name,
start_time: survey.start_time,
end_time: survey.end_time,
status: surveyStatus
status: surveyStatus,
time_status: timeStatus
});
}
......
......@@ -318,10 +318,11 @@ export async function getStudentOptions(teacherId: string, semesterId?: number,
/**获取目标学期 */
let semester;
if (semesterId) {
semester = await selectOneDataByParam(TABLENAME.学期表, { id: semesterId });
if (!semester.data) {
let semesterData = await selectOneDataByParam(TABLENAME.学期表, { id: semesterId });
if (!semesterData.data) {
throw new BizError(ERRORENUM.未找到数据, '学期不存在');
}
semester = semesterData.data;
} else {
semester = await getCurrentSemester();
}
......@@ -333,7 +334,7 @@ export async function getStudentOptions(teacherId: string, semesterId?: number,
/**获取该导师在指定学期的所有学生 */
let matches = await selectDataListByParam(TABLENAME.师生匹配表, {
teacher_id: teacherId,
semester_id: semester.data?.id || semester.id,
semester_id: semester.id,
is_active: true
});
......
......@@ -450,6 +450,8 @@ export const TablesConfig = [
start_time: { type: DataTypes.DATE, allowNull: true, comment: '答题开始时间,为空表示无限制' },
end_time: { type: DataTypes.DATE, allowNull: true, comment: '答题结束时间,为空表示无限制' },
is_open: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, comment: '是否开放答题(管理员手动开启/关闭)' },
is_temp: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 1, comment: '1模板2试卷' },
temp_id: { type: DataTypes.INTEGER, allowNull: true, comment: '模板ID' },
created_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW },
updated_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW }
},
......
......@@ -248,6 +248,8 @@ export function setRouter(httpServer) {
httpServer.post('/api/admin/survey/edit', checkUser, checkRole(USERROLE.管理员), asyncHandler(updateSurvey));
httpServer.post('/api/admin/survey/info', checkUser, checkRole(USERROLE.管理员), asyncHandler(surveyInfo));
httpServer.post('/api/admin/survey/edit_open', checkUser, checkRole(USERROLE.管理员), asyncHandler(updateIsOpenSurvey));
}
// ==================== 导师管理 ====================
......@@ -1647,6 +1649,20 @@ async function surveyInfo(req, res) {
res.success(result);
}
/**
* 修改测评题库是否开放
* @param req
* @param res
*/
async function updateIsOpenSurvey(req, res) {
const userInfo = req.userInfo;
let reqConf = {surveyId:'Number', isOpen:'Number'};
let { surveyId, isOpen } = eccReqParamater(reqConf, req.body);
let result = await teacherSurveyBiz.updateIsOpenSurvey( surveyId, isOpen );
res.success(result);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment