This commit is contained in:
zjf committed 2025-05-21 17:05:33 +08:00
1 parent 6814d5aaaf
commit 33660e460a
5 files changed
+318 -3

No files matched your search

@@ -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;
}
@@ -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<MeetingRoomEquipmentEntity> meetingRoomEquipmentEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
meetingRoomEquipmentEntityLambdaQueryWrapper.in(MeetingRoomEquipmentEntity::getRoomId, ids);
meetingRoomEquipmentService.remove(meetingRoomEquipmentEntityLambdaQueryWrapper);
return R.ok(b);
}
@@ -132,4 +140,18 @@ public class MeetingRoomController {
public List<MeetingRoomEntity> export(MeetingRoomEntity meetingRoom,Long[] ids) {
return meetingRoomService.list(Wrappers.lambdaQuery(meetingRoom).in(ArrayUtil.isNotEmpty(ids), MeetingRoomEntity::getId, ids));
}
/**---------------------------APP------------------------------*/
@GetMapping("/app/list")
public R<Page<MeetingRoomPageVo>> appList(@ParameterObject Page page, @ParameterObject MeetingRoomEntity meetingRoom) {
LambdaQueryWrapper<MeetingRoomEntity> meetingRoomEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
meetingRoomEntityLambdaQueryWrapper.eq(MeetingRoomEntity::getStatus, YesNoEnum.YES.getCode());
meetingRoomEntityLambdaQueryWrapper.orderByDesc(MeetingRoomEntity::getSort).orderByDesc(MeetingRoomEntity::getId);
Page<MeetingRoomPageVo> pageData = meetingRoomService.MeetingRoomPageScope(page, meetingRoomEntityLambdaQueryWrapper);
return R.ok(pageData);
}
}
@@ -88,4 +88,10 @@ public class MeetingRoomEquipmentEntity extends Model<MeetingRoomEquipmentEntity
*/
@Schema(description="租户编号")
private Long tenantId;
@TableField(exist = false)
@Schema(description="设备名称")
private String equipmentName;
}
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.integrated.entity.MeetingRoomEntity;
import com.bsd.pjcloud.integrated.vo.meeting.app.MeetingRoomPageVo;
public interface MeetingRoomService extends IService<MeetingRoomEntity> {
@@ -15,4 +16,23 @@ public interface MeetingRoomService extends IService<MeetingRoomEntity> {
* @return
*/
Object pageScope(Page page, LambdaQueryWrapper<MeetingRoomEntity> wrapper);
/**
* 详情
* @param id
* @return
*/
Object getDetialById(Long id);
/**
* 编辑
* @param meetingRoom
* @return
*/
Object updateMeetingRoom(MeetingRoomEntity meetingRoom);
Page<MeetingRoomPageVo> MeetingRoomPageScope(Page page, LambdaQueryWrapper<MeetingRoomEntity> meetingRoomEntityLambdaQueryWrapper);
}
@@ -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<MeetingRoomMapper, MeetingRoomEntity> implements MeetingRoomService {
private final MeetingRoomEquipmentMapper meetingRoomEquipmentMapper;
private final MeetingEquipmentMapper meetingEquipmentMapper;
@Override
public Object pageScope(Page page, LambdaQueryWrapper<MeetingRoomEntity> wrapper) {
return baseMapper.selectPageByScope(page, wrapper, DataScope.of());
}
@Override
public Object getDetialById(Long id) {
MeetingRoomEntity meetingRoomEntity = baseMapper.selectById(id);
LambdaQueryWrapper<MeetingRoomEquipmentEntity> meetingRoomEquipmentEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
meetingRoomEquipmentEntityLambdaQueryWrapper.eq(MeetingRoomEquipmentEntity::getRoomId, id);
List<MeetingRoomEquipmentEntity> meetingRoomEquipmentEntities = meetingRoomEquipmentMapper.selectList(meetingRoomEquipmentEntityLambdaQueryWrapper);
if (!CollectionUtils.isEmpty(meetingRoomEquipmentEntities)){
List<Long> equipmentIds = meetingRoomEquipmentEntities.stream().map(meetingRoomEquipmentEntity -> meetingRoomEquipmentEntity.getEquipId()).collect(Collectors.toList());
List<MeetingEquipmentEntity> meetingEquipmentEntities = meetingEquipmentMapper.selectByIds(equipmentIds);
// 1. 转换为ID为key的Map
Map<Long, MeetingEquipmentEntity> 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<MeetingRoomEquipmentEntity> newEquipments = meetingRoom.getEquipmentList();
// 2.1 查询现有设备关联(包含主键id)
LambdaQueryWrapper<MeetingRoomEquipmentEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MeetingRoomEquipmentEntity::getRoomId, roomId);
List<MeetingRoomEquipmentEntity> existingEquipments = meetingRoomEquipmentMapper.selectList(queryWrapper);
// 2.2 构建新旧设备ID映射(包含主键用于更新)
Map<Long, MeetingRoomEquipmentEntity> existingMap = existingEquipments.stream()
.collect(Collectors.toMap(MeetingRoomEquipmentEntity::getEquipId, e -> e));
Map<Long, MeetingRoomEquipmentEntity> newMap = newEquipments.stream()
.collect(Collectors.toMap(MeetingRoomEquipmentEntity::getEquipId, e -> e));
// 2.3 需要删除的设备(存在旧列表但不存在新列表)
List<Long> toRemoveIds = existingEquipments.stream()
.filter(e -> !newMap.containsKey(e.getEquipId()))
.map(MeetingRoomEquipmentEntity::getEquipId)
.collect(Collectors.toList());
// 2.4 需要新增的设备(存在新列表但不存在旧列表)
List<MeetingRoomEquipmentEntity> toAdd = newEquipments.stream()
.filter(e -> !existingMap.containsKey(e.getEquipId()))
.collect(Collectors.toList());
// 2.5 需要更新的设备(同时存在于新旧列表)
List<MeetingRoomEquipmentEntity> 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<MeetingRoomEquipmentEntity> 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<MeetingRoomPageVo> MeetingRoomPageScope(Page page, LambdaQueryWrapper<MeetingRoomEntity> meetingRoomEntityLambdaQueryWrapper) {
// 1. 执行原始分页查询
Page<MeetingRoomEntity> entityPage = baseMapper.selectPage(page, meetingRoomEntityLambdaQueryWrapper);
// 2. 转换为VO分页对象(保留分页信息)
Page<MeetingRoomPageVo> voPage = new Page<>();
BeanUtils.copyProperties(entityPage, voPage, "records"); // 复制分页参数
// 3. 处理设备关联数据(批量查询优化)
List<Long> roomIds = entityPage.getRecords().stream()
.map(MeetingRoomEntity::getId)
.collect(Collectors.toList());
// 3.1 批量查询设备关联信息
// Map<Long, List<MeetingRoomEquipmentEntity>> equipmentMap = getRoomEquipmentMap(roomIds);
// 4. 转换记录列表
List<MeetingRoomPageVo> voRecords = entityPage.getRecords().stream().map(entity -> {
MeetingRoomPageVo vo = new MeetingRoomPageVo();
// 4.1 基础字段拷贝
BeanUtils.copyProperties(entity, vo);
// 4.2 设置设备信息
// List<MeetingRoomEquipmentEntity> 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<Long, List<MeetingRoomEquipmentEntity>> getRoomEquipmentMap(List<Long> roomIds) {
if (CollectionUtils.isEmpty(roomIds)) {
return Collections.emptyMap();
}
// 1. 查询设备关联记录
LambdaQueryWrapper<MeetingRoomEquipmentEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(MeetingRoomEquipmentEntity::getRoomId, roomIds);
List<MeetingRoomEquipmentEntity> equipmentList = meetingRoomEquipmentMapper.selectList(queryWrapper);
// 2. 查询设备详细信息
List<Long> equipIds = equipmentList.stream()
.map(MeetingRoomEquipmentEntity::getEquipId)
.distinct()
.collect(Collectors.toList());
Map<Long, MeetingEquipmentEntity> 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));
}
}