diff --git a/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/meeting/app/MeetingRoomPageVo.java b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/meeting/app/MeetingRoomPageVo.java new file mode 100644 index 000000000..702b3cd56 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/meeting/app/MeetingRoomPageVo.java @@ -0,0 +1,73 @@ +package com.bsd.pjcloud.integrated.vo.meeting.app; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class MeetingRoomPageVo { + + + /** + * id + */ + @Schema(description="id") + private Long id; + + /** + * 会议室名称 + */ + @Schema(description="会议室名称") + private String roomName; + + /** + * 图片 + */ + @Schema(description="图片") + private String picUrl; + + + /** + * 描述 + */ + @Schema(description="描述") + private String description; + + /** + * 状态(0=维护中 1=可用) + */ + @Schema(description="状态(0=维护中 1=可用)") + private String status; + + + /** + * 默认管理员 + */ + @Schema(description="默认管理员") + private Long adminId; + + /** + * 位置 + */ + @Schema(description="位置") + private String location; + + /** + * 容纳人数 + */ + @Schema(description="容纳人数") + private Integer capacity; + + /** + * 可用时间段 + */ + @Schema(description="可用时间段") + private String availableTime; + + + + +} diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/MeetingRoomController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/MeetingRoomController.java index 5d7d3186d..edbcd8624 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/MeetingRoomController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/MeetingRoomController.java @@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -12,6 +13,7 @@ import com.bsd.pjcloud.integrated.entity.MeetingRoomEntity; import com.bsd.pjcloud.integrated.entity.MeetingRoomEquipmentEntity; import com.bsd.pjcloud.integrated.service.MeetingRoomEquipmentService; import com.bsd.pjcloud.integrated.service.MeetingRoomService; +import com.bsd.pjcloud.integrated.vo.meeting.app.MeetingRoomPageVo; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -67,7 +69,7 @@ public class MeetingRoomController { @GetMapping("/{id}" ) @PreAuthorize("@pms.hasPermission('integrated_meetingRoom_view')" ) public R getById(@PathVariable("id" ) Long id) { - return R.ok(meetingRoomService.getById(id)); + return R.ok(meetingRoomService.getDetialById(id)); } /** @@ -103,7 +105,7 @@ public class MeetingRoomController { @PutMapping @PreAuthorize("@pms.hasPermission('integrated_meetingRoom_edit')" ) public R updateById(@RequestBody MeetingRoomEntity meetingRoom) { - return R.ok(meetingRoomService.updateById(meetingRoom)); + return R.ok(meetingRoomService.updateMeetingRoom(meetingRoom)); } /** @@ -115,8 +117,14 @@ public class MeetingRoomController { @SysLog("通过id删除会议室信息表" ) @DeleteMapping @PreAuthorize("@pms.hasPermission('integrated_meetingRoom_del')" ) + @Transactional public R removeById(@RequestBody Long[] ids) { - return R.ok(meetingRoomService.removeBatchByIds(CollUtil.toList(ids))); + boolean b = meetingRoomService.removeBatchByIds(CollUtil.toList(ids)); + + LambdaQueryWrapper meetingRoomEquipmentEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + meetingRoomEquipmentEntityLambdaQueryWrapper.in(MeetingRoomEquipmentEntity::getRoomId, ids); + meetingRoomEquipmentService.remove(meetingRoomEquipmentEntityLambdaQueryWrapper); + return R.ok(b); } @@ -132,4 +140,18 @@ public class MeetingRoomController { public List export(MeetingRoomEntity meetingRoom,Long[] ids) { return meetingRoomService.list(Wrappers.lambdaQuery(meetingRoom).in(ArrayUtil.isNotEmpty(ids), MeetingRoomEntity::getId, ids)); } + + + /**---------------------------APP------------------------------*/ + @GetMapping("/app/list") + public R> appList(@ParameterObject Page page, @ParameterObject MeetingRoomEntity meetingRoom) { + LambdaQueryWrapper meetingRoomEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + meetingRoomEntityLambdaQueryWrapper.eq(MeetingRoomEntity::getStatus, YesNoEnum.YES.getCode()); + meetingRoomEntityLambdaQueryWrapper.orderByDesc(MeetingRoomEntity::getSort).orderByDesc(MeetingRoomEntity::getId); + + Page pageData = meetingRoomService.MeetingRoomPageScope(page, meetingRoomEntityLambdaQueryWrapper); + + + return R.ok(pageData); + } } \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/MeetingRoomEquipmentEntity.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/MeetingRoomEquipmentEntity.java index ed648e0bd..3ef964314 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/MeetingRoomEquipmentEntity.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/MeetingRoomEquipmentEntity.java @@ -88,4 +88,10 @@ public class MeetingRoomEquipmentEntity extends Model { @@ -15,4 +16,23 @@ public interface MeetingRoomService extends IService { * @return */ Object pageScope(Page page, LambdaQueryWrapper wrapper); + + + /** + * 详情 + * @param id + * @return + */ + Object getDetialById(Long id); + + + /** + * 编辑 + * @param meetingRoom + * @return + */ + Object updateMeetingRoom(MeetingRoomEntity meetingRoom); + + + Page MeetingRoomPageScope(Page page, LambdaQueryWrapper meetingRoomEntityLambdaQueryWrapper); } \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/MeetingRoomServiceImpl.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/MeetingRoomServiceImpl.java index 379a913dc..726d98b9d 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/MeetingRoomServiceImpl.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/MeetingRoomServiceImpl.java @@ -4,10 +4,26 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.integrated.entity.MeetingEquipmentEntity; import com.bsd.pjcloud.integrated.entity.MeetingRoomEntity; +import com.bsd.pjcloud.integrated.entity.MeetingRoomEquipmentEntity; +import com.bsd.pjcloud.integrated.mapper.MeetingEquipmentMapper; +import com.bsd.pjcloud.integrated.mapper.MeetingRoomEquipmentMapper; import com.bsd.pjcloud.integrated.mapper.MeetingRoomMapper; import com.bsd.pjcloud.integrated.service.MeetingRoomService; +import com.bsd.pjcloud.integrated.vo.meeting.app.MeetingRoomPageVo; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + /** * 会议室信息表 * @@ -15,9 +31,187 @@ import org.springframework.stereotype.Service; * @date 2025-03-24 16:00:41 */ @Service +@AllArgsConstructor public class MeetingRoomServiceImpl extends ServiceImpl implements MeetingRoomService { + + private final MeetingRoomEquipmentMapper meetingRoomEquipmentMapper; + private final MeetingEquipmentMapper meetingEquipmentMapper; + @Override public Object pageScope(Page page, LambdaQueryWrapper wrapper) { return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); } + + @Override + public Object getDetialById(Long id) { + MeetingRoomEntity meetingRoomEntity = baseMapper.selectById(id); + + LambdaQueryWrapper meetingRoomEquipmentEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + meetingRoomEquipmentEntityLambdaQueryWrapper.eq(MeetingRoomEquipmentEntity::getRoomId, id); + List meetingRoomEquipmentEntities = meetingRoomEquipmentMapper.selectList(meetingRoomEquipmentEntityLambdaQueryWrapper); + if (!CollectionUtils.isEmpty(meetingRoomEquipmentEntities)){ + List equipmentIds = meetingRoomEquipmentEntities.stream().map(meetingRoomEquipmentEntity -> meetingRoomEquipmentEntity.getEquipId()).collect(Collectors.toList()); + List meetingEquipmentEntities = meetingEquipmentMapper.selectByIds(equipmentIds); + // 1. 转换为ID为key的Map + Map equipmentMap = meetingEquipmentEntities.stream() + .collect(Collectors.toMap( + MeetingEquipmentEntity::getId, + equipment -> equipment, + (existing, replacement) -> existing)); + // 2. 循环设置关联设备对象 + meetingRoomEquipmentEntities.forEach(roomEquip -> { + MeetingEquipmentEntity equipment = equipmentMap.get(roomEquip.getEquipId()); + if (equipment != null) { + roomEquip.setEquipmentName(equipment.getName()); // 设置关联的设备对象 + } + }); + } + meetingRoomEntity.setEquipmentList(meetingRoomEquipmentEntities); + return meetingRoomEntity; + } + + @Override + @Transactional + public Object updateMeetingRoom(MeetingRoomEntity meetingRoom) { + // 1. 更新会议室基本信息 + baseMapper.updateById(meetingRoom); + + // 2. 处理设备关联变更 + Long roomId = meetingRoom.getId(); + List newEquipments = meetingRoom.getEquipmentList(); + + // 2.1 查询现有设备关联(包含主键id) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MeetingRoomEquipmentEntity::getRoomId, roomId); + List existingEquipments = meetingRoomEquipmentMapper.selectList(queryWrapper); + + // 2.2 构建新旧设备ID映射(包含主键用于更新) + Map existingMap = existingEquipments.stream() + .collect(Collectors.toMap(MeetingRoomEquipmentEntity::getEquipId, e -> e)); + + Map newMap = newEquipments.stream() + .collect(Collectors.toMap(MeetingRoomEquipmentEntity::getEquipId, e -> e)); + + // 2.3 需要删除的设备(存在旧列表但不存在新列表) + List toRemoveIds = existingEquipments.stream() + .filter(e -> !newMap.containsKey(e.getEquipId())) + .map(MeetingRoomEquipmentEntity::getEquipId) + .collect(Collectors.toList()); + + // 2.4 需要新增的设备(存在新列表但不存在旧列表) + List toAdd = newEquipments.stream() + .filter(e -> !existingMap.containsKey(e.getEquipId())) + .collect(Collectors.toList()); + + // 2.5 需要更新的设备(同时存在于新旧列表) + List toUpdate = newEquipments.stream() + .filter(e -> existingMap.containsKey(e.getEquipId())) + .map(e -> { + // 继承原有主键ID + MeetingRoomEquipmentEntity existing = existingMap.get(e.getEquipId()); + e.setId(existing.getId()); + return e; + }) + .collect(Collectors.toList()); + + // 3. 执行数据库操作 + if (!toRemoveIds.isEmpty()) { + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(MeetingRoomEquipmentEntity::getRoomId, roomId) + .in(MeetingRoomEquipmentEntity::getEquipId, toRemoveIds); + meetingRoomEquipmentMapper.delete(deleteWrapper); + } + + if (!toAdd.isEmpty()) { + toAdd.forEach(equip -> { + equip.setRoomId(roomId); + equip.setTenantId(meetingRoom.getTenantId()); + meetingRoomEquipmentMapper.insert(equip); // 新增操作 + }); + } + + if (!toUpdate.isEmpty()) { + toUpdate.forEach(equip -> { + equip.setRoomId(roomId); + equip.setTenantId(meetingRoom.getTenantId()); + meetingRoomEquipmentMapper.updateById(equip); // 更新操作 + }); + } + + return meetingRoom; + } + + @Override + public Page MeetingRoomPageScope(Page page, LambdaQueryWrapper meetingRoomEntityLambdaQueryWrapper) { + + // 1. 执行原始分页查询 + Page entityPage = baseMapper.selectPage(page, meetingRoomEntityLambdaQueryWrapper); + + // 2. 转换为VO分页对象(保留分页信息) + Page voPage = new Page<>(); + BeanUtils.copyProperties(entityPage, voPage, "records"); // 复制分页参数 + + // 3. 处理设备关联数据(批量查询优化) + List roomIds = entityPage.getRecords().stream() + .map(MeetingRoomEntity::getId) + .collect(Collectors.toList()); + + // 3.1 批量查询设备关联信息 +// Map> equipmentMap = getRoomEquipmentMap(roomIds); + + // 4. 转换记录列表 + List voRecords = entityPage.getRecords().stream().map(entity -> { + MeetingRoomPageVo vo = new MeetingRoomPageVo(); + // 4.1 基础字段拷贝 + BeanUtils.copyProperties(entity, vo); + + // 4.2 设置设备信息 +// List equipments = equipmentMap.get(entity.getId()); +// if (!CollectionUtils.isEmpty(equipments)) { +// vo.setEquipmentNames(equipments.stream() +// .map(MeetingRoomEquipmentEntity::getEquipmentName) +// .collect(Collectors.toList())); +// } + + return vo; + }).collect(Collectors.toList()); + + voPage.setRecords(voRecords); + return voPage; + } + /** + * 批量获取会议室设备关联信息 + */ + private Map> getRoomEquipmentMap(List roomIds) { + if (CollectionUtils.isEmpty(roomIds)) { + return Collections.emptyMap(); + } + + // 1. 查询设备关联记录 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(MeetingRoomEquipmentEntity::getRoomId, roomIds); + List equipmentList = meetingRoomEquipmentMapper.selectList(queryWrapper); + + // 2. 查询设备详细信息 + List equipIds = equipmentList.stream() + .map(MeetingRoomEquipmentEntity::getEquipId) + .distinct() + .collect(Collectors.toList()); + + Map equipmentInfoMap = meetingEquipmentMapper.selectBatchIds(equipIds) + .stream() + .collect(Collectors.toMap(MeetingEquipmentEntity::getId, e -> e)); + + // 3. 填充设备名称 + equipmentList.forEach(equip -> { + MeetingEquipmentEntity info = equipmentInfoMap.get(equip.getEquipId()); + if (info != null) { + equip.setEquipmentName(info.getName()); + } + }); + + // 4. 按会议室ID分组 + return equipmentList.stream() + .collect(Collectors.groupingBy(MeetingRoomEquipmentEntity::getRoomId)); + } } \ No newline at end of file