diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImpl.java index a220c0a..2f7315d 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImpl.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImpl.java @@ -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; diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImplTest.java index d73d364..dd99a80 100644 --- a/src/test/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImplTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImplTest.java @@ -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 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