| package com.doumee.service.business.impl; | 
|   | 
| import com.alibaba.fastjson.JSONObject; | 
| 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.dao.business.dao.MemberMapper; | 
| import com.doumee.dao.business.dao.UserActionMapper; | 
| import com.doumee.service.business.third.model.LoginUserInfo; | 
| import com.doumee.service.business.third.model.PageData; | 
| import com.doumee.service.business.third.model.PageWrap; | 
| import com.doumee.core.utils.*; | 
| import com.doumee.core.wx.MeetConstants; | 
| import com.doumee.core.wx.SendWxMessage; | 
| import com.doumee.core.wx.WxPlatNotice; | 
| import com.doumee.dao.admin.request.BusinessOverDTO; | 
| import com.doumee.dao.admin.request.QrOpenDoorDto; | 
| import com.doumee.dao.admin.response.DevWgResponseParam; | 
| import com.doumee.dao.business.*; | 
| import com.doumee.dao.business.dao.SmsConfigMapper; | 
| import com.doumee.dao.business.dao.SmsEmailMapper; | 
| 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 lombok.extern.slf4j.Slf4j; | 
| 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.Date; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * 会议室预定信息表Service实现 | 
|  * | 
|  * @author 江蹄蹄 | 
|  * @date 2023/05/04 18:18 | 
|  */ | 
| @Service | 
| @Slf4j | 
| public class BookingsServiceImpl implements BookingsService { | 
|   | 
|     @Value("${des_pwd}") | 
|     private String desPwd; | 
|     @Autowired | 
|     private BookingsMapper bookingsMapper; | 
|     @Autowired | 
|     private SmsConfigMapper smsConfigMapper; | 
|     @Autowired | 
|     private SystemUserMapper systemUserMapper; | 
|     @Autowired | 
|     private RoomRecordMapper roomRecordMapper; | 
|   | 
|   | 
|     @Autowired | 
|     private BookingsJoinMapper bookingsJoinMapper; | 
|   | 
|     @Autowired | 
|     private RoomsMapper roomsMapper; | 
|     @Autowired | 
|     private UserActionMapper userActionMapper; | 
|     @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 SmsEmailMapper smsEmailMapper; | 
|   | 
|     @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(); | 
|         Rooms rooms = roomsMapper.selectById(bookings.getRoomId()); | 
|         if(rooms==null||Constants.equalsInteger(rooms.getIsdeleted(),Constants.ONE) ){ | 
|             throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该会议室暂时无法预约"); | 
|         } | 
|         bookings.setRoomName(rooms.getName()); | 
|         isCreateParamValid(bookings, user); | 
|         bookings.setCreateDate(new Date()); | 
|         bookings.setCreator(user.getId()); | 
|         bookings.setIsdeleted(MeetConstants.ZERO); | 
|         bookings.setStatus(MeetConstants.ZERO); | 
|         bookingsMapper.insert(bookings); | 
|         bookings.setManagerInfo(user.getRealname()); | 
|         //更新会议室预定时间段 | 
|         updateBookingTimes(bookings, user); | 
|         //添加管理人员 | 
|         updateManager(bookings, user); | 
|         //添加管服务项目 | 
|         updateProjectRel(bookings, user); | 
|         handleFile(bookings, user); | 
|         //发送会议预约成功通知 | 
|         if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){ | 
|             this.sendNotice(bookings, MeetConstants.TWO); | 
|             SystemUser systemUser = systemUserMapper.selectById(user.getId()); | 
|             this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ZERO); | 
|             //创建会议即将到期与会议即将结束的通知 | 
|             if(Objects.nonNull(systemUser)&&StringUtils.isNotBlank(systemUser.getOpenid())){ | 
|                 WxPlatNotice wxPlatNotice = new WxPlatNotice(); | 
|                 wxPlatNotice.createBeginWxNotice(systemDictDataBiz,smsEmailMapper,bookings,systemUser.getOpenid()); | 
|                 wxPlatNotice.createEndWxNotice(systemDictDataBiz,smsEmailMapper,bookings,systemUser.getOpenid()); | 
|             }  | 
|         } | 
|   | 
|         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(Constants.MultiFile.MEETING_BOOKS.getKey()); | 
|                 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()); | 
|         } | 
|   | 
|         if(Objects.nonNull(bookings.getId())){ | 
|             return; | 
|         } | 
|   | 
|         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(BookingTime::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); | 
|             RoomTime roomTime = roomTimeJoinMapper.selectById(s.getTimeId()); | 
|             if(Objects.isNull(roomTime) ||Constants.equalsInteger(roomTime.getIsdeleted(),Constants.ONE)){ | 
|                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"存在未查询到的配置日期,请刷新重试"); | 
|             } | 
|             String endRoomTime = gsDate + " " + roomTime.getEndTime()+":00"; | 
|             if(DateUtil.StringToDate(endRoomTime, "yyyy-MM-dd HH:mm:ss").getTime()<=System.currentTimeMillis()){ | 
|                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),endRoomTime + "已超过当前时间,无法进行预约"); | 
|             } | 
|             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) { | 
|                             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) { | 
|                             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.setId(null); | 
|             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); | 
|         } | 
|         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(bookings.getSysList())){ | 
|             bookings.getSysList().stream().forEach(s -> { | 
|                 s.setId(null); | 
|                 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.setId(null); | 
|                 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 model = bookingsMapper.selectById(id); | 
|         if(model==null ||Constants.equalsInteger(Constants.ONE,model.getIsdeleted())) { | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|   | 
|         Date date = new Date(); | 
|         Bookings bookings = new Bookings(); | 
|         bookings.setId(id); | 
|         bookings.setIsdeleted(MeetConstants.ONE); | 
|         bookings.setEditDate(date); | 
|         bookings.setEditor(user.getId()); | 
|         bookingsMapper.updateById(bookings); | 
|   | 
|         String[] params = new String[3]; | 
|         params[0] = user.getRealname(); | 
|         params[1]=DateUtil.getPlusTime2(date); | 
|         params[2]=model.getName()+"-【会议室:"+model.getRoomName()+" 】-【时间:"+DateUtil.getPlusTime2(model.getStartTime())+"-"+DateUtil.getPlusTime2(model.getEndTime())+"】"; | 
|         String info = Constants.UserActionType.MEET_BOOK_DEL.getInfo(); | 
|         if(params!=null){ | 
|             for (int i = 0; i < params.length; i++) { | 
|                 info = info.replace("${param"+(i+1)+"}",params[i]); | 
|             } | 
|         } | 
|         UserAction userAction=new UserAction(); | 
|         userAction.setIsdeleted(Constants.ZERO); | 
|         userAction.setCreateDate(date); | 
|         userAction.setCreator(user.getId()); | 
|         userAction.setBeforeStatus(Constants.ZERO); | 
|         userAction.setType( Constants.UserActionType.MEET_BOOK_DEL.getKey()); | 
|         userAction.setContent(JSONObject.toJSONString(model)); | 
|         userAction.setRemark(info); | 
|         userAction.setMemberId(id+""); | 
|         userActionMapper.insert(userAction); | 
|   | 
|     } | 
|   | 
|     @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)||Constants.equalsInteger(bkjs.getIsdeleted(),Constants.ONE)) { | 
|                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==null ||Constants.equalsInteger(dbBookings.getIsdeleted(),Constants.ONE)){ | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|         if(dbBookings.getStatus().equals(MeetConstants.ONE)){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "本次操作失败,预约状态已流转"); | 
|         } | 
|         Rooms rooms = roomsMapper.selectById(dbBookings.getRoomId()); | 
|         if(rooms==null||Constants.equalsInteger(rooms.getIsdeleted(),Constants.ONE) ){ | 
|             throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该会议室暂时无法预约"); | 
|         } | 
|         bookings.setRoomName(rooms.getName()); | 
|         LoginUserInfo user = bookings.getLoginUserInfo(); | 
|         isCreateParamValid(bookings, user); | 
|         bookings.setEditDate(new Date()); | 
|         bookings.setEditor(user.getId()); | 
|         bookingsMapper.updateById(bookings); | 
|         bookings.setManagerInfo(user.getRealname()); | 
|         bookings.setCreator(dbBookings.getCreator()); | 
|         //更新会议室预定时间段 | 
|         updateBookingTimes(bookings, user); | 
|         //添加管理人员 | 
|         updateManager(bookings, user); | 
|         //添加管服务项目 | 
|         updateProjectRel(bookings, user); | 
|         handleFile(bookings, user); | 
|         //发送会议通知 | 
|         if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){ | 
|             this.sendNotice(bookings, MeetConstants.TWO); | 
|             SystemUser systemUser = systemUserMapper.selectById(bookings.getCreator()); | 
|             this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ZERO); | 
|             if(Objects.nonNull(systemUser)&&StringUtils.isNotBlank(systemUser.getOpenid())){ | 
|                 WxPlatNotice wxPlatNotice = new WxPlatNotice(); | 
|                 wxPlatNotice.createBeginWxNotice(systemDictDataBiz,smsEmailMapper,bookings,systemUser.getOpenid()); | 
|                 wxPlatNotice.createEndWxNotice(systemDictDataBiz,smsEmailMapper,bookings,systemUser.getOpenid()); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @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)||Constants.equalsInteger(bookings.getIsdeleted(),Constants.ONE)) { | 
|             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); | 
|         SystemUser systemUser = systemUserMapper.selectById(bookings.getCreator()); | 
|   | 
|         bookings.setManagerInfo(systemUser.getRealname()); | 
|         //取消会议 发送取消通知 | 
|         if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){ | 
|             this.sendNotice(bookings, 3); | 
|             this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ONE); | 
|         } | 
|     } | 
|   | 
|     @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()); | 
|         Integer minute =getNearStartMinut(); | 
|   | 
|         queryWrapper.selectAll(Bookings.class); | 
|         queryWrapper.selectAs(Rooms::getName, Bookings::getRoomName); | 
|         queryWrapper.selectAs(SystemUser::getRealname, Bookings::getRealName); | 
|         queryWrapper.selectAs(Company::getName, Bookings::getDepartmentName); | 
| //        queryWrapper.select(" CASE WHEN t.START_TIME_REAL IS NULL AND t.`STATUS` = 0 THEN 1  WHEN ( ( t.END_TIME < now()  AND t.`STATUS` = 0 ) or t.`STATUS` = 2 ) THEN 3 WHEN t.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus "); | 
|         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); | 
|   | 
|         //数据权限开始--------------------start---------------- | 
|         LoginUserInfo userInfo =pageWrap.getModel().getLoginUserInfo(); | 
|         if(userInfo!=null && userInfo.getCompanyIdList()!=null){ | 
|             if(  userInfo.getCompanyIdList().size() ==0){ | 
|                 //只看自己 | 
|                 queryWrapper.and(wrapper ->{ | 
|                     wrapper.eq(Bookings::getCreator,userInfo.getId()) | 
|                             .or().exists("select rel.id from meeting_user_rel rel where rel.OBJ_TYPE=0 and rel.obj_id=t.id and rel.isdeleted=0 and rel.user_id="+userInfo.getId()); | 
|                 }); | 
|                 queryWrapper.eq(Bookings::getCreator,userInfo.getId()); | 
|             }else{ | 
|                 //权限范围内 | 
|                 queryWrapper.and(wrapper ->{ | 
|                     wrapper.in(SystemUser::getCompanyId ,userInfo.getCompanyIdList()) | 
|                             .or().exists("select rel.id from meeting_user_rel rel where rel.OBJ_TYPE=0 and rel.obj_id=t.id and rel.isdeleted=0 and rel.user_id="+userInfo.getId()); | 
|                 }); | 
|             } | 
|         } | 
|         //数据权限开始--------------------end---------------- | 
|   | 
|         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, Company::getId, pageWrap.getModel().getDepartmentId()); | 
|         //status 状态 0已预约 1已撤销 2已结束 | 
|         //会议状态: 1=未开始;2=进行中;3=已结束 ; 4=即将开始; 5=已撤销 | 
|         queryWrapper.apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                         &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.ONE), | 
|                 " ( now() < t.START_TIME and t.status = 0  AND SUBDATE( now(), INTERVAL -"+minute+" MINUTE ) <  t.START_TIME ) " | 
|         ) | 
|         .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                         &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.TWO), | 
|                 " ( t.status = 0 and t.START_TIME_REAL is not null  ) " | 
|         ) | 
|         .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                         &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.THREE), | 
|                 " (   t.`STATUS` = 2  )  " | 
|                 //" ( ( now() > t.END_TIME  and  t.`STATUS` = 0  ) or   t.`STATUS` = 2  )  " | 
|         ) | 
|         .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                         &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.FOUR), | 
|                 " (t.status = 0  AND SUBDATE( now(), INTERVAL -"+minute+" MINUTE ) >  t.START_TIME and t.START_TIME_REAL is null ) " | 
|                 //" now() < t.START_TIME  AND SUBDATE( t.START_TIME, INTERVAL "+minute+" MINUTE ) < NOW() " | 
|         ) | 
|         .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                         &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.FIVE), | 
|                 " t.STATUS = 1  " | 
|         ); | 
|   | 
|         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 -> { | 
|             dealMeetingStatusByModel(s,minute); | 
|             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::getObjType, MeetConstants.ONE); | 
|             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<UserRel> param = new MPJLambdaWrapper<>(); | 
|             param.selectAll(UserRel.class); | 
|             param.eq(UserRel::getObjType, MeetConstants.ZERO); | 
|             param.eq(UserRel::getIsdeleted, MeetConstants.ZERO); | 
|             param.eq(UserRel::getObjId, s.getRoomId()); | 
|             List<UserRel> adminList = userRelJoinMapper.selectJoinList(UserRel.class, param); | 
|             s.setAdminList(adminList); | 
|   | 
|             //查询是否有权限 | 
|             s.setHasRole(getHasRoleByParam(s,userInfo,adminList)); | 
|             /*  //服务项 | 
|             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); | 
|     } | 
|     public int getHasRoleByParam(Bookings s,LoginUserInfo userInfo,List<UserRel> adminList){ | 
|         if(Constants.equalsInteger(userInfo.getId(),s.getCreator())  ){ | 
|               return 1; | 
|         } | 
|         if(adminList!=null && userInfo!=null){ | 
|             for(UserRel u : adminList){ | 
|                 if(Constants.equalsInteger(userInfo.getId(),u.getUserId())  ){ | 
|                     return 1; | 
|                 } | 
|             } | 
|         } | 
|         return  0; | 
|     } | 
|     private void dealMeetingStatusByModel(Bookings s,Integer minute) { | 
|         //会议状态: 1=未开始;2=进行中;3=已结束 ; 4=即将开始; 5=已撤销 | 
|         //status状态 0已预约 1已撤销 2已结束 | 
|         if(Constants.equalsInteger(s.getStatus(),Constants.ONE)){ | 
|             //已撤销 | 
|             s.setMeetingStatus(Constants.FIVE); | 
|         }else if(Constants.equalsInteger(s.getStatus(),Constants.TWO)){ | 
|             //已结束 | 
|             s.setMeetingStatus(Constants.THREE); | 
|         }else if(Constants.equalsInteger(s.getStatus(),Constants.ZERO)){ | 
|             //0已预约 | 
|             if(s.getStartTimeReal() ==null){ | 
|                 //如果未开始 | 
|                 s.setMeetingStatus(Constants.ONE); | 
|                 //开始前120分钟 大于当前时间 则显示即将开始 | 
|                 if(DateUtil.afterMinutesDate(s.getStartTime(),-minute).getTime()<=System.currentTimeMillis()  ){ | 
|                     s.setMeetingStatus(Constants.FOUR);//则显示即将开始 | 
|                 } | 
|             }else{ | 
|                 //会议中 | 
|                 s.setMeetingStatus(Constants.TWO); | 
|             } | 
|         } | 
|   | 
|     } | 
|   | 
|     @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,Integer queryType) { | 
|         if(queryType==null ){ | 
|             queryType  =1; | 
|         } | 
|         return bookingsMapper.selectJoinList(Bookings.class,new MPJLambdaWrapper<Bookings>() | 
|                 .selectAll(Bookings.class) | 
|                  .leftJoin(Rooms.class,Rooms::getId,Bookings::getRoomId) | 
|                 .exists(queryType!=3,"( select u.OBJ_ID from meeting_user_rel u where u.OBJ_ID =t.id and u.USER_ID = '" + userId + "' and u.ISDELETED = 0 and OBJ_TYPE = 1  ) ") | 
|                 .exists(queryType==3,"( select u.OBJ_ID from meeting_user_rel u where u.OBJ_ID =t1.id and  u.USER_ID = '" + userId + "' and u.ISDELETED = 0 and OBJ_TYPE = 0 ) ") | 
|                 .eq(Bookings::getIsdeleted,MeetConstants.ZERO) | 
|                 .eq(Rooms::getIsdeleted,MeetConstants.ZERO) | 
|                 .eq(Rooms::getStatus,MeetConstants.ZERO) | 
| //                .eq("STATUS",MeetConstants.ZERO) | 
|                 .like(StringUtils.isNotBlank(dateMsg), Bookings::getStartTime, dateMsg)); | 
|     } | 
|   | 
|     /** | 
|      * 我的预约/我的会议 | 
|      * | 
|      * @param pageWrap | 
|      * @return | 
|      */ | 
|     public IPage<Bookings> getMyMeetingPageNew(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.select(" CASE WHEN t.START_TIME_REAL IS NULL AND t.`STATUS` = 0 THEN 1  WHEN ( ( t.END_TIME < now()  AND t.`STATUS` = 0 ) or t.`STATUS` = 2 ) THEN 3 WHEN t.`STATUS` = 1 THEN 5 ELSE  2  END meetingStatus "); | 
|         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.and(StringUtils.isNotBlank(pageWrap.getModel().getRoomsName()), | 
|                 j -> j.like(Bookings::getName,pageWrap.getModel().getRoomsName()).or().like(Rooms::getName, pageWrap.getModel().getRoomsName())) | 
|                 .exists(pageWrap.getModel().getQueryType().equals(MeetConstants.ONE) && !Objects.isNull(pageWrap.getModel().getUserId()), | 
|                         " select u.id from meeting_user_rel u where t.id = u.OBJ_ID and  u.USER_ID = '" + pageWrap.getModel().getUserId() + "' and u.ISDELETED = 0 and u.OBJ_TYPE = 1  ") | 
|                 .eq(pageWrap.getModel().getQueryType().equals(MeetConstants.TWO) | 
|                         && !Objects.isNull(pageWrap.getModel().getUserId()), Bookings::getCreator, pageWrap.getModel().getUserId()) | 
|                 .like(StringUtils.isNotBlank(pageWrap.getModel().getQueryDate()),  Bookings::getStartTime, pageWrap.getModel().getQueryDate()) | 
|                 .eq(!Objects.isNull(pageWrap.getModel().getRoomsId()), Bookings::getRoomId, pageWrap.getModel().getRoomsId()) | 
|                 .apply(!Objects.isNull(pageWrap.getModel().getStatus()) && pageWrap.getModel().getStatus().equals(MeetConstants.ONE), | 
|                         " now() < t.END_TIME and t.STATUS = 0   ") | 
|                 .and(!Objects.isNull(pageWrap.getModel().getStatus()) && pageWrap.getModel().getStatus().equals(MeetConstants.TWO), | 
|                         j -> j.apply("now() >= t.END_TIME ").or() | 
|                                 .eq(" t.STATUS", MeetConstants.ONE)) | 
|                 .eq(Rooms::getIsdeleted,MeetConstants.ZERO) | 
|                 .eq(Rooms::getStatus,MeetConstants.ZERO) | 
|                 .eq(Bookings::getIsdeleted,MeetConstants.ZERO) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.ONE), | 
|                         " ( now() < t.START_TIME and t.status = 0 ) " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.TWO), | 
|                         " ( now() >= t.START_TIME and t.END_TIME >= now() and t.status = 0 ) " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.THREE), | 
|                         " ( ( now() >t.END_TIME  and  t.`STATUS` = 0  ) or  t.`STATUS` = 2  )  " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.FOUR), | 
|                         " now() < t.START_TIME  AND SUBDATE( t.START_TIME, INTERVAL 120 MINUTE ) < NOW() " | 
|                 ) | 
|                 .eq(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.FIVE), | 
|                         Bookings::getStatus,MeetConstants.ONE | 
|                 ) | 
|                 .orderByDesc(Constants.equalsInteger(pageWrap.getModel().getQueryType(),MeetConstants.TWO),Bookings::getCreateDate) | 
|                 .orderByAsc(Constants.equalsInteger(pageWrap.getModel().getQueryType(),MeetConstants.ONE),Bookings::getStartTime); | 
|   | 
|         IPage<Bookings> result = bookingsJoinMapper.selectJoinPage(page, Bookings.class, queryWrapper); | 
|         return result; | 
|     } | 
|     @Override | 
|     public IPage<MeetingListResponse> getMyMeetingPage(PageWrap<MeetingPageRequest> pageWrap) { | 
|   | 
|         QueryWrapper queryWrapper = 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 ") | 
|                 .exists(pageWrap.getModel().getQueryType().equals(MeetConstants.THREE) && !Objects.isNull(pageWrap.getModel().getUserId()), | 
|                         " select 1 from meeting_user_rel u where b.id = u.OBJ_ID and  u.USER_ID = '" + pageWrap.getModel().getUserId() + "' and u.ISDELETED = 0 and OBJ_TYPE = 0 ")//管理员查看 | 
|                 .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) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.ONE), | 
|                         " ( now() < a.START_TIME and a.status = 0 ) " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.TWO), | 
|                         " ( now() >= a.START_TIME and a.END_TIME >= now() and a.status = 0 ) " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.THREE), | 
|                         " ( ( now() > a.END_TIME  and  a.`STATUS` = 0  ) or   a.`STATUS` = 2  )  " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.FOUR), | 
|                         " now() < a.START_TIME  AND SUBDATE( a.START_TIME, INTERVAL 120 MINUTE ) < NOW() " | 
|                 ) | 
|                 .apply(Objects.nonNull(pageWrap.getModel().getMeetingStatus()) | 
|                                 &&Constants.equalsInteger(pageWrap.getModel().getMeetingStatus(),Constants.FIVE), | 
|                         " a.STATUS = 1  " | 
|                 ) | 
| //                        .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") | 
|                 .orderByDesc(Constants.equalsInteger(pageWrap.getModel().getQueryType(),MeetConstants.TWO),"a.CREATE_DATE") | 
|                 .orderByAsc(Constants.equalsInteger(pageWrap.getModel().getQueryType(),MeetConstants.ONE) | 
|                         || Constants.equalsInteger(pageWrap.getModel().getQueryType(),MeetConstants.THREE),"a.START_TIME"); | 
|   | 
|         IPage<MeetingListResponse> page = bookingsMapper.myMeetingPage(pageWrap.toPage(), queryWrapper); | 
|         this.dealMeetingStatus(page.getRecords()); | 
|         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::getIsdeleted,Constants.ZERO) | 
|                     .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(),null); | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         } | 
|         return null; | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|     /** | 
|      * 会议详情 | 
|      * | 
|      * @param id | 
|      * @return | 
|      */ | 
|     @Override | 
|     public MeetingDetailResponse getMeetingDetail(Integer id,Integer sysUserId) { | 
|         MeetingDetailResponse meetingDetailResponse = bookingsMapper.meetingDetail(id); | 
|         if (Objects.isNull(meetingDetailResponse) | 
|                 || Constants.equalsInteger(meetingDetailResponse.getIsdeleted(),Constants.ONE) ) { | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到会议详情"); | 
|         } | 
|         //预约人 | 
|         meetingDetailResponse.setBookingUser(systemUserService.findById(meetingDetailResponse.getBookingUserId())); | 
|         //时间段列表 | 
|         meetingDetailResponse.setBookingTimeList(bookingTimeMapper.selectList(new QueryWrapper<BookingTime>().lambda() | 
|                 .eq(BookingTime::getBookingId, id) | 
|                 .eq(BookingTime::getIsdeleted, 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.getAvatar().startsWith("HKIMG") ){ | 
|                 i.setAvatar(avatarPath+i.getAvatar()); | 
|             }else{ | 
|                 i.setAvatar(null); | 
|             } | 
|         }); | 
|         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>().lambda() | 
|                 .eq(Multifile::getObjId, id) | 
|                 .eq(Multifile::getObjType, Constants.MultiFile.MEETING_BOOKS.getKey()) | 
|                 .eq(Multifile::getIsdeleted, MeetConstants.ZERO) | 
|         ); | 
|         multiFileList.forEach(i -> { | 
|             i.setFileurlFull(projectsPath); | 
|         }); | 
|         //附件信息 | 
|         meetingDetailResponse.setMultiFileList(multiFileList); | 
|         //会议室管理人员 | 
|         List<UserRel> userRelList = userRelMapper.selectList(new QueryWrapper<UserRel>().lambda() | 
|                 .eq(UserRel::getIsdeleted,MeetConstants.ZERO) | 
|                 .eq(UserRel::getObjId, meetingDetailResponse.getRoomId()) | 
|                 .eq(UserRel::getObjType,MeetConstants.ZERO) | 
|         ); | 
|         if(Constants.equalsInteger(sysUserId,meetingDetailResponse.getBookingUserId())){ | 
|             meetingDetailResponse.setIsAdmin(Constants.ONE); | 
|         } | 
|         if (!Objects.isNull(userRelList) && userRelList.size() > 0) { | 
|             meetingDetailResponse.setRoomUser(systemUserService.findById(userRelList.get(MeetConstants.ZERO).getUserId())); | 
|             if( Objects.nonNull(sysUserId) && | 
|                     userRelList.stream().filter(i->Constants.equalsInteger(i.getUserId(),sysUserId)).collect(Collectors.toList()).size()>Constants.ZERO | 
|             ){ | 
|                 meetingDetailResponse.setIsAdmin(Constants.ONE); | 
|             } | 
|         } | 
|   | 
|         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); | 
|         bookings.setJoinNotice(bookingsRequest.getJoinNotice()); | 
|         if (Objects.isNull(bookingsRequest.getId())) { | 
|             this.create(bookings); | 
|             return bookings.getId(); | 
|         } else { | 
|             this.updateById(bookings); | 
|             return bookings.getId(); | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 会议预约记录取消 | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = {Exception.class,BusinessException.class}) | 
|     public void reservationCancel(BusinessOverDTO businessOverDTO) { | 
|         Bookings bookings = bookingsMapper.selectById(businessOverDTO.getId()); | 
|         if (Objects.isNull(bookings)) { | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录"); | 
|         } | 
|   | 
| //        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); | 
|         //会议室管理员 | 
|         MPJLambdaWrapper<UserRel> param = new MPJLambdaWrapper<>(); | 
|         param.selectAll(UserRel.class); | 
|         param.eq(UserRel::getObjType, MeetConstants.ZERO); | 
|         param.eq(UserRel::getIsdeleted, MeetConstants.ZERO); | 
|         param.eq(UserRel::getObjId, bookings.getRoomId()); | 
|         List<UserRel> adminList = userRelJoinMapper.selectJoinList(UserRel.class, param); | 
|         Integer hasRole =getHasRoleByParam(bookings,businessOverDTO.getLoginUser(),adminList); | 
|   | 
| //        if (!bookings.getCreator().equals(businessOverDTO.getUserId())) { | 
|         if (!Constants.equalsInteger(hasRole,Constants.ONE)) { | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,只有会议室管理员和申请人才能进行该操作哦!"); | 
|         } | 
|         if (Objects.nonNull(bookings.getStartTimeReal()) && System.currentTimeMillis() > bookings.getStartTimeReal().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(businessOverDTO.getUserId()); | 
|         bookings.setCancelInfo(businessOverDTO.getBusinessRemark()); | 
|         bookings.setStatus(MeetConstants.ONE); | 
|         bookings.setEditDate(new Date()); | 
|         bookings.setEditor(businessOverDTO.getUserId()); | 
|         Rooms rooms = roomsMapper.selectById(bookings.getRoomId()); | 
|         if(Objects.nonNull(rooms)){ | 
|             bookings.setRoomName(rooms.getName()); | 
|         } | 
|         bookingsMapper.updateById(bookings); | 
|         //取消会议 发送取消通知 | 
|         if(Constants.equalsInteger(bookings.getJoinNotice(),Constants.ZERO)){ | 
| //            this.sendNotice(bookings, 3); | 
|             SystemUser systemUser = systemUserMapper.selectById(bookings.getCreator()); | 
|             bookings.setManagerInfo(systemUser.getRealname()); | 
|             this.sendWxNotice(bookings,Objects.isNull(systemUser)||StringUtils.isBlank(systemUser.getOpenid())?null:systemUser.getOpenid(),Constants.ONE); | 
|   | 
|         } | 
|     } | 
|   | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = {Exception.class,BusinessException.class}) | 
|     public void reservationOver(BusinessOverDTO businessOverDTO) { | 
|         if(Objects.isNull(businessOverDTO) | 
|             || Objects.isNull(businessOverDTO.getUserId()) | 
|             || Objects.isNull(businessOverDTO.getId()) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         Bookings bookings = bookingsMapper.selectById(businessOverDTO.getId()); | 
|         if (Objects.isNull(bookings)) { | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录"); | 
|         } | 
|         Long userRelList = userRelMapper.selectCount(new QueryWrapper<UserRel>().lambda() | 
|                 .eq(UserRel::getIsdeleted,Constants.ZERO) | 
|                 .eq(UserRel::getObjId,bookings.getRoomId()) | 
|                 .eq(UserRel::getObjType,Constants.ZERO) | 
|                 .eq(UserRel::getUserId,businessOverDTO.getUserId())); | 
|   | 
|         if (!bookings.getCreator().equals(businessOverDTO.getUserId()) && userRelList <= 0) { | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "非你的预约记录,无法进行该操作"); | 
|         } | 
|         if (System.currentTimeMillis() < bookings.getStartTimeReal().getTime()) { | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议未开始,无法进行结束,如需该操作请使用取消功能"); | 
|         } | 
|         /*if (System.currentTimeMillis() > bookings.getEndTime().getTime()) { | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已结束,无法进行该操作"); | 
|         }*/ | 
|         if(!bookings.getStatus().equals(MeetConstants.ZERO)){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "本次操作失败,会议状态已流转"); | 
|         } | 
|         bookings.setDoneDate(new Date()); | 
|         bookings.setDoneUserId(businessOverDTO.getUserId()); | 
|         bookings.setStatus(MeetConstants.TWO); | 
|         bookings.setEditDate(new Date()); | 
|         bookings.setEditor(businessOverDTO.getUserId()); | 
|         bookingsMapper.updateById(bookings); | 
|   | 
|         //查询所有的预约时间 | 
|         List<BookingTime> bookingTimeList = bookingTimeJoinMapper.selectJoinList(BookingTime.class, | 
|                 new MPJLambdaWrapper<BookingTime>() | 
|                         .selectAll(BookingTime.class) | 
|                         .selectAs(RoomTime::getEndTime,BookingTime::getEndTime) | 
|                         .leftJoin(RoomTime.class,RoomTime::getId,BookingTime::getTimeId) | 
|                         .eq(BookingTime::getBookingId,bookings.getId())); | 
|         //获取当天  只有当天日期内可以处理 | 
|         String today = DateUtil.dateToString(new Date(),"yyyy-mm-dd"); | 
|         //循环标记数据为已删除 不再占用 | 
|         for (BookingTime bookingTime:bookingTimeList) { | 
|             if(DateUtil.getDateFromString(today + " " + bookingTime.getEndTime() +":00").getTime()>System.currentTimeMillis()){ | 
|                 bookingTime.setIsdeleted(Constants.ZERO); | 
|                 bookingTimeJoinMapper.updateById(bookingTime); | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 正常开始 | 
|      * @param businessOverDTO | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = {Exception.class,BusinessException.class}) | 
|     public void start(BusinessOverDTO businessOverDTO) { | 
|         this.startEarly(businessOverDTO); | 
|     } | 
|   | 
|     /** | 
|      * 自动开始会议 | 
|      */ | 
|     @Override | 
|     public void autoStart(){ | 
|         List<Rooms> roomList = roomsMapper.selectList(new QueryWrapper<Rooms>().lambda().eq(Rooms::getIsdeleted,Constants.ZERO).eq(Rooms::getStatus,Constants.ZERO)); | 
|         for (Rooms rooms:roomList) { | 
|             //查询当前会议室是否存在进行中的会议 | 
|             if(bookingsMapper.selectCount(new QueryWrapper<Bookings>().lambda().eq(Bookings::getIsdeleted,Constants.ZERO) | 
|                     .eq(Bookings::getStatus,Constants.ZERO).eq(Bookings::getRoomId,rooms.getId()).isNotNull(Bookings::getStartTimeReal). | 
|                     apply(" DATE_FORMAT(NOW(), '%Y-%m-%d') = DATE_FORMAT(START_TIME, '%Y-%m-%d') ") | 
|             )<=Constants.ZERO){ | 
|                 //根据会议室获取可以开启的会议记录(第一条记录) | 
|                 Bookings bookings = bookingsMapper.selectOne(new QueryWrapper<Bookings>().lambda() | 
|                         .eq(Bookings::getIsdeleted,Constants.ZERO) | 
|                         .eq(Bookings::getStatus,Constants.ZERO) | 
|                         .eq(Bookings::getRoomId,rooms.getId()) | 
|                         .apply(" now() > START_TIME and now() < END_TIME ") | 
|                         .isNull(Bookings::getStartTimeReal) | 
|                         .orderByAsc(Bookings::getStartTime) | 
|                         .last(" limit 1 ") | 
|                 ); | 
|                 if(Objects.nonNull(bookings)){ | 
|                     bookings.setStartTimeReal(new Date()); | 
|                     bookings.setEditDate(bookings.getStartTimeReal()); | 
|                     bookingsMapper.updateById(bookings); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 提前开始 | 
|      * @param businessOverDTO | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = {Exception.class,BusinessException.class}) | 
|     public void startEarly(BusinessOverDTO businessOverDTO) { | 
|         if(Objects.isNull(businessOverDTO) | 
|                 || Objects.isNull(businessOverDTO.getUserId()) | 
|                 || Objects.isNull(businessOverDTO.getStartType()) | 
|                 || Objects.isNull(businessOverDTO.getId()) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         Bookings bookings = bookingsMapper.selectById(businessOverDTO.getId()); | 
|         if (Objects.isNull(bookings)) { | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到预约记录"); | 
|         } | 
|         Long userRelList = userRelMapper.selectCount(new QueryWrapper<UserRel>().lambda() | 
|                 .eq(UserRel::getIsdeleted,Constants.ZERO) | 
|                 .eq(UserRel::getObjId,bookings.getRoomId()) | 
|                 .eq(UserRel::getObjType,Constants.ZERO) | 
|                 .eq(UserRel::getUserId,businessOverDTO.getUserId())); | 
|   | 
|         if (!Constants.equalsInteger(bookings.getCreator(),businessOverDTO.getUserId()) && userRelList <= 0) { | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "非你的预约记录,无法进行该操作"); | 
|         } | 
|         if(!Constants.equalsInteger(bookings.getStatus(),Constants.ZERO)){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议状态已流转,无法进行该操作"); | 
|         } | 
|         if(Objects.nonNull(bookings.getStartTimeReal())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已开始,请勿重复操作"); | 
|         } | 
|         if (System.currentTimeMillis() > bookings.getEndTime().getTime()) { | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "会议已结束,无法进行该操作"); | 
|         } | 
|         if(Constants.equalsInteger(businessOverDTO.getStartType(),Constants.ZERO)){ | 
|             //根据配置获取提前开始的分钟数量 | 
|             String configMinute = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.EARLY_START).getCode(); | 
|             Integer beforeMinutes = StringUtils.isNotBlank(configMinute) ? Integer.valueOf(configMinute) : 120; | 
|             if(DateUtil.afterMinutesDate(bookings.getStartTime(),-beforeMinutes).getTime()>System.currentTimeMillis()){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"会议仅可以提前"+beforeMinutes+"分钟开始"); | 
|             } | 
|             //查询是否存在其他未开始的会议 防止颗粒度与提前开始的问题 | 
|             if(bookingsMapper.selectCount(new QueryWrapper<Bookings>() | 
|                     .lambda() | 
|                     .apply(" now() < START_TIME and   END_TIME <=  '" + DateUtil.DateToStr(bookings.getStartTime(),"yyyy-MM-dd HH:mm:ss") +"'" ) | 
|                     .isNull(Bookings::getStartTimeReal) | 
|                     .isNull(Bookings::getDoneDate) | 
|                     .eq(Bookings::getStatus,Constants.ZERO) | 
|                     .eq(Bookings::getRoomId,bookings.getRoomId()) | 
|                     .ne(Bookings::getId,bookings.getId()) | 
|             )>Constants.ZERO){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在未开启会议,无法开始会议"); | 
|             } | 
|   | 
|             if(bookingsMapper.selectCount(new QueryWrapper<Bookings>() | 
|                     .lambda()  | 
|                     .apply(" ( (  END_TIME > now() and START_TIME < now() ) or  ( END_TIME > now() and  START_TIME_REAL < now() ) ) ") | 
|                     .isNotNull(Bookings::getStartTimeReal) | 
|                     .isNull(Bookings::getDoneDate) | 
|                     .eq(Bookings::getStatus,Constants.ZERO) | 
|                     .eq(Bookings::getRoomId,bookings.getRoomId()) | 
|             )>Constants.ZERO){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前开启时间与其他会议存在冲突,无法开始会议"); | 
|             } | 
|         }else{ | 
|             if(bookings.getStartTime().getTime() > System.currentTimeMillis()){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未到会议申请开始时间,无法开始"); | 
|             } | 
|         } | 
|         bookings.setStartTimeReal(new Date()); | 
|         bookings.setEditDate(new Date()); | 
|         bookings.setEditor(businessOverDTO.getUserId()); | 
|         bookingsMapper.updateById(bookings); | 
|          //更新已结束但未结束的会议信息为已结束 | 
|         bookingsMapper.update(null,new UpdateWrapper<Bookings>() | 
|                 .lambda() | 
|                 .set(Bookings::getStatus,Constants.TWO) | 
|                 .set(Bookings::getDoneDate,new Date()) | 
|                 .set(Bookings::getDoneInfo,"其他会议开始,自动关闭") | 
|                 .apply(" ( END_TIME < now() or ( END_TIME > now() and START_TIME < now() and START_TIME_REAL is null  ) )") | 
|                 .eq(Bookings::getStatus,Constants.ZERO) | 
|                 .ne(Bookings::getId,bookings.getId()) | 
|                 .eq(Bookings::getRoomId,bookings.getRoomId()) | 
|         ); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public RoomDetailResponse getRoomDetail(Integer roomId){ | 
|         Rooms rooms =  roomsMapper.selectById(roomId); | 
|         if(Objects.isNull(rooms) ||  !Constants.equalsInteger(rooms.getIsdeleted(),Constants.ZERO) | 
|          || !Constants.equalsInteger(rooms.getStatus(),Constants.ZERO)){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"会议室信息无效,请联系管理员"); | 
|         } | 
|         RoomDetailResponse response = new RoomDetailResponse(); | 
|         response.setRoomName(rooms.getName()); | 
|         response.setFileType(rooms.getFileType()); | 
|   | 
|         List<Multifile> multifileList = multifileJoinMapper.selectList(new QueryWrapper<Multifile>().lambda() | 
|                 .eq(Multifile::getObjId,roomId) | 
|                 .eq(Multifile::getObjType,Constants.FOUR) | 
|         ); | 
|   | 
|         String prefix = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.MEET_CODE_PREFIX).getCode() ; | 
|         response.setPrefix(prefix); | 
|   | 
|         String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH) | 
|                 .getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); | 
|         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ | 
|             String localPath = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_LOCAL_RESOURCE_PATH) | 
|                     .getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); | 
|             for (Multifile multifile:multifileList) { | 
|                 multifile.setFileurlFull(path + multifile.getFileurl()); | 
|                 multifile.setLocalFileurlFull(localPath + multifile.getFileurl()); | 
|             } | 
|             response.setMultifileList(multifileList); | 
|         } | 
|   | 
|         MPJLambdaWrapper<Bookings> queryWrapper = new MPJLambdaWrapper<Bookings>() | 
|                  .selectAll(Bookings.class) | 
|                  .selectAs(Rooms::getName, Bookings::getRoomName) | 
|                  .selectAs(Rooms::getImgurl, Bookings::getImgurl) | 
|                  .selectAs(Rooms::getFileType, Bookings::getFileType) | 
|                  .selectAs(SystemUser::getRealname, Bookings::getRealName) | 
|                  .leftJoin(Rooms.class, Rooms::getId, Bookings::getRoomId) | 
|                  .leftJoin(SystemUser.class, SystemUser::getId, Bookings::getCreator) | 
|                  .eq(Bookings::getIsdeleted, MeetConstants.ZERO) | 
|                  .eq(Bookings::getStatus, MeetConstants.ZERO) | 
|                  .eq(Rooms::getId, rooms.getId()) | 
|                  .apply(" (  " + | 
|                          " to_days(t.start_time) = to_days(now()) " + | 
|                          " and ( t.START_TIME_REAL is not null or ( t.end_time > now()  and  t.START_TIME_REAL is  null ) ) " + | 
|                          " ) ")//子查询当天的 | 
|                  .orderByAsc(Bookings::getStartTime); | 
|         Integer minute =getNearStartMinut(); | 
|         List<Bookings> meetingList =bookingsMapper.selectJoinList(Bookings.class,queryWrapper); | 
|         List<MeetingListResponse> rList= new ArrayList<>(); | 
|         if(meetingList!=null){ | 
|             log.error(JSONObject.toJSONString(meetingList)); | 
|             for(Bookings s : meetingList){ | 
|                 dealMeetingStatusByModel(s,minute); | 
|                 MeetingListResponse d = new MeetingListResponse(); | 
|                 d.setId(s.getId()); | 
|                 d.setRoomName(s.getRoomName()); | 
|                 d.setBookingUser(s.getRealName()); | 
|                 d.setMeetingStatus(s.getMeetingStatus()); | 
|                 d.setPrefixUrl(path); | 
|                 d.setImgUrl(s.getImgurl()); | 
|                 d.setFileType(s.getFileType()); | 
|                 d.setMeetingDate(DateUtil.getShortTime(s.getStartTime()));// | 
|                 //CONCAT(date_format(a.START_TIME,'%H:%i') , ' ~ ',date_format(a.END_TIME,'%H:%i')) as meetingTime | 
|                 d.setMeetingTime(DateUtil.formatDate(s.getStartTime(),"HH:mm")+"~"+DateUtil.formatDate(s.getEndTime(),"HH:mm")); | 
|                 d.setMeetingName(s.getName()); | 
|                 d.setRemark(s.getRemark()); | 
|                 d.setStartTime(s.getStartTime()); | 
|                 rList.add(d); | 
|             } | 
|         } | 
|         response.setMeetingListResponseList(rList); | 
|         return response; | 
|     } | 
|   | 
|     private Integer getNearStartMinut() { | 
|         String configMinute = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.EARLY_START).getCode(); | 
|         try { | 
|             return  StringUtils.isNotBlank(configMinute) ? Integer.valueOf(configMinute) : 120; | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         } | 
|       return  120; | 
|     } | 
|   | 
|   | 
|     public void dealMeetingStatus(List<MeetingListResponse> meetingResponseList){ | 
|         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(meetingResponseList)){ | 
|             String path = systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.FTP_RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(MeetConstants.FTP, MeetConstants.PROJECTS).getCode(); | 
|             String configMinute = systemDictDataBiz.queryByCode(MeetConstants.SYSTEM, MeetConstants.EARLY_START).getCode(); | 
|             Integer minute = StringUtils.isNotBlank(configMinute) ? Integer.valueOf(configMinute) : 120; | 
|             for (MeetingListResponse m:meetingResponseList) { | 
|                 if(Constants.equalsInteger(m.getStatus(),Constants.ZERO)&&Constants.equalsInteger(m.getMeetingStatus(),Constants.ONE)){ | 
|                     //开始前120分钟 大于当前时间 则显示即将开始 | 
|                     if( | 
|                             DateUtil.afterMinutesDate(m.getStartTime(),-minute).getTime()<=System.currentTimeMillis() | 
|                     ){ | 
|                         m.setMeetingStatus(4); | 
|                     } | 
|                 } | 
|                 m.setPrefixUrl(path); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 定时发送会议 即将开始通知 | 
|      */ | 
|     @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.selectJoinList(UserRel.class,new MPJLambdaWrapper<UserRel>() | 
|                 .selectAll(UserRel.class) | 
|                 .selectAs(SystemUser::getRealname,UserRel::getRealName) | 
|                 .selectAs(SystemUser::getMobile,UserRel::getUserPhone) | 
|                 .leftJoin(SystemUser.class,SystemUser::getId,UserRel::getUserId) | 
|                 .eq(UserRel::getObjType, MeetConstants.ONE) | 
|                 .eq(UserRel::getObjId, bookings.getId()) | 
|                 .eq(UserRel::getIsdeleted, MeetConstants.ZERO) | 
|         ); | 
|         List<SmsEmail> smsEmailList = new ArrayList<>(); | 
|         List<Notices> noticeList = new ArrayList<>(); | 
|         SmsConfig smsConfig = null; | 
|         Constants.NoticeObjectType noticeObjectType = Constants.NoticeObjectType.MEETING_START; | 
|         if (sendType.equals(MeetConstants.THREE)){ | 
|             noticeObjectType = Constants.NoticeObjectType.MEETING_CACEL; | 
|             smsConfig   = smsConfigMapper.selectOne(new QueryWrapper<SmsConfig>().lambda().eq(SmsConfig::getCode, | 
|                             SmsConstants.meetingContent.meetingBookCancel) | 
|                     .eq(SmsConfig::getIsdeleted,Constants.ZERO) | 
|                     .last(" limit 1 ")); | 
|         }else   if (sendType.equals(MeetConstants.TWO)){ | 
|             noticeObjectType = Constants.NoticeObjectType.MEETING_BOOK_SUCCESS; | 
|             smsConfig   = smsConfigMapper.selectOne(new QueryWrapper<SmsConfig>().lambda().eq(SmsConfig::getCode, | 
|                     SmsConstants.meetingContent.meetingBookJoinUser) | 
|                     .eq(SmsConfig::getIsdeleted,Constants.ZERO) | 
|                     .last(" limit 1 ")); | 
|         } | 
|         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); | 
|                 if (smsConfig!=null && Constants.equalsInteger(smsConfig.getStatus(),Constants.ZERO)){ | 
|                     SmsEmail smsEmail = new SmsEmail(); | 
|                     //{参会人员姓名},您好!您有一个新的会议,会议主题:{会议主题},会议地点:{会议室名称},会议时间:{会议时间段},请按时参加 | 
|                     String timeInfo =DateUtil.getFomartDate( bookings.getStartTime(),"MM/dd HH:mm")+"-" | 
|                             +DateUtil.getFomartDate( bookings.getEndTime(),"HH:mm"); | 
|                     smsEmail.setPhone(i.getUserPhone()); | 
|                     smsEmail.setRemark("等待发送"); | 
|                     smsEmail.setStatus(Constants.TWO);// | 
|                     smsEmail.setIsdeleted(Constants.ZERO); | 
|                     smsEmail.setType(Constants.ZERO); | 
|                     smsEmail.setObjType(Constants.FIVE.toString()); | 
|                     smsEmail.setObjId(bookings.getId()); | 
|                     smsEmail.setCreateDate(new Date()); | 
|                     smsEmail.setTitle("会议室申请参会通知"); | 
|                     smsEmail.setContent(StringUtils.defaultString(smsConfig.getContent(),"") | 
|                             .replace("{参会人员姓名}",StringUtils.defaultString(i.getRealName(),"")) | 
|                             .replace("{会议主题}",StringUtils.defaultString(bookings.getName(),"")) | 
|                             .replace("{会议室名称}",StringUtils.defaultString(bookings.getRoomName(),"")) | 
|                             .replace("{会议时间段}",StringUtils.defaultString(timeInfo,"")) | 
|                             .replace("{会议备注}",StringUtils.defaultString(bookings.getRemark(),"无"))); | 
|                     smsEmailList.add(smsEmail); | 
|                 } | 
|             } | 
|         } | 
|         //给创建人发送短信信息 | 
|         SystemUser systemUser = systemUserMapper.selectById(bookings.getCreator()); | 
|         if(Objects.nonNull(systemUser)){ | 
|             if(userRelList.stream().filter(i->Constants.equalsInteger(i.getUserId(),systemUser.getId())).collect(Collectors.toList()).size()==Constants.ZERO){ | 
|                 if (smsConfig!=null && Constants.equalsInteger(smsConfig.getStatus(),Constants.ZERO)){ | 
|                     SmsEmail smsEmail = new SmsEmail(); | 
|                     //{参会人员姓名},您好!您有一个新的会议,会议主题:{会议主题},会议地点:{会议室名称},会议时间:{会议时间段},请按时参加 | 
|                     String timeInfo =DateUtil.getFomartDate( bookings.getStartTime(),"MM/dd HH:mm")+"-" | 
|                             +DateUtil.getFomartDate( bookings.getEndTime(),"HH:mm"); | 
|                     smsEmail.setPhone(systemUser.getMobile()); | 
|                     smsEmail.setRemark("等待发送"); | 
|                     smsEmail.setStatus(Constants.TWO);// | 
|                     smsEmail.setIsdeleted(Constants.ZERO); | 
|                     smsEmail.setType(Constants.ZERO); | 
|                     smsEmail.setObjId(bookings.getId()); | 
|                     smsEmail.setCreateDate(new Date()); | 
|                     smsEmail.setTitle("会议室申请参会通知"); | 
|                     smsEmail.setContent(StringUtils.defaultString(smsConfig.getContent(),"") | 
|                             .replace("{参会人员姓名}",StringUtils.defaultString(systemUser.getRealname(),"")) | 
|                             .replace("{会议主题}",StringUtils.defaultString(bookings.getName(),"")) | 
|                             .replace("{会议室名称}",StringUtils.defaultString(bookings.getRoomName(),"")) | 
|                             .replace("{会议备注}",StringUtils.defaultString(bookings.getRemark(),"无")) | 
|                             .replace("{会议时间段}",StringUtils.defaultString(timeInfo,""))); | 
|                     smsEmailList.add(smsEmail); | 
|                 } | 
|             } | 
|         } | 
|         //给参会人员插入 | 
|         Notices notices = new Notices(noticeObjectType,bookings.getId(),noticeObjectType.getInfo(),bookings.getCreator(), Constants.ZERO); | 
|         noticeList.add(notices); | 
|         if(noticeList.size()>0){ | 
|             noticesMapper.insert(noticeList); | 
|         } | 
|         if(smsEmailList.size()>0){ | 
|             smsEmailMapper.insert(smsEmailList);//待发短信数据 | 
|         } | 
|     } | 
|   | 
|   | 
|     @Async | 
|     public void sendWxNotice(Bookings bookings,String openid, Integer sendType) { | 
|         try{ | 
|             List<UserRel> userRelList = userRelMapper.selectJoinList(UserRel.class,new MPJLambdaWrapper<UserRel>() | 
|                     .selectAll(UserRel.class) | 
|                     .selectAs(SystemUser::getRealname,UserRel::getRealName) | 
|                     .selectAs(SystemUser::getMobile,UserRel::getUserPhone) | 
|                     .selectAs(SystemUser::getOpenid,UserRel::getOpenid) | 
|                     .leftJoin(SystemUser.class,SystemUser::getId,UserRel::getUserId) | 
| //                    .eq(UserRel::getObjType, MeetConstants.ONE) | 
|                     .eq(UserRel::getObjId, bookings.getId()) | 
|                     .eq(UserRel::getIsdeleted, MeetConstants.ZERO) | 
|                     .isNotNull(SystemUser::getOpenid) | 
|             ); | 
|             List<String> openIdList = userRelList.stream().map(i->i.getOpenid()).collect(Collectors.toList()); | 
|             openIdList.add(openid); | 
|             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(openIdList)){ | 
|                 return; | 
|             } | 
|             Set<String> openIds = new HashSet<String>(openIdList); | 
|             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(openIds)){ | 
|                 WxPlatNotice wxPlatNotice = new WxPlatNotice(); | 
|                 if(Constants.equalsInteger(sendType,Constants.ZERO)){ | 
|                     wxPlatNotice.sendMeetingBookTemplateNotice(systemDictDataBiz,bookings,"CuoDoxOl6SFwi4NhNgOQgKSJVjDD4VCIaPYlnbv_zdY", | 
|                             systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),openIds); | 
|                 }else if(Constants.equalsInteger(sendType,Constants.ONE)){ | 
|                     wxPlatNotice.sendMeetingBookCancelTemplateNotice(systemDictDataBiz,bookings,"CiB6vCT2InovAoQfudY-lvzLSV0-3lfz3a5GsSFCzd8", | 
|                             systemDictDataBiz.queryByCode(Constants.WX_PLATFORM, Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),openIds); | 
|                 } | 
|             } | 
|         }catch (Exception e){ | 
|   | 
|         } | 
|   | 
|   | 
|     } | 
|   | 
|   | 
|     @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("d.COMPANY_NAME_PATH", pageWrap.getModel().getKeyword()) | 
|                 ) | 
|                 .eq("c.DELETED",0) | 
|                 .eq("c.status",0) | 
|                 .eq("m.WORK_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>() .lambda() | 
|                     .eq(Bookings::getIsdeleted,Constants.ZERO) | 
|                     .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(Bookings::getStartTime, pageWrap.getModel().getStartTime()+":00",pageWrap.getModel().getEndTime()+":00") | 
|                             .or().between(Bookings::getEndTime, pageWrap.getModel().getStartTime()+":00",pageWrap.getModel().getEndTime()+":00") | 
|                     ) | 
|             )>Constants.ZERO){ | 
|                 j.setStatus(Constants.ONE); | 
|             }else{ | 
|                 j.setStatus(Constants.ZERO); | 
|             } | 
|         }); | 
|         return page; | 
|     } | 
|   | 
|   | 
|   | 
| } |