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/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/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/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/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/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/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/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/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql b/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql index 48caf867..9b6f5c1a 100644 --- a/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql +++ b/docs/设计文档/database/学工管理-宿舍管理/宿舍管理数据库建表脚本.sql @@ -80,10 +80,10 @@ create table `xg_dorm_room` ( `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教师宿舍)', + `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已报废)', + `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 '创建者', diff --git a/web/src/api/xgss/xsssfjgl/types.ts b/web/src/api/xgss/xsssfjgl/types.ts index d36f734a..4226a7a5 100644 --- a/web/src/api/xgss/xsssfjgl/types.ts +++ b/web/src/api/xgss/xsssfjgl/types.ts @@ -25,11 +25,13 @@ export interface DormTreeNode { // 房间信息 export interface RoomInfo extends BaseEntity { roomId: string | number; + roomCode: string; roomName: string; - floorNumber: number; + floorNum: number; buildingId: string | number; capacity: number; used: number; + roomArea: number; roomType: string; status: string; // 0-正常 1-维修中 2-停用 remark: string; @@ -50,17 +52,19 @@ export interface BedInfo extends BaseEntity { export interface DormQuery extends PageQuery { buildingId?: string | number; roomName?: string; - floorNumber?: number; + floorNum?: number; status?: string; } // 房间表单 export interface RoomForm { roomId?: string | number; + roomCode: string; roomName: string; - floorNumber: number; + floorNum: number; buildingId: string | number; capacity: number; + roomArea: number; roomType: string; status: string; remark?: string; diff --git a/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue b/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue index 544d457f..9cfc9e39 100644 --- a/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue +++ b/web/src/views/xgss/xsssfjgl/components/RoomDialog.vue @@ -1,24 +1,34 @@