diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 00000000..4535580f --- /dev/null +++ b/.cursorignore @@ -0,0 +1,3 @@ +# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv) +temp/ +test/ diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/.gitkeep deleted file mode 100644 index b4578324..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 控制器层 -# 此目录用于存放REST API控制器类 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormAreaController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormAreaController.java new file mode 100644 index 00000000..aa265e96 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormAreaController.java @@ -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 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 list = xgDormAreaService.queryList(bo); + ExcelUtil.exportExcel(list, "宿舍区信息", XgDormAreaVo.class, response); + } + + /** + * 获取宿舍区信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("ssqxx:dormArea:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(xgDormAreaService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取宿舍区树形结构数据 + * 以校区为根节点,宿舍区为子节点 + */ + @SaCheckPermission("ssqxx:dormArea:query") + @GetMapping("/tree") + public R> getAreaTree() { + return R.ok(xgDormAreaService.getAreaTree()); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBuildingController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBuildingController.java new file mode 100644 index 00000000..30420e62 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBuildingController.java @@ -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 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 list = xgDormBuildingService.queryList(bo); + ExcelUtil.exportExcel(list, "宿舍楼信息", XgDormBuildingVo.class, response); + } + + /** + * 获取宿舍楼信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sslxx:dormBuilding:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(xgDormBuildingService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取宿舍楼树形结构数据 + * 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择 + */ + @SaCheckPermission("sslxx:dormBuilding:list") + @GetMapping("/buildingTree") + public R> getBuildingTree() { + List treeData = xgDormBuildingService.getBuildingTreeData(); + return R.ok(treeData); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBuildingTreeController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBuildingTreeController.java new file mode 100644 index 00000000..1852249a --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBuildingTreeController.java @@ -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> getDormBuildingTree(DormBuildingTreeBo bo) { + List treeData = xgDormBuildingTreeService.getDormBuildingTree(bo); + return R.ok(treeData); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormCampusController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormCampusController.java new file mode 100644 index 00000000..f9508230 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormCampusController.java @@ -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 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 list = xgDormCampusService.queryList(bo); + ExcelUtil.exportExcel(list, "校区信息", XgDormCampusVo.class, response); + } + + /** + * 获取校区信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("xqxx:dormCampus:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(xgDormCampusService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerBuildingController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerBuildingController.java new file mode 100644 index 00000000..c1dbe63f --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerBuildingController.java @@ -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 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 list = xgDormManagerBuildingService.queryList(bo); + ExcelUtil.exportExcel(list, "管理员宿舍楼权限关系", XgDormManagerBuildingVo.class, response); + } + + /** + * 获取管理员宿舍楼权限关系详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("glysslqxgx:dormManagerBuilding:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(xgDormManagerBuildingService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerController.java new file mode 100644 index 00000000..edf6cd4b --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerController.java @@ -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 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 list = xgDormManagerService.queryList(bo); + ExcelUtil.exportExcel(list, "宿舍管理员信息", XgDormManagerVo.class, response); + } + + /** + * 获取宿舍管理员信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("ssglyxx:dormManager:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(xgDormManagerService.queryById(id)); + } + + /** + * 获取教师列表(用于下拉选择) + * + * @param name 教师姓名(可选,用于模糊查询) + * @param managerType 管理员类型(可选,用于查询不同类型的管理员) + */ + @SaCheckPermission("ssglyxx:dormManager:list") + @GetMapping("/teachers") + public R>> 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 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 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 remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(xgDormManagerService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerSourceController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerSourceController.java new file mode 100644 index 00000000..18cd60e4 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormManagerSourceController.java @@ -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 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 list = xgDormManagerSourceService.queryList(bo); + ExcelUtil.exportExcel(list, "管理员授权关系", XgDormManagerSourceVo.class, response); + } + + /** + * 获取管理员授权关系详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("glysqgx:dormManagerSource:query") + @GetMapping("/{id}") + public R 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 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 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 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 assignScope(@RequestParam @NotNull(message = "管理员ID不能为空") Long managerId, + @RequestParam @NotNull(message = "授权类型不能为空") Character authType, + @RequestBody List 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 getScopeNames(@RequestParam @NotNull(message = "管理员ID不能为空") Long managerId, + @RequestParam @NotNull(message = "管理员类型不能为空") Integer managerType) { + return R.ok(xgDormManagerSourceService.getScopeNames(managerId, managerType)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java new file mode 100644 index 00000000..65734779 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormRoomController.java @@ -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 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 list = xgDormRoomService.queryList(bo); + ExcelUtil.exportExcel(list, "宿舍房间信息", XgDormRoomVo.class, response); + } + + /** + * 获取宿舍房间信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("xgss:dormRoom:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(xgDormRoomService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/.gitkeep deleted file mode 100644 index 008b7da7..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 实体类 -# 此目录用于存放数据库实体类,对应数据库表结构 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormArea.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormArea.java new file mode 100644 index 00000000..3481a8da --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormArea.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormBuilding.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormBuilding.java new file mode 100644 index 00000000..e2b73921 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormBuilding.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormCampus.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormCampus.java new file mode 100644 index 00000000..c6502ccf --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormCampus.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManager.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManager.java new file mode 100644 index 00000000..67519ce2 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManager.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManagerBuilding.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManagerBuilding.java new file mode 100644 index 00000000..7d479b77 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManagerBuilding.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManagerSource.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManagerSource.java new file mode 100644 index 00000000..dc9b6513 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormManagerSource.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormRoom.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormRoom.java new file mode 100644 index 00000000..1346dc08 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormRoom.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/.gitkeep deleted file mode 100644 index efe1afff..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 业务对象(Business Object) -# 此目录用于存放业务对象类,用于接收前端参数和业务逻辑处理 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/DormBuildingTreeBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/DormBuildingTreeBo.java new file mode 100644 index 00000000..007aadb2 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/DormBuildingTreeBo.java @@ -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; +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormAreaBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormAreaBo.java new file mode 100644 index 00000000..13d8b2a3 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormAreaBo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormBuildingBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormBuildingBo.java new file mode 100644 index 00000000..499f6725 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormBuildingBo.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormCampusBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormCampusBo.java new file mode 100644 index 00000000..8b28cd70 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormCampusBo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerBo.java new file mode 100644 index 00000000..54ac2995 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerBo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerBuildingBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerBuildingBo.java new file mode 100644 index 00000000..fffe51b4 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerBuildingBo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerSourceBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerSourceBo.java new file mode 100644 index 00000000..a458a2e0 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormManagerSourceBo.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormRoomBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormRoomBo.java new file mode 100644 index 00000000..c870cba6 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormRoomBo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/.gitkeep deleted file mode 100644 index d65a4d5a..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 视图对象(View Object) -# 此目录用于存放视图对象类,用于返回给前端的数据结构 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/BuildingTreeSelectVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/BuildingTreeSelectVo.java new file mode 100644 index 00000000..b961f005 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/BuildingTreeSelectVo.java @@ -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 children; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + private java.util.Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + private java.util.Date updateTime; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/DormBuildingInfoVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/DormBuildingInfoVo.java new file mode 100644 index 00000000..6d56136b --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/DormBuildingInfoVo.java @@ -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; +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/DormBuildingTreeVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/DormBuildingTreeVo.java new file mode 100644 index 00000000..7532e115 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/DormBuildingTreeVo.java @@ -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 children; +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/TeacherVO.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/TeacherVO.java new file mode 100644 index 00000000..51c8d956 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/TeacherVO.java @@ -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; +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/TreeSelectVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/TreeSelectVo.java new file mode 100644 index 00000000..38aeb9c0 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/TreeSelectVo.java @@ -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 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); + } +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormAreaVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormAreaVo.java new file mode 100644 index 00000000..409daae4 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormAreaVo.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBuildingVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBuildingVo.java new file mode 100644 index 00000000..ea7686db --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBuildingVo.java @@ -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; // 更新时间 +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormCampusVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormCampusVo.java new file mode 100644 index 00000000..dd4cb956 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormCampusVo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerBuildingVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerBuildingVo.java new file mode 100644 index 00000000..d404da1a --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerBuildingVo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerSourceVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerSourceVo.java new file mode 100644 index 00000000..7a580de9 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerSourceVo.java @@ -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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerVo.java new file mode 100644 index 00000000..ad1cac25 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormManagerVo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormRoomVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormRoomVo.java new file mode 100644 index 00000000..aae4aabc --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormRoomVo.java @@ -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; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/.gitkeep deleted file mode 100644 index 9aa902fc..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 数据访问层 -# 此目录用于存放MyBatis Mapper接口 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormAreaMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormAreaMapper.java new file mode 100644 index 00000000..d133e353 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormAreaMapper.java @@ -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 { + + /** + * 分页查询并返回校区名称 + */ + Page selectPageWithCampusName(Page page, + @org.apache.ibatis.annotations.Param("bo") XgDormAreaBo bo); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBuildingMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBuildingMapper.java new file mode 100644 index 00000000..acb29f7f --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBuildingMapper.java @@ -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 { + + /** + * 分页查询并返回校区名称和宿舍区名称 + */ + Page selectPageWithAreaAndCampusName(Page page, + @org.apache.ibatis.annotations.Param("bo") XgDormBuildingBo bo); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBuildingTreeMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBuildingTreeMapper.java new file mode 100644 index 00000000..9025a49b --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBuildingTreeMapper.java @@ -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 selectCampusList(); + + /** + * 获取所有宿舍区信息 + * + * @return 宿舍区列表 + */ + List selectAreaList(); + + /** + * 获取所有宿舍楼信息 + * + * @return 宿舍楼列表 + */ + List selectBuildingList(DormBuildingTreeBo bo); + + /** + * 获取全校管理员权限的宿舍楼信息 + * + * @param userId 用户ID + * @param bo 查询参数 + * @return 宿舍楼列表 + */ + List selectBuildingsBySchoolAdmin(@Param("userId") Long userId, + @Param("bo") DormBuildingTreeBo bo); + + /** + * 获取校区管理员权限的宿舍楼信息 + * + * @param userId 用户ID + * @param bo 查询参数 + * @return 宿舍楼列表 + */ + List selectBuildingsByCampusAdmin(@Param("userId") Long userId, + @Param("bo") DormBuildingTreeBo bo); + + /** + * 获取宿舍区管理员权限的宿舍楼信息 + * + * @param userId 用户ID + * @param bo 查询参数 + * @return 宿舍楼列表 + */ + List selectBuildingsByAreaAdmin(@Param("userId") Long userId, + @Param("bo") DormBuildingTreeBo bo); + + /** + * 获取宿舍楼管理员权限的宿舍楼信息 + * + * @param userId 用户ID + * @param bo 查询参数 + * @return 宿舍楼列表 + */ + List selectBuildingsByBuildingAdmin(@Param("userId") Long userId, + @Param("bo") DormBuildingTreeBo bo); + + /** + * 检查用户是否有宿舍管理权限 + * + * @param userId 用户ID + * @return 管理员类型列表 (1全校管理员 2校区管理员 3宿舍区管理员 4宿舍楼管理员) + */ + List checkUserDormManagerType(@Param("userId") Long userId); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormCampusMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormCampusMapper.java new file mode 100644 index 00000000..6e7716de --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormCampusMapper.java @@ -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 { + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerBuildingMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerBuildingMapper.java new file mode 100644 index 00000000..bb9c2edf --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerBuildingMapper.java @@ -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 { + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerMapper.java new file mode 100644 index 00000000..a98d6e0c --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerMapper.java @@ -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 { + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerSourceMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerSourceMapper.java new file mode 100644 index 00000000..b0a96b27 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormManagerSourceMapper.java @@ -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 { + + /** + * 根据ID列表获取校区名称(逗号分隔) + * + * @param sourceIds 校区ID列表 + * @return 校区名称,多个以逗号分隔 + */ + String getCampusNamesByIds(@Param("sourceIds") List sourceIds); + + /** + * 根据ID列表获取宿舍区名称(逗号分隔) + * + * @param sourceIds 宿舍区ID列表 + * @return 宿舍区名称,多个以逗号分隔 + */ + String getAreaNamesByIds(@Param("sourceIds") List sourceIds); + + /** + * 根据ID列表获取宿舍楼名称(逗号分隔) + * + * @param sourceIds 宿舍楼ID列表 + * @return 宿舍楼名称,多个以逗号分隔 + */ + String getBuildingNamesByIds(@Param("sourceIds") List sourceIds); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormRoomMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormRoomMapper.java new file mode 100644 index 00000000..42c1b487 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormRoomMapper.java @@ -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 { + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/.gitkeep deleted file mode 100644 index 693568b9..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 业务服务接口层 -# 此目录用于存放Service接口定义 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormAreaService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormAreaService.java new file mode 100644 index 00000000..f1c68adf --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormAreaService.java @@ -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 queryPageList(XgDormAreaBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的宿舍区信息列表 + * + * @param bo 查询条件 + * @return 宿舍区信息列表 + */ + List 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 ids, Boolean isValid); + + /** + * 获取宿舍区树形结构数据 + * 以校区为根节点,宿舍区为子节点 + * + * @return 宿舍区树形结构列表 + */ + List getAreaTree(); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBuildingService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBuildingService.java new file mode 100644 index 00000000..d15bdb61 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBuildingService.java @@ -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 queryPageList(XgDormBuildingBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的宿舍楼信息列表 + * + * @param bo 查询条件 + * @return 宿舍楼信息列表 + */ + List 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 ids, Boolean isValid); + + /** + * 获取宿舍楼树形结构数据 + * 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择 + * + * @return 树形结构数据 + */ + List getBuildingTreeData(); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBuildingTreeService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBuildingTreeService.java new file mode 100644 index 00000000..63e58005 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBuildingTreeService.java @@ -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 getDormBuildingTree(DormBuildingTreeBo bo); + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormCampusService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormCampusService.java new file mode 100644 index 00000000..ec47d9cc --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormCampusService.java @@ -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 queryPageList(XgDormCampusBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的校区信息列表 + * + * @param bo 查询条件 + * @return 校区信息列表 + */ + List 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 ids, Boolean isValid); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerBuildingService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerBuildingService.java new file mode 100644 index 00000000..e20b1f7c --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerBuildingService.java @@ -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 queryPageList(XgDormManagerBuildingBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的管理员宿舍楼权限关系列表 + * + * @param bo 查询条件 + * @return 管理员宿舍楼权限关系列表 + */ + List 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 ids, Boolean isValid); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerService.java new file mode 100644 index 00000000..2a487ebe --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerService.java @@ -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 queryPageList(XgDormManagerBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的宿舍管理员信息列表 + * + * @param bo 查询条件 + * @return 宿舍管理员信息列表 + */ + List queryList(XgDormManagerBo bo); + + /** + * 查询教师列表(用于下拉选择) + * + * @param name 教师姓名(可选,用于模糊查询) + * @return 教师列表 + */ + List> 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 ids, Boolean isValid); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerSourceService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerSourceService.java new file mode 100644 index 00000000..161bbcd1 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormManagerSourceService.java @@ -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 queryPageList(XgDormManagerSourceBo bo, PageQuery pageQuery); + + /** + * 查询管理员授权关系列表 + */ + List queryList(XgDormManagerSourceBo bo); + + /** + * 新增管理员授权关系 + */ + Boolean insertByBo(XgDormManagerSourceBo bo); + + /** + * 修改管理员授权关系 + */ + Boolean updateByBo(XgDormManagerSourceBo bo); + + /** + * 校验并批量删除管理员授权关系信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量分配管理员数据范围 + * + * @param managerId 管理员ID + * @param authType 授权类型(1全校级 2校区级 3宿舍区级 4楼栋级) + * @param authSourceIds 授权来源ID列表 + * @return 结果 + */ + Boolean assignScope(Long managerId, Character authType, List authSourceIds); + + /** + * 获取管理员授权范围名称 + * + * @param managerId 管理员ID + * @param managerType 管理员类型(1全校级 2校区级 3宿舍区级 4楼栋级) + * @return 授权范围名称(逗号分隔字符串) + */ + String getScopeNames(Long managerId, Integer managerType); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java new file mode 100644 index 00000000..d4cf9f9c --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormRoomService.java @@ -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 queryPageList(XgDormRoomBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的宿舍房间信息列表 + * + * @param bo 查询条件 + * @return 宿舍房间信息列表 + */ + List 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 ids, Boolean isValid); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/.gitkeep b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/.gitkeep deleted file mode 100644 index 637cd075..00000000 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# 学工管理模块 - 业务服务实现层 -# 此目录用于存放Service接口的实现类 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormAreaServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormAreaServiceImpl.java new file mode 100644 index 00000000..39732318 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormAreaServiceImpl.java @@ -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 queryPageList(XgDormAreaBo bo, PageQuery pageQuery) { + Page result = baseMapper.selectPageWithCampusName(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的宿舍区信息列表 + * + * @param bo 查询条件 + * @return 宿舍区信息列表 + */ + @Override + public List queryList(XgDormAreaBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormAreaBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 获取宿舍区树形结构数据 + * 以校区为根节点,宿舍区为子节点 + * + * @return 宿舍区树形结构列表 + */ + @Override + public List getAreaTree() { + // 1. 获取所有校区数据 + List campusList = dormCampusService.queryList(new XgDormCampusBo()); + + // 2. 获取所有宿舍区数据 + List areaList = queryList(new XgDormAreaBo()); + + // 3. 构建树形结构 + List treeList = new ArrayList<>(); + + // 4. 创建校区节点(校区节点不可选择) + for (XgDormCampusVo campus : campusList) { + // 校区节点不可选择 + TreeSelectVo campusNode = new TreeSelectVo( + campus.getId(), + campus.getCampusName(), + "campus", + true // 禁用校区节点,不可选择 + ); + + // 5. 添加对应校区的宿舍区节点 + List 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; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBuildingServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBuildingServiceImpl.java new file mode 100644 index 00000000..3cca3511 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBuildingServiceImpl.java @@ -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 queryPageList(XgDormBuildingBo bo, PageQuery pageQuery) { + Page result = baseMapper.selectPageWithAreaAndCampusName(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的宿舍楼信息列表 + * + * @param bo 查询条件 + * @return 宿舍楼信息列表 + */ + @Override + public List queryList(XgDormBuildingBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormBuildingBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 获取宿舍楼树形结构数据 + * 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择 + * + * @return 宿舍楼树形结构数据 + */ + @Override + public List getBuildingTreeData() { + // 1. 获取所有校区数据 + List campusList = campusMapper.selectList( + Wrappers.lambdaQuery() + .orderByAsc(XgDormCampus::getSortOrder, XgDormCampus::getId)); + + // 2. 获取所有宿舍区数据 + List areaList = areaMapper.selectList( + Wrappers.lambdaQuery() + .orderByAsc(XgDormArea::getSortOrder, XgDormArea::getId)); + + // 3. 获取所有宿舍楼数据 + List buildingList = baseMapper.selectList( + Wrappers.lambdaQuery() + .orderByAsc(XgDormBuilding::getSortOrder, XgDormBuilding::getId)); + + // 4. 构建树形结构 + List 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 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 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; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBuildingTreeServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBuildingTreeServiceImpl.java new file mode 100644 index 00000000..6bc9b2c5 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBuildingTreeServiceImpl.java @@ -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 getDormBuildingTree(DormBuildingTreeBo bo) { + // 获取当前登录用户ID + Long userId = LoginHelper.getUserId(); + + // 查询用户管理权限类型 + List managerTypes = dormBuildingTreeMapper.checkUserDormManagerType(userId); + + if (managerTypes == null || managerTypes.isEmpty()) { + // 没有宿舍管理权限,返回空列表 + return new ArrayList<>(); + } + + // 获取所有宿舍楼数据(根据权限过滤) + List buildingList = new ArrayList<>(); + + // 按照权限分别查询并合并结果(支持用户拥有多种角色的情况) + if (managerTypes.contains("1")) { + // 全校管理员,获取所有宿舍楼 + buildingList = dormBuildingTreeMapper.selectBuildingsBySchoolAdmin(userId, bo); + // 全校管理员可以查看所有宿舍楼,无需继续查询其他权限 + } else { + // 对于非全校管理员,合并多种权限的结果 + Set addedBuildingIds = new HashSet<>(); // 用于去重 + + if (managerTypes.contains("2")) { + // 校区管理员,获取管理的校区下的宿舍楼 + List campusBuildings = dormBuildingTreeMapper.selectBuildingsByCampusAdmin(userId, + bo); + for (DormBuildingInfoVo building : campusBuildings) { + if (addedBuildingIds.add(building.getId())) { + buildingList.add(building); + } + } + } + + if (managerTypes.contains("3")) { + // 宿舍区管理员,获取管理的宿舍区下的宿舍楼 + List areaBuildings = dormBuildingTreeMapper.selectBuildingsByAreaAdmin(userId, bo); + for (DormBuildingInfoVo building : areaBuildings) { + if (addedBuildingIds.add(building.getId())) { + buildingList.add(building); + } + } + } + + if (managerTypes.contains("4")) { + // 宿舍楼管理员,获取管理的宿舍楼 + List directBuildings = dormBuildingTreeMapper.selectBuildingsByBuildingAdmin(userId, + bo); + for (DormBuildingInfoVo building : directBuildings) { + if (addedBuildingIds.add(building.getId())) { + buildingList.add(building); + } + } + } + } + + // 如果没有获取到宿舍楼数据,返回空列表 + if (buildingList.isEmpty()) { + return new ArrayList<>(); + } + + // 获取相关校区和宿舍区数据 + List campusList = dormBuildingTreeMapper.selectCampusList(); + List areaList = dormBuildingTreeMapper.selectAreaList(); + + // 构建校区节点集合(第一层) + Map 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 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()); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormCampusServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormCampusServiceImpl.java new file mode 100644 index 00000000..17b50884 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormCampusServiceImpl.java @@ -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 queryPageList(XgDormCampusBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的校区信息列表 + * + * @param bo 查询条件 + * @return 校区信息列表 + */ + @Override + public List queryList(XgDormCampusBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormCampusBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerBuildingServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerBuildingServiceImpl.java new file mode 100644 index 00000000..70c2f087 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerBuildingServiceImpl.java @@ -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 queryPageList(XgDormManagerBuildingBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的管理员宿舍楼权限关系列表 + * + * @param bo 查询条件 + * @return 管理员宿舍楼权限关系列表 + */ + @Override + public List queryList(XgDormManagerBuildingBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormManagerBuildingBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerServiceImpl.java new file mode 100644 index 00000000..4f60aa02 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerServiceImpl.java @@ -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 queryPageList(XgDormManagerBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的宿舍管理员信息列表 + * + * @param bo 查询条件 + * @return 宿舍管理员信息列表 + */ + @Override + public List queryList(XgDormManagerBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + /** + * 查询教师列表(用于下拉选择) + * + * @param name 教师姓名(可选,用于模糊查询) + * @return 教师列表 + */ + @Override + public List> 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 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 buildQueryWrapper(XgDormManagerBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerSourceServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerSourceServiceImpl.java new file mode 100644 index 00000000..cecb73a1 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerSourceServiceImpl.java @@ -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 queryPageList(XgDormManagerSourceBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的管理员授权关系列表 + * + * @param bo 查询条件 + * @return 管理员授权关系列表 + */ + @Override + public List queryList(XgDormManagerSourceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormManagerSourceBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 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 authSourceIds) { + if (managerId == null || authType == null) { + return false; + } + + try { + // 1. 逻辑删除该管理员指定授权类型的现有数据 + LambdaUpdateWrapper 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 queryWrapper = Wrappers.lambdaQuery(XgDormManagerSource.class) + .eq(XgDormManagerSource::getManagerId, managerId) + .eq(XgDormManagerSource::getAuthType, authType) + .eq(XgDormManagerSource::getDeleted, "0") // 未删除的记录 + .eq(XgDormManagerSource::getStatus, "0"); // 状态为有效 + + List sources = baseMapper.selectList(queryWrapper); + if (sources.isEmpty()) { + return ""; + } + + // 提取授权来源ID列表 + List 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 ""; + } + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java new file mode 100644 index 00000000..1811a4fd --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java @@ -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 queryPageList(XgDormRoomBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的宿舍房间信息列表 + * + * @param bo 查询条件 + * @return 宿舍房间信息列表 + */ + @Override + public List queryList(XgDormRoomBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormRoomBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/glysqgx/XgDormManagerSourceMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/glysqgx/XgDormManagerSourceMapper.xml new file mode 100644 index 00000000..a210a4a7 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/glysqgx/XgDormManagerSourceMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/glysslqxgx/XgDormManagerBuildingMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/glysslqxgx/XgDormManagerBuildingMapper.xml new file mode 100644 index 00000000..ff467a03 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/glysslqxgx/XgDormManagerBuildingMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/ssglyxx/XgDormManagerMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/ssglyxx/XgDormManagerMapper.xml new file mode 100644 index 00000000..9e90d3fc --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/ssglyxx/XgDormManagerMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/sslxx/XgDormBuildingMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/sslxx/XgDormBuildingMapper.xml new file mode 100644 index 00000000..bf1af83e --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/sslxx/XgDormBuildingMapper.xml @@ -0,0 +1,52 @@ + + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/ssqxx/XgDormAreaMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/ssqxx/XgDormAreaMapper.xml new file mode 100644 index 00000000..78830e11 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/ssqxx/XgDormAreaMapper.xml @@ -0,0 +1,37 @@ + + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgDormBuildingTreeMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgDormBuildingTreeMapper.xml new file mode 100644 index 00000000..7076d5cb --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgDormBuildingTreeMapper.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xgss/XgDormRoomMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xgss/XgDormRoomMapper.xml new file mode 100644 index 00000000..7d726383 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xgss/XgDormRoomMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xqxx/XgDormCampusMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xqxx/XgDormCampusMapper.xml new file mode 100644 index 00000000..0294dd86 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xqxx/XgDormCampusMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/backend/script/sql/xg_dorm_manager.sql b/backend/script/sql/xg_dorm_manager.sql new file mode 100644 index 00000000..a8f35995 --- /dev/null +++ b/backend/script/sql/xg_dorm_manager.sql @@ -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'); diff --git a/docs/业务模块/学工管理-宿舍管理/数据库设计/宿舍管理数据库设计.md b/docs/业务模块/学工管理-宿舍管理/数据库设计/宿舍管理数据库设计.md index 0b51e1cd..fae3231f 100644 --- a/docs/业务模块/学工管理-宿舍管理/数据库设计/宿舍管理数据库设计.md +++ b/docs/业务模块/学工管理-宿舍管理/数据库设计/宿舍管理数据库设计.md @@ -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 (使用记录) -``` ## 📊 索引设计 diff --git a/docs/变更管理/code-adjust-record-2025-07-03-cursor.md b/docs/变更管理/code-adjust-record-2025-07-03-cursor.md new file mode 100644 index 00000000..8d3f78ba --- /dev/null +++ b/docs/变更管理/code-adjust-record-2025-07-03-cursor.md @@ -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的文档 \ No newline at end of file diff --git a/docs/变更管理/code-adjust-record-2025-07-20-zlwu.md b/docs/变更管理/code-adjust-record-2025-07-20-zlwu.md new file mode 100644 index 00000000..a5f7331d --- /dev/null +++ b/docs/变更管理/code-adjust-record-2025-07-20-zlwu.md @@ -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` + +3. 修改`ScopeDialog.vue`组件: + - 为宿舍楼类型(type="building")添加独立的树形选择器 + - 移除原有的模拟数据,改用API获取真实数据 + - 添加宿舍楼数据回显和解析逻辑 + - 保留对校区和宿舍区的原有支持 + +## 技术实现 + +树形结构数据构建采用三步查询 + 组装的方式: +1. 首先查询所有校区数据 +2. 查询所有宿舍区数据 +3. 查询所有宿舍楼数据 +4. 通过Stream API过滤和关联数据,构建多层嵌套结构 + +## 使用说明 + +1. 校区管理员授权时,使用普通多选下拉框 +2. 宿舍区管理员授权时,使用以校区为父节点的两级树形结构 +3. 宿舍楼管理员授权时,使用新开发的三级树形结构(校区-宿舍区-宿舍楼) + - 校区和宿舍区节点自动禁用,不可选择 + - 只有宿舍楼节点可以选择 + - 支持多选和折叠标签 \ No newline at end of file diff --git a/docs/开发文档/API/API文档总览.md b/docs/开发文档/API/API文档总览.md index ba9f54e4..8b775071 100644 --- a/docs/开发文档/API/API文档总览.md +++ b/docs/开发文档/API/API文档总览.md @@ -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 diff --git a/docs/开发文档/API/宿舍房间管理API.md b/docs/开发文档/API/宿舍房间管理API.md new file mode 100644 index 00000000..165e0684 --- /dev/null +++ b/docs/开发文档/API/宿舍房间管理API.md @@ -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: [] }; +} +``` \ No newline at end of file diff --git a/docs/开发文档/API/宿舍楼树形结构API.md b/docs/开发文档/API/宿舍楼树形结构API.md new file mode 100644 index 00000000..3a2384a1 --- /dev/null +++ b/docs/开发文档/API/宿舍楼树形结构API.md @@ -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 | 子节点列表 | +| 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([]); + +// 加载宿舍楼树形数据 +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 + +``` + +## 特殊说明 + +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 \ No newline at end of file diff --git a/docs/开发文档/API/宿舍管理员授权API.md b/docs/开发文档/API/宿舍管理员授权API.md new file mode 100644 index 00000000..828cc22a --- /dev/null +++ b/docs/开发文档/API/宿舍管理员授权API.md @@ -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字段 +- 树形数据的构建逻辑是:先查询所有校区,再查询所有宿舍区,然后根据关联关系构建树形结构 \ No newline at end of file diff --git a/docs/设计文档/database/SQL文件说明.md b/docs/设计文档/database/SQL文件说明.md index 7f5793c1..a8c29867 100644 --- a/docs/设计文档/database/SQL文件说明.md +++ b/docs/设计文档/database/SQL文件说明.md @@ -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 - 学工管理模块完全删除 **变更内容**: diff --git a/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql b/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql new file mode 100644 index 00000000..9b6f5c1a --- /dev/null +++ b/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql @@ -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='二级学院床位绑定关系表'; \ No newline at end of file diff --git a/docs/设计文档/database/学工管理-宿舍管理/菜单授权列表.sql b/docs/设计文档/database/学工管理-宿舍管理/菜单授权列表.sql new file mode 100644 index 00000000..1a36c813 --- /dev/null +++ b/docs/设计文档/database/学工管理-宿舍管理/菜单授权列表.sql @@ -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, ''); + diff --git a/web/src/api/xgss/glysqgx/dormManagerSource/index.ts b/web/src/api/xgss/glysqgx/dormManagerSource/index.ts new file mode 100644 index 00000000..f60d54f4 --- /dev/null +++ b/web/src/api/xgss/glysqgx/dormManagerSource/index.ts @@ -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 => { + return request({ + url: '/glysqgx/dormManagerSource/list', + method: 'get', + params: query + }); +}; + +/** + * 查询管理员授权关系详细 + * @param id + */ +export const getDormManagerSource = (id: string | number): AxiosPromise => { + 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) => { + return request({ + url: '/glysqgx/dormManagerSource/' + id, + method: 'delete' + }); +}; diff --git a/web/src/api/xgss/glysqgx/dormManagerSource/types.ts b/web/src/api/xgss/glysqgx/dormManagerSource/types.ts new file mode 100644 index 00000000..28012845 --- /dev/null +++ b/web/src/api/xgss/glysqgx/dormManagerSource/types.ts @@ -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; +} + + + diff --git a/web/src/api/xgss/glysslqxgx/dormManagerBuilding/index.ts b/web/src/api/xgss/glysslqxgx/dormManagerBuilding/index.ts new file mode 100644 index 00000000..aa43cb2c --- /dev/null +++ b/web/src/api/xgss/glysslqxgx/dormManagerBuilding/index.ts @@ -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 => { + return request({ + url: '/glysslqxgx/dormManagerBuilding/list', + method: 'get', + params: query + }); +}; + +/** + * 查询管理员宿舍楼权限关系详细 + * @param id + */ +export const getDormManagerBuilding = (id: string | number): AxiosPromise => { + 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) => { + return request({ + url: '/glysslqxgx/dormManagerBuilding/' + id, + method: 'delete' + }); +}; diff --git a/web/src/api/xgss/glysslqxgx/dormManagerBuilding/types.ts b/web/src/api/xgss/glysslqxgx/dormManagerBuilding/types.ts new file mode 100644 index 00000000..14fa8419 --- /dev/null +++ b/web/src/api/xgss/glysslqxgx/dormManagerBuilding/types.ts @@ -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; +} + + + diff --git a/web/src/api/xgss/ssglyxx/dormManager/index.ts b/web/src/api/xgss/ssglyxx/dormManager/index.ts new file mode 100644 index 00000000..13ab9d9f --- /dev/null +++ b/web/src/api/xgss/ssglyxx/dormManager/index.ts @@ -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 => { + return request({ + url: '/ssglyxx/dormManager/list', + method: 'get', + params: query + }); +}; + +/** + * 查询宿舍管理员信息详细 + * @param id + */ +export const getDormManager = (id: string | number): AxiosPromise => { + 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) => { + 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 + } + }); +}; diff --git a/web/src/api/xgss/ssglyxx/dormManager/types.ts b/web/src/api/xgss/ssglyxx/dormManager/types.ts new file mode 100644 index 00000000..b8ac28e1 --- /dev/null +++ b/web/src/api/xgss/ssglyxx/dormManager/types.ts @@ -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; +} + + + diff --git a/web/src/api/xgss/sslxx/dormBuilding/index.ts b/web/src/api/xgss/sslxx/dormBuilding/index.ts new file mode 100644 index 00000000..9cd662dc --- /dev/null +++ b/web/src/api/xgss/sslxx/dormBuilding/index.ts @@ -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 => { + return request({ + url: '/sslxx/dormBuilding/list', + method: 'get', + params: query + }); +}; + +/** + * 查询宿舍楼信息详细 + * @param id + */ +export const getDormBuilding = (id: string | number): AxiosPromise => { + 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) => { + return request({ + url: '/sslxx/dormBuilding/' + id, + method: 'delete' + }); +}; + +/** + * 获取校区选项列表 + */ +export const listCampusOptions = (): AxiosPromise => { + return request({ + url: '/xqxx/dormCampus/list', + method: 'get' + }); +}; + +/** + * 获取宿舍区树形数据 + * @param campusId 校区ID,如果指定则只返回该校区的宿舍区 + */ +export const listAreaTreeData = (campusId?: string | number): AxiosPromise => { + return request({ + url: '/ssqxx/dormArea/list', + method: 'get', + params: { campusId } + }); +}; + +/** + * 获取宿舍楼树形结构数据(校区-宿舍区-宿舍楼三级结构) + * 校区和宿舍区节点不可选,只有宿舍楼节点可以选择 + */ +export const getBuildingTree = (): AxiosPromise => { + return request({ + url: '/sslxx/dormBuilding/buildingTree', + method: 'get' + }); +}; diff --git a/web/src/api/xgss/sslxx/dormBuilding/types.ts b/web/src/api/xgss/sslxx/dormBuilding/types.ts new file mode 100644 index 00000000..56813eaa --- /dev/null +++ b/web/src/api/xgss/sslxx/dormBuilding/types.ts @@ -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 { +} + +export interface DormBuildingQuery { + buildingCode?: string; + buildingName?: string; + areaId?: string | number; + campusId?: string | number; + buildingType?: string; + floors?: number; + params?: Record; +} + +/** + * 宿舍楼树形结构节点 + */ +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; +} + + + diff --git a/web/src/api/xgss/ssqxx/dormArea/index.ts b/web/src/api/xgss/ssqxx/dormArea/index.ts new file mode 100644 index 00000000..0c90740b --- /dev/null +++ b/web/src/api/xgss/ssqxx/dormArea/index.ts @@ -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 => { + return request({ + url: '/ssqxx/dormArea/list', + method: 'get', + params: query + }); +}; + +/** + * 查询宿舍区信息详细 + * @param id + */ +export const getDormArea = (id: string | number): AxiosPromise => { + 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) => { + return request({ + url: '/ssqxx/dormArea/' + id, + method: 'delete' + }); +}; + +/** + * 获取宿舍区树形结构数据 + * 以校区为根节点,宿舍区为子节点的树形结构 + */ +export const getAreaTree = (): AxiosPromise => { + return request({ + url: '/ssqxx/dormArea/tree', + method: 'get' + }); +}; diff --git a/web/src/api/xgss/ssqxx/dormArea/types.ts b/web/src/api/xgss/ssqxx/dormArea/types.ts new file mode 100644 index 00000000..9fe7d817 --- /dev/null +++ b/web/src/api/xgss/ssqxx/dormArea/types.ts @@ -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[]; +} + + + diff --git a/web/src/api/xgss/xqxx/dormCampus/index.ts b/web/src/api/xgss/xqxx/dormCampus/index.ts new file mode 100644 index 00000000..4c57ab3c --- /dev/null +++ b/web/src/api/xgss/xqxx/dormCampus/index.ts @@ -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 => { + return request({ + url: '/xqxx/dormCampus/list', + method: 'get', + params: query + }); +}; + +/** + * 查询校区信息详细 + * @param id + */ +export const getDormCampus = (id: string | number): AxiosPromise => { + 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) => { + return request({ + url: '/xqxx/dormCampus/' + id, + method: 'delete' + }); +}; diff --git a/web/src/api/xgss/xqxx/dormCampus/types.ts b/web/src/api/xgss/xqxx/dormCampus/types.ts new file mode 100644 index 00000000..f3fc31e2 --- /dev/null +++ b/web/src/api/xgss/xqxx/dormCampus/types.ts @@ -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; +} + + + diff --git a/web/src/api/xgss/xsssfjgl/index.ts b/web/src/api/xgss/xsssfjgl/index.ts new file mode 100644 index 00000000..385fc371 --- /dev/null +++ b/web/src/api/xgss/xsssfjgl/index.ts @@ -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 }; +} diff --git a/web/src/api/xgss/xsssfjgl/types.ts b/web/src/api/xgss/xsssfjgl/types.ts new file mode 100644 index 00000000..4226a7a5 --- /dev/null +++ b/web/src/api/xgss/xsssfjgl/types.ts @@ -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; +} diff --git a/web/src/api/xgss/xsssgly/dormManager.ts b/web/src/api/xgss/xsssgly/dormManager.ts new file mode 100644 index 00000000..177876c2 --- /dev/null +++ b/web/src/api/xgss/xsssgly/dormManager.ts @@ -0,0 +1,53 @@ +import request from '@/utils/request'; + +// 获取教师列表(根据role_key=teacher筛选) +export function getTeacherList(name?: string, managerType?: string) { + return request({ + url: '/ssglyxx/dormManager/teachers', + method: 'get', + params: { name, managerType } + }); +} + +// 查询宿舍管理员列表 +export function listDormManager(query: any) { + return request({ + url: '/ssglyxx/dormManager/list', + method: 'get', + params: query + }); +} + +// 查询宿舍管理员详情 +export function getDormManager(id: number) { + return request({ + url: `/ssglyxx/dormManager/${id}`, + method: 'get' + }); +} + +// 新增宿舍管理员 +export function addDormManager(data: any) { + return request({ + url: '/ssglyxx/dormManager', + method: 'post', + data + }); +} + +// 修改宿舍管理员 +export function updateDormManager(data: any) { + return request({ + url: '/ssglyxx/dormManager', + method: 'put', + data + }); +} + +// 删除宿舍管理员 +export function deleteDormManager(ids: number | number[]) { + return request({ + url: `/ssglyxx/dormManager/${ids instanceof Array ? ids.join(',') : ids}`, + method: 'delete' + }); +} diff --git a/web/src/components/RightToolbar/index.vue b/web/src/components/RightToolbar/index.vue index 02a55f78..d1ed8b31 100644 --- a/web/src/components/RightToolbar/index.vue +++ b/web/src/components/RightToolbar/index.vue @@ -99,4 +99,8 @@ onMounted(() => { .show-btn { margin-left: 12px; } +.top-right-btn { + display: flex; + justify-content: flex-end; +} diff --git a/web/src/views/xgss/sslxx/dormBuilding/index.vue b/web/src/views/xgss/sslxx/dormBuilding/index.vue new file mode 100644 index 00000000..fed272de --- /dev/null +++ b/web/src/views/xgss/sslxx/dormBuilding/index.vue @@ -0,0 +1,556 @@ + + + + diff --git a/web/src/views/xgss/ssqxx/dormArea/index.vue b/web/src/views/xgss/ssqxx/dormArea/index.vue new file mode 100644 index 00000000..a5010478 --- /dev/null +++ b/web/src/views/xgss/ssqxx/dormArea/index.vue @@ -0,0 +1,392 @@ + + + + + diff --git a/web/src/views/xgss/xqxx/dormCampus/index.vue b/web/src/views/xgss/xqxx/dormCampus/index.vue new file mode 100644 index 00000000..918b0907 --- /dev/null +++ b/web/src/views/xgss/xqxx/dormCampus/index.vue @@ -0,0 +1,250 @@ + + + diff --git a/web/src/views/xgss/xsssfjgl/components/BedDialog.vue b/web/src/views/xgss/xsssfjgl/components/BedDialog.vue new file mode 100644 index 00000000..58bb5dfb --- /dev/null +++ b/web/src/views/xgss/xsssfjgl/components/BedDialog.vue @@ -0,0 +1,115 @@ + + + diff --git a/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue b/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue new file mode 100644 index 00000000..9cfc9e39 --- /dev/null +++ b/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue @@ -0,0 +1,165 @@ + + + diff --git a/web/src/views/xgss/xsssfjgl/index.vue b/web/src/views/xgss/xsssfjgl/index.vue new file mode 100644 index 00000000..bed5bab2 --- /dev/null +++ b/web/src/views/xgss/xsssfjgl/index.vue @@ -0,0 +1,501 @@ + + + + + diff --git a/web/src/views/xgss/xsssgly/components/AdminDialog.vue b/web/src/views/xgss/xsssgly/components/AdminDialog.vue new file mode 100644 index 00000000..506f1675 --- /dev/null +++ b/web/src/views/xgss/xsssgly/components/AdminDialog.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/web/src/views/xgss/xsssgly/components/AdminTable.vue b/web/src/views/xgss/xsssgly/components/AdminTable.vue new file mode 100644 index 00000000..b4e2d8f5 --- /dev/null +++ b/web/src/views/xgss/xsssgly/components/AdminTable.vue @@ -0,0 +1,21 @@ + + diff --git a/web/src/views/xgss/xsssgly/components/ScopeDialog.vue b/web/src/views/xgss/xsssgly/components/ScopeDialog.vue new file mode 100644 index 00000000..5b27dc2d --- /dev/null +++ b/web/src/views/xgss/xsssgly/components/ScopeDialog.vue @@ -0,0 +1,440 @@ + + + + + diff --git a/web/src/views/xgss/xsssgly/index.vue b/web/src/views/xgss/xsssgly/index.vue new file mode 100644 index 00000000..f356b3d7 --- /dev/null +++ b/web/src/views/xgss/xsssgly/index.vue @@ -0,0 +1,519 @@ + + + + + diff --git a/工程本地启动指导.md b/工程本地启动指导.md index f1d095d9..1c02d679 100644 --- a/工程本地启动指导.md +++ b/工程本地启动指导.md @@ -232,7 +232,7 @@ cd backend #### 3. 启动主应用服务 ```bash -./hot-start.sh +./start-main.sh ``` **等待提示**: 看到 "主应用启动成功" 或访问 `http://localhost:8080` 正常返回 @@ -255,7 +255,7 @@ cd backend cd backend bash start-monitor.sh bash start-job.sh -bash hot-start.sh +bash start-main.sh # 或者直接运行 Java 命令 java -jar ruoyi-extend/ruoyi-monitor-admin/target/ruoyi-monitor-admin.jar