From add00c999265018621fcc89b3127f534c7006e60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=9E=E7=A0=81-=E6=96=B9=E6=99=93=E8=BE=89?= Date: Thu, 5 Feb 2026 11:21:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=A6=E6=A0=A1?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=B7=BB=E5=8A=A0=E5=B9=B4=E7=BA=A7=20+=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8C=BA=E5=9F=9F=E5=B1=82=E7=BA=A7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=20+=20=E6=B8=85=E7=90=86=E5=8C=BA=E5=9F=9F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增学校时根据学段自动添加对应年级 2. 修复选择省/市时无法显示学校的bug(支持区域层级查询) 3. 区域树默认展开湖北省,平行显示市级 4. 新增区域数据清理SQL脚本(仅保留湖北省) --- .../base/controller/PgGradeController.java | 11 ++- .../pangu/base/service/IPgGradeService.java | 6 ++ .../base/service/impl/PgGradeServiceImpl.java | 13 +++ .../dromara/pangu/school/domain/PgSchool.java | 6 ++ .../service/impl/PgSchoolServiceImpl.java | 39 +++++++- .../school/components/SchoolDialog.vue | 97 ++++++++++++++++++- frontend/src/views/business/school/index.vue | 3 + scripts/sql/V1.0.5__clean_region_data.sql | 30 ++++++ 8 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 scripts/sql/V1.0.5__clean_region_data.sql diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java index c30c462..974a7ba 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java @@ -1,6 +1,7 @@ package org.dromara.pangu.base.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.log.annotation.Log; @@ -13,6 +14,7 @@ import org.dromara.pangu.base.service.IPgGradeService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; /** @@ -39,9 +41,16 @@ public class PgGradeController extends BaseController { /** * 查询年级列表(不分页) + * @param grade 查询条件 + * @param stages 学段列表,逗号分隔(如:1,2 表示小学和初中) */ @GetMapping("/listAll") - public R> listAll(PgGrade grade) { + public R> listAll(PgGrade grade, + @RequestParam(required = false) String stages) { + if (StrUtil.isNotBlank(stages)) { + List stageList = Arrays.asList(stages.split(",")); + return R.ok(gradeService.selectListByStages(stageList)); + } return R.ok(gradeService.selectList(grade)); } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java index 254cbc2..44f4298 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java @@ -42,4 +42,10 @@ public interface IPgGradeService { * 批量删除年级 */ int deleteByIds(Long[] gradeIds); + + /** + * 根据学段列表查询年级 + * @param stages 学段列表(1小学 2初中 3高中 4中专 5大学) + */ + List selectListByStages(List stages); } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java index d004276..69d2cb8 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java @@ -57,6 +57,19 @@ public class PgGradeServiceImpl implements IPgGradeService { return baseMapper.deleteByIds(Arrays.asList(gradeIds)); } + @Override + public List selectListByStages(List stages) { + if (stages == null || stages.isEmpty()) { + return List.of(); + } + return baseMapper.selectList( + new LambdaQueryWrapper() + .in(PgGrade::getStage, stages) + .eq(PgGrade::getStatus, "0") + .orderByAsc(PgGrade::getOrderNum) + ); + } + private LambdaQueryWrapper buildQueryWrapper(PgGrade grade) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.like(StrUtil.isNotBlank(grade.getGradeName()), PgGrade::getGradeName, grade.getGradeName()); diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java index e187702..40b2f67 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java @@ -60,4 +60,10 @@ public class PgSchool extends BaseEntity { */ @TableField(exist = false) private String regionName; + + /** + * 初始年级ID列表(非数据库字段,用于新增时批量添加年级) + */ + @TableField(exist = false) + private java.util.List gradeIds; } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java index 95ea275..20e2e15 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java @@ -119,7 +119,14 @@ public class PgSchoolServiceImpl implements IPgSchoolService { school.setDeptId(deptBo.getDeptId()); } - return baseMapper.insert(school); + int result = baseMapper.insert(school); + + // 如果传入了初始年级ID列表,批量添加到学校 + if (school.getGradeIds() != null && !school.getGradeIds().isEmpty()) { + addSchoolGrades(school.getSchoolId(), school.getGradeIds()); + } + + return result; } /** @@ -295,11 +302,39 @@ public class PgSchoolServiceImpl implements IPgSchoolService { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.like(StrUtil.isNotBlank(school.getSchoolName()), PgSchool::getSchoolName, school.getSchoolName()); lqw.eq(StrUtil.isNotBlank(school.getSchoolType()), PgSchool::getSchoolType, school.getSchoolType()); - lqw.eq(school.getRegionId() != null, PgSchool::getRegionId, school.getRegionId()); + + // 区域查询:支持查询选定区域及其所有下级区域的学校 + if (school.getRegionId() != null) { + List regionIds = getRegionIdsWithChildren(school.getRegionId()); + if (!regionIds.isEmpty()) { + lqw.in(PgSchool::getRegionId, regionIds); + } + } + lqw.eq(StrUtil.isNotBlank(school.getStatus()), PgSchool::getStatus, school.getStatus()); return lqw; } + /** + * 获取指定区域及其所有下级区域的ID列表 + * @param regionId 区域ID + * @return 包含该区域及所有下级区域的ID列表 + */ + private List getRegionIdsWithChildren(Long regionId) { + List result = new ArrayList<>(); + result.add(regionId); + + // 递归查询下级区域 + List children = regionMapper.selectList( + new LambdaQueryWrapper().eq(PgRegion::getParentId, regionId) + ); + for (PgRegion child : children) { + result.addAll(getRegionIdsWithChildren(child.getRegionId())); + } + + return result; + } + @Override public List selectSchoolTree(PgSchool school) { // 查询学校列表(使用带数据权限的查询方法) diff --git a/frontend/src/views/business/school/components/SchoolDialog.vue b/frontend/src/views/business/school/components/SchoolDialog.vue index afdb945..4cbf912 100644 --- a/frontend/src/views/business/school/components/SchoolDialog.vue +++ b/frontend/src/views/business/school/components/SchoolDialog.vue @@ -63,6 +63,26 @@ inactive-text="停用" /> + + +
+ + + {{ grade.gradeName }} + + +
+ + 已选择 {{ selectedGradeIds.length }} 个年级,将在学校创建后自动添加 + +
+
+