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 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 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 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 detailDataDtoStream = bookList.stream().filter(a -> MeetConstants.equalsInteger(s.getTimeId(), a.getRoomTimeId()) ).collect(Collectors.toList()); if (detailDataDtoStream.size() > 0) { if (bookings.getId() != null) { //编辑 List 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 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 updateWrapper = new QueryWrapper(); 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 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 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 deleteWrapper = new UpdateWrapper<>(bookings); bookingsMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids,LoginUserInfo user) { if (CollectionUtils.isEmpty(ids)) { return; } Bookings bookings = new Bookings(); for(int i=0;i 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 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 wrapper = new QueryWrapper<>(bookings); return bookingsMapper.selectOne(wrapper); } @Override public List findList(Bookings bookings) { QueryWrapper wrapper = new QueryWrapper<>(bookings); return bookingsMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper 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 result = bookingsJoinMapper.selectJoinPage(page, Bookings.class, queryWrapper); result.getRecords().stream().forEach(s -> { dealMeetingStatusByModel(s,minute); MPJLambdaWrapper bookquery = new MPJLambdaWrapper<>(); bookquery.eq(Multifile::getIsdeleted, MeetConstants.ZERO); bookquery.eq(Multifile::getObjId, s.getId()); List 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 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 userrelList = userRelJoinMapper.selectJoinList(UserRel.class, urquery); s.setSysList(userrelList); //会议室管理员 MPJLambdaWrapper param = new MPJLambdaWrapper<>(); urquery.selectAll(UserRel.class); urquery.eq(UserRel::getObjType, MeetConstants.ZERO); urquery.eq(UserRel::getIsdeleted, MeetConstants.ZERO); urquery.eq(UserRel::getObjId, s.getRoomId()); List adminList = userRelJoinMapper.selectJoinList(UserRel.class, urquery); s.setAdminList(adminList); //查询是否有权限 s.setHasRole(getHasRoleByParam(s,userInfo,adminList)); /* //服务项 MPJLambdaWrapper 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 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 adminList){ if(Constants.equalsInteger(userInfo.getId(),s.getCreator()) ){ return 1; } if(adminList!=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 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 bookquery = new MPJLambdaWrapper<>(); bookquery.eq(Multifile::getIsdeleted, MeetConstants.ZERO); bookquery.eq(Multifile::getObjId, result.getId()); List 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 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 getMyBookings(Integer userId, String dateMsg,Integer queryType) { if(queryType==null ){ queryType =1; } return bookingsMapper.selectJoinList(Bookings.class,new MPJLambdaWrapper() .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 getMyMeetingPageNew(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper 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 result = bookingsJoinMapper.selectJoinPage(page, Bookings.class, queryWrapper); return result; } @Override public IPage getMyMeetingPage(PageWrap pageWrap) { QueryWrapper queryWrapper = new QueryWrapper() .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 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().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().lambda() .eq(BookingTime::getBookingId, id) .eq(BookingTime::getIsdeleted, MeetConstants.ZERO) )); //参会人员列表 List 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 projectsResponseList = projectsService.getProjectsList(id, MeetConstants.ONE); projectsResponseList.forEach(i -> { i.setPrefixUrl(projectsPath); }); meetingDetailResponse.setProjectsResponseList(projectsResponseList); List multiFileList = multifileMapper.selectList(new QueryWrapper().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 userRelList = userRelMapper.selectList(new QueryWrapper().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(), "未查询到预约记录"); } if (!bookings.getCreator().equals(businessOverDTO.getUserId())) { 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().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 bookingTimeList = bookingTimeJoinMapper.selectJoinList(BookingTime.class, new MPJLambdaWrapper() .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 roomList = roomsMapper.selectList(new QueryWrapper().lambda().eq(Rooms::getIsdeleted,Constants.ZERO).eq(Rooms::getStatus,Constants.ZERO)); for (Rooms rooms:roomList) { //查询当前会议室是否存在进行中的会议 if(bookingsMapper.selectCount(new QueryWrapper().lambda().eq(Bookings::getIsdeleted,Constants.ZERO) .eq(Bookings::getStatus,Constants.ZERO).isNotNull(Bookings::getStartTimeReal) )<=Constants.ZERO){ //根据会议室获取可以开启的会议记录(第一条记录) Bookings bookings = bookingsMapper.selectOne(new QueryWrapper().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 ") ); bookings.setStartTimeReal(new Date()); bookings.setEditDate(new Date()); 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().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() .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() .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() .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 multifileList = multifileJoinMapper.selectList(new QueryWrapper().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 queryWrapper = new MPJLambdaWrapper() .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 meetingList =bookingsMapper.selectJoinList(Bookings.class,queryWrapper); List 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 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 bookingsList = bookingsMapper.selectList(new QueryWrapper() .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 userRelList = userRelMapper.selectJoinList(UserRel.class,new MPJLambdaWrapper() .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 smsEmailList = new ArrayList<>(); List 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().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().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 userRelList = userRelMapper.selectJoinList(UserRel.class,new MPJLambdaWrapper() .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 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 openIds = new HashSet(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 getMyJoinBookingMeet(Integer userId, Integer roomId, LocalDateTime startTime, LocalDateTime endTime) { DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); SimpleDateFormat fmt1 =new SimpleDateFormat("HH:mm"); MPJLambdaWrapper 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 = 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 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 myJoinBookingMeet = getMyJoinBookingMeet(userId, roomId, monthFirst, monthLast); Map> 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 list = new ArrayList<>(); List bookings1 = new ArrayList<>(); for (int i = 1; i <= dayOfMonth; i++) { DateTimeResourceDate timeResource = new DateTimeResourceDate(); timeResource.setLocalDate(LocalDate.of(year, monthValue, i)); List bookings = collect.get(timeResource.getLocalDate()); if (bookings != null) { timeResource.setResource(bookings); } else { timeResource.setResource(bookings1); } list.add(timeResource); } return list; } @Override public List getRoomStatistics(Integer yearNum) { return bookingsMapper.getRoomStatistics(yearNum); } @Override public PageData getUserStatistics(PageWrap pageWrap) { IPage userStatistics = bookingsMapper.getUserStatistics(pageWrap.toPage(), pageWrap.getModel().getYearNum(), pageWrap.getModel().getUserId()); return PageData.from(userStatistics); } /** * 查询参会人员分页 * @param pageWrap * @return */ @Override public IPage getUserPage(PageWrap pageWrap) { IPage page = systemUserMapper.getUserPage(pageWrap.toPage(),new QueryWrapper() .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() .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; } }