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 2d777e7..e187702 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 @@ -45,6 +45,11 @@ public class PgSchool extends BaseEntity { private String tenantId; + /** + * 关联部门ID + */ + private Long deptId; + @TableLogic private String delFlag; diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java index 6d6e32a..83a3613 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java @@ -31,6 +31,11 @@ public class PgSchoolClass implements Serializable { private String tenantId; + /** + * 关联部门ID(数据权限用) + */ + private Long deptId; + private Long createBy; private Date createTime; diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java index 0d7d73f..420f82c 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java @@ -27,6 +27,11 @@ public class PgSchoolGrade implements Serializable { private String tenantId; + /** + * 关联部门ID(数据权限用) + */ + private Long deptId; + private Long createBy; private Date createTime; diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java index cb60821..98fe9f7 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java @@ -1,12 +1,30 @@ package org.dromara.pangu.school.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.pangu.school.domain.PgSchoolClass; +import java.util.List; + /** * 学校班级 Mapper 接口 * * @author pangu */ public interface PgSchoolClassMapper extends BaseMapperPlus { + + /** + * 查询学校班级列表(带数据权限) + * + * @param queryWrapper 查询条件 + * @return 学校班级列表 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + default List selectClassList(Wrapper queryWrapper) { + return this.selectList(queryWrapper); + } } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java index cd71d1f..52ad1ad 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java @@ -1,12 +1,30 @@ package org.dromara.pangu.school.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.pangu.school.domain.PgSchoolGrade; +import java.util.List; + /** * 学校年级关联 Mapper 接口 * * @author pangu */ public interface PgSchoolGradeMapper extends BaseMapperPlus { + + /** + * 查询学校年级列表(带数据权限) + * + * @param queryWrapper 查询条件 + * @return 学校年级列表 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + default List selectGradeList(Wrapper queryWrapper) { + return this.selectList(queryWrapper); + } } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java index 0633992..16fda13 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java @@ -1,12 +1,45 @@ package org.dromara.pangu.school.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.pangu.school.domain.PgSchool; +import java.util.List; + /** * 学校 Mapper 接口 * * @author pangu */ public interface PgSchoolMapper extends BaseMapperPlus { + + /** + * 查询学校列表(带数据权限) + * + * @param queryWrapper 查询条件 + * @return 学校列表 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + default List selectSchoolList(Wrapper queryWrapper) { + return this.selectList(queryWrapper); + } + + /** + * 分页查询学校列表(带数据权限) + * + * @param page 分页信息 + * @param queryWrapper 查询条件 + * @return 学校分页列表 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + default Page selectPageSchoolList(Page page, Wrapper queryWrapper) { + return this.selectPage(page, queryWrapper); + } } 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 bbb7dfa..1715bb4 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 @@ -21,6 +21,8 @@ import org.dromara.pangu.school.mapper.PgSchoolGradeMapper; import org.dromara.pangu.school.mapper.PgSchoolMapper; import org.dromara.pangu.school.service.IPgSchoolService; import org.dromara.common.core.service.UserService; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.service.ISysDeptService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,6 +46,7 @@ public class PgSchoolServiceImpl implements IPgSchoolService { private final PgClassMapper classMapper; private final PgRegionMapper regionMapper; private final UserService userService; + private final ISysDeptService deptService; @Override public TableDataInfo selectPageList(PgSchool school, PageQuery pageQuery) { @@ -94,10 +97,26 @@ public class PgSchoolServiceImpl implements IPgSchoolService { } @Override + @Transactional(rollbackFor = Exception.class) public int insert(PgSchool school) { // 自动生成学校编码 String schoolCode = generateSchoolCode(); school.setSchoolCode(schoolCode); + + // 如果传入了上级部门ID,自动创建学校对应的部门节点 + if (school.getDeptId() != null) { + Long parentDeptId = school.getDeptId(); + SysDeptBo deptBo = new SysDeptBo(); + deptBo.setParentId(parentDeptId); + deptBo.setDeptName(school.getSchoolName()); + deptBo.setDeptCategory("school"); // 标记为学校类型 + deptBo.setOrderNum(0); + deptBo.setStatus("0"); // 正常状态 + deptService.insertDept(deptBo); + // 获取新创建的部门ID + school.setDeptId(deptBo.getDeptId()); + } + return baseMapper.insert(school); } @@ -123,7 +142,19 @@ public class PgSchoolServiceImpl implements IPgSchoolService { } @Override + @Transactional(rollbackFor = Exception.class) public int update(PgSchool school) { + // 如果学校有关联的部门,同步更新部门名称 + PgSchool existSchool = baseMapper.selectById(school.getSchoolId()); + if (existSchool != null && existSchool.getDeptId() != null) { + // 检查学校名称是否变化 + if (school.getSchoolName() != null && !school.getSchoolName().equals(existSchool.getSchoolName())) { + SysDeptBo deptBo = new SysDeptBo(); + deptBo.setDeptId(existSchool.getDeptId()); + deptBo.setDeptName(school.getSchoolName()); + deptService.updateDept(deptBo); + } + } return baseMapper.updateById(school); } @@ -133,6 +164,9 @@ public class PgSchoolServiceImpl implements IPgSchoolService { for (Long schoolId : schoolIds) { // TODO: 检查是否被学生信息引用(学生管理模块完成后添加),有则不允许删除 + // 查询学校信息,获取关联的部门ID + PgSchool school = baseMapper.selectById(schoolId); + // 级联删除:先删除学校下的所有班级和年级 List grades = schoolGradeMapper.selectList( new LambdaQueryWrapper().eq(PgSchoolGrade::getSchoolId, schoolId) @@ -147,6 +181,15 @@ public class PgSchoolServiceImpl implements IPgSchoolService { schoolGradeMapper.delete( new LambdaQueryWrapper().eq(PgSchoolGrade::getSchoolId, schoolId) ); + + // 删除关联的部门节点 + if (school != null && school.getDeptId() != null) { + try { + deptService.deleteDeptById(school.getDeptId()); + } catch (Exception e) { + // 忽略部门删除失败(可能部门下有用户) + } + } } return baseMapper.deleteByIds(Arrays.asList(schoolIds)); } diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java index 3856272..05b8903 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java @@ -48,6 +48,11 @@ public class PgStudent extends BaseEntity { private String tenantId; + /** + * 关联部门ID(数据权限用) + */ + private Long deptId; + @TableLogic private String delFlag; diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java index 25c74b4..ec16114 100644 --- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java +++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java @@ -1,12 +1,45 @@ package org.dromara.pangu.student.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.pangu.student.domain.PgStudent; +import java.util.List; + /** * 学生 Mapper 接口 * * @author pangu */ public interface PgStudentMapper extends BaseMapperPlus { + + /** + * 查询学生列表(带数据权限) + * + * @param queryWrapper 查询条件 + * @return 学生列表 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + default List selectStudentList(Wrapper queryWrapper) { + return this.selectList(queryWrapper); + } + + /** + * 分页查询学生列表(带数据权限) + * + * @param page 分页信息 + * @param queryWrapper 查询条件 + * @return 学生分页列表 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + default Page selectPageStudentList(Page page, Wrapper queryWrapper) { + return this.selectPage(page, queryWrapper); + } } diff --git a/backend/sql/school_dept_permission.sql b/backend/sql/school_dept_permission.sql new file mode 100644 index 0000000..8fd461b --- /dev/null +++ b/backend/sql/school_dept_permission.sql @@ -0,0 +1,16 @@ +-- ============================================================ +-- 脚本名称:school_dept_permission.sql +-- 功能说明:学校数据权限支持 - 增加部门关联字段 +-- 作 者:pangu +-- 创建时间:2026-02-03 +-- ============================================================ + +-- 1. pg_school 表增加 dept_id 字段 +ALTER TABLE pg_school ADD COLUMN dept_id BIGINT COMMENT '关联部门ID'; +CREATE INDEX idx_school_dept ON pg_school(dept_id); + +-- 2. 查看现有学校数据 +SELECT school_id, school_name, school_code FROM pg_school; + +-- 3. 查看现有部门数据 +SELECT dept_id, parent_id, dept_name, ancestors FROM sys_dept; diff --git a/frontend/src/views/business/school/components/SchoolDialog.vue b/frontend/src/views/business/school/components/SchoolDialog.vue index a59c058..afdb945 100644 --- a/frontend/src/views/business/school/components/SchoolDialog.vue +++ b/frontend/src/views/business/school/components/SchoolDialog.vue @@ -27,6 +27,17 @@ + + + { } } +// 加载部门树 +const loadDeptTree = async () => { + try { + const res = await deptTreeSelect() + if (res.code === 200) { + deptTree.value = res.data + } + } catch (error) { + console.error('加载部门树失败:', error) + } +} + // 打开弹窗 // row: 编辑时传入学校数据,新增时为null // defaultRegionId: 新增时默认选中的区域ID(从列表页带入) -const open = (row, defaultRegionId = null) => { +const open = async (row, defaultRegionId = null) => { dialogVisible.value = true isEdit.value = !!row + // 加载部门树 + await loadDeptTree() + if (row) { // 编辑模式:回显数据 form.value = { @@ -154,6 +188,7 @@ const open = (row, defaultRegionId = null) => { schoolCode: row.schoolCode || '', schoolName: row.schoolName, schoolType: row.schoolType, + deptId: row.deptId, regionId: row.regionId, regionIds: getRegionIdPath(row.regionId), regionName: row.regionName, @@ -167,6 +202,7 @@ const open = (row, defaultRegionId = null) => { schoolCode: '', schoolName: '', schoolType: '', + deptId: null, regionId: defaultRegionId, regionIds: regionIds, regionName: defaultRegionId ? getRegionPath(regionIds, props.regionTree) : '', diff --git a/frontend/src/views/system/user/index.vue b/frontend/src/views/system/user/index.vue index 42e5e3e..69fb87a 100644 --- a/frontend/src/views/system/user/index.vue +++ b/frontend/src/views/system/user/index.vue @@ -61,7 +61,7 @@ - +