Browse Source

会议申请会议室选取
会议申请规则节点

大数据与最优化研究所 2 weeks ago
parent
commit
c29baab8f9
21 changed files with 1252 additions and 114 deletions
  1. 50 0
      src/main/java/com/xjrsoft/common/enums/MeetingTypeEnum.java
  2. 12 1
      src/main/java/com/xjrsoft/module/liteflow/node/WfMeetingApplyNode.java
  3. 103 0
      src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java
  4. 44 0
      src/main/java/com/xjrsoft/module/oa/dto/MeetingRoomListDto.java
  5. 26 0
      src/main/java/com/xjrsoft/module/oa/dto/WfMeetingApplyPageDto.java
  6. 98 0
      src/main/java/com/xjrsoft/module/oa/entity/MeetingConferee.java
  7. 88 0
      src/main/java/com/xjrsoft/module/oa/entity/MeetingConfereeOpinion.java
  8. 121 0
      src/main/java/com/xjrsoft/module/oa/entity/MeetingRoom.java
  9. 69 46
      src/main/java/com/xjrsoft/module/oa/entity/WfMeetingApply.java
  10. 17 0
      src/main/java/com/xjrsoft/module/oa/mapper/MeetingConfereeMapper.java
  11. 17 0
      src/main/java/com/xjrsoft/module/oa/mapper/MeetingConfereeOpinionMapper.java
  12. 17 0
      src/main/java/com/xjrsoft/module/oa/mapper/MeetingRoomMapper.java
  13. 6 6
      src/main/java/com/xjrsoft/module/oa/mapper/WfMeetingApplyMapper.java
  14. 11 0
      src/main/java/com/xjrsoft/module/oa/service/IWfMeetingApplyService.java
  15. 173 44
      src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java
  16. 50 0
      src/main/java/com/xjrsoft/module/oa/vo/MeetingRoomListVo.java
  17. 104 0
      src/main/java/com/xjrsoft/module/oa/vo/WfMeetingApplyPageVo.java
  18. 140 11
      src/main/resources/sqlScript/20250324_sql.sql
  19. 3 3
      src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest.java
  20. 3 3
      src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest2.java
  21. 100 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 50 - 0
src/main/java/com/xjrsoft/common/enums/MeetingTypeEnum.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.common.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 会议形式(xjr_dictionary_item(meeting_type))
+ */
+public enum MeetingTypeEnum {
+
+    /**
+     * 在读
+     * */
+    HMT0001("HMT0001", "线上会议"),
+    /**
+     * 休学
+     * */
+    HMT0002("HMT0002", "线下会议");
+
+    final String code;
+    final String value;
+
+    private static final Map<String, String> lookup = new HashMap<>();
+
+    static {
+        for (MeetingTypeEnum s : MeetingTypeEnum.values()) {
+            lookup.put(s.getCode(), s.getValue());
+        }
+    }
+
+
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    MeetingTypeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+
+    public static String fromCode(String code) {
+        return lookup.get(code);
+    }
+
+}

+ 12 - 1
src/main/java/com/xjrsoft/module/liteflow/node/WfMeetingApplyNode.java

@@ -5,8 +5,11 @@ import com.xjrsoft.module.oa.service.IWfMeetingApplyService;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * 会议通知
@@ -25,7 +28,15 @@ public class WfMeetingApplyNode extends NodeComponent {
         Long formId = Convert.toLong(value);
         if (formId != null) {
             // 数据处理
-            meetingApplyService.noticeParticipants(formId);
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    CompletableFuture.runAsync(() -> {
+                        meetingApplyService.noticeParticipants(formId);
+                    });
+                }
+            });
+
         }
     }
 }

+ 103 - 0
src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java

@@ -0,0 +1,103 @@
+package com.xjrsoft.module.oa.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.oa.dto.MeetingRoomListDto;
+import com.xjrsoft.module.oa.dto.WfMeetingApplyPageDto;
+import com.xjrsoft.module.oa.service.IWfMeetingApplyService;
+import com.xjrsoft.module.oa.vo.MeetingRoomListVo;
+import com.xjrsoft.module.oa.vo.WfMeetingApplyPageVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/oa" + "/wfMeetingApply")
+@Api(value = "/oa"  + "/wfMeetingApply",tags = "会议申请")
+@AllArgsConstructor
+public class WfMeetingApplyController {
+
+    private final IWfMeetingApplyService wfMeetingApplyService;
+
+    @GetMapping(value = "/meeting_room_list")
+    @ApiOperation(value="会议室列表(不分页)")
+    @SaCheckPermission("wfmeetingapply:detail")
+    @XjrLog(value = "会议室列表(分页)")
+    public RT<List<MeetingRoomListVo>> meetingRoomList(@Valid MeetingRoomListDto dto){
+        List<MeetingRoomListVo> meetingRoomListVoList = wfMeetingApplyService.meetingRoomList(dto);
+        return RT.ok(meetingRoomListVoList);
+    }
+
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="列表(分页)")
+    @SaCheckPermission("wfmeetingapply:detail")
+    @XjrLog(value = "列表(分页)")
+    public RT<PageOutput<WfMeetingApplyPageVo>> page(@Valid WfMeetingApplyPageDto dto){
+        IPage<WfMeetingApplyPageVo> page = wfMeetingApplyService.pageRabAndHand(dto);
+        PageOutput<WfMeetingApplyPageVo> pageOutput = ConventPage.getPageOutput(page, WfMeetingApplyPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+
+
+//    @GetMapping(value = "/info")
+//    @ApiOperation(value="根据id查询信息")
+//    @SaCheckPermission("wfmeetingapply:detail")
+//    @XjrLog(value = "根据id查询信息")
+//    public RT<WfMeetingApplyVo> info(@RequestParam Long id){
+//        WfMeetingApply wfMeetingApply = wfMeetingApplyService.getById(id);
+//        if (wfMeetingApply == null) {
+//           return RT.error("找不到此数据!");
+//        }
+//        return RT.ok(BeanUtil.toBean(wfMeetingApply, WfMeetingApplyVo.class));
+//    }
+//
+//
+//    @PostMapping
+//    @ApiOperation(value = "新增")
+//    @SaCheckPermission("wfmeetingapply:add")
+//    @XjrLog(value = "新增")
+//    public RT<Boolean> add(@Valid @RequestBody AddWfMeetingApplyDto dto){
+//        WfMeetingApply wfMeetingApply = BeanUtil.toBean(dto, WfMeetingApply.class);
+//        boolean isSuccess = wfMeetingApplyService.save(wfMeetingApply);
+//    return RT.ok(isSuccess);
+//    }
+//
+//    @PutMapping
+//    @ApiOperation(value = "修改")
+//    @SaCheckPermission("wfmeetingapply:edit")
+//    @XjrLog(value = "修改")
+//    public RT<Boolean> update(@Valid @RequestBody UpdateWfMeetingApplyDto dto){
+//
+//        WfMeetingApply wfMeetingApply = BeanUtil.toBean(dto, WfMeetingApply.class);
+//        return RT.ok(wfMeetingApplyService.updateById(wfMeetingApply));
+//
+//    }
+//
+//    @DeleteMapping
+//    @ApiOperation(value = "删除")
+//    @SaCheckPermission("wfmeetingapply:delete")
+//    @XjrLog(value = "删除")
+//    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+//        return RT.ok(wfMeetingApplyService.removeBatchByIds(ids));
+//
+//    }
+
+}

+ 44 - 0
src/main/java/com/xjrsoft/module/oa/dto/MeetingRoomListDto.java

@@ -0,0 +1,44 @@
+package com.xjrsoft.module.oa.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+/**
+* @title: 会议室列表(不分页)入参
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+public class MeetingRoomListDto {
+
+    /**
+     * 会议日期
+     */
+    @ApiModelProperty("会议日期")
+    private LocalDate meetingApplyDate;
+    /**
+     * 会议开始时间
+     */
+    @ApiModelProperty("会议开始时间")
+    private LocalTime meetingApplyS;
+    /**
+     * 会议结束时间
+     */
+    @ApiModelProperty("会议结束时间")
+    private LocalTime meetingApplyE;
+    /**
+     * 会议室名称
+     */
+    @ApiModelProperty("会议室名称")
+    private String name;
+    /**
+     * 楼栋(base_office_build)
+     */
+    @ApiModelProperty("楼栋(base_office_build)")
+    private String officeBuildIdCn;
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/oa/dto/WfMeetingApplyPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.oa.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 分页查询入参
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WfMeetingApplyPageDto extends PageInput {
+
+
+}

+ 98 - 0
src/main/java/com/xjrsoft/module/oa/entity/MeetingConferee.java

@@ -0,0 +1,98 @@
+package com.xjrsoft.module.oa.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 会议参会人员
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+@TableName("meeting_conferee")
+@ApiModel(value = "meeting_conferee", description = "会议参会人员")
+public class MeetingConferee implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 会议申请主键id(wf_meeting_apply)
+    */
+    @ApiModelProperty("会议申请主键id(wf_meeting_apply)")
+    private Long wfMeetingApplyId;
+    /**
+    * 用户主键id(xjr_user)
+    */
+    @ApiModelProperty("用户主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 签到时间
+    */
+    @ApiModelProperty("签到时间")
+    private Date checkInDate;
+    /**
+    * 签到状态(0:未签到,1:已签到)
+    */
+    @ApiModelProperty("签到状态(0:未签到,1:已签到)")
+    private Integer checkInStatus;
+
+
+}

+ 88 - 0
src/main/java/com/xjrsoft/module/oa/entity/MeetingConfereeOpinion.java

@@ -0,0 +1,88 @@
+package com.xjrsoft.module.oa.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 会议参会人员意见
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+@TableName("meeting_conferee_opinion")
+@ApiModel(value = "meeting_conferee_opinion", description = "会议参会人员意见")
+public class MeetingConfereeOpinion implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 会议参会人员主键id(meeting_conferee)
+    */
+    @ApiModelProperty("会议参会人员主键id(meeting_conferee)")
+    private Long meetingConfereeId;
+    /**
+    * 意见
+    */
+    @ApiModelProperty("意见")
+    private String userId;
+
+
+}

+ 121 - 0
src/main/java/com/xjrsoft/module/oa/entity/MeetingRoom.java

@@ -0,0 +1,121 @@
+package com.xjrsoft.module.oa.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 会议室管理
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+@TableName("meeting_room")
+@ApiModel(value = "meeting_room", description = "会议室管理")
+public class MeetingRoom implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 会议室名称
+    */
+    @ApiModelProperty("会议室名称")
+    private String name;
+    /**
+    * 楼栋(base_office_build)
+    */
+    @ApiModelProperty("楼栋(base_office_build)")
+    private Long officeBuildId;
+    /**
+    * 楼层
+    */
+    @ApiModelProperty("楼层")
+    private Integer floorNum;
+    /**
+    * 门牌号
+    */
+    @ApiModelProperty("门牌号")
+    private String number;
+    /**
+    * 容量(最大人数)
+    */
+    @ApiModelProperty("容量(最大人数)")
+    private Integer capacity;
+    /**
+    * 会议室面积(平米)
+    */
+    @ApiModelProperty("会议室面积(平米)")
+    private Double square;
+    /**
+    * 会议室管理员(多人)(xjr_user)
+    */
+    @ApiModelProperty("会议室管理员(多人)(xjr_user)")
+    private String userId;
+    /**
+    * 管理员联系方式
+    */
+    @ApiModelProperty("管理员联系方式")
+    private String userPhone;
+    /**
+    * 状态(1:启用 0:停用)
+    */
+    @ApiModelProperty("状态(1:启用 0:停用)")
+    private Integer status;
+}

+ 69 - 46
src/main/java/com/xjrsoft/module/oa/entity/WfMeetingApply.java

@@ -7,81 +7,104 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
+import java.time.LocalDate;
 import java.time.LocalTime;
 
 
 /**
- * @title: 会议申请
- * @Author dzx
- * @Date: 2024-09-04
- * @Version 1.0
- */
+* @title: 
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
 @Data
 @TableName("wf_meeting_apply")
-@ApiModel(value = "wf_meeting_apply", description = "会议申请")
+@ApiModel(value = "wf_meeting_apply", description = "")
 public class WfMeetingApply implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
     /**
-     *
-     */
+    * 
+    */
     @ApiModelProperty("")
     @TableId
     private Long id;
-
+    /**
+    * 会议日期
+    */
     @ApiModelProperty("会议日期")
-    private LocalDateTime meetingApplyDate;
-
+    private LocalDate meetingApplyDate;
+    /**
+    * 会议开始时间
+    */
     @ApiModelProperty("会议开始时间")
     private LocalTime meetingApplyS;
-
+    /**
+    * 会议结束时间
+    */
     @ApiModelProperty("会议结束时间")
     private LocalTime meetingApplyE;
-
-    @ApiModelProperty("会议地点")
-    private String meetingApplyAddress;
-
-    @ApiModelProperty("会议形式")
+    /**
+    * 会议形式(xjr_dictionary_item(meeting_type))
+    */
+    @ApiModelProperty("会议形式(xjr_dictionary_item(meeting_type))")
     private String meetingApplyFormat;
-
+    /**
+    * 会议室管理主键id(meeting_room)
+    */
+    @ApiModelProperty("会议室管理主键id(meeting_room)")
+    private Long meetingRoomId;
+    /**
+    * 线上会议链接
+    */
+    @ApiModelProperty("线上会议链接")
+    private String meetingApplyUrl;
+    /**
+    * 参会人员
+    */
     @ApiModelProperty("参会人员")
     private String meetingApplyParticipants;
-
+    /**
+    * 主持人
+    */
     @ApiModelProperty("主持人")
     private String meetingApplyHost;
-
+    /**
+    * 会议主题
+    */
     @ApiModelProperty("会议主题")
     private String meetingApplyTheme;
-
+    /**
+    * 会议议题
+    */
     @ApiModelProperty("会议议题")
     private String meetingApplyTopics;
-
-    @ApiModelProperty("是否准备座牌、会标")
-    private String isMonogram;
-
+    /**
+    * 是否准备座牌、会标(1:是,0:否)
+    */
+    @ApiModelProperty("是否准备座牌、会标(1:是,0:否)")
+    private Integer isMonogram;
+    /**
+    * 会标主题
+    */
     @ApiModelProperty("会标主题")
-    private String monogram;
-
-    @ApiModelProperty("会前消息提醒")
-    private String meetingApplyTip;
-
-    @ApiModelProperty("会前资料")
-    private String meetingApplyPmm;
-
-    @ApiModelProperty("会议签到签退")
-    private String meetingApplySignIn;
-
-    @ApiModelProperty("上传权限")
-    private Integer meetingApplyUp;
-
-    @ApiModelProperty("为参会人员创建工作任务")
-    private Integer meetingApplyMission;
+    private String monogramTheme;
+    /**
+    * 会议纪要
+    */
+    @ApiModelProperty("会议纪要")
+    private String meetingSummary;
+    /**
+    * 会前资料文件上传主键id
+    */
+    @ApiModelProperty("会前资料文件上传主键id")
+    private Long preMeetingInfoFileId;
+    /**
+    * 会议状态(0:未开始 1:已经撤销,2:已结束)
+    */
+    @ApiModelProperty("会议状态(0:未开始 1:已经撤销,2:已结束)")
+    private Integer meetingStatus;
 
-    @ApiModelProperty("下载权限")
-    private Integer meetingApplyDown;
 
-    @ApiModelProperty("状态(0:未通过 1:通过)")
-    private Integer status;
 }

+ 17 - 0
src/main/java/com/xjrsoft/module/oa/mapper/MeetingConfereeMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.oa.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.oa.entity.MeetingConferee;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 会议参会人员
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Mapper
+public interface MeetingConfereeMapper extends MPJBaseMapper<MeetingConferee> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/oa/mapper/MeetingConfereeOpinionMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.oa.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.oa.entity.MeetingConfereeOpinion;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 会议参会人员意见
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Mapper
+public interface MeetingConfereeOpinionMapper extends MPJBaseMapper<MeetingConfereeOpinion> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/oa/mapper/MeetingRoomMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.oa.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.oa.entity.MeetingRoom;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 会议室管理
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Mapper
+public interface MeetingRoomMapper extends MPJBaseMapper<MeetingRoom> {
+
+}

+ 6 - 6
src/main/java/com/xjrsoft/module/oa/mapper/WfMeetingApplyMapper.java

@@ -1,17 +1,17 @@
 package com.xjrsoft.module.oa.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.oa.entity.WfMeetingApply;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
- * @title: 物品申购
- * @Author dzx
- * @Date: 2024-02-19
- * @Version 1.0
- */
+* @title: 
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
 @Mapper
 public interface WfMeetingApplyMapper extends MPJBaseMapper<WfMeetingApply> {
 
 }
-

+ 11 - 0
src/main/java/com/xjrsoft/module/oa/service/IWfMeetingApplyService.java

@@ -1,7 +1,14 @@
 package com.xjrsoft.module.oa.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.oa.dto.MeetingRoomListDto;
+import com.xjrsoft.module.oa.dto.WfMeetingApplyPageDto;
 import com.xjrsoft.module.oa.entity.WfMeetingApply;
+import com.xjrsoft.module.oa.vo.MeetingRoomListVo;
+import com.xjrsoft.module.oa.vo.WfMeetingApplyPageVo;
+
+import java.util.List;
 
 /**
  * @title: 会议申请
@@ -12,5 +19,9 @@ import com.xjrsoft.module.oa.entity.WfMeetingApply;
 
 public interface IWfMeetingApplyService extends MPJBaseService<WfMeetingApply> {
 
+    List<MeetingRoomListVo> meetingRoomList(MeetingRoomListDto dto);
+
+    IPage<WfMeetingApplyPageVo> pageRabAndHand(WfMeetingApplyPageDto dto);
+
     void noticeParticipants(Long id);
 }

+ 173 - 44
src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java

@@ -3,25 +3,45 @@ package com.xjrsoft.module.oa.service.impl;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.MeetingTypeEnum;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseOfficeBuild;
+import com.xjrsoft.module.oa.dto.MeetingRoomListDto;
+import com.xjrsoft.module.oa.dto.WfMeetingApplyPageDto;
+import com.xjrsoft.module.oa.entity.MeetingConferee;
+import com.xjrsoft.module.oa.entity.MeetingRoom;
 import com.xjrsoft.module.oa.entity.WfMeetingApply;
+import com.xjrsoft.module.oa.mapper.MeetingConfereeMapper;
+import com.xjrsoft.module.oa.mapper.MeetingRoomMapper;
 import com.xjrsoft.module.oa.mapper.WfMeetingApplyMapper;
 import com.xjrsoft.module.oa.service.IWfMeetingApplyService;
+import com.xjrsoft.module.oa.vo.MeetingRoomListVo;
+import com.xjrsoft.module.oa.vo.WfMeetingApplyPageVo;
 import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IWeChatService;
 import com.xjrsoft.module.workflow.entity.WorkflowExtra;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @title: 物品申购
@@ -39,57 +59,166 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
 
     private final IWorkflowExtraService extraService;
 
-    @Override
-    public void noticeParticipants(Long id) {
-        WfMeetingApply meetingApply = this.getById(id);
-        if (meetingApply.getMeetingApplyParticipants() == null || meetingApply.getMeetingApplyParticipants().isEmpty()) {
-            return;
-        }
-        List<String> userIds = Arrays.asList(meetingApply.getMeetingApplyParticipants().split(","));
-
-        List<User> userList = userService.list(new QueryWrapper<User>().lambda().in(User::getId, userIds).isNotNull(User::getOpenId));
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        String startTime = meetingApply.getMeetingApplyS().format(formatter);
-        String endTime = meetingApply.getMeetingApplyE().format(formatter);
-
-        List<WorkflowExtra> list = extraService.list(
-                new MPJLambdaWrapper<WorkflowExtra>()
-                        .select(WorkflowExtra.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowExtra.class).contains(x.getProperty()))
-                        .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getProcessId, WorkflowExtra::getProcessId)
-                        .eq(WorkflowFormRelation::getFormId, id)
-                        .orderByAsc(WorkflowExtra::getStartTime)
-        );
-        String startUserName = list.get(0).getStartUserName();
+    private final MeetingRoomMapper meetingRoomMapper;
 
-        for (User user : userList) {
-            WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
-            weChatSendMessageDto.setUserId(user.getOpenId());
-            weChatSendMessageDto.setTemplateId("Hign0b3e4WSXe__YmBKyDsBgAjkfNYC7c6yIUHjk3Hg");
-            weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
-            JSONObject paramJson = new JSONObject();
+    private final WorkflowFormRelationMapper workflowFormRelationMapper;
 
-            JSONObject thing2 = new JSONObject();
-            thing2.put("value", meetingApply.getMeetingApplyTheme());
-            paramJson.put("thing2", thing2);
+    private final MeetingConfereeMapper meetingConfereeMapper;
 
-            JSONObject time5 = new JSONObject();
-            time5.put("value", startTime);
-            paramJson.put("time5", time5);
+    @Override
+    public List<MeetingRoomListVo> meetingRoomList(MeetingRoomListDto dto) {
+        // 获取所有的教室
+        MPJLambdaWrapper<MeetingRoom> meetingRoomMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        meetingRoomMPJLambdaWrapper
+                .select(MeetingRoom::getId)
+                .selectAs(MeetingRoom::getName, MeetingRoomListVo::getName)
+                .selectAs(MeetingRoom::getFloorNum, MeetingRoomListVo::getFloorNum)
+                .selectAs(MeetingRoom::getCapacity, MeetingRoomListVo::getCapacity)
+                .selectAs(BaseOfficeBuild::getName, MeetingRoomListVo::getOfficeBuildIdCn)
+                .leftJoin(BaseOfficeBuild.class, BaseOfficeBuild::getId, MeetingRoom::getOfficeBuildId)
+                .eq(MeetingRoom::getStatus, 1)
+                ;
+        List<MeetingRoomListVo> result = meetingRoomMapper.selectJoinList(MeetingRoomListVo.class, meetingRoomMPJLambdaWrapper);
+
+        // 获取会议申请日期已经预约的会议,排除已经撤销的
+        List<WfMeetingApply> wfMeetingApplyList = this.list(Wrappers.lambdaQuery(WfMeetingApply.class)
+                .eq(WfMeetingApply::getMeetingApplyDate, dto.getMeetingApplyDate())
+                .eq(WfMeetingApply::getMeetingApplyFormat, MeetingTypeEnum.HMT0002.getCode())// 线下会议
+                .ne(WfMeetingApply::getMeetingStatus, 1)
+        );
 
-            JSONObject time6 = new JSONObject();
-            time6.put("value", endTime);
-            paramJson.put("time6", time6);
+        // 根据会议室id分组
+        Map<Long, List<WfMeetingApply>> mapByMeetingRoomId = wfMeetingApplyList.stream()
+                .collect(Collectors.groupingBy(WfMeetingApply::getMeetingRoomId));
+
+        // 处理已经预约的会议室
+        Map<Long, MeetingRoomListVo> reservationMap = new LinkedHashMap<>();
+        MeetingRoomListVo meetingRoomListVo;
+        for (Map.Entry<Long, List<WfMeetingApply>> entry : mapByMeetingRoomId.entrySet()) {
+            Long key = entry.getKey();
+            List<WfMeetingApply> value = entry.getValue();
+            StringBuilder reservationDetail = new StringBuilder();
+            boolean isReservation = false;
+            meetingRoomListVo = new MeetingRoomListVo();
+            for (WfMeetingApply wfMeetingApply : value) {
+                // 会议时间是否重叠
+                if(!(dto.getMeetingApplyS().isBefore(wfMeetingApply.getMeetingApplyS()) || dto.getMeetingApplyE().isAfter(wfMeetingApply.getMeetingApplyE()))){
+                    isReservation = true;
+                }
+                reservationDetail.append(wfMeetingApply.getMeetingApplyS()).append("-").append(wfMeetingApply.getMeetingApplyE()).append("\r\n");
+            }
+            meetingRoomListVo.setReservationDetail(reservationDetail.toString());
+            meetingRoomListVo.setStatus(isReservation ? 1 : 0);
+
+            reservationMap.put(key, meetingRoomListVo);
+        }
 
-            JSONObject thing7 = new JSONObject();
-            thing7.put("value", meetingApply.getMeetingApplyAddress());
-            paramJson.put("thing7", thing7);
+        for (MeetingRoomListVo vo : result){
+            vo.setStatus(0);
+            MeetingRoomListVo reservationRoom = reservationMap.get(vo.getId());
+            if(ObjectUtils.isNotEmpty(reservationRoom)){
+                vo.setReservationDetail(reservationRoom.getReservationDetail());
+                vo.setStatus(reservationRoom.getStatus());
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public IPage<WfMeetingApplyPageVo> pageRabAndHand(WfMeetingApplyPageDto dto) {
+        return null;
+    }
 
-            JSONObject thing8 = new JSONObject();
-            thing8.put("value", startUserName);
-            paramJson.put("thing8", thing8);
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void noticeParticipants(Long id) {
+        MPJLambdaWrapper<WfMeetingApply> wrapper = new MPJLambdaWrapper<>();
+        wrapper
+                .disableSubLogicDel()
+                .select(WfMeetingApply::getId)
+                .selectAs(MeetingRoom::getName, WfMeetingApply::getMeetingSummary)
+                .select(WfMeetingApply.class,x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
+                .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId)
+                .eq(WfMeetingApply::getId, id)
+                ;
+        WfMeetingApply meetingApply = this.selectJoinOne(WfMeetingApply.class, wrapper);
+
+        // 根据数据id找到所在流程得状态
+        WorkflowFormRelation workflowFormRelation = workflowFormRelationMapper.selectOne(
+                Wrappers.lambdaQuery(WorkflowFormRelation.class)
+                        .eq(WorkflowFormRelation::getFormKeyValue, id)
+        );
 
-            weChatSendMessageDto.setContent(paramJson);
-            weChatService.sendTemplateMessage(weChatSendMessageDto);
+        if (ObjectUtils.isNotEmpty(meetingApply)
+                && ObjectUtils.isNotEmpty(workflowFormRelation)
+                && HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
+        ) {
+            if (meetingApply.getMeetingApplyParticipants() == null || meetingApply.getMeetingApplyParticipants().isEmpty()) {
+                return;
+            }
+            List<String> userIds = Arrays.asList(meetingApply.getMeetingApplyParticipants().split(","));
+
+            // 处理会议时间
+            List<User> userList = userService.list(new QueryWrapper<User>().lambda().in(User::getId, userIds).isNotNull(User::getOpenId));
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime startLocalDateTime = LocalDateTime.of(meetingApply.getMeetingApplyDate(), meetingApply.getMeetingApplyS());
+            LocalDateTime endLocalDateTime = LocalDateTime.of(meetingApply.getMeetingApplyDate(), meetingApply.getMeetingApplyE());
+            String startTime = startLocalDateTime.format(formatter);
+            String endTime = endLocalDateTime.format(formatter);
+
+            // 获取申请人
+            List<WorkflowExtra> list = extraService.list(
+                    new MPJLambdaWrapper<WorkflowExtra>()
+                            .select(WorkflowExtra.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowExtra.class).contains(x.getProperty()))
+                            .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getProcessId, WorkflowExtra::getProcessId)
+                            .eq(WorkflowFormRelation::getFormId, id)
+                            .orderByAsc(WorkflowExtra::getStartTime)
+            );
+            String startUserName = list.get(0).getStartUserName();
+
+            MeetingConferee meetingConferee;
+
+            // 添加参会人员到参会人员表
+            for (User user : userList) {
+                meetingConferee = new MeetingConferee();
+                meetingConferee.setWfMeetingApplyId(id);
+                meetingConferee.setUserId(user.getId());
+                meetingConferee.setCheckInStatus(0);
+
+                meetingConfereeMapper.insert(meetingConferee);
+            }
+
+            // 发送微信通知,和添加到记录分开是预防添加出现异常只通知一部人。
+            for (User user : userList) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setUserId(user.getOpenId());
+                weChatSendMessageDto.setTemplateId("Hign0b3e4WSXe__YmBKyDsBgAjkfNYC7c6yIUHjk3Hg");
+                weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
+                JSONObject paramJson = new JSONObject();
+
+                JSONObject thing2 = new JSONObject();
+                thing2.put("value", meetingApply.getMeetingApplyTheme());
+                paramJson.put("thing2", thing2);
+
+                JSONObject time5 = new JSONObject();
+                time5.put("value", startTime);
+                paramJson.put("time5", time5);
+
+                JSONObject time6 = new JSONObject();
+                time6.put("value", endTime);
+                paramJson.put("time6", time6);
+
+                JSONObject thing7 = new JSONObject();
+                thing7.put("value", meetingApply.getMeetingSummary());
+                paramJson.put("thing7", thing7);
+
+                JSONObject thing8 = new JSONObject();
+                thing8.put("value", startUserName);
+                paramJson.put("thing8", thing8);
+
+                weChatSendMessageDto.setContent(paramJson);
+                weChatService.sendTemplateMessage(weChatSendMessageDto);
+            }
         }
     }
 }

+ 50 - 0
src/main/java/com/xjrsoft/module/oa/vo/MeetingRoomListVo.java

@@ -0,0 +1,50 @@
+package com.xjrsoft.module.oa.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+/**
+* @title: 会议室列表(不分页)出参
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+public class MeetingRoomListVo {
+
+    @ApiModelProperty("主键id")
+    private Long id;
+    /**
+     * 会议室名称
+     */
+    @ApiModelProperty("会议室名称")
+    private String name;
+    /**
+     * 预约情况
+     */
+    @ApiModelProperty("预约情况")
+    private String reservationDetail;
+    /**
+     * 楼栋(base_office_build)
+     */
+    @ApiModelProperty("楼栋(base_office_build)")
+    private String officeBuildIdCn;
+    /**
+     * 楼层
+     */
+    @ApiModelProperty("楼层")
+    private Integer floorNum;
+    /**
+     * 容量(最大人数)
+     */
+    @ApiModelProperty("容量(最大人数)")
+    private Integer capacity;
+    /**
+     * 会议室名称
+     */
+    @ApiModelProperty("会议室在时间段内的状态,0:可以正常使用,1:在当前时间端已经预约")
+    private Integer status;
+}

+ 104 - 0
src/main/java/com/xjrsoft/module/oa/vo/WfMeetingApplyPageVo.java

@@ -0,0 +1,104 @@
+package com.xjrsoft.module.oa.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 分页列表出参
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+public class WfMeetingApplyPageVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private String id;
+    /**
+    * 会议日期
+    */
+    @ApiModelProperty("会议日期")
+    private Date meetingApplyDate;
+    /**
+    * 会议开始时间
+    */
+    @ApiModelProperty("会议开始时间")
+    private LocalTime meetingApplyS;
+    /**
+    * 会议结束时间
+    */
+    @ApiModelProperty("会议结束时间")
+    private LocalTime meetingApplyE;
+    /**
+    * 会议形式(xjr_dictionary_item(meeting_type))
+    */
+    @ApiModelProperty("会议形式(xjr_dictionary_item(meeting_type))")
+    private String meetingApplyFormat;
+    /**
+    * 会议室管理主键id(meeting_room)
+    */
+    @ApiModelProperty("会议室管理主键id(meeting_room)")
+    private Long meetingRoomId;
+    /**
+    * 线上会议链接
+    */
+    @ApiModelProperty("线上会议链接")
+    private String meetingApplyUrl;
+    /**
+    * 参会人员
+    */
+    @ApiModelProperty("参会人员")
+    private String meetingApplyParticipants;
+    /**
+    * 主持人
+    */
+    @ApiModelProperty("主持人")
+    private String meetingApplyHost;
+    /**
+    * 会议主题
+    */
+    @ApiModelProperty("会议主题")
+    private String meetingApplyTheme;
+    /**
+    * 会议议题
+    */
+    @ApiModelProperty("会议议题")
+    private String meetingApplyTopics;
+    /**
+    * 是否准备座牌、会标(1:是,0:否)
+    */
+    @ApiModelProperty("是否准备座牌、会标(1:是,0:否)")
+    private Integer isMonogram;
+    /**
+    * 会标主题
+    */
+    @ApiModelProperty("会标主题")
+    private String monogramTheme;
+    /**
+    * 会议纪要
+    */
+    @ApiModelProperty("会议纪要")
+    private String meetingSummary;
+    /**
+    * 会前资料文件上传主键id
+    */
+    @ApiModelProperty("会前资料文件上传主键id")
+    private Long preMeetingInfoFileId;
+    /**
+    * 会议状态(0:未开始 1:已经撤销,2:已结束)
+    */
+    @ApiModelProperty("会议状态(0:未开始 1:已经撤销,2:已结束)")
+    private Integer meetingStatus;
+
+}

+ 140 - 11
src/main/resources/sqlScript/20250324_sql.sql

@@ -4,18 +4,147 @@
 DROP TABLE IF EXISTS `base_teacher_change_record`;
 CREATE TABLE `base_teacher_change_record`
 (
-    id             bigint      not null comment '主键编号'
+    id             bigint       not null comment '主键编号'
         primary key,
-    create_user_id BIGINT NULL COMMENT '创建人',
-    create_date    DATETIME NULL COMMENT '创建时间',
-    modify_user_id BIGINT NULL COMMENT '修改人',
-    modify_date    DATETIME NULL COMMENT '修改时间',
-    delete_mark    INT         NOT NULL COMMENT '删除标记',
-    enabled_mark   INT         NOT NULL COMMENT '有效标志',
-
-    user_id        bigint      NOT NULL COMMENT '变更教职工主键id',
-    change_type    varchar(64) NOT NULL COMMENT '异动类型(xjr_dictionary_item[tea_change_type])',
+    create_user_id BIGINT       NULL COMMENT '创建人',
+    create_date    DATETIME     NULL COMMENT '创建时间',
+    modify_user_id BIGINT       NULL COMMENT '修改人',
+    modify_date    DATETIME     NULL COMMENT '修改时间',
+    delete_mark    INT          NOT NULL COMMENT '删除标记',
+    enabled_mark   INT          NOT NULL COMMENT '有效标志',
+
+    user_id        bigint       NOT NULL COMMENT '变更教职工主键id',
+    change_type    varchar(64)  NOT NULL COMMENT '异动类型(xjr_dictionary_item[tea_change_type])',
     new_job_state  varchar(256) NOT NULL COMMENT '新的在职状态',
     old_job_state  varchar(256) NOT NULL COMMENT '旧的在职状态'
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8mb4 COMMENT = '教职工异动记录';
+  DEFAULT CHARSET = utf8mb4 COMMENT = '教职工异动记录';
+
+-- ----------------------------
+-- 会议室管理
+-- ----------------------------
+DROP TABLE IF EXISTS `meeting_room`;
+CREATE TABLE `meeting_room`
+(
+    id              bigint      not null comment '主键编号'
+        primary key,
+    create_user_id  BIGINT      NULL COMMENT '创建人',
+    create_date     DATETIME    NULL COMMENT '创建时间',
+    modify_user_id  BIGINT      NULL COMMENT '修改人',
+    modify_date     DATETIME    NULL COMMENT '修改时间',
+    delete_mark     INT         NOT NULL COMMENT '删除标记',
+    enabled_mark    INT         NOT NULL COMMENT '有效标志',
+
+    name            varchar(64) not null comment '会议室名称',
+    office_build_id bigint      not null comment '楼栋(base_office_build)',
+    floor_num       int         not null comment '楼层',
+    number          varchar(32) null comment '门牌号',
+    capacity        int         null comment '容量(最大人数)',
+    square          double      null comment '会议室面积(平米)',
+    user_id         longtext    null comment '会议室管理员(多人)(xjr_user)',
+    user_phone      longtext    null comment '管理员联系方式',
+    status          int         not null comment '状态(1:启用 0:停用)'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT = '会议室管理';
+
+
+alter table wf_meeting_apply
+    modify meeting_apply_date date not null comment '会议日期';
+
+alter table wf_meeting_apply
+    modify meeting_apply_s time not null comment '会议开始时间';
+
+alter table wf_meeting_apply
+    modify meeting_apply_e time not null comment '会议结束时间';
+
+alter table wf_meeting_apply
+    modify meeting_apply_format varchar(64) not null comment '会议形式(xjr_dictionary_item(meeting_type))';
+
+alter table wf_meeting_apply
+    change meeting_apply_address meeting_room_id BIGINT null comment '会议室管理主键id(meeting_room)' after meeting_apply_format;
+
+alter table wf_meeting_apply
+    add meeting_apply_url varchar(1024) null comment '线上会议链接' after meeting_room_id;
+
+alter table wf_meeting_apply
+    modify meeting_apply_theme varchar(512) null comment '会议主题';
+
+alter table wf_meeting_apply
+    modify meeting_apply_topics varchar(512) null comment '会议议题';
+
+alter table wf_meeting_apply
+    modify is_monogram int default 0 null comment '是否准备座牌、会标(1:是,0:否)';
+
+alter table wf_meeting_apply
+    change monogram monogram_theme varchar(512) null comment '会标主题';
+
+alter table wf_meeting_apply
+    drop column meeting_apply_tip;
+
+alter table wf_meeting_apply
+    drop column meeting_apply_pmm;
+
+alter table wf_meeting_apply
+    add `meeting_summary` longtext null comment '会议纪要' after monogram_theme;
+
+alter table wf_meeting_apply
+    drop column meeting_apply_sign_in;
+
+alter table wf_meeting_apply
+    add pre_meeting_Info_file_id bigint null comment '会前资料文件上传主键id' after `meeting_summary`;
+
+alter table wf_meeting_apply
+    drop column meeting_apply_up;
+
+alter table wf_meeting_apply
+    drop column meeting_apply_mission;
+
+alter table wf_meeting_apply
+    drop column meeting_apply_down;
+
+alter table wf_meeting_apply
+    change status meeting_status int default 0 null comment '会议状态(0:未开始 1:已经撤销,2:已结束)';
+
+-- ----------------------------
+-- 会议参会人员
+-- ----------------------------
+DROP TABLE IF EXISTS `meeting_conferee`;
+CREATE TABLE `meeting_conferee`
+(
+    id                  bigint   not null comment '主键编号'
+        primary key,
+    create_user_id      BIGINT   NULL COMMENT '创建人',
+    create_date         DATETIME NULL COMMENT '创建时间',
+    modify_user_id      BIGINT   NULL COMMENT '修改人',
+    modify_date         DATETIME NULL COMMENT '修改时间',
+    delete_mark         INT      NOT NULL COMMENT '删除标记',
+    enabled_mark        INT      NOT NULL COMMENT '有效标志',
+
+    wf_meeting_apply_id bigint   not null comment '会议申请主键id(wf_meeting_apply)',
+    user_id             bigint   not null comment '用户主键id(xjr_user)',
+    check_in_date       DATETIME NULL COMMENT '签到时间',
+    check_in_status     int      not null default 0 comment '签到状态(0:未签到,1:已签到)'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT = '会议参会人员';
+
+-- ----------------------------
+-- 会议参会人员意见
+-- ----------------------------
+DROP TABLE IF EXISTS `meeting_conferee_opinion`;
+CREATE TABLE `meeting_conferee_opinion`
+(
+    id                  bigint   not null comment '主键编号'
+        primary key,
+    create_user_id      BIGINT   NULL COMMENT '创建人',
+    create_date         DATETIME NULL COMMENT '创建时间',
+    modify_user_id      BIGINT   NULL COMMENT '修改人',
+    modify_date         DATETIME NULL COMMENT '修改时间',
+    delete_mark         INT      NOT NULL COMMENT '删除标记',
+    enabled_mark        INT      NOT NULL COMMENT '有效标志',
+
+    meeting_conferee_id bigint   not null comment '会议参会人员主键id(meeting_conferee)',
+    user_id             text     not null comment '意见'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT = '会议参会人员意见';
+
+

+ 3 - 3
src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest.java

@@ -284,9 +284,9 @@ class JianyuekbScheduleTaskTest {
         tableName = "base_classroom";
         Map<String, String> classroomMap = dataMap.get(tableName);
 
-        Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap,
-                teacherMap, classMap, courseReceiveMsgId, startDate, endDate);
-        sendMsg(techerIds, courseReceiveMsgId);
+//        Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap,
+//                teacherMap, classMap, courseReceiveMsgId, startDate, endDate);
+//        sendMsg(techerIds, courseReceiveMsgId);
         dataUtil.insertClassTime(scheduleInfo);
     }
 

+ 3 - 3
src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest2.java

@@ -282,9 +282,9 @@ class JianyuekbScheduleTaskTest2 {
         tableName = "base_classroom";
         Map<String, String> classroomMap = dataMap.get(tableName);
 
-        Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap, courseReceiveMsgId, null, null);
-        sendMsg(techerIds, courseReceiveMsgId);
-        dataUtil.insertClassTime(scheduleInfo);
+//        Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap, courseReceiveMsgId, null, null);
+//        sendMsg(techerIds, courseReceiveMsgId);
+//        dataUtil.insertClassTime(scheduleInfo);
     }
 
     void sendMsg(Set<String> techerIds, Long courseReceiveMsgId){

+ 100 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -4494,4 +4494,104 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcMeetingRoom() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("meeting_room");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("phoenix");//作者名称
+        params.setPackageName("oa");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcWfMeetingApply() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("wf_meeting_apply");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("phoenix");//作者名称
+        params.setPackageName("oa");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcMeetingConferee() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("meeting_conferee");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("phoenix");//作者名称
+        params.setPackageName("oa");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcMeetingConfereeOpinion() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("meeting_conferee_opinion");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("phoenix");//作者名称
+        params.setPackageName("oa");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(false);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }