diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java index 85593bb82..0f1a58e64 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -79,4 +80,15 @@ public class TrainClassroomInfoController extends BaseController trainClassroomInfo.setUpdateBy(SecurityUtils.getUsername()); return toAjax(trainClassroomInfoService.updateTrainClassroomInfo(trainClassroomInfo)); } + + /** + * 删除教室信息 + */ + @PreAuthorize("@ss.hasPermi('train:classroom:remove')") + @Log(title = "教室信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{classRoomIds}") + public AjaxResult remove(@PathVariable String[] classRoomIds) + { + return toAjax(trainClassroomInfoService.deleteTrainClassroomInfoByClassRoomIds(classRoomIds)); + } } diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainCourseController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainCourseController.java index e27f40ccc..f606478e3 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainCourseController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainCourseController.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -103,4 +104,15 @@ public class TrainCourseController extends BaseController } return toAjax(trainCourseService.updateTrainCourse(trainCourse)); } + + /** + * 删除课程信息 + */ + @PreAuthorize("@ss.hasPermi('train:course:remove')") + @Log(title = "课程信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{cIds}") + public AjaxResult remove(@PathVariable String[] cIds) + { + return toAjax(trainCourseService.deleteTrainCourseByCIds(cIds)); + } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainLessonMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainLessonMapper.java index a8aa40585..13686f494 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainLessonMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainLessonMapper.java @@ -142,4 +142,12 @@ public interface TrainLessonMapper */ List selectPlansByTeacherId(@Param("tId") String tId, @Param("planStatus") Integer planStatus); + + /** + * 统计指定教室在排课课次中的引用数(train_lesson)。 + * + * @param classRoomId 教室ID + * @return 课次引用数 + */ + int countLessonsByClassRoomId(@Param("classRoomId") String classRoomId); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainPlanCourseMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainPlanCourseMapper.java index f2bc65b70..816a36f22 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainPlanCourseMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainPlanCourseMapper.java @@ -77,12 +77,17 @@ public interface TrainPlanCourseMapper * @return 引用成绩项目数 */ int countScoreItemsByPlanCourseId(@Param("planCourseId") Long planCourseId); - /** - * 统计指定本期课程关联的外部学习记录数(train_study_duration 下游引用)。 - * * @param planCourseId 本期课程ID * @return 引用学习记录数 */ int countStudyDurationsByPlanCourseId(@Param("planCourseId") Long planCourseId); + + /** + * 统计指定公共课程在开班计划中的引用数(train_plan_course)。 + * + * @param cId 公共课程ID + * @return 引用数 + */ + int countPlanCoursesByCId(@Param("cId") String cId); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java index 988a49b2b..35220f9c3 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java @@ -14,6 +14,7 @@ import com.ruoyi.train.domain.vo.ClassroomBoardSummaryVO; import com.ruoyi.train.domain.vo.ClassroomDetailVO; import com.ruoyi.train.mapper.TrainClassroomInfoMapper; import com.ruoyi.train.mapper.TrainElectronicBoardMapper; +import com.ruoyi.train.mapper.TrainLessonMapper; import com.ruoyi.train.service.ITrainClassroomInfoService; /** @@ -31,6 +32,9 @@ public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService @Autowired private TrainElectronicBoardMapper trainElectronicBoardMapper; + @Autowired + private TrainLessonMapper trainLessonMapper; + /** * 查询教室详情(供API详情接口使用,聚合班牌轻量摘要列表,0..N语义) * @@ -184,7 +188,15 @@ public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService @Override public int deleteTrainClassroomInfoByClassRoomIds(String[] classRoomIds) { - return trainClassroomInfoMapper.deleteTrainClassroomInfoByClassRoomIds(classRoomIds); + if (classRoomIds == null || classRoomIds.length == 0) + { + return 0; + } + for (String id : classRoomIds) + { + deleteTrainClassroomInfoByClassRoomId(id); + } + return classRoomIds.length; } /** @@ -196,6 +208,11 @@ public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService @Override public int deleteTrainClassroomInfoByClassRoomId(String classRoomId) { + int lessonCount = trainLessonMapper.countLessonsByClassRoomId(classRoomId); + if (lessonCount > 0) + { + throw new ServiceException("该教室已在排课课次中使用,无法删除,可通过状态调整为维护中或停用。"); + } return trainClassroomInfoMapper.deleteTrainClassroomInfoByClassRoomId(classRoomId); } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainCourseServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainCourseServiceImpl.java index dc4622212..b9a3c616a 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainCourseServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainCourseServiceImpl.java @@ -9,7 +9,10 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.train.mapper.TrainCourseMapper; +import com.ruoyi.train.mapper.TrainPlanCourseMapper; +import com.ruoyi.train.mapper.TrainScoreInfoMapper; import com.ruoyi.train.domain.TrainCourse; +import com.ruoyi.train.domain.TrainScoreInfo; import com.ruoyi.train.domain.vo.CourseDetailVO; import com.ruoyi.train.service.ITrainCourseService; @@ -25,6 +28,12 @@ public class TrainCourseServiceImpl implements ITrainCourseService @Autowired private TrainCourseMapper trainCourseMapper; + @Autowired + private TrainPlanCourseMapper trainPlanCourseMapper; + + @Autowired + private TrainScoreInfoMapper trainScoreInfoMapper; + /** * 查询课程详情视图 (CourseDetailVO) * @@ -214,11 +223,19 @@ public class TrainCourseServiceImpl implements ITrainCourseService @Override public int deleteTrainCourseByCIds(String[] cIds) { - return trainCourseMapper.deleteTrainCourseByCIds(cIds); + if (cIds == null || cIds.length == 0) + { + return 0; + } + for (String cId : cIds) + { + deleteTrainCourseByCId(cId); + } + return cIds.length; } /** - * 删除课程信息信息 + * 删除课程信息 * * @param cId 课程信息主键 * @return 结果 @@ -226,6 +243,20 @@ public class TrainCourseServiceImpl implements ITrainCourseService @Override public int deleteTrainCourseByCId(String cId) { + // 1. 检查是否已被开班计划引用 + int planRef = trainPlanCourseMapper.countPlanCoursesByCId(cId); + if (planRef > 0) + { + throw new ServiceException("该课程已被培训计划引用,无法删除,可将其停用。"); + } + // 2. 检查是否已产生学员成绩记录 + TrainScoreInfo scoreQuery = new TrainScoreInfo(); + scoreQuery.setcId(cId); + List scoreList = trainScoreInfoMapper.selectTrainScoreInfoList(scoreQuery); + if (scoreList != null && !scoreList.isEmpty()) + { + throw new ServiceException("该课程已产生学员成绩记录,无法删除,可将其停用。"); + } return trainCourseMapper.deleteTrainCourseByCId(cId); } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainLessonMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainLessonMapper.xml index 91fe8e4fb..526a2ad8a 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainLessonMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainLessonMapper.xml @@ -386,4 +386,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by p.start_time desc + + diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainPlanCourseMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainPlanCourseMapper.xml index a7a2bec3e..fe34edceb 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainPlanCourseMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainPlanCourseMapper.xml @@ -118,4 +118,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select count(*) from train_study_duration where plan_course_id = #{planCourseId} + +