fix: sync default training task content to classes

main
陈沅 6 days ago
parent 5759113dae
commit 369182595a

@ -115,7 +115,6 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
if (existing == null) {
throw new IllegalArgumentException("实训任务不存在");
}
String previousSteps = existing.getSteps();
normalizeTask(task);
TrainingTask builtInTask = requireBuiltInTask(existing.getTaskKey());
task.setId(id);
@ -126,7 +125,7 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
task.setSteps(normalizeSteps(task.getSteps(), builtInTask));
task.setUpdateTime(new Date());
trainingTaskMapper.updateByPrimaryKeySelective(task);
synchronizeClassTaskSteps(existing.getTaskKey(), previousSteps, task.getSteps());
synchronizeClassTaskDefaults(existing, task);
return trainingTaskMapper.selectByPrimaryKey(id);
}
@ -495,9 +494,9 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
}
}
private void synchronizeClassTaskSteps(String taskKey, String previousSteps, String updatedSteps) {
private void synchronizeClassTaskDefaults(TrainingTask previousTask, TrainingTask updatedTask) {
if (schoolClassMapper == null || trainingTaskClassConfigMapper == null
|| StringUtils.equals(previousSteps, updatedSteps)) {
|| previousTask == null || updatedTask == null) {
return;
}
SchoolClassExample example = new SchoolClassExample();
@ -511,18 +510,57 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
continue;
}
TrainingTaskClassConfig classTask = trainingTaskClassConfigMapper.selectByTeachingClassAndTaskKey(
teachingClass.getSchoolClassId(), taskKey);
if (classTask == null || !StringUtils.equals(previousSteps, classTask.getSteps())) {
teachingClass.getSchoolClassId(), previousTask.getTaskKey());
if (classTask == null) {
continue;
}
TrainingTaskClassConfig update = new TrainingTaskClassConfig();
update.setId(classTask.getId());
update.setSteps(updatedSteps);
update.setUpdateTime(new Date());
trainingTaskClassConfigMapper.updateByPrimaryKeySelective(update);
boolean changed = false;
if (shouldSynchronize(classTask.getTaskName(), previousTask.getTaskName(), updatedTask.getTaskName())) {
update.setTaskName(updatedTask.getTaskName());
changed = true;
}
if (shouldSynchronize(classTask.getKnowledge(), previousTask.getKnowledge(), updatedTask.getKnowledge())) {
update.setKnowledge(updatedTask.getKnowledge());
changed = true;
}
if (shouldSynchronize(classTask.getBackground(), previousTask.getBackground(), updatedTask.getBackground())) {
update.setBackground(updatedTask.getBackground());
changed = true;
}
if (shouldSynchronize(classTask.getObjectives(), previousTask.getObjectives(), updatedTask.getObjectives())) {
update.setObjectives(updatedTask.getObjectives());
changed = true;
}
if (shouldSynchronize(classTask.getRequirements(), previousTask.getRequirements(), updatedTask.getRequirements())) {
update.setRequirements(updatedTask.getRequirements());
changed = true;
}
if (shouldSynchronize(classTask.getSteps(), previousTask.getSteps(), updatedTask.getSteps())) {
update.setSteps(updatedTask.getSteps());
changed = true;
}
if (shouldSynchronize(classTask.getMaterialName(), previousTask.getMaterialName(), updatedTask.getMaterialName())) {
update.setMaterialName(updatedTask.getMaterialName());
changed = true;
}
if (shouldSynchronize(classTask.getMaterialUrl(), previousTask.getMaterialUrl(), updatedTask.getMaterialUrl())) {
update.setMaterialUrl(updatedTask.getMaterialUrl());
changed = true;
}
if (changed) {
update.setUpdateTime(new Date());
trainingTaskClassConfigMapper.updateByPrimaryKeySelective(update);
}
}
}
private boolean shouldSynchronize(String classValue, String previousDefaultValue, String updatedDefaultValue) {
return StringUtils.equals(StringUtils.defaultString(classValue), StringUtils.defaultString(previousDefaultValue))
&& !StringUtils.equals(StringUtils.defaultString(previousDefaultValue), StringUtils.defaultString(updatedDefaultValue));
}
private String resolveClassTaskCreator(String teachingClassId, String operatorId) {
if (StringUtils.isNotBlank(operatorId)) {
return operatorId;

@ -141,13 +141,19 @@ class TrainingTaskServiceImplTest {
}
@Test
void updateTaskSynchronizesOnlyClassStepsStillMatchingThePreviousGlobalConfiguration() {
void updateTaskSynchronizesOnlyClassFieldsStillMatchingThePreviousGlobalConfiguration() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();
service.trainingTaskMapper = mock(TrainingTaskMapper.class);
service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class);
service.schoolClassMapper = mock(SchoolClassMapper.class);
TrainingTask stored = storedTask("task-1", "new-product-survey");
stored.setKnowledge("Original knowledge");
stored.setBackground("Original background");
stored.setObjectives("[\"Original goal\"]");
stored.setRequirements("Original requirements");
stored.setMaterialName("original.pdf");
stored.setMaterialUrl("/file/original.pdf");
when(service.trainingTaskMapper.selectByPrimaryKey("task-1")).thenReturn(stored);
SchoolClass defaultClass = teachingClass("class-default", "teacher-1");
@ -155,9 +161,23 @@ class TrainingTaskServiceImplTest {
when(service.schoolClassMapper.selectByExample(any())).thenReturn(List.of(defaultClass, customizedClass));
TrainingTaskClassConfig defaultConfig = overrideTask("config-default", "class-default", "new-product-survey");
defaultConfig.setTaskName("Original Name");
defaultConfig.setKnowledge("Original knowledge");
defaultConfig.setBackground("Original background");
defaultConfig.setObjectives("[\"Original goal\"]");
defaultConfig.setRequirements("Original requirements");
defaultConfig.setSteps("[\"Step 1\",\"Step 2\",\"Step 3\",\"Step 4\"]");
defaultConfig.setMaterialName("original.pdf");
defaultConfig.setMaterialUrl("/file/original.pdf");
TrainingTaskClassConfig customizedConfig = overrideTask("config-customized", "class-customized", "new-product-survey");
customizedConfig.setTaskName("Original Name");
customizedConfig.setKnowledge("Original knowledge");
customizedConfig.setBackground("Teacher background");
customizedConfig.setObjectives("[\"Original goal\"]");
customizedConfig.setRequirements("Original requirements");
customizedConfig.setSteps("[\"Teacher Step\"]");
customizedConfig.setMaterialName("original.pdf");
customizedConfig.setMaterialUrl("/file/original.pdf");
when(service.trainingTaskClassConfigMapper.selectByTeachingClassAndTaskKey("class-default", "new-product-survey"))
.thenReturn(defaultConfig);
when(service.trainingTaskClassConfigMapper.selectByTeachingClassAndTaskKey("class-customized", "new-product-survey"))
@ -167,14 +187,36 @@ class TrainingTaskServiceImplTest {
payload.setProjectName("Foundation");
payload.setTaskKey("new-product-survey");
payload.setTaskName("Admin Updated Name");
payload.setKnowledge("Admin updated knowledge");
payload.setBackground("Admin updated background");
payload.setObjectives("[\"Admin updated goal\"]");
payload.setRequirements("Admin updated requirements");
payload.setSteps("[\"Admin Step 1\",\"Admin Step 2\"]");
payload.setMaterialName("admin.pdf");
payload.setMaterialUrl("/file/admin.pdf");
service.update("task-1", payload);
ArgumentCaptor<TrainingTaskClassConfig> captor = ArgumentCaptor.forClass(TrainingTaskClassConfig.class);
verify(service.trainingTaskClassConfigMapper).updateByPrimaryKeySelective(captor.capture());
assertEquals("config-default", captor.getValue().getId());
assertTrue(captor.getValue().getSteps().contains("Admin Step 1"));
verify(service.trainingTaskClassConfigMapper, times(2)).updateByPrimaryKeySelective(captor.capture());
TrainingTaskClassConfig defaultUpdate = captor.getAllValues().stream()
.filter(update -> "config-default".equals(update.getId()))
.findFirst()
.orElseThrow(AssertionError::new);
assertEquals("Admin Updated Name", defaultUpdate.getTaskName());
assertEquals("Admin updated background", defaultUpdate.getBackground());
assertEquals("Admin updated requirements", defaultUpdate.getRequirements());
assertTrue(defaultUpdate.getSteps().contains("Admin Step 1"));
assertEquals("admin.pdf", defaultUpdate.getMaterialName());
TrainingTaskClassConfig customizedUpdate = captor.getAllValues().stream()
.filter(update -> "config-customized".equals(update.getId()))
.findFirst()
.orElseThrow(AssertionError::new);
assertEquals("Admin Updated Name", customizedUpdate.getTaskName());
assertEquals(null, customizedUpdate.getBackground());
assertEquals(null, customizedUpdate.getSteps());
assertEquals("admin.pdf", customizedUpdate.getMaterialName());
}
@Test

Loading…
Cancel
Save