From 885dd604d79e1ede053a5238b93500c605b75d46 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Thu, 30 Jul 2026 13:58:44 +0800 Subject: [PATCH] feat: restore class training task defaults --- .../mapper/TrainingTaskClassConfigMapper.java | 5 ++ .../service/TrainingTaskService.java | 4 ++ .../service/impl/TrainingTaskServiceImpl.java | 15 ++++++ .../mappers/TrainingTaskClassConfigMapper.xml | 11 +++++ .../impl/TrainingTaskServiceImplTest.java | 49 +++++++++++++++++++ 5 files changed, 84 insertions(+) diff --git a/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java b/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java index b6a5944..aabd4f0 100644 --- a/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java +++ b/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java @@ -19,4 +19,9 @@ public interface TrainingTaskClassConfigMapper { List selectListByTeachingClass(@Param("teachingClassId") String teachingClassId, @Param("enabled") Boolean enabled); + + int deleteByTeachingClassAndTaskKey(@Param("teachingClassId") String teachingClassId, + @Param("taskKey") String taskKey); + + int deleteByTeachingClass(@Param("teachingClassId") String teachingClassId); } diff --git a/src/main/java/com/sztzjy/linkCommerce/service/TrainingTaskService.java b/src/main/java/com/sztzjy/linkCommerce/service/TrainingTaskService.java index 4948949..1561442 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/TrainingTaskService.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/TrainingTaskService.java @@ -32,6 +32,10 @@ public interface TrainingTaskService { TrainingTask saveClassTask(String teachingClassId, String taskKey, TrainingTask task, String operatorId); + void restoreClassTaskDefault(String teachingClassId, String taskKey, String operatorId); + + void restoreClassTasksDefaults(String teachingClassId, String operatorId); + TrainingTask getStudentTaskByTaskKey(String taskKey, String studentUserId); List listForStudent(String studentUserId, Boolean enabledOnly); 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 50262fd..0956318 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImpl.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImpl.java @@ -249,6 +249,21 @@ public class TrainingTaskServiceImpl implements TrainingTaskService { return toTask(saved == null ? config : saved); } + @Override + @Transactional(rollbackFor = Exception.class) + public void restoreClassTaskDefault(String teachingClassId, String taskKey, String operatorId) { + requireOwnedTeachingClass(teachingClassId, operatorId); + trainingTaskClassConfigMapper.deleteByTeachingClassAndTaskKey( + StringUtils.trimToEmpty(teachingClassId), StringUtils.trimToEmpty(taskKey)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void restoreClassTasksDefaults(String teachingClassId, String operatorId) { + requireOwnedTeachingClass(teachingClassId, operatorId); + trainingTaskClassConfigMapper.deleteByTeachingClass(StringUtils.trimToEmpty(teachingClassId)); + } + @Override public TrainingTask getStudentTaskByTaskKey(String taskKey, String studentUserId) { ensureDefaultTasks(null); diff --git a/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml b/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml index 3b4ede9..42ee4f8 100644 --- a/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml +++ b/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml @@ -50,6 +50,17 @@ order by sort asc, create_time asc + + delete from training_task_class_config + where teaching_class_id = #{teachingClassId,jdbcType=VARCHAR} + and task_key = #{taskKey,jdbcType=VARCHAR} + + + + delete from training_task_class_config + where teaching_class_id = #{teachingClassId,jdbcType=VARCHAR} + + insert into training_task_class_config 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 aa1c597..9d8d94a 100644 --- a/src/test/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImplTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/TrainingTaskServiceImplTest.java @@ -22,12 +22,14 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.ArgumentMatchers.startsWith; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; class TrainingTaskServiceImplTest { @@ -302,6 +304,45 @@ class TrainingTaskServiceImplTest { assertThrows(IllegalArgumentException.class, () -> service.saveClassTask("class-2", "new-product-survey", task, "teacher-b")); } + @Test + void restoreClassTaskDefaultDeletesOnlySelectedClassTaskCopy() { + TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); + service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class); + service.schoolClassMapper = mock(SchoolClassMapper.class); + when(service.schoolClassMapper.selectByPrimaryKey("class-1")).thenReturn(teachingClass("class-1", "teacher-1")); + + service.restoreClassTaskDefault("class-1", "new-product-survey", "teacher-1"); + + verify(service.trainingTaskClassConfigMapper) + .deleteByTeachingClassAndTaskKey("class-1", "new-product-survey"); + verify(service.trainingTaskClassConfigMapper, never()).deleteByTeachingClass(anyString()); + } + + @Test + void restoreClassTasksDefaultsDeletesOnlySelectedClassCopies() { + TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); + service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class); + service.schoolClassMapper = mock(SchoolClassMapper.class); + when(service.schoolClassMapper.selectByPrimaryKey("class-1")).thenReturn(teachingClass("class-1", "teacher-1")); + + service.restoreClassTasksDefaults("class-1", "teacher-1"); + + verify(service.trainingTaskClassConfigMapper).deleteByTeachingClass("class-1"); + } + + @Test + void teacherCannotRestoreAnotherTeachersClass() { + TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); + service.trainingTaskClassConfigMapper = mock(TrainingTaskClassConfigMapper.class); + service.schoolClassMapper = mock(SchoolClassMapper.class); + when(service.schoolClassMapper.selectByPrimaryKey("class-2")).thenReturn(teachingClass("class-2", "teacher-a")); + + assertThrows(IllegalArgumentException.class, + () -> service.restoreClassTasksDefaults("class-2", "teacher-b")); + + verifyNoInteractions(service.trainingTaskClassConfigMapper); + } + @Test void saveClassTaskInsertsNewOverrideWhenNoneExists() { TrainingTaskServiceImpl service = new TrainingTaskServiceImpl(); @@ -430,6 +471,14 @@ class TrainingTaskServiceImplTest { return task; } + private SchoolClass teachingClass(String classId, String createdBy) { + SchoolClass schoolClass = new SchoolClass(); + schoolClass.setSchoolClassId(classId); + schoolClass.setClassType("TEACHING"); + schoolClass.setCreatedBy(createdBy); + return schoolClass; + } + private TrainingTaskClassConfig overrideTask(String id, String teachingClassId, String taskKey) { TrainingTaskClassConfig config = new TrainingTaskClassConfig(); config.setId(id);