|
|
|
|
@ -135,7 +135,20 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
if (existing == null) {
|
|
|
|
|
throw new IllegalArgumentException("实训任务不存在");
|
|
|
|
|
}
|
|
|
|
|
// Excel 导入模板不含三类新资料列,未提交(null)时保留库里已有资料;页面编辑始终显式传值(可为空串以清除)。
|
|
|
|
|
String incomingTrainingDataName = task.getTrainingDataName();
|
|
|
|
|
String incomingTrainingDataUrl = task.getTrainingDataUrl();
|
|
|
|
|
String incomingGuideManualName = task.getGuideManualName();
|
|
|
|
|
String incomingGuideManualUrl = task.getGuideManualUrl();
|
|
|
|
|
String incomingAiManualName = task.getAiManualName();
|
|
|
|
|
String incomingAiManualUrl = task.getAiManualUrl();
|
|
|
|
|
normalizeTask(task);
|
|
|
|
|
if (incomingTrainingDataName == null) task.setTrainingDataName(existing.getTrainingDataName());
|
|
|
|
|
if (incomingTrainingDataUrl == null) task.setTrainingDataUrl(existing.getTrainingDataUrl());
|
|
|
|
|
if (incomingGuideManualName == null) task.setGuideManualName(existing.getGuideManualName());
|
|
|
|
|
if (incomingGuideManualUrl == null) task.setGuideManualUrl(existing.getGuideManualUrl());
|
|
|
|
|
if (incomingAiManualName == null) task.setAiManualName(existing.getAiManualName());
|
|
|
|
|
if (incomingAiManualUrl == null) task.setAiManualUrl(existing.getAiManualUrl());
|
|
|
|
|
TrainingTask builtInTask = requireBuiltInTask(existing.getTaskKey());
|
|
|
|
|
task.setId(id);
|
|
|
|
|
task.setTaskKey(existing.getTaskKey());
|
|
|
|
|
@ -610,6 +623,30 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
update.setMaterialUrl(updatedTask.getMaterialUrl());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getTrainingDataName(), previousTask.getTrainingDataName(), updatedTask.getTrainingDataName())) {
|
|
|
|
|
update.setTrainingDataName(updatedTask.getTrainingDataName());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getTrainingDataUrl(), previousTask.getTrainingDataUrl(), updatedTask.getTrainingDataUrl())) {
|
|
|
|
|
update.setTrainingDataUrl(updatedTask.getTrainingDataUrl());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getGuideManualName(), previousTask.getGuideManualName(), updatedTask.getGuideManualName())) {
|
|
|
|
|
update.setGuideManualName(updatedTask.getGuideManualName());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getGuideManualUrl(), previousTask.getGuideManualUrl(), updatedTask.getGuideManualUrl())) {
|
|
|
|
|
update.setGuideManualUrl(updatedTask.getGuideManualUrl());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getAiManualName(), previousTask.getAiManualName(), updatedTask.getAiManualName())) {
|
|
|
|
|
update.setAiManualName(updatedTask.getAiManualName());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (shouldSynchronize(classTask.getAiManualUrl(), previousTask.getAiManualUrl(), updatedTask.getAiManualUrl())) {
|
|
|
|
|
update.setAiManualUrl(updatedTask.getAiManualUrl());
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
if (changed) {
|
|
|
|
|
update.setUpdateTime(new Date());
|
|
|
|
|
trainingTaskClassConfigMapper.updateByPrimaryKeySelective(update);
|
|
|
|
|
@ -680,6 +717,12 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
task.setStepOneQuestions(config.getStepOneQuestions());
|
|
|
|
|
task.setMaterialName(config.getMaterialName());
|
|
|
|
|
task.setMaterialUrl(config.getMaterialUrl());
|
|
|
|
|
task.setTrainingDataName(config.getTrainingDataName());
|
|
|
|
|
task.setTrainingDataUrl(config.getTrainingDataUrl());
|
|
|
|
|
task.setGuideManualName(config.getGuideManualName());
|
|
|
|
|
task.setGuideManualUrl(config.getGuideManualUrl());
|
|
|
|
|
task.setAiManualName(config.getAiManualName());
|
|
|
|
|
task.setAiManualUrl(config.getAiManualUrl());
|
|
|
|
|
task.setSort(config.getSort());
|
|
|
|
|
task.setEnabled(config.getEnabled());
|
|
|
|
|
task.setCreatedBy(config.getCreatedBy());
|
|
|
|
|
@ -702,6 +745,12 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
config.setStepOneQuestions(task.getStepOneQuestions());
|
|
|
|
|
config.setMaterialName(task.getMaterialName());
|
|
|
|
|
config.setMaterialUrl(task.getMaterialUrl());
|
|
|
|
|
config.setTrainingDataName(task.getTrainingDataName());
|
|
|
|
|
config.setTrainingDataUrl(task.getTrainingDataUrl());
|
|
|
|
|
config.setGuideManualName(task.getGuideManualName());
|
|
|
|
|
config.setGuideManualUrl(task.getGuideManualUrl());
|
|
|
|
|
config.setAiManualName(task.getAiManualName());
|
|
|
|
|
config.setAiManualUrl(task.getAiManualUrl());
|
|
|
|
|
config.setSort(task.getSort());
|
|
|
|
|
config.setEnabled(task.getEnabled());
|
|
|
|
|
config.setCreatedBy(operatorId);
|
|
|
|
|
@ -725,6 +774,12 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
"step_one_questions text NULL COMMENT '第一步选择题JSON数组'," +
|
|
|
|
|
"material_name varchar(255) NULL COMMENT '资料名称'," +
|
|
|
|
|
"material_url varchar(500) NULL COMMENT '资料地址'," +
|
|
|
|
|
"training_data_name varchar(255) NULL COMMENT '案例视频资料名称'," +
|
|
|
|
|
"training_data_url varchar(500) NULL COMMENT '案例视频资料地址'," +
|
|
|
|
|
"guide_manual_name varchar(255) NULL COMMENT '实训指导手册名称'," +
|
|
|
|
|
"guide_manual_url varchar(500) NULL COMMENT '实训指导手册地址'," +
|
|
|
|
|
"ai_manual_name varchar(255) NULL COMMENT 'AI排错指导手册名称'," +
|
|
|
|
|
"ai_manual_url varchar(500) NULL COMMENT 'AI排错指导手册地址'," +
|
|
|
|
|
"sort int DEFAULT 0 COMMENT '排序'," +
|
|
|
|
|
"enabled bit(1) DEFAULT b'1' COMMENT '是否启用'," +
|
|
|
|
|
"created_by varchar(64) NULL COMMENT '创建人'," +
|
|
|
|
|
@ -737,6 +792,7 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='实训任务配置'");
|
|
|
|
|
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");
|
|
|
|
|
trainingTaskTableChecked = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -758,6 +814,12 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
"step_one_questions text NULL," +
|
|
|
|
|
"material_name varchar(255) NULL," +
|
|
|
|
|
"material_url varchar(500) NULL," +
|
|
|
|
|
"training_data_name varchar(255) NULL," +
|
|
|
|
|
"training_data_url varchar(500) NULL," +
|
|
|
|
|
"guide_manual_name varchar(255) NULL," +
|
|
|
|
|
"guide_manual_url varchar(500) NULL," +
|
|
|
|
|
"ai_manual_name varchar(255) NULL," +
|
|
|
|
|
"ai_manual_url varchar(500) NULL," +
|
|
|
|
|
"sort int DEFAULT 0," +
|
|
|
|
|
"enabled bit(1) DEFAULT b'1'," +
|
|
|
|
|
"created_by varchar(64) NULL," +
|
|
|
|
|
@ -769,6 +831,7 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
"KEY idx_training_task_class_created_by (created_by)" +
|
|
|
|
|
") 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");
|
|
|
|
|
trainingTaskClassConfigTableChecked = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -788,6 +851,27 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
+ " text NULL COMMENT '" + comment + "' AFTER steps");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 补齐四类资料列:早期只建了 material_name/material_url 的部署需要追加后三类资料列。 */
|
|
|
|
|
private void ensureMaterialColumns(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 = 'ai_manual_url'",
|
|
|
|
|
Integer.class, tableName);
|
|
|
|
|
if (count != null && count > 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
jdbcTemplate.execute("ALTER TABLE " + tableName
|
|
|
|
|
+ " ADD COLUMN training_data_name varchar(255) NULL AFTER material_url,"
|
|
|
|
|
+ " ADD COLUMN training_data_url varchar(500) NULL AFTER training_data_name,"
|
|
|
|
|
+ " ADD COLUMN guide_manual_name varchar(255) NULL AFTER training_data_url,"
|
|
|
|
|
+ " ADD COLUMN guide_manual_url varchar(500) NULL AFTER guide_manual_name,"
|
|
|
|
|
+ " ADD COLUMN ai_manual_name varchar(255) NULL AFTER guide_manual_url,"
|
|
|
|
|
+ " ADD COLUMN ai_manual_url varchar(500) NULL AFTER ai_manual_name");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TrainingTask buildTask(TrainingTaskImportDTO row, int rowNumber, List<String> errors) {
|
|
|
|
|
String projectName = StringUtils.trimToEmpty(row.getProjectName());
|
|
|
|
|
String taskKey = StringUtils.trimToEmpty(row.getTaskKey());
|
|
|
|
|
@ -862,6 +946,12 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
|
|
|
|
|
task.setStepOneQuestions(normalizeStepOneQuestions(task.getTaskKey(), task.getStepOneQuestions()));
|
|
|
|
|
task.setMaterialName(StringUtils.trimToEmpty(task.getMaterialName()));
|
|
|
|
|
task.setMaterialUrl(StringUtils.trimToEmpty(task.getMaterialUrl()));
|
|
|
|
|
task.setTrainingDataName(StringUtils.trimToEmpty(task.getTrainingDataName()));
|
|
|
|
|
task.setTrainingDataUrl(StringUtils.trimToEmpty(task.getTrainingDataUrl()));
|
|
|
|
|
task.setGuideManualName(StringUtils.trimToEmpty(task.getGuideManualName()));
|
|
|
|
|
task.setGuideManualUrl(StringUtils.trimToEmpty(task.getGuideManualUrl()));
|
|
|
|
|
task.setAiManualName(StringUtils.trimToEmpty(task.getAiManualName()));
|
|
|
|
|
task.setAiManualUrl(StringUtils.trimToEmpty(task.getAiManualUrl()));
|
|
|
|
|
if (task.getEnabled() == null) {
|
|
|
|
|
task.setEnabled(Boolean.TRUE);
|
|
|
|
|
}
|
|
|
|
|
|