package com.doumee.service.business.impl; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.baomidou.mybatisplus.core.metadata.IPage; 
 | 
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 
 | 
import com.doumee.biz.system.SystemDictDataBiz; 
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.model.LoginUserInfo; 
 | 
import com.doumee.core.model.PageData; 
 | 
import com.doumee.core.model.PageWrap; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.core.utils.DESUtil; 
 | 
import com.doumee.core.utils.DateUtil; 
 | 
import com.doumee.core.utils.Utils; 
 | 
import com.doumee.core.wx.MeetConstants; 
 | 
import com.doumee.core.wx.SendWxMessage; 
 | 
import com.doumee.dao.admin.request.QrOpenDoorDto; 
 | 
import com.doumee.dao.admin.response.DevWgResponseParam; 
 | 
import com.doumee.dao.business.*; 
 | 
import com.doumee.dao.business.join.*; 
 | 
import com.doumee.dao.business.model.*; 
 | 
import com.doumee.dao.business.vo.RoomStatisticsVo; 
 | 
import com.doumee.dao.system.MultifileMapper; 
 | 
import com.doumee.dao.system.SystemUserMapper; 
 | 
import com.doumee.dao.system.dto.UserStatisticsDTO; 
 | 
import com.doumee.dao.system.join.NoticesJoinMapper; 
 | 
import com.doumee.dao.system.model.*; 
 | 
import com.doumee.dao.system.vo.UserResponse; 
 | 
import com.doumee.dao.system.vo.UserStatisticsVo; 
 | 
import com.doumee.dao.web.request.BookingsRequest; 
 | 
import com.doumee.dao.web.request.MeetingPageRequest; 
 | 
import com.doumee.dao.web.request.UserPageRequest; 
 | 
import com.doumee.dao.web.response.*; 
 | 
import com.doumee.service.business.BookingsService; 
 | 
import com.doumee.service.business.DevicesService; 
 | 
import com.doumee.service.business.ProjectsService; 
 | 
import com.doumee.service.system.SystemUserService; 
 | 
import com.github.yulichang.wrapper.MPJLambdaWrapper; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.shiro.SecurityUtils; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.scheduling.annotation.Async; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.util.CollectionUtils; 
 | 
  
 | 
import java.awt.print.Book; 
 | 
import java.text.SimpleDateFormat; 
 | 
import java.time.LocalDate; 
 | 
import java.time.LocalDateTime; 
 | 
import java.time.format.DateTimeFormatter; 
 | 
import java.time.temporal.TemporalAdjusters; 
 | 
import java.util.*; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 会议室预定信息表Service实现 
 | 
 * 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2023/05/04 18:18 
 | 
 */ 
 | 
@Service 
 | 
public class BookingsServiceImpl implements BookingsService { 
 | 
  
 | 
    @Value("${des_pwd}") 
 | 
    private String desPwd; 
 | 
    @Autowired 
 | 
    private BookingsMapper bookingsMapper; 
 | 
    @Autowired 
 | 
    private SystemUserMapper systemUserMapper; 
 | 
    @Autowired 
 | 
    private RoomRecordMapper roomRecordMapper; 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private BookingsJoinMapper bookingsJoinMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private RoomsMapper roomsMapper; 
 | 
    @Autowired 
 | 
    private ProjectRelJoinMapper projectRelJoinMapper; 
 | 
    @Autowired 
 | 
    private UserRelJoinMapper userRelJoinMapper; 
 | 
    @Autowired 
 | 
    private BookingTimeJoinMapper bookingTimeJoinMapper; 
 | 
    @Autowired 
 | 
    private RoomTimeJoinMapper roomTimeJoinMapper; 
 | 
    @Autowired 
 | 
    private MultifileJoinMapper multifileJoinMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
  
 | 
    @Autowired 
 | 
    private SystemUserService systemUserService; 
 | 
    @Autowired 
 | 
    private DevicesService devicesService; 
 | 
  
 | 
    @Autowired 
 | 
    private ProjectsService projectsService; 
 | 
  
 | 
    @Autowired 
 | 
    private MultifileMapper multifileMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private NoticesJoinMapper noticesMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private UserRelMapper userRelMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private BookingTimeMapper bookingTimeMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private ProjectsMapper projectsMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private SendWxMessage sendWxMessage; 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class, Exception.class}) 
 | 
    public Integer create(Bookings bookings) { 
 | 
        LoginUserInfo user = bookings.getLoginUserInfo(); 
 | 
        isCreateParamValid(bookings, user); 
 | 
        bookings.setCreateDate(new Date()); 
 | 
        bookings.setCreator(user.getId()); 
 | 
        bookings.setIsdeleted(MeetConstants.ZERO); 
 | 
        bookings.setStatus(MeetConstants.ZERO); 
 | 
        bookingsMapper.insert(bookings); 
 | 
        //更新会议室预定时间段 
 | 
        updateBookingTimes(bookings, user); 
 | 
        //添加管理人员 
 | 
        updateManager(bookings, user); 
 | 
        //添加管服务项目 
 | 
        updateProjectRel(bookings, user); 
 | 
        handleFile(bookings, user); 
 | 
        //发送会议预约成功通知 
 | 
        this.sendNotice(bookings, MeetConstants.TWO); 
 | 
        //发送微信订阅通知 
 | 
        sendWxMessage.bookingsReservation(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId())); 
 | 
  
 | 
        return bookings.getId(); 
 | 
    } 
 | 
  
 | 
    public void handleFile(Bookings bookings, LoginUserInfo user) { 
 | 
        QueryWrapper<Multifile> bookquery = new QueryWrapper<>(); 
 | 
        bookquery.lambda().eq(Multifile::getIsdeleted, MeetConstants.ZERO); 
 | 
        bookquery.lambda().eq(Multifile::getObjId, bookings.getId()); 
 | 
        multifileJoinMapper.delete(bookquery); 
 | 
        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(bookings.getFileList())) { 
 | 
            bookings.getFileList().stream().forEach(s -> { 
 | 
                s.setIsdeleted(MeetConstants.ZERO); 
 | 
                s.setCreateDate(new Date()); 
 | 
                s.setCreator(user.getId()); 
 | 
                s.setObjId(bookings.getId()); 
 | 
                s.setType(MeetConstants.TWO); 
 | 
                s.setObjType(MeetConstants.ZERO); 
 | 
                multifileJoinMapper.insert(s); 
 | 
            }); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    public void isCreateParamValid(Bookings bookings, LoginUserInfo user) { 
 | 
  
 | 
        if (bookings.getRoomId() == null || 
 | 
                bookings.getStartTime() == null || 
 | 
                bookings.getEndTime() == null || 
 | 
                org.apache.commons.collections4.CollectionUtils.isEmpty(bookings.getBookingTimeList()) || 
 | 
                StringUtils.isBlank(bookings.getName())/* ||*/ 
 | 
               /* StringUtils.isBlank(bookings.getContent())*/ 
 | 
            /*  ||org.apache.commons.collections4.CollectionUtils.isEmpty(bookings.getSysList())*/ 
 | 
        ) { 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), ResponseStatus.BAD_REQUEST.getMessage()); 
 | 
        } 
 | 
  
 | 
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
 | 
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); 
 | 
        String gsDate = format1.format(bookings.getStartTime()); 
 | 
        //查询当前会议预定时间段是否可用 
 | 
  
 | 
        MPJLambdaWrapper<Bookings> bookquery = new MPJLambdaWrapper<>(); 
 | 
        bookquery.selectAll(Bookings.class); 
 | 
        bookquery.selectAs(BookingTime::getTimeId, Bookings::getRoomTimeId); 
 | 
        bookquery.selectAs(BookingTime::getId, Bookings::getBookingTimeId); 
 | 
        bookquery.eq(Bookings::getIsdeleted, MeetConstants.ZERO); 
 | 
        bookquery.eq(Bookings::getRoomId, bookings.getRoomId()); 
 | 
        bookquery.eq(Bookings::getStatus, MeetConstants.ZERO); 
 | 
        //bookquery.ge(Bookings::getStartTime, bookings.getStartTime()); 
 | 
  
 | 
        bookquery.apply(" t.START_TIME like  '" + DateUtil.dateToString(bookings.getStartTime(), "yyyy-MM-dd") + "%'  "); 
 | 
        //bookquery.apply("DATE_FORMAT(t.START_TIME,'%Y-%m-%d') = DATE_FORMAT("+DateUtil.dateToString(bookings.getStartTime(),"yyyy-MM-dd")+",'%Y-%m-%d') " ); 
 | 
        bookquery.innerJoin(BookingTime.class, BookingTime::getBookingId, Bookings::getId); 
 | 
  
 | 
        List<Bookings> bookList = bookingsJoinMapper.selectJoinList(Bookings.class, bookquery); 
 | 
        for (int i = 0; i < bookings.getBookingTimeList().size(); i++) { 
 | 
            BookingTime s = bookings.getBookingTimeList().get(i); 
 | 
            if (!Objects.isNull(bookList) && bookList.size() > MeetConstants.ZERO) { 
 | 
                List<Bookings> detailDataDtoStream = 
 | 
                        bookList.stream().filter(a -> MeetConstants.equalsInteger(s.getTimeId(), a.getRoomTimeId()) 
 | 
                        ).collect(Collectors.toList()); 
 | 
  
 | 
                if (detailDataDtoStream.size() > 0) { 
 | 
                    if (bookings.getId() != null) { 
 | 
                        //编辑 
 | 
                        List<Bookings> chriList = 
 | 
                                detailDataDtoStream.stream() 
 | 
                                        .filter(a -> !MeetConstants.equalsInteger(a.getId(), bookings.getId())) 
 | 
                                        .filter(a -> MeetConstants.equalsInteger(a.getRoomTimeId(), s.getTimeId())) 
 | 
                                        .collect(Collectors.toList()); 
 | 
                        if (chriList.size() > 0) { 
 | 
                            RoomTime roomTime = roomTimeJoinMapper.selectById(s.getTimeId()); 
 | 
                            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该会议:" + roomTime.getStartTime() + "-" + roomTime.getEndTime() + "时间段内已被使用"); 
 | 
                        } 
 | 
                    } else { 
 | 
                        //插入 
 | 
                        List<Bookings> chriList = 
 | 
                                detailDataDtoStream.stream() 
 | 
                                        .filter(a -> MeetConstants.equalsInteger(a.getRoomTimeId(), s.getTimeId())) 
 | 
                                        .collect(Collectors.toList()); 
 | 
                        if (chriList.size() > 0) { 
 | 
                            RoomTime roomTime = roomTimeJoinMapper.selectById(s.getTimeId()); 
 | 
                            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "该会议:" + roomTime.getStartTime() + "-" + roomTime.getEndTime() + "时间段内已被使用"); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                } 
 | 
  
 | 
            } 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    public void updateBookingTimes(Bookings bookings, LoginUserInfo user) { 
 | 
        QueryWrapper<BookingTime> updateWrapper = new QueryWrapper<BookingTime>(); 
 | 
        updateWrapper.eq("ISDELETED", MeetConstants.ZERO); 
 | 
        updateWrapper.eq("BOOKING_ID", bookings.getId()); 
 | 
        BookingTime bookingTime = new BookingTime(); 
 | 
        bookingTime.setIsdeleted(MeetConstants.ONE); 
 | 
        bookingTimeJoinMapper.update(bookingTime, updateWrapper); 
 | 
  
 | 
  
 | 
        bookings.getBookingTimeList().stream().forEach(s -> { 
 | 
            s.setCreator(user.getId()); 
 | 
            s.setCreateDate(new Date()); 
 | 
            s.setIsdeleted(MeetConstants.ZERO); 
 | 
            s.setBookingId(bookings.getId()); 
 | 
            bookingTimeJoinMapper.insert(s); 
 | 
        }); 
 | 
  
 | 
  
 | 
    } 
 | 
  
 | 
    public void updateManager(Bookings bookings, LoginUserInfo user) { 
 | 
        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(bookings.getSysList())) { 
 | 
            QueryWrapper<UserRel> updateWrapper = new QueryWrapper<>(); 
 | 
            updateWrapper.lambda().eq(UserRel::getIsdeleted, MeetConstants.ZERO); 
 | 
            updateWrapper.lambda().eq(UserRel::getObjId, bookings.getId()); 
 | 
            updateWrapper.lambda().eq(UserRel::getObjType, MeetConstants.ONE); 
 | 
            UserRel userRel = new UserRel(); 
 | 
            userRel.setIsdeleted(MeetConstants.ONE); 
 | 
            userRelJoinMapper.update(userRel, updateWrapper); 
 | 
        } 
 | 
        bookings.getSysList().stream().forEach(s -> { 
 | 
            s.setIsdeleted(MeetConstants.ZERO); 
 | 
            s.setCreateDate(new Date()); 
 | 
            s.setCreator(user.getId()); 
 | 
            s.setUserId(s.getUserId()); 
 | 
            s.setObjId(bookings.getId()); 
 | 
            s.setObjType(MeetConstants.ONE); 
 | 
            userRelJoinMapper.insert(s); 
 | 
        }); 
 | 
  
 | 
    } 
 | 
  
 | 
    public void updateProjectRel(Bookings rooms, LoginUserInfo user) { 
 | 
        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(rooms.getProjectList())) { 
 | 
            QueryWrapper<ProjectRel> updateWrapper = new QueryWrapper<>(); 
 | 
            updateWrapper.lambda().eq(ProjectRel::getIsdeleted, MeetConstants.ZERO); 
 | 
            updateWrapper.lambda().eq(ProjectRel::getObjId, rooms.getId()); 
 | 
            updateWrapper.lambda().eq(ProjectRel::getObjType, MeetConstants.ONE); 
 | 
            ProjectRel projectRel = new ProjectRel(); 
 | 
            projectRel.setIsdeleted(MeetConstants.ONE); 
 | 
            projectRelJoinMapper.update(projectRel, updateWrapper); 
 | 
  
 | 
            rooms.getProjectList().stream().forEach(s -> { 
 | 
  
 | 
                s.setIsdeleted(MeetConstants.ZERO); 
 | 
                s.setCreateDate(new Date()); 
 | 
                s.setCreator(user.getId()); 
 | 
                s.setProjectId(s.getProjectId()); 
 | 
                s.setObjId(rooms.getId()); 
 | 
                s.setObjType(MeetConstants.ONE); 
 | 
                projectRelJoinMapper.insert(s); 
 | 
            }); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteById(Integer id,LoginUserInfo user) { 
 | 
        Bookings bookings = new Bookings(); 
 | 
        bookings.setId(id); 
 | 
        bookings.setIsdeleted(MeetConstants.ONE); 
 | 
        bookings.setEditDate(new Date()); 
 | 
        bookings.setEditor(user.getId()); 
 | 
        bookingsMapper.updateById(bookings); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void delete(Bookings bookings,LoginUserInfo user) { 
 | 
        UpdateWrapper<Bookings> deleteWrapper = new UpdateWrapper<>(bookings); 
 | 
        bookingsMapper.delete(deleteWrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteByIdInBatch(List<Integer> ids,LoginUserInfo user) { 
 | 
        if (CollectionUtils.isEmpty(ids)) { 
 | 
            return; 
 | 
        } 
 | 
        Bookings bookings = new Bookings(); 
 | 
       for(int i=0;i<ids.size();i++){ 
 | 
           Integer s=ids.get(i); 
 | 
  
 | 
           Bookings bkjs = bookingsMapper.selectById(s); 
 | 
           if (Objects.isNull(bkjs)) { 
 | 
               throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录"); 
 | 
           } 
 | 
  
 | 
           if (System.currentTimeMillis() > bkjs.getStartTime().getTime()&&System.currentTimeMillis() <= bkjs.getEndTime().getTime()) { 
 | 
               throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已开始,无法删除"); 
 | 
           } 
 | 
            bookings.setId(s); 
 | 
            bookings.setIsdeleted(MeetConstants.ONE); 
 | 
            bookings.setEditDate(new Date()); 
 | 
            bookings.setEditor(user.getId()); 
 | 
            bookingsMapper.updateById(bookings); 
 | 
        } 
 | 
        // bookingsMapper.deleteBatchIds(ids); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class, Exception.class}) 
 | 
    public void updateById(Bookings bookings) { 
 | 
        Bookings dbBookings = bookingsMapper.selectById(bookings.getId()); 
 | 
        if(dbBookings.getStatus().equals(MeetConstants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "本次操作失败,预约状态已流转"); 
 | 
        } 
 | 
        LoginUserInfo user = bookings.getLoginUserInfo(); 
 | 
        isCreateParamValid(bookings, user); 
 | 
        bookings.setEditDate(new Date()); 
 | 
        bookings.setEditor(user.getId()); 
 | 
        bookingsMapper.updateById(bookings); 
 | 
        //更新会议室预定时间段 
 | 
        updateBookingTimes(bookings, user); 
 | 
        //添加管理人员 
 | 
        updateManager(bookings, user); 
 | 
        //添加管服务项目 
 | 
        updateProjectRel(bookings, user); 
 | 
        handleFile(bookings, user); 
 | 
        //发送会议通知 
 | 
        this.sendNotice(bookings, MeetConstants.TWO); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void updateByIdInBatch(List<Bookings> bookingss) { 
 | 
        if (CollectionUtils.isEmpty(bookingss)) { 
 | 
            return; 
 | 
        } 
 | 
        for (Bookings bookings : bookingss) { 
 | 
            this.updateById(bookings); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Bookings findById(Integer id) { 
 | 
        return bookingsMapper.selectById(id); 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public void cancelById(Bookings bs) { 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(user == null){ 
 | 
            user = bs.getLoginUserInfo(); 
 | 
        } 
 | 
/* 
 | 
        if(Objects.isNull(bookings)||bookings.getId()==null){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), ResponseStatus.BAD_REQUEST.getMessage()); 
 | 
        } 
 | 
        Bookings query=bookingsJoinMapper.selectById(bookings.getId()); 
 | 
        if(Objects.isNull(query)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), ResponseStatus.DATA_EMPTY.getMessage()); 
 | 
        } 
 | 
        if(MeetConstants.equalsInteger(query.getStatus(),MeetConstants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "状态已流转,禁止操作"); 
 | 
        } 
 | 
        if (System.currentTimeMillis() > query.getStartTime().getTime()) { 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已开始,不允许取消"); 
 | 
        } 
 | 
        bookings.setCancelTime(new Date()); 
 | 
        bookings.setCancelUser(user.getId()); 
 | 
        bookings.setStatus(MeetConstants.ONE); 
 | 
  
 | 
        bookings.setEditDate(new Date()); 
 | 
        bookings.setEditor(user.getId()); 
 | 
        bookingsMapper.updateById(bookings);*/ 
 | 
  
 | 
        Bookings bookings = bookingsMapper.selectById(bs.getId()); 
 | 
        if (Objects.isNull(bookings)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录"); 
 | 
        } 
 | 
  
 | 
        if (System.currentTimeMillis() > bookings.getStartTime().getTime()) { 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已开始,无法进行取消"); 
 | 
        } 
 | 
        if(bookings.getStatus().equals(MeetConstants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "本次操作失败,预约状态已流转"); 
 | 
        } 
 | 
        bookings.setCancelTime(new Date()); 
 | 
        bookings.setCancelUser(user.getId()); 
 | 
        bookings.setStatus(MeetConstants.ONE); 
 | 
        bookings.setEditDate(new Date()); 
 | 
        bookings.setEditor(user.getId()); 
 | 
        bookingsMapper.updateById(bookings); 
 | 
        //取消会议 发送取消通知 
 | 
        this.sendNotice(bookings, 3); 
 | 
        //发送微信订阅通知 
 | 
        sendWxMessage.bookingsCancel(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId())); 
 | 
  
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Bookings findOne(Bookings bookings) { 
 | 
        QueryWrapper<Bookings> wrapper = new QueryWrapper<>(bookings); 
 | 
        return bookingsMapper.selectOne(wrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<Bookings> findList(Bookings bookings) { 
 | 
        QueryWrapper<Bookings> wrapper = new QueryWrapper<>(bookings); 
 | 
        return bookingsMapper.selectList(wrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public PageData<Bookings> findPage(PageWrap<Bookings> pageWrap) { 
 | 
        IPage<Bookings> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); 
 | 
        MPJLambdaWrapper<Bookings> queryWrapper = new MPJLambdaWrapper<>(); 
 | 
        Utils.MP.blankToNull(pageWrap.getModel()); 
 | 
  
 | 
        queryWrapper.selectAll(Bookings.class); 
 | 
        queryWrapper.selectAs(Rooms::getName, Bookings::getRoomName); 
 | 
        queryWrapper.selectAs(SystemUser::getRealname, Bookings::getRealName); 
 | 
        queryWrapper.selectAs(Company::getName, Bookings::getDepartmentName); 
 | 
  
 | 
        queryWrapper.leftJoin(Rooms.class, Rooms::getId, Bookings::getRoomId); 
 | 
        queryWrapper.leftJoin(SystemUser.class, SystemUser::getId, Bookings::getCreator); 
 | 
        queryWrapper.leftJoin(Company.class,Company::getId,SystemUser::getCompanyId); 
 | 
        queryWrapper.orderByDesc(Bookings::getCreateDate); 
 | 
        queryWrapper.eq(Bookings::getIsdeleted, MeetConstants.ZERO); 
 | 
  
 | 
        queryWrapper.eq(pageWrap.getModel().getRoomId() != null, Bookings::getRoomId, pageWrap.getModel().getRoomId()); 
 | 
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()), Bookings::getName, pageWrap.getModel().getName()); 
 | 
        queryWrapper.eq(pageWrap.getModel().getStatus() != null, Bookings::getStatus, pageWrap.getModel().getStatus()); 
 | 
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getRealName()), SystemUser::getRealname, pageWrap.getModel().getRealName()); 
 | 
        queryWrapper.eq(pageWrap.getModel().getDepartmentId() != null, SystemUser::getId, pageWrap.getModel().getDepartmentId()); 
 | 
  
 | 
        if (pageWrap.getModel().getStartTime() != null) { 
 | 
            queryWrapper.ge(Bookings::getStartTime, pageWrap.getModel().getStartTime()); 
 | 
        } 
 | 
  
 | 
        if (pageWrap.getModel().getEndTime() != null) { 
 | 
            queryWrapper.le(Bookings::getEndTime, pageWrap.getModel().getEndTime()); 
 | 
        } 
 | 
        queryWrapper.orderByDesc(Bookings::getCreateDate); 
 | 
  
 | 
        String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); 
 | 
  
 | 
        SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm"); 
 | 
        SimpleDateFormat format1 = new SimpleDateFormat("HH:mm"); 
 | 
        IPage<Bookings> result = bookingsJoinMapper.selectJoinPage(page, Bookings.class, queryWrapper); 
 | 
        result.getRecords().stream().forEach(s -> { 
 | 
            MPJLambdaWrapper<Multifile> bookquery = new MPJLambdaWrapper<>(); 
 | 
            bookquery.eq(Multifile::getIsdeleted, MeetConstants.ZERO); 
 | 
            bookquery.eq(Multifile::getObjId, s.getId()); 
 | 
            List<Multifile> filelist = multifileJoinMapper.selectList(bookquery); 
 | 
            filelist.stream().forEach(a -> { 
 | 
                if (StringUtils.isNotBlank(a.getFileurl())) { 
 | 
                    a.setFileurlFull(path + a.getFileurl()); 
 | 
                } 
 | 
            }); 
 | 
            s.setFileList(filelist); 
 | 
            if (s.getStartTime() != null && s.getEndTime() != null) { 
 | 
                s.setMeetingTime(format.format(s.getStartTime()) + "-" + format1.format(s.getEndTime())); 
 | 
            } 
 | 
            s.setManagerInfo(s.getDepartmentName() + "-" + s.getRealName()); 
 | 
  
 | 
            //参会人员列表 
 | 
            MPJLambdaWrapper<UserRel> urquery = new MPJLambdaWrapper<>(); 
 | 
            urquery.selectAll(UserRel.class); 
 | 
            urquery.eq(UserRel::getIsdeleted, MeetConstants.ZERO); 
 | 
            urquery.eq(UserRel::getObjId, s.getId()); 
 | 
            urquery.select("(select REALNAME from system_user s where t.USER_ID = s.id and s.DELETED = 0  ) as realName"); 
 | 
            List<UserRel> userrelList = userRelJoinMapper.selectJoinList(UserRel.class, urquery); 
 | 
            s.setSysList(userrelList); 
 | 
  
 | 
            //服务项 
 | 
            MPJLambdaWrapper<ProjectRel> prquery = new MPJLambdaWrapper<>(); 
 | 
            prquery.selectAll(ProjectRel.class); 
 | 
            prquery.eq(ProjectRel::getIsdeleted, MeetConstants.ZERO); 
 | 
            prquery.eq(ProjectRel::getObjId, s.getId()); 
 | 
            prquery.select("(select p.name from meeting_projects p where t.PROJECT_ID = p.id and p.ISDELETED = 0  ) as projectName"); 
 | 
            List<ProjectRel> prList = projectRelJoinMapper.selectJoinList(ProjectRel.class, prquery); 
 | 
            s.setProjectList(prList); 
 | 
  
 | 
            s.setFlag(MeetConstants.ZERO); 
 | 
            if (System.currentTimeMillis() > s.getStartTime().getTime()) { 
 | 
                s.setFlag(MeetConstants.ONE); 
 | 
            } 
 | 
  
 | 
        }); 
 | 
        return PageData.from(result); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Bookings findJoinOne(Bookings queryParam) { 
 | 
        MPJLambdaWrapper<Bookings> queryWrapper = new MPJLambdaWrapper<>(); 
 | 
        Utils.MP.blankToNull(queryParam); 
 | 
        queryWrapper.selectAll(Bookings.class); 
 | 
        queryWrapper.selectAs(Rooms::getName, Bookings::getRoomName); 
 | 
        queryWrapper.selectAs(SystemUser::getRealname, Bookings::getRealName); 
 | 
        queryWrapper.selectAs(Company::getName, Bookings::getDepartmentName); 
 | 
        queryWrapper.leftJoin(Rooms.class, Rooms::getId, Bookings::getRoomId); 
 | 
        queryWrapper.leftJoin(SystemUser.class, SystemUser::getId, Bookings::getCreator); 
 | 
        queryWrapper.leftJoin(Company.class,Company::getId,SystemUser::getCompanyId); 
 | 
        queryWrapper.eq(Bookings::getIsdeleted, MeetConstants.ZERO); 
 | 
        queryWrapper.eq(queryParam.getId() != null, Bookings::getId, queryParam.getId()); 
 | 
        queryWrapper.eq(queryParam.getRoomId() != null, Bookings::getRoomId, queryParam.getRoomId()); 
 | 
        if (queryParam.getStartTime() != null) { 
 | 
            queryWrapper.ge(Bookings::getStartTime, queryParam.getStartTime()); 
 | 
        } 
 | 
  
 | 
        if (queryParam.getEndTime() != null) { 
 | 
            queryWrapper.le(Bookings::getEndTime, queryParam.getEndTime()); 
 | 
        } 
 | 
        queryWrapper.orderByDesc(Bookings::getCreateDate); 
 | 
  
 | 
//        String path = systemDictDataBiz.queryByCode(MeetConstants.OSS, MeetConstants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.OSS, MeetConstants.PROJECTS).getCode(); 
 | 
        String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); 
 | 
        Bookings result = bookingsJoinMapper.selectOne(queryWrapper.last("limit 1")); 
 | 
  
 | 
        if (result != null) { 
 | 
            MPJLambdaWrapper<Multifile> bookquery = new MPJLambdaWrapper<>(); 
 | 
            bookquery.eq(Multifile::getIsdeleted, MeetConstants.ZERO); 
 | 
            bookquery.eq(Multifile::getObjId, result.getId()); 
 | 
            List<Multifile> filelist = multifileJoinMapper.selectList(bookquery); 
 | 
            filelist.stream().forEach(a -> { 
 | 
                if (StringUtils.isNotBlank(a.getFileurl())) { 
 | 
                    a.setFileurlFull(path + a.getFileurl()); 
 | 
                } 
 | 
            }); 
 | 
            result.setFileList(filelist); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public long count(Bookings bookings) { 
 | 
        QueryWrapper<Bookings> wrapper = new QueryWrapper<>(bookings); 
 | 
        return bookingsMapper.selectCount(wrapper); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    /** 
 | 
     * 门禁读头扫码开门 
 | 
     * 
 | 
     * @param json 
 | 
     */ 
 | 
    @Override 
 | 
    public void openRoomDoor(DevWgResponseParam json) throws Exception { 
 | 
  
 | 
        //解析获取请求参数 
 | 
        QrOpenDoorDto param = QrOpenDoorDto.getObjectFromParam(desPwd, json); 
 | 
        //查询用户数据 
 | 
        SystemUser user = systemUserMapper.selectById(param.getUserId()); 
 | 
        if (user == null || user.getDeleted()) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效用户"); 
 | 
        } 
 | 
        if (MeetConstants.equalsInteger(param.getType(), MeetConstants.ZERO)) { 
 | 
            //会议开门 
 | 
            bookOpenDoor(user, param); 
 | 
        } else if (MeetConstants.equalsInteger(param.getType(), MeetConstants.ONE)) { 
 | 
            //会议室管理员开门 
 | 
            roomManagerOpenDoor(user, param); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 管理员开门 
 | 
     * 
 | 
     * @param user 
 | 
     * @param param 
 | 
     */ 
 | 
    private void roomManagerOpenDoor(SystemUser user, QrOpenDoorDto param) { 
 | 
        Long time = param.getTimestamp(); 
 | 
        Long validTime = 0l; 
 | 
        try { 
 | 
            validTime = Long.parseLong(systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.QR_OPENROOM_VALIDTIME).getCode()); 
 | 
        } catch (Exception e) { 
 | 
        } 
 | 
        if (validTime > 0 && System.currentTimeMillis() - time > validTime * 60*1000) { 
 | 
            //如果二维码已过期,无效 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "读头扫码:该二维码已过期!"); 
 | 
        } 
 | 
        Devices devices = new Devices(); 
 | 
        devices.setIsdeleted(MeetConstants.ZERO); 
 | 
        devices.setStatus(MeetConstants.ZERO); 
 | 
        devices.setCode(param.getDeviceCode()); 
 | 
        devices = devicesService.findOne(devices); 
 | 
        if(devices == null){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效设备"); 
 | 
        } 
 | 
        if(!MeetConstants.equalsInteger(param.getObjId(),devices.getRoomId())){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效设备绑定"); 
 | 
        } 
 | 
  
 | 
        //查询会议室记录 
 | 
        Rooms rooms = roomsMapper.selectById(param.getObjId()); 
 | 
        if (rooms == null || MeetConstants.equalsInteger(rooms.getIsdeleted(), MeetConstants.ONE)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效会议室"); 
 | 
        } 
 | 
  
 | 
        UserRel rel = new UserRel(); 
 | 
        rel.setIsdeleted(MeetConstants.ZERO); 
 | 
        rel.setObjId(rooms.getId()); 
 | 
        rel.setUserId(user.getId()); 
 | 
        rel.setObjType(MeetConstants.UserRelObjType.objTypeRoom); 
 | 
        //查询是否参会人员 
 | 
        rel = userRelJoinMapper.selectOne(new QueryWrapper<>(rel).last("limit 1")); 
 | 
        if (rel == null) { 
 | 
            //非管理员 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "读头扫码:非法开门"); 
 | 
        } 
 | 
        RoomRecord record = new RoomRecord(); 
 | 
        record.setCreateDate(new Date()); 
 | 
        record.setIsdeleted(MeetConstants.ZERO); 
 | 
        record.setCreator(user.getId()); 
 | 
        record.setObjId(rooms.getId()); 
 | 
        record.setUserId(user.getId()); 
 | 
        record.setRoomId(rooms.getId()); 
 | 
        record.setObjType(MeetConstants.RoomRecordObjType.objTypeRoom); 
 | 
        //开门记录 
 | 
        roomRecordMapper.insert(record); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 会议开门 
 | 
     * 
 | 
     * @param user 
 | 
     * @param param 
 | 
     */ 
 | 
    private void bookOpenDoor(SystemUser user, QrOpenDoorDto param) { 
 | 
        //查询会议记录 
 | 
        Long time = param.getTimestamp(); 
 | 
        Long validTime = 0l; 
 | 
        try { 
 | 
            validTime = Long.parseLong(systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.QR_OPENBOOK_VALIDTIME).getCode()); 
 | 
        } catch (Exception e) { 
 | 
        } 
 | 
        if (validTime > 0 && System.currentTimeMillis() - time > validTime * 60*1000) { 
 | 
            //如果二维码已过期,无效 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "读头扫码:二维码已失效"); 
 | 
        } 
 | 
        Devices devices = new Devices(); 
 | 
        devices.setIsdeleted(MeetConstants.ZERO); 
 | 
        devices.setStatus(MeetConstants.ZERO); 
 | 
        devices.setCode(param.getDeviceCode()); 
 | 
        devices = devicesService.findOne(devices); 
 | 
        if(devices == null){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效设备"); 
 | 
        } 
 | 
        Bookings book = findById(param.getObjId()); 
 | 
        if (book == null || MeetConstants.equalsInteger(book.getIsdeleted(), MeetConstants.ONE)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效会议"); 
 | 
        } 
 | 
  
 | 
        if(!MeetConstants.equalsInteger(book.getRoomId(),devices.getRoomId())){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:无效设备绑定"); 
 | 
        } 
 | 
  
 | 
        if (!MeetConstants.equalsInteger(book.getStatus(), MeetConstants.ZERO)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:会议状态错误"); 
 | 
        } 
 | 
        if (book.getStartTime() == null || book.getEndTime() == null) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:会议时间溢出"); 
 | 
        } 
 | 
        //提前进入时间 
 | 
        Long advanceInTime = Long.parseLong(systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.ADVANCE_IN).getCode()); 
 | 
        if ((book.getStartTime().getTime() - advanceInTime * 60L * 1000L) > System.currentTimeMillis()) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:会议未开始"); 
 | 
        } 
 | 
        if (book.getEndTime().getTime() < System.currentTimeMillis()) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "读头扫码:会议已结束"); 
 | 
        } 
 | 
        RoomRecord record = new RoomRecord(); 
 | 
        record.setCreateDate(new Date()); 
 | 
        record.setIsdeleted(MeetConstants.ZERO); 
 | 
        record.setCreator(user.getId()); 
 | 
        record.setObjId(book.getId()); 
 | 
        record.setUserId(user.getId()); 
 | 
        record.setRoomId(book.getRoomId()); 
 | 
        UserRel rel = new UserRel(); 
 | 
        rel.setIsdeleted(MeetConstants.ZERO); 
 | 
        rel.setObjId(book.getId()); 
 | 
        rel.setUserId(user.getId()); 
 | 
        rel.setObjType(MeetConstants.UserRelObjType.objTypeBook); 
 | 
        //查询是否参会人员 
 | 
        rel = userRelJoinMapper.selectOne(new QueryWrapper<>(rel).last("limit 1")); 
 | 
        if (rel == null) { 
 | 
            //访客 
 | 
            record.setObjType(MeetConstants.RoomRecordObjType.objTypeBook_out); 
 | 
        } else { 
 | 
            //参会人员 
 | 
            record.setObjType(MeetConstants.RoomRecordObjType.objTypeBook_in); 
 | 
        } 
 | 
        //开门记录 
 | 
        roomRecordMapper.insert(record); 
 | 
    } 
 | 
  
 | 
  
 | 
    /****************************************移动端接口开始********************************************************************/ 
 | 
  
 | 
    /** 
 | 
     * 获取我的会议记录 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public List<Bookings> getMyBookings(Integer userId, String dateMsg) { 
 | 
        return bookingsMapper.selectList(new QueryWrapper<Bookings>() 
 | 
                .apply(" id in ( select u.OBJ_ID from meeting_user_rel u where u.USER_ID = '" + userId + "' and u.ISDELETED = 0 and OBJ_TYPE = 1  ) ") 
 | 
                .eq("ISDELETED",MeetConstants.ZERO) 
 | 
//                .eq("STATUS",MeetConstants.ZERO) 
 | 
                .apply(" ROOM_ID in ( select r.id from meeting_rooms r where r.ISDELETED = 0 and r.STATUS = 0  )") 
 | 
                .like(StringUtils.isNotBlank(dateMsg), "START_TIME", dateMsg)); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 我的预约/我的会议 
 | 
     * 
 | 
     * @param pageWrap 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public IPage<MeetingListResponse> getMyMeetingPage(PageWrap<MeetingPageRequest> pageWrap) { 
 | 
        IPage<MeetingListResponse> page = bookingsMapper.myMeetingPage(pageWrap.toPage(), new QueryWrapper<MeetingListResponse>() 
 | 
                .and(StringUtils.isNotBlank(pageWrap.getModel().getRoomsName()), 
 | 
                        j -> j.like("a.NAME",pageWrap.getModel().getRoomsName()).or() 
 | 
                                .like(" b.NAME", pageWrap.getModel().getRoomsName())) 
 | 
                        .exists(pageWrap.getModel().getQueryType().equals(MeetConstants.ONE) && !Objects.isNull(pageWrap.getModel().getUserId()), 
 | 
                                " select 1 from meeting_user_rel u where a.id = u.OBJ_ID and  u.USER_ID = '" + pageWrap.getModel().getUserId() + "' and u.ISDELETED = 0 and OBJ_TYPE = 1  ") 
 | 
                        .eq(pageWrap.getModel().getQueryType().equals(MeetConstants.TWO) && !Objects.isNull(pageWrap.getModel().getUserId()), "a.CREATOR", pageWrap.getModel().getUserId()) 
 | 
                        .like(StringUtils.isNotBlank(pageWrap.getModel().getQueryDate()), "a.START_TIME", pageWrap.getModel().getQueryDate()) 
 | 
                        .eq(!Objects.isNull(pageWrap.getModel().getRoomsId()), "b.id", pageWrap.getModel().getRoomsId()) 
 | 
                        .apply(!Objects.isNull(pageWrap.getModel().getStatus()) && pageWrap.getModel().getStatus().equals(MeetConstants.ONE), " now() < a.END_TIME and a.STATUS = 0   ") 
 | 
                        .and(!Objects.isNull(pageWrap.getModel().getStatus()) && pageWrap.getModel().getStatus().equals(MeetConstants.TWO), 
 | 
                                j -> j.apply("now() >= a.END_TIME ").or() 
 | 
                                        .eq(" a.STATUS", MeetConstants.ONE)) 
 | 
                        .eq("b.ISDELETED",MeetConstants.ZERO) 
 | 
                        .eq("b.STATUS",MeetConstants.ZERO) 
 | 
                        .eq("a.ISDELETED",MeetConstants.ZERO) 
 | 
                        .orderByDesc(!Objects.isNull(pageWrap.getModel().getStatus())&&pageWrap.getModel().getStatus().equals(MeetConstants.TWO),"a.START_TIME") 
 | 
                        .orderByAsc(Objects.isNull(pageWrap.getModel().getStatus())||pageWrap.getModel().getStatus().equals(MeetConstants.ONE),"a.START_TIME") 
 | 
        ); 
 | 
        String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); 
 | 
        page.getRecords().forEach(i -> { 
 | 
            i.setPrefixUrl(path); 
 | 
            if(i.getMeetingStatus().equals(Constants.ZERO)){ 
 | 
                if(i.getStatus()==Constants.ONE){ 
 | 
                    i.setMeetingStatus(5); 
 | 
                }else{ 
 | 
                    //开始前5分钟 大于当前时间 则显示即将开始 
 | 
                    if(DateUtil.afterMinutesDate(i.getStartTime(),-5).getTime()>System.currentTimeMillis()){ 
 | 
                        i.setMeetingStatus(4); 
 | 
                    } 
 | 
                } 
 | 
  
 | 
            } 
 | 
  
 | 
        }); 
 | 
        return page; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public MeetingDetailResponse getMeetingDetailByDate(Bookings bean){ 
 | 
        try { 
 | 
            if(Objects.isNull(bean) 
 | 
            || Objects.isNull(bean.getRoomId()) 
 | 
                    || Objects.isNull(bean.getStartTime()) 
 | 
                    || Objects.isNull(bean.getEndTime())){ 
 | 
                throw new BusinessException(ResponseStatus.BAD_REQUEST); 
 | 
            } 
 | 
            Bookings bookings = bookingsMapper.selectOne(new QueryWrapper<Bookings>().lambda() 
 | 
                    .eq(Bookings::getRoomId,bean.getRoomId()) 
 | 
                    .ge(Bookings::getEndTime,DateUtil.getPlusTime(bean.getEndTime())) 
 | 
                    .le(Bookings::getStartTime,DateUtil.getPlusTime(bean.getStartTime())) 
 | 
            ); 
 | 
            if(Objects.isNull(bookings)){ 
 | 
                throw new BusinessException(ResponseStatus.DATA_EMPTY); 
 | 
            } 
 | 
            return getMeetingDetail(bookings.getId()); 
 | 
        }catch (Exception e){ 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
    /** 
 | 
     * 会议详情 
 | 
     * 
 | 
     * @param id 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public MeetingDetailResponse getMeetingDetail(Integer id) { 
 | 
        MeetingDetailResponse meetingDetailResponse = bookingsMapper.meetingDetail(id); 
 | 
        if (Objects.isNull(meetingDetailResponse)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到会议详情"); 
 | 
        } 
 | 
        //预约人 
 | 
        meetingDetailResponse.setBookingUser(systemUserService.findById(meetingDetailResponse.getBookingUserId())); 
 | 
        //时间段列表 
 | 
        meetingDetailResponse.setBookingTimeList(bookingTimeMapper.selectList(new QueryWrapper<BookingTime>() 
 | 
                .eq("BOOKING_ID", id) 
 | 
                .eq("ISDELETED", MeetConstants.ZERO) 
 | 
        )); 
 | 
  
 | 
        //参会人员列表 
 | 
  
 | 
        List<UserResponse> userResponseList = systemUserService.getUserList(id); 
 | 
        String avatarPath = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() 
 | 
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode(); 
 | 
        userResponseList.forEach(i -> { 
 | 
            if(StringUtils.isNotBlank(i.getAvatar())){ 
 | 
                i.setAvatar(avatarPath+i.getAvatar()); 
 | 
            } 
 | 
        }); 
 | 
        meetingDetailResponse.setUserResponseList(userResponseList); 
 | 
        //服务项 
 | 
        String projectsPath = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() 
 | 
                + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); 
 | 
        List<ProjectsResponse> projectsResponseList = projectsService.getProjectsList(id, MeetConstants.ONE); 
 | 
        projectsResponseList.forEach(i -> { 
 | 
            i.setPrefixUrl(projectsPath); 
 | 
        }); 
 | 
        meetingDetailResponse.setProjectsResponseList(projectsResponseList); 
 | 
        List<Multifile> multiFileList = multifileMapper.selectList(new QueryWrapper<Multifile>() 
 | 
                .eq("OBJ_ID", id) 
 | 
                .eq("OBJ_TYPE", MeetConstants.ZERO) 
 | 
        ); 
 | 
        multiFileList.forEach(i -> { 
 | 
            i.setFileurlFull(projectsPath); 
 | 
        }); 
 | 
        //附件信息 
 | 
        meetingDetailResponse.setMultiFileList(multiFileList); 
 | 
        //会议室管理人员 
 | 
        List<UserRel> userRelList = userRelMapper.selectList(new QueryWrapper<UserRel>() 
 | 
                .eq("ISDELETED",MeetConstants.ZERO) 
 | 
                .eq("OBJ_ID", meetingDetailResponse.getRoomId()) 
 | 
                .eq("OBJ_TYPE",MeetConstants.ZERO) 
 | 
        ); 
 | 
        if (!Objects.isNull(userRelList) && userRelList.size() > 0) { 
 | 
            meetingDetailResponse.setRoomUser(systemUserService.findById(userRelList.get(MeetConstants.ZERO).getUserId())); 
 | 
        } 
 | 
        return meetingDetailResponse; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取开门二维码 
 | 
     * 
 | 
     * @param id 
 | 
     * @param userId 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public String getQrCode(Integer id, Integer userId) { 
 | 
        Bookings model = bookingsMapper.selectById(id); 
 | 
        if (model == null || !MeetConstants.equalsInteger(model.getIsdeleted(), MeetConstants.ZERO)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到会议详情"); 
 | 
        } 
 | 
        QrOpenDoorDto dto = new QrOpenDoorDto(); 
 | 
        dto.setType(MeetConstants.ZERO); 
 | 
        dto.setUserId(userId); 
 | 
        dto.setTimestamp(System.currentTimeMillis()); 
 | 
        dto.setObjId(id); 
 | 
  
 | 
        return DESUtil.encrypt(desPwd, QrOpenDoorDto.getParamFromObject(dto)); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 预约记录新增/修改 
 | 
     * 
 | 
     * @param bookingsRequest 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {Exception.class, BusinessException.class}) 
 | 
    public Integer reservationMeeting(BookingsRequest bookingsRequest) { 
 | 
        Bookings bookings = new Bookings(); 
 | 
        BeanUtils.copyProperties(bookingsRequest, bookings); 
 | 
        if (Objects.isNull(bookingsRequest.getId())) { 
 | 
            this.create(bookings); 
 | 
            return bookings.getId(); 
 | 
        } else { 
 | 
            this.updateById(bookings); 
 | 
            return bookings.getId(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 会议预约记录取消 
 | 
     * 
 | 
     * @param id 
 | 
     * @param userId 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {Exception.class,BusinessException.class}) 
 | 
    public void reservationCancel(Integer id, Integer userId) { 
 | 
        Bookings bookings = bookingsMapper.selectById(id); 
 | 
        if (Objects.isNull(bookings)) { 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录"); 
 | 
        } 
 | 
        if (!bookings.getCreator().equals(userId)) { 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "非你的预约记录,无法进行取消"); 
 | 
        } 
 | 
        if (System.currentTimeMillis() > bookings.getStartTime().getTime()) { 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已开始,无法进行取消"); 
 | 
        } 
 | 
        if(bookings.getStatus().equals(MeetConstants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "本次操作失败,预约状态已流转"); 
 | 
        } 
 | 
        bookings.setCancelTime(new Date()); 
 | 
        bookings.setCancelUser(userId); 
 | 
        bookings.setStatus(MeetConstants.ONE); 
 | 
        bookings.setEditDate(new Date()); 
 | 
        bookings.setEditor(userId); 
 | 
        bookingsMapper.updateById(bookings); 
 | 
        //取消会议 发送取消通知 
 | 
        this.sendNotice(bookings, 3); 
 | 
        //发送微信订阅通知 
 | 
        sendWxMessage.bookingsCancel(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId())); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 定时发送会议 即将开始通知 
 | 
     */ 
 | 
    @Override 
 | 
    public void sendBookingsNotice() { 
 | 
        //查询配置 
 | 
        String configMinute = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.NOTICE_TIME).getCode(); 
 | 
        Integer minute = StringUtils.isNotBlank(configMinute) ? Integer.valueOf(configMinute) : 30; 
 | 
        //查询会议开始三十分钟前的会议 
 | 
        List<Bookings> bookingsList = bookingsMapper.selectList(new QueryWrapper<Bookings>() 
 | 
                .eq("STATUS",MeetConstants.ZERO) 
 | 
                .eq("ISDELETED",MeetConstants.ZERO) 
 | 
                .eq("SEND_NOTICE", MeetConstants.ZERO) 
 | 
                .apply(" now() >= SUBDATE(START_TIME,interval + " + minute + " minute) ") 
 | 
                .apply(" ROOM_ID in ( select r.id from meeting_rooms r where r.ISDELETED = 0 and r.STATUS = 0  )") 
 | 
        ); 
 | 
        for (Bookings bookings : bookingsList) { 
 | 
            bookings.setSendNotice(MeetConstants.ONE); 
 | 
            bookings.setEditDate(new Date()); 
 | 
            bookingsMapper.updateById(bookings); 
 | 
            this.sendNotice(bookings, MeetConstants.ONE); 
 | 
            //发送微信通知 
 | 
            sendWxMessage.bookingsStart(systemUserMapper.selectById(bookings.getCreator()), bookings, roomsMapper.selectById(bookings.getRoomId())); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 发送会议通知 
 | 
     * 
 | 
     * @param bookings 
 | 
     * @param sendType 1 = 参与会议 2 = 预定成功 3 = 会议取消 
 | 
     */ 
 | 
    @Async 
 | 
    public void sendNotice(Bookings bookings, Integer sendType) { 
 | 
        //1、参与会议:参与会议即将开始  给每个参会人员发送会议通知并且给会议预约人发送预定的会议即将开始 如果预订人也参与会议,则会有2条会议通知 
 | 
        //2、会议预定成功,给所有参会人员与预约人都发送 
 | 
        //3、会议取消 会议取消,给所有参会人员都发送 
 | 
        List<UserRel> userRelList = userRelMapper.selectList(new QueryWrapper<UserRel>() 
 | 
                .eq("OBJ_TYPE", MeetConstants.ONE) 
 | 
                .eq("OBJ_ID", bookings.getId()) 
 | 
                .eq("ISDELETED", MeetConstants.ZERO) 
 | 
        ); 
 | 
        List<Notices> noticeList = new ArrayList<>(); 
 | 
        Constants.NoticeObjectType noticeObjectType = Constants.NoticeObjectType.MEETING_START; 
 | 
        if (sendType.equals(MeetConstants.THREE)){ 
 | 
            noticeObjectType = Constants.NoticeObjectType.MEETING_CACEL; 
 | 
        }else   if (sendType.equals(MeetConstants.TWO)){ 
 | 
            noticeObjectType = Constants.NoticeObjectType.MEETING_BOOK_SUCCESS; 
 | 
        } 
 | 
        if(userRelList!=null && userRelList.size()>0){ 
 | 
            for (UserRel i : userRelList) { 
 | 
                Notices notices = new Notices(noticeObjectType,i.getId(),noticeObjectType.getInfo(), i.getUserId(), Constants.ZERO); 
 | 
                noticeList.add(notices); 
 | 
            } 
 | 
        } 
 | 
        //给参会人员插入 
 | 
        Notices notices = new Notices(noticeObjectType,bookings.getId(),noticeObjectType.getInfo(),bookings.getCreator(), Constants.ZERO); 
 | 
        noticeList.add(notices); 
 | 
        if(noticeList.size()>0){ 
 | 
            noticesMapper.insertBatchSomeColumn(noticeList); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public List<Bookings> getMyJoinBookingMeet(Integer userId, Integer roomId, LocalDateTime startTime, LocalDateTime endTime) { 
 | 
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
 | 
        SimpleDateFormat fmt1 =new  SimpleDateFormat("HH:mm"); 
 | 
        MPJLambdaWrapper<Bookings> lambdaWrapper = new MPJLambdaWrapper<>(); 
 | 
  
 | 
        String start = startTime.format(fmt); 
 | 
        String end = endTime.format(fmt); 
 | 
  
 | 
  
 | 
        lambdaWrapper.selectAll(Bookings.class) 
 | 
                        .selectAs(SystemUser::getRealname, Bookings::getRealName) 
 | 
                        .selectAs(Company::getName, Bookings::getDepartmentName) 
 | 
                        .selectAs(Rooms::getName, Bookings::getRoomName) 
 | 
                .select("CASE DAYOFWEEK(t.START_TIME)\n" + 
 | 
                        "\tWHEN 1 THEN \t\"星期日\" \tWHEN 2 THEN \"星期一\"\n" + 
 | 
                        "\t\t\tWHEN 3 THEN \"星期二\" \tWHEN 4 THEN \"星期三\"\n" + 
 | 
                        "\t\t\tWHEN 5 THEN \t\"星期四\" WHEN 6 THEN \"星期五\"\n" + 
 | 
                        "\t\t\tWHEN 7 THEN \"星期六\" \tELSE \t\"\"\n" + 
 | 
                        "END  weekday") 
 | 
               // .selectAs(RoomTime::getStartTime, Bookings::getStartHour) 
 | 
               // .selectAs(RoomTime::getEndTime, Bookings::getEndHour) 
 | 
              //  .leftJoin(BookingTime.class, BookingTime::getBookingId, Bookings::getId) 
 | 
              //  .leftJoin(RoomTime.class, RoomTime::getId, BookingTime::getTimeId) 
 | 
                .leftJoin(SystemUser.class, SystemUser::getId, Bookings::getCreator) 
 | 
                .leftJoin(Rooms.class, Rooms::getId, Bookings::getRoomId) 
 | 
                .leftJoin(Company.class,Company::getId,SystemUser::getCompanyId) 
 | 
                .eq(Objects.nonNull(roomId), Bookings::getRoomId, roomId) 
 | 
                .eq(Bookings::getIsdeleted, MeetConstants.ZERO) 
 | 
                .eq(Bookings::getStatus, MeetConstants.ZERO) 
 | 
              //  .eq(BookingTime::getIsdeleted, MeetConstants.ZERO) 
 | 
               // .eq(RoomTime::getIsdeleted, MeetConstants.ZERO) 
 | 
                .apply("DATE_FORMAT(t.START_TIME,'%Y-%m-%d') between '" + start + "' and '" + end + "'") 
 | 
                // .between(Bookings::getStartTime,start,end ) 
 | 
              //  .orderByAsc(Bookings::getRoomId) 
 | 
              //  .orderByDesc(Bookings::getCreateDate) 
 | 
                .orderByAsc(RoomTime::getStartTime); 
 | 
        List<Bookings> bookings = bookingsJoinMapper.selectJoinList(Bookings.class, lambdaWrapper); 
 | 
        if(bookings!=null){ 
 | 
            bookings.stream().forEach(s ->{ 
 | 
                if(s.getStartTime()!=null&&s.getEndTime()!=null){ 
 | 
                    s.setStartHour(fmt1.format(s.getStartTime())); 
 | 
                    s.setEndHour(fmt1.format(s.getEndTime())); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
        return bookings; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<DateTimeResourceDate> findMothBookingMeet(Integer userId, Integer roomId, String dateMonth) { 
 | 
  
 | 
        LocalDateTime monthFirst = DateUtil.getMonthFirst(); 
 | 
        LocalDateTime monthLast = DateUtil.getMonthLast(); 
 | 
  
 | 
        if (StringUtils.isNotBlank(dateMonth)) { 
 | 
  
 | 
            LocalDateTime date = LocalDateTime.of(Integer.valueOf(dateMonth.split("-")[0]), Integer.valueOf(dateMonth.split("-")[1]), 14, 00, 00, 00); 
 | 
            //  LocalDateTime lastMonth = date.minusMonths(1); // 当前月份减1 
 | 
            monthFirst = date.with(TemporalAdjusters.firstDayOfMonth()); // 获取当前月的第一天 
 | 
            monthLast = date.with(TemporalAdjusters.lastDayOfMonth()); // 获取当前月的最后一天 
 | 
        } 
 | 
  
 | 
        List<Bookings> myJoinBookingMeet = getMyJoinBookingMeet(userId, roomId, monthFirst, monthLast); 
 | 
        Map<LocalDate, List<Bookings>> collect = myJoinBookingMeet.stream() 
 | 
                .collect(Collectors.groupingBy(s -> DateUtil.toDateLocalDateTime(s.getStartTime()).toLocalDate())); 
 | 
  
 | 
        Integer dayOfMonth = monthLast.getDayOfMonth(); 
 | 
        Integer year = monthLast.getYear(); 
 | 
        Integer monthValue = monthLast.getMonthValue(); 
 | 
        List<DateTimeResourceDate> list = new ArrayList<>(); 
 | 
        List<Bookings> bookings1 = new ArrayList<>(); 
 | 
        for (int i = 1; i <= dayOfMonth; i++) { 
 | 
            DateTimeResourceDate timeResource = new DateTimeResourceDate(); 
 | 
            timeResource.setLocalDate(LocalDate.of(year, monthValue, i)); 
 | 
            List<Bookings> bookings = collect.get(timeResource.getLocalDate()); 
 | 
            if (bookings != null) { 
 | 
                timeResource.setResource(bookings); 
 | 
            } else { 
 | 
                timeResource.setResource(bookings1); 
 | 
            } 
 | 
            list.add(timeResource); 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<RoomStatisticsVo> getRoomStatistics(Integer yearNum) { 
 | 
        return bookingsMapper.getRoomStatistics(yearNum); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public PageData<UserStatisticsVo> getUserStatistics(PageWrap<UserStatisticsDTO> pageWrap) { 
 | 
        IPage<UserStatisticsVo> userStatistics = bookingsMapper.getUserStatistics(pageWrap.toPage(), pageWrap.getModel().getYearNum(), pageWrap.getModel().getUserId()); 
 | 
        return PageData.from(userStatistics); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询参会人员分页 
 | 
     * @param pageWrap 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public IPage<UserResponse> getUserPage(PageWrap<UserPageRequest> pageWrap) { 
 | 
        IPage<UserResponse> page = systemUserMapper.getUserPage(pageWrap.toPage(),new QueryWrapper<UserResponse>() 
 | 
                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyword()), i -> i.like("c.realName", pageWrap.getModel().getKeyword()) 
 | 
                        .or().like("e.name", pageWrap.getModel().getKeyword()) 
 | 
                ) 
 | 
                .eq("c.DELETED",0) 
 | 
                .eq("c.status",0) 
 | 
                .orderByAsc("c.id") 
 | 
        ); 
 | 
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() 
 | 
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode(); 
 | 
        //查询是否处于会议中 
 | 
        page.getRecords().forEach(j->{ 
 | 
            j.setPrefixUrl(path); 
 | 
            if(bookingsMapper.selectCount(new QueryWrapper<Bookings>() 
 | 
                    .exists(" select 1 from meeting_user_rel u where u.OBJ_ID = meeting_book.id and  u.USER_ID = '"+j.getId()+"' and u.OBJ_TYPE = 1    ") 
 | 
                    .and(i -> i.between("START_TIME", pageWrap.getModel().getStartTime()+":00",pageWrap.getModel().getEndTime()+":00") 
 | 
                            .or().between("END_TIME", pageWrap.getModel().getStartTime()+":00",pageWrap.getModel().getEndTime()+":00") 
 | 
                    ) 
 | 
            )>Constants.ZERO){ 
 | 
                j.setStatus(Constants.ONE); 
 | 
            }else{ 
 | 
                j.setStatus(Constants.ZERO); 
 | 
            } 
 | 
        }); 
 | 
        return page; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
} 
 |