wuzhen招生功能开发完成

This commit is contained in:
wuzhen committed 2025-07-22 18:03:39 +08:00
commit 7593904a79
113 files changed
+11596 -497

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
temp/
test/
@@ -1,2 +0,0 @@
# 学工管理模块 - 控制器层
# 此目录用于存放REST API控制器类
@@ -0,0 +1,114 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormAreaVo;
import org.dromara.xg.domain.bo.XgDormAreaBo;
import org.dromara.xg.domain.vo.TreeSelectVo;
import org.dromara.xg.service.IXgDormAreaService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 宿舍区信息
*
* @author zlwu
* @date 2025-07-20
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ssqxx/dormArea")
public class XgDormAreaController extends BaseController {
private final IXgDormAreaService xgDormAreaService;
/**
* 查询宿舍区信息列表
*/
@SaCheckPermission("ssqxx:dormArea:list")
@GetMapping("/list")
public TableDataInfo<XgDormAreaVo> list(XgDormAreaBo bo, PageQuery pageQuery) {
return xgDormAreaService.queryPageList(bo, pageQuery);
}
/**
* 导出宿舍区信息列表
*/
@SaCheckPermission("ssqxx:dormArea:export")
@Log(title = "宿舍区信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormAreaBo bo, HttpServletResponse response) {
List<XgDormAreaVo> list = xgDormAreaService.queryList(bo);
ExcelUtil.exportExcel(list, "宿舍区信息", XgDormAreaVo.class, response);
}
/**
* 获取宿舍区信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("ssqxx:dormArea:query")
@GetMapping("/{id}")
public R<XgDormAreaVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xgDormAreaService.queryById(id));
}
/**
* 新增宿舍区信息
*/
@SaCheckPermission("ssqxx:dormArea:add")
@Log(title = "宿舍区信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormAreaBo bo) {
return toAjax(xgDormAreaService.insertByBo(bo));
}
/**
* 修改宿舍区信息
*/
@SaCheckPermission("ssqxx:dormArea:edit")
@Log(title = "宿舍区信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormAreaBo bo) {
return toAjax(xgDormAreaService.updateByBo(bo));
}
/**
* 删除宿舍区信息
*
* @param ids 主键串
*/
@SaCheckPermission("ssqxx:dormArea:remove")
@Log(title = "宿舍区信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xgDormAreaService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 获取宿舍区树形结构数据
* 以校区为根节点,宿舍区为子节点
*/
@SaCheckPermission("ssqxx:dormArea:query")
@GetMapping("/tree")
public R<List<TreeSelectVo>> getAreaTree() {
return R.ok(xgDormAreaService.getAreaTree());
}
}
@@ -0,0 +1,115 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormBuildingVo;
import org.dromara.xg.domain.bo.XgDormBuildingBo;
import org.dromara.xg.domain.vo.BuildingTreeSelectVo;
import org.dromara.xg.service.IXgDormBuildingService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 宿舍楼信息
*
* @author zlwu
* @date 2025-07-20
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/sslxx/dormBuilding")
public class XgDormBuildingController extends BaseController {
private final IXgDormBuildingService xgDormBuildingService;
/**
* 查询宿舍楼信息列表
*/
@SaCheckPermission("sslxx:dormBuilding:list")
@GetMapping("/list")
public TableDataInfo<XgDormBuildingVo> list(XgDormBuildingBo bo, PageQuery pageQuery) {
return xgDormBuildingService.queryPageList(bo, pageQuery);
}
/**
* 导出宿舍楼信息列表
*/
@SaCheckPermission("sslxx:dormBuilding:export")
@Log(title = "宿舍楼信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormBuildingBo bo, HttpServletResponse response) {
List<XgDormBuildingVo> list = xgDormBuildingService.queryList(bo);
ExcelUtil.exportExcel(list, "宿舍楼信息", XgDormBuildingVo.class, response);
}
/**
* 获取宿舍楼信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("sslxx:dormBuilding:query")
@GetMapping("/{id}")
public R<XgDormBuildingVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xgDormBuildingService.queryById(id));
}
/**
* 新增宿舍楼信息
*/
@SaCheckPermission("sslxx:dormBuilding:add")
@Log(title = "宿舍楼信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormBuildingBo bo) {
return toAjax(xgDormBuildingService.insertByBo(bo));
}
/**
* 修改宿舍楼信息
*/
@SaCheckPermission("sslxx:dormBuilding:edit")
@Log(title = "宿舍楼信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormBuildingBo bo) {
return toAjax(xgDormBuildingService.updateByBo(bo));
}
/**
* 删除宿舍楼信息
*
* @param ids 主键串
*/
@SaCheckPermission("sslxx:dormBuilding:remove")
@Log(title = "宿舍楼信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xgDormBuildingService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 获取宿舍楼树形结构数据
* 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择
*/
@SaCheckPermission("sslxx:dormBuilding:list")
@GetMapping("/buildingTree")
public R<List<BuildingTreeSelectVo>> getBuildingTree() {
List<BuildingTreeSelectVo> treeData = xgDormBuildingService.getBuildingTreeData();
return R.ok(treeData);
}
}
@@ -0,0 +1,39 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.core.domain.R;
import org.dromara.xg.domain.vo.DormBuildingTreeVo;
import org.dromara.xg.domain.bo.DormBuildingTreeBo;
import org.dromara.xg.service.IXgDormBuildingTreeService;
/**
* 宿舍楼树形结构控制器
*
* @author wuzilong
* @date 2025-07-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/xgss/dormBuildingTree")
public class XgDormBuildingTreeController extends BaseController {
private final IXgDormBuildingTreeService xgDormBuildingTreeService;
/**
* 获取宿舍楼树形结构数据
* 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择
*/
// @SaCheckPermission("xgss:dormBuildingTree:list")
@GetMapping("/list")
public R<List<DormBuildingTreeVo>> getDormBuildingTree(DormBuildingTreeBo bo) {
List<DormBuildingTreeVo> treeData = xgDormBuildingTreeService.getDormBuildingTree(bo);
return R.ok(treeData);
}
}
@@ -0,0 +1,105 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormCampusVo;
import org.dromara.xg.domain.bo.XgDormCampusBo;
import org.dromara.xg.service.IXgDormCampusService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 校区信息
*
* @author zlwu
* @date 2025-07-20
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/xqxx/dormCampus")
public class XgDormCampusController extends BaseController {
private final IXgDormCampusService xgDormCampusService;
/**
* 查询校区信息列表
*/
@SaCheckPermission("xqxx:dormCampus:list")
@GetMapping("/list")
public TableDataInfo<XgDormCampusVo> list(XgDormCampusBo bo, PageQuery pageQuery) {
return xgDormCampusService.queryPageList(bo, pageQuery);
}
/**
* 导出校区信息列表
*/
@SaCheckPermission("xqxx:dormCampus:export")
@Log(title = "校区信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormCampusBo bo, HttpServletResponse response) {
List<XgDormCampusVo> list = xgDormCampusService.queryList(bo);
ExcelUtil.exportExcel(list, "校区信息", XgDormCampusVo.class, response);
}
/**
* 获取校区信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("xqxx:dormCampus:query")
@GetMapping("/{id}")
public R<XgDormCampusVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(xgDormCampusService.queryById(id));
}
/**
* 新增校区信息
*/
@SaCheckPermission("xqxx:dormCampus:add")
@Log(title = "校区信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormCampusBo bo) {
return toAjax(xgDormCampusService.insertByBo(bo));
}
/**
* 修改校区信息
*/
@SaCheckPermission("xqxx:dormCampus:edit")
@Log(title = "校区信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormCampusBo bo) {
return toAjax(xgDormCampusService.updateByBo(bo));
}
/**
* 删除校区信息
*
* @param ids 主键串
*/
@SaCheckPermission("xqxx:dormCampus:remove")
@Log(title = "校区信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(xgDormCampusService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -0,0 +1,105 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormManagerBuildingVo;
import org.dromara.xg.domain.bo.XgDormManagerBuildingBo;
import org.dromara.xg.service.IXgDormManagerBuildingService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 管理员宿舍楼权限关系
*
* @author Lion Li
* @date 2025-07-20
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/glysslqxgx/dormManagerBuilding")
public class XgDormManagerBuildingController extends BaseController {
private final IXgDormManagerBuildingService xgDormManagerBuildingService;
/**
* 查询管理员宿舍楼权限关系列表
*/
@SaCheckPermission("glysslqxgx:dormManagerBuilding:list")
@GetMapping("/list")
public TableDataInfo<XgDormManagerBuildingVo> list(XgDormManagerBuildingBo bo, PageQuery pageQuery) {
return xgDormManagerBuildingService.queryPageList(bo, pageQuery);
}
/**
* 导出管理员宿舍楼权限关系列表
*/
@SaCheckPermission("glysslqxgx:dormManagerBuilding:export")
@Log(title = "管理员宿舍楼权限关系", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormManagerBuildingBo bo, HttpServletResponse response) {
List<XgDormManagerBuildingVo> list = xgDormManagerBuildingService.queryList(bo);
ExcelUtil.exportExcel(list, "管理员宿舍楼权限关系", XgDormManagerBuildingVo.class, response);
}
/**
* 获取管理员宿舍楼权限关系详细信息
*
* @param id 主键
*/
@SaCheckPermission("glysslqxgx:dormManagerBuilding:query")
@GetMapping("/{id}")
public R<XgDormManagerBuildingVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(xgDormManagerBuildingService.queryById(id));
}
/**
* 新增管理员宿舍楼权限关系
*/
@SaCheckPermission("glysslqxgx:dormManagerBuilding:add")
@Log(title = "管理员宿舍楼权限关系", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormManagerBuildingBo bo) {
return toAjax(xgDormManagerBuildingService.insertByBo(bo));
}
/**
* 修改管理员宿舍楼权限关系
*/
@SaCheckPermission("glysslqxgx:dormManagerBuilding:edit")
@Log(title = "管理员宿舍楼权限关系", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormManagerBuildingBo bo) {
return toAjax(xgDormManagerBuildingService.updateByBo(bo));
}
/**
* 删除管理员宿舍楼权限关系
*
* @param ids 主键串
*/
@SaCheckPermission("glysslqxgx:dormManagerBuilding:remove")
@Log(title = "管理员宿舍楼权限关系", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(xgDormManagerBuildingService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -0,0 +1,117 @@
package org.dromara.xg.controller;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormManagerVo;
import org.dromara.xg.domain.bo.XgDormManagerBo;
import org.dromara.xg.service.IXgDormManagerService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 宿舍管理员信息
*
* @author zlwu
* @date 2025-07-20
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ssglyxx/dormManager")
public class XgDormManagerController extends BaseController {
private final IXgDormManagerService xgDormManagerService;
/**
* 查询宿舍管理员信息列表
*/
@SaCheckPermission("ssglyxx:dormManager:list")
@GetMapping("/list")
public TableDataInfo<XgDormManagerVo> list(XgDormManagerBo bo, PageQuery pageQuery) {
return xgDormManagerService.queryPageList(bo, pageQuery);
}
/**
* 导出宿舍管理员信息列表
*/
@SaCheckPermission("ssglyxx:dormManager:export")
@Log(title = "宿舍管理员信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormManagerBo bo, HttpServletResponse response) {
List<XgDormManagerVo> list = xgDormManagerService.queryList(bo);
ExcelUtil.exportExcel(list, "宿舍管理员信息", XgDormManagerVo.class, response);
}
/**
* 获取宿舍管理员信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("ssglyxx:dormManager:query")
@GetMapping("/{id}")
public R<XgDormManagerVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xgDormManagerService.queryById(id));
}
/**
* 获取教师列表(用于下拉选择)
*
* @param name 教师姓名(可选,用于模糊查询)
* @param managerType 管理员类型(可选,用于查询不同类型的管理员)
*/
@SaCheckPermission("ssglyxx:dormManager:list")
@GetMapping("/teachers")
public R<List<Map<String, Object>>> listTeachers(@RequestParam(required = false) String name,
@RequestParam(required = false) String managerType) {
return R.ok(xgDormManagerService.queryTeacherList(name, managerType));
}
/**
* 新增宿舍管理员信息
*/
@SaCheckPermission("ssglyxx:dormManager:add")
@Log(title = "宿舍管理员信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormManagerBo bo) {
return toAjax(xgDormManagerService.insertByBo(bo));
}
/**
* 修改宿舍管理员信息
*/
@SaCheckPermission("ssglyxx:dormManager:edit")
@Log(title = "宿舍管理员信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormManagerBo bo) {
return toAjax(xgDormManagerService.updateByBo(bo));
}
/**
* 删除宿舍管理员信息
*
* @param ids 主键串
*/
@SaCheckPermission("ssglyxx:dormManager:remove")
@Log(title = "宿舍管理员信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xgDormManagerService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -0,0 +1,134 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormManagerSourceVo;
import org.dromara.xg.domain.bo.XgDormManagerSourceBo;
import org.dromara.xg.service.IXgDormManagerSourceService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 管理员授权关系
*
* @author zlwu
* @date 2025-07-20
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/glysqgx/dormManagerSource")
public class XgDormManagerSourceController extends BaseController {
private final IXgDormManagerSourceService xgDormManagerSourceService;
/**
* 查询管理员授权关系列表
*/
@SaCheckPermission("glysqgx:dormManagerSource:list")
@GetMapping("/list")
public TableDataInfo<XgDormManagerSourceVo> list(XgDormManagerSourceBo bo, PageQuery pageQuery) {
return xgDormManagerSourceService.queryPageList(bo, pageQuery);
}
/**
* 导出管理员授权关系列表
*/
@SaCheckPermission("glysqgx:dormManagerSource:export")
@Log(title = "管理员授权关系", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormManagerSourceBo bo, HttpServletResponse response) {
List<XgDormManagerSourceVo> list = xgDormManagerSourceService.queryList(bo);
ExcelUtil.exportExcel(list, "管理员授权关系", XgDormManagerSourceVo.class, response);
}
/**
* 获取管理员授权关系详细信息
*
* @param id 主键
*/
@SaCheckPermission("glysqgx:dormManagerSource:query")
@GetMapping("/{id}")
public R<XgDormManagerSourceVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xgDormManagerSourceService.queryById(id));
}
/**
* 新增管理员授权关系
*/
@SaCheckPermission("glysqgx:dormManagerSource:add")
@Log(title = "管理员授权关系", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormManagerSourceBo bo) {
return toAjax(xgDormManagerSourceService.insertByBo(bo));
}
/**
* 修改管理员授权关系
*/
@SaCheckPermission("glysqgx:dormManagerSource:edit")
@Log(title = "管理员授权关系", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormManagerSourceBo bo) {
return toAjax(xgDormManagerSourceService.updateByBo(bo));
}
/**
* 删除管理员授权关系
*
* @param ids 主键串
*/
@SaCheckPermission("glysqgx:dormManagerSource:remove")
@Log(title = "管理员授权关系", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xgDormManagerSourceService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 批量分配管理员数据范围
*
* @param managerId 管理员ID
* @param authType 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @param authSourceIds 授权来源ID列表
*/
@SaCheckPermission("glysqgx:dormManagerSource:edit")
@Log(title = "分配管理员数据范围", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PostMapping("/assignScope")
public R<Void> assignScope(@RequestParam @NotNull(message = "管理员ID不能为空") Long managerId,
@RequestParam @NotNull(message = "授权类型不能为空") Character authType,
@RequestBody List<Long> authSourceIds) {
return toAjax(xgDormManagerSourceService.assignScope(managerId, authType, authSourceIds));
}
/**
* 获取管理员授权范围名称
*
* @param managerId 管理员ID
* @param managerType 管理员类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @return 授权范围名称(逗号分隔字符串)
*/
@SaCheckPermission("glysqgx:dormManagerSource:query")
@GetMapping("/getScopeNames")
public R<String> getScopeNames(@RequestParam @NotNull(message = "管理员ID不能为空") Long managerId,
@RequestParam @NotNull(message = "管理员类型不能为空") Integer managerType) {
return R.ok(xgDormManagerSourceService.getScopeNames(managerId, managerType));
}
}
@@ -0,0 +1,105 @@
package org.dromara.xg.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xg.domain.vo.XgDormRoomVo;
import org.dromara.xg.domain.bo.XgDormRoomBo;
import org.dromara.xg.service.IXgDormRoomService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 宿舍房间信息
*
* @author zlwu
* @date 2025-07-22
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/xgss/dormRoom")
public class XgDormRoomController extends BaseController {
private final IXgDormRoomService xgDormRoomService;
/**
* 查询宿舍房间信息列表
*/
@SaCheckPermission("xgss:dormRoom:list")
@GetMapping("/list")
public TableDataInfo<XgDormRoomVo> list(XgDormRoomBo bo, PageQuery pageQuery) {
return xgDormRoomService.queryPageList(bo, pageQuery);
}
/**
* 导出宿舍房间信息列表
*/
@SaCheckPermission("xgss:dormRoom:export")
@Log(title = "宿舍房间信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(XgDormRoomBo bo, HttpServletResponse response) {
List<XgDormRoomVo> list = xgDormRoomService.queryList(bo);
ExcelUtil.exportExcel(list, "宿舍房间信息", XgDormRoomVo.class, response);
}
/**
* 获取宿舍房间信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("xgss:dormRoom:query")
@GetMapping("/{id}")
public R<XgDormRoomVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(xgDormRoomService.queryById(id));
}
/**
* 新增宿舍房间信息
*/
@SaCheckPermission("xgss:dormRoom:add")
@Log(title = "宿舍房间信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XgDormRoomBo bo) {
return toAjax(xgDormRoomService.insertByBo(bo));
}
/**
* 修改宿舍房间信息
*/
@SaCheckPermission("xgss:dormRoom:edit")
@Log(title = "宿舍房间信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XgDormRoomBo bo) {
return toAjax(xgDormRoomService.updateByBo(bo));
}
/**
* 删除宿舍房间信息
*
* @param ids 主键串
*/
@SaCheckPermission("xgss:dormRoom:remove")
@Log(title = "宿舍房间信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(xgDormRoomService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -1,2 +0,0 @@
# 学工管理模块 - 实体类
# 此目录用于存放数据库实体类,对应数据库表结构
@@ -0,0 +1,66 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 宿舍区信息对象 xg_dorm_area
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_area")
public class XgDormArea extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 宿舍区编码
*/
private String areaCode;
/**
* 宿舍区名称
*/
private String areaName;
/**
* 所属校区ID
*/
private Long campusId;
/**
* 宿舍区描述
*/
private String areaDescription;
/**
* 排序号
*/
private Long sortOrder;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,81 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 宿舍楼信息对象 xg_dorm_building
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_building")
public class XgDormBuilding extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 宿舍楼编码
*/
private String buildingCode;
/**
* 宿舍楼名称
*/
private String buildingName;
/**
* 所属宿舍区ID
*/
private Long areaId;
/**
* 所属校区ID
*/
private Long campusId;
/**
* 宿舍楼类型(1男生楼 2女生楼 3混合楼)
*/
private String buildingType;
/**
* 宿舍楼描述
*/
private String buildingDescription;
/**
* 排序号
*/
private Long sortOrder;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
/**
* 总楼层数
*/
private Integer floors;
}
@@ -0,0 +1,61 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 校区信息对象 xg_dorm_campus
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_campus")
public class XgDormCampus extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 校区编码
*/
private String campusCode;
/**
* 校区名称
*/
private String campusName;
/**
* 校区描述
*/
private String campusDescription;
/**
* 排序号
*/
private Long sortOrder;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,76 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 宿舍管理员信息对象 xg_dorm_manager
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_manager")
public class XgDormManager extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 管理员姓名
*/
private String managerName;
/**
* 管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
private String managerType;
/**
* 管理级别(1-5,1为最高)
*/
private Long managerLevel;
/**
* 关联用户ID
*/
private Long userId;
/**
* 联系电话
*/
private String phone;
/**
* 性别(0男 1女 2未知)
*/
private String gender;
/**
* 状态(0正常 1停用)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,56 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 管理员宿舍楼权限关系对象 xg_dorm_manager_building
*
* @author Lion Li
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_manager_building")
public class XgDormManagerBuilding extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 管理员ID
*/
private Long managerId;
/**
* 宿舍楼ID
*/
private Long buildingId;
/**
* 状态(0有效 1已撤销)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,66 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 管理员授权关系对象 xg_dorm_manager_source
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_manager_source")
public class XgDormManagerSource extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 管理员ID
*/
private Long managerId;
/**
* 权限类型(1查看 2编辑 3完全管理)
*/
private String permissionType;
/**
* 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
*/
private String authType;
/**
* 授权来源ID(对应校区ID或宿舍区ID或楼栋ID)
*/
private Long authSource;
/**
* 状态(0有效 1已撤销)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,81 @@
package org.dromara.xg.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 宿舍房间信息对象 xg_dorm_room
*
* @author zlwu
* @date 2025-07-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xg_dorm_room")
public class XgDormRoom extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 房间编号
*/
private String roomCode;
/**
* 房间名称
*/
private String roomName;
/**
* 所属宿舍楼ID
*/
private Long buildingId;
/**
* 楼层
*/
private Long floorNum;
/**
* 房间类型(1标准间 2 单人间 3 套间)
*/
private String roomType;
/**
* 实际床位数
*/
private Long actualBeds;
/**
* 房间面积(平方米)
*/
private Double roomArea;
/**
* 房间状态(0可用 1维修中 2停用)
*/
private String roomStatus;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -1,2 +0,0 @@
# 学工管理模块 - 业务对象(Business Object)
# 此目录用于存放业务对象类,用于接收前端参数和业务逻辑处理
@@ -0,0 +1,36 @@
package org.dromara.xg.domain.bo;
import java.io.Serializable;
import lombok.Data;
/**
* 宿舍楼树查询业务对象
*
* @author wuzilong
* @date 2025-07-03
*/
@Data
public class DormBuildingTreeBo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 校区ID
*/
private Long campusId;
/**
* 宿舍区ID
*/
private Long areaId;
/**
* 宿舍楼名称(模糊查询)
*/
private String buildingName;
/**
* 宿舍楼状态
*/
private String status;
}
@@ -0,0 +1,58 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormArea;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 宿舍区信息业务对象 xg_dorm_area
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormArea.class, reverseConvertGenerate = false)
public class XgDormAreaBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 宿舍区编码
*/
@NotBlank(message = "宿舍区编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String areaCode;
/**
* 宿舍区名称
*/
@NotBlank(message = "宿舍区名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String areaName;
/**
* 所属校区ID
*/
@NotNull(message = "所属校区ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long campusId;
/**
* 宿舍区描述
*/
private String areaDescription;
/**
* 排序号
*/
private Long sortOrder;
}
@@ -0,0 +1,73 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormBuilding;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 宿舍楼信息业务对象 xg_dorm_building
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormBuilding.class, reverseConvertGenerate = false)
public class XgDormBuildingBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 宿舍楼编码
*/
@NotBlank(message = "宿舍楼编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String buildingCode;
/**
* 宿舍楼名称
*/
@NotBlank(message = "宿舍楼名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String buildingName;
/**
* 所属宿舍区ID
*/
@NotNull(message = "所属宿舍区ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long areaId;
/**
* 所属校区ID
*/
@NotNull(message = "所属校区ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long campusId;
/**
* 宿舍楼类型(1男生楼 2女生楼 3混合楼)
*/
private String buildingType;
/**
* 宿舍楼描述
*/
private String buildingDescription;
/**
* 排序号
*/
private Long sortOrder;
/**
* 总楼层数
*/
private Integer floors;
}
@@ -0,0 +1,57 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormCampus;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 校区信息业务对象 xg_dorm_campus
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormCampus.class, reverseConvertGenerate = false)
public class XgDormCampusBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 校区编码
*/
@NotBlank(message = "校区编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String campusCode;
/**
* 校区名称
*/
@NotBlank(message = "校区名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String campusName;
/**
* 校区描述
*/
private String campusDescription;
/**
* 排序号
*/
private Long sortOrder;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,77 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormManager;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 宿舍管理员信息业务对象 xg_dorm_manager
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormManager.class, reverseConvertGenerate = false)
public class XgDormManagerBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 管理员姓名
*/
@NotBlank(message = "管理员姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String managerName;
/**
* 管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
@NotBlank(message = "管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)不能为空", groups = { AddGroup.class, EditGroup.class })
private String managerType;
/**
* 管理级别(1-5,1为最高)
*/
private Long managerLevel;
/**
* 关联用户ID
*/
private Long userId;
/**
* 联系电话
*/
private String phone;
/**
* 性别(0男 1女 2未知)
*/
private String gender;
/**
* 状态(0正常 1停用)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,57 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormManagerBuilding;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 管理员宿舍楼权限关系业务对象 xg_dorm_manager_building
*
* @author Lion Li
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormManagerBuilding.class, reverseConvertGenerate = false)
public class XgDormManagerBuildingBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 管理员ID
*/
@NotNull(message = "管理员ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long managerId;
/**
* 宿舍楼ID
*/
@NotNull(message = "宿舍楼ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long buildingId;
/**
* 状态(0有效 1已撤销)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,66 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormManagerSource;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 管理员授权关系业务对象 xg_dorm_manager_source
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormManagerSource.class, reverseConvertGenerate = false)
public class XgDormManagerSourceBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 管理员ID
*/
@NotNull(message = "管理员ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long managerId;
/**
* 权限类型(1查看 2编辑 3完全管理)
*/
private String permissionType;
/**
* 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
*/
@NotBlank(message = "授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)不能为空", groups = { AddGroup.class, EditGroup.class })
private String authType;
/**
* 授权来源ID(对应校区ID或宿舍区ID或楼栋ID)
*/
private Long authSource;
/**
* 状态(0有效 1已撤销)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,84 @@
package org.dromara.xg.domain.bo;
import org.dromara.xg.domain.XgDormRoom;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 宿舍房间信息业务对象 xg_dorm_room
*
* @author zlwu
* @date 2025-07-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XgDormRoom.class, reverseConvertGenerate = false)
public class XgDormRoomBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 房间编号
*/
@NotBlank(message = "房间编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String roomCode;
/**
* 房间名称
*/
@NotBlank(message = "房间名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String roomName;
/**
* 所属宿舍楼ID
*/
@NotNull(message = "所属宿舍楼ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long buildingId;
/**
* 楼层
*/
@NotNull(message = "楼层不能为空", groups = { AddGroup.class, EditGroup.class })
private Long floorNum;
/**
* 房间类型(1标准间 2 单人间 3 套间)
*/
private String roomType;
/**
* 实际床位数
*/
private Long actualBeds;
/**
* 房间面积(平方米)
*/
private Double roomArea;
/**
* 房间状态(0可用 1维修中 2停用)
*/
private String roomStatus;
/**
* 删除标志(0代表存在 1代表删除)
*/
private String deleted;
/**
* 备注
*/
private String remark;
}
@@ -1,2 +0,0 @@
# 学工管理模块 - 视图对象(View Object)
# 此目录用于存放视图对象类,用于返回给前端的数据结构
@@ -0,0 +1,65 @@
package org.dromara.xg.domain.vo;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 宿舍楼树形结构视图对象
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@NoArgsConstructor
public class BuildingTreeSelectVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 节点ID
*/
private Long id;
/**
* 节点名称
*/
private String label;
/**
* 节点类型(campus:校区 area:宿舍区 building:宿舍楼)
*/
private String nodeType;
/**
* 是否禁用
*/
private Boolean disabled;
/**
* 子节点
*/
private List<BuildingTreeSelectVo> children;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
private java.util.Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
private java.util.Date updateTime;
}
@@ -0,0 +1,105 @@
package org.dromara.xg.domain.vo;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
* 宿舍楼信息VO
*
* @author wuzilong
* @date 2025-07-03
*/
@Data
public class DormBuildingInfoVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 宿舍楼ID
*/
private Long id;
/**
* 宿舍楼名称
*/
private String buildingName;
/**
* 宿舍楼编号
*/
private String buildingCode;
/**
* 所属校区ID
*/
private Long campusId;
/**
* 校区名称
*/
private String campusName;
/**
* 所属宿舍区ID
*/
private Long areaId;
/**
* 宿舍区名称
*/
private String areaName;
/**
* 楼层数
*/
private Integer floors;
/**
* 房间数
*/
private Integer roomCount;
/**
* 床位数
*/
private Integer bedCount;
/**
* 已使用床位数
*/
private Integer usedBedCount;
/**
* 状态(0正常 1维修中 2停用)
*/
private String status;
/**
* 备注
*/
private String remark;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,49 @@
package org.dromara.xg.domain.vo;
import java.io.Serializable;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
* 宿舍楼树形结构VO
*
* @author wuzilong
* @date 2025-07-03
*/
@Data
public class DormBuildingTreeVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 节点ID
*/
private Long id;
/**
* 节点名称
*/
private String label;
/**
* 节点类型 (campus:校区, area:宿舍区, building:宿舍楼)
*/
private String type;
/**
* 是否禁用节点(校区和宿舍区节点禁用点击)
*/
private Boolean disabled;
/**
* 宿舍楼层数(仅宿舍楼节点有此字段)
*/
private Integer buildingFloors;
/**
* 子节点
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<DormBuildingTreeVo> children;
}
@@ -0,0 +1,63 @@
package org.dromara.xg.domain.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 教师信息视图对象
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@NoArgsConstructor
public class TeacherVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 用户名称
*/
private String userName;
/**
* 手机号码
*/
private String phonenumber;
/**
* 用户性别(0男 1女 2未知)
*/
private String sex;
/**
* 头像地址
*/
private String avatar;
/**
* 部门名称
*/
private String deptName;
/**
* 备注
*/
private String remark;
/**
* 创建者
*/
private Long createBy;
/**
* 更新者
*/
private Long updateBy;
}
@@ -0,0 +1,63 @@
package org.dromara.xg.domain.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 树形选择视图对象
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@NoArgsConstructor
public class TreeSelectVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 节点ID */
private Long id;
/** 节点名称 */
private String label;
/** 节点类型(campus:校区, area:宿舍区) */
private String type;
/** 是否可选择 */
private Boolean disabled;
/** 子节点 */
private List<TreeSelectVo> children = new ArrayList<>();
/**
* 构造树节点
*
* @param id 节点ID
* @param label 节点标签
* @param type 节点类型
* @param disabled 是否禁用
*/
public TreeSelectVo(Long id, String label, String type, Boolean disabled) {
this.id = id;
this.label = label;
this.type = type;
this.disabled = disabled;
}
/**
* 添加子节点
*
* @param child 子节点
*/
public void addChild(TreeSelectVo child) {
if (children == null) {
children = new ArrayList<>();
}
children.add(child);
}
}
@@ -0,0 +1,71 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormArea;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 宿舍区信息视图对象 xg_dorm_area
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormArea.class)
public class XgDormAreaVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 宿舍区编码
*/
@ExcelProperty(value = "宿舍区编码")
private String areaCode;
/**
* 宿舍区名称
*/
@ExcelProperty(value = "宿舍区名称")
private String areaName;
/**
* 所属校区ID
*/
@ExcelProperty(value = "所属校区ID")
private Long campusId;
/**
* 校区名称
*/
@ExcelProperty(value = "校区名称")
private String campusName;
/**
* 宿舍区描述
*/
@ExcelProperty(value = "宿舍区描述")
private String areaDescription;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Long sortOrder;
}
@@ -0,0 +1,101 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormBuilding;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 宿舍楼信息视图对象 xg_dorm_building
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormBuilding.class)
public class XgDormBuildingVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 宿舍楼编码
*/
@ExcelProperty(value = "宿舍楼编码")
private String buildingCode;
/**
* 宿舍楼名称
*/
@ExcelProperty(value = "宿舍楼名称")
private String buildingName;
/**
* 所属宿舍区ID
*/
@ExcelProperty(value = "所属宿舍区ID")
private Long areaId;
/**
* 宿舍区名称
*/
@ExcelProperty(value = "宿舍区名称")
private String areaName;
/**
* 所属校区ID
*/
@ExcelProperty(value = "所属校区ID")
private Long campusId;
/**
* 校区名称
*/
@ExcelProperty(value = "校区名称")
private String campusName;
/**
* 宿舍楼类型(1男生楼 2女生楼 3混合楼)
*/
@ExcelProperty(value = "宿舍楼类型(1男生楼 2女生楼 3混合楼)", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "dorm_type")
private String buildingType;
/**
* 宿舍楼描述
*/
@ExcelProperty(value = "宿舍楼描述")
private String buildingDescription;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Long sortOrder;
/**
* 总楼层数
*/
@ExcelProperty(value = "总楼层数")
private Integer floors;
// 基础字段
private Long createBy; // 创建者
private Date createTime; // 创建时间
private Long updateBy; // 更新者
private Date updateTime; // 更新时间
}
@@ -0,0 +1,68 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormCampus;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 校区信息视图对象 xg_dorm_campus
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormCampus.class)
public class XgDormCampusVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 校区编码
*/
@ExcelProperty(value = "校区编码")
private String campusCode;
/**
* 校区名称
*/
@ExcelProperty(value = "校区名称")
private String campusName;
/**
* 校区描述
*/
@ExcelProperty(value = "校区描述")
private String campusDescription;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Long sortOrder;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
@@ -0,0 +1,68 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormManagerBuilding;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 管理员宿舍楼权限关系视图对象 xg_dorm_manager_building
*
* @author Lion Li
* @date 2025-07-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormManagerBuilding.class)
public class XgDormManagerBuildingVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 管理员ID
*/
@ExcelProperty(value = "管理员ID")
private Long managerId;
/**
* 宿舍楼ID
*/
@ExcelProperty(value = "宿舍楼ID")
private Long buildingId;
/**
* 状态(0有效 1已撤销)
*/
@ExcelProperty(value = "状态(0有效 1已撤销)")
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@ExcelProperty(value = "删除标志(0代表存在 1代表删除)")
private String deleted;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
@@ -0,0 +1,77 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormManagerSource;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 管理员授权关系视图对象 xg_dorm_manager_source
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormManagerSource.class)
public class XgDormManagerSourceVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 管理员ID
*/
@ExcelProperty(value = "管理员ID")
private Long managerId;
/**
* 权限类型(1查看 2编辑 3完全管理)
*/
@ExcelProperty(value = "权限类型(1查看 2编辑 3完全管理)")
private String permissionType;
/**
* 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
*/
@ExcelProperty(value = "授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)")
private String authType;
/**
* 授权来源ID(对应校区ID或宿舍区ID或楼栋ID)
*/
@ExcelProperty(value = "授权来源ID(对应校区ID或宿舍区ID或楼栋ID)")
private Long authSource;
/**
* 状态(0有效 1已撤销)
*/
@ExcelProperty(value = "状态(0有效 1已撤销)")
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@ExcelProperty(value = "删除标志(0代表存在 1代表删除)")
private String deleted;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
@@ -0,0 +1,92 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormManager;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 宿舍管理员信息视图对象 xg_dorm_manager
*
* @author zlwu
* @date 2025-07-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormManager.class)
public class XgDormManagerVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 管理员姓名
*/
@ExcelProperty(value = "管理员姓名")
private String managerName;
/**
* 管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
@ExcelProperty(value = "管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)")
private String managerType;
/**
* 管理级别(1-5,1为最高)
*/
@ExcelProperty(value = "管理级别(1-5,1为最高)")
private Long managerLevel;
/**
* 关联用户ID
*/
@ExcelProperty(value = "关联用户ID")
private Long userId;
/**
* 联系电话
*/
@ExcelProperty(value = "联系电话")
private String phone;
/**
* 性别(0男 1女 2未知)
*/
@ExcelProperty(value = "性别(0男 1女 2未知)")
private String gender;
/**
* 状态(0正常 1停用)
*/
@ExcelProperty(value = "状态(0正常 1停用)")
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@ExcelProperty(value = "删除标志(0代表存在 1代表删除)")
private String deleted;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
@@ -0,0 +1,98 @@
package org.dromara.xg.domain.vo;
import org.dromara.xg.domain.XgDormRoom;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 宿舍房间信息视图对象 xg_dorm_room
*
* @author zlwu
* @date 2025-07-22
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XgDormRoom.class)
public class XgDormRoomVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 房间编号
*/
@ExcelProperty(value = "房间编号")
private String roomCode;
/**
* 房间名称
*/
@ExcelProperty(value = "房间名称")
private String roomName;
/**
* 所属宿舍楼ID
*/
@ExcelProperty(value = "所属宿舍楼ID")
private Long buildingId;
/**
* 楼层
*/
@ExcelProperty(value = "楼层")
private Long floorNum;
/**
* 房间类型(1标准间 2 单人间 3 套间)
*/
@ExcelProperty(value = "房间类型(1标准间 2 单人间 3 套间)")
private String roomType;
/**
* 实际床位数
*/
@ExcelProperty(value = "实际床位数")
private Long actualBeds;
/**
* 房间面积(平方米)
*/
@ExcelProperty(value = "房间面积(平方米)")
private Double roomArea;
/**
* 房间状态(0可用 1维修中 2停用)
*/
@ExcelProperty(value = "房间状态(0可用 1维修中 2停用)")
private String roomStatus;
/**
* 删除标志(0代表存在 1代表删除)
*/
@ExcelProperty(value = "删除标志(0代表存在 1代表删除)")
private String deleted;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
@@ -1,2 +0,0 @@
# 学工管理模块 - 数据访问层
# 此目录用于存放MyBatis Mapper接口
@@ -0,0 +1,22 @@
package org.dromara.xg.mapper;
import org.dromara.xg.domain.XgDormArea;
import org.dromara.xg.domain.vo.XgDormAreaVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xg.domain.bo.XgDormAreaBo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* 宿舍区信息Mapper接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface XgDormAreaMapper extends BaseMapperPlus<XgDormArea, XgDormAreaVo> {
/**
* 分页查询并返回校区名称
*/
Page<XgDormAreaVo> selectPageWithCampusName(Page<?> page,
@org.apache.ibatis.annotations.Param("bo") XgDormAreaBo bo);
}
@@ -0,0 +1,22 @@
package org.dromara.xg.mapper;
import org.dromara.xg.domain.XgDormBuilding;
import org.dromara.xg.domain.vo.XgDormBuildingVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xg.domain.bo.XgDormBuildingBo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* 宿舍楼信息Mapper接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface XgDormBuildingMapper extends BaseMapperPlus<XgDormBuilding, XgDormBuildingVo> {
/**
* 分页查询并返回校区名称和宿舍区名称
*/
Page<XgDormBuildingVo> selectPageWithAreaAndCampusName(Page<?> page,
@org.apache.ibatis.annotations.Param("bo") XgDormBuildingBo bo);
}
@@ -0,0 +1,84 @@
package org.dromara.xg.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.dromara.xg.domain.vo.DormBuildingInfoVo;
import org.dromara.xg.domain.bo.DormBuildingTreeBo;
/**
* 宿舍楼树形结构Mapper接口
*
* @author wuzilong
* @date 2025-07-03
*/
public interface XgDormBuildingTreeMapper {
/**
* 获取所有校区信息
*
* @return 校区列表
*/
List<DormBuildingInfoVo> selectCampusList();
/**
* 获取所有宿舍区信息
*
* @return 宿舍区列表
*/
List<DormBuildingInfoVo> selectAreaList();
/**
* 获取所有宿舍楼信息
*
* @return 宿舍楼列表
*/
List<DormBuildingInfoVo> selectBuildingList(DormBuildingTreeBo bo);
/**
* 获取全校管理员权限的宿舍楼信息
*
* @param userId 用户ID
* @param bo 查询参数
* @return 宿舍楼列表
*/
List<DormBuildingInfoVo> selectBuildingsBySchoolAdmin(@Param("userId") Long userId,
@Param("bo") DormBuildingTreeBo bo);
/**
* 获取校区管理员权限的宿舍楼信息
*
* @param userId 用户ID
* @param bo 查询参数
* @return 宿舍楼列表
*/
List<DormBuildingInfoVo> selectBuildingsByCampusAdmin(@Param("userId") Long userId,
@Param("bo") DormBuildingTreeBo bo);
/**
* 获取宿舍区管理员权限的宿舍楼信息
*
* @param userId 用户ID
* @param bo 查询参数
* @return 宿舍楼列表
*/
List<DormBuildingInfoVo> selectBuildingsByAreaAdmin(@Param("userId") Long userId,
@Param("bo") DormBuildingTreeBo bo);
/**
* 获取宿舍楼管理员权限的宿舍楼信息
*
* @param userId 用户ID
* @param bo 查询参数
* @return 宿舍楼列表
*/
List<DormBuildingInfoVo> selectBuildingsByBuildingAdmin(@Param("userId") Long userId,
@Param("bo") DormBuildingTreeBo bo);
/**
* 检查用户是否有宿舍管理权限
*
* @param userId 用户ID
* @return 管理员类型列表 (1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
List<String> checkUserDormManagerType(@Param("userId") Long userId);
}
@@ -0,0 +1,15 @@
package org.dromara.xg.mapper;
import org.dromara.xg.domain.XgDormCampus;
import org.dromara.xg.domain.vo.XgDormCampusVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 校区信息Mapper接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface XgDormCampusMapper extends BaseMapperPlus<XgDormCampus, XgDormCampusVo> {
}
@@ -0,0 +1,15 @@
package org.dromara.xg.mapper;
import org.dromara.xg.domain.XgDormManagerBuilding;
import org.dromara.xg.domain.vo.XgDormManagerBuildingVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 管理员宿舍楼权限关系Mapper接口
*
* @author Lion Li
* @date 2025-07-20
*/
public interface XgDormManagerBuildingMapper extends BaseMapperPlus<XgDormManagerBuilding, XgDormManagerBuildingVo> {
}
@@ -0,0 +1,15 @@
package org.dromara.xg.mapper;
import org.dromara.xg.domain.XgDormManager;
import org.dromara.xg.domain.vo.XgDormManagerVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 宿舍管理员信息Mapper接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface XgDormManagerMapper extends BaseMapperPlus<XgDormManager, XgDormManagerVo> {
}
@@ -0,0 +1,41 @@
package org.dromara.xg.mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.xg.domain.XgDormManagerSource;
import org.dromara.xg.domain.vo.XgDormManagerSourceVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 管理员授权关系Mapper接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface XgDormManagerSourceMapper extends BaseMapperPlus<XgDormManagerSource, XgDormManagerSourceVo> {
/**
* 根据ID列表获取校区名称(逗号分隔)
*
* @param sourceIds 校区ID列表
* @return 校区名称,多个以逗号分隔
*/
String getCampusNamesByIds(@Param("sourceIds") List<Long> sourceIds);
/**
* 根据ID列表获取宿舍区名称(逗号分隔)
*
* @param sourceIds 宿舍区ID列表
* @return 宿舍区名称,多个以逗号分隔
*/
String getAreaNamesByIds(@Param("sourceIds") List<Long> sourceIds);
/**
* 根据ID列表获取宿舍楼名称(逗号分隔)
*
* @param sourceIds 宿舍楼ID列表
* @return 宿舍楼名称,多个以逗号分隔
*/
String getBuildingNamesByIds(@Param("sourceIds") List<Long> sourceIds);
}
@@ -0,0 +1,15 @@
package org.dromara.xg.mapper;
import org.dromara.xg.domain.XgDormRoom;
import org.dromara.xg.domain.vo.XgDormRoomVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 宿舍房间信息Mapper接口
*
* @author zlwu
* @date 2025-07-22
*/
public interface XgDormRoomMapper extends BaseMapperPlus<XgDormRoom, XgDormRoomVo> {
}
@@ -1,2 +0,0 @@
# 学工管理模块 - 业务服务接口层
# 此目录用于存放Service接口定义
@@ -0,0 +1,77 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormAreaVo;
import org.dromara.xg.domain.bo.XgDormAreaBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.xg.domain.vo.TreeSelectVo;
import java.util.Collection;
import java.util.List;
/**
* 宿舍区信息Service接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface IXgDormAreaService {
/**
* 查询宿舍区信息
*
* @param id 主键
* @return 宿舍区信息
*/
XgDormAreaVo queryById(Long id);
/**
* 分页查询宿舍区信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍区信息分页列表
*/
TableDataInfo<XgDormAreaVo> queryPageList(XgDormAreaBo bo, PageQuery pageQuery);
/**
* 查询符合条件的宿舍区信息列表
*
* @param bo 查询条件
* @return 宿舍区信息列表
*/
List<XgDormAreaVo> queryList(XgDormAreaBo bo);
/**
* 新增宿舍区信息
*
* @param bo 宿舍区信息
* @return 是否新增成功
*/
Boolean insertByBo(XgDormAreaBo bo);
/**
* 修改宿舍区信息
*
* @param bo 宿舍区信息
* @return 是否修改成功
*/
Boolean updateByBo(XgDormAreaBo bo);
/**
* 校验并批量删除宿舍区信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取宿舍区树形结构数据
* 以校区为根节点,宿舍区为子节点
*
* @return 宿舍区树形结构列表
*/
List<TreeSelectVo> getAreaTree();
}
@@ -0,0 +1,77 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormBuildingVo;
import org.dromara.xg.domain.bo.XgDormBuildingBo;
import org.dromara.xg.domain.vo.BuildingTreeSelectVo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 宿舍楼信息Service接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface IXgDormBuildingService {
/**
* 查询宿舍楼信息
*
* @param id 主键
* @return 宿舍楼信息
*/
XgDormBuildingVo queryById(Long id);
/**
* 分页查询宿舍楼信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍楼信息分页列表
*/
TableDataInfo<XgDormBuildingVo> queryPageList(XgDormBuildingBo bo, PageQuery pageQuery);
/**
* 查询符合条件的宿舍楼信息列表
*
* @param bo 查询条件
* @return 宿舍楼信息列表
*/
List<XgDormBuildingVo> queryList(XgDormBuildingBo bo);
/**
* 新增宿舍楼信息
*
* @param bo 宿舍楼信息
* @return 是否新增成功
*/
Boolean insertByBo(XgDormBuildingBo bo);
/**
* 修改宿舍楼信息
*
* @param bo 宿舍楼信息
* @return 是否修改成功
*/
Boolean updateByBo(XgDormBuildingBo bo);
/**
* 校验并批量删除宿舍楼信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取宿舍楼树形结构数据
* 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择
*
* @return 树形结构数据
*/
List<BuildingTreeSelectVo> getBuildingTreeData();
}
@@ -0,0 +1,23 @@
package org.dromara.xg.service;
import java.util.List;
import org.dromara.xg.domain.vo.DormBuildingTreeVo;
import org.dromara.xg.domain.bo.DormBuildingTreeBo;
/**
* 宿舍楼树形结构服务接口
*
* @author wuzilong
* @date 2025-07-03
*/
public interface IXgDormBuildingTreeService {
/**
* 获取宿舍楼树形结构数据
*
* @param bo 查询参数
* @return 树形结构数据
*/
List<DormBuildingTreeVo> getDormBuildingTree(DormBuildingTreeBo bo);
}
@@ -0,0 +1,68 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormCampusVo;
import org.dromara.xg.domain.bo.XgDormCampusBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 校区信息Service接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface IXgDormCampusService {
/**
* 查询校区信息
*
* @param id 主键
* @return 校区信息
*/
XgDormCampusVo queryById(Long id);
/**
* 分页查询校区信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 校区信息分页列表
*/
TableDataInfo<XgDormCampusVo> queryPageList(XgDormCampusBo bo, PageQuery pageQuery);
/**
* 查询符合条件的校区信息列表
*
* @param bo 查询条件
* @return 校区信息列表
*/
List<XgDormCampusVo> queryList(XgDormCampusBo bo);
/**
* 新增校区信息
*
* @param bo 校区信息
* @return 是否新增成功
*/
Boolean insertByBo(XgDormCampusBo bo);
/**
* 修改校区信息
*
* @param bo 校区信息
* @return 是否修改成功
*/
Boolean updateByBo(XgDormCampusBo bo);
/**
* 校验并批量删除校区信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -0,0 +1,68 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormManagerBuildingVo;
import org.dromara.xg.domain.bo.XgDormManagerBuildingBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 管理员宿舍楼权限关系Service接口
*
* @author Lion Li
* @date 2025-07-20
*/
public interface IXgDormManagerBuildingService {
/**
* 查询管理员宿舍楼权限关系
*
* @param id 主键
* @return 管理员宿舍楼权限关系
*/
XgDormManagerBuildingVo queryById(Long id);
/**
* 分页查询管理员宿舍楼权限关系列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 管理员宿舍楼权限关系分页列表
*/
TableDataInfo<XgDormManagerBuildingVo> queryPageList(XgDormManagerBuildingBo bo, PageQuery pageQuery);
/**
* 查询符合条件的管理员宿舍楼权限关系列表
*
* @param bo 查询条件
* @return 管理员宿舍楼权限关系列表
*/
List<XgDormManagerBuildingVo> queryList(XgDormManagerBuildingBo bo);
/**
* 新增管理员宿舍楼权限关系
*
* @param bo 管理员宿舍楼权限关系
* @return 是否新增成功
*/
Boolean insertByBo(XgDormManagerBuildingBo bo);
/**
* 修改管理员宿舍楼权限关系
*
* @param bo 管理员宿舍楼权限关系
* @return 是否修改成功
*/
Boolean updateByBo(XgDormManagerBuildingBo bo);
/**
* 校验并批量删除管理员宿舍楼权限关系信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -0,0 +1,77 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormManagerVo;
import org.dromara.xg.domain.bo.XgDormManagerBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 宿舍管理员信息Service接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface IXgDormManagerService {
/**
* 查询宿舍管理员信息
*
* @param id 主键
* @return 宿舍管理员信息
*/
XgDormManagerVo queryById(Long id);
/**
* 分页查询宿舍管理员信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍管理员信息分页列表
*/
TableDataInfo<XgDormManagerVo> queryPageList(XgDormManagerBo bo, PageQuery pageQuery);
/**
* 查询符合条件的宿舍管理员信息列表
*
* @param bo 查询条件
* @return 宿舍管理员信息列表
*/
List<XgDormManagerVo> queryList(XgDormManagerBo bo);
/**
* 查询教师列表(用于下拉选择)
*
* @param name 教师姓名(可选,用于模糊查询)
* @return 教师列表
*/
List<Map<String, Object>> queryTeacherList(String name, String managerType);
/**
* 新增宿舍管理员信息
*
* @param bo 宿舍管理员信息
* @return 是否新增成功
*/
Boolean insertByBo(XgDormManagerBo bo);
/**
* 修改宿舍管理员信息
*
* @param bo 宿舍管理员信息
* @return 是否修改成功
*/
Boolean updateByBo(XgDormManagerBo bo);
/**
* 校验并批量删除宿舍管理员信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -0,0 +1,67 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormManagerSourceVo;
import org.dromara.xg.domain.bo.XgDormManagerSourceBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 管理员授权关系Service接口
*
* @author zlwu
* @date 2025-07-20
*/
public interface IXgDormManagerSourceService {
/**
* 查询管理员授权关系
*/
XgDormManagerSourceVo queryById(Long id);
/**
* 查询管理员授权关系列表
*/
TableDataInfo<XgDormManagerSourceVo> queryPageList(XgDormManagerSourceBo bo, PageQuery pageQuery);
/**
* 查询管理员授权关系列表
*/
List<XgDormManagerSourceVo> queryList(XgDormManagerSourceBo bo);
/**
* 新增管理员授权关系
*/
Boolean insertByBo(XgDormManagerSourceBo bo);
/**
* 修改管理员授权关系
*/
Boolean updateByBo(XgDormManagerSourceBo bo);
/**
* 校验并批量删除管理员授权关系信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 批量分配管理员数据范围
*
* @param managerId 管理员ID
* @param authType 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @param authSourceIds 授权来源ID列表
* @return 结果
*/
Boolean assignScope(Long managerId, Character authType, List<Long> authSourceIds);
/**
* 获取管理员授权范围名称
*
* @param managerId 管理员ID
* @param managerType 管理员类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @return 授权范围名称(逗号分隔字符串)
*/
String getScopeNames(Long managerId, Integer managerType);
}
@@ -0,0 +1,68 @@
package org.dromara.xg.service;
import org.dromara.xg.domain.vo.XgDormRoomVo;
import org.dromara.xg.domain.bo.XgDormRoomBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 宿舍房间信息Service接口
*
* @author zlwu
* @date 2025-07-22
*/
public interface IXgDormRoomService {
/**
* 查询宿舍房间信息
*
* @param id 主键
* @return 宿舍房间信息
*/
XgDormRoomVo queryById(Long id);
/**
* 分页查询宿舍房间信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍房间信息分页列表
*/
TableDataInfo<XgDormRoomVo> queryPageList(XgDormRoomBo bo, PageQuery pageQuery);
/**
* 查询符合条件的宿舍房间信息列表
*
* @param bo 查询条件
* @return 宿舍房间信息列表
*/
List<XgDormRoomVo> queryList(XgDormRoomBo bo);
/**
* 新增宿舍房间信息
*
* @param bo 宿舍房间信息
* @return 是否新增成功
*/
Boolean insertByBo(XgDormRoomBo bo);
/**
* 修改宿舍房间信息
*
* @param bo 宿舍房间信息
* @return 是否修改成功
*/
Boolean updateByBo(XgDormRoomBo bo);
/**
* 校验并批量删除宿舍房间信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -1,2 +0,0 @@
# 学工管理模块 - 业务服务实现层
# 此目录用于存放Service接口的实现类
@@ -0,0 +1,193 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormAreaBo;
import org.dromara.xg.domain.bo.XgDormCampusBo;
import org.dromara.xg.domain.vo.XgDormAreaVo;
import org.dromara.xg.domain.vo.XgDormCampusVo;
import org.dromara.xg.domain.XgDormArea;
import org.dromara.xg.domain.vo.TreeSelectVo;
import org.dromara.xg.mapper.XgDormAreaMapper;
import org.dromara.xg.service.IXgDormAreaService;
import org.dromara.xg.service.IXgDormCampusService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 宿舍区信息Service业务层处理
*
* @author zlwu
* @date 2025-07-20
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormAreaServiceImpl implements IXgDormAreaService {
private final XgDormAreaMapper baseMapper;
private final IXgDormCampusService dormCampusService;
/**
* 查询宿舍区信息
*
* @param id 主键
* @return 宿舍区信息
*/
@Override
public XgDormAreaVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询宿舍区信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍区信息分页列表
*/
@Override
public TableDataInfo<XgDormAreaVo> queryPageList(XgDormAreaBo bo, PageQuery pageQuery) {
Page<XgDormAreaVo> result = baseMapper.selectPageWithCampusName(pageQuery.build(), bo);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的宿舍区信息列表
*
* @param bo 查询条件
* @return 宿舍区信息列表
*/
@Override
public List<XgDormAreaVo> queryList(XgDormAreaBo bo) {
LambdaQueryWrapper<XgDormArea> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XgDormArea> buildQueryWrapper(XgDormAreaBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormArea> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormArea::getId);
lqw.like(StringUtils.isNotBlank(bo.getAreaCode()), XgDormArea::getAreaCode, bo.getAreaCode());
lqw.like(StringUtils.isNotBlank(bo.getAreaName()), XgDormArea::getAreaName, bo.getAreaName());
lqw.like(StringUtils.isNotBlank(bo.getAreaDescription()), XgDormArea::getAreaDescription,
bo.getAreaDescription());
return lqw;
}
/**
* 新增宿舍区信息
*
* @param bo 宿舍区信息
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormAreaBo bo) {
XgDormArea add = MapstructUtils.convert(bo, XgDormArea.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改宿舍区信息
*
* @param bo 宿舍区信息
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormAreaBo bo) {
XgDormArea update = MapstructUtils.convert(bo, XgDormArea.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormArea entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除宿舍区信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 获取宿舍区树形结构数据
* 以校区为根节点,宿舍区为子节点
*
* @return 宿舍区树形结构列表
*/
@Override
public List<TreeSelectVo> getAreaTree() {
// 1. 获取所有校区数据
List<XgDormCampusVo> campusList = dormCampusService.queryList(new XgDormCampusBo());
// 2. 获取所有宿舍区数据
List<XgDormAreaVo> areaList = queryList(new XgDormAreaBo());
// 3. 构建树形结构
List<TreeSelectVo> treeList = new ArrayList<>();
// 4. 创建校区节点(校区节点不可选择)
for (XgDormCampusVo campus : campusList) {
// 校区节点不可选择
TreeSelectVo campusNode = new TreeSelectVo(
campus.getId(),
campus.getCampusName(),
"campus",
true // 禁用校区节点,不可选择
);
// 5. 添加对应校区的宿舍区节点
List<XgDormAreaVo> campusAreas = areaList.stream()
.filter(area -> campus.getId().equals(area.getCampusId()))
.collect(Collectors.toList());
for (XgDormAreaVo area : campusAreas) {
// 宿舍区节点可选择
TreeSelectVo areaNode = new TreeSelectVo(
area.getId(),
area.getAreaName(),
"area",
false // 不禁用宿舍区节点,可以选择
);
campusNode.addChild(areaNode);
}
// 只有包含子节点的校区才添加到树中
if (!campusNode.getChildren().isEmpty()) {
treeList.add(campusNode);
}
}
return treeList;
}
}
@@ -0,0 +1,236 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormBuildingBo;
import org.dromara.xg.domain.vo.XgDormBuildingVo;
import org.dromara.xg.domain.XgDormBuilding;
import org.dromara.xg.domain.XgDormArea;
import org.dromara.xg.domain.XgDormCampus;
import org.dromara.xg.domain.vo.BuildingTreeSelectVo;
import org.dromara.xg.mapper.XgDormBuildingMapper;
import org.dromara.xg.mapper.XgDormAreaMapper;
import org.dromara.xg.mapper.XgDormCampusMapper;
import org.dromara.xg.service.IXgDormBuildingService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.ArrayList;
import java.util.stream.Collectors;
/**
* 宿舍楼信息Service业务层处理
*
* @author zlwu
* @date 2025-07-20
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormBuildingServiceImpl implements IXgDormBuildingService {
private final XgDormBuildingMapper baseMapper;
private final XgDormAreaMapper areaMapper;
private final XgDormCampusMapper campusMapper;
/**
* 查询宿舍楼信息
*
* @param id 主键
* @return 宿舍楼信息
*/
@Override
public XgDormBuildingVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询宿舍楼信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍楼信息分页列表
*/
@Override
public TableDataInfo<XgDormBuildingVo> queryPageList(XgDormBuildingBo bo, PageQuery pageQuery) {
Page<XgDormBuildingVo> result = baseMapper.selectPageWithAreaAndCampusName(pageQuery.build(), bo);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的宿舍楼信息列表
*
* @param bo 查询条件
* @return 宿舍楼信息列表
*/
@Override
public List<XgDormBuildingVo> queryList(XgDormBuildingBo bo) {
LambdaQueryWrapper<XgDormBuilding> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XgDormBuilding> buildQueryWrapper(XgDormBuildingBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormBuilding> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormBuilding::getId);
lqw.like(StringUtils.isNotBlank(bo.getBuildingCode()), XgDormBuilding::getBuildingCode, bo.getBuildingCode());
lqw.like(StringUtils.isNotBlank(bo.getBuildingName()), XgDormBuilding::getBuildingName, bo.getBuildingName());
lqw.eq(bo.getAreaId() != null, XgDormBuilding::getAreaId, bo.getAreaId());
lqw.eq(bo.getCampusId() != null, XgDormBuilding::getCampusId, bo.getCampusId());
lqw.eq(StringUtils.isNotBlank(bo.getBuildingType()), XgDormBuilding::getBuildingType, bo.getBuildingType());
lqw.eq(bo.getSortOrder() != null, XgDormBuilding::getSortOrder, bo.getSortOrder());
return lqw;
}
/**
* 新增宿舍楼信息
*
* @param bo 宿舍楼信息
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormBuildingBo bo) {
XgDormBuilding add = MapstructUtils.convert(bo, XgDormBuilding.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改宿舍楼信息
*
* @param bo 宿舍楼信息
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormBuildingBo bo) {
XgDormBuilding update = MapstructUtils.convert(bo, XgDormBuilding.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormBuilding entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除宿舍楼信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 获取宿舍楼树形结构数据
* 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择
*
* @return 宿舍楼树形结构数据
*/
@Override
public List<BuildingTreeSelectVo> getBuildingTreeData() {
// 1. 获取所有校区数据
List<XgDormCampus> campusList = campusMapper.selectList(
Wrappers.<XgDormCampus>lambdaQuery()
.orderByAsc(XgDormCampus::getSortOrder, XgDormCampus::getId));
// 2. 获取所有宿舍区数据
List<XgDormArea> areaList = areaMapper.selectList(
Wrappers.<XgDormArea>lambdaQuery()
.orderByAsc(XgDormArea::getSortOrder, XgDormArea::getId));
// 3. 获取所有宿舍楼数据
List<XgDormBuilding> buildingList = baseMapper.selectList(
Wrappers.<XgDormBuilding>lambdaQuery()
.orderByAsc(XgDormBuilding::getSortOrder, XgDormBuilding::getId));
// 4. 构建树形结构
List<BuildingTreeSelectVo> treeList = new ArrayList<>();
// 5. 先构建校区节点
for (XgDormCampus campus : campusList) {
BuildingTreeSelectVo campusNode = new BuildingTreeSelectVo();
campusNode.setId(campus.getId());
campusNode.setLabel(campus.getCampusName());
campusNode.setNodeType("campus");
campusNode.setDisabled(true); // 校区不可选
campusNode.setChildren(new ArrayList<>());
// 设置创建者和更新者字段
campusNode.setCreateBy(campus.getCreateBy());
campusNode.setCreateTime(campus.getCreateTime());
campusNode.setUpdateBy(campus.getUpdateBy());
campusNode.setUpdateTime(campus.getUpdateTime());
// 添加该校区下的宿舍区
List<XgDormArea> campusAreas = areaList.stream()
.filter(area -> area.getCampusId().equals(campus.getId()))
.collect(Collectors.toList());
for (XgDormArea area : campusAreas) {
BuildingTreeSelectVo areaNode = new BuildingTreeSelectVo();
areaNode.setId(area.getId());
areaNode.setLabel(area.getAreaName());
areaNode.setNodeType("area");
areaNode.setDisabled(true); // 宿舍区不可选
areaNode.setChildren(new ArrayList<>());
// 设置创建者和更新者字段
areaNode.setCreateBy(area.getCreateBy());
areaNode.setCreateTime(area.getCreateTime());
areaNode.setUpdateBy(area.getUpdateBy());
areaNode.setUpdateTime(area.getUpdateTime());
// 添加该宿舍区下的宿舍楼
List<XgDormBuilding> areaBuildings = buildingList.stream()
.filter(building -> building.getAreaId().equals(area.getId()))
.collect(Collectors.toList());
for (XgDormBuilding building : areaBuildings) {
BuildingTreeSelectVo buildingNode = new BuildingTreeSelectVo();
buildingNode.setId(building.getId());
buildingNode.setLabel(building.getBuildingName());
buildingNode.setNodeType("building");
buildingNode.setDisabled(false); // 宿舍楼可选
buildingNode.setChildren(null); // 宿舍楼没有子节点
// 设置创建者和更新者字段
buildingNode.setCreateBy(building.getCreateBy());
buildingNode.setCreateTime(building.getCreateTime());
buildingNode.setUpdateBy(building.getUpdateBy());
buildingNode.setUpdateTime(building.getUpdateTime());
areaNode.getChildren().add(buildingNode);
}
campusNode.getChildren().add(areaNode);
}
treeList.add(campusNode);
}
return treeList;
}
}
@@ -0,0 +1,155 @@
package org.dromara.xg.service.impl;
import java.util.*;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import org.dromara.xg.service.IXgDormBuildingTreeService;
import org.dromara.xg.mapper.XgDormBuildingTreeMapper;
import org.dromara.xg.domain.vo.DormBuildingTreeVo;
import org.dromara.xg.domain.vo.DormBuildingInfoVo;
import org.dromara.xg.domain.bo.DormBuildingTreeBo;
import org.dromara.common.satoken.utils.LoginHelper;
/**
* 宿舍楼树形结构服务实现
*
* @author wuzilong
* @date 2025-07-03
*/
@RequiredArgsConstructor
@Service
public class XgDormBuildingTreeServiceImpl implements IXgDormBuildingTreeService {
private final XgDormBuildingTreeMapper dormBuildingTreeMapper;
/**
* 获取宿舍楼树形结构数据
*
* @param bo 查询参数
* @return 树形结构数据
*/
@Override
public List<DormBuildingTreeVo> getDormBuildingTree(DormBuildingTreeBo bo) {
// 获取当前登录用户ID
Long userId = LoginHelper.getUserId();
// 查询用户管理权限类型
List<String> managerTypes = dormBuildingTreeMapper.checkUserDormManagerType(userId);
if (managerTypes == null || managerTypes.isEmpty()) {
// 没有宿舍管理权限,返回空列表
return new ArrayList<>();
}
// 获取所有宿舍楼数据(根据权限过滤)
List<DormBuildingInfoVo> buildingList = new ArrayList<>();
// 按照权限分别查询并合并结果(支持用户拥有多种角色的情况)
if (managerTypes.contains("1")) {
// 全校管理员,获取所有宿舍楼
buildingList = dormBuildingTreeMapper.selectBuildingsBySchoolAdmin(userId, bo);
// 全校管理员可以查看所有宿舍楼,无需继续查询其他权限
} else {
// 对于非全校管理员,合并多种权限的结果
Set<Long> addedBuildingIds = new HashSet<>(); // 用于去重
if (managerTypes.contains("2")) {
// 校区管理员,获取管理的校区下的宿舍楼
List<DormBuildingInfoVo> campusBuildings = dormBuildingTreeMapper.selectBuildingsByCampusAdmin(userId,
bo);
for (DormBuildingInfoVo building : campusBuildings) {
if (addedBuildingIds.add(building.getId())) {
buildingList.add(building);
}
}
}
if (managerTypes.contains("3")) {
// 宿舍区管理员,获取管理的宿舍区下的宿舍楼
List<DormBuildingInfoVo> areaBuildings = dormBuildingTreeMapper.selectBuildingsByAreaAdmin(userId, bo);
for (DormBuildingInfoVo building : areaBuildings) {
if (addedBuildingIds.add(building.getId())) {
buildingList.add(building);
}
}
}
if (managerTypes.contains("4")) {
// 宿舍楼管理员,获取管理的宿舍楼
List<DormBuildingInfoVo> directBuildings = dormBuildingTreeMapper.selectBuildingsByBuildingAdmin(userId,
bo);
for (DormBuildingInfoVo building : directBuildings) {
if (addedBuildingIds.add(building.getId())) {
buildingList.add(building);
}
}
}
}
// 如果没有获取到宿舍楼数据,返回空列表
if (buildingList.isEmpty()) {
return new ArrayList<>();
}
// 获取相关校区和宿舍区数据
List<DormBuildingInfoVo> campusList = dormBuildingTreeMapper.selectCampusList();
List<DormBuildingInfoVo> areaList = dormBuildingTreeMapper.selectAreaList();
// 构建校区节点集合(第一层)
Map<Long, DormBuildingTreeVo> campusMap = new LinkedHashMap<>();
for (DormBuildingInfoVo campus : campusList) {
// 校区只保留有权限的宿舍楼所在的校区
if (buildingList.stream().anyMatch(b -> Objects.equals(b.getCampusId(), campus.getId()))) {
DormBuildingTreeVo campusNode = new DormBuildingTreeVo();
campusNode.setId(campus.getId());
campusNode.setLabel(campus.getBuildingName());
campusNode.setType("campus");
campusNode.setDisabled(true); // 校区节点禁止点击
campusNode.setChildren(new ArrayList<>());
campusMap.put(campus.getId(), campusNode);
}
}
// 构建宿舍区节点(第二层)
Map<Long, DormBuildingTreeVo> areaMap = new HashMap<>();
for (DormBuildingInfoVo area : areaList) {
// 宿舍区只保留有权限的宿舍楼所在的宿舍区
if (buildingList.stream().anyMatch(b -> Objects.equals(b.getAreaId(), area.getId()))) {
DormBuildingTreeVo areaNode = new DormBuildingTreeVo();
areaNode.setId(area.getId());
areaNode.setLabel(area.getBuildingName());
areaNode.setType("area");
areaNode.setDisabled(true); // 宿舍区节点禁止点击
areaNode.setChildren(new ArrayList<>());
areaMap.put(area.getId(), areaNode);
// 将宿舍区节点添加到对应的校区节点下
DormBuildingTreeVo campusNode = campusMap.get(area.getCampusId());
if (campusNode != null) {
campusNode.getChildren().add(areaNode);
}
}
}
// 构建宿舍楼节点(第三层)
for (DormBuildingInfoVo building : buildingList) {
DormBuildingTreeVo buildingNode = new DormBuildingTreeVo();
buildingNode.setId(building.getId());
buildingNode.setLabel(building.getBuildingName());
buildingNode.setType("building");
buildingNode.setDisabled(false); // 宿舍楼节点可点击
buildingNode.setBuildingFloors(building.getFloors());
// 将宿舍楼节点添加到对应的宿舍区节点下
DormBuildingTreeVo areaNode = areaMap.get(building.getAreaId());
if (areaNode != null) {
areaNode.getChildren().add(buildingNode);
}
}
// 返回树形结构的根节点列表(校区节点列表)
return new ArrayList<>(campusMap.values());
}
}
@@ -0,0 +1,133 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormCampusBo;
import org.dromara.xg.domain.vo.XgDormCampusVo;
import org.dromara.xg.domain.XgDormCampus;
import org.dromara.xg.mapper.XgDormCampusMapper;
import org.dromara.xg.service.IXgDormCampusService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 校区信息Service业务层处理
*
* @author zlwu
* @date 2025-07-20
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormCampusServiceImpl implements IXgDormCampusService {
private final XgDormCampusMapper baseMapper;
/**
* 查询校区信息
*
* @param id 主键
* @return 校区信息
*/
@Override
public XgDormCampusVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询校区信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 校区信息分页列表
*/
@Override
public TableDataInfo<XgDormCampusVo> queryPageList(XgDormCampusBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XgDormCampus> lqw = buildQueryWrapper(bo);
Page<XgDormCampusVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的校区信息列表
*
* @param bo 查询条件
* @return 校区信息列表
*/
@Override
public List<XgDormCampusVo> queryList(XgDormCampusBo bo) {
LambdaQueryWrapper<XgDormCampus> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XgDormCampus> buildQueryWrapper(XgDormCampusBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormCampus> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormCampus::getId);
lqw.like(StringUtils.isNotBlank(bo.getCampusCode()), XgDormCampus::getCampusCode, bo.getCampusCode());
lqw.like(StringUtils.isNotBlank(bo.getCampusName()), XgDormCampus::getCampusName, bo.getCampusName());
return lqw;
}
/**
* 新增校区信息
*
* @param bo 校区信息
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormCampusBo bo) {
XgDormCampus add = MapstructUtils.convert(bo, XgDormCampus.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改校区信息
*
* @param bo 校区信息
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormCampusBo bo) {
XgDormCampus update = MapstructUtils.convert(bo, XgDormCampus.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormCampus entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除校区信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}
@@ -0,0 +1,135 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormManagerBuildingBo;
import org.dromara.xg.domain.vo.XgDormManagerBuildingVo;
import org.dromara.xg.domain.XgDormManagerBuilding;
import org.dromara.xg.mapper.XgDormManagerBuildingMapper;
import org.dromara.xg.service.IXgDormManagerBuildingService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 管理员宿舍楼权限关系Service业务层处理
*
* @author Lion Li
* @date 2025-07-20
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormManagerBuildingServiceImpl implements IXgDormManagerBuildingService {
private final XgDormManagerBuildingMapper baseMapper;
/**
* 查询管理员宿舍楼权限关系
*
* @param id 主键
* @return 管理员宿舍楼权限关系
*/
@Override
public XgDormManagerBuildingVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询管理员宿舍楼权限关系列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 管理员宿舍楼权限关系分页列表
*/
@Override
public TableDataInfo<XgDormManagerBuildingVo> queryPageList(XgDormManagerBuildingBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XgDormManagerBuilding> lqw = buildQueryWrapper(bo);
Page<XgDormManagerBuildingVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的管理员宿舍楼权限关系列表
*
* @param bo 查询条件
* @return 管理员宿舍楼权限关系列表
*/
@Override
public List<XgDormManagerBuildingVo> queryList(XgDormManagerBuildingBo bo) {
LambdaQueryWrapper<XgDormManagerBuilding> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XgDormManagerBuilding> buildQueryWrapper(XgDormManagerBuildingBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormManagerBuilding> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormManagerBuilding::getId);
lqw.eq(bo.getManagerId() != null, XgDormManagerBuilding::getManagerId, bo.getManagerId());
lqw.eq(bo.getBuildingId() != null, XgDormManagerBuilding::getBuildingId, bo.getBuildingId());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XgDormManagerBuilding::getStatus, bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getDeleted()), XgDormManagerBuilding::getDeleted, bo.getDeleted());
return lqw;
}
/**
* 新增管理员宿舍楼权限关系
*
* @param bo 管理员宿舍楼权限关系
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormManagerBuildingBo bo) {
XgDormManagerBuilding add = MapstructUtils.convert(bo, XgDormManagerBuilding.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改管理员宿舍楼权限关系
*
* @param bo 管理员宿舍楼权限关系
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormManagerBuildingBo bo) {
XgDormManagerBuilding update = MapstructUtils.convert(bo, XgDormManagerBuilding.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormManagerBuilding entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除管理员宿舍楼权限关系信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}
@@ -0,0 +1,182 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormManagerBo;
import org.dromara.xg.domain.vo.XgDormManagerVo;
import org.dromara.xg.domain.XgDormManager;
import org.dromara.xg.mapper.XgDormManagerMapper;
import org.dromara.xg.service.IXgDormManagerService;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.ArrayList;
import java.util.HashMap;
/**
* 宿舍管理员信息Service业务层处理
*
* @author zlwu
* @date 2025-07-20
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormManagerServiceImpl implements IXgDormManagerService {
private final XgDormManagerMapper baseMapper;
private final JdbcTemplate jdbcTemplate;
/**
* 查询宿舍管理员信息
*
* @param id 主键
* @return 宿舍管理员信息
*/
@Override
public XgDormManagerVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询宿舍管理员信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍管理员信息分页列表
*/
@Override
public TableDataInfo<XgDormManagerVo> queryPageList(XgDormManagerBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XgDormManager> lqw = buildQueryWrapper(bo);
Page<XgDormManagerVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的宿舍管理员信息列表
*
* @param bo 查询条件
* @return 宿舍管理员信息列表
*/
@Override
public List<XgDormManagerVo> queryList(XgDormManagerBo bo) {
LambdaQueryWrapper<XgDormManager> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
/**
* 查询教师列表(用于下拉选择)
*
* @param name 教师姓名(可选,用于模糊查询)
* @return 教师列表
*/
@Override
public List<Map<String, Object>> queryTeacherList(String name, String managerType) {
StringBuilder sql = new StringBuilder();
sql.append(
"SELECT u.user_id as value, u.nick_name as label, u.user_name as username,u.phonenumber as phonenumber, u.sex as sex ");
sql.append("FROM sys_user u ");
sql.append("INNER JOIN sys_user_role ur ON u.user_id = ur.user_id ");
sql.append("INNER JOIN sys_role r ON ur.role_id = r.role_id ");
sql.append(
"WHERE r.role_key = 'teacher' AND u.status = '0' and not exists (select 1 from xg_dorm_manager where user_id = u.user_id and deleted = '0' and manager_type = '"
+ managerType + "') ");
List<Object> params = new ArrayList<>();
if (StringUtils.isNotBlank(name)) {
sql.append("AND u.nick_name LIKE ? ");
params.add("%" + name + "%");
}
sql.append("ORDER BY u.nick_name");
try {
if (params.isEmpty()) {
return jdbcTemplate.queryForList(sql.toString());
} else {
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
}
} catch (Exception e) {
log.error("查询教师列表异常", e);
return new ArrayList<>();
}
}
private LambdaQueryWrapper<XgDormManager> buildQueryWrapper(XgDormManagerBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormManager> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormManager::getId);
lqw.like(StringUtils.isNotBlank(bo.getManagerName()), XgDormManager::getManagerName, bo.getManagerName());
lqw.eq(StringUtils.isNotBlank(bo.getManagerType()), XgDormManager::getManagerType, bo.getManagerType());
lqw.eq(bo.getManagerLevel() != null, XgDormManager::getManagerLevel, bo.getManagerLevel());
lqw.eq(bo.getUserId() != null, XgDormManager::getUserId, bo.getUserId());
lqw.eq(StringUtils.isNotBlank(bo.getPhone()), XgDormManager::getPhone, bo.getPhone());
lqw.eq(StringUtils.isNotBlank(bo.getGender()), XgDormManager::getGender, bo.getGender());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XgDormManager::getStatus, bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getDeleted()), XgDormManager::getDeleted, bo.getDeleted());
return lqw;
}
/**
* 新增宿舍管理员信息
*
* @param bo 宿舍管理员信息
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormManagerBo bo) {
XgDormManager add = MapstructUtils.convert(bo, XgDormManager.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改宿舍管理员信息
*
* @param bo 宿舍管理员信息
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormManagerBo bo) {
XgDormManager update = MapstructUtils.convert(bo, XgDormManager.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormManager entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除宿舍管理员信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}
@@ -0,0 +1,253 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.xg.domain.bo.XgDormManagerSourceBo;
import org.dromara.xg.domain.vo.XgDormManagerSourceVo;
import org.dromara.xg.domain.XgDormManagerSource;
import org.dromara.xg.mapper.XgDormManagerSourceMapper;
import org.dromara.xg.service.IXgDormManagerSourceService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Date;
import java.util.stream.Collectors;
/**
* 管理员授权关系Service业务层处理
*
* @author zlwu
* @date 2025-07-20
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormManagerSourceServiceImpl implements IXgDormManagerSourceService {
private final XgDormManagerSourceMapper baseMapper;
/**
* 查询管理员授权关系
*
* @param id 主键
* @return 管理员授权关系
*/
@Override
public XgDormManagerSourceVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询管理员授权关系列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 管理员授权关系分页列表
*/
@Override
public TableDataInfo<XgDormManagerSourceVo> queryPageList(XgDormManagerSourceBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XgDormManagerSource> lqw = buildQueryWrapper(bo);
Page<XgDormManagerSourceVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的管理员授权关系列表
*
* @param bo 查询条件
* @return 管理员授权关系列表
*/
@Override
public List<XgDormManagerSourceVo> queryList(XgDormManagerSourceBo bo) {
LambdaQueryWrapper<XgDormManagerSource> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XgDormManagerSource> buildQueryWrapper(XgDormManagerSourceBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormManagerSource> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormManagerSource::getId);
lqw.eq(bo.getManagerId() != null, XgDormManagerSource::getManagerId, bo.getManagerId());
lqw.eq(StringUtils.isNotBlank(bo.getPermissionType()), XgDormManagerSource::getPermissionType,
bo.getPermissionType());
lqw.eq(StringUtils.isNotBlank(bo.getAuthType()), XgDormManagerSource::getAuthType, bo.getAuthType());
lqw.eq(bo.getAuthSource() != null, XgDormManagerSource::getAuthSource, bo.getAuthSource());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XgDormManagerSource::getStatus, bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getDeleted()), XgDormManagerSource::getDeleted, bo.getDeleted());
return lqw;
}
/**
* 新增管理员授权关系
*
* @param bo 管理员授权关系
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormManagerSourceBo bo) {
XgDormManagerSource add = MapstructUtils.convert(bo, XgDormManagerSource.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改管理员授权关系
*
* @param bo 管理员授权关系
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormManagerSourceBo bo) {
XgDormManagerSource update = MapstructUtils.convert(bo, XgDormManagerSource.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormManagerSource entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除管理员授权关系信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 批量分配管理员数据范围
*
* @param managerId 管理员ID
* @param authType 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @param authSourceIds 授权来源ID列表
* @return 是否分配成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean assignScope(Long managerId, Character authType, List<Long> authSourceIds) {
if (managerId == null || authType == null) {
return false;
}
try {
// 1. 逻辑删除该管理员指定授权类型的现有数据
LambdaUpdateWrapper<XgDormManagerSource> updateWrapper = Wrappers.lambdaUpdate(XgDormManagerSource.class)
.set(XgDormManagerSource::getDeleted, "1") // 标记为已删除
.eq(XgDormManagerSource::getManagerId, managerId)
.eq(XgDormManagerSource::getAuthType, authType.toString())
.eq(XgDormManagerSource::getDeleted, "0"); // 只更新未删除的记录
baseMapper.update(null, updateWrapper);
// 2. 批量插入新的授权关系
if (authSourceIds != null && !authSourceIds.isEmpty()) {
for (Long authSourceId : authSourceIds) {
XgDormManagerSource entity = new XgDormManagerSource();
entity.setManagerId(managerId);
entity.setAuthType(authType.toString());
entity.setAuthSource(authSourceId);
entity.setPermissionType("3"); // 默认完全管理权限
entity.setStatus("0"); // 有效状态
baseMapper.insert(entity); // MyBatis-Plus会自动填充BaseEntity中定义的字段
}
}
return true;
} catch (Exception e) {
log.error("批量分配管理员数据范围失败", e);
throw e;
}
}
/**
* 获取管理员授权范围名称
*
* @param managerId 管理员ID
* @param managerType 管理员类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @return 授权范围名称(逗号分隔字符串)
*/
@Override
public String getScopeNames(Long managerId, Integer managerType) {
if (managerId == null || managerType == null) {
return "";
}
try {
// 全校级管理员无需关联其他表,直接返回"全校"
if (managerType == 1) {
return "全校";
}
// 转换managerType为Character类型,与数据库authType匹配
String authType = String.valueOf(managerType);
// 查询该管理员的授权范围ID列表
LambdaQueryWrapper<XgDormManagerSource> queryWrapper = Wrappers.lambdaQuery(XgDormManagerSource.class)
.eq(XgDormManagerSource::getManagerId, managerId)
.eq(XgDormManagerSource::getAuthType, authType)
.eq(XgDormManagerSource::getDeleted, "0") // 未删除的记录
.eq(XgDormManagerSource::getStatus, "0"); // 状态为有效
List<XgDormManagerSource> sources = baseMapper.selectList(queryWrapper);
if (sources.isEmpty()) {
return "";
}
// 提取授权来源ID列表
List<Long> sourceIds = sources.stream()
.map(XgDormManagerSource::getAuthSource)
.collect(Collectors.toList());
// 根据不同管理员类型,关联不同表获取名称
String scopeNames = "";
switch (managerType) {
case 2:
// 校区级管理员,关联xg_dorm_campus表
scopeNames = baseMapper.getCampusNamesByIds(sourceIds);
break;
case 3:
// 宿舍区管理员,关联xg_dorm_area表
scopeNames = baseMapper.getAreaNamesByIds(sourceIds);
break;
case 4:
// 宿舍楼管理员,关联xg_dorm_building表
scopeNames = baseMapper.getBuildingNamesByIds(sourceIds);
break;
default:
return "";
}
return scopeNames;
} catch (Exception e) {
log.error("获取管理员授权范围名称失败", e);
return "";
}
}
}
@@ -0,0 +1,140 @@
package org.dromara.xg.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xg.domain.bo.XgDormRoomBo;
import org.dromara.xg.domain.vo.XgDormRoomVo;
import org.dromara.xg.domain.XgDormRoom;
import org.dromara.xg.mapper.XgDormRoomMapper;
import org.dromara.xg.service.IXgDormRoomService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 宿舍房间信息Service业务层处理
*
* @author zlwu
* @date 2025-07-22
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XgDormRoomServiceImpl implements IXgDormRoomService {
private final XgDormRoomMapper baseMapper;
/**
* 查询宿舍房间信息
*
* @param id 主键
* @return 宿舍房间信息
*/
@Override
public XgDormRoomVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询宿舍房间信息列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 宿舍房间信息分页列表
*/
@Override
public TableDataInfo<XgDormRoomVo> queryPageList(XgDormRoomBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XgDormRoom> lqw = buildQueryWrapper(bo);
Page<XgDormRoomVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的宿舍房间信息列表
*
* @param bo 查询条件
* @return 宿舍房间信息列表
*/
@Override
public List<XgDormRoomVo> queryList(XgDormRoomBo bo) {
LambdaQueryWrapper<XgDormRoom> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XgDormRoom> buildQueryWrapper(XgDormRoomBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XgDormRoom> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(XgDormRoom::getId);
lqw.like(StringUtils.isNotBlank(bo.getRoomCode()), XgDormRoom::getRoomCode, bo.getRoomCode());
lqw.like(StringUtils.isNotBlank(bo.getRoomName()), XgDormRoom::getRoomName, bo.getRoomName());
lqw.eq(bo.getBuildingId() != null, XgDormRoom::getBuildingId, bo.getBuildingId());
lqw.eq(bo.getFloorNum() != null, XgDormRoom::getFloorNum, bo.getFloorNum());
lqw.eq(StringUtils.isNotBlank(bo.getRoomType()), XgDormRoom::getRoomType, bo.getRoomType());
lqw.eq(bo.getActualBeds() != null, XgDormRoom::getActualBeds, bo.getActualBeds());
lqw.eq(bo.getRoomArea() != null, XgDormRoom::getRoomArea, bo.getRoomArea());
lqw.eq(StringUtils.isNotBlank(bo.getRoomStatus()), XgDormRoom::getRoomStatus, bo.getRoomStatus());
lqw.eq(StringUtils.isNotBlank(bo.getDeleted()), XgDormRoom::getDeleted, bo.getDeleted());
return lqw;
}
/**
* 新增宿舍房间信息
*
* @param bo 宿舍房间信息
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(XgDormRoomBo bo) {
XgDormRoom add = MapstructUtils.convert(bo, XgDormRoom.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改宿舍房间信息
*
* @param bo 宿舍房间信息
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(XgDormRoomBo bo) {
XgDormRoom update = MapstructUtils.convert(bo, XgDormRoom.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XgDormRoom entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除宿舍房间信息信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormManagerSourceMapper">
<!-- 根据ID列表获取校区名称(逗号分隔) -->
<select id="getCampusNamesByIds" resultType="String">
SELECT
GROUP_CONCAT(campus_name SEPARATOR ',')
FROM
xg_dorm_campus
WHERE
id IN
<foreach collection="sourceIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND deleted = '0'
</select>
<!-- 根据ID列表获取宿舍区名称(逗号分隔) -->
<select id="getAreaNamesByIds" resultType="String">
SELECT
GROUP_CONCAT(area_name SEPARATOR ',')
FROM
xg_dorm_area
WHERE
id IN
<foreach collection="sourceIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND deleted = '0'
</select>
<!-- 根据ID列表获取宿舍楼名称(逗号分隔) -->
<select id="getBuildingNamesByIds" resultType="String">
SELECT
GROUP_CONCAT(building_name SEPARATOR ',')
FROM
xg_dorm_building
WHERE
id IN
<foreach collection="sourceIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND deleted = '0'
</select>
</mapper>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormManagerBuildingMapper">
</mapper>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormManagerMapper">
</mapper>
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormBuildingMapper">
<select id="selectPageWithAreaAndCampusName" resultType="org.dromara.xg.domain.vo.XgDormBuildingVo">
SELECT
b.id,
b.building_code,
b.building_name,
b.area_id,
a.area_name,
b.campus_id,
c.campus_name,
b.building_type,
b.building_description,
b.floors,
b.sort_order,
b.deleted,
b.remark,
b.create_by,
b.create_time,
b.update_by,
b.update_time
FROM xg_dorm_building b
LEFT JOIN xg_dorm_area a ON b.area_id = a.id
LEFT JOIN xg_dorm_campus c ON b.campus_id = c.id
<where>
<if test="bo.buildingCode != null and bo.buildingCode != ''">
AND b.building_code LIKE CONCAT('%', #{bo.buildingCode}, '%')
</if>
<if test="bo.buildingName != null and bo.buildingName != ''">
AND b.building_name LIKE CONCAT('%', #{bo.buildingName}, '%')
</if>
<if test="bo.areaId != null">
AND b.area_id = #{bo.areaId}
</if>
<if test="bo.campusId != null">
AND b.campus_id = #{bo.campusId}
</if>
<if test="bo.buildingType != null and bo.buildingType != ''">
AND b.building_type = #{bo.buildingType}
</if>
<if test="bo.buildingDescription != null and bo.buildingDescription != ''">
AND b.building_description LIKE CONCAT('%', #{bo.buildingDescription}, '%')
</if>
AND b.deleted = '0'
</where>
ORDER BY b.id ASC
</select>
</mapper>
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormAreaMapper">
<select id="selectPageWithCampusName" resultType="org.dromara.xg.domain.vo.XgDormAreaVo">
SELECT
a.id,
a.area_code,
a.area_name,
a.campus_id,
a.area_description,
a.sort_order,
a.deleted,
a.remark,
c.campus_name
FROM xg_dorm_area a
LEFT JOIN xg_dorm_campus c ON a.campus_id = c.id
<where>
<if test="bo.areaCode != null and bo.areaCode != ''">
AND a.area_code LIKE CONCAT('%', #{bo.areaCode}, '%')
</if>
<if test="bo.areaName != null and bo.areaName != ''">
AND a.area_name LIKE CONCAT('%', #{bo.areaName}, '%')
</if>
<if test="bo.areaDescription != null and bo.areaDescription != ''">
AND a.area_description LIKE CONCAT('%', #{bo.areaDescription}, '%')
</if>
<if test="bo.campusId != null">
AND a.campus_id = #{bo.campusId}
</if>
AND a.deleted = '0'
</where>
ORDER BY a.id ASC
</select>
</mapper>
@@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormBuildingTreeMapper">
<resultMap id="BuildingInfoMap" type="org.dromara.xg.domain.vo.DormBuildingInfoVo">
<id property="id" column="id"/>
<result property="buildingName" column="building_name"/>
<result property="buildingCode" column="building_code"/>
<result property="campusId" column="campus_id"/>
<result property="campusName" column="campus_name"/>
<result property="areaId" column="area_id"/>
<result property="areaName" column="area_name"/>
<result property="floors" column="floors"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<!-- 获取所有校区信息 -->
<select id="selectCampusList" resultMap="BuildingInfoMap">
SELECT
id,
campus_name as building_name,
'0' as status
FROM
xg_dorm_campus
WHERE
deleted = '0'
</select>
<!-- 获取所有宿舍区信息 -->
<select id="selectAreaList" resultMap="BuildingInfoMap">
SELECT
a.id,
a.area_name as building_name,
a.campus_id,
c.campus_name,
'0' as status
FROM
xg_dorm_area a
LEFT JOIN
xg_dorm_campus c ON a.campus_id = c.id
WHERE
a.deleted = '0'
</select>
<!-- 获取所有宿舍楼信息 -->
<select id="selectBuildingList" parameterType="org.dromara.xg.domain.bo.DormBuildingTreeBo" resultMap="BuildingInfoMap">
SELECT
b.id,
b.building_name,
b.building_code,
b.campus_id,
c.campus_name,
b.area_id,
a.area_name,
b.floors,
b.remark,
b.create_by,
b.create_time,
b.update_by,
b.update_time
FROM
xg_dorm_building b
LEFT JOIN
xg_dorm_campus c ON b.campus_id = c.id
LEFT JOIN
xg_dorm_area a ON b.area_id = a.id
WHERE
b.deleted = '0'
<if test="campusId != null">
AND b.campus_id = #{campusId}
</if>
<if test="areaId != null">
AND b.area_id = #{areaId}
</if>
<if test="buildingName != null and buildingName != ''">
AND b.building_name like concat('%', #{buildingName}, '%')
</if>
<if test="status != null and status != ''">
AND b.status = #{status}
</if>
</select>
<!-- 检查用户是否有宿舍管理权限 -->
<select id="checkUserDormManagerType" resultType="String">
SELECT
DISTINCT manager_type
FROM
xg_dorm_manager
WHERE
user_id = #{userId}
AND deleted = '0'
</select>
<!-- 获取全校管理员权限的宿舍楼信息 -->
<select id="selectBuildingsBySchoolAdmin" resultMap="BuildingInfoMap">
SELECT
b.id,
b.building_name,
b.building_code,
b.campus_id,
c.campus_name,
b.area_id,
a.area_name,
b.floors,
b.remark,
b.create_by,
b.create_time,
b.update_by,
b.update_time
FROM
xg_dorm_building b
LEFT JOIN
xg_dorm_campus c ON b.campus_id = c.id
LEFT JOIN
xg_dorm_area a ON b.area_id = a.id
WHERE
b.deleted = '0'
AND EXISTS (
SELECT 1 FROM xg_dorm_manager m
WHERE m.user_id = #{userId}
AND m.manager_type = '1'
AND m.deleted = '0'
)
<if test="bo.campusId != null">
AND b.campus_id = #{bo.campusId}
</if>
<if test="bo.areaId != null">
AND b.area_id = #{bo.areaId}
</if>
<if test="bo.buildingName != null and bo.buildingName != ''">
AND b.building_name like concat('%', #{bo.buildingName}, '%')
</if>
<if test="bo.status != null and bo.status != ''">
AND b.status = #{bo.status}
</if>
</select>
<!-- 获取校区管理员权限的宿舍楼信息 -->
<select id="selectBuildingsByCampusAdmin" resultMap="BuildingInfoMap">
SELECT
b.id,
b.building_name,
b.building_code,
b.campus_id,
c.campus_name,
b.area_id,
a.area_name,
b.floors,
b.remark,
b.create_by,
b.create_time,
b.update_by,
b.update_time
FROM
xg_dorm_building b
LEFT JOIN
xg_dorm_campus c ON b.campus_id = c.id
LEFT JOIN
xg_dorm_area a ON b.area_id = a.id
WHERE
b.deleted = '0'
AND b.campus_id IN (
SELECT
auth_source
FROM
xg_dorm_manager m
JOIN
xg_dorm_manager_source s ON m.id = s.manager_id
WHERE
m.user_id = #{userId}
AND m.manager_type = '2'
AND m.deleted = '0'
AND s.deleted = '0'
)
<if test="bo.campusId != null">
AND b.campus_id = #{bo.campusId}
</if>
<if test="bo.areaId != null">
AND b.area_id = #{bo.areaId}
</if>
<if test="bo.buildingName != null and bo.buildingName != ''">
AND b.building_name like concat('%', #{bo.buildingName}, '%')
</if>
<if test="bo.status != null and bo.status != ''">
AND b.status = #{bo.status}
</if>
</select>
<!-- 获取宿舍区管理员权限的宿舍楼信息 -->
<select id="selectBuildingsByAreaAdmin" resultMap="BuildingInfoMap">
SELECT
b.id,
b.building_name,
b.building_code,
b.campus_id,
c.campus_name,
b.area_id,
a.area_name,
b.floors,
b.remark,
b.create_by,
b.create_time,
b.update_by,
b.update_time
FROM
xg_dorm_building b
LEFT JOIN
xg_dorm_campus c ON b.campus_id = c.id
LEFT JOIN
xg_dorm_area a ON b.area_id = a.id
WHERE
b.deleted = '0'
AND b.area_id IN (
SELECT
auth_source
FROM
xg_dorm_manager m
JOIN
xg_dorm_manager_source s ON m.id = s.manager_id
WHERE
m.user_id = #{userId}
AND m.manager_type = '3'
AND m.deleted = '0'
AND s.deleted = '0'
)
<if test="bo.campusId != null">
AND b.campus_id = #{bo.campusId}
</if>
<if test="bo.areaId != null">
AND b.area_id = #{bo.areaId}
</if>
<if test="bo.buildingName != null and bo.buildingName != ''">
AND b.building_name like concat('%', #{bo.buildingName}, '%')
</if>
<if test="bo.status != null and bo.status != ''">
AND b.status = #{bo.status}
</if>
</select>
<!-- 获取宿舍楼管理员权限的宿舍楼信息 -->
<select id="selectBuildingsByBuildingAdmin" resultMap="BuildingInfoMap">
SELECT
b.id,
b.building_name,
b.building_code,
b.campus_id,
c.campus_name,
b.area_id,
a.area_name,
b.floors,
b.remark,
b.create_by,
b.create_time,
b.update_by,
b.update_time
FROM
xg_dorm_building b
LEFT JOIN
xg_dorm_campus c ON b.campus_id = c.id
LEFT JOIN
xg_dorm_area a ON b.area_id = a.id
WHERE
b.deleted = '0'
AND b.id IN (
SELECT
auth_source
FROM
xg_dorm_manager m
JOIN
xg_dorm_manager_source s ON m.id = s.manager_id
WHERE
m.user_id = #{userId}
AND m.manager_type = '4'
AND m.deleted = '0'
AND s.deleted = '0'
)
<if test="bo.campusId != null">
AND b.campus_id = #{bo.campusId}
</if>
<if test="bo.areaId != null">
AND b.area_id = #{bo.areaId}
</if>
<if test="bo.buildingName != null and bo.buildingName != ''">
AND b.building_name like concat('%', #{bo.buildingName}, '%')
</if>
<if test="bo.status != null and bo.status != ''">
AND b.status = #{bo.status}
</if>
</select>
</mapper>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormRoomMapper">
</mapper>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.xg.mapper.XgDormCampusMapper">
</mapper>
+29
View File
@@ -0,0 +1,29 @@
-- ----------------------------
-- 宿舍管理员表
-- ----------------------------
drop table if exists xg_dorm_manager;
create table xg_dorm_manager (
id bigint(20) not null comment '主键',
name varchar(100) not null comment '管理员姓名',
phone varchar(11) not null comment '手机号码',
sex int(1) default 0 comment '性别(0男 1女 2未知)',
manager_type int(1) default 0 comment '管理类型(0全校 1校区 2宿舍区 3宿舍楼)',
scope varchar(100) comment '管理范围(校区/宿舍区/宿舍楼)',
user_id bigint(20) comment '关联用户ID',
remark varchar(500) comment '备注',
create_by bigint(20) comment '创建者',
create_time datetime comment '创建时间',
update_by bigint(20) comment '更新者',
update_time datetime comment '更新时间',
deleted char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
tenant_id varchar(20) default '000000' comment '租户编号',
primary key (id)
) engine=innodb comment = '宿舍管理员信息表';
-- ----------------------------
-- 初始数据
-- ----------------------------
INSERT INTO xg_dorm_manager(id, name, phone, sex, manager_type, scope, user_id, remark, create_by, create_time, update_by, update_time, deleted, tenant_id)
VALUES (1, '张三', '13800000001', 0, 0, null, 2, '全校主管', 1, sysdate(), 1, sysdate(), '0', '000000');
INSERT INTO xg_dorm_manager(id, name, phone, sex, manager_type, scope, user_id, remark, create_by, create_time, update_by, update_time, deleted, tenant_id)
VALUES (2, '李四', '13800000002', 1, 0, null, 3, '全校副主管', 1, sysdate(), 1, sysdate(), '0', '000000');
@@ -35,53 +35,29 @@
**表说明**:定义宿舍管理的各个维度,支持维度的灵活扩展
```sql
CREATE TABLE `dorm_management_dimension` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`dimension_code` varchar(50) NOT NULL COMMENT '维度编码',
`dimension_name` varchar(100) NOT NULL COMMENT '维度名称',
`dimension_level` int(11) NOT NULL COMMENT '维度层级(1-5)',
`parent_dimension_id` bigint(20) DEFAULT NULL COMMENT '父维度ID',
`description` varchar(500) DEFAULT NULL COMMENT '维度描述',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dimension_code` (`dimension_code`),
KEY `idx_parent_dimension` (`parent_dimension_id`),
KEY `idx_dimension_level` (`dimension_level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍管理维度定义表';
```
#### 1.2 校区信息表 (dorm_campus)
**表说明**:存储校区基本信息
```sql
CREATE TABLE `dorm_campus` (
DROP TABLE IF EXISTS `xg_dorm_campus`;
CREATE TABLE `xg_dorm_campus` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`campus_code` varchar(50) NOT NULL COMMENT '校区编码',
`campus_name` varchar(100) NOT NULL COMMENT '校区名称',
`campus_address` varchar(200) DEFAULT NULL COMMENT '校区地址',
`campus_phone` varchar(20) DEFAULT NULL COMMENT '校区联系电话',
`campus_manager` varchar(50) DEFAULT NULL COMMENT '校区负责人',
`campus_description` varchar(500) DEFAULT NULL COMMENT '校区描述',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`sort_order` int(11) DEFAULT '0' COMMENT '排序号',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_campus_code` (`campus_code`),
KEY `idx_campus_status` (`status`)
UNIQUE KEY `uk_campus_code` (`campus_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='校区信息表';
```
@@ -89,56 +65,18 @@ CREATE TABLE `dorm_campus` (
**表说明**:存储宿舍区基本信息,关联校区
```sql
CREATE TABLE `dorm_area` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`area_code` varchar(50) NOT NULL COMMENT '宿舍区编码',
`area_name` varchar(100) NOT NULL COMMENT '宿舍区名称',
`campus_id` bigint(20) NOT NULL COMMENT '所属校区ID',
`area_address` varchar(200) DEFAULT NULL COMMENT '宿舍区地址',
`area_phone` varchar(20) DEFAULT NULL COMMENT '宿舍区联系电话',
`area_manager` varchar(50) DEFAULT NULL COMMENT '宿舍区负责人',
`building_count` int(11) DEFAULT 0 COMMENT '宿舍楼数量',
`student_count` int(11) DEFAULT 0 COMMENT '学生数量',
`area_description` varchar(500) DEFAULT NULL COMMENT '宿舍区描述',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_area_code` (`area_code`),
KEY `idx_campus_id` (`campus_id`),
KEY `idx_area_status` (`status`),
CONSTRAINT `fk_area_campus` FOREIGN KEY (`campus_id`) REFERENCES `dorm_campus` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍区信息表';
```
#### 1.4 宿舍楼信息表 (dorm_building)
**表说明**:存储宿舍楼基本信息,关联宿舍区
```sql
CREATE TABLE `dorm_building` (
DROP TABLE IF EXISTS `xg_dorm_building`;
CREATE TABLE `xg_dorm_building` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`building_code` varchar(50) NOT NULL COMMENT '宿舍楼编码',
`building_name` varchar(100) NOT NULL COMMENT '宿舍楼名称',
`area_id` bigint(20) NOT NULL COMMENT '所属宿舍区ID',
`campus_id` bigint(20) NOT NULL COMMENT '所属校区ID',
`building_address` varchar(200) DEFAULT NULL COMMENT '宿舍楼地址',
`building_phone` varchar(20) DEFAULT NULL COMMENT '宿舍楼联系电话',
`building_manager` varchar(50) DEFAULT NULL COMMENT '宿舍楼负责人',
`floor_count` int(11) DEFAULT 0 COMMENT '楼层数',
`room_count` int(11) DEFAULT 0 COMMENT '房间数',
`student_count` int(11) DEFAULT 0 COMMENT '学生数量',
`building_type` char(1) DEFAULT '1' COMMENT '宿舍楼类型(1男生楼 2女生楼 3混合楼)',
`building_description` varchar(500) DEFAULT NULL COMMENT '宿舍楼描述',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`sort_order` int(11) DEFAULT '0' COMMENT '排序号',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
@@ -148,136 +86,158 @@ CREATE TABLE `dorm_building` (
UNIQUE KEY `uk_building_code` (`building_code`),
KEY `idx_area_id` (`area_id`),
KEY `idx_campus_id` (`campus_id`),
KEY `idx_building_status` (`status`),
CONSTRAINT `fk_building_area` FOREIGN KEY (`area_id`) REFERENCES `dorm_area` (`id`),
CONSTRAINT `fk_building_campus` FOREIGN KEY (`campus_id`) REFERENCES `dorm_campus` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍楼信息表';
```
#### 1.5 二级学院信息表 (dorm_college)
**表说明**:存储二级学院基本信息
#### 1.4 宿舍楼信息表 (dorm_building)
**表说明**:存储宿舍楼基本信息,关联宿舍区
```sql
CREATE TABLE `dorm_college` (
DROP TABLE IF EXISTS `xg_dorm_area`;
CREATE TABLE `xg_dorm_area` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`college_code` varchar(50) NOT NULL COMMENT '学院编码',
`college_name` varchar(100) NOT NULL COMMENT '学院名称',
`campus_id` bigint(20) DEFAULT NULL COMMENT '所属校区ID',
`college_address` varchar(200) DEFAULT NULL COMMENT '学院地址',
`college_phone` varchar(20) DEFAULT NULL COMMENT '学院联系电话',
`college_manager` varchar(50) DEFAULT NULL COMMENT '学院负责人',
`student_count` int(11) DEFAULT 0 COMMENT '学生数量',
`college_description` varchar(500) DEFAULT NULL COMMENT '学院描述',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`area_code` varchar(50) NOT NULL COMMENT '宿舍区编码',
`area_name` varchar(100) NOT NULL COMMENT '宿舍区名称',
`campus_id` bigint(20) NOT NULL COMMENT '所属校区ID',
`area_description` varchar(500) DEFAULT NULL COMMENT '宿舍区描述',
`sort_order` int(11) DEFAULT '0' COMMENT '排序号',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_college_code` (`college_code`),
UNIQUE KEY `uk_area_code` (`area_code`),
KEY `idx_campus_id` (`campus_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍区信息表';
```
#### 1.5 宿舍房间表 (dorm_room)
**表说明**:存储宿舍房间基本信息,关联宿舍楼,包含楼层属性
```sql
DROP TABLE IF EXISTS `xg_dorm_room`;
CREATE TABLE `xg_dorm_room` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`room_code` varchar(50) NOT NULL COMMENT '房间编号',
`room_name` varchar(100) NOT NULL COMMENT '房间名称',
`building_id` bigint(20) NOT NULL COMMENT '所属宿舍楼ID',
`floor_num` int(11) NOT NULL COMMENT '楼层',
`room_type` char(1) DEFAULT '1' COMMENT '房间类型(1学生宿舍 3教师宿舍)',
`actual_beds` int(11) DEFAULT 4 COMMENT '实际床位数',
`room_area` decimal(10,2) DEFAULT NULL COMMENT '房间面积(平方米)',
`room_status` char(1) DEFAULT '0' COMMENT '房间状态(0可用 1维修中 2已报废)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_room_code` (`room_code`),
KEY `idx_building_id` (`building_id`),
KEY `idx_floor_num` (`floor_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍房间信息表';
```
#### 1.6 宿舍床位表 (dorm_bed)
**表说明**:存储宿舍床位基本信息,关联宿舍房间
```sql
DROP TABLE IF EXISTS `xg_dorm_bed`;
CREATE TABLE `xg_dorm_bed` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`bed_code` varchar(50) NOT NULL COMMENT '床位编号',
`bed_name` varchar(100) NOT NULL COMMENT '床位名称',
`room_id` bigint(20) NOT NULL COMMENT '所属房间ID',
`bed_type` char(1) DEFAULT '1' COMMENT '床位类型(1下铺 2上铺 3中铺 4独立床)',
`bed_status` char(1) DEFAULT '0' COMMENT '床位状态(0空闲 1已分配 2维修中)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bed_code` (`bed_code`),
KEY `idx_room_id` (`room_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍床位信息表';
DROP TABLE IF EXISTS `xg_dorm_bed_student`;
CREATE TABLE `xg_dorm_bed_student` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`college_id` bigint(20) NOT NULL COMMENT '分配学院ID',
`student_id` bigint(20) NOT NULL COMMENT '分配学生ID',
`bed_id` bigint(20) NOT NULL COMMENT '床位ID',
`room_id` bigint(20) NOT NULL COMMENT '房间ID',
`building_id` bigint(20) NOT NULL COMMENT '宿舍楼ID',
`area_id` bigint(20) NOT NULL COMMENT '宿舍区ID',
`campus_id` bigint(20) NOT NULL COMMENT '校区ID',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1已退宿)',
`assign_time` datetime NOT NULL COMMENT '分配时间',
`checkout_time` datetime DEFAULT NULL COMMENT '退宿时间',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_student_bed` (`student_id`, `bed_id`),
KEY `idx_college_id` (`college_id`),
KEY `idx_student_id` (`student_id`),
KEY `idx_bed_id` (`bed_id`),
KEY `idx_room_id` (`room_id`),
KEY `idx_building_id` (`building_id`),
KEY `idx_area_id` (`area_id`),
KEY `idx_campus_id` (`campus_id`),
KEY `idx_college_status` (`status`),
CONSTRAINT `fk_college_campus` FOREIGN KEY (`campus_id`) REFERENCES `dorm_campus` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='二级学院信息表';
KEY `idx_assign_time` (`assign_time`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='床位学生分配关系表';
```
### 2. 管理人员表
### 2. 宿舍管理人员相关表
#### 2.1 宿舍管理人员基本信息表 (dorm_manager)
**表说明**:存储宿舍管理人员的基本信息
#### 2.1 宿舍管理员表 (dorm_manager)
**表说明**:存储全校、校区、宿舍区、宿舍楼管理员的基本信息
```sql
CREATE TABLE `dorm_manager` (
DROP TABLE IF EXISTS `xg_dorm_manager`;
CREATE TABLE `xg_dorm_manager` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_code` varchar(50) NOT NULL COMMENT '管理人员编码',
`manager_name` varchar(50) NOT NULL COMMENT '管理人员姓名',
`gender` char(1) DEFAULT NULL COMMENT '性别(0男 1女 2未知)',
`birth_date` date DEFAULT NULL COMMENT '出生日期',
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
`phone` varchar(11) DEFAULT NULL COMMENT '手机号码',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱地址',
`office_phone` varchar(20) DEFAULT NULL COMMENT '办公电话',
`department` varchar(100) DEFAULT NULL COMMENT '所属部门',
`position` varchar(100) DEFAULT NULL COMMENT '职位',
`hire_date` date DEFAULT NULL COMMENT '入职时间',
`work_status` char(1) DEFAULT '0' COMMENT '工作状态(0在职 1离职 2休假)',
`education` varchar(50) DEFAULT NULL COMMENT '学历',
`major` varchar(100) DEFAULT NULL COMMENT '专业',
`certificates` varchar(500) DEFAULT NULL COMMENT '相关证书',
`manager_description` varchar(500) DEFAULT NULL COMMENT '个人描述',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`manager_name` varchar(100) NOT NULL COMMENT '管理员姓名',
`manager_type` char(1) NOT NULL COMMENT '管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)',
`manager_level` int(11) DEFAULT 1 COMMENT '管理级别(1-5,1为最高)',
`user_id` bigint(20) DEFAULT NULL COMMENT '关联用户ID',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`gender` char(1) DEFAULT '0' COMMENT '性别(0男 1女 2未知)',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_manager_code` (`manager_code`),
UNIQUE KEY `uk_id_card` (`id_card`),
KEY `idx_manager_name` (`manager_name`),
KEY `idx_phone` (`phone`),
KEY `idx_manager_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍管理人员基本信息表';
```
KEY `idx_user_id` (`user_id`),
KEY `idx_manager_type` (`manager_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍管理员信息表';
#### 2.2 管理人员职位表 (dorm_manager_position)
**表说明**:存储管理人员的职位信息
```sql
CREATE TABLE `dorm_manager_position` (
DROP TABLE IF EXISTS `xg_dorm_manager_source`;
CREATE TABLE `xg_dorm_manager_source` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`position_code` varchar(50) NOT NULL COMMENT '职位编码',
`position_name` varchar(100) NOT NULL COMMENT '职位名称',
`position_level` int(11) NOT NULL COMMENT '职位层级(1-5)',
`parent_position_id` bigint(20) DEFAULT NULL COMMENT '上级职位ID',
`position_description` varchar(500) DEFAULT NULL COMMENT '职位描述',
`permission_level` int(11) DEFAULT NULL COMMENT '权限层级',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`manager_id` bigint(20) NOT NULL COMMENT '管理员ID',
`permission_type` char(1) DEFAULT '1' COMMENT '权限类型(1查看 2编辑 3完全管理)',
`auth_type` char(1) NOT NULL COMMENT '授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)',
`auth_source` bigint(20) DEFAULT NULL COMMENT '授权来源ID(对应校区ID或宿舍区ID或楼栋ID)',
`status` char(1) DEFAULT '0' COMMENT '状态(0有效 1已撤销)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_position_code` (`position_code`),
KEY `idx_position_level` (`position_level`),
KEY `idx_parent_position` (`parent_position_id`),
KEY `idx_position_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理人员职位表';
```
#### 2.3 管理人员分配表 (dorm_manager_assignment)
**表说明**:存储管理人员的分配信息,支持多维度分配
```sql
CREATE TABLE `dorm_manager_assignment` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_id` bigint(20) NOT NULL COMMENT '管理人员ID',
`position_id` bigint(20) NOT NULL COMMENT '职位ID',
`dimension_type` varchar(50) NOT NULL COMMENT '维度类型(campus/area/building/college)',
`dimension_id` bigint(20) NOT NULL COMMENT '维度ID',
`assignment_type` char(1) DEFAULT '1' COMMENT '分配类型(1主要 2辅助 3临时)',
`start_date` date NOT NULL COMMENT '分配开始日期',
`end_date` date DEFAULT NULL COMMENT '分配结束日期',
`assignment_reason` varchar(500) DEFAULT NULL COMMENT '分配原因',
`approval_status` char(1) DEFAULT '0' COMMENT '审批状态(0待审批 1已通过 2已拒绝)',
`approval_by` bigint(20) DEFAULT NULL COMMENT '审批人',
`approval_time` datetime DEFAULT NULL COMMENT '审批时间',
`approval_remark` varchar(500) DEFAULT NULL COMMENT '审批备注',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
@@ -285,203 +245,94 @@ CREATE TABLE `dorm_manager_assignment` (
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_manager_id` (`manager_id`),
KEY `idx_position_id` (`position_id`),
KEY `idx_dimension_type` (`dimension_type`),
KEY `idx_dimension_id` (`dimension_id`),
KEY `idx_assignment_status` (`status`),
KEY `idx_approval_status` (`approval_status`),
CONSTRAINT `fk_assignment_manager` FOREIGN KEY (`manager_id`) REFERENCES `dorm_manager` (`id`),
CONSTRAINT `fk_assignment_position` FOREIGN KEY (`position_id`) REFERENCES `dorm_manager_position` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理人员分配表';
KEY `idx_auth_source` (`auth_source`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员授权关系表';
```
### 3. 权限管理表
#### 3.1 权限层级表 (dorm_permission_level)
**表说明**:定义权限层级信息
#### 2.2 管理员宿舍楼权限关系表 (dorm_manager_building)
**表说明**:存储管理员与宿舍楼的权限绑定关系
```sql
CREATE TABLE `dorm_permission_level` (
DROP TABLE IF EXISTS `xg_dorm_manager_building`;
CREATE TABLE `xg_dorm_manager_building` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`level_code` varchar(50) NOT NULL COMMENT '权限层级编码',
`level_name` varchar(100) NOT NULL COMMENT '权限层级名称',
`level_value` int(11) NOT NULL COMMENT '权限层级值(1-5)',
`parent_level_id` bigint(20) DEFAULT NULL COMMENT '上级权限层级ID',
`level_description` varchar(500) DEFAULT NULL COMMENT '权限层级描述',
`data_scope` varchar(200) DEFAULT NULL COMMENT '数据权限范围',
`function_permissions` varchar(500) DEFAULT NULL COMMENT '功能权限列表',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`manager_id` bigint(20) NOT NULL COMMENT '管理员ID',
`building_id` bigint(20) NOT NULL COMMENT '宿舍楼ID',
`status` char(1) DEFAULT '0' COMMENT '状态(0有效 1已撤销)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_manager_building` (`manager_id`, `building_id`),
KEY `idx_manager_id` (`manager_id`),
KEY `idx_building_id` (`building_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员宿舍楼权限关系表';
```
#### 2.3 二级学院宿舍管理员表 (dorm_college_manager)
**表说明**:存储二级学院宿舍管理员的基本信息
```sql
DROP TABLE IF EXISTS `xg_dorm_college_manager`;
CREATE TABLE `xg_dorm_college_manager` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_name` varchar(100) NOT NULL COMMENT '管理员姓名',
`college_id` bigint(20) NOT NULL COMMENT '所属学院ID',
`user_id` bigint(20) DEFAULT NULL COMMENT '关联用户ID',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`gender` char(1) DEFAULT '0' COMMENT '性别(0男 1女 2未知)',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_level_code` (`level_code`),
UNIQUE KEY `uk_level_value` (`level_value`),
KEY `idx_parent_level` (`parent_level_id`),
KEY `idx_level_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限层级表';
KEY `idx_college_id` (`college_id`),
KEY `idx_user_id` (`user_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='二级学院宿舍管理员信息表';
```
#### 3.2 管理人员权限表 (dorm_manager_permission)
**表说明**:存储管理人员的具体权限配置
#### 2.4 二级学院床位绑定关系表 (dorm_college_bed)
**表说明**:存储二级学院与床位的绑定关系
```sql
CREATE TABLE `dorm_manager_permission` (
DROP TABLE IF EXISTS `xg_dorm_college_bed`;
CREATE TABLE `xg_dorm_college_bed` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_id` bigint(20) NOT NULL COMMENT '管理人员ID',
`permission_level_id` bigint(20) NOT NULL COMMENT '权限层级ID',
`dimension_type` varchar(50) NOT NULL COMMENT '维度类型',
`dimension_id` bigint(20) NOT NULL COMMENT '维度ID',
`data_permissions` varchar(500) DEFAULT NULL COMMENT '数据权限配置',
`function_permissions` varchar(500) DEFAULT NULL COMMENT '功能权限配置',
`permission_type` char(1) DEFAULT '1' COMMENT '权限类型(1继承 2授权 3临时)',
`grant_by` bigint(20) DEFAULT NULL COMMENT '授权人',
`grant_time` datetime DEFAULT NULL COMMENT '授权时间',
`expire_time` datetime DEFAULT NULL COMMENT '权限过期时间',
`permission_status` char(1) DEFAULT '0' COMMENT '权限状态(0有效 1过期 2停用)',
`sort_order` int(11) DEFAULT 0 COMMENT '排序号',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`college_id` bigint(20) NOT NULL COMMENT '学院ID',
`bed_id` bigint(20) NOT NULL COMMENT '床位ID',
`building_id` bigint(20) NOT NULL COMMENT '宿舍楼ID',
`room_id` bigint(20) NOT NULL COMMENT '房间ID',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1已解除)',
`assign_time` datetime DEFAULT NULL COMMENT '分配时间',
`release_time` datetime DEFAULT NULL COMMENT '到期解除时间',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_manager_id` (`manager_id`),
KEY `idx_permission_level` (`permission_level_id`),
KEY `idx_dimension_type` (`dimension_type`),
KEY `idx_dimension_id` (`dimension_id`),
KEY `idx_permission_status` (`permission_status`),
KEY `idx_grant_by` (`grant_by`),
CONSTRAINT `fk_permission_manager` FOREIGN KEY (`manager_id`) REFERENCES `dorm_manager` (`id`),
CONSTRAINT `fk_permission_level` FOREIGN KEY (`permission_level_id`) REFERENCES `dorm_permission_level` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理人员权限表';
UNIQUE KEY `uk_college_bed` (`college_id`, `bed_id`),
KEY `idx_college_id` (`college_id`),
KEY `idx_bed_id` (`bed_id`),
KEY `idx_building_id` (`building_id`),
KEY `idx_room_id` (`room_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='二级学院床位绑定关系表';
```
#### 3.3 权限变更日志表 (dorm_permission_log)
**表说明**:记录权限变更的详细日志
```sql
CREATE TABLE `dorm_permission_log` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_id` bigint(20) NOT NULL COMMENT '管理人员ID',
`operation_type` varchar(50) NOT NULL COMMENT '操作类型(grant/revoke/modify)',
`permission_level_id` bigint(20) DEFAULT NULL COMMENT '权限层级ID',
`dimension_type` varchar(50) DEFAULT NULL COMMENT '维度类型',
`dimension_id` bigint(20) DEFAULT NULL COMMENT '维度ID',
`old_permissions` text DEFAULT NULL COMMENT '变更前权限配置',
`new_permissions` text DEFAULT NULL COMMENT '变更后权限配置',
`operation_reason` varchar(500) DEFAULT NULL COMMENT '操作原因',
`operator_id` bigint(20) NOT NULL COMMENT '操作人ID',
`operator_name` varchar(50) NOT NULL COMMENT '操作人姓名',
`operation_time` datetime NOT NULL COMMENT '操作时间',
`ip_address` varchar(50) DEFAULT NULL COMMENT '操作IP地址',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
`operation_result` char(1) DEFAULT '1' COMMENT '操作结果(0失败 1成功)',
`error_message` varchar(500) DEFAULT NULL COMMENT '错误信息',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_manager_id` (`manager_id`),
KEY `idx_operation_type` (`operation_type`),
KEY `idx_operator_id` (`operator_id`),
KEY `idx_operation_time` (`operation_time`),
KEY `idx_operation_result` (`operation_result`),
CONSTRAINT `fk_log_manager` FOREIGN KEY (`manager_id`) REFERENCES `dorm_manager` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限变更日志表';
```
### 4. 管理效果评估表
#### 4.1 管理数据统计表 (dorm_management_stats)
**表说明**:存储管理效果的统计数据
```sql
CREATE TABLE `dorm_management_stats` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_id` bigint(20) NOT NULL COMMENT '管理人员ID',
`dimension_type` varchar(50) NOT NULL COMMENT '维度类型',
`dimension_id` bigint(20) NOT NULL COMMENT '维度ID',
`stats_date` date NOT NULL COMMENT '统计日期',
`stats_type` varchar(50) NOT NULL COMMENT '统计类型(daily/weekly/monthly)',
`building_count` int(11) DEFAULT 0 COMMENT '管理宿舍楼数量',
`student_count` int(11) DEFAULT 0 COMMENT '管理学生数量',
`task_completed` int(11) DEFAULT 0 COMMENT '完成任务数量',
`task_total` int(11) DEFAULT 0 COMMENT '总任务数量',
`problem_resolved` int(11) DEFAULT 0 COMMENT '解决问题数量',
`problem_total` int(11) DEFAULT 0 COMMENT '总问题数量',
`satisfaction_score` decimal(3,2) DEFAULT 0.00 COMMENT '满意度评分',
`efficiency_score` decimal(3,2) DEFAULT 0.00 COMMENT '效率评分',
`quality_score` decimal(3,2) DEFAULT 0.00 COMMENT '质量评分',
`overall_score` decimal(3,2) DEFAULT 0.00 COMMENT '综合评分',
`stats_data` json DEFAULT NULL COMMENT '详细统计数据',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_stats_unique` (`manager_id`, `dimension_type`, `dimension_id`, `stats_date`, `stats_type`),
KEY `idx_manager_id` (`manager_id`),
KEY `idx_dimension_type` (`dimension_type`),
KEY `idx_dimension_id` (`dimension_id`),
KEY `idx_stats_date` (`stats_date`),
KEY `idx_stats_type` (`stats_type`),
CONSTRAINT `fk_stats_manager` FOREIGN KEY (`manager_id`) REFERENCES `dorm_manager` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理数据统计表';
```
#### 4.2 权限使用记录表 (dorm_permission_usage)
**表说明**:记录权限使用的详细情况
```sql
CREATE TABLE `dorm_permission_usage` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`manager_id` bigint(20) NOT NULL COMMENT '管理人员ID',
`permission_level_id` bigint(20) NOT NULL COMMENT '权限层级ID',
`dimension_type` varchar(50) NOT NULL COMMENT '维度类型',
`dimension_id` bigint(20) NOT NULL COMMENT '维度ID',
`function_name` varchar(100) NOT NULL COMMENT '功能名称',
`operation_type` varchar(50) NOT NULL COMMENT '操作类型(view/edit/delete/approve)',
`operation_time` datetime NOT NULL COMMENT '操作时间',
`operation_result` char(1) DEFAULT '1' COMMENT '操作结果(0失败 1成功)',
`response_time` int(11) DEFAULT NULL COMMENT '响应时间(毫秒)',
`ip_address` varchar(50) DEFAULT NULL COMMENT '操作IP地址',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
`session_id` varchar(100) DEFAULT NULL COMMENT '会话ID',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) DEFAULT 0 COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_manager_id` (`manager_id`),
KEY `idx_permission_level` (`permission_level_id`),
KEY `idx_dimension_type` (`dimension_type`),
KEY `idx_dimension_id` (`dimension_id`),
KEY `idx_function_name` (`function_name`),
KEY `idx_operation_time` (`operation_time`),
KEY `idx_operation_result` (`operation_result`),
CONSTRAINT `fk_usage_manager` FOREIGN KEY (`manager_id`) REFERENCES `dorm_manager` (`id`),
CONSTRAINT `fk_usage_permission_level` FOREIGN KEY (`permission_level_id`) REFERENCES `dorm_permission_level` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限使用记录表';
```
## 🔗 表关系设计
@@ -503,15 +354,6 @@ dorm_permission_level (权限层级)
└── Level 5: 二级学院宿舍管理负责人
```
### 3. 管理人员关系图
```
dorm_manager (管理人员)
├── dorm_manager_position (职位信息)
├── dorm_manager_assignment (分配信息)
├── dorm_manager_permission (权限信息)
├── dorm_management_stats (统计信息)
└── dorm_permission_usage (使用记录)
```
## 📊 索引设计
@@ -0,0 +1,83 @@
# 宿舍楼树形结构API开发变更记录
**日期**: 2025-07-03
**作者**: cursor
**模块**: 学生宿舍管理
## 变更内容
### 1. 新增实体类
- 创建 `DormBuildingTreeVo.java`: 实现宿舍楼树形结构VO类,包含id、label、type、disabled、buildingFloors、children等字段
- 创建 `DormBuildingInfoVo.java`: 实现宿舍楼信息VO类,用于数据库查询结果映射
- 创建 `DormBuildingTreeBo.java`: 实现查询参数业务对象类,包含campusId、areaId、buildingName、status等字段
### 2. 新增Mapper接口和XML
- 创建 `XgDormBuildingTreeMapper.java`: 包含获取校区、宿舍区、宿舍楼和检查用户权限等方法
- 创建 `XgDormBuildingTreeMapper.xml`: 实现各种SQL查询,包括权限过滤逻辑
### 3. 新增服务接口和实现
- 创建 `IXgDormBuildingTreeService.java`: 定义获取宿舍楼树形结构的服务接口
- 创建 `XgDormBuildingTreeServiceImpl.java`: 实现服务接口,包含按权限过滤和构建三级树形结构的逻辑
### 4. 新增控制器
- 创建 `XgDormBuildingTreeController.java`: 提供获取宿舍楼树形结构的REST接口
### 5. 新增API文档
- 创建 `宿舍房间管理API.md`: 记录API接口的使用方法和参数说明
### 6. 代码优化与修复 (2025-07-03 16:25:30)
- 修改 `XgDormBuildingTreeServiceImpl.java`: 优化宿舍楼查询逻辑,支持用户拥有多种角色权限的情况
- 解决问题: 之前代码只会按优先级执行一种角色的查询,现在改为合并多种权限查询的结果
- 实现思路:
- 保留全校管理员最高权限判断(可查看所有宿舍楼)
- 对于其他权限类型,分别查询并合并结果
- 使用HashSet确保宿舍楼不重复
- 修正了字段访问方法,使用getId()而不是getBuildingId()
### 7. API返回字段修复 (2025-07-23 10:30:15)
- 修改 `XgDormBuildingMapper.xml`: 修复宿舍楼信息列表接口floors字段返回为null的问题
- 解决问题: 宿舍楼信息查询接口未返回floors字段,导致前端显示为null
- 修复详情:
- 在selectPageWithAreaAndCampusName方法的SELECT查询语句中添加了b.floors字段
- 确保与数据库表设计和实体类定义保持一致
- 完整路径: `/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/sslxx/XgDormBuildingMapper.xml`
## 实现功能
1. **三级树形结构**:
- 第一级:校区(不可点击)
- 第二级:宿舍区(不可点击)
- 第三级:宿舍楼(可点击)
2. **多级数据权限**:
- 全校管理员(manager_type=1):可查看所有宿舍楼
- 校区管理员(manager_type=2):只能查看管理校区的宿舍楼
- 宿舍区管理员(manager_type=3):只能查看管理宿舍区的宿舍楼
- 宿舍楼管理员(manager_type=4):只能查看管理宿舍楼
- **新增:支持一个用户同时拥有多种管理员角色,数据权限取并集**
3. **权限数据关联**:
- 通过 xg_dorm_manager 表获取用户权限类型
- 通过 xg_dorm_manager_source 表获取具体权限范围
## API接口说明
- **接口URL**: `/xgss/dormBuildingTree/list`
- **请求方式**: GET
- **权限要求**: `xgss:dormBuildingTree:list`
- **可选参数**: campusId, areaId, buildingName, status
- **返回格式**: 嵌套的树形结构JSON
## 下一步计划
1. 前端页面改造:将模拟数据替换为真实API调用
2. 单元测试:编写测试用例验证API的功能和权限控制
3. 集成测试:验证API在真实环境中的表现
4. 完善文档:补充其他宿舍管理相关API的文档
@@ -0,0 +1,68 @@
# 宿舍楼管理API树形结构开发记录
**时间**: 2025-07-20 15:30:00
**开发人员**: zlwu
**变更模块**: 宿舍管理 - 宿舍楼树形结构API
## 变更内容
### 1. 新增类文件
1. 新增 `BuildingTreeSelectVo.java` 类用于宿舍楼树形结构展示
- 支持校区-宿舍区-宿舍楼三级结构
- 标识节点类型和可选状态
### 2. API接口开发
1. 在 `XgDormBuildingController` 中新增 `/buildingTree` 接口:
- 获取完整的宿舍楼树形结构
- 校区和宿舍区节点设置为不可选(disabled=true)
- 宿舍楼节点设置为可选(disabled=false)
2. 在 `IXgDormBuildingService` 接口中添加 `getBuildingTreeData()` 方法
3. 在 `XgDormBuildingServiceImpl` 中实现树形数据构建逻辑:
- 查询所有校区、宿舍区和宿舍楼数据
- 构建三级层次结构
- 确保树中校区和宿舍区节点被标记为不可选
- 只有宿舍楼节点可以被选择
### 3. 数据表关联关系
- `xg_dorm_building` 通过 `campus_id` 关联 `xg_dorm_campus`
- `xg_dorm_building` 通过 `area_id` 关联 `xg_dorm_area`
- `xg_dorm_area` 通过 `campus_id` 关联 `xg_dorm_campus`
### 4. 前端实现
1. 在`web/src/api/sslxx/dormBuilding/types.ts`中添加`BuildingTreeSelectVo`接口定义:
- 定义了树形节点的属性类型
- 包含id、label、nodeType、disabled等核心字段
- 支持children属性用于嵌套结构
2. 在`web/src/api/sslxx/dormBuilding/index.ts`中添加`getBuildingTree`方法:
- 调用后端API获取树形结构数据
- 方法返回类型为`AxiosPromise<BuildingTreeSelectVo[]>`
3. 修改`ScopeDialog.vue`组件:
- 为宿舍楼类型(type="building")添加独立的树形选择器
- 移除原有的模拟数据,改用API获取真实数据
- 添加宿舍楼数据回显和解析逻辑
- 保留对校区和宿舍区的原有支持
## 技术实现
树形结构数据构建采用三步查询 + 组装的方式:
1. 首先查询所有校区数据
2. 查询所有宿舍区数据
3. 查询所有宿舍楼数据
4. 通过Stream API过滤和关联数据,构建多层嵌套结构
## 使用说明
1. 校区管理员授权时,使用普通多选下拉框
2. 宿舍区管理员授权时,使用以校区为父节点的两级树形结构
3. 宿舍楼管理员授权时,使用新开发的三级树形结构(校区-宿舍区-宿舍楼)
- 校区和宿舍区节点自动禁用,不可选择
- 只有宿舍楼节点可以选择
- 支持多选和折叠标签
+58
View File
@@ -1,5 +1,6 @@
# API文档总览
<<<<<<< HEAD
本文档作为所有API文档的总入口,提供快速导航功能。
## 基础规范
@@ -28,3 +29,60 @@
## 开发工具
- [API文档模板](./API文档模板.md)
=======
本文件作为API文档的统一导航入口,提供项目中所有API文档的快速访问链接。
## 认证登录
- [用户认证登录API](./用户认证登录API.md) - 用户登录、获取用户信息等接口
## 学工管理模块
- [班干部管理API](班干部管理API.md)
- [宿舍管理员授权API](宿舍管理员授权API.md)
- [宿舍楼树形结构API](宿舍楼树形结构API.md) - 校区-宿舍区-宿舍楼三级树形结构数据 (旧版API,路径: `/sslxx/dormBuilding/buildingTree`)
## 宿舍管理相关API
| API文档名称 | 说明 | 路径 |
| ---------- | ---- | ---- |
| [宿舍房间管理API](./宿舍房间管理API.md) | 提供宿舍楼树形结构API | `/xgss/dormBuildingTree/list` |
| [宿舍房间管理API](./宿舍房间管理API.md) | 提供宿舍楼列表查询API | `/sslxx/dormBuilding/list` |
## 后勤管理
### 场地管理
- [场地预约管理API](./场地预约管理API.md) - 场地信息管理、预约申请管理接口
- [报告厅预约审核API](./报告厅预约审核API.md) - 报告厅信息管理、预约审核接口
### 物业管理
- [物业报修管理API](./物业报修管理API.md) - 报修工单管理、维修处理接口
### 满意度调查
- [后勤满意度调查API](./后勤满意度调查API.md) - 问卷设计、答题管理接口
## 工作流管理
- [请假流程API](./请假流程API.md) - 请假申请、审批管理接口
## 系统管理
- [菜单权限API](./菜单权限API.md) - 菜单配置、权限管理接口
- [用户管理API](./用户管理API.md) - 系统用户、角色、部门管理接口
## API基础规范
- [API文档基础规范](./API文档基础规范.md) - API接口设计规范、响应格式规范
## 更新记录
- 2025-07-23:修复宿舍楼列表接口floors字段为null的问题,更新宿舍房间管理API文档
- 2025-07-03:更新宿舍房间管理API,增强多角色权限支持
- 2025-07-20:新增宿舍楼树形结构API文档
- 2025-07-20:新增宿舍管理员授权API文档
- 2025-07-15:新增场地预约管理API文档
- 2025-07-10:新增物业报修管理API文档
- 2025-07-01:重组API文档结构,创建统一导航入口
>>>>>>> 8e84da4ed45dd1d711c4a797a4f26f637012f6a9
@@ -0,0 +1,263 @@
# 宿舍房间管理API文档
## 目录
- [1. 宿舍楼树形结构](#1-宿舍楼树形结构)
- [1.1 获取宿舍楼树形结构](#11-获取宿舍楼树形结构)
- [2. 宿舍楼信息管理](#2-宿舍楼信息管理)
- [2.1 获取宿舍楼列表](#21-获取宿舍楼列表)
## 1. 宿舍楼树形结构
### 1.1 获取宿舍楼树形结构
#### 接口说明
该接口用于获取宿舍楼的树形结构数据,按照校区-宿舍区-宿舍楼三级结构组织。校区和宿舍区节点不可点击,只有宿舍楼节点可以点击。
#### 请求方式
```
GET /xgss/dormBuildingTree/list
```
#### 权限要求
```
xgss:dormBuildingTree:list
```
#### 请求参数
| 参数名 | 类型 | 必须 | 描述 |
| ------------- | ------- | ---- | -------------------- |
| campusId | Long | 否 | 校区ID,用于筛选 |
| areaId | Long | 否 | 宿舍区ID,用于筛选 |
| buildingName | String | 否 | 宿舍楼名称,模糊查询 |
| status | String | 否 | 宿舍楼状态 |
#### 返回结果
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": 1,
"label": "主校区",
"type": "campus",
"disabled": true,
"children": [
{
"id": 101,
"label": "东区宿舍",
"type": "area",
"disabled": true,
"children": [
{
"id": 1001,
"label": "1号楼",
"type": "building",
"disabled": false,
"buildingFloors": 6
},
{
"id": 1002,
"label": "2号楼",
"type": "building",
"disabled": false,
"buildingFloors": 5
}
]
},
{
"id": 102,
"label": "西区宿舍",
"type": "area",
"disabled": true,
"children": [
{
"id": 1003,
"label": "3号楼",
"type": "building",
"disabled": false,
"buildingFloors": 7
}
]
}
]
}
]
}
```
#### 返回参数说明
| 参数名 | 类型 | 描述 |
| -------------- | ------- | ------------------------------------------------ |
| id | Long | 节点ID |
| label | String | 节点名称 |
| type | String | 节点类型(campus:校区,area:宿舍区,building:宿舍楼) |
| disabled | Boolean | 是否禁用点击(校区和宿舍区为true,宿舍楼为false) |
| buildingFloors | Integer | 宿舍楼层数(只有宿舍楼节点有此字段) |
| children | Array | 子节点列表 |
#### 数据权限说明
接口会根据当前登录用户的权限进行数据过滤:
1. 全校管理员(manager_type=1):可以查看所有校区、宿舍区和宿舍楼数据
2. 校区管理员(manager_type=2):只能查看其管理的校区下的宿舍区和宿舍楼数据
3. 宿舍区管理员(manager_type=3):只能查看其管理的宿舍区下的宿舍楼数据
4. 宿舍楼管理员(manager_type=4):只能查看其管理的宿舍楼数据
5. **多角色支持**:如果用户同时拥有多种管理员角色(如既是校区管理员又是宿舍楼管理员),将会合并所有权限范围内的数据。例如,一个用户同时是A校区管理员和B宿舍楼管理员,则可以看到A校区下的所有宿舍楼以及B宿舍楼。
权限判断逻辑:
- 通过 xg_dorm_manager 表的 user_id 与当前登录用户匹配,获取用户管理员类型
- 根据 manager_type 确定权限级别
- 通过 xg_dorm_manager_source 表的 auth_source 确定具体权限范围
- **多角色权限合并**:合并不同角色对应的宿舍楼数据,确保不重复
#### 错误码
| 错误码 | 描述 |
| ------ | -------------------- |
| 401 | 未授权,需要登录 |
| 403 | 无权限访问该接口 |
| 500 | 服务器内部错误 |
#### 使用示例
```javascript
// 前端代码示例(使用axios)
import axios from 'axios';
// 获取宿舍楼树形结构
async function getDormBuildingTree() {
try {
const response = await axios.get('/xgss/dormBuildingTree/list');
if (response.data.code === 200) {
return response.data.data;
}
} catch (error) {
console.error('获取宿舍楼树失败:', error);
}
return [];
}
```
## 2. 宿舍楼信息管理
### 2.1 获取宿舍楼列表
#### 接口说明
该接口用于获取宿舍楼信息的分页列表,包含宿舍楼基本信息以及关联的校区和宿舍区信息。
#### 请求方式
```
GET /sslxx/dormBuilding/list
```
#### 权限要求
```
sslxx:dormBuilding:list
```
#### 请求参数
| 参数名 | 类型 | 必须 | 描述 |
| --------------- | ------- | ---- | ---------------------- |
| pageNum | Integer | 是 | 当前页码,从1开始 |
| pageSize | Integer | 是 | 每页记录数 |
| buildingCode | String | 否 | 宿舍楼编码,模糊查询 |
| buildingName | String | 否 | 宿舍楼名称,模糊查询 |
| areaId | Long | 否 | 宿舍区ID,精确查询 |
| campusId | Long | 否 | 校区ID,精确查询 |
| buildingType | String | 否 | 宿舍楼类型(1男生楼 2女生楼 3混合楼) |
#### 返回结果
```json
{
"total": 1,
"rows": [
{
"id": "1947459199879495681",
"buildingCode": "xixi-ssq01-ssl01",
"buildingName": "西溪校区-宿舍区01-宿舍楼01",
"areaId": "1946829650430935041",
"areaName": "西溪校区-宿舍区01",
"campusId": "1946815553291304962",
"campusName": "西溪校区",
"buildingType": "1",
"buildingDescription": "12312",
"sortOrder": 1,
"floors": 6,
"createBy": 1,
"createTime": "2025-07-22 08:50:30",
"updateBy": 1,
"updateTime": "2025-07-22 08:51:06"
}
],
"code": 200,
"msg": "查询成功"
}
```
#### 返回参数说明
| 参数名 | 类型 | 描述 |
| ------------------ | ------- | ---------------------------------------- |
| id | Long | 宿舍楼主键ID |
| buildingCode | String | 宿舍楼编码 |
| buildingName | String | 宿舍楼名称 |
| areaId | Long | 所属宿舍区ID |
| areaName | String | 所属宿舍区名称 |
| campusId | Long | 所属校区ID |
| campusName | String | 所属校区名称 |
| buildingType | String | 宿舍楼类型(1男生楼 2女生楼 3混合楼) |
| buildingDescription | String | 宿舍楼描述 |
| sortOrder | Integer | 排序号 |
| floors | Integer | 总楼层数 |
| createBy | Long | 创建者ID |
| createTime | Date | 创建时间 |
| updateBy | Long | 更新者ID |
| updateTime | Date | 更新时间 |
#### 错误码
| 错误码 | 描述 |
| ------ | -------------------- |
| 401 | 未授权,需要登录 |
| 403 | 无权限访问该接口 |
| 500 | 服务器内部错误 |
#### 使用示例
```javascript
// 前端代码示例(使用axios)
import axios from 'axios';
// 获取宿舍楼列表
async function getDormBuildingList(params) {
try {
const response = await axios.get('/sslxx/dormBuilding/list', {
params: {
pageNum: 1,
pageSize: 10,
...params
}
});
if (response.data.code === 200) {
return response.data;
}
} catch (error) {
console.error('获取宿舍楼列表失败:', error);
}
return { total: 0, rows: [] };
}
```
@@ -0,0 +1,174 @@
# 宿舍楼树形结构API文档
## 接口说明
本文档描述了获取宿舍楼树形结构数据的API接口,该接口返回校区-宿舍区-宿舍楼的三级树形结构,其中校区和宿舍区节点不可选,只有宿舍楼节点可以选择。
## 接口定义
### 获取宿舍楼树形结构
**请求URL**:`/sslxx/dormBuilding/buildingTree`
**请求方式**:`GET`
**权限标识**:`sslxx:dormBuilding:list`
**请求参数**:无
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": 1,
"label": "东校区",
"nodeType": "campus",
"disabled": true,
"children": [
{
"id": 101,
"label": "东区宿舍区",
"nodeType": "area",
"disabled": true,
"children": [
{
"id": 1001,
"label": "1号楼",
"nodeType": "building",
"disabled": false
},
{
"id": 1002,
"label": "2号楼",
"nodeType": "building",
"disabled": false
}
]
}
]
},
{
"id": 2,
"label": "西校区",
"nodeType": "campus",
"disabled": true,
"children": [
{
"id": 201,
"label": "西区宿舍区",
"nodeType": "area",
"disabled": true,
"children": [
{
"id": 2001,
"label": "3号楼",
"nodeType": "building",
"disabled": false
},
{
"id": 2002,
"label": "4号楼",
"nodeType": "building",
"disabled": false
}
]
}
]
}
]
}
```
## 数据结构
### BuildingTreeSelectVo
树形结构节点对象:
| 字段名 | 类型 | 描述 |
|------------|-------------------|----------------------------------------|
| id | Long | 节点ID |
| label | String | 节点名称 |
| nodeType | String | 节点类型:campus(校区)、area(宿舍区)、building(宿舍楼) |
| disabled | Boolean | 是否禁用选择 |
| children | List<BuildingTreeSelectVo> | 子节点列表 |
| createBy | Long | 创建者 |
| createTime | Date | 创建时间 |
| updateBy | Long | 更新者 |
| updateTime | Date | 更新时间 |
## 使用方法
### 前端使用示例
在Vue组件中使用该接口获取树形数据:
```typescript
import { getBuildingTree } from '@/api/sslxx/dormBuilding';
import type { BuildingTreeSelectVo } from '@/api/sslxx/dormBuilding/types';
// 在组件的setup函数中
const treeData = ref<BuildingTreeSelectVo[]>([]);
// 加载宿舍楼树形数据
const loadBuildingTree = async () => {
try {
const res = await getBuildingTree();
if (res && res.data) {
treeData.value = res.data;
}
} catch (error) {
console.error('加载宿舍楼树形数据失败:', error);
}
};
// 调用加载方法
loadBuildingTree();
```
### 使用el-tree-select组件展示
```html
<el-tree-select
v-model="selectedBuildings"
placeholder="请选择宿舍楼"
style="width: 100%"
clearable
filterable
multiple
collapse-tags
collapse-tags-tooltip
:data="treeData"
:props="{
children: 'children',
label: 'label',
disabled: 'disabled',
value: 'id'
}"
check-strictly
/>
```
## 特殊说明
1. 接口返回的树形结构中,校区和宿舍区节点已设置 `disabled=true`,前端无需额外处理即可实现只能选择宿舍楼节点的效果
2. 使用 `check-strictly=true` 可以确保树形选择器的选中状态不会级联影响父子节点
3. 该接口已支持管理员分配宿舍楼管理范围的业务需求
## 相关API接口
- [宿舍管理员授权API](./宿舍管理员授权API.md)
## 数据库关系
- `xg_dorm_building` 表通过 `campus_id` 字段关联 `xg_dorm_campus` 表
- `xg_dorm_building` 表通过 `area_id` 字段关联 `xg_dorm_area` 表
- `xg_dorm_area` 表通过 `campus_id` 字段关联 `xg_dorm_campus` 表
## 最后更新时间
2025-07-20
@@ -0,0 +1,112 @@
# 宿舍管理员授权API文档
## 1. 接口总览
| 接口名称 | 请求方式 | 接口地址 | 接口描述 |
| ------- | ------- | ------- | ------- |
| 获取宿舍区树形结构 | GET | /ssqxx/dormArea/tree | 获取以校区为根节点、宿舍区为子节点的树形结构数据 |
## 2. 权限要求
- 查询宿舍区树形结构:`ssqxx:dormArea:query`
## 3. 接口详情
### 3.1 获取宿舍区树形结构
#### 接口说明
该接口用于获取宿舍区的树形结构数据,以校区为根节点,宿舍区为子节点。前端可以使用该接口实现树形下拉选择,实现宿舍管理员授权范围选择功能。
#### 请求URL
```
GET /ssqxx/dormArea/tree
```
#### 请求参数
无
#### 响应参数
| 参数名 | 类型 | 说明 |
| ------ | ---- | ---- |
| code | Integer | 状态码,200表示成功 |
| msg | String | 提示信息 |
| data | Array | 数据内容 |
| data[i].id | Long | 节点ID |
| data[i].label | String | 节点名称 |
| data[i].type | String | 节点类型(campus:校区,area:宿舍区) |
| data[i].disabled | Boolean | 是否禁用选择(校区节点为true,宿舍区节点为false) |
| data[i].children | Array | 子节点,结构同父节点 |
#### 响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": 1,
"label": "东校区",
"type": "campus",
"disabled": true,
"children": [
{
"id": 101,
"label": "1号宿舍区",
"type": "area",
"disabled": false,
"children": []
},
{
"id": 102,
"label": "2号宿舍区",
"type": "area",
"disabled": false,
"children": []
}
]
},
{
"id": 2,
"label": "西校区",
"type": "campus",
"disabled": true,
"children": [
{
"id": 201,
"label": "3号宿舍区",
"type": "area",
"disabled": false,
"children": []
}
]
}
]
}
```
## 4. 使用说明
### 前端使用方式
1. 调用树形结构接口获取宿舍区树形数据
2. 使用树形选择组件展示数据,设置不可选择校区节点(根据disabled属性)
3. 用户只能选择宿舍区节点,不能选择校区节点
4. 支持多选宿舍区节点
### 数据说明
- 树形结构中,校区为第一级节点,宿舍区为第二级节点
- 校区节点的disabled属性为true,表示不可选择
- 宿舍区节点的disabled属性为false,表示可以选择
- 通过type字段可以区分节点类型:campus为校区,area为宿舍区
## 5. 实现细节
- 宿舍区数据存放在xg_dorm_area表中,校区数据存放在xg_dorm_campus表中
- xg_dorm_area表中campus_id字段关联xg_dorm_campus表的id字段
- 树形数据的构建逻辑是:先查询所有校区,再查询所有宿舍区,然后根据关联关系构建树形结构
+97 -132
View File
@@ -2,29 +2,30 @@
## 📁 文件结构概览
基于业务域的数据库文件拆分,将原始的 `hzdyjs_xg.sql` 按业务模块进行分类,便于管理和维护。
基于业务域的数据库文件拆分,采用目录+文件的组织方式,将原始的 `hzdyjs_xg.sql` 按业务模块进行分类,便于管理和维护。
```
docs/设计文档/database/
├── hzdyjs_xg.sql # 完整数据库文件(保留)
├── 01-workflow-module.sql # 工作流模块
├── 02-code-generator-module.sql # 代码生成模块
├── 03-logistics-module.sql # 后勤管理模块
├── 04-job-scheduler-module.sql # 任务调度模块
├── 05-system-management-module.sql # 系统管理模块
├── 06-test-module.sql # 测试模块
├── 08-student-management-actual-rollback.sql # 学工管理模块实际删除脚本
├── README.md # 数据库设计说明
├── mysql-database-standard.md # MySQL数据库建设规范
├── database_msg.md # 数据库环境配置
└── SQL文件说明.md # 本文件
├── README.md # 数据库设计说明
├── mysql-database-standard.md # MySQL数据库建设规范
├── database_msg.md # 数据库环境配置
├── SQL文件说明.md # 本文件
├── 工作流/ # 工作流模块相关SQL
│ └── ... (工作流相关SQL文件)
├── 后勤管理/ # 后勤管理模块相关SQL
│ └── ... (后勤管理相关SQL文件)
├── 学工管理-学生信息管理/ # 学工管理-学生信息模块相关SQL
│ └── ... (学生信息相关SQL文件)
└── 学工管理-宿舍管理/ # 学工管理-宿舍管理模块相关SQL
└── ... (宿舍管理相关SQL文件)
```
---
## 📊 业务域拆分详情
### 01. 工作流模块 (01-workflow-module.sql)
### 工作流模块 (工作流/)
**业务域**: 工作流引擎相关功能
**包含表**: 8 张表
@@ -40,20 +41,10 @@ docs/设计文档/database/
**主要功能**: 支持业务流程的定义、执行、跟踪和管理
### 02. 代码生成模块 (02-code-generator-module.sql)
**业务域**: 代码生成器相关功能
**包含表**: 2 张表
- `gen_table` - 代码生成业务表
- `gen_table_column` - 代码生成业务字段表
**主要功能**: 支持基于数据库表结构自动生成代码
### 03. 后勤管理模块 (03-logistics-module.sql)
### 后勤管理模块 (后勤管理/)
**业务域**: 后勤服务管理相关功能
**包含表**: 10 张表
**包含表**: 10+ 张表
#### 报告厅预约管理子模块
@@ -73,93 +64,53 @@ docs/设计文档/database/
**主要功能**: 校园后勤服务管理,包括场地预约和满意度调查
### 04. 任务调度模块 (04-job-scheduler-module.sql)
### 学工管理-学生信息管理模块 (学工管理-学生信息管理/)
**业务域**: 学工管理-学生信息管理相关功能
**包含表**: 相关学生信息表
**主要功能**: 学生信息管理,包括学生基本信息、班级信息等
### 学工管理-宿舍管理模块 (学工管理-宿舍管理/)
**业务域**: 学工管理-宿舍管理相关功能
**包含表**: 宿舍相关表
**主要功能**: 宿舍管理,包括宿舍分配、宿舍管理等功能
### 其他模块 (仍保留在根目录)
#### 代码生成模块 (02-code-generator-module.sql)
**业务域**: 代码生成器相关功能
**包含表**: 2 张表
- `gen_table` - 代码生成业务表
- `gen_table_column` - 代码生成业务字段表
**主要功能**: 支持基于数据库表结构自动生成代码
#### 任务调度模块 (04-job-scheduler-module.sql)
**业务域**: SnailJob 任务调度相关功能
**包含表**: 12 张表
- `sj_distributed_lock` - 分布式锁表
- `sj_group_config` - 组配置表
- `sj_namespace_config` - 命名空间配置表
- `sj_notify_config` - 通知配置表
- `sj_retry_dead_letter` - 死信队列表
- `sj_retry_summary` - 任务重试汇总统计表
- `sj_retry_task` - 任务信息表
- `sj_retry_task_log` - 重试日志表
- `sj_server_node` - 服务器节点表
- `sj_system_user_permission` - 系统用户权限表
- `sj_workflow_node` - 工作流节点表
- `sj_workflow_task_batch` - 工作流任务批次表
**主要功能**: 分布式任务调度、重试机制、工作流编排
### 05. 系统管理模块 (05-system-management-module.sql)
#### 系统管理模块 (05-system-management-module.sql)
**业务域**: 系统核心管理功能
**包含表**: 21 张表
#### 用户与权限管理
- `sys_user` - 用户信息表
- `sys_role` - 角色信息表
- `sys_menu` - 菜单权限表
- `sys_dept` - 部门表
- `sys_post` - 岗位信息表
- `sys_user_role` - 用户角色关联表
- `sys_user_post` - 用户岗位关联表
- `sys_role_menu` - 角色菜单关联表
- `sys_role_dept` - 角色部门关联表
#### 系统配置与日志
- `sys_config` - 参数配置表
- `sys_dict_type` - 字典类型表
- `sys_dict_data` - 字典数据表
- `sys_notice` - 通知公告表
- `sys_oper_log` - 操作日志表
- `sys_logininfor` - 系统访问记录表
#### 文件与租户管理
- `sys_oss` - OSS 对象存储表
- `sys_oss_config` - 对象存储配置表
- `sys_client` - 系统授权表
- `sys_tenant` - 租户表
- `sys_tenant_package` - 租户套餐表
- `sys_social` - 社会化关系表
**主要功能**: 系统用户管理、权限控制、配置管理、日志记录等核心功能
### 06. 测试模块 (06-test-module.sql)
#### 测试模块 (06-test-module.sql)
**业务域**: 测试和演示相关功能
**包含表**: 1 张表
- `test_tree` - 测试树表
**主要功能**: 系统功能测试和演示,包含树形结构数据
### 08. 学生信息管理模块 (已删除)
**业务域**: 学工管理-学生信息管理相关功能
**状态**: 已于2025-01-09完全删除
#### 删除脚本
- `08-student-management-actual-rollback.sql` - 学工管理模块实际删除脚本(已执行)
**删除内容**:
- 6张数据库表(学生信息、银行卡、班级信息、审核记录等)
- 16个菜单权限项
- 7个字典类型
- 27个字典数据项
**删除状态**: ✅ 已完成并验证通过
**删除原因**: 用户要求删除已创建的学工学生信息相关功能
**恢复说明**: 相关文档和脚本已在git历史记录中保存,如需恢复可从历史记录中获取
---
## 🔧 使用指南
@@ -173,51 +124,48 @@ SOURCE docs/设计文档/database/hzdyjs_xg.sql;
### 按模块部署
现在可以按照目录组织更灵活地部署数据库:
```sql
-- 按需执行指定模块
SOURCE docs/设计文档/database/01-workflow-module.sql;
SOURCE docs/设计文档/database/02-code-generator-module.sql;
SOURCE docs/设计文档/database/03-logistics-module.sql;
SOURCE docs/设计文档/database/04-job-scheduler-module.sql;
-- 核心系统模块
SOURCE docs/设计文档/database/05-system-management-module.sql;
SOURCE docs/设计文档/database/06-test-module.sql;
-- 学工管理模块已删除
-- 删除脚本已执行完成:
-- SOURCE docs/设计文档/database/08-student-management-actual-rollback.sql;
-- 按业务目录部署
-- 工作流模块
SOURCE docs/设计文档/database/工作流/01-workflow-module.sql;
-- 后勤管理模块
SOURCE docs/设计文档/database/后勤管理/03-logistics-module.sql;
SOURCE docs/设计文档/database/后勤管理/hq_hall_info.sql;
SOURCE docs/设计文档/database/后勤管理/hq_satisfaction_survey.sql;
-- 更多后勤管理相关表...
-- 学工管理-学生信息模块
SOURCE docs/设计文档/database/学工管理-学生信息管理/xg_student_info.sql;
SOURCE docs/设计文档/database/学工管理-学生信息管理/xg_class_info.sql;
-- 更多学生信息相关表...
-- 学工管理-宿舍管理模块
SOURCE docs/设计文档/database/学工管理-宿舍管理/xg_dormitory_info.sql;
-- 更多宿舍管理相关表...
```
### 开发环境部署建议
1. **必须模块**: 01-工作流模块, 05-系统管理模块
2. **核心业务模块**: 03-后勤管理模块
3. **按需模块**: 其他模块根据具体业务需求选择性部署
1. **必须模块**: 系统管理模块, 工作流模块
2. **核心业务模块**: 后勤管理模块
3. **按需模块**: 学工管理相关模块和其他模块根据具体业务需求选择性部署
4. **测试模块**: 仅在开发和测试环境中部署
---
## 📈 统计信息
| 模块 | 表数量 | 主要功能 | 依赖关系 |
| ------------ | ------ | ------------ | ---------------- |
| 工作流模块 | 8 | 流程管理 | 依赖系统管理模块 |
| 代码生成模块 | 2 | 代码生成 | 无特殊依赖 |
| 后勤管理模块 | 10 | 后勤服务 | 依赖系统管理模块 |
| 任务调度模块 | 12 | 任务调度 | 独立模块 |
| 系统管理模块 | 21 | 核心系统 | 核心基础模块 |
| 测试模块 | 1 | 测试演示 | 依赖系统管理模块 |
| ~~学工管理模块~~ | ~~6~~ | ~~学工管理~~ | ~~已删除~~ |
| **总计** | **54** | **完整系统** | **完整依赖链** |
---
## ⚠️ 注意事项
### 1. 模块依赖关系
### 1. 目录组织原则
- **系统管理模块**是其他模块的基础依赖,必须优先部署
- **工作流模块**和**后勤管理模块**依赖系统管理模块的用户和部门数据
- **任务调度模块**相对独立,可单独部署
- **学工管理模块**已删除,不再部署
- **按业务域组织**: 文件按业务功能模块存放到对应目录
- **一表一文件**: 每个表结构单独存放为独立SQL文件,便于维护
- **统一命名**: 文件名应与表名保持一致,便于快速定位
### 2. 数据一致性
@@ -244,20 +192,21 @@ SOURCE docs/设计文档/database/06-test-module.sql;
### 更新流程
1. 修改 `hzdyjs_xg.sql` 主文件
2. 同步更新对应的模块 SQL 文件
1. 修改对应业务目录下的SQL文件
2. 如有必要,同步更新 `hzdyjs_xg.sql` 主文件
3. 更新本说明文档的变更记录
4. 在 `docs/变更管理/code-adjust-record.md` 中记录变更
4. 在 `docs/变更管理/code-adjust-record-YYYY-MM-DD-{username}.md` 中记录变更
### 文件命名规则
- 使用两位数字前缀进行排序
- 使用表名作为文件名,如 `xg_student_info.sql`
- 可选使用两位数字前缀进行排序
- 使用英文短横线分隔词语
- 以 `-module.sql` 结尾表示模块文件
- 以 `.sql` 结尾
### 拆分原则
- 按业务域进行逻辑分组
- 按业务域进行目录分组
- 保持模块的相对独立性
- 考虑实际部署和维护需求
- 遵循数据库设计规范
@@ -266,6 +215,22 @@ SOURCE docs/设计文档/database/06-test-module.sql;
## 📋 更新记录
### 2025-07-15 - 目录结构调整
**变更内容**:
- 将SQL文件按业务域进行目录拆分
- 新增学工管理-学生信息管理目录
- 新增工作流目录
- 新增后勤管理目录
- 新增学工管理-宿舍管理目录
- 更新SQL文件说明文档,反映新的目录结构
**变更原因**: 优化数据库文件管理,按业务模块分类存储,提高可维护性
**影响范围**: 仅影响文件组织方式,不影响SQL内容和功能
**执行状态**: ✅ 已完成并验证通过
### 2025-01-09 - 学工管理模块完全删除
**变更内容**:
@@ -0,0 +1,271 @@
-- 宿舍管理数据库建表脚本
-- 来源:docs/业务模块/学工管理-宿舍管理/数据库设计/宿舍管理数据库设计.md
-- 用途:统一存储宿舍管理模块所有相关表的建表SQL,便于维护和执行
-- 维护人:数据库设计团队
-- 日期:2025-01-14
-- 1. 校区信息表
drop table if exists `xg_dorm_campus`;
create table `xg_dorm_campus` (
`id` bigint(20) not null comment '主键ID',
`campus_code` varchar(50) not null comment '校区编码',
`campus_name` varchar(100) not null comment '校区名称',
`campus_description` varchar(500) default null comment '校区描述',
`sort_order` int(11) default '0' comment '排序号',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_campus_code` (`campus_code`)
) engine=innodb default charset=utf8mb4 comment='校区信息表';
-- 2. 宿舍区信息表
drop table if exists `xg_dorm_area`;
create table `xg_dorm_area` (
`id` bigint(20) not null comment '主键ID',
`area_code` varchar(50) not null comment '宿舍区编码',
`area_name` varchar(100) not null comment '宿舍区名称',
`campus_id` bigint(20) not null comment '所属校区ID',
`area_description` varchar(500) default null comment '宿舍区描述',
`sort_order` int(11) default '0' comment '排序号',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_area_code` (`area_code`),
key `idx_campus_id` (`campus_id`)
) engine=innodb default charset=utf8mb4 comment='宿舍区信息表';
-- 3. 宿舍楼信息表
drop table if exists `xg_dorm_building`;
create table `xg_dorm_building` (
`id` bigint(20) not null comment '主键ID',
`building_code` varchar(50) not null comment '宿舍楼编码',
`building_name` varchar(100) not null comment '宿舍楼名称',
`area_id` bigint(20) not null comment '所属宿舍区ID',
`campus_id` bigint(20) not null comment '所属校区ID',
`floors` int(11) not null default '6' comment '总楼层数',
`building_type` char(1) default '1' comment '宿舍楼类型(1男生楼 2女生楼 3混合楼)',
`building_description` varchar(500) default null comment '宿舍楼描述',
`sort_order` int(11) default '0' comment '排序号',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_building_code` (`building_code`),
key `idx_area_id` (`area_id`),
key `idx_campus_id` (`campus_id`)
) engine=innodb default charset=utf8mb4 comment='宿舍楼信息表';
-- 4. 宿舍房间信息表
drop table if exists `xg_dorm_room`;
create table `xg_dorm_room` (
`id` bigint(20) not null comment '主键ID',
`room_code` varchar(50) not null comment '房间编号',
`room_name` varchar(100) not null comment '房间名称',
`building_id` bigint(20) not null comment '所属宿舍楼ID',
`floor_num` int(11) not null comment '楼层',
`room_type` char(1) default '1' comment '房间类型(1标准间 2 单人间 3 套间)',
`actual_beds` int(11) default 4 comment '实际床位数',
`room_area` decimal(10,2) default null comment '房间面积(平方米)',
`room_status` char(1) default '0' comment '房间状态(0可用 1维修中 2停用)',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_room_code` (`room_code`),
key `idx_building_id` (`building_id`),
key `idx_floor_num` (`floor_num`)
) engine=innodb default charset=utf8mb4 comment='宿舍房间信息表';
-- 5. 宿舍床位信息表
drop table if exists `xg_dorm_bed`;
create table `xg_dorm_bed` (
`id` bigint(20) not null comment '主键ID',
`bed_code` varchar(50) not null comment '床位编号',
`bed_name` varchar(100) not null comment '床位名称',
`room_id` bigint(20) not null comment '所属房间ID',
`bed_type` char(1) default '1' comment '床位类型(1下铺 2上铺 3中铺 4独立床)',
`bed_status` char(1) default '0' comment '床位状态(0空闲 1已分配 2维修中)',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_bed_code` (`bed_code`),
key `idx_room_id` (`room_id`)
) engine=innodb default charset=utf8mb4 comment='宿舍床位信息表';
-- 6. 床位学生分配关系表
drop table if exists `xg_dorm_bed_student`;
create table `xg_dorm_bed_student` (
`id` bigint(20) not null comment '主键ID',
`college_id` bigint(20) not null comment '分配学院ID',
`student_id` bigint(20) not null comment '分配学生ID',
`bed_id` bigint(20) not null comment '床位ID',
`room_id` bigint(20) not null comment '房间ID',
`building_id` bigint(20) not null comment '宿舍楼ID',
`area_id` bigint(20) not null comment '宿舍区ID',
`campus_id` bigint(20) not null comment '校区ID',
`status` char(1) default '0' comment '状态(0正常 1已退宿)',
`assign_time` datetime not null comment '分配时间',
`checkout_time` datetime default null comment '退宿时间',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_student_bed` (`student_id`, `bed_id`),
key `idx_college_id` (`college_id`),
key `idx_student_id` (`student_id`),
key `idx_bed_id` (`bed_id`),
key `idx_room_id` (`room_id`),
key `idx_building_id` (`building_id`),
key `idx_area_id` (`area_id`),
key `idx_campus_id` (`campus_id`),
key `idx_assign_time` (`assign_time`)
) engine=innodb default charset=utf8mb4 comment='床位学生分配关系表';
-- 7. 宿舍管理员信息表
drop table if exists `xg_dorm_manager`;
create table `xg_dorm_manager` (
`id` bigint(20) not null comment '主键ID',
`manager_name` varchar(100) not null comment '管理员姓名',
`manager_type` char(1) not null comment '管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)',
`manager_level` int(11) default 1 comment '管理级别(1-5,1为最高)',
`user_id` bigint(20) default null comment '关联用户ID',
`phone` varchar(20) default null comment '联系电话',
`gender` char(1) default '0' comment '性别(0男 1女 2未知)',
`status` char(1) default '0' comment '状态(0正常 1停用)',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
key `idx_user_id` (`user_id`),
key `idx_manager_type` (`manager_type`)
) engine=innodb default charset=utf8mb4 comment='宿舍管理员信息表';
-- 8. 管理员授权关系表
drop table if exists `xg_dorm_manager_source`;
create table `xg_dorm_manager_source` (
`id` bigint(20) not null comment '主键ID',
`manager_id` bigint(20) not null comment '管理员ID',
`permission_type` char(1) default '1' comment '权限类型(1查看 2编辑 3完全管理)',
`auth_type` char(1) not null comment '授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)',
`auth_source` bigint(20) default null comment '授权来源ID(对应校区ID或宿舍区ID或楼栋ID)',
`status` char(1) default '0' comment '状态(0有效 1已撤销)',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
key `idx_manager_id` (`manager_id`),
key `idx_auth_source` (`auth_source`)
) engine=innodb default charset=utf8mb4 comment='管理员授权关系表';
-- 9. 管理员宿舍楼权限关系表
drop table if exists `xg_dorm_manager_building`;
create table `xg_dorm_manager_building` (
`id` bigint(20) not null comment '主键ID',
`manager_id` bigint(20) not null comment '管理员ID',
`building_id` bigint(20) not null comment '宿舍楼ID',
`status` char(1) default '0' comment '状态(0有效 1已撤销)',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_manager_building` (`manager_id`, `building_id`),
key `idx_manager_id` (`manager_id`),
key `idx_building_id` (`building_id`)
) engine=innodb default charset=utf8mb4 comment='管理员宿舍楼权限关系表';
-- 10. 二级学院宿舍管理员信息表
drop table if exists `xg_dorm_college_manager`;
create table `xg_dorm_college_manager` (
`id` bigint(20) not null comment '主键ID',
`manager_name` varchar(100) not null comment '管理员姓名',
`college_id` bigint(20) not null comment '所属学院ID',
`user_id` bigint(20) default null comment '关联用户ID',
`phone` varchar(20) default null comment '联系电话',
`gender` char(1) default '0' comment '性别(0男 1女 2未知)',
`status` char(1) default '0' comment '状态(0正常 1停用)',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
key `idx_college_id` (`college_id`),
key `idx_user_id` (`user_id`)
) engine=innodb default charset=utf8mb4 comment='二级学院宿舍管理员信息表';
-- 11. 二级学院床位绑定关系表
drop table if exists `xg_dorm_college_bed`;
create table `xg_dorm_college_bed` (
`id` bigint(20) not null comment '主键ID',
`college_id` bigint(20) not null comment '学院ID',
`bed_id` bigint(20) not null comment '床位ID',
`building_id` bigint(20) not null comment '宿舍楼ID',
`room_id` bigint(20) not null comment '房间ID',
`status` char(1) default '0' comment '状态(0正常 1已解除)',
`assign_time` datetime default null comment '分配时间',
`release_time` datetime default null comment '到期解除时间',
`deleted` char(1) default '0' comment '删除标志(0代表存在 1代表删除)',
`tenant_id` bigint(20) default '0' comment '租户编号',
`create_by` bigint(20) default null comment '创建者',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime default null comment '创建时间',
`update_by` bigint(20) default null comment '更新者',
`update_time` datetime default null comment '更新时间',
`remark` varchar(500) default null comment '备注',
primary key (`id`),
unique key `uk_college_bed` (`college_id`, `bed_id`),
key `idx_college_id` (`college_id`),
key `idx_bed_id` (`bed_id`),
key `idx_building_id` (`building_id`),
key `idx_room_id` (`room_id`)
) engine=innodb default charset=utf8mb4 comment='二级学院床位绑定关系表';
@@ -0,0 +1,60 @@
-- 菜单 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733426065409, '宿舍区信息', '1946805729728077826', '1', 'dormArea', 'ssqxx/dormArea/index', 1, 0, 'C', '0', '0', 'ssqxx:dormArea:list', '#', 103, 1, sysdate(), null, null, '宿舍区信息菜单');
-- 按钮 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733426065410, '宿舍区信息查询', 1946809733426065409, '1', '#', '', 1, 0, 'F', '0', '0', 'ssqxx:dormArea:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733426065411, '宿舍区信息新增', 1946809733426065409, '2', '#', '', 1, 0, 'F', '0', '0', 'ssqxx:dormArea:add', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733426065412, '宿舍区信息修改', 1946809733426065409, '3', '#', '', 1, 0, 'F', '0', '0', 'ssqxx:dormArea:edit', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733426065413, '宿舍区信息删除', 1946809733426065409, '4', '#', '', 1, 0, 'F', '0', '0', 'ssqxx:dormArea:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733426065414, '宿舍区信息导出', 1946809733426065409, '5', '#', '', 1, 0, 'F', '0', '0', 'ssqxx:dormArea:export', '#', 103, 1, sysdate(), null, null, '');
-- 菜单 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809734004879362, '宿舍楼信息', '1946805729728077826', '1', 'dormBuilding', 'sslxx/dormBuilding/index', 1, 0, 'C', '0', '0', 'sslxx:dormBuilding:list', '#', 103, 1, sysdate(), null, null, '宿舍楼信息菜单');
-- 按钮 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809734004879363, '宿舍楼信息查询', 1946809734004879362, '1', '#', '', 1, 0, 'F', '0', '0', 'sslxx:dormBuilding:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809734004879364, '宿舍楼信息新增', 1946809734004879362, '2', '#', '', 1, 0, 'F', '0', '0', 'sslxx:dormBuilding:add', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809734004879365, '宿舍楼信息修改', 1946809734004879362, '3', '#', '', 1, 0, 'F', '0', '0', 'sslxx:dormBuilding:edit', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809734004879366, '宿舍楼信息删除', 1946809734004879362, '4', '#', '', 1, 0, 'F', '0', '0', 'sslxx:dormBuilding:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809734004879367, '宿舍楼信息导出', 1946809734004879362, '5', '#', '', 1, 0, 'F', '0', '0', 'sslxx:dormBuilding:export', '#', 103, 1, sysdate(), null, null, '');
-- 菜单 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733761609729, '校区信息', '1946805729728077826', '1', 'dormCampus', 'xqxx/dormCampus/index', 1, 0, 'C', '0', '0', 'xqxx:dormCampus:list', '#', 103, 1, sysdate(), null, null, '校区信息菜单');
-- 按钮 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733761609730, '校区信息查询', 1946809733761609729, '1', '#', '', 1, 0, 'F', '0', '0', 'xqxx:dormCampus:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733761609731, '校区信息新增', 1946809733761609729, '2', '#', '', 1, 0, 'F', '0', '0', 'xqxx:dormCampus:add', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733761609732, '校区信息修改', 1946809733761609729, '3', '#', '', 1, 0, 'F', '0', '0', 'xqxx:dormCampus:edit', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733761609733, '校区信息删除', 1946809733761609729, '4', '#', '', 1, 0, 'F', '0', '0', 'xqxx:dormCampus:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values(1946809733761609734, '校区信息导出', 1946809733761609729, '5', '#', '', 1, 0, 'F', '0', '0', 'xqxx:dormCampus:export', '#', 103, 1, sysdate(), null, null, '');
@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DormManagerSourceVO, DormManagerSourceForm, DormManagerSourceQuery } from '@/api/glysqgx/dormManagerSource/types';
/**
* 查询管理员授权关系列表
* @param query
* @returns {*}
*/
export const listDormManagerSource = (query?: DormManagerSourceQuery): AxiosPromise<DormManagerSourceVO[]> => {
return request({
url: '/glysqgx/dormManagerSource/list',
method: 'get',
params: query
});
};
/**
* 查询管理员授权关系详细
* @param id
*/
export const getDormManagerSource = (id: string | number): AxiosPromise<DormManagerSourceVO> => {
return request({
url: '/glysqgx/dormManagerSource/' + id,
method: 'get'
});
};
/**
* 新增管理员授权关系
* @param data
*/
export const addDormManagerSource = (data: DormManagerSourceForm) => {
return request({
url: '/glysqgx/dormManagerSource',
method: 'post',
data: data
});
};
/**
* 修改管理员授权关系
* @param data
*/
export const updateDormManagerSource = (data: DormManagerSourceForm) => {
return request({
url: '/glysqgx/dormManagerSource',
method: 'put',
data: data
});
};
/**
* 删除管理员授权关系
* @param id
*/
export const delDormManagerSource = (id: string | number | Array<string | number>) => {
return request({
url: '/glysqgx/dormManagerSource/' + id,
method: 'delete'
});
};
@@ -0,0 +1,126 @@
export interface DormManagerSourceVO {
/**
* 主键ID
*/
id: string | number;
/**
* 管理员ID
*/
managerId: string | number;
/**
* 权限类型(1查看 2编辑 3完全管理)
*/
permissionType: string;
/**
* 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
*/
authType: string;
/**
* 授权来源ID(对应校区ID或宿舍区ID或楼栋ID)
*/
authSource: number;
/**
* 状态(0有效 1已撤销)
*/
status: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted: string;
/**
* 备注
*/
remark: string;
}
export interface DormManagerSourceForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 管理员ID
*/
managerId?: string | number;
/**
* 权限类型(1查看 2编辑 3完全管理)
*/
permissionType?: string;
/**
* 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
*/
authType?: string;
/**
* 授权来源ID(对应校区ID或宿舍区ID或楼栋ID)
*/
authSource?: number;
/**
* 状态(0有效 1已撤销)
*/
status?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: string;
/**
* 备注
*/
remark?: string;
}
export interface DormManagerSourceQuery extends PageQuery {
/**
* 管理员ID
*/
managerId?: string | number;
/**
* 权限类型(1查看 2编辑 3完全管理)
*/
permissionType?: string;
/**
* 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
*/
authType?: string;
/**
* 授权来源ID(对应校区ID或宿舍区ID或楼栋ID)
*/
authSource?: number;
/**
* 状态(0有效 1已撤销)
*/
status?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: string;
/**
* 日期范围参数
*/
params?: any;
}
@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DormManagerBuildingVO, DormManagerBuildingForm, DormManagerBuildingQuery } from '@/api/glysslqxgx/dormManagerBuilding/types';
/**
* 查询管理员宿舍楼权限关系列表
* @param query
* @returns {*}
*/
export const listDormManagerBuilding = (query?: DormManagerBuildingQuery): AxiosPromise<DormManagerBuildingVO[]> => {
return request({
url: '/glysslqxgx/dormManagerBuilding/list',
method: 'get',
params: query
});
};
/**
* 查询管理员宿舍楼权限关系详细
* @param id
*/
export const getDormManagerBuilding = (id: string | number): AxiosPromise<DormManagerBuildingVO> => {
return request({
url: '/glysslqxgx/dormManagerBuilding/' + id,
method: 'get'
});
};
/**
* 新增管理员宿舍楼权限关系
* @param data
*/
export const addDormManagerBuilding = (data: DormManagerBuildingForm) => {
return request({
url: '/glysslqxgx/dormManagerBuilding',
method: 'post',
data: data
});
};
/**
* 修改管理员宿舍楼权限关系
* @param data
*/
export const updateDormManagerBuilding = (data: DormManagerBuildingForm) => {
return request({
url: '/glysslqxgx/dormManagerBuilding',
method: 'put',
data: data
});
};
/**
* 删除管理员宿舍楼权限关系
* @param id
*/
export const delDormManagerBuilding = (id: string | number | Array<string | number>) => {
return request({
url: '/glysslqxgx/dormManagerBuilding/' + id,
method: 'delete'
});
};
@@ -0,0 +1,96 @@
export interface DormManagerBuildingVO {
/**
* 主键ID
*/
id: string | number;
/**
* 管理员ID
*/
managerId: string | number;
/**
* 宿舍楼ID
*/
buildingId: string | number;
/**
* 状态(0有效 1已撤销)
*/
status: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted: string;
/**
* 备注
*/
remark: string;
}
export interface DormManagerBuildingForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 管理员ID
*/
managerId?: string | number;
/**
* 宿舍楼ID
*/
buildingId?: string | number;
/**
* 状态(0有效 1已撤销)
*/
status?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: string;
/**
* 备注
*/
remark?: string;
}
export interface DormManagerBuildingQuery extends PageQuery {
/**
* 管理员ID
*/
managerId?: string | number;
/**
* 宿舍楼ID
*/
buildingId?: string | number;
/**
* 状态(0有效 1已撤销)
*/
status?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: string;
/**
* 日期范围参数
*/
params?: any;
}
@@ -0,0 +1,97 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DormManagerVO, DormManagerForm, DormManagerQuery } from '@/api/ssglyxx/dormManager/types';
/**
* 查询宿舍管理员信息列表
* @param query
* @returns {*}
*/
export const listDormManager = (query?: DormManagerQuery): AxiosPromise<DormManagerVO[]> => {
return request({
url: '/ssglyxx/dormManager/list',
method: 'get',
params: query
});
};
/**
* 查询宿舍管理员信息详细
* @param id
*/
export const getDormManager = (id: string | number): AxiosPromise<DormManagerVO> => {
return request({
url: '/ssglyxx/dormManager/' + id,
method: 'get'
});
};
/**
* 新增宿舍管理员信息
* @param data
*/
export const addDormManager = (data: DormManagerForm) => {
return request({
url: '/ssglyxx/dormManager',
method: 'post',
data: data
});
};
/**
* 修改宿舍管理员信息
* @param data
*/
export const updateDormManager = (data: DormManagerForm) => {
return request({
url: '/ssglyxx/dormManager',
method: 'put',
data: data
});
};
/**
* 删除宿舍管理员信息
* @param id
*/
export const delDormManager = (id: string | number | Array<string | number>) => {
return request({
url: '/ssglyxx/dormManager/' + id,
method: 'delete'
});
};
/**
* 分配管理员数据范围
* @param managerId 管理员ID
* @param authType 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级)
* @param authSourceIds 授权来源ID列表
*/
export const assignScope = (managerId: string | number, authType: number, authSourceIds: (string | number)[]) => {
return request({
url: '/glysqgx/dormManagerSource/assignScope',
method: 'post',
params: {
managerId,
authType
},
data: authSourceIds
});
};
/**
* 获取管理员授权范围名称
* @param managerId 管理员ID
* @param managerType 管理员类型
*/
export const getManagerScopeNames = (managerId: string | number, managerType: number) => {
return request({
url: '/glysqgx/dormManagerSource/getScopeNames',
method: 'get',
params: {
managerId,
managerType
}
});
};
@@ -0,0 +1,161 @@
export interface DormManagerVO {
/**
* 主键ID
*/
id: string | number;
/**
* 管理员姓名
*/
managerName: string;
/**
* 管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
managerType: string;
/**
* 管理级别(1-5,1为最高)
*/
managerLevel: number;
/**
* 关联用户ID
*/
userId: string | number;
/**
* 联系电话
*/
phone: string;
/**
* 性别(0男 1女 2未知)
*/
gender: string;
/**
* 状态(0正常 1停用)
*/
status: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted: string;
/**
* 备注
*/
remark: string;
/**
* 授权范围名称(逗号分隔的字符串)
*/
scopeNames?: string;
}
export interface DormManagerForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 管理员姓名
*/
managerName?: string;
/**
* 管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
managerType?: string;
/**
* 管理级别(1-5,1为最高)
*/
managerLevel?: number;
/**
* 关联用户ID
*/
userId?: string | number;
/**
* 联系电话
*/
phone?: string;
/**
* 性别(0男 1女 2未知)
*/
gender?: string;
/**
* 状态(0正常 1停用)
*/
status?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: string;
/**
* 备注
*/
remark?: string;
}
export interface DormManagerQuery extends PageQuery {
/**
* 管理员姓名
*/
managerName?: string;
/**
* 管理员类型(1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员)
*/
managerType?: string;
/**
* 管理级别(1-5,1为最高)
*/
managerLevel?: number;
/**
* 关联用户ID
*/
userId?: string | number;
/**
* 联系电话
*/
phone?: string;
/**
* 性别(0男 1女 2未知)
*/
gender?: string;
/**
* 状态(0正常 1停用)
*/
status?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: string;
/**
* 日期范围参数
*/
params?: any;
}
@@ -0,0 +1,96 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DormBuildingVO, DormBuildingForm, DormBuildingQuery, BuildingTreeSelectVo } from '@/api/sslxx/dormBuilding/types';
/**
* 查询宿舍楼信息列表
* @param query
* @returns {*}
*/
export const listDormBuilding = (query?: DormBuildingQuery): AxiosPromise<DormBuildingVO[]> => {
return request({
url: '/sslxx/dormBuilding/list',
method: 'get',
params: query
});
};
/**
* 查询宿舍楼信息详细
* @param id
*/
export const getDormBuilding = (id: string | number): AxiosPromise<DormBuildingVO> => {
return request({
url: '/sslxx/dormBuilding/' + id,
method: 'get'
});
};
/**
* 新增宿舍楼信息
* @param data
*/
export const addDormBuilding = (data: DormBuildingForm) => {
return request({
url: '/sslxx/dormBuilding',
method: 'post',
data: data
});
};
/**
* 修改宿舍楼信息
* @param data
*/
export const updateDormBuilding = (data: DormBuildingForm) => {
return request({
url: '/sslxx/dormBuilding',
method: 'put',
data: data
});
};
/**
* 删除宿舍楼信息
* @param id
*/
export const delDormBuilding = (id: string | number | Array<string | number>) => {
return request({
url: '/sslxx/dormBuilding/' + id,
method: 'delete'
});
};
/**
* 获取校区选项列表
*/
export const listCampusOptions = (): AxiosPromise<any> => {
return request({
url: '/xqxx/dormCampus/list',
method: 'get'
});
};
/**
* 获取宿舍区树形数据
* @param campusId 校区ID,如果指定则只返回该校区的宿舍区
*/
export const listAreaTreeData = (campusId?: string | number): AxiosPromise<any> => {
return request({
url: '/ssqxx/dormArea/list',
method: 'get',
params: { campusId }
});
};
/**
* 获取宿舍楼树形结构数据(校区-宿舍区-宿舍楼三级结构)
* 校区和宿舍区节点不可选,只有宿舍楼节点可以选择
*/
export const getBuildingTree = (): AxiosPromise<BuildingTreeSelectVo[]> => {
return request({
url: '/sslxx/dormBuilding/buildingTree',
method: 'get'
});
};
@@ -0,0 +1,50 @@
export interface DormBuildingVO {
id: string | number;
buildingCode: string;
buildingName: string;
areaId: string | number;
campusId: string | number;
buildingType: string;
buildingDescription: string;
sortOrder: number;
createTime: string;
createBy: string;
updateTime: string;
updateBy: string;
remark: string;
areaName?: string;
campusName?: string;
floors: number;
}
export interface DormBuildingForm extends Omit<DormBuildingVO, 'createTime' | 'createBy' | 'updateTime' | 'updateBy' | 'areaName' | 'campusName'> {
}
export interface DormBuildingQuery {
buildingCode?: string;
buildingName?: string;
areaId?: string | number;
campusId?: string | number;
buildingType?: string;
floors?: number;
params?: Record<string, any>;
}
/**
* 宿舍楼树形结构节点
*/
export interface BuildingTreeSelectVo {
id: number;
label: string;
nodeType: 'campus' | 'area' | 'building';
disabled: boolean;
children?: BuildingTreeSelectVo[];
createBy?: number;
createTime?: string;
updateBy?: number;
floors?: number;
updateTime?: string;
}
+74
View File
@@ -0,0 +1,74 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DormAreaVO, DormAreaForm, DormAreaQuery, TreeSelectVo } from '@/api/ssqxx/dormArea/types';
/**
* 查询宿舍区信息列表
* @param query
* @returns {*}
*/
export const listDormArea = (query?: DormAreaQuery): AxiosPromise<DormAreaVO[]> => {
return request({
url: '/ssqxx/dormArea/list',
method: 'get',
params: query
});
};
/**
* 查询宿舍区信息详细
* @param id
*/
export const getDormArea = (id: string | number): AxiosPromise<DormAreaVO> => {
return request({
url: '/ssqxx/dormArea/' + id,
method: 'get'
});
};
/**
* 新增宿舍区信息
* @param data
*/
export const addDormArea = (data: DormAreaForm) => {
return request({
url: '/ssqxx/dormArea',
method: 'post',
data: data
});
};
/**
* 修改宿舍区信息
* @param data
*/
export const updateDormArea = (data: DormAreaForm) => {
return request({
url: '/ssqxx/dormArea',
method: 'put',
data: data
});
};
/**
* 删除宿舍区信息
* @param id
*/
export const delDormArea = (id: string | number | Array<string | number>) => {
return request({
url: '/ssqxx/dormArea/' + id,
method: 'delete'
});
};
/**
* 获取宿舍区树形结构数据
* 以校区为根节点,宿舍区为子节点的树形结构
*/
export const getAreaTree = (): AxiosPromise<TreeSelectVo[]> => {
return request({
url: '/ssqxx/dormArea/tree',
method: 'get'
});
};
+107
View File
@@ -0,0 +1,107 @@
export interface DormAreaVO {
/**
* 主键ID
*/
id: string | number;
/**
* 宿舍区编码
*/
areaCode: string;
/**
* 宿舍区名称
*/
areaName: string;
/**
* 所属校区ID
*/
campusId: string | number;
/**
* 宿舍区描述
*/
areaDescription: string;
/**
* 排序号
*/
sortOrder: number;
}
export interface DormAreaForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 宿舍区编码
*/
areaCode?: string;
/**
* 宿舍区名称
*/
areaName?: string;
/**
* 所属校区ID
*/
campusId?: string | number;
/**
* 宿舍区描述
*/
areaDescription?: string;
/**
* 排序号
*/
sortOrder?: number;
}
export interface DormAreaQuery extends PageQuery {
/**
* 宿舍区编码
*/
areaCode?: string;
/**
* 宿舍区名称
*/
areaName?: string;
/**
* 宿舍区描述
*/
areaDescription?: string;
/**
* 日期范围参数
*/
params?: any;
}
/**
* 树形选择数据类型
*/
export interface TreeSelectVo {
/** 节点ID */
id: number;
/** 节点名称 */
label: string;
/** 节点类型(campus:校区, area:宿舍区) */
type: string;
/** 是否禁用选择 */
disabled: boolean;
/** 子节点 */
children?: TreeSelectVo[];
}
+63
View File
@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DormCampusVO, DormCampusForm, DormCampusQuery } from '@/api/xqxx/dormCampus/types';
/**
* 查询校区信息列表
* @param query
* @returns {*}
*/
export const listDormCampus = (query?: DormCampusQuery): AxiosPromise<DormCampusVO[]> => {
return request({
url: '/xqxx/dormCampus/list',
method: 'get',
params: query
});
};
/**
* 查询校区信息详细
* @param id
*/
export const getDormCampus = (id: string | number): AxiosPromise<DormCampusVO> => {
return request({
url: '/xqxx/dormCampus/' + id,
method: 'get'
});
};
/**
* 新增校区信息
* @param data
*/
export const addDormCampus = (data: DormCampusForm) => {
return request({
url: '/xqxx/dormCampus',
method: 'post',
data: data
});
};
/**
* 修改校区信息
* @param data
*/
export const updateDormCampus = (data: DormCampusForm) => {
return request({
url: '/xqxx/dormCampus',
method: 'put',
data: data
});
};
/**
* 删除校区信息
* @param id
*/
export const delDormCampus = (id: string | number | Array<string | number>) => {
return request({
url: '/xqxx/dormCampus/' + id,
method: 'delete'
});
};
+86
View File
@@ -0,0 +1,86 @@
export interface DormCampusVO {
/**
* 主键ID
*/
id: string | number;
/**
* 校区编码
*/
campusCode: string;
/**
* 校区名称
*/
campusName: string;
/**
* 校区描述
*/
campusDescription: string;
/**
* 排序号
*/
sortOrder: number;
/**
* 备注
*/
remark: string;
}
export interface DormCampusForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 校区编码
*/
campusCode?: string;
/**
* 校区名称
*/
campusName?: string;
/**
* 校区描述
*/
campusDescription?: string;
/**
* 排序号
*/
sortOrder?: number;
/**
* 备注
*/
remark?: string;
}
export interface DormCampusQuery extends PageQuery {
/**
* 校区编码
*/
campusCode?: string;
/**
* 校区名称
*/
campusName?: string;
/**
* 日期范围参数
*/
params?: any;
}
+260
View File
@@ -0,0 +1,260 @@
import request from '@/utils/request';
import { DormQuery, RoomForm, BedForm, DormTreeNode, RoomInfo, BedInfo } from './types';
// API前缀
const baseUrl = '/xsssfjgl';
/**
* 获取宿舍楼树形结构
*/
export function getDormTree() {
return request({
url: '/xgss/dormBuildingTree/list',
method: 'get'
});
}
/**
* 获取房间列表
* @param query 查询条件
* @returns 房间列表
*/
export function listRooms(query: DormQuery) {
return request({
url: baseUrl + '/room/list',
method: 'get',
params: query
});
}
/**
* 获取房间详情
* @param roomId 房间ID
* @returns 房间详情
*/
export function getRoom(roomId: string | number) {
return request({
url: baseUrl + '/room/' + roomId,
method: 'get'
});
}
/**
* 新增房间
* @param data 房间信息
* @returns 结果
*/
export function addRoom(data: RoomForm) {
return request({
url: baseUrl + '/room',
method: 'post',
data: data
});
}
/**
* 修改房间
* @param data 房间信息
* @returns 结果
*/
export function updateRoom(data: RoomForm) {
return request({
url: baseUrl + '/room',
method: 'put',
data: data
});
}
/**
* 删除房间
* @param roomIds 房间ID字符串
* @returns 结果
*/
export function delRoom(roomIds: string | number) {
return request({
url: baseUrl + '/room/' + roomIds,
method: 'delete'
});
}
/**
* 获取床位列表
* @param roomId 房间ID
* @returns 床位列表
*/
export function listBeds(roomId: string | number) {
return request({
url: baseUrl + '/bed/list',
method: 'get',
params: { roomId }
});
}
/**
* 新增床位
* @param data 床位信息
* @returns 结果
*/
export function addBed(data: BedForm) {
return request({
url: baseUrl + '/bed',
method: 'post',
data: data
});
}
/**
* 修改床位
* @param data 床位信息
* @returns 结果
*/
export function updateBed(data: BedForm) {
return request({
url: baseUrl + '/bed',
method: 'put',
data: data
});
}
/**
* 删除床位
* @param bedIds 床位ID字符串
* @returns 结果
*/
export function delBed(bedIds: string | number) {
return request({
url: baseUrl + '/bed/' + bedIds,
method: 'delete'
});
}
// 模拟数据 - 在API接口完成前使用
// 生成宿舍树形结构的模拟数据
export function getMockDormTree(): { data: DormTreeNode[] } {
const mockData: DormTreeNode[] = [
{
id: 1,
label: '东校区',
type: 'campus',
disabled: true,
children: [
{
id: 11,
label: '东区宿舍',
type: 'area',
disabled: true,
children: [
{
id: 111,
label: '东区1号楼',
type: 'building',
buildingFloors: 6
},
{
id: 112,
label: '东区2号楼',
type: 'building',
buildingFloors: 8
}
]
}
]
},
{
id: 2,
label: '西校区',
type: 'campus',
disabled: true,
children: [
{
id: 21,
label: '西区宿舍',
type: 'area',
disabled: true,
children: [
{
id: 211,
label: '西区1号楼',
type: 'building',
buildingFloors: 7
},
{
id: 212,
label: '西区2号楼',
type: 'building',
buildingFloors: 5
}
]
}
]
}
];
return { data: mockData };
}
// 生成房间数据的模拟数据
export function getMockRooms(buildingId: string | number, floorNumber?: number): { rows: RoomInfo[], total: number } {
const rooms: RoomInfo[] = [];
// 根据buildingId判断楼层数
let floors = 6;
if (buildingId === 112) floors = 8;
else if (buildingId === 211) floors = 7;
else if (buildingId === 212) floors = 5;
// 如果指定了楼层,只生成该楼层的数据
const startFloor = floorNumber || 1;
const endFloor = floorNumber || floors;
for (let floor = startFloor; floor <= endFloor; floor++) {
for (let i = 1; i <= 10; i++) {
const roomNumber = `${floor}${i.toString().padStart(2, '0')}`;
rooms.push({
roomId: `${buildingId}${roomNumber}`,
roomName: roomNumber,
floorNumber: floor,
buildingId: buildingId,
capacity: 4,
used: Math.floor(Math.random() * 5),
roomType: '标准间',
status: Math.random() > 0.9 ? '1' : '0',
remark: '',
createBy: 'admin',
createTime: '2023-01-01 00:00:00',
updateBy: 'admin',
updateTime: '2023-01-01 00:00:00'
});
}
}
return {
rows: rooms.filter(room => !floorNumber || room.floorNumber === floorNumber),
total: rooms.length
};
}
// 生成床位数据的模拟数据
export function getMockBeds(roomId: string | number): { data: BedInfo[] } {
const beds: BedInfo[] = [];
const capacity = 4;
for (let i = 1; i <= capacity; i++) {
const status = Math.random() > 0.6 ? '1' : '0';
beds.push({
bedId: `${roomId}-${i}`,
bedName: `${i}号床`,
roomId: roomId,
status: status,
studentId: status === '1' ? 10000 + Math.floor(Math.random() * 5000) : undefined,
studentName: status === '1' ? `学生${Math.floor(Math.random() * 1000)}` : undefined,
remark: '',
createBy: 'admin',
createTime: '2023-01-01 00:00:00',
updateBy: 'admin',
updateTime: '2023-01-01 00:00:00'
});
}
return { data: beds };
}
+80
View File
@@ -0,0 +1,80 @@
// 基础字段类型
export interface BaseEntity {
createBy: number | string;
createTime: string;
updateBy: number | string;
updateTime: string;
}
// 分页查询参数
export interface PageQuery {
pageNum: number;
pageSize: number;
}
// 树形数据节点类型
export interface DormTreeNode {
id: string | number;
label: string;
children?: DormTreeNode[];
type: 'campus' | 'area' | 'building'; // 节点类型:校区、宿舍区、宿舍楼
disabled?: boolean; // 是否禁用选择
buildingFloors?: number; // 宿舍楼层数
}
// 房间信息
export interface RoomInfo extends BaseEntity {
roomId: string | number;
roomCode: string;
roomName: string;
floorNum: number;
buildingId: string | number;
capacity: number;
used: number;
roomArea: number;
roomType: string;
status: string; // 0-正常 1-维修中 2-停用
remark: string;
}
// 床位信息
export interface BedInfo extends BaseEntity {
bedId: string | number;
bedName: string;
roomId: string | number;
status: string; // 0-空闲 1-已分配 2-维修中
studentId?: string | number;
studentName?: string;
remark: string;
}
// 查询参数
export interface DormQuery extends PageQuery {
buildingId?: string | number;
roomName?: string;
floorNum?: number;
status?: string;
}
// 房间表单
export interface RoomForm {
roomId?: string | number;
roomCode: string;
roomName: string;
floorNum: number;
buildingId: string | number;
capacity: number;
roomArea: number;
roomType: string;
status: string;
remark?: string;
}
// 床位表单
export interface BedForm {
bedId?: string | number;
bedName: string;
roomId: string | number;
status: string;
remark?: string;
}
Loaded 100 of 113 files, more files were not shown because too many files have changed in this diff. Show more