|
|
|
|
@ -36,6 +36,7 @@ import java.util.Date;
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
import java.util.LinkedHashSet;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Locale;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.UUID;
|
|
|
|
|
@ -142,6 +143,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
String incomingGuideManualUrl = task.getGuideManualUrl();
|
|
|
|
|
String incomingAiManualName = task.getAiManualName();
|
|
|
|
|
String incomingAiManualUrl = task.getAiManualUrl();
|
|
|
|
|
String incomingReferenceAnswerName = task.getReferenceAnswerName();
|
|
|
|
|
String incomingReferenceAnswerUrl = task.getReferenceAnswerUrl();
|
|
|
|
|
normalizeTask(task);
|
|
|
|
|
if (incomingTrainingDataName == null) task.setTrainingDataName(existing.getTrainingDataName());
|
|
|
|
|
if (incomingTrainingDataUrl == null) task.setTrainingDataUrl(existing.getTrainingDataUrl());
|
|
|
|
|
@ -149,6 +152,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
if (incomingGuideManualUrl == null) task.setGuideManualUrl(existing.getGuideManualUrl());
|
|
|
|
|
if (incomingAiManualName == null) task.setAiManualName(existing.getAiManualName());
|
|
|
|
|
if (incomingAiManualUrl == null) task.setAiManualUrl(existing.getAiManualUrl());
|
|
|
|
|
if (incomingReferenceAnswerName == null) task.setReferenceAnswerName(existing.getReferenceAnswerName());
|
|
|
|
|
if (incomingReferenceAnswerUrl == null) task.setReferenceAnswerUrl(existing.getReferenceAnswerUrl());
|
|
|
|
|
TrainingTask builtInTask = requireBuiltInTask(existing.getTaskKey());
|
|
|
|
|
task.setId(id);
|
|
|
|
|
task.setTaskKey(existing.getTaskKey());
|
|
|
|
|
@ -647,6 +652,14 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
update.setAiManualUrl(updatedTask.getAiManualUrl());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getReferenceAnswerName(), previousTask.getReferenceAnswerName(), updatedTask.getReferenceAnswerName())) {
|
|
|
|
|
update.setReferenceAnswerName(updatedTask.getReferenceAnswerName());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getReferenceAnswerUrl(), previousTask.getReferenceAnswerUrl(), updatedTask.getReferenceAnswerUrl())) {
|
|
|
|
|
update.setReferenceAnswerUrl(updatedTask.getReferenceAnswerUrl());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (changed) {
|
|
|
|
|
update.setUpdateTime(new Date());
|
|
|
|
|
trainingTaskClassConfigMapper.updateByPrimaryKeySelective(update);
|
|
|
|
|
@ -723,6 +736,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
task.setGuideManualUrl(config.getGuideManualUrl());
|
|
|
|
|
task.setAiManualName(config.getAiManualName());
|
|
|
|
|
task.setAiManualUrl(config.getAiManualUrl());
|
|
|
|
|
task.setReferenceAnswerName(config.getReferenceAnswerName());
|
|
|
|
|
task.setReferenceAnswerUrl(config.getReferenceAnswerUrl());
|
|
|
|
|
task.setSort(config.getSort());
|
|
|
|
|
task.setEnabled(config.getEnabled());
|
|
|
|
|
task.setCreatedBy(config.getCreatedBy());
|
|
|
|
|
@ -751,6 +766,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
config.setGuideManualUrl(task.getGuideManualUrl());
|
|
|
|
|
config.setAiManualName(task.getAiManualName());
|
|
|
|
|
config.setAiManualUrl(task.getAiManualUrl());
|
|
|
|
|
config.setReferenceAnswerName(task.getReferenceAnswerName());
|
|
|
|
|
config.setReferenceAnswerUrl(task.getReferenceAnswerUrl());
|
|
|
|
|
config.setSort(task.getSort());
|
|
|
|
|
config.setEnabled(task.getEnabled());
|
|
|
|
|
config.setCreatedBy(operatorId);
|
|
|
|
|
@ -780,6 +797,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
"guide_manual_url varchar(500) NULL COMMENT '实训指导手册地址'," +
|
|
|
|
|
"ai_manual_name varchar(255) NULL COMMENT 'AI排错指导手册名称'," +
|
|
|
|
|
"ai_manual_url varchar(500) NULL COMMENT 'AI排错指导手册地址'," +
|
|
|
|
|
"reference_answer_name varchar(255) NULL COMMENT '参考答案名称'," +
|
|
|
|
|
"reference_answer_url varchar(500) NULL COMMENT '参考答案地址'," +
|
|
|
|
|
"sort int DEFAULT 0 COMMENT '排序'," +
|
|
|
|
|
"enabled bit(1) DEFAULT b'1' COMMENT '是否启用'," +
|
|
|
|
|
"created_by varchar(64) NULL COMMENT '创建人'," +
|
|
|
|
|
@ -793,6 +812,7 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
jdbcTemplate.execute("ALTER TABLE training_task CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
|
|
|
ensureTextColumn("training_task", "step_one_questions", "第一步选择题JSON数组");
|
|
|
|
|
ensureMaterialColumns("training_task");
|
|
|
|
|
ensureReferenceAnswerColumns("training_task");
|
|
|
|
|
trainingTaskTableChecked = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -820,6 +840,8 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
"guide_manual_url varchar(500) NULL," +
|
|
|
|
|
"ai_manual_name varchar(255) NULL," +
|
|
|
|
|
"ai_manual_url varchar(500) NULL," +
|
|
|
|
|
"reference_answer_name varchar(255) NULL," +
|
|
|
|
|
"reference_answer_url varchar(500) NULL," +
|
|
|
|
|
"sort int DEFAULT 0," +
|
|
|
|
|
"enabled bit(1) DEFAULT b'1'," +
|
|
|
|
|
"created_by varchar(64) NULL," +
|
|
|
|
|
@ -832,6 +854,7 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Class scoped training task config'");
|
|
|
|
|
ensureTextColumn("training_task_class_config", "step_one_questions", "第一步选择题JSON数组");
|
|
|
|
|
ensureMaterialColumns("training_task_class_config");
|
|
|
|
|
ensureReferenceAnswerColumns("training_task_class_config");
|
|
|
|
|
trainingTaskClassConfigTableChecked = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -872,6 +895,23 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
+ " ADD COLUMN ai_manual_url varchar(500) NULL AFTER ai_manual_name");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 补齐参考答案列:已有四类资料列的部署需要追加参考答案两列。 */
|
|
|
|
|
private void ensureReferenceAnswerColumns(String tableName) {
|
|
|
|
|
if (jdbcTemplate == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Integer count = jdbcTemplate.queryForObject(
|
|
|
|
|
"SELECT COUNT(1) FROM information_schema.COLUMNS " +
|
|
|
|
|
"WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = 'reference_answer_url'",
|
|
|
|
|
Integer.class, tableName);
|
|
|
|
|
if (count != null && count > 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
jdbcTemplate.execute("ALTER TABLE " + tableName
|
|
|
|
|
+ " ADD COLUMN reference_answer_name varchar(255) NULL AFTER ai_manual_url,"
|
|
|
|
|
+ " ADD COLUMN reference_answer_url varchar(500) NULL AFTER reference_answer_name");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TrainingTask buildTask(TrainingTaskImportDTO row, int rowNumber, List<String> errors) {
|
|
|
|
|
String projectName = StringUtils.trimToEmpty(row.getProjectName());
|
|
|
|
|
String taskKey = StringUtils.trimToEmpty(row.getTaskKey());
|
|
|
|
|
@ -952,11 +992,24 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
task.setGuideManualUrl(StringUtils.trimToEmpty(task.getGuideManualUrl()));
|
|
|
|
|
task.setAiManualName(StringUtils.trimToEmpty(task.getAiManualName()));
|
|
|
|
|
task.setAiManualUrl(StringUtils.trimToEmpty(task.getAiManualUrl()));
|
|
|
|
|
task.setReferenceAnswerName(StringUtils.trimToEmpty(task.getReferenceAnswerName()));
|
|
|
|
|
task.setReferenceAnswerUrl(StringUtils.trimToEmpty(task.getReferenceAnswerUrl()));
|
|
|
|
|
validateReferenceAnswerFile(task.getReferenceAnswerName());
|
|
|
|
|
if (task.getEnabled() == null) {
|
|
|
|
|
task.setEnabled(Boolean.TRUE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void validateReferenceAnswerFile(String fileName) {
|
|
|
|
|
if (StringUtils.isBlank(fileName)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
String normalized = fileName.trim().toLowerCase(Locale.ROOT);
|
|
|
|
|
if (!normalized.endsWith(".doc") && !normalized.endsWith(".docx")) {
|
|
|
|
|
throw new IllegalArgumentException("参考答案仅支持Word文件(.doc或.docx)");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private TrainingTask requireBuiltInTask(String taskKey) {
|
|
|
|
|
TrainingTask builtInTask = getBuiltInTask(taskKey);
|
|
|
|
|
if (builtInTask == null) {
|
|
|
|
|
|