Browse Source

签到
参会意见提交

大数据与最优化研究所 2 weeks ago
parent
commit
7e27f97efd

+ 40 - 2
src/main/java/com/xjrsoft/module/oa/controller/WfMeetingApplyController.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.oa.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -10,6 +11,8 @@ import com.xjrsoft.module.oa.dto.*;
 import com.xjrsoft.module.oa.entity.WfMeetingApply;
 import com.xjrsoft.module.oa.service.IWfMeetingApplyService;
 import com.xjrsoft.module.oa.vo.*;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -32,6 +35,8 @@ public class WfMeetingApplyController {
 
     private final IWfMeetingApplyService wfMeetingApplyService;
 
+    private final IFileService fileService;
+
     @GetMapping(value = "/list_meeting_room")
     @ApiOperation(value="会议室列表(不分页)")
     @SaCheckPermission("wfmeetingapply:detail")
@@ -61,10 +66,22 @@ public class WfMeetingApplyController {
         return RT.ok(pageOutput);
     }
 
+    @GetMapping(value = "/mobile-info")
+    @ApiOperation(value="移动端会议信息会议的详情")
+    @SaCheckPermission("wfmeetingapply:detail")
+    @XjrLog(value = "移动端会议信息会议的详情")
+    public RT<MeetingMobileInfoVo> mobileInfo(@RequestParam Long id){
+        MeetingMobileInfoVo meetingMobileInfoVo = wfMeetingApplyService.mobileInfo(id);
+        if (meetingMobileInfoVo == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(meetingMobileInfoVo);
+    }
+
     @GetMapping(value = "/info_in_workflow")
     @ApiOperation(value="按照流程查看详情")
     @SaCheckPermission("wfmeetingapply:detail")
-    @XjrLog(value = "根据id查询信息")
+    @XjrLog(value = "按照流程查看详情")
     public RT<WfMeetingApplyInWorkflowVo> infoInWorkflow(@RequestParam Long id){
         WfMeetingApplyInWorkflowVo wfMeetingApplyInWorkflowVo = wfMeetingApplyService.infoInWorkflow(id);
         if (wfMeetingApplyInWorkflowVo == null) {
@@ -105,15 +122,19 @@ public class WfMeetingApplyController {
     @GetMapping(value = "/meetingSummary_info")
     @ApiOperation(value="获取会议纪要")
     @SaCheckPermission("wfmeetingapply:detail")
-    @XjrLog(value = "根据id查询信息")
+    @XjrLog(value = "获取会议纪要")
     public RT<MeetingSummaryVo> meetingSummaryInfo(@RequestParam Long id){
         WfMeetingApply wfMeetingApply = wfMeetingApplyService.getById(id);
         if (wfMeetingApply == null) {
            return RT.error("找不到此数据!");
         }
+
         MeetingSummaryVo meetingSummaryVo = new MeetingSummaryVo();
         meetingSummaryVo.setId(wfMeetingApply.getId());
         meetingSummaryVo.setMeetingSummary(wfMeetingApply.getMeetingSummary());
+        List<File> fileList = fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId, wfMeetingApply.getPreMeetingInfoFileId()));
+        meetingSummaryVo.setFileInfos(fileList);
+
         return RT.ok(meetingSummaryVo);
     }
 
@@ -125,6 +146,23 @@ public class WfMeetingApplyController {
         return RT.ok(wfMeetingApplyService.updateRevocationMeeting(dto));
     }
 
+    @PutMapping(value = "/update_meeting_check_in")
+    @ApiOperation(value = "签到")
+    @SaCheckPermission("wfmeetingapply:edit")
+    @XjrLog(value = "签到")
+    public RT<Boolean> updateMeetingCheckIn(@Valid @RequestBody UpdateMeetingCheckInDto dto){
+        return RT.ok(wfMeetingApplyService.updateMeetingCheckIn(dto));
+    }
+
+    @PostMapping(value = "/add_meeting_conferee_opinion")
+    @ApiOperation(value = "参会意见提交")
+    @SaCheckPermission("wfmeetingapply:add")
+    @XjrLog(value = "参会意见提交")
+    public RT<Boolean> addMeetingConfereeOpinion(@Valid @RequestBody AddMeetingConfereeOpinionDto dto){
+        boolean isSuccess = wfMeetingApplyService.addMeetingConfereeOpinion(dto);
+        return RT.ok(isSuccess);
+    }
+
 //    @GetMapping(value = "/info")
 //    @ApiOperation(value="根据id查询信息")
 //    @SaCheckPermission("wfmeetingapply:detail")

+ 42 - 0
src/main/java/com/xjrsoft/module/oa/dto/AddMeetingConfereeOpinionDto.java

@@ -0,0 +1,42 @@
+package com.xjrsoft.module.oa.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+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-27
+* @Version 1.0
+*/
+@Data
+public class AddMeetingConfereeOpinionDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 会议申请主键id(wf_meeting_apply)
+    */
+    @ApiModelProperty("会议申请主键id(wf_meeting_apply)")
+    private Long wfMeetingApplyId;
+    /**
+    * 用户主键id(xjr_user)
+    */
+    @ApiModelProperty("用户主键id(xjr_user)")
+    private Long userId;
+    /**
+    * 意见
+    */
+    @ApiModelProperty("意见")
+    private String opinion;
+}

+ 21 - 0
src/main/java/com/xjrsoft/module/oa/dto/UpdateMeetingCheckInDto.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.oa.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 编辑会议纪要
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+public class UpdateMeetingCheckInDto {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 5 - 0
src/main/java/com/xjrsoft/module/oa/dto/UpdateMeetingSummaryDto.java

@@ -26,4 +26,9 @@ public class UpdateMeetingSummaryDto {
      */
     @ApiModelProperty("会议纪要")
     private String meetingSummary;
+    /**
+     * 会议纪要附件
+     */
+    @ApiModelProperty("会议纪要附件")
+    private Long meetingSummaryFileId;
 }

+ 9 - 4
src/main/java/com/xjrsoft/module/oa/entity/MeetingConfereeOpinion.java

@@ -20,7 +20,7 @@ import java.util.Date;
 /**
 * @title: 会议参会人员意见
 * @Author phoenix
-* @Date: 2025-03-26
+* @Date: 2025-03-27
 * @Version 1.0
 */
 @Data
@@ -74,10 +74,15 @@ public class MeetingConfereeOpinion implements Serializable {
     @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
     /**
-    * 会议参会人员主键id(meeting_conferee)
+    * 会议申请主键id(wf_meeting_apply)
     */
-    @ApiModelProperty("会议参会人员主键id(meeting_conferee)")
-    private Long meetingConfereeId;
+    @ApiModelProperty("会议申请主键id(wf_meeting_apply)")
+    private Long wfMeetingApplyId;
+    /**
+    * 用户主键id(xjr_user)
+    */
+    @ApiModelProperty("用户主键id(xjr_user)")
+    private Long userId;
     /**
     * 意见
     */

+ 5 - 0
src/main/java/com/xjrsoft/module/oa/entity/WfMeetingApply.java

@@ -100,6 +100,11 @@ public class WfMeetingApply implements Serializable {
     */
     @ApiModelProperty("会议纪要")
     private String meetingSummary;
+    /**
+     * 会议纪要附件
+     */
+    @ApiModelProperty("会议纪要附件")
+    private Long meetingSummaryFileId;
     /**
     * 会前资料文件上传主键id
     */

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

@@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
 /**
 * @title: 会议参会人员意见
 * @Author phoenix
-* @Date: 2025-03-26
+* @Date: 2025-03-27
 * @Version 1.0
 */
 @Mapper

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

@@ -23,6 +23,8 @@ public interface IWfMeetingApplyService extends MPJBaseService<WfMeetingApply> {
 
     IPage<TodayMeetingMobilePageVo> todayMeetingMobilePage(TodayMeetingMobilePageDto dto);
 
+    MeetingMobileInfoVo mobileInfo(Long id);
+
     WfMeetingApplyInWorkflowVo infoInWorkflow(Long id);
 
     List<MeetingConfereeListVo> listMeetingConferee(MeetingConfereeListDto dto);
@@ -32,4 +34,8 @@ public interface IWfMeetingApplyService extends MPJBaseService<WfMeetingApply> {
     void noticeParticipants(Long id);
 
     Boolean updateRevocationMeeting(UpdateRevocationMeetingDto dto);
+
+    Boolean updateMeetingCheckIn(UpdateMeetingCheckInDto dto);
+
+    Boolean addMeetingConfereeOpinion(AddMeetingConfereeOpinionDto dto);
 }

+ 203 - 72
src/main/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
@@ -85,17 +86,17 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
     @Override
     public List<MeetingRoomListVo> listMeetingRoom(MeetingRoomListDto dto) {
         List<MeetingRoomListVo> usableResult = new ArrayList<>();
-        if(ObjectUtils.isEmpty(dto.getMeetingApplyDate())
+        if (ObjectUtils.isEmpty(dto.getMeetingApplyDate())
                 || ObjectUtils.isEmpty(dto.getMeetingApplyS())
                 || ObjectUtils.isEmpty(dto.getMeetingApplyE())
-        ){
+        ) {
             return usableResult;
         }
 
         // 处理时间
         LocalDate meetingApplyDate = LocalDate.parse(dto.getMeetingApplyDate());
-        LocalTime startTime =  LocalTime.parse(dto.getMeetingApplyS());
-        LocalTime endTime =  LocalTime.parse(dto.getMeetingApplyE());
+        LocalTime startTime = LocalTime.parse(dto.getMeetingApplyS());
+        LocalTime endTime = LocalTime.parse(dto.getMeetingApplyE());
 
         // 获取所有的教室
         MPJLambdaWrapper<MeetingRoom> meetingRoomMPJLambdaWrapper = new MPJLambdaWrapper<>();
@@ -107,7 +108,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 .selectAs(BaseOfficeBuild::getName, MeetingRoomListVo::getOfficeBuildIdCn)
                 .leftJoin(BaseOfficeBuild.class, BaseOfficeBuild::getId, MeetingRoom::getOfficeBuildId)
                 .eq(MeetingRoom::getStatus, 1)
-                ;
+        ;
         List<MeetingRoomListVo> result = meetingRoomMapper.selectJoinList(MeetingRoomListVo.class, meetingRoomMPJLambdaWrapper);
 
         // 获取会议申请日期已经预约的会议
@@ -133,7 +134,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
             meetingRoomListVo = new MeetingRoomListVo();
             for (WfMeetingApply wfMeetingApply : value) {
                 // 会议时间是否重叠
-                if(!(startTime.isBefore(wfMeetingApply.getMeetingApplyS()) || endTime.isAfter(wfMeetingApply.getMeetingApplyE()))){
+                if (!(startTime.isBefore(wfMeetingApply.getMeetingApplyS()) || endTime.isAfter(wfMeetingApply.getMeetingApplyE()))) {
                     isReservation = true;
                 }
                 reservationDetail.append(wfMeetingApply.getMeetingApplyS()).append("-").append(wfMeetingApply.getMeetingApplyE()).append("\r\n");
@@ -144,13 +145,13 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
             reservationMap.put(key, meetingRoomListVo);
         }
 
-        for (MeetingRoomListVo vo : result){
+        for (MeetingRoomListVo vo : result) {
             vo.setStatus(0);
             MeetingRoomListVo reservationRoom = reservationMap.get(vo.getId());
-            if(ObjectUtils.isEmpty(reservationRoom)){
+            if (ObjectUtils.isEmpty(reservationRoom)) {
                 usableResult.add(vo);
             }
-            if(ObjectUtils.isNotEmpty(reservationRoom) && reservationRoom.getStatus() == 0){
+            if (ObjectUtils.isNotEmpty(reservationRoom) && reservationRoom.getStatus() == 0) {
                 usableResult.add(vo);
             }
         }
@@ -164,8 +165,8 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
     public IPage<WfMeetingApplyPageVo> pageRabAndHand(WfMeetingApplyPageDto dto) {
         // 权限设置
         Long loginId = StpUtil.getLoginIdAsLong();
-        int permission =  1;
-        if(StpUtil.hasRole("Conference") || StpUtil.hasRole("ADMIN")){
+        int permission = 1;
+        if (StpUtil.hasRole("Conference") || StpUtil.hasRole("ADMIN")) {
             permission = 2;
         }
 
@@ -181,7 +182,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
                         wrapper -> wrapper
                                 .selectAs(DictionaryDetail::getName, WfMeetingApplyPageVo::getMeetingApplyFormatCn)
-                        )
+                )
                 .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
                         wrapper -> wrapper
                                 .selectAs(MeetingRoom::getName, WfMeetingApplyPageVo::getMeetingRoomIdCn)
@@ -191,34 +192,38 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                                 .selectAs(XjrUser::getName, WfMeetingApplyPageVo::getMeetingApplyHostCn)
                                 .like(StringUtils.isNotEmpty(dto.getMeetingApplyHostCn()), XjrUser::getName, dto.getMeetingApplyHostCn())
                 )
+                .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, WfMeetingApplyPageVo::getSponsorIdCn)
+                )
                 .eq(permission == 1, WfMeetingApply::getSponsorId, loginId)
                 .eq(WfMeetingApply::getWorkflowStatus, 1)
                 .ge(ObjectUtils.isNotEmpty(dto.getStartMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getStartMeetingApplyDate())
                 .le(ObjectUtils.isNotEmpty(dto.getEndMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getEndMeetingApplyDate())
                 .eq(StringUtils.isNotEmpty(dto.getMeetingApplyFormat()), WfMeetingApply::getMeetingApplyFormat, dto.getMeetingApplyFormat())
                 .like(StringUtils.isNotEmpty(dto.getMeetingApplyTheme()), WfMeetingApply::getMeetingApplyTheme, dto.getMeetingApplyTheme())
-                ;
-        if(ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 0){
+        ;
+        if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 0) {
             wfMeetingApplyPageVoMPJLambdaWrapper
                     .ge(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
                     .gt(WfMeetingApply::getMeetingApplyS, nowLocalTime)
-                    ;
+            ;
         }
 
-        if(ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 1){
+        if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 1) {
             wfMeetingApplyPageVoMPJLambdaWrapper
                     .eq(WfMeetingApply::getMeetingStatus, 1)
             ;
         }
 
-        if(ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 2){
+        if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 2) {
             wfMeetingApplyPageVoMPJLambdaWrapper
                     .le(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
                     .lt(WfMeetingApply::getMeetingApplyE, nowLocalTime)
             ;
         }
 
-        if(ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 3){
+        if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 3) {
             wfMeetingApplyPageVoMPJLambdaWrapper
                     .eq(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
                     .le(WfMeetingApply::getMeetingApplyS, nowLocalTime)
@@ -228,25 +233,18 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
 
         IPage<WfMeetingApplyPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), WfMeetingApplyPageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
 
-        List<String> ids = page.getRecords().stream()
-                .map(WfMeetingApplyPageVo::getId)
-                .collect(Collectors.toList());
-
-        // 根据数据主键id获取对应流程信息
-
-
         // 判断会议状态
-        for (WfMeetingApplyPageVo vo : page.getRecords()){
+        for (WfMeetingApplyPageVo vo : page.getRecords()) {
             if (vo.getMeetingStatus() != 1) {
                 if (vo.getMeetingApplyDate().isBefore(nowLocalDate)) {
                     vo.setMeetingStatus(2);
                 } else if (vo.getMeetingApplyDate().isAfter(nowLocalDate)) {
-                    vo.setMeetingStatus(1);
+                    vo.setMeetingStatus(0);
                 } else {
                     if (vo.getMeetingApplyE().isBefore(nowLocalTime)) {
                         vo.setMeetingStatus(2);
                     } else if (vo.getMeetingApplyS().isAfter(nowLocalTime)) {
-                        vo.setMeetingStatus(1);
+                        vo.setMeetingStatus(0);
                     } else {
                         vo.setMeetingStatus(3);
                     }
@@ -259,8 +257,110 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
 
     @Override
     public IPage<TodayMeetingMobilePageVo> todayMeetingMobilePage(TodayMeetingMobilePageDto dto) {
+        LocalTime nowLocalTime = LocalTime.now();
+        if(ObjectUtils.isEmpty(dto.getMeetingApplyDate())){
+            dto.setMeetingApplyDate(LocalDate.now());
+        }
+        Long loginId = StpUtil.getLoginIdAsLong();
 
-        return null;
+        MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        wfMeetingApplyPageVoMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(WfMeetingApply::getId)
+                .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(TodayMeetingMobilePageVo.class).contains(x.getProperty()))
+                .innerJoin(MeetingConferee.class, MeetingConferee::getWfMeetingApplyId, WfMeetingApply::getId,
+                        wrapper -> wrapper
+                                .selectAs(MeetingConferee::getCheckInStatus, TodayMeetingMobilePageVo::getCheckInStatus)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TodayMeetingMobilePageVo::getMeetingApplyFormatCn)
+                )
+                .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
+                        wrapper -> wrapper
+                                .selectAs(MeetingRoom::getName, TodayMeetingMobilePageVo::getMeetingRoomIdCn)
+                )
+                .eq(WfMeetingApply::getMeetingApplyDate, dto.getMeetingApplyDate())
+                .eq(MeetingConferee::getUserId, loginId)
+                .eq(WfMeetingApply::getWorkflowStatus, 1)
+                .orderByAsc(WfMeetingApply::getMeetingApplyS)
+        ;
+        IPage<TodayMeetingMobilePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), TodayMeetingMobilePageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
+        List<TodayMeetingMobilePageVo> record = page.getRecords();
+
+        // 分割并重组列表
+        List<TodayMeetingMobilePageVo> futureVo = new ArrayList<>(); // 当前时间之后的事件
+        List<TodayMeetingMobilePageVo> pastVo = new ArrayList<>();   // 当前时间之前的事件
+
+        // 处理状态
+        for (TodayMeetingMobilePageVo vo : record){
+            if (vo.getMeetingStatus() != 1) {
+                if (vo.getMeetingApplyE().isBefore(nowLocalTime)) {
+                    if(vo.getCheckInStatus() == 0){
+                        vo.setMeetingStatus(4);
+                    }
+                    if(vo.getCheckInStatus() == 1){
+                        vo.setMeetingStatus(2);
+                    }
+                } else if (vo.getMeetingApplyS().isAfter(nowLocalTime)) {
+                    vo.setMeetingStatus(0);
+                } else {
+                    vo.setMeetingStatus(3);
+                }
+            }
+
+            if (vo.getMeetingApplyS().isBefore(nowLocalTime)) {
+                pastVo.add(vo); // 过去的事件
+            } else {
+                futureVo.add(vo); // 未来的事件
+            }
+        }
+        List<TodayMeetingMobilePageVo> result = new ArrayList<>();
+        result.addAll(futureVo);
+        result.addAll(pastVo);
+
+        page.setRecords(result);
+
+        return page;
+    }
+
+    @Override
+    public MeetingMobileInfoVo mobileInfo(Long id) {
+        MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        wfMeetingApplyPageVoMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(WfMeetingApply::getId)
+                .select(" (SELECT GROUP_CONCAT(a.name) FROM xjr_user a" +
+                        " LEFT JOIN meeting_conferee b ON b.user_id = a.id" +
+                        " WHERE b.delete_mark = 0 AND b.wf_meeting_apply_id = t.id) as meetingApplyParticipantsCn")
+                .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(MeetingMobileInfoVo.class).contains(x.getProperty()))
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, MeetingMobileInfoVo::getMeetingApplyFormatCn)
+                )
+                .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
+                        wrapper -> wrapper
+                                .selectAs(MeetingRoom::getName, MeetingMobileInfoVo::getMeetingRoomIdCn)
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getMeetingApplyHost,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, MeetingMobileInfoVo::getMeetingApplyHostCn)
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, MeetingMobileInfoVo::getSponsorIdCn)
+                )
+                .eq(WfMeetingApply::getId, id)
+        ;
+
+        MeetingMobileInfoVo info = this.selectJoinOne(MeetingMobileInfoVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
+
+        if (ObjectUtils.isNotEmpty(info)) {
+            List<File> fileList = fileMapper.selectList(Wrappers.<File>query().lambda().eq(File::getFolderId, info.getPreMeetingInfoFileId()));
+            info.setFileInfos(fileList);
+        }
+
+        return info;
     }
 
     @Override
@@ -285,12 +385,16 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                         wrapper -> wrapper
                                 .selectAs(XjrUser::getName, WfMeetingApplyInWorkflowVo::getMeetingApplyHostCn)
                 )
+                .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, WfMeetingApplyInWorkflowVo::getSponsorIdCn)
+                )
                 .eq(WfMeetingApply::getId, id)
         ;
 
         WfMeetingApplyInWorkflowVo info = this.selectJoinOne(WfMeetingApplyInWorkflowVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
 
-        if(ObjectUtils.isNotEmpty(info)){
+        if (ObjectUtils.isNotEmpty(info)) {
             List<File> fileList = fileMapper.selectList(Wrappers.<File>query().lambda().eq(File::getFolderId, info.getPreMeetingInfoFileId()));
             info.setFileInfos(fileList);
 
@@ -345,18 +449,13 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
         meetingConfereeOpinionMPJLambdaWrapper
                 .disableSubLogicDel()
                 .select(MeetingConfereeOpinion::getId)
-                .selectAs(MeetingConferee::getUserId, MeetingConfereeOpinionListVo::getUserId)
                 .select(MeetingConfereeOpinion.class, x -> VoToColumnUtil.fieldsToColumns(MeetingConfereeOpinionListVo.class).contains(x.getProperty()))
-                .innerJoin(MeetingConferee.class,
-                        wrapper -> wrapper
-                                .eq(MeetingConferee::getId, MeetingConfereeOpinion::getMeetingConfereeId)
-                                .eq(MeetingConferee::getWfMeetingApplyId, dto.getWfMeetingApplyId())
-                )
-                .leftJoin(XjrUser.class, XjrUser::getId, MeetingConferee::getUserId,
+                .leftJoin(XjrUser.class, XjrUser::getId, MeetingConfereeOpinion::getUserId,
                         wrapper -> wrapper
-                                .selectAs(XjrUser::getName, MeetingConfereeListVo::getUserIdCn)
+                                .selectAs(XjrUser::getName, MeetingConfereeOpinionListVo::getUserIdCn)
                 )
-                ;
+                .eq(MeetingConfereeOpinion::getWfMeetingApplyId, dto.getWfMeetingApplyId())
+        ;
         return meetingConfereeOpinionMapper.selectJoinList(MeetingConfereeOpinionListVo.class, meetingConfereeOpinionMPJLambdaWrapper);
     }
 
@@ -369,11 +468,11 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 .select(WfMeetingApply::getId)
                 .selectAs(MeetingRoom::getName, WfMeetingApply::getMeetingSummary) // 将会议室的名称暂时放在会议纪要字段中
                 .selectAs(XjrUser::getName, WfMeetingApply::getMonogramTheme) // 将会议发起人名称暂时放在会标主题字段中
-                .select(WfMeetingApply.class,x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
+                .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
                 .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId)
                 .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId)
                 .eq(WfMeetingApply::getId, id)
-                ;
+        ;
         WfMeetingApply meetingApply = this.selectJoinOne(WfMeetingApply.class, wrapper);
 
         // 根据数据id找到所在流程得状态
@@ -399,7 +498,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
             List<String> userIds = Arrays.asList(meetingApply.getMeetingApplyParticipants().split(","));
 
             // 处理会议时间
-            List<User> userList = userService.list(new QueryWrapper<User>().lambda().in(User::getId, userIds).isNotNull(User::getOpenId));
+            List<User> userList = userService.list(new QueryWrapper<User>().lambda().in(User::getId, userIds));
             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());
@@ -430,34 +529,36 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
 
             // 发送微信通知,和添加到记录分开是预防添加出现异常只通知一部人。
             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", meetingApply.getMonogramTheme());
-                paramJson.put("thing8", thing8);
-
-                weChatSendMessageDto.setContent(paramJson);
-                weChatService.sendTemplateMessage(weChatSendMessageDto);
+                if (ObjectUtils.isNotEmpty(user.getOpenId())) {
+                    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", meetingApply.getMonogramTheme());
+                    paramJson.put("thing8", thing8);
+
+                    weChatSendMessageDto.setContent(paramJson);
+                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+                }
             }
         }
 
@@ -482,7 +583,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
                 .disableSubLogicDel()
                 .select(WfMeetingApply::getId)
                 .selectAs(XjrUser::getName, WfMeetingApply::getMonogramTheme) // 将会议发起人名称暂时放在会标主题字段中
-                .select(WfMeetingApply.class,x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
+                .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
                 .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId)
                 .eq(WfMeetingApply::getId, dto.getId())
         ;
@@ -493,7 +594,7 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
         updateWfMeetingApply.setMeetingStatus(1);
         this.updateById(updateWfMeetingApply);
 
-        if(StringUtils.isNotEmpty(oldWfMeetingApply.getMeetingApplyParticipants())){
+        if (StringUtils.isNotEmpty(oldWfMeetingApply.getMeetingApplyParticipants())) {
             List<String> userIds = Arrays.asList(oldWfMeetingApply.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");
@@ -525,4 +626,34 @@ public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApply
         }
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateMeetingCheckIn(UpdateMeetingCheckInDto dto) {
+        LambdaUpdateWrapper<MeetingConferee> meetingConfereeLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        meetingConfereeLambdaUpdateWrapper
+                .eq(MeetingConferee::getWfMeetingApplyId, dto.getId())
+                .eq(MeetingConferee::getUserId, StpUtil.getLoginIdAsLong())
+                ;
+        MeetingConferee meetingConferee = new MeetingConferee();
+        meetingConferee.setCheckInStatus(1);
+        meetingConferee.setCheckInDate(new Date());
+        meetingConferee.setModifyDate(new Date());
+        meetingConferee.setModifyUserId(StpUtil.getLoginIdAsLong());
+        meetingConfereeMapper.update(meetingConferee, meetingConfereeLambdaUpdateWrapper);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addMeetingConfereeOpinion(AddMeetingConfereeOpinionDto dto) {
+        MeetingConfereeOpinion insert = new MeetingConfereeOpinion();
+        insert.setWfMeetingApplyId(dto.getWfMeetingApplyId());
+        insert.setUserId(StpUtil.getLoginIdAsLong());
+        insert.setOpinion(dto.getOpinion());
+        insert.setCreateDate(new Date());
+        insert.setCreateUserId(StpUtil.getLoginIdAsLong());
+        meetingConfereeOpinionMapper.insert(insert);
+        return true;
+    }
 }

+ 4 - 4
src/main/java/com/xjrsoft/module/oa/vo/MeetingConfereeOpinionListVo.java

@@ -23,10 +23,10 @@ public class MeetingConfereeOpinionListVo {
     @ApiModelProperty("主键编号")
     private Long id;
     /**
-    * 会议参会人员主键id(meeting_conferee)
-    */
-    @ApiModelProperty("会议参会人员主键id(meeting_conferee)")
-    private Long meetingConfereeId;
+     * 会议申请主键id(wf_meeting_apply)
+     */
+    @ApiModelProperty("会议申请主键id(wf_meeting_apply)")
+    private Long wfMeetingApplyId;
     /**
      * 用户主键id(xjr_user)
      */

+ 118 - 0
src/main/java/com/xjrsoft/module/oa/vo/MeetingMobileInfoVo.java

@@ -0,0 +1,118 @@
+package com.xjrsoft.module.oa.vo;
+
+import com.xjrsoft.module.system.entity.File;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 表单出参
+* @Author phoenix
+* @Date: 2025-03-26
+* @Version 1.0
+*/
+@Data
+public class MeetingMobileInfoVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private Long sponsorId;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private String sponsorIdCn;
+    /**
+    * 会议日期
+    */
+    @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;
+    /**
+     * 会议形式(xjr_dictionary_item(meeting_type))
+     */
+    @ApiModelProperty("会议形式(xjr_dictionary_item(meeting_type))")
+    private String meetingApplyFormatCn;
+    /**
+    * 会议室管理主键id(meeting_room)
+    */
+    @ApiModelProperty("会议室管理主键id(meeting_room)")
+    private Long meetingRoomId;
+    /**
+     * 会议室管理主键id(meeting_room)
+     */
+    @ApiModelProperty("会议室管理主键id(meeting_room)")
+    private String meetingRoomIdCn;
+    /**
+    * 线上会议链接
+    */
+    @ApiModelProperty("线上会议链接")
+    private String meetingApplyUrl;
+    /**
+    * 主持人
+    */
+    @ApiModelProperty("主持人")
+    private String meetingApplyHost;
+    /**
+     * 主持人
+     */
+    @ApiModelProperty("主持人")
+    private String meetingApplyHostCn;
+    /**
+    * 会议主题
+    */
+    @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;
+
+    @ApiModelProperty("附件列表")
+    private List<File> fileInfos;
+}

+ 11 - 0
src/main/java/com/xjrsoft/module/oa/vo/MeetingSummaryVo.java

@@ -1,8 +1,11 @@
 package com.xjrsoft.module.oa.vo;
 
+import com.xjrsoft.module.system.entity.File;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
 * @title: 会会议纪要出参
 * @Author phoenix
@@ -22,4 +25,12 @@ public class MeetingSummaryVo {
      */
     @ApiModelProperty("会议纪要")
     private String meetingSummary;
+    /**
+     * 会议纪要附件
+     */
+    @ApiModelProperty("会议纪要附件")
+    private Long meetingSummaryFileId;
+
+    @ApiModelProperty("附件列表")
+    private List<File> fileInfos;
 }

+ 16 - 1
src/main/java/com/xjrsoft/module/oa/vo/TodayMeetingMobilePageVo.java

@@ -20,6 +20,16 @@ public class TodayMeetingMobilePageVo {
     */
     @ApiModelProperty("")
     private String id;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private Long sponsorId;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private String sponsorIdCn;
     /**
     * 会议开始时间
     */
@@ -63,7 +73,7 @@ public class TodayMeetingMobilePageVo {
     /**
     * 会议状态(0:未开始 1:已经撤销,2:已结束)
     */
-    @ApiModelProperty("会议状态(0:未开始 1:已经撤销,2:已结束,3:进行中)")
+    @ApiModelProperty("会议状态(0:未开始 1:已经撤销,2:已结束,3:进行中,4:未参与)")
     private Integer meetingStatus;
 
     /**
@@ -71,4 +81,9 @@ public class TodayMeetingMobilePageVo {
      */
     @ApiModelProperty("当前用户的会议状态(0:未开始 1:已经撤销,2:已结束,3:进行中)")
     private Integer userMeetingStatus;
+    /**
+     * 签到状态(0:未签到,1:已签到)
+     */
+    @ApiModelProperty("签到状态(0:未签到,1:已签到)")
+    private Integer checkInStatus;
 }

+ 11 - 1
src/main/java/com/xjrsoft/module/oa/vo/WfMeetingApplyInWorkflowVo.java

@@ -23,6 +23,16 @@ public class WfMeetingApplyInWorkflowVo {
     */
     @ApiModelProperty("")
     private Long id;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private Long sponsorId;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private String sponsorIdCn;
     /**
     * 会议日期
     */
@@ -57,7 +67,7 @@ public class WfMeetingApplyInWorkflowVo {
      * 会议室管理主键id(meeting_room)
      */
     @ApiModelProperty("会议室管理主键id(meeting_room)")
-    private Long meetingRoomIdCn;
+    private String meetingRoomIdCn;
     /**
     * 线上会议链接
     */

+ 10 - 6
src/main/java/com/xjrsoft/module/oa/vo/WfMeetingApplyPageVo.java

@@ -20,6 +20,16 @@ public class WfMeetingApplyPageVo {
     */
     @ApiModelProperty("")
     private String id;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private Long sponsorId;
+    /**
+     * 会议发起人主键id(xjr_user
+     */
+    @ApiModelProperty("会议发起人主键id(xjr_user")
+    private String sponsorIdCn;
     /**
     * 会议日期
     */
@@ -95,10 +105,4 @@ public class WfMeetingApplyPageVo {
     */
     @ApiModelProperty("会议状态(0:未开始 1:已经撤销,2:已结束,3:进行中)")
     private Integer meetingStatus;
-
-    @ApiModelProperty("流程主键id")
-    private Long processId;
-
-    @ApiModelProperty("任务主键id")
-    private Long taskId;
 }

+ 6 - 1
src/main/resources/sqlScript/20250324_sql.sql

@@ -116,6 +116,10 @@ alter table wf_meeting_apply
 
 alter table wf_meeting_apply
     modify workflow_status int default 0 null comment '会议申请流程状态(0:未结束,1:已经结束,正常通过,2:已经结束,未正常通过)';
+
+alter table wf_meeting_apply
+    add meeting_summary_file_id BIGINT null comment '会议纪要附件' after meeting_summary;
+
 -- ----------------------------
 -- 会议参会人员
 -- ----------------------------
@@ -153,7 +157,8 @@ CREATE TABLE `meeting_conferee_opinion`
     delete_mark         INT      NOT NULL COMMENT '删除标记',
     enabled_mark        INT      NOT NULL COMMENT '有效标志',
 
-    meeting_conferee_id bigint   not null comment '会议参会人员主键id(meeting_conferee)',
+    wf_meeting_apply_id bigint   not null comment '会议申请主键id(wf_meeting_apply)',
+    user_id             bigint   not null comment '用户主键id(xjr_user)',
     opinion             text     not null comment '意见'
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT = '会议参会人员意见';

+ 21 - 0
src/test/java/com/xjrsoft/module/oa/service/impl/WfMeetingApplyServiceImplTest.java

@@ -0,0 +1,21 @@
+package com.xjrsoft.module.oa.service.impl;
+
+import com.xjrsoft.module.oa.service.IOfficialDocumentReceivedService;
+import com.xjrsoft.module.oa.service.IWfMeetingApplyService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@SpringBootTest
+class WfMeetingApplyServiceImplTest {
+
+    @Autowired
+    private IWfMeetingApplyService wfMeetingApplyService;
+
+    @Test
+    void noticeParticipants() {
+        wfMeetingApplyService.noticeParticipants(1905133329842712576L);
+    }
+}