Ver código fonte

1、会议室预定信息CRUD接口

dongpo 1 ano atrás
pai
commit
a571a876f9
12 arquivos alterados com 357 adições e 82 exclusões
  1. 41 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/metting/room/vo/OaMeetingRoomRespDTO.java
  2. 3 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
  3. 25 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/MeetingReserveStatusEnum.java
  4. 135 10
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/OaMeetingReserveController.java
  5. 0 38
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/vo/OaMeetingReservePageReqVO.java
  6. 31 15
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/vo/OaMeetingReserveRespVO.java
  7. 8 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/vo/OaMeetingReserveSaveReqVO.java
  8. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/meeting/reserve/OaMeetingReserveDO.java
  9. 0 11
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/meeting/reserve/OaMeetingReserveMapper.java
  10. 88 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/reserve/OaMeetingReserveServiceImpl.java
  11. 11 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/room/OaMeetingRoomService.java
  12. 14 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/room/OaMeetingRoomServiceImpl.java

+ 41 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/metting/room/vo/OaMeetingRoomRespDTO.java

@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.bpm.api.metting.room.vo;
+
+import lombok.Data;
+
+@Data
+public class OaMeetingRoomRespDTO {
+
+    /**
+     * 主键id
+     */
+    private Long id;
+    /**
+     * 会议室uuid
+     */
+    private String roomUuid;
+    /**
+     * 会议室名称
+     */
+    private String name;
+    /**
+     * 可容纳人数
+     */
+    private String size;
+    /**
+     * 管理员id
+     */
+    private Long managerId;
+    /**
+     * 管理员uuid
+     */
+    private String managerUuid;
+    /**
+     * 管理员姓名
+     */
+    private String managerName;
+    /**
+     * 备注
+     */
+    private String remarks;
+
+}

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

@@ -135,4 +135,7 @@ public interface ErrorCodeConstants {
     ErrorCode OA_EXPENSE_OBJ_END_DATE_NULL = new ErrorCode(1_009_018_010, "报销子项结束日期不能为空");
     // ========== 用印印章信息 1_009_018_011 ==========
     ErrorCode OA_STAMP_SEAL_NOT_EXISTS = new ErrorCode(1_009_018_011, "用印印章信息不存在");
+    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分钟后不能修改");
 }

+ 25 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/MeetingReserveStatusEnum.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.bpm.enums;
+
+public enum MeetingReserveStatusEnum {
+
+    WAITING("1", "未开始"),
+    IN_PROGRESS("2", "进行中"),
+    ENDED("3", "已结束"),
+    CANCELED("4", "已取消");
+
+    private final String status;
+    private final String desc;
+
+    MeetingReserveStatusEnum(String status, String desc) {
+        this.status = status;
+        this.desc = desc;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

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

@@ -1,8 +1,20 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.module.bpm.api.metting.room.vo.OaMeetingRoomRespDTO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReservePageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReserveRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.reserve.vo.OaMeetingReserveSaveReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomRespVO;
+import cn.iocoder.yudao.module.bpm.enums.MeetingReserveStatusEnum;
+import cn.iocoder.yudao.module.bpm.service.meeting.room.OaMeetingRoomService;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -15,6 +27,8 @@ import javax.validation.*;
 import javax.servlet.http.*;
 import java.util.*;
 import java.io.IOException;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -39,16 +53,25 @@ public class OaMeetingReserveController {
     @Resource
     private OaMeetingReserveService oaMeetingReserveService;
 
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @Resource
+    private DeptApi deptApi;
+
+    @Resource
+    private OaMeetingRoomService oaMeetingRoomService;
+
     @PostMapping("/create")
     @Operation(summary = "创建会议室预定管理信息")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:create')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:create')")
     public CommonResult<Long> createOaMeetingReserve(@Valid @RequestBody OaMeetingReserveSaveReqVO createReqVO) {
         return success(oaMeetingReserveService.createOaMeetingReserve(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新会议室预定管理信息")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:update')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:update')")
     public CommonResult<Boolean> updateOaMeetingReserve(@Valid @RequestBody OaMeetingReserveSaveReqVO updateReqVO) {
         oaMeetingReserveService.updateOaMeetingReserve(updateReqVO);
         return success(true);
@@ -57,7 +80,7 @@ public class OaMeetingReserveController {
     @DeleteMapping("/delete")
     @Operation(summary = "删除会议室预定管理信息")
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:delete')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:delete')")
     public CommonResult<Boolean> deleteOaMeetingReserve(@RequestParam("id") Long id) {
         oaMeetingReserveService.deleteOaMeetingReserve(id);
         return success(true);
@@ -65,24 +88,126 @@ public class OaMeetingReserveController {
 
     @GetMapping("/get")
     @Operation(summary = "获得会议室预定管理信息")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:query')")
+    @Parameter(name = "id", description = "编号", required = true, example = "2")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:query')")
     public CommonResult<OaMeetingReserveRespVO> getOaMeetingReserve(@RequestParam("id") Long id) {
         OaMeetingReserveDO oaMeetingReserve = oaMeetingReserveService.getOaMeetingReserve(id);
-        return success(BeanUtils.toBean(oaMeetingReserve, OaMeetingReserveRespVO.class));
+        OaMeetingReserveRespVO oaMeetingReserveRespVO = BeanUtils.toBean(oaMeetingReserve, OaMeetingReserveRespVO.class);
+        String participants = oaMeetingReserve.getParticipants();
+        if (StrUtil.isNotBlank(participants)) {
+            String[] participantsStringArray = participants.split(",");
+            List<Long> participantsLongList = Arrays.stream(participantsStringArray).map(Long::valueOf).collect(Collectors.toList());
+            oaMeetingReserveRespVO.setParticipants(participantsLongList);
+
+            List<AdminUserRespDTO> userList = adminUserApi.getUserList(participantsLongList);
+            String participantsName = userList.stream().map(AdminUserRespDTO::getNickname).collect(Collectors.joining(","));
+            oaMeetingReserveRespVO.setParticipantsName(participantsName);
+        } else {
+            oaMeetingReserveRespVO.setParticipants(Collections.emptyList());
+        }
+        // 申请人
+        Long applyEmployeeId = oaMeetingReserve.getApplyEmployeeId();
+        if (applyEmployeeId != null) {
+            AdminUserRespDTO user = adminUserApi.getUser(applyEmployeeId);
+            oaMeetingReserveRespVO.setApplyEmployeeName(user.getNickname());
+        }
+        // 状态描述
+        String status = oaMeetingReserve.getStatus();
+        Map<String, String> enumsMap = Arrays.stream(MeetingReserveStatusEnum.values())
+                .collect(Collectors.toMap(MeetingReserveStatusEnum::getStatus, MeetingReserveStatusEnum::getDesc));
+        oaMeetingReserveRespVO.setStatusDesc(enumsMap.get(status));
+        // 部门名称
+        Long deptId = oaMeetingReserve.getDeptId();
+        if (deptId != null) {
+            DeptRespDTO dept = deptApi.getDept(deptId);
+            if (dept != null) {
+                oaMeetingReserveRespVO.setDepName(dept.getName());
+            }
+        }
+
+        return success(oaMeetingReserveRespVO);
     }
 
     @GetMapping("/page")
     @Operation(summary = "获得会议室预定管理信息分页")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:query')")
-    public CommonResult<PageResult<OaMeetingReserveRespVO>> getOaMeetingReservePage(@Valid OaMeetingReservePageReqVO pageReqVO) {
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:query')")
+    public CommonResult<PageResult<OaMeetingReserveRespVO>> getOaMeetingReservePage(@Valid @ParameterObject OaMeetingReservePageReqVO pageReqVO) {
         PageResult<OaMeetingReserveDO> pageResult = oaMeetingReserveService.getOaMeetingReservePage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, OaMeetingReserveRespVO.class));
+        // List<OaMeetingReserveDO> oaMeetingReserveDOList = pageResult.getList();
+        PageResult<OaMeetingReserveRespVO> voPageResult = BeanUtils.toBean(pageResult, OaMeetingReserveRespVO.class);
+        List<OaMeetingReserveRespVO> oaMeetingReserveRespVOList = voPageResult.getList();
+        if (oaMeetingReserveRespVOList.size() > 0) {
+            // 申请人
+            List<Long> applyEmployeeIds = oaMeetingReserveRespVOList.stream().map(OaMeetingReserveRespVO::getApplyEmployeeId).collect(Collectors.toList());
+            List<AdminUserRespDTO> userList = adminUserApi.getUserList(applyEmployeeIds);
+            Map<Long, AdminUserRespDTO> userMap = userList.stream().collect(Collectors.toMap(AdminUserRespDTO::getId, Function.identity()));
+
+            // // 参与人
+            // List<Long> participantEmployeeIds = new ArrayList<>();
+            // for (OaMeetingReserveDO oaMeetingReserveDO : oaMeetingReserveDOList) {
+            //     String participants = oaMeetingReserveDO.getParticipants();
+            //     if (StrUtil.isNotBlank(participants)) {
+            //         String[] participantsStringArray = participants.split(",");
+            //         List<Long> participantsLongList = Arrays.stream(participantsStringArray).map(Long::valueOf).collect(Collectors.toList());
+            //         participantEmployeeIds.addAll(participantsLongList);
+            //     }
+            // }
+            // List<AdminUserRespDTO> participantUserList = adminUserApi.getUserList(participantEmployeeIds);
+            // Map<Long, AdminUserRespDTO> participantUserMap = participantUserList.stream().collect(Collectors.toMap(AdminUserRespDTO::getId, Function.identity()));
+
+            // 状态描述
+            Map<String, String> enumsMap = Arrays.stream(MeetingReserveStatusEnum.values())
+                    .collect(Collectors.toMap(MeetingReserveStatusEnum::getStatus, MeetingReserveStatusEnum::getDesc));
+
+            // 部门名称
+            List<Long> deptIds = oaMeetingReserveRespVOList.stream().map(OaMeetingReserveRespVO::getDeptId).collect(Collectors.toList());
+            List<DeptRespDTO> deptList = deptApi.getDeptList(deptIds);
+            Map<Long, DeptRespDTO> deptMap = deptList.stream().collect(Collectors.toMap(DeptRespDTO::getId, Function.identity()));
+
+            // 会议室名称
+            List<Long> roomIds = oaMeetingReserveRespVOList.stream().map(OaMeetingReserveRespVO::getRoomId).collect(Collectors.toList());
+            List<OaMeetingRoomRespDTO> roomList = oaMeetingRoomService.getOaMeetingRoomList(roomIds);
+            Map<Long, OaMeetingRoomRespDTO> roomRespDTOMap = roomList.stream().collect(Collectors.toMap(OaMeetingRoomRespDTO::getId, Function.identity()));
+
+            for (OaMeetingReserveRespVO oaMeetingReserveRespVO : oaMeetingReserveRespVOList) {
+                // 申请人姓名
+                Long applyEmployeeId = oaMeetingReserveRespVO.getApplyEmployeeId();
+                if (applyEmployeeId != null) {
+                    AdminUserRespDTO user = userMap.get(applyEmployeeId);
+                    if (user != null) {
+                        oaMeetingReserveRespVO.setApplyEmployeeName(user.getNickname());
+                    }
+                }
+                // // 参与人姓名
+                // String participants = oaMeetingReserveRespVO.getParticipants();
+                // 状态描述
+                String status = oaMeetingReserveRespVO.getStatus();
+                oaMeetingReserveRespVO.setStatusDesc(enumsMap.get(status));
+                // 部门名称
+                Long deptId = oaMeetingReserveRespVO.getDeptId();
+                if (deptId != null) {
+                    DeptRespDTO dept = deptMap.get(deptId);
+                    if (dept != null) {
+                        oaMeetingReserveRespVO.setDepName(dept.getName());
+                    }
+                }
+                // 会议室名称
+                Long roomId = oaMeetingReserveRespVO.getRoomId();
+                if (roomId != null) {
+                    OaMeetingRoomRespDTO room = roomRespDTOMap.get(roomId);
+                    if (room != null) {
+                        oaMeetingReserveRespVO.setRoomName(room.getName());
+                    }
+                }
+            }
+        }
+
+        return success(voPageResult);
     }
 
     @GetMapping("/export-excel")
     @Operation(summary = "导出会议室预定管理信息 Excel")
-    @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:export')")
+    // @PreAuthorize("@ss.hasPermission('bpm:oa-meeting-reserve:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportOaMeetingReserveExcel(@Valid OaMeetingReservePageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {

+ 0 - 38
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/vo/OaMeetingReservePageReqVO.java

@@ -14,53 +14,15 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class OaMeetingReservePageReqVO extends PageParam {
-
-    @Schema(description = "预定uuid", example = "22540")
-    private String reserveUuid;
-
     @Schema(description = "会议室id", example = "4529")
     private Long roomId;
 
-    @Schema(description = "会议室uuid", example = "7575")
-    private Long roomUuid;
-
     @Schema(description = "会议名称", example = "赵六")
     private String meetingName;
 
     @Schema(description = "会议开始时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private String[] startTime;
 
     @Schema(description = "会议结束时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private String[] endTime;
-
-    @Schema(description = "申请人id", example = "4108")
-    private Long applyEmployeeId;
-
-    @Schema(description = "申请人手机号")
-    private String applyEmployeePhone;
-
-    @Schema(description = "申请人部门", example = "6719")
-    private String deptId;
-
-    @Schema(description = "参会人数")
-    private String number;
-
-    @Schema(description = "参会人员id,逗号分隔")
-    private String participants;
-
-    @Schema(description = "发送类型:1站内信 2短信 3邮件,目前仅1启用", example = "2")
-    private String sendType;
-
-    @Schema(description = "会议预定状态:1未开始 2进行中 3已结束 4已取消", example = "2")
-    private String status;
-
-    @Schema(description = "会议内容")
-    private String meetingContent;
-
-    @Schema(description = "创建时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] createTime;
-
 }

+ 31 - 15
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/vo/OaMeetingReserveRespVO.java

@@ -13,23 +13,23 @@ import com.alibaba.excel.annotation.*;
 @ExcelIgnoreUnannotated
 public class OaMeetingReserveRespVO {
 
-    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11723")
+    @Schema(description = "主键id")
     @ExcelProperty("主键id")
     private Long id;
 
-    @Schema(description = "预定uuid", example = "22540")
+    @Schema(description = "预定uuid")
     @ExcelProperty("预定uuid")
     private String reserveUuid;
 
-    @Schema(description = "会议室id", example = "4529")
+    @Schema(description = "会议室id")
     @ExcelProperty("会议室id")
     private Long roomId;
 
-    @Schema(description = "会议室uuid", example = "7575")
-    @ExcelProperty("会议室uuid")
-    private Long roomUuid;
+    @Schema(description = "会议室名称", example = "上海会议室")
+    @ExcelProperty("会议室名称")
+    private String roomName;
 
-    @Schema(description = "会议名称", example = "赵六")
+    @Schema(description = "会议名称")
     @ExcelProperty("会议名称")
     private String meetingName;
 
@@ -41,27 +41,39 @@ public class OaMeetingReserveRespVO {
     @ExcelProperty("会议结束时间")
     private String endTime;
 
-    @Schema(description = "申请人id", example = "4108")
+    @Schema(description = "申请人id")
     @ExcelProperty("申请人id")
     private Long applyEmployeeId;
 
+    @Schema(description = "申请人名字")
+    @ExcelProperty("申请人名字")
+    private String applyEmployeeName;
+
     @Schema(description = "申请人手机号")
     @ExcelProperty("申请人手机号")
     private String applyEmployeePhone;
 
-    @Schema(description = "申请人部门", example = "6719")
+    @Schema(description = "申请人部门")
     @ExcelProperty("申请人部门")
-    private String deptId;
+    private Long deptId;
+
+    @Schema(description = "申请人部门名称")
+    @ExcelProperty("申请人部门名称")
+    private String depName;
 
     @Schema(description = "参会人数")
     @ExcelProperty("参会人数")
     private String number;
 
-    @Schema(description = "参会人员id,逗号分隔")
-    @ExcelProperty("参会人员id,逗号分隔")
-    private String participants;
+    @Schema(description = "参会人员id集合")
+    @ExcelProperty("参会人员id集合")
+    private List<Long> participants;
 
-    @Schema(description = "发送类型:1站内信 2短信 3邮件,目前仅1启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @Schema(description = "参会人员名字,逗号分隔")
+    @ExcelProperty("参会人员名字,逗号分隔")
+    private String participantsName;
+
+    @Schema(description = "发送类型:1站内信 2短信 3邮件,目前仅1启用")
     @ExcelProperty("发送类型:1站内信 2短信 3邮件,目前仅1启用")
     private String sendType;
 
@@ -69,11 +81,15 @@ public class OaMeetingReserveRespVO {
     @ExcelProperty("会议预定状态:1未开始 2进行中 3已结束 4已取消")
     private String status;
 
+    @Schema(description = "会议预定状态描述:1未开始 2进行中 3已结束 4已取消", example = "2")
+    @ExcelProperty("会议预定状态描述:1未开始 2进行中 3已结束 4已取消")
+    private String statusDesc;
+
     @Schema(description = "会议内容")
     @ExcelProperty("会议内容")
     private String meetingContent;
 
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "创建时间")
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 

+ 8 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/meeting/reserve/vo/OaMeetingReserveSaveReqVO.java

@@ -9,23 +9,27 @@ import javax.validation.constraints.*;
 @Data
 public class OaMeetingReserveSaveReqVO {
 
-    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11723")
+    @Schema(description = "主键id")
     private Long id;
 
-    @Schema(description = "会议室id", example = "4529")
+    @Schema(description = "会议室id", example = "2")
     private Long roomId;
 
-    @Schema(description = "会议名称", example = "赵六")
+    @Schema(description = "会议名称", example = "售前会议")
+    @NotBlank(message = "会议名称不能为空")
     private String meetingName;
 
     @Schema(description = "会议开始时间")
+    @NotBlank(message = "会议开始时间不能为空")
     private String startTime;
 
     @Schema(description = "会议结束时间")
+    @NotBlank(message = "会议结束时间不能为空")
     private String endTime;
 
     @Schema(description = "参会人员id,逗号分隔")
-    private String participants;
+    @NotEmpty(message = "参会人员不能为空")
+    private List<Long> participants;
 
     @Schema(description = "会议内容")
     private String meetingContent;

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/meeting/reserve/OaMeetingReserveDO.java

@@ -62,7 +62,7 @@ public class OaMeetingReserveDO extends BaseDO {
     /**
      * 申请人部门
      */
-    private String deptId;
+    private Long deptId;
     /**
      * 参会人数
      */

+ 0 - 11
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/meeting/reserve/OaMeetingReserveMapper.java

@@ -17,21 +17,10 @@ public interface OaMeetingReserveMapper extends BaseMapperX<OaMeetingReserveDO>
 
     default PageResult<OaMeetingReserveDO> selectPage(OaMeetingReservePageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<OaMeetingReserveDO>()
-                .eqIfPresent(OaMeetingReserveDO::getReserveUuid, reqVO.getReserveUuid())
                 .eqIfPresent(OaMeetingReserveDO::getRoomId, reqVO.getRoomId())
-                .eqIfPresent(OaMeetingReserveDO::getRoomUuid, reqVO.getRoomUuid())
                 .likeIfPresent(OaMeetingReserveDO::getMeetingName, reqVO.getMeetingName())
                 .betweenIfPresent(OaMeetingReserveDO::getStartTime, reqVO.getStartTime())
                 .betweenIfPresent(OaMeetingReserveDO::getEndTime, reqVO.getEndTime())
-                .eqIfPresent(OaMeetingReserveDO::getApplyEmployeeId, reqVO.getApplyEmployeeId())
-                .eqIfPresent(OaMeetingReserveDO::getApplyEmployeePhone, reqVO.getApplyEmployeePhone())
-                .eqIfPresent(OaMeetingReserveDO::getDeptId, reqVO.getDeptId())
-                .eqIfPresent(OaMeetingReserveDO::getNumber, reqVO.getNumber())
-                .eqIfPresent(OaMeetingReserveDO::getParticipants, reqVO.getParticipants())
-                .eqIfPresent(OaMeetingReserveDO::getSendType, reqVO.getSendType())
-                .eqIfPresent(OaMeetingReserveDO::getStatus, reqVO.getStatus())
-                .eqIfPresent(OaMeetingReserveDO::getMeetingContent, reqVO.getMeetingContent())
-                .betweenIfPresent(OaMeetingReserveDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(OaMeetingReserveDO::getId));
     }
 

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

@@ -1,7 +1,13 @@
 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.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.enums.MeetingReserveStatusEnum;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -12,6 +18,13 @@ 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 java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
 
@@ -27,10 +40,42 @@ public class OaMeetingReserveServiceImpl implements OaMeetingReserveService {
     @Resource
     private OaMeetingReserveMapper oaMeetingReserveMapper;
 
+    @Resource
+    private AdminUserApi adminUserApi;
+
     @Override
     public Long createOaMeetingReserve(OaMeetingReserveSaveReqVO createReqVO) {
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO user = adminUserApi.getUser(loginUserId);
+
+        // 校验时间
+        String startTime = createReqVO.getStartTime();
+        String endTime = createReqVO.getEndTime();
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        String nowTime = now.format(pattern);
+        if (startTime.compareTo(endTime) >= 0) {
+            throw exception(OA_MEETING_RESERVE_START_TIME_LESS_THAN_END_TIME);
+        }
+        if (startTime.compareTo(nowTime) < 0) {
+            throw exception(OA_MEETING_RESERVE_START_TIME_MORE_THAN_NOW);
+        }
         // 插入
         OaMeetingReserveDO oaMeetingReserve = BeanUtils.toBean(createReqVO, OaMeetingReserveDO.class);
+        oaMeetingReserve.setReserveUuid(IdUtil.fastSimpleUUID());
+        oaMeetingReserve.setApplyEmployeeId(user.getId());
+        oaMeetingReserve.setDeptId(user.getDeptId());
+        oaMeetingReserve.setApplyEmployeePhone(user.getMobile());
+        List<Long> participantsIdList = createReqVO.getParticipants();
+        if (CollUtil.isNotEmpty(participantsIdList)) {
+            String participants = participantsIdList.stream().map(String::valueOf).collect(Collectors.joining(","));
+            oaMeetingReserve.setParticipants(participants);
+            oaMeetingReserve.setNumber(String.valueOf(participantsIdList.size()));
+        } else {
+            oaMeetingReserve.setParticipants(null);
+            oaMeetingReserve.setNumber("0");
+        }
+        oaMeetingReserve.setStatus(MeetingReserveStatusEnum.WAITING.getStatus());
         oaMeetingReserveMapper.insert(oaMeetingReserve);
         // 返回
         return oaMeetingReserve.getId();
@@ -38,10 +83,48 @@ public class OaMeetingReserveServiceImpl implements OaMeetingReserveService {
 
     @Override
     public void updateOaMeetingReserve(OaMeetingReserveSaveReqVO updateReqVO) {
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO user = adminUserApi.getUser(loginUserId);
+
         // 校验存在
-        validateOaMeetingReserveExists(updateReqVO.getId());
+        OaMeetingReserveDO oaMeetingReserveDOOld = validateOaMeetingReserveExists(updateReqVO.getId());
+        String startTimeOld = oaMeetingReserveDOOld.getStartTime();
+
+        // 校验时间
+        String startTime = updateReqVO.getStartTime();
+        String endTime = updateReqVO.getEndTime();
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        String nowTime = now.format(pattern);
+        if (startTime.compareTo(endTime) >= 0) {
+            throw exception(OA_MEETING_RESERVE_START_TIME_LESS_THAN_END_TIME);
+        }
+        if (startTime.compareTo(nowTime) < 0) {
+            throw exception(OA_MEETING_RESERVE_START_TIME_MORE_THAN_NOW);
+        }
+
+        // 会议开始前5分钟后不能修改
+        LocalDateTime fiveMinutesAgo = now.plus(5, ChronoUnit.MINUTES);
+        String fiveMinutesAgoTime = fiveMinutesAgo.format(pattern);
+        if (fiveMinutesAgoTime.compareTo(startTimeOld) >= 0) {
+            throw exception(OA_MEETING_RESERVE_START_TIME_MORE_THAN_FIVE_MINUTES);
+        }
+
         // 更新
         OaMeetingReserveDO updateObj = BeanUtils.toBean(updateReqVO, OaMeetingReserveDO.class);
+        updateObj.setApplyEmployeeId(user.getId());
+        updateObj.setDeptId(user.getDeptId());
+        updateObj.setApplyEmployeePhone(user.getMobile());
+
+        List<Long> participantsIdList = updateReqVO.getParticipants();
+        if (CollUtil.isNotEmpty(participantsIdList)) {
+            String participants = participantsIdList.stream().map(String::valueOf).collect(Collectors.joining(","));
+            updateObj.setParticipants(participants);
+            updateObj.setNumber(String.valueOf(participantsIdList.size()));
+        } else {
+            updateObj.setParticipants(null);
+            updateObj.setNumber("0");
+        }
         oaMeetingReserveMapper.updateById(updateObj);
     }
 
@@ -53,10 +136,12 @@ public class OaMeetingReserveServiceImpl implements OaMeetingReserveService {
         oaMeetingReserveMapper.deleteById(id);
     }
 
-    private void validateOaMeetingReserveExists(Long id) {
-        if (oaMeetingReserveMapper.selectById(id) == null) {
+    private OaMeetingReserveDO validateOaMeetingReserveExists(Long id) {
+        OaMeetingReserveDO oaMeetingReserveDO = oaMeetingReserveMapper.selectById(id);
+        if (oaMeetingReserveDO == null) {
             throw exception(OA_MEETING_RESERVE_NOT_EXISTS);
         }
+        return oaMeetingReserveDO;
     }
 
     @Override

+ 11 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/room/OaMeetingRoomService.java

@@ -1,11 +1,14 @@
 package cn.iocoder.yudao.module.bpm.service.meeting.room;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.bpm.api.metting.room.vo.OaMeetingRoomRespDTO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomSaveReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.meeting.room.OaMeetingRoomDO;
 
 import javax.validation.Valid;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -59,4 +62,12 @@ public interface OaMeetingRoomService {
      * @return 会议室信息管理列表
      */
     List<OaMeetingRoomDO> getOaMeetingRoomList();
+
+    /**
+     * 根据主键id集合获得会议室信息管理列表
+     *
+     * @param ids 主键id集合
+     * @return 会议室信息管理列表
+     */
+    List<OaMeetingRoomRespDTO> getOaMeetingRoomList(Collection<Long> ids);
 }

+ 14 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/meeting/room/OaMeetingRoomServiceImpl.java

@@ -1,9 +1,12 @@
 package cn.iocoder.yudao.module.bpm.service.meeting.room;
 
+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.module.bpm.api.metting.room.vo.OaMeetingRoomRespDTO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.meeting.room.vo.OaMeetingRoomSaveReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.meeting.room.OaMeetingRoomDO;
 import cn.iocoder.yudao.module.bpm.dal.mysql.meeting.room.OaMeetingRoomMapper;
@@ -14,6 +17,8 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -96,4 +101,13 @@ public class OaMeetingRoomServiceImpl implements OaMeetingRoomService {
         return oaMeetingRoomMapper.selectList();
     }
 
+    @Override
+    public List<OaMeetingRoomRespDTO> getOaMeetingRoomList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
+        List<OaMeetingRoomDO> oaMeetingRoomDOS = oaMeetingRoomMapper.selectBatchIds(ids);
+        return BeanUtils.toBean(oaMeetingRoomDOS, OaMeetingRoomRespDTO.class);
+    }
+
 }