From e7f03acfa5ee4ad4fd6d1ee9e9ae9a5655488f6d Mon Sep 17 00:00:00 2001
From: 101captain <237651143@qq.com>
Date: 星期二, 09 十一月 2021 17:04:46 +0800
Subject: [PATCH] 1109修改

---
 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java | 1305 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 1,253 insertions(+), 52 deletions(-)

diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java
index 7ca677b..dee86d2 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java
@@ -1,32 +1,97 @@
 package com.panzhihua.service_community.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.panzhihua.common.model.dtos.community.ComActDiscussDTO;
-import com.panzhihua.common.model.vos.LoginUserInfoVO;
-import com.panzhihua.common.model.vos.R;
-import com.panzhihua.common.model.vos.community.ComActDiscussOptionVO;
-import com.panzhihua.common.model.vos.community.ComActDiscussVO;
-import com.panzhihua.service_community.dao.*;
-import com.panzhihua.service_community.model.dos.*;
-import com.panzhihua.service_community.service.ComActDiscussOptionService;
-import com.panzhihua.service_community.service.ComActDiscussService;
+import static java.util.Objects.isNull;
+import static java.util.Objects.nonNull;
+import static org.apache.commons.lang3.StringUtils.isBlank;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
 import org.springframework.beans.BeanUtils;
+import org.springframework.data.redis.connection.StringRedisConnection;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.SetOperations;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.panzhihua.common.constants.Constants;
+import com.panzhihua.common.exceptions.ServiceException;
+import com.panzhihua.common.model.dtos.community.ComActDiscussCommentDTO;
+import com.panzhihua.common.model.dtos.community.ComActDiscussCommentUserDTO;
+import com.panzhihua.common.model.dtos.community.ComActDiscussDTO;
+import com.panzhihua.common.model.dtos.community.ComActDiscussOptionDTO;
+import com.panzhihua.common.model.dtos.community.ComActDiscussOptionUserDTO;
+import com.panzhihua.common.model.dtos.community.ComActDiscussUserDTO;
+import com.panzhihua.common.model.dtos.community.PageComActDiscussCommentDTO;
+import com.panzhihua.common.model.dtos.community.PageComActDiscussDTO;
+import com.panzhihua.common.model.dtos.community.bigscreen.work.ScreenDiscussListDTO;
+import com.panzhihua.common.model.dtos.community.discuss.ComActDiscussDetailDTO;
+import com.panzhihua.common.model.dtos.community.discuss.ComActDiscussPublishResultDTO;
+import com.panzhihua.common.model.vos.LoginUserInfoVO;
+import com.panzhihua.common.model.vos.R;
+import com.panzhihua.common.model.vos.community.ComActDiscussCommentVO;
+import com.panzhihua.common.model.vos.community.ComActDiscussOptionUserVO;
+import com.panzhihua.common.model.vos.community.ComActDiscussOptionVO;
+import com.panzhihua.common.model.vos.community.ComActDiscussVO;
+import com.panzhihua.common.model.vos.community.ComActVO;
+import com.panzhihua.common.model.vos.community.SysConfVO;
+import com.panzhihua.common.model.vos.community.screen.work.DiscussListVO;
+import com.panzhihua.common.service.user.UserService;
+import com.panzhihua.common.utlis.DateUtils;
+import com.panzhihua.service_community.dao.ComActDiscussCommentDAO;
+import com.panzhihua.service_community.dao.ComActDiscussCommentUserDAO;
+import com.panzhihua.service_community.dao.ComActDiscussDAO;
+import com.panzhihua.service_community.dao.ComActDiscussOptionDAO;
+import com.panzhihua.service_community.dao.ComActDiscussOptionUserDAO;
+import com.panzhihua.service_community.dao.ComActDiscussUserDAO;
+import com.panzhihua.service_community.dao.SysConfMapper;
+import com.panzhihua.service_community.model.dos.ComActDiscussCommentDO;
+import com.panzhihua.service_community.model.dos.ComActDiscussCommentUserDO;
+import com.panzhihua.service_community.model.dos.ComActDiscussDO;
+import com.panzhihua.service_community.model.dos.ComActDiscussOptionDO;
+import com.panzhihua.service_community.model.dos.ComActDiscussOptionUserDO;
+import com.panzhihua.service_community.model.dos.ComActDiscussUserDO;
+import com.panzhihua.service_community.model.dos.SysConfDO;
+import com.panzhihua.service_community.service.ComActDiscussOptionService;
+import com.panzhihua.service_community.service.ComActDiscussService;
+import com.panzhihua.service_community.service.SysConfService;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * @program: springcloud_k8s_panzhihuazhihuishequ
- * @description: 一起议
+ * @description: 议事投票
  * @author: huang.hongfa weixin hhf9596 qq 959656820
  * @create: 2021-01-22 14:51
  **/
 @Service
+@Slf4j
 public class ComActDiscussServiceImpl implements ComActDiscussService {
+
+    private static final String DISCUSS_VIEW_NUM_PREFIX = "DISCUSS_VIEW_NUM";
+    private static final String INCR_VIEW_DISCUSS_IDS_KEY = "INCR_VIEW_DISCUSS_IDS";
+    private static final long DISCUSS_EXPIRE_TIME = 2678400L;
+
     @Resource
     private ComActDiscussCommentDAO comActDiscussCommentDAO;
     @Resource
@@ -38,10 +103,20 @@
     @Resource
     private ComActDiscussOptionDAO comActDiscussOptionDAO;
     @Resource
+    private ComActDiscussCommentUserDAO comActDiscussCommentUserDAO;
+    @Resource
     private ComActDiscussOptionService comActDiscussOptionService;
+    @Resource
+    private SysConfMapper sysConfDao;
+    @Resource
+    private SysConfService sysConfService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
 
     /**
-     * 一起议-新增
+     * 议事投票-新增
      *
      * @param comActDiscussDTO 新增参数
      * @return 新增结果
@@ -49,20 +124,45 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R addDiscuss(ComActDiscussDTO comActDiscussDTO) {
-        ComActDiscussDO comActDiscussDO=new ComActDiscussDO();
-        BeanUtils.copyProperties(comActDiscussDTO,comActDiscussDO);
+        if (!checkCurrentUserDiscussIdentity(comActDiscussDTO)) {
+            return R.fail("权限验证失败,请确认是否有发布权限");
+        }
+        ComActDiscussDO comActDiscussDO = new ComActDiscussDO();
+        BeanUtils.copyProperties(comActDiscussDTO, comActDiscussDO);
+        Integer type = comActDiscussDTO.getType();
+        Date nowDate = new Date();
+        if (type.equals(ComActDiscussDO.type.tp)) {//判断是投票,需要转义时间
+            Date startTime = DateUtils.stringToDate(comActDiscussDTO.getStartTime(), DateUtils.ymdhms_format);
+            Date endTime = DateUtils.stringToDate(comActDiscussDTO.getEndTime(), DateUtils.ymdhms_format);
+            comActDiscussDO.setStartTime(startTime);
+            comActDiscussDO.setEndTime(endTime);
+            comActDiscussDO.setStatus(ComActDiscussDO.status.wks);
+            //根据时间判断状态是否开始
+            if (startTime != null && startTime.getTime() <= nowDate.getTime()) {
+                comActDiscussDO.setStatus(ComActDiscussDO.status.jxz);
+                comActDiscussDO.setReleaseAt(nowDate);
+            }
+        } else {
+            comActDiscussDO.setStatus(ComActDiscussDO.status.yfb);
+        }
+        String address = comActDiscussDO.getAddress();
+        if (ObjectUtils.isEmpty(address)) {
+            //查询社区地址
+            ComActVO comActVO = comActDiscussDAO.selectCommunity(comActDiscussDTO.getCommunityId());
+            comActDiscussDO.setAddress(comActVO.getAddress());
+        }
         int insert = comActDiscussDAO.insert(comActDiscussDO);
-        if (insert>0) {
-            ComActDiscussDO comActDiscussDO1 = comActDiscussDAO.selectOne(new QueryWrapper<ComActDiscussDO>().lambda().eq(ComActDiscussDO::getSubject, comActDiscussDTO.getSubject()).eq(ComActDiscussDO::getUserId, comActDiscussDTO.getUserId()).last(" order by create_at desc limit 1 "));
-            Long comActDiscussDO1Id = comActDiscussDO1.getId();
-            Integer type = comActDiscussDTO.getType();
-            if (type.intValue()==2) {
-                List<String> discussOptions = comActDiscussDTO.getDiscussOptions();
-                List<ComActDiscussOptionDO> comActDiscussOptionDOS=new ArrayList<>();
+        if (insert > 0) {
+            //如果是投票,需要把投票的选项存储
+            if (type.equals(2)) {
+                Long comActDiscussDO1Id = comActDiscussDO.getId();
+                List<ComActDiscussOptionDTO> discussOptions = comActDiscussDTO.getDiscussOptions();
+                List<ComActDiscussOptionDO> comActDiscussOptionDOS = new ArrayList<>();
                 discussOptions.forEach(s -> {
-                    ComActDiscussOptionDO comActDiscussOptionDO=new ComActDiscussOptionDO();
+                    ComActDiscussOptionDO comActDiscussOptionDO = new ComActDiscussOptionDO();
                     comActDiscussOptionDO.setDiscussId(comActDiscussDO1Id);
-                    comActDiscussOptionDO.setOptionContent(s);
+                    comActDiscussOptionDO.setOptionContent(s.getOptionContent());
+                    comActDiscussOptionDO.setOptionUrl(s.getOptionUrl());
                     comActDiscussOptionDOS.add(comActDiscussOptionDO);
                 });
                 comActDiscussOptionService.saveBatch(comActDiscussOptionDOS);
@@ -73,55 +173,1156 @@
     }
 
     /**
-     * 一起议-详情
+     * 小程序用户验证是否拥有发布权限
+     * @param comActDiscussDTO
+     * @return
+     */
+    private boolean checkCurrentUserDiscussIdentity(ComActDiscussDTO comActDiscussDTO) {
+        //小程序用户验证是否拥有发布权限
+        boolean checkResult = true;
+        Boolean isApplets = comActDiscussDTO.getIsApplets();
+        if (nonNull(isApplets) && isApplets) {
+            String discussIdentityPrefix = "DISCUSS_IDENTITY_";
+            Long communityId = comActDiscussDTO.getCommunityId();
+            R sysConfValue = sysConfService.getSysConfValue(discussIdentityPrefix + communityId, communityId);
+            String discussIdentityConfig = (String) sysConfValue.getData();
+            if (isBlank(discussIdentityConfig)) {
+                checkResult = false;
+            } else {
+                List<String> currentUserRoles = new ArrayList<>();
+                List<String> sysAllowedRoles = Arrays.asList(discussIdentityConfig.split(","));
+                LoginUserInfoVO loginUserInfo = comActDiscussDTO.getLoginUserInfo();
+                if (loginUserInfo.getIsPartymember() == 1) {
+                    currentUserRoles.add("2");
+                }
+                if (loginUserInfo.getIsVolunteer().intValue() == 1) {
+                    currentUserRoles.add("3");
+                }
+                R isTeamResult = userService.checkCurrentUserIsTeam(loginUserInfo.getPhone(), loginUserInfo.getCommunityId());
+                if (R.isOk(isTeamResult) && (Boolean) isTeamResult.getData()) {
+                    currentUserRoles.add("4");
+                }
+                if (currentUserRoles.isEmpty()) {
+                    checkResult = false;
+                } else {
+                    if (!sysAllowedRoles.contains("1")) {
+                        boolean result = sysAllowedRoles.stream().anyMatch(role -> currentUserRoles.contains(role));
+                        if (!result) {
+                            checkResult = false;
+                        }
+                    }
+                }
+            }
+        }
+        return checkResult;
+    }
+
+    /**
+     * 议事投票-编辑
      *
-     * @param id 主键
+     * @param comActDiscussDTO 请求参数
+     * @return 编辑结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R editDiscuss(ComActDiscussDTO comActDiscussDTO) {
+        Long comActDiscussDO1Id = comActDiscussDTO.getId();
+        ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(comActDiscussDO1Id);
+        if (ObjectUtils.isEmpty(comActDiscussDO)) {
+            return R.fail("议事投票不存在");
+        }
+        if (!comActDiscussDO.getStatus().equals(ComActDiscussDO.status.wks) && !comActDiscussDO.getStatus().equals(ComActDiscussDO.status.yfb)) {
+            return R.fail("该状态不可修改");
+        }
+        Integer type = comActDiscussDO.getType();
+        Integer isRepeat = comActDiscussDO.getIsRepeat();
+        BeanUtils.copyProperties(comActDiscussDTO, comActDiscussDO);
+        comActDiscussDO.setType(type);
+        comActDiscussDO.setIsRepeat(isRepeat);
+        Date nowDate = new Date();
+        if (type.equals(ComActDiscussDO.type.tp)) {//判断是投票,需要转义时间
+            Date startTime = DateUtils.stringToDate(comActDiscussDTO.getStartTime(), DateUtils.ymdhms_format);
+            Date endTime = DateUtils.stringToDate(comActDiscussDTO.getEndTime(), DateUtils.ymdhms_format);
+            comActDiscussDO.setStartTime(startTime);
+            comActDiscussDO.setEndTime(endTime);
+            comActDiscussDO.setStatus(ComActDiscussDO.status.wks);
+            //根据时间判断状态是否开始
+            if (startTime != null && startTime.getTime() <= nowDate.getTime()) {
+                comActDiscussDO.setStatus(ComActDiscussDO.status.jxz);
+                comActDiscussDO.setReleaseAt(nowDate);
+            }
+        } else {
+            comActDiscussDO.setStatus(ComActDiscussDO.status.yfb);
+        }
+        comActDiscussDO.setUpdateAt(nowDate);
+        int insert = comActDiscussDAO.updateById(comActDiscussDO);
+        if (insert > 0) {
+            //如果是投票,需要把投票的选项存储
+            if (type.equals(2)) {
+                comActDiscussOptionService.remove(new QueryWrapper<ComActDiscussOptionDO>().lambda()
+                        .eq(ComActDiscussOptionDO::getDiscussId, comActDiscussDO1Id));
+                List<ComActDiscussOptionDO> comActDiscussOptionDOS = new ArrayList<>();
+                comActDiscussDTO.getDiscussOptions().forEach(s -> {
+                    ComActDiscussOptionDO comActDiscussOptionDO = new ComActDiscussOptionDO();
+                    comActDiscussOptionDO.setDiscussId(comActDiscussDO1Id);
+                    comActDiscussOptionDO.setOptionContent(s.getOptionContent());
+                    comActDiscussOptionDO.setOptionUrl(s.getOptionUrl());
+                    comActDiscussOptionDOS.add(comActDiscussOptionDO);
+                });
+                comActDiscussOptionService.saveBatch(comActDiscussOptionDOS);
+            }
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-详情
+     *
+     * @param discussDetailDTO 请求参数
      * @return ComActDiscussVO
      */
     @Override
-    public R detailDiscuss(Long id) {
+    public R detailDiscuss(ComActDiscussDetailDTO discussDetailDTO) {
+        Long id = discussDetailDTO.getId();
         ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(id);
         if (ObjectUtils.isEmpty(comActDiscussDO)) {
-            return R.fail("一起议不存在");
+            return R.fail("议事投票不存在");
         }
-        ComActDiscussVO comActDiscussVO=new ComActDiscussVO();
-        BeanUtils.copyProperties(comActDiscussDO,comActDiscussVO);
-        Integer integer = comActDiscussCommentDAO.selectCount(new QueryWrapper<ComActDiscussCommentDO>().lambda().eq(ComActDiscussCommentDO::getDiscussId, id));
-        comActDiscussVO.setCommentNum(integer);
-        Integer integer1 = comActDiscussUserDAO.selectCount(new QueryWrapper<ComActDiscussUserDO>().lambda().eq(ComActDiscussUserDO::getDiscussId, id));
-        comActDiscussVO.setSignNum(integer1);
+        ComActDiscussVO comActDiscussVO = new ComActDiscussVO();
+        BeanUtils.copyProperties(comActDiscussDO, comActDiscussVO);
+        comActDiscussVO.setSignNum(comActDiscussDO.getFabulousNum());
         Integer type = comActDiscussVO.getType();
-        if (type.intValue()==2) {
-            List<ComActDiscussOptionDO> comActDiscussOptionDOS = comActDiscussOptionDAO.selectList(new QueryWrapper<ComActDiscussOptionDO>().lambda().eq(ComActDiscussOptionDO::getDiscussId, id));
-            List<ComActDiscussOptionVO> comActDiscussOptionVOS=new ArrayList<>();
-            comActDiscussOptionDOS.forEach(comActDiscussOptionDO -> {
-                Long discussOptionDOId = comActDiscussOptionDO.getId();
-                Integer selectCount = comActDiscussOptionUserDAO.selectCount(new QueryWrapper<ComActDiscussOptionUserDO>().lambda().eq(ComActDiscussOptionUserDO::getDiscussOptionId, discussOptionDOId));
-                ComActDiscussOptionVO comActDiscussOptionVO=new ComActDiscussOptionVO();
-                BeanUtils.copyProperties(comActDiscussOptionDO,comActDiscussOptionVO);
-                comActDiscussOptionVO.setNum(selectCount);
-                comActDiscussOptionVOS.add(comActDiscussOptionVO);
-            });
-            comActDiscussVO.setComActDiscussOptionVOS(comActDiscussOptionVOS);
+        if (type.equals(ComActDiscussVO.type.tp)) {
+            //查询选项列表
+            List<ComActDiscussOptionVO> comActDiscussOptionList = comActDiscussOptionDAO.getDiscussOptionList(id);
+            comActDiscussVO.setComActDiscussOptionVOS(comActDiscussOptionList);
         }
         Long userId = comActDiscussDO.getUserId();
-        LoginUserInfoVO loginUserInfoVO=comActDiscussDAO.selectUserByUserId(userId);
+        LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(userId);
         comActDiscussVO.setUserName(loginUserInfoVO.getName());
+        comActDiscussVO.setUserNickName(loginUserInfoVO.getNickName());
+
+        //分页查询评论列表
+        PageComActDiscussCommentDTO pageComActDiscussCommentDTO = new PageComActDiscussCommentDTO();
+        BeanUtils.copyProperties(discussDetailDTO, pageComActDiscussCommentDTO);
+        IPage<ComActDiscussCommentVO> discussComments = comActDiscussDAO.pageDiscussCommentAdmin(new Page<>(pageComActDiscussCommentDTO.getPageNum(), pageComActDiscussCommentDTO.getPageSize()), pageComActDiscussCommentDTO);
+        discussComments.getRecords().forEach(comment -> {
+            if (comment.getReplyNum() > 0) {
+                List<ComActDiscussCommentVO> childList = comActDiscussDAO.getDiscussCommentReplyList(comment.getId());
+                if (!childList.isEmpty()) {
+                    comment.setComActDiscussCommentVOList(childList);
+                }
+            }
+        });
+        comActDiscussVO.setDiscussCommentList(discussComments.getRecords());
         return R.ok(comActDiscussVO);
     }
 
     /**
-     * 一起议-删除
+     * 议事投票-删除
      *
      * @param id 主键
      * @return 删除结果
      */
     @Override
     public R deleteDiscuss(Long id) {
-        int delete = comActDiscussDAO.deleteById(id);
-        if (delete>0) {
+        ComActDiscussDO comActDiscussDO = new ComActDiscussDO();
+        comActDiscussDO.setId(id);
+        comActDiscussDO.setIsDel(ComActDiscussDO.isOk.yes);
+        if (comActDiscussDAO.updateById(comActDiscussDO) > 0) {
             return R.ok();
         }
         return R.fail();
     }
+
+    /**
+     * 议事投票-回复
+     *
+     * @param comActDiscussCommentDTO 评论内容
+     * @return 回复结果
+     */
+    @Override
+    public R addDiscussComment(ComActDiscussCommentDTO comActDiscussCommentDTO) {
+        Long discussId = comActDiscussCommentDTO.getDiscussId();
+        ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(discussId);
+        if (ObjectUtils.isEmpty(comActDiscussDO)) {
+            return R.fail("议事投票不存在");
+        }
+        Long currentUser = comActDiscussCommentDTO.getUserId();
+        //判断当前用户是否参与过评论
+        int currentUserCommentCount = comActDiscussCommentDAO.selectCount(new QueryWrapper<ComActDiscussCommentDO>()
+                .lambda().eq(ComActDiscussCommentDO::getDiscussId, discussId).eq(ComActDiscussCommentDO::getUserId, currentUser));
+
+        ComActDiscussCommentDO comActDiscussCommentDO = new ComActDiscussCommentDO();
+        BeanUtils.copyProperties(comActDiscussCommentDTO, comActDiscussCommentDO);
+        Long discussUser = comActDiscussDO.getUserId();
+        if (currentUser.equals(discussUser)) {
+            comActDiscussCommentDO.setIsAuthor(1);
+        }
+        int insert = comActDiscussCommentDAO.insert(comActDiscussCommentDO);
+        if (insert > 0) {
+//            comActDiscussDAO.addCommentCount(discussId, 1);
+            //评论成功,评论总数+1
+            //若首次参与评论,参与讨论人数+1
+            if (currentUserCommentCount > 0) {
+                comActDiscussDAO.incrCommentAndJoinNumById(discussId, false);
+            } else {
+                comActDiscussDAO.incrCommentAndJoinNumById(discussId, true);
+            }
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-分页查询
+     *
+     * @param pageComActDiscussDTO 查询参数
+     * @return ComActDiscussVO
+     */
+    @Override
+    public R pageDiscuss(PageComActDiscussDTO pageComActDiscussDTO) {
+        IPage<ComActDiscussVO> iPage = comActDiscussDAO.pageDiscuss(new Page<>(pageComActDiscussDTO.getPageNum(), pageComActDiscussDTO.getPageSize()), pageComActDiscussDTO);
+        return R.ok(iPage);
+
+    }
+
+    /**
+     * 议事投票-后台分页查询
+     *
+     * @param pageComActDiscussDTO 请求参数
+     * @return 议事投票列表
+     */
+    @Override
+    public R pageDiscussAdmin(PageComActDiscussDTO pageComActDiscussDTO) {
+        return R.ok(comActDiscussDAO.pageDiscussAdmin(new Page<>(pageComActDiscussDTO.getPageNum(), pageComActDiscussDTO.getPageSize()), pageComActDiscussDTO));
+    }
+
+    /**
+     * 议事投票-评论-查看
+     *
+     * @param id 主键
+     * @return 详情 ComActDiscussCommentVO
+     */
+    @Override
+    public R detailDiscusscomment(Long id) {
+        ComActDiscussCommentDO comActDiscussCommentDO = comActDiscussCommentDAO.selectById(id);
+        if (ObjectUtils.isEmpty(comActDiscussCommentDO)) {
+            return R.fail("评论不存在");
+        }
+        ComActDiscussCommentVO comActDiscussCommentVO = new ComActDiscussCommentVO();
+        Long parentId = comActDiscussCommentDO.getParentId();
+        if (parentId.intValue() == 0) {
+            // 一级评论
+            BeanUtils.copyProperties(comActDiscussCommentDO, comActDiscussCommentVO);
+        } else {
+            ComActDiscussCommentDO comActDiscussCommentDO1 = comActDiscussCommentDAO.selectById(parentId);
+            BeanUtils.copyProperties(comActDiscussCommentDO1, comActDiscussCommentVO);
+            comActDiscussCommentVO.setCommentBack(comActDiscussCommentDO.getComment());
+            comActDiscussCommentVO.setTimeBack(comActDiscussCommentDO.getCreateAt());
+            comActDiscussCommentVO.setParentId(parentId);
+        }
+        Integer count = comActDiscussCommentUserDAO.selectCount(new QueryWrapper<ComActDiscussCommentUserDO>().lambda()
+                .eq(ComActDiscussCommentUserDO::getDisscussCommentId, id));
+        comActDiscussCommentVO.setNum(count);
+        LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(comActDiscussCommentDO.getUserId());
+        comActDiscussCommentVO.setUserName(loginUserInfoVO.getName());
+        comActDiscussCommentVO.setPhone(loginUserInfoVO.getPhone());
+        return R.ok(comActDiscussCommentVO);
+    }
+
+    /**
+     * 议事投票评论详情
+     *
+     * @param pageComActDiscussCommentDTO 请求参数
+     * @return 议事投票详情
+     */
+    @Override
+    public R detailDiscussCommentAdmin(PageComActDiscussCommentDTO pageComActDiscussCommentDTO) {
+        Long id = pageComActDiscussCommentDTO.getId();
+        ComActDiscussCommentDO comActDiscussCommentDO = comActDiscussCommentDAO.selectById(id);
+        if (ObjectUtils.isEmpty(comActDiscussCommentDO)) {
+            return R.fail("评论不存在");
+        }
+        ComActDiscussCommentVO comActDiscussCommentVO = new ComActDiscussCommentVO();
+        Long parentId = comActDiscussCommentDO.getParentId();
+        if (parentId.intValue() == 0) {
+            // 一级评论
+            BeanUtils.copyProperties(comActDiscussCommentDO, comActDiscussCommentVO);
+        } else {
+            ComActDiscussCommentDO comActDiscussCommentDO1 = comActDiscussCommentDAO.selectById(parentId);
+            BeanUtils.copyProperties(comActDiscussCommentDO1, comActDiscussCommentVO);
+            comActDiscussCommentVO.setCommentBack(comActDiscussCommentDO.getComment());
+            comActDiscussCommentVO.setTimeBack(comActDiscussCommentDO.getCreateAt());
+            comActDiscussCommentVO.setParentId(parentId);
+        }
+        Integer count = comActDiscussCommentUserDAO.selectCount(new QueryWrapper<ComActDiscussCommentUserDO>().lambda()
+                .eq(ComActDiscussCommentUserDO::getDisscussCommentId, id));
+        comActDiscussCommentVO.setNum(count);
+        LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(comActDiscussCommentDO.getUserId());
+        comActDiscussCommentVO.setUserName(loginUserInfoVO.getName());
+        comActDiscussCommentVO.setPhone(loginUserInfoVO.getPhone());
+        comActDiscussCommentVO.setImageUrl(loginUserInfoVO.getImageUrl());
+
+        //查询该评论下所有回复内容
+        IPage<ComActDiscussCommentVO> discussCommentList = comActDiscussCommentDAO.getDiscussCommentList(new Page(pageComActDiscussCommentDTO.getPageNum(), pageComActDiscussCommentDTO.getPageSize()), pageComActDiscussCommentDTO.getId());
+        if (!discussCommentList.getRecords().isEmpty()) {
+            comActDiscussCommentVO.setComActDiscussCommentVOList(discussCommentList.getRecords());
+        }
+        return R.ok(comActDiscussCommentVO);
+    }
+
+    /**
+     * 议事投票-评论-置顶
+     *
+     * @param id 主键
+     * @return 置顶结果
+     */
+    @Override
+    public R putDiscussCommentTop(Long id) {
+        ComActDiscussCommentDO comActDiscussCommentDO = comActDiscussCommentDAO.selectById(id);
+        if (ObjectUtils.isEmpty(comActDiscussCommentDO)) {
+            return R.fail("评论不存在");
+        }
+        Long parentId = comActDiscussCommentDO.getParentId();
+        if (parentId.intValue() != 0) {
+            return R.fail("二级评论不能置顶");
+        }
+        Long discussId = comActDiscussCommentDO.getDiscussId();
+        ComActDiscussCommentDO comActDiscussCommentDO1 = new ComActDiscussCommentDO();
+        comActDiscussCommentDO1.setIsTopping(0);
+        comActDiscussCommentDAO.update(comActDiscussCommentDO1,
+                new UpdateWrapper<ComActDiscussCommentDO>().lambda().eq(ComActDiscussCommentDO::getDiscussId, discussId));
+        comActDiscussCommentDO1.setIsTopping(1);
+        comActDiscussCommentDO1.setId(id);
+        int update = comActDiscussCommentDAO.updateById(comActDiscussCommentDO1);
+        if (update > 0) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-评论-回复
+     *
+     * @param comActDiscussCommentDTO 回复内容
+     * @return 回复结果
+     */
+    @Override
+    public R addDiscussCommentBack(ComActDiscussCommentDTO comActDiscussCommentDTO) {
+        Long id = comActDiscussCommentDTO.getId();
+        ComActDiscussCommentDO comActDiscussCommentDO = comActDiscussCommentDAO.selectById(id);
+        if (ObjectUtils.isEmpty(comActDiscussCommentDO)) {
+            return R.fail("评论不存在");
+        }
+        Long discussId = comActDiscussCommentDO.getDiscussId();
+        ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(discussId);
+        if (ObjectUtils.isEmpty(comActDiscussDO)) {
+            return R.fail("议事投票不存在");
+        }
+        Long parentId = comActDiscussCommentDO.getParentId();
+        if (parentId.intValue() != 0) {
+            return R.fail("二级评论不能回复");
+        }
+        Long currentUser = comActDiscussCommentDTO.getUserId();
+        //判断当前用户是否参与过评论/回复
+        int currentUserCommentCount = comActDiscussCommentDAO.selectCount(new QueryWrapper<ComActDiscussCommentDO>()
+                .lambda().eq(ComActDiscussCommentDO::getDiscussId, discussId).eq(ComActDiscussCommentDO::getUserId, currentUser));
+        Long discussUser = comActDiscussDO.getUserId();
+        ComActDiscussCommentDO comActDiscussCommentDO1 = new ComActDiscussCommentDO();
+        comActDiscussCommentDO1.setDiscussId(discussId);
+        comActDiscussCommentDO1.setComment(comActDiscussCommentDTO.getComment());
+        comActDiscussCommentDO1.setUserId(comActDiscussCommentDTO.getUserId());
+        comActDiscussCommentDO1.setParentId(id);
+        if (discussUser.equals(currentUser)) {
+            comActDiscussCommentDO1.setIsAuthor(1);
+        }
+        int insert = comActDiscussCommentDAO.insert(comActDiscussCommentDO1);
+        if (insert > 0) {
+//            comActDiscussDAO.addCommentCount(discussId, 1);
+            //回复成功,评论总数+1
+            //若首次参与评论,参与讨论人数+1
+            if (currentUserCommentCount > 0) {
+                comActDiscussDAO.incrCommentAndJoinNumById(discussId, false);
+            } else {
+                comActDiscussDAO.incrCommentAndJoinNumById(discussId, true);
+            }
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-评论-分页查询
+     *
+     * @param pageComActDiscussCommentDTO 分页查询参数
+     * @return ComActDiscussCommentVO
+     */
+    @Override
+    public R pageDiscussComment(PageComActDiscussCommentDTO pageComActDiscussCommentDTO) {
+        IPage<ComActDiscussCommentVO> iPage = comActDiscussDAO.pageDiscussComment(new Page<>(pageComActDiscussCommentDTO.getPageNum(), pageComActDiscussCommentDTO.getPageSize()), pageComActDiscussCommentDTO);
+        return R.ok(iPage);
+    }
+
+    /**
+     * 议事投票-评论-后台分页查询
+     *
+     * @param pageComActDiscussCommentDTO 分页查询参数
+     * @return ComActDiscussCommentVO
+     */
+    @Override
+    public R pageDiscussCommentAdmin(PageComActDiscussCommentDTO pageComActDiscussCommentDTO) {
+        IPage<ComActDiscussCommentVO> iPage = comActDiscussDAO.pageDiscussCommentAdmin(new Page<>(pageComActDiscussCommentDTO.getPageNum(), pageComActDiscussCommentDTO.getPageSize()), pageComActDiscussCommentDTO);
+        return R.ok(iPage);
+    }
+
+    /**
+     * 议事投票-分页查询 小程序
+     *
+     * @param pageComActDiscussDTO 查询参数
+     * @return ComActDiscussVO 分页
+     */
+    @Override
+    public R pageDiscussApplets(PageComActDiscussDTO pageComActDiscussDTO) {
+        Page page = new Page<>();
+        Long pageNum = pageComActDiscussDTO.getPageNum();
+        Long pageSize = pageComActDiscussDTO.getPageSize();
+        Long loginUserId = pageComActDiscussDTO.getLoginUserId();
+        if (null == pageNum || 0 == pageNum) {
+            pageNum = 1l;
+        }
+        if (null == pageSize || 0 == pageSize) {
+            pageSize = 10l;
+        }
+        page.setSize(pageSize);
+        page.setCurrent(pageNum);
+        IPage<ComActDiscussVO> iPage = comActDiscussDAO.pageDiscussApplets(page, pageComActDiscussDTO);
+        List<ComActDiscussVO> records = iPage.getRecords();
+        if (!ObjectUtils.isEmpty(records)) {
+            records.forEach(comActDiscussVO -> {
+                Integer type = comActDiscussVO.getType();
+                Long id = comActDiscussVO.getId();
+                String viewNumKey = String.join("_", DISCUSS_VIEW_NUM_PREFIX, id.toString());
+                if (stringRedisTemplate.hasKey(viewNumKey)) {
+                    ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
+                    comActDiscussVO.setViewsNum(Integer.parseInt(opsForValue.get(viewNumKey)));
+                }
+                if (type.equals(2)) {
+                    List<ComActDiscussOptionDO> comActDiscussOptionDOS = comActDiscussOptionDAO.selectList(
+                            new QueryWrapper<ComActDiscussOptionDO>().lambda().eq(ComActDiscussOptionDO::getDiscussId, id));
+                    List<ComActDiscussOptionVO> comActDiscussOptionVOS = new ArrayList<>();
+                    List<Integer> votes = new ArrayList<>();
+                    comActDiscussOptionDOS.forEach(comActDiscussOptionDO -> {
+                        Long discussOptionDOId = comActDiscussOptionDO.getId();
+                        Integer selectCount =
+                                comActDiscussOptionUserDAO.selectCount(new QueryWrapper<ComActDiscussOptionUserDO>()
+                                        .lambda().eq(ComActDiscussOptionUserDO::getDiscussOptionId, discussOptionDOId));
+                        ComActDiscussOptionVO comActDiscussOptionVO = new ComActDiscussOptionVO();
+                        BeanUtils.copyProperties(comActDiscussOptionDO, comActDiscussOptionVO);
+                        comActDiscussOptionVO.setNum(selectCount);
+
+                        if (loginUserId != null) {
+                            // 判断选项是否已投票
+                            int haveVote =
+                                    comActDiscussOptionUserDAO.selectHaveVotes(comActDiscussOptionDO.getId(), loginUserId);
+                            votes.add(haveVote);
+                            comActDiscussOptionVO.setHaveVote(haveVote > 0 ? 1 : 0);
+                        }
+                        comActDiscussOptionVOS.add(comActDiscussOptionVO);
+                    });
+                    fillThePercentAndSort(comActDiscussOptionVOS);
+                    checkDiscussStatusIsCorrect(comActDiscussVO);
+                    comActDiscussVO.setComActDiscussOptionVOS(comActDiscussOptionVOS);
+                    //填充剩余可投票数
+                    if (loginUserId != null && !loginUserId.equals(0L)) {
+                        if (comActDiscussVO.getIsRepeat().intValue() == 1) {
+                            //可重复投票
+                            int votedVotesInToday = comActDiscussOptionUserDAO.selectVotedVotesInToday(id, loginUserId);
+                            int remainingVotes = comActDiscussVO.getCount().intValue() - votedVotesInToday;
+                            comActDiscussVO.setRemainingVotes(remainingVotes >= 0 ? remainingVotes : 0);
+                        } else {
+                            //不可重复投票
+                            int alreadyVotedVotes = votes.stream().mapToInt(Integer::intValue).sum();
+                            int remainingVotes = comActDiscussVO.getCount().intValue() - alreadyVotedVotes;
+                            comActDiscussVO.setRemainingVotes(remainingVotes >= 0 ? remainingVotes : 0);
+                        }
+                    }
+                    //填充投票记录列表
+                    List<ComActDiscussOptionUserVO> comActDiscussOptionUserVOList = comActDiscussOptionUserDAO
+                            .selectVotedRecords(comActDiscussVO.getId());
+                    comActDiscussVO.setComActDiscussOptionUserVOList(comActDiscussOptionUserVOList);
+                    //填充已参与投票人数
+                    int votedPersonNum = comActDiscussOptionUserDAO.selectVotedPersonNum(comActDiscussVO.getId());
+                    comActDiscussVO.setVotedPersonNum(votedPersonNum);
+                }
+
+                if (loginUserId != null) {
+                    Integer integer = comActDiscussUserDAO.selectCount(new QueryWrapper<ComActDiscussUserDO>().lambda()
+                            .eq(ComActDiscussUserDO::getDiscussId, comActDiscussVO.getId())
+                            .eq(ComActDiscussUserDO::getUserId, loginUserId));
+                    if (integer > 0) {
+                        comActDiscussVO.setHaveSign(1);
+                    } else {
+                        comActDiscussVO.setHaveSign(0);
+                    }
+                    // 判断是否已经投票
+                    int haveVote = comActDiscussOptionUserDAO.selectHaveVote(id, loginUserId);
+                    comActDiscussVO.setHaveVote(haveVote > 0 ? 1 : 0);
+                }
+            });
+        }
+        return R.ok(iPage);
+    }
+
+    /**
+     * 判断discuss状态是否正确
+     * @param comActDiscussVO
+     */
+    private void checkDiscussStatusIsCorrect(ComActDiscussVO comActDiscussVO) {
+        //判断discuss状态是否正确
+        if(comActDiscussVO.getEndTime() != null){
+            boolean isIncorrectStatus = comActDiscussVO.getEndTime().before(new Date()) &&
+                    (comActDiscussVO.getStatus().intValue() == 1 || comActDiscussVO.getStatus().intValue() == 2);
+            if (isIncorrectStatus) {
+                comActDiscussVO.setStatus(3);
+                comActDiscussDAO.updateStatusById(comActDiscussVO.getId(), 3);
+            }
+        }
+    }
+
+    /**
+     * 议事投票-点赞、取消点赞
+     *
+     * @param comActDiscussUserDTO 操作类型
+     * @return 操作结果
+     */
+    @Override
+    public R putDiscussUser(ComActDiscussUserDTO comActDiscussUserDTO) {
+        Integer type = comActDiscussUserDTO.getType();
+        int num = 0;
+        ComActDiscussUserDO comActDiscussUserDO = new ComActDiscussUserDO();
+        BeanUtils.copyProperties(comActDiscussUserDTO, comActDiscussUserDO);
+        boolean isIncr = type.intValue() == 1;
+        if (isIncr) {
+            num = comActDiscussUserDAO.insert(comActDiscussUserDO);
+        } else {
+            num = comActDiscussUserDAO.delete(new QueryWrapper<ComActDiscussUserDO>().lambda()
+                    .eq(ComActDiscussUserDO::getUserId, comActDiscussUserDTO.getUserId())
+                    .eq(ComActDiscussUserDO::getDiscussId, comActDiscussUserDTO.getDiscussId()));
+        }
+        if (num > 0) {
+            //点赞成功 总数+1 || 取消点赞成功 总数-1
+            comActDiscussDAO.incrOrDecrFabulousNumByType(comActDiscussUserDTO.getDiscussId(), isIncr);
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-评论-分页查询 小程序
+     *
+     * @param pageComActDiscussCommentDTO 分页参数
+     * @return ComActDiscussCommentVO
+     */
+    @Override
+    public R pageDiscussCommentApplets(PageComActDiscussCommentDTO pageComActDiscussCommentDTO) {
+        Page page = new Page<>();
+        Long pageNum = pageComActDiscussCommentDTO.getPageNum();
+        Long pageSize = pageComActDiscussCommentDTO.getPageSize();
+        if (null == pageNum || 0 == pageNum) {
+            pageNum = 1l;
+        }
+        if (null == pageSize || 0 == pageSize) {
+            pageSize = 10l;
+        }
+        page.setSize(pageSize);
+        page.setCurrent(pageNum);
+        IPage<ComActDiscussCommentVO> iPage =
+                comActDiscussDAO.pageDiscussCommentApplets(page, pageComActDiscussCommentDTO);
+        List<ComActDiscussCommentVO> records = iPage.getRecords();
+        if (!ObjectUtils.isEmpty(records)) {
+            records.forEach(comActDiscussCommentVO -> {
+                List<ComActDiscussCommentVO> comActDiscussCommentVOList = new ArrayList<>();
+                Long id = comActDiscussCommentVO.getId();
+                comActDiscussCommentVOList = comActDiscussCommentDAO.selectChilds(id);
+                if (!ObjectUtils.isEmpty(comActDiscussCommentVOList)) {
+                    List<ComActDiscussCommentVO> comActDiscussCommentVOS = comActDiscussCommentVOList;
+                    comActDiscussCommentVOList.forEach(comActDiscussCommentVO1 -> {
+                        Long parentId = comActDiscussCommentVO1.getParentId();
+                        List<ComActDiscussCommentVO> collect = comActDiscussCommentVOS.stream()
+                                .filter(comActDiscussCommentVO2 -> comActDiscussCommentVO2.getId().equals(parentId))
+                                .collect(Collectors.toList());
+                        if (!ObjectUtils.isEmpty(collect)) {
+                            String userName = collect.get(0).getUserName();
+                            String userNickName = collect.get(0).getUserNickName();
+                            comActDiscussCommentVO1.setUserNameBack(userName);
+                            comActDiscussCommentVO1.setUserNickNameBack(userNickName);
+                        }
+                        List<ComActDiscussCommentVO> collect1 = records.stream()
+                                .filter(comActDiscussCommentVO2 -> comActDiscussCommentVO2.getId().equals(parentId))
+                                .collect(Collectors.toList());
+                        if (!ObjectUtils.isEmpty(collect1)) {
+                            ComActDiscussCommentVO comActDiscussCommentVOFirst = collect1.get(0);
+                            String userName = comActDiscussCommentVOFirst.getUserName();
+                            String userNickName = comActDiscussCommentVOFirst.getUserNickName();
+                            comActDiscussCommentVO1.setUserNameBack(userName);
+                            comActDiscussCommentVO1.setUserNickNameBack(userNickName);
+                        }
+                        if (pageComActDiscussCommentDTO.getLoginUserId() != null
+                                && !pageComActDiscussCommentDTO.getLoginUserId().equals(0L)) {
+                            Integer integer = comActDiscussCommentUserDAO
+                                    .selectCount(new QueryWrapper<ComActDiscussCommentUserDO>().lambda()
+                                            .eq(ComActDiscussCommentUserDO::getDisscussCommentId,
+                                                    comActDiscussCommentVO1.getId())
+                                            .eq(ComActDiscussCommentUserDO::getUserId,
+                                                    pageComActDiscussCommentDTO.getLoginUserId()));
+                            if (integer > 0) {
+                                comActDiscussCommentVO1.setHaveSign(1);
+                            } else {
+                                comActDiscussCommentVO1.setHaveSign(0);
+                            }
+                        }
+//                        if(StringUtils.isEmpty(comActDiscussCommentVO1.getUserNickNameBack())){
+//                            comActDiscussCommentVO1.setUserNickNameBack("社区管理员");
+//                        }
+                    });
+                    comActDiscussCommentVO.setComActDiscussCommentVOList(comActDiscussCommentVOList);
+                }
+                if (pageComActDiscussCommentDTO.getLoginUserId() != null
+                        && !pageComActDiscussCommentDTO.getLoginUserId().equals(0L)) {
+                    Integer integer =
+                            comActDiscussCommentUserDAO.selectCount(new QueryWrapper<ComActDiscussCommentUserDO>().lambda()
+                                    .eq(ComActDiscussCommentUserDO::getDisscussCommentId, comActDiscussCommentVO.getId())
+                                    .eq(ComActDiscussCommentUserDO::getUserId, pageComActDiscussCommentDTO.getLoginUserId()));
+                    if (integer > 0) {
+                        comActDiscussCommentVO.setHaveSign(1);
+                    } else {
+                        comActDiscussCommentVO.setHaveSign(0);
+                    }
+                }
+
+                // 判断当前评论是否是社区管理员评论
+                if (!comActDiscussCommentVO.getUserType().equals(1)) {
+                    comActDiscussCommentVO.setUserNickName("社区管理员");
+                }
+            });
+        }
+        return R.ok(iPage);
+    }
+
+    /**
+     * 议事投票-详情 小程序
+     *
+     * @param id          主键
+     * @param loginUserId 登录用户主键
+     * @return ComActDiscussVO
+     */
+    @Override
+    public R detailDiscussApplets(Long id, Long loginUserId) {
+        ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(id);
+        if (ObjectUtils.isEmpty(comActDiscussDO)) {
+            return R.fail("议事投票不存在");
+        }
+        ComActDiscussVO comActDiscussVO = new ComActDiscussVO();
+        BeanUtils.copyProperties(comActDiscussDO, comActDiscussVO);
+        comActDiscussVO.setSignNum(comActDiscussDO.getFabulousNum());
+        Integer type = comActDiscussVO.getType();
+        if (type.equals(2)) {
+            List<ComActDiscussOptionDO> comActDiscussOptionDOS = comActDiscussOptionDAO.selectList(
+                    new QueryWrapper<ComActDiscussOptionDO>().lambda().eq(ComActDiscussOptionDO::getDiscussId, id));
+            List<ComActDiscussOptionVO> comActDiscussOptionVOS = new ArrayList<>();
+            ArrayList<Integer> votes = new ArrayList<>();
+            comActDiscussOptionDOS.forEach(comActDiscussOptionDO -> {
+                Long discussOptionDOId = comActDiscussOptionDO.getId();
+                Integer selectCount =
+                        comActDiscussOptionUserDAO.selectCount(new QueryWrapper<ComActDiscussOptionUserDO>().lambda()
+                                .eq(ComActDiscussOptionUserDO::getDiscussOptionId, discussOptionDOId));
+                ComActDiscussOptionVO comActDiscussOptionVO = new ComActDiscussOptionVO();
+                BeanUtils.copyProperties(comActDiscussOptionDO, comActDiscussOptionVO);
+                comActDiscussOptionVO.setNum(selectCount);
+                if (loginUserId != null && !loginUserId.equals(0L)) {
+                    // 判断选项是否已投票
+                    int haveVote =
+                            comActDiscussOptionUserDAO.selectHaveVotes(comActDiscussOptionDO.getId(), loginUserId);
+                    votes.add(haveVote);
+                    comActDiscussOptionVO.setHaveVote(haveVote > 0 ? 1 : 0);
+                }
+                comActDiscussOptionVOS.add(comActDiscussOptionVO);
+            });
+            fillThePercentAndSort(comActDiscussOptionVOS);
+            comActDiscussVO.setComActDiscussOptionVOS(comActDiscussOptionVOS);
+            //填充剩余可投票数
+            if (loginUserId != null && !loginUserId.equals(0L)) {
+                if (comActDiscussVO.getIsRepeat().intValue() == 1) {
+                    //可重复投票
+                    int votedVotesInToday = comActDiscussOptionUserDAO.selectVotedVotesInToday(id, loginUserId);
+                    int remainingVotes = comActDiscussVO.getCount().intValue() - votedVotesInToday;
+                    comActDiscussVO.setRemainingVotes(remainingVotes >= 0 ? remainingVotes : 0);
+                } else {
+                    //不可重复投票
+                    int alreadyVotedVotes = votes.stream().mapToInt(Integer::intValue).sum();
+                    int remainingVotes = comActDiscussVO.getCount().intValue() - alreadyVotedVotes;
+                    comActDiscussVO.setRemainingVotes(remainingVotes >= 0 ? remainingVotes : 0);
+                }
+            }
+            checkDiscussStatusIsCorrect(comActDiscussVO);
+            //填充投票记录列表
+            List<ComActDiscussOptionUserVO> comActDiscussOptionUserVOList = comActDiscussOptionUserDAO
+                    .selectVotedRecords(comActDiscussVO.getId());
+            comActDiscussVO.setComActDiscussOptionUserVOList(comActDiscussOptionUserVOList);
+            //填充已参与投票人数
+            int votedPersonNum = comActDiscussOptionUserDAO.selectVotedPersonNum(comActDiscussVO.getId());
+            comActDiscussVO.setVotedPersonNum(votedPersonNum);
+        }
+        Long userId = comActDiscussDO.getUserId();
+        LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(userId);
+        if (loginUserInfoVO != null) {
+            comActDiscussVO.setUserName(loginUserInfoVO.getName());
+            if (StringUtils.isEmpty(loginUserInfoVO.getNickName())) {
+                comActDiscussVO.setUserNickName(loginUserInfoVO.getName());
+            } else {
+                comActDiscussVO.setUserNickName(loginUserInfoVO.getNickName());
+            }
+            comActDiscussVO.setImageUrl(loginUserInfoVO.getImageUrl());
+            comActDiscussVO.setUserType(loginUserInfoVO.getType());
+        }
+        Long communityId = comActDiscussDO.getCommunityId();
+        Integer type1 = loginUserInfoVO.getType();
+        if (type1.intValue() > 1) {
+            ComActVO comActVO = comActDiscussDAO.selectCommunity(communityId);
+            comActDiscussVO.setUserName(comActVO.getName());
+            comActDiscussVO.setUserNickName(comActVO.getName());
+        }
+        if (loginUserId != null && !loginUserId.equals(0L)) {
+            ComActDiscussVO comActDiscussVO1 = comActDiscussDAO.selectHaveSignAndHaveVote(id, loginUserId);
+            comActDiscussVO.setHaveSign(comActDiscussVO1.getHaveSign());
+            comActDiscussVO.setHaveVote(comActDiscussVO1.getHaveVote());
+        }
+        String viewNumKey = String.join("_", DISCUSS_VIEW_NUM_PREFIX, id.toString());
+        if (stringRedisTemplate.hasKey(viewNumKey)) {
+            ValueOperations opsForValue = stringRedisTemplate.opsForValue();
+            int viewNum = Integer.parseInt((String) opsForValue.get(viewNumKey));
+            comActDiscussVO.setViewsNum(viewNum);
+        }
+        return R.ok(comActDiscussVO);
+    }
+
+    /**
+     * 计算投票占比以及排序
+     * @param comActDiscussOptionVOS
+     */
+    private void fillThePercentAndSort(List<ComActDiscussOptionVO> comActDiscussOptionVOS) {
+        //填充总票数
+        int allSum = comActDiscussOptionVOS.stream().mapToInt(ComActDiscussOptionVO::getNum).sum();
+        comActDiscussOptionVOS.forEach(option -> {
+            if (allSum == 0) {
+                option.setPercent(new BigDecimal(0));
+            } else {
+                //占比
+                BigDecimal percent = BigDecimal.valueOf(option.getNum()).divide(BigDecimal.valueOf(allSum), 2, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100)).setScale(0);
+                option.setPercent(percent);
+            }
+        });
+        comActDiscussOptionVOS.sort(Comparator.comparing(ComActDiscussOptionVO::getNum).reversed());
+    }
+
+    /**
+     * 议事投票-投票
+     *
+     * @param comActDiscussOptionUserDTO 投票信息
+     * @return 投票结果
+     */
+    @Override
+    public R addDiscussOptionUser(ComActDiscussOptionUserDTO comActDiscussOptionUserDTO) {
+        List<Long> discussOptionIds = comActDiscussOptionUserDTO.getDiscussOptionIds();
+        Long discussOptionId = discussOptionIds.get(0);
+        Long userId = comActDiscussOptionUserDTO.getUserId();
+        ComActDiscussOptionDO comActDiscussOptionDO = comActDiscussOptionDAO.selectById(discussOptionId);
+        if (ObjectUtils.isEmpty(comActDiscussOptionDO)) {
+            return R.fail("选项不存在");
+        }
+        // Long discussId = comActDiscussOptionDO.getDiscussId();
+        // List<ComActDiscussOptionDO> comActDiscussOptionDOS = comActDiscussOptionDAO.selectList(new
+        // QueryWrapper<ComActDiscussOptionDO>().lambda().eq(ComActDiscussOptionDO::getDiscussId, discussId));
+        // List<Long> longList=comActDiscussOptionDOS.stream().map(comActDiscussOptionDO1 ->
+        // comActDiscussOptionDO1.getId()).collect(Collectors.toList());
+        Long discussId = comActDiscussOptionDO.getDiscussId();
+        ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(comActDiscussOptionDO.getDiscussId());
+        if (isNull(comActDiscussOptionDO)) {
+            return R.fail("投票主题不存在");
+        }
+        boolean isRepeat = comActDiscussDO.getIsRepeat().intValue() == 1;
+        int usableVoteVotes = comActDiscussDO.getCount().intValue();
+        int currentVoteNum = discussOptionIds.size();
+        if (isRepeat) {
+            //可重复投票
+            int votedVotesInToday = comActDiscussOptionUserDAO.selectVotedVotesInToday(discussId, userId);
+            if (usableVoteVotes <= votedVotesInToday || currentVoteNum > usableVoteVotes - votedVotesInToday) {
+                return R.fail("票数不足");
+            }
+        } else {
+            //不可重复投票
+            int alreadyVotedVotes = comActDiscussOptionUserDAO.selectCount(
+                new QueryWrapper<ComActDiscussOptionUserDO>().lambda().eq(ComActDiscussOptionUserDO::getUserId, userId)
+                    .eq(ComActDiscussOptionUserDO::getDiscussId, discussId));
+            if (usableVoteVotes <= alreadyVotedVotes || currentVoteNum > usableVoteVotes - alreadyVotedVotes) {
+                return R.fail("票数不足");
+            }
+        }
+        List<ComActDiscussOptionUserDO> comActDiscussOptionUserDOList = new ArrayList<>();
+        discussOptionIds.forEach(optionId -> {
+            ComActDiscussOptionUserDO comActDiscussOptionUserDO = new ComActDiscussOptionUserDO();
+            comActDiscussOptionUserDO.setUserId(userId);
+            comActDiscussOptionUserDO.setDiscussOptionId(optionId);
+            comActDiscussOptionUserDO.setDiscussId(discussId);
+            comActDiscussOptionUserDOList.add(comActDiscussOptionUserDO);
+        });
+        int result = comActDiscussOptionUserDAO.batchInsert(comActDiscussOptionUserDOList);
+        if (result > 0) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-评论-点赞、取消点赞
+     *
+     * @param comActDiscussCommentUserDTO 评论点赞
+     * @return 点赞结果
+     */
+    @Override
+    public R putDiscussCommentUser(ComActDiscussCommentUserDTO comActDiscussCommentUserDTO) {
+        ComActDiscussCommentDO comActDiscussCommentDO =
+                comActDiscussCommentDAO.selectById(comActDiscussCommentUserDTO.getId());
+        if (ObjectUtils.isEmpty(comActDiscussCommentDO)) {
+            return R.fail("评论不存在");
+        }
+        Integer type = comActDiscussCommentUserDTO.getType();
+        int num = 0;
+        if (type.intValue() == 1) {
+            ComActDiscussCommentUserDO comActDiscussCommentUserDO = new ComActDiscussCommentUserDO();
+            comActDiscussCommentUserDO.setUserId(comActDiscussCommentUserDTO.getUserId());
+            comActDiscussCommentUserDO.setDisscussCommentId(comActDiscussCommentUserDTO.getId());
+            num = comActDiscussCommentUserDAO.insert(comActDiscussCommentUserDO);
+        } else {
+            num = comActDiscussCommentUserDAO.delete(new QueryWrapper<ComActDiscussCommentUserDO>().lambda()
+                    .eq(ComActDiscussCommentUserDO::getUserId, comActDiscussCommentUserDTO.getUserId())
+                    .eq(ComActDiscussCommentUserDO::getDisscussCommentId, comActDiscussCommentUserDTO.getId()));
+        }
+        if (num > 0) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 工作大屏-议事投票列表
+     *
+     * @param discussListDTO 请求参数
+     * @return 议事投票列表
+     */
+    @Override
+    public R getScreenDiscussList(ScreenDiscussListDTO discussListDTO) {
+        IPage<DiscussListVO> discussListVOIPage = comActDiscussDAO
+                .getScreenDiscussList(new Page(discussListDTO.getPageNum(), discussListDTO.getPageSize()), discussListDTO);
+        if (!discussListVOIPage.getRecords().isEmpty()) {
+            discussListVOIPage.getRecords().forEach(discussListVO -> {
+                // 查询评论数量和点赞数量
+                Integer integer = comActDiscussCommentDAO.selectCount(new QueryWrapper<ComActDiscussCommentDO>()
+                        .lambda().eq(ComActDiscussCommentDO::getDiscussId, discussListVO.getId()));
+                discussListVO.setCommentCount(integer);
+                Integer integer1 = comActDiscussUserDAO.selectCount(new QueryWrapper<ComActDiscussUserDO>().lambda()
+                        .eq(ComActDiscussUserDO::getDiscussId, discussListVO.getId()));
+                discussListVO.setFabulousCount(integer1);
+
+                if (discussListVO.getType().equals(ScreenDiscussListDTO.type.tp)) {// 投票
+                    List<ComActDiscussOptionVO> discussOptionList =
+                            comActDiscussDAO.getScreenDiscussOptionList(discussListVO.getId());
+                    if (!discussOptionList.isEmpty()) {
+                        discussListVO.setDiscussOptionList(discussOptionList);
+                    }
+                }
+            });
+        }
+        return R.ok(discussListVOIPage);
+    }
+
+    /**
+     * 议事投票后台公布结果
+     *
+     * @param publishResultDTO 请求参数
+     * @return 公布结果
+     */
+    @Override
+    public R publishResultAdmin(ComActDiscussPublishResultDTO publishResultDTO) {
+        ComActDiscussDO discussDO = comActDiscussDAO.selectById(publishResultDTO.getId());
+        if (discussDO == null) {
+            return R.fail("议事投票记录不存在");
+        }
+        Date nowDate = new Date();
+        if (publishResultDTO.getType().equals(ComActDiscussPublishResultDTO.type.add)) {
+            if (!discussDO.getStatus().equals(ComActDiscussDO.status.dgb)) {
+                return R.fail("该议事投票不是待公布状态,不可公布结果操作");
+            }
+            discussDO.setStatus(ComActDiscussDO.status.ygb);
+        }
+        discussDO.setPublishAt(nowDate);
+        discussDO.setPublishResult(publishResultDTO.getResult());
+        discussDO.setUpdateAt(nowDate);
+        discussDO.setPublishBy(publishResultDTO.getUserId());
+        if (comActDiscussDAO.updateById(discussDO) > 0) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票-评论/回复删除
+     *
+     * @param id 评论/回复id
+     * @return 删除结果
+     */
+    @Override
+    public R deleteDiscussCommentAdmin(Long id) {
+        ComActDiscussCommentDO discussCommentDO = comActDiscussCommentDAO.selectById(id);
+        if (discussCommentDO == null) {
+            return R.fail("未查询到该记录");
+        }
+        if (discussCommentDO.getIsDel().equals(ComActDiscussCommentDO.isDelete.yes)) {
+            return R.fail("该记录已被删除");
+        }
+        discussCommentDO.setIsDel(ComActDiscussCommentDO.isDelete.yes);
+        if (comActDiscussCommentDAO.updateById(discussCommentDO) > 0) {
+            ComActDiscussDO discussDO = comActDiscussDAO.selectById(discussCommentDO.getDiscussId());
+            if (discussDO != null) {
+                if (discussDO.getCommentNum() > 0) {
+                    if (discussCommentDO.getParentId().equals(0L)) {
+                        Integer count = comActDiscussCommentDAO.selectCount(new QueryWrapper<ComActDiscussCommentDO>().lambda()
+                                .eq(ComActDiscussCommentDO::getParentId, id).eq(ComActDiscussCommentDO::getIsDel, ComActDiscussCommentDO.isDelete.no));
+                        if (count != null && count > 0 && discussDO.getCommentNum() > count) {
+                            discussDO.setCommentNum(discussDO.getCommentNum() - count);
+                        } else {
+                            discussDO.setCommentNum(discussDO.getCommentNum() - 1);
+                        }
+                        comActDiscussDAO.updateById(discussDO);
+                    } else {
+                        discussDO.setCommentNum(discussDO.getCommentNum() - 1);
+                        comActDiscussDAO.updateById(discussDO);
+                    }
+                }
+            }
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+    /**
+     * 分页查询评论下回复列表
+     *
+     * @param discussDetailDTO 请求参数
+     * @return 回复列表
+     */
+    @Override
+    public R discussCommentReplyAdmin(ComActDiscussDetailDTO discussDetailDTO) {
+        return R.ok(comActDiscussCommentDAO.getDiscussCommentList(new Page(discussDetailDTO.getPageNum(), discussDetailDTO.getPageSize()), discussDetailDTO.getId()));
+    }
+
+    /**
+     * 查询社区可发布议事投票权限配置
+     *
+     * @param communityId 社区id
+     * @return 社区可发布议事投票权限配置
+     */
+    @Override
+    public R discussJurisdictionGet(Long communityId, Long userId) {
+        List<SysConfDO> confDOList = sysConfDao.selectList(new LambdaQueryWrapper<SysConfDO>()
+                .eq(SysConfDO::getCommunityId, communityId)
+                .eq(SysConfDO::getCode,Constants.DISCUSS_IDENTITY_KEY + communityId)
+                .orderByDesc(SysConfDO::getCreateAt));
+        if (confDOList == null || confDOList.size() == 0) {
+            SysConfDO sysConfDO = new SysConfDO();
+            sysConfDO.setCode(Constants.DISCUSS_IDENTITY_KEY + communityId);
+            sysConfDO.setName("社区议事投票小程序身份验证参数");
+            sysConfDO.setValue("");// 社区议事投票小程序身份验证参数(1.全部 2.党员 3.志愿者 4.社区工作人员)
+            sysConfDO.setDescription("社区议事投票小程序身份验证参数(1.全部 2.党员 3.志愿者 4.社区工作人员)");
+            sysConfDO.setCommunityId(communityId);
+            sysConfDO.setCreateBy(userId);
+            int inserted = sysConfDao.insert(sysConfDO);
+            if (inserted != 1) {
+                throw new ServiceException("添加社区议事投票小程序身份验证参数失败");
+            }
+            confDOList = sysConfDao.selectList(new LambdaQueryWrapper<SysConfDO>()
+                    .eq(SysConfDO::getCommunityId, communityId)
+                    .orderByDesc(SysConfDO::getCreateAt));
+        }
+        if (confDOList != null && confDOList.size() > 0) {
+            SysConfDO latest = confDOList.get(0);
+            SysConfVO sysConfVO = new SysConfVO();
+            BeanUtils.copyProperties(latest, sysConfVO);
+            return R.ok(sysConfVO.getValue());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 设置当前社区议事投票小程序身份验证参数(1.全部 2.党员 3.志愿者 4.社区工作人员)
+     *
+     * @param communityId 社区id
+     * @param value       需要设置的参数值
+     * @return 设置结果
+     */
+    @Override
+    public R discussJurisdictionSet(Long communityId, String value) {
+        List<SysConfDO> authConf =
+                sysConfDao.selectList(new LambdaQueryWrapper<SysConfDO>().eq(SysConfDO::getCommunityId, communityId)
+                        .eq(SysConfDO::getCode, Constants.DISCUSS_IDENTITY_KEY + communityId).orderByDesc(SysConfDO::getCreateAt));
+        if (authConf != null && authConf.size() > 0) {
+            SysConfDO first = authConf.get(0);
+            first.setValue(value);
+            int updated = sysConfDao.updateById(first);
+            if (updated == 1) {
+                return R.ok();
+            }
+        }
+        return R.fail();
+    }
+
+    /**
+     * 议事投票检测状态定时任务
+     * @return  执行结果
+     */
+    @Override
+    public R timedTaskDiscussInspectStatus() {
+        Date nowDate = new Date();
+        //查询已过开始时间未开始投票列表
+        List<ComActDiscussDO> wksDiscussList = comActDiscussDAO.selectList(new QueryWrapper<ComActDiscussDO>().lambda()
+                .eq(ComActDiscussDO::getType, ComActDiscussDO.type.tp).eq(ComActDiscussDO::getIsDel, ComActDiscussDO.isOk.no)
+                .eq(ComActDiscussDO::getStatus,ComActDiscussDO.status.wks).le(ComActDiscussDO::getStartTime, nowDate));
+        wksDiscussList.forEach(wksDiscuss -> {
+            wksDiscuss.setStatus(ComActDiscussDO.status.jxz);
+            wksDiscuss.setUpdateAt(nowDate);
+            wksDiscuss.setReleaseAt(nowDate);
+            comActDiscussDAO.updateById(wksDiscuss);
+        });
+
+        //查询已过结束时间未结束的投票列表
+        List<ComActDiscussDO> jxzDiscussList = comActDiscussDAO.selectList(new QueryWrapper<ComActDiscussDO>().lambda()
+                .eq(ComActDiscussDO::getType, ComActDiscussDO.type.tp).eq(ComActDiscussDO::getIsDel, ComActDiscussDO.isOk.no)
+                .eq(ComActDiscussDO::getStatus,ComActDiscussDO.status.jxz).le(ComActDiscussDO::getEndTime, nowDate));
+        jxzDiscussList.forEach(jxzDiscuss -> {
+            jxzDiscuss.setStatus(ComActDiscussDO.status.dgb);
+            jxzDiscuss.setUpdateAt(nowDate);
+            comActDiscussDAO.updateById(jxzDiscuss);
+        });
+        return R.ok();
+    }
+
+    /**
+     * 一起议增加浏览量
+     * @param discussId 一起议主键id
+     */
+    @Override
+    public void increaseViewNum(Long discussId) {
+        String incrKey = String.join("_", DISCUSS_VIEW_NUM_PREFIX, discussId.toString());
+        Boolean isExist = stringRedisTemplate.hasKey(incrKey);
+        ValueOperations opsForValue = stringRedisTemplate.opsForValue();
+        if (isExist) {
+            opsForValue.increment(incrKey);
+        } else {
+            ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(discussId);
+            if (nonNull(comActDiscussDO)) {
+                stringRedisTemplate.executePipelined((RedisCallback<Object>) redisConnection -> {
+                    StringRedisConnection stringRedisConnection = (StringRedisConnection) redisConnection;
+                    Integer nowViewNum = Math.addExact(comActDiscussDO.getViewsNum().intValue(), 1);
+                    stringRedisConnection.set(incrKey, nowViewNum.toString());
+                    stringRedisConnection.expire(incrKey, DISCUSS_EXPIRE_TIME);
+                    stringRedisConnection.sAdd(INCR_VIEW_DISCUSS_IDS_KEY, discussId.toString());
+                    stringRedisConnection.expire(INCR_VIEW_DISCUSS_IDS_KEY, DISCUSS_EXPIRE_TIME);
+                    return null;
+                });
+            }
+        }
+    }
+
+    /**
+     * 公布/编辑一起议投票结果
+     * @param comActDiscussDTO
+     * @return 请求结果
+     */
+    @Override
+    public R editDiscussResult(ComActDiscussDTO comActDiscussDTO) {
+        if (isNull(comActDiscussDTO.getId()) || isNull(comActDiscussDTO.getPublishResult())) {
+            return R.fail("缺少参数!");
+        }
+        ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(comActDiscussDTO.getId());
+        if (isNull(comActDiscussDO)) {
+            return R.fail("当前一起议主题不存在!");
+        }
+        if (!comActDiscussDTO.getUserId().equals(comActDiscussDO.getUserId())) {
+            return R.fail("只能公布或编辑自己发布的主题!");
+        }
+        comActDiscussDO.setPublishResult(comActDiscussDTO.getPublishResult());
+        comActDiscussDO.setStatus(4);
+        int result = comActDiscussDAO.updateById(comActDiscussDO);
+        if (result > 0) {
+            return R.ok();
+        }
+        return R.fail("网络错误,请重试!");
+    }
+
+    /**
+     * 一起议获取是否有发布权
+     * @param comActDiscussDTO
+     * @return
+     */
+    @Override
+    public R getDiscussPermissions(ComActDiscussDTO comActDiscussDTO) {
+        return R.ok(checkCurrentUserDiscussIdentity(comActDiscussDTO));
+    }
+
+    /**
+     * 将redis中浏览量写入表中
+     * @return 执行结果
+     */
+    @Override
+    public R writeDiscussViewNumToTable() {
+        try {
+            if (stringRedisTemplate.hasKey(INCR_VIEW_DISCUSS_IDS_KEY)) {
+                SetOperations opsForSet = stringRedisTemplate.opsForSet();
+                Set<String> needWriteDiscussIdSet = opsForSet.members(INCR_VIEW_DISCUSS_IDS_KEY);
+
+                //组装viewNum key
+                List<String> viewNumKeys = new ArrayList<>();
+                Iterator<String> iterator = needWriteDiscussIdSet.iterator();
+                while (iterator.hasNext()) {
+                    viewNumKeys.add(String.join("_", DISCUSS_VIEW_NUM_PREFIX, iterator.next()));
+                }
+
+                ValueOperations opsForValue = stringRedisTemplate.opsForValue();
+                List<String> viewNumList = opsForValue.multiGet(viewNumKeys);
+
+                //待处理集合,以key-value/discussId-viewNum 存放
+                HashMap<Long, Integer> needDealMap = new HashMap<>();
+                for (String discussId : needWriteDiscussIdSet) {
+                    try {
+                        needDealMap.put(Long.parseLong(discussId), Integer.parseInt(viewNumList.get(0)));
+                        viewNumList.remove(0);
+                    } catch (IndexOutOfBoundsException e) {
+                        //数据存在异常了,跳过,继续执行正确的
+                        continue;
+                    }
+                }
+                int result = comActDiscussDAO.batchUpdateViewNum(needDealMap);
+                if (result <= 0) {
+                    return R.fail("处理失败");
+                }
+            }
+        } catch (Exception e) {
+            log.error("写入浏览量失败【{}】", e.getMessage());
+            return R.fail("处理失败");
+        }
+        return R.ok();
+    }
 }

--
Gitblit v1.7.1