fix: sync admin task steps to student classes

main
陈沅 6 days ago
parent d70eae296c
commit 7a8e5a6b26

@ -108,12 +108,14 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public TrainingTask update(String id, TrainingTask task) { public TrainingTask update(String id, TrainingTask task) {
ensureTrainingTaskTable(); ensureTrainingTaskTable();
TrainingTask existing = trainingTaskMapper.selectByPrimaryKey(id); TrainingTask existing = trainingTaskMapper.selectByPrimaryKey(id);
if (existing == null) { if (existing == null) {
throw new IllegalArgumentException("实训任务不存在"); throw new IllegalArgumentException("实训任务不存在");
} }
String previousSteps = existing.getSteps();
normalizeTask(task); normalizeTask(task);
TrainingTask builtInTask = requireBuiltInTask(existing.getTaskKey()); TrainingTask builtInTask = requireBuiltInTask(existing.getTaskKey());
task.setId(id); task.setId(id);
@ -124,6 +126,7 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
task.setSteps(normalizeSteps(task.getSteps(), builtInTask)); task.setSteps(normalizeSteps(task.getSteps(), builtInTask));
task.setUpdateTime(new Date()); task.setUpdateTime(new Date());
trainingTaskMapper.updateByPrimaryKeySelective(task); trainingTaskMapper.updateByPrimaryKeySelective(task);
synchronizeClassTaskSteps(existing.getTaskKey(), previousSteps, task.getSteps());
return trainingTaskMapper.selectByPrimaryKey(id); return trainingTaskMapper.selectByPrimaryKey(id);
} }
@ -492,6 +495,34 @@ public class TrainingTaskServiceImpl implements TrainingTaskService {
} }
} }
private void synchronizeClassTaskSteps(String taskKey, String previousSteps, String updatedSteps) {
if (schoolClassMapper == null || trainingTaskClassConfigMapper == null
|| StringUtils.equals(previousSteps, updatedSteps)) {
return;
}
SchoolClassExample example = new SchoolClassExample();
example.createCriteria().andClassTypeEqualTo("TEACHING");
List<SchoolClass> teachingClasses = schoolClassMapper.selectByExample(example);
if (teachingClasses == null || teachingClasses.isEmpty()) {
return;
}
for (SchoolClass teachingClass : teachingClasses) {
if (teachingClass == null || StringUtils.isBlank(teachingClass.getSchoolClassId())) {
continue;
}
TrainingTaskClassConfig classTask = trainingTaskClassConfigMapper.selectByTeachingClassAndTaskKey(
teachingClass.getSchoolClassId(), taskKey);
if (classTask == null || !StringUtils.equals(previousSteps, classTask.getSteps())) {
continue;
}
TrainingTaskClassConfig update = new TrainingTaskClassConfig();
update.setId(classTask.getId());
update.setSteps(updatedSteps);
update.setUpdateTime(new Date());
trainingTaskClassConfigMapper.updateByPrimaryKeySelective(update);
}
}
private String resolveClassTaskCreator(String teachingClassId, String operatorId) { private String resolveClassTaskCreator(String teachingClassId, String operatorId) {
if (StringUtils.isNotBlank(operatorId)) { if (StringUtils.isNotBlank(operatorId)) {
return operatorId; return operatorId;

@ -140,6 +140,43 @@ class TrainingTaskServiceImplTest {
assertTrue(captor.getValue().getSteps().contains("Custom Step")); assertTrue(captor.getValue().getSteps().contains("Custom Step"));
} }
@Test
void updateTaskSynchronizesOnlyClassStepsStillMatchingThePreviousGlobalConfiguration() {
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");
when(service.trainingTaskMapper.selectByPrimaryKey("task-1")).thenReturn(stored);
SchoolClass defaultClass = teachingClass("class-default", "teacher-1");
SchoolClass customizedClass = teachingClass("class-customized", "teacher-2");
when(service.schoolClassMapper.selectByExample(any())).thenReturn(List.of(defaultClass, customizedClass));
TrainingTaskClassConfig defaultConfig = overrideTask("config-default", "class-default", "new-product-survey");
defaultConfig.setSteps("[\"Step 1\",\"Step 2\",\"Step 3\",\"Step 4\"]");
TrainingTaskClassConfig customizedConfig = overrideTask("config-customized", "class-customized", "new-product-survey");
customizedConfig.setSteps("[\"Teacher Step\"]");
when(service.trainingTaskClassConfigMapper.selectByTeachingClassAndTaskKey("class-default", "new-product-survey"))
.thenReturn(defaultConfig);
when(service.trainingTaskClassConfigMapper.selectByTeachingClassAndTaskKey("class-customized", "new-product-survey"))
.thenReturn(customizedConfig);
TrainingTask payload = new TrainingTask();
payload.setProjectName("Foundation");
payload.setTaskKey("new-product-survey");
payload.setTaskName("Admin Updated Name");
payload.setSteps("[\"Admin Step 1\",\"Admin Step 2\"]");
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"));
}
@Test @Test
void createRejectsUnknownTaskKeyBecauseTaskCountIsFixed() { void createRejectsUnknownTaskKeyBecauseTaskCountIsFixed() {
TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); TrainingTaskServiceImpl service = new TrainingTaskServiceImpl();

Loading…
Cancel
Save