Prechádzať zdrojové kódy

1、结束和取消会议
2、会议室同一时间不能重复预定

dongpo 1 rok pred
rodič
commit
a40c2c0bc9

+ 3 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java

@@ -138,4 +138,7 @@ public interface ErrorCodeConstants {
     ErrorCode OA_MEETING_RESERVE_START_TIME_LESS_THAN_END_TIME = new ErrorCode(1_009_018_012, "会议室预定开始时间必须早于结束时间");
     ErrorCode OA_MEETING_RESERVE_START_TIME_MORE_THAN_NOW = new ErrorCode(1_009_018_013, "会议室预定开始时间不能早于当前时间");
     ErrorCode OA_MEETING_RESERVE_START_TIME_MORE_THAN_FIVE_MINUTES = new ErrorCode(1_009_018_014, "会议开始前5分钟后不能修改");
+    ErrorCode OA_MEETING_RESERVE_STATUS_NOT_WAITING_CAN_NOT_CANCEL = new ErrorCode(1_009_018_015, "会议未开始的才能取消");
+    ErrorCode OA_MEETING_RESERVE_STATUS_NOT_IN_PROGRESS_CAN_NOT_ENDED = new ErrorCode(1_009_018_016, "会议进行中的才能结束");
+    ErrorCode OA_MEETING_RESERVE_TIME_OCCUPIED = new ErrorCode(1_009_018_017, "该时间段会议室已被占用");
 }

+ 19 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/OaMeetingReserveController.java

@@ -218,4 +218,23 @@ public class OaMeetingReserveController {
                         BeanUtils.toBean(list, OaMeetingReserveRespVO.class));
     }
 
+    @GetMapping("/cancel")
+    @Operation(summary = "取消会议室预定管理信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:cancel')")
+    public CommonResult<Boolean> cancelOaMeetingReserve(@RequestParam("id") Long id) {
+        oaMeetingReserveService.cancelOaMeetingReserve(id);
+        return success(true);
+    }
+
+    @GetMapping("/end")
+    @Operation(summary = "结束会议室预定管理信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:end')")
+    public CommonResult<Boolean> endOaMeetingReserve(@RequestParam("id") Long id) {
+        oaMeetingReserveService.endOaMeetingReserve(id);
+        return success(true);
+    }
+
+
 }

+ 16 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/reserve/OaMeetingReserveService.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.module.bpm.service.meeting.reserve;
 
-import javax.validation.*;
-
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReservePageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReserveSaveReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.meeting.reserve.OaMeetingReserveDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+import javax.validation.Valid;
 
 /**
  * 会议室预定管理信息 Service 接口
@@ -52,4 +52,17 @@ public interface OaMeetingReserveService {
      */
     PageResult<OaMeetingReserveDO> getOaMeetingReservePage(OaMeetingReservePageReqVO pageReqVO);
 
+    /**
+     * 取消会议室预定管理信息
+     *
+     * @param id 主键id
+     */
+    void cancelOaMeetingReserve(Long id);
+
+    /**
+     * 结束会议室预定管理信息
+     *
+     * @param id 主键id
+     */
+    void endOaMeetingReserve(Long id);
 }

+ 52 - 8
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/reserve/OaMeetingReserveServiceImpl.java

@@ -2,23 +2,21 @@ package cn.iocoder.yudao.module.bpm.service.meeting.reserve;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReservePageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReserveSaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.meeting.reserve.OaMeetingReserveDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.meeting.reserve.OaMeetingReserveMapper;
 import cn.iocoder.yudao.module.bpm.enums.MeetingReserveStatusEnum;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 
-import cn.iocoder.yudao.module.bpm.dal.dataobject.meeting.reserve.OaMeetingReserveDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-
-import cn.iocoder.yudao.module.bpm.dal.mysql.meeting.reserve.OaMeetingReserveMapper;
-
-import java.time.LocalDate;
+import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
@@ -60,6 +58,18 @@ public class OaMeetingReserveServiceImpl implements OaMeetingReserveService {
         if (startTime.compareTo(nowTime) < 0) {
             throw exception(OA_MEETING_RESERVE_START_TIME_MORE_THAN_NOW);
         }
+        // 校验时间是否已占用
+        LambdaQueryWrapper<OaMeetingReserveDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaMeetingReserveDO::getRoomId, createReqVO.getRoomId())
+                .ne(OaMeetingReserveDO::getStatus, MeetingReserveStatusEnum.ENDED.getStatus())
+                .ne(OaMeetingReserveDO::getStatus, MeetingReserveStatusEnum.CANCELED.getStatus())
+                .and(wrapper -> wrapper.eq(OaMeetingReserveDO::getStartTime, startTime)
+                        .or().eq(OaMeetingReserveDO::getEndTime, endTime)
+                        .or().between(OaMeetingReserveDO::getStartTime, startTime, endTime)
+                        .or().between(OaMeetingReserveDO::getEndTime, startTime, endTime));
+        if (oaMeetingReserveMapper.selectCount(lambdaQueryWrapper) > 0) {
+            throw exception(OA_MEETING_RESERVE_TIME_OCCUPIED);
+        }
         // 插入
         OaMeetingReserveDO oaMeetingReserve = BeanUtils.toBean(createReqVO, OaMeetingReserveDO.class);
         oaMeetingReserve.setReserveUuid(IdUtil.fastSimpleUUID());
@@ -110,6 +120,20 @@ public class OaMeetingReserveServiceImpl implements OaMeetingReserveService {
             throw exception(OA_MEETING_RESERVE_START_TIME_MORE_THAN_FIVE_MINUTES);
         }
 
+        // 校验时间是否已占用
+        LambdaQueryWrapper<OaMeetingReserveDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(OaMeetingReserveDO::getRoomId, updateReqVO.getRoomId())
+                .ne(OaMeetingReserveDO::getStatus, MeetingReserveStatusEnum.ENDED.getStatus())
+                .ne(OaMeetingReserveDO::getStatus, MeetingReserveStatusEnum.CANCELED.getStatus())
+                .ne(OaMeetingReserveDO::getId, updateReqVO.getId())
+                .and(wrapper -> wrapper.eq(OaMeetingReserveDO::getStartTime, startTime)
+                        .or().eq(OaMeetingReserveDO::getEndTime, endTime)
+                        .or().between(OaMeetingReserveDO::getStartTime, startTime, endTime)
+                        .or().between(OaMeetingReserveDO::getEndTime, startTime, endTime));
+        if (oaMeetingReserveMapper.selectCount(lambdaQueryWrapper) > 0) {
+            throw exception(OA_MEETING_RESERVE_TIME_OCCUPIED);
+        }
+
         // 更新
         OaMeetingReserveDO updateObj = BeanUtils.toBean(updateReqVO, OaMeetingReserveDO.class);
         updateObj.setApplyEmployeeId(user.getId());
@@ -154,4 +178,24 @@ public class OaMeetingReserveServiceImpl implements OaMeetingReserveService {
         return oaMeetingReserveMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public void cancelOaMeetingReserve(Long id) {
+        OaMeetingReserveDO oaMeetingReserveDO = validateOaMeetingReserveExists(id);
+        String status = oaMeetingReserveDO.getStatus();
+        if (!MeetingReserveStatusEnum.WAITING.getStatus().equals(status)) {
+            throw exception(OA_MEETING_RESERVE_STATUS_NOT_WAITING_CAN_NOT_CANCEL);
+        }
+        oaMeetingReserveMapper.updateById(OaMeetingReserveDO.builder().id(id).status(MeetingReserveStatusEnum.CANCELED.getStatus()).build());
+    }
+
+    @Override
+    public void endOaMeetingReserve(Long id) {
+        OaMeetingReserveDO oaMeetingReserveDO = validateOaMeetingReserveExists(id);
+        String status = oaMeetingReserveDO.getStatus();
+        if (!MeetingReserveStatusEnum.IN_PROGRESS.getStatus().equals(status)) {
+            throw exception(OA_MEETING_RESERVE_STATUS_NOT_IN_PROGRESS_CAN_NOT_ENDED);
+        }
+        oaMeetingReserveMapper.updateById(OaMeetingReserveDO.builder().id(id).status(MeetingReserveStatusEnum.ENDED.getStatus()).build());
+    }
+
 }