From 43f0578e80af82ecae6c61b51bd0539c6b960603 Mon Sep 17 00:00:00 2001
From: puhanshu <a9236326>
Date: 星期二, 16 八月 2022 19:08:32 +0800
Subject: [PATCH] 服务范围优化

---
 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java |  194 ++++++++++++++++++++++++++++++++++--------------
 1 files changed, 136 insertions(+), 58 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 f7316ca..4069f73 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
@@ -18,13 +18,6 @@
 
 import javax.annotation.Resource;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.panzhihua.common.constants.Constants;
-import com.panzhihua.common.exceptions.ServiceException;
-import com.panzhihua.common.model.dtos.community.discuss.ComActDiscussDetailDTO;
-import com.panzhihua.common.model.dtos.community.discuss.ComActDiscussPublishResultDTO;
-import com.panzhihua.common.model.vos.community.*;
-import com.panzhihua.common.utlis.DateUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.connection.StringRedisConnection;
 import org.springframework.data.redis.core.RedisCallback;
@@ -36,10 +29,13 @@
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
+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;
@@ -49,6 +45,8 @@
 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;
@@ -56,6 +54,7 @@
 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;
@@ -65,12 +64,14 @@
 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;
@@ -187,26 +188,30 @@
             String discussIdentityConfig = (String) sysConfValue.getData();
             if (isBlank(discussIdentityConfig)) {
                 checkResult = false;
-            }
-            List<String> currentUserRoles = new ArrayList<>();
-            List<String> sysAllowedRoles = Arrays.asList(discussIdentityConfig.split(","));
-            LoginUserInfoVO loginUserInfo = comActDiscussDTO.getLoginUserInfo();
-            if (loginUserInfo.getIsPartymember().intValue() == 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;
-            }
-            boolean result = sysAllowedRoles.stream().anyMatch(role -> currentUserRoles.contains(role));
-            if (!result) {
-                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;
@@ -249,7 +254,7 @@
         } else {
             comActDiscussDO.setStatus(ComActDiscussDO.status.yfb);
         }
-        comActDiscussDO.setUpdateAt(new Date());
+        comActDiscussDO.setUpdateAt(nowDate);
         int insert = comActDiscussDAO.updateById(comActDiscussDO);
         if (insert > 0) {
             //如果是投票,需要把投票的选项存储
@@ -297,6 +302,7 @@
         LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(userId);
         comActDiscussVO.setUserName(loginUserInfoVO.getName());
         comActDiscussVO.setUserNickName(loginUserInfoVO.getNickName());
+        comActDiscussVO.setImageUrl(loginUserInfoVO.getImageUrl());
 
         //分页查询评论列表
         PageComActDiscussCommentDTO pageComActDiscussCommentDTO = new PageComActDiscussCommentDTO();
@@ -311,6 +317,11 @@
             }
         });
         comActDiscussVO.setDiscussCommentList(discussComments.getRecords());
+        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)));
+        }
         return R.ok(comActDiscussVO);
     }
 
@@ -391,7 +402,19 @@
      */
     @Override
     public R pageDiscussAdmin(PageComActDiscussDTO pageComActDiscussDTO) {
-        return R.ok(comActDiscussDAO.pageDiscussAdmin(new Page<>(pageComActDiscussDTO.getPageNum(), pageComActDiscussDTO.getPageSize()), pageComActDiscussDTO));
+        IPage<ComActDiscussVO> comActDiscussVOIPage=comActDiscussDAO.pageDiscussAdmin(new Page<>(pageComActDiscussDTO.getPageNum(), pageComActDiscussDTO.getPageSize()), pageComActDiscussDTO);
+        List<ComActDiscussVO> records = comActDiscussVOIPage.getRecords();
+        if (!ObjectUtils.isEmpty(records)) {
+            records.forEach(comActDiscussVO -> {
+                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)));
+                }
+            });
+        }
+        return R.ok(comActDiscussVOIPage);
     }
 
     /**
@@ -458,6 +481,7 @@
         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());
@@ -597,10 +621,16 @@
             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 =
@@ -614,6 +644,7 @@
                             // 判断选项是否已投票
                             int haveVote =
                                     comActDiscussOptionUserDAO.selectHaveVotes(comActDiscussOptionDO.getId(), loginUserId);
+                            votes.add(haveVote);
                             comActDiscussOptionVO.setHaveVote(haveVote > 0 ? 1 : 0);
                         }
                         comActDiscussOptionVOS.add(comActDiscussOptionVO);
@@ -621,6 +652,20 @@
                     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());
@@ -654,11 +699,13 @@
      */
     private void checkDiscussStatusIsCorrect(ComActDiscussVO comActDiscussVO) {
         //判断discuss状态是否正确
-        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);
+        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);
+            }
         }
     }
 
@@ -870,7 +917,12 @@
             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);
     }
 
@@ -902,7 +954,8 @@
      */
     @Override
     public R addDiscussOptionUser(ComActDiscussOptionUserDTO comActDiscussOptionUserDTO) {
-        Long discussOptionId = comActDiscussOptionUserDTO.getDiscussOptionId();
+        List<Long> discussOptionIds = comActDiscussOptionUserDTO.getDiscussOptionIds();
+        Long discussOptionId = discussOptionIds.get(0);
         Long userId = comActDiscussOptionUserDTO.getUserId();
         ComActDiscussOptionDO comActDiscussOptionDO = comActDiscussOptionDAO.selectById(discussOptionId);
         if (ObjectUtils.isEmpty(comActDiscussOptionDO)) {
@@ -920,30 +973,31 @@
         }
         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) {
-                return R.fail("当天投票次数已用完");
+            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) {
-                return R.fail("投票次数已用完");
+            if (usableVoteVotes <= alreadyVotedVotes || currentVoteNum > usableVoteVotes - alreadyVotedVotes) {
+                return R.fail("票数不足");
             }
         }
-        ComActDiscussOptionUserDO comActDiscussOptionUserDO = new ComActDiscussOptionUserDO();
-        comActDiscussOptionUserDO.setUserId(userId);
-        comActDiscussOptionUserDO.setDiscussOptionId(discussOptionId);
-        comActDiscussOptionUserDO.setDiscussId(discussId);
-        int insert = comActDiscussOptionUserDAO.insert(comActDiscussOptionUserDO);
-        if (insert > 0) {
-            return R.ok();
-        }
-        return R.fail();
+        List<ComActDiscussOptionUserDO> comActDiscussOptionUserDOList = new ArrayList<>();
+        discussOptionIds.forEach(optionId -> {
+            ComActDiscussOptionUserDO comActDiscussOptionUserDO = new ComActDiscussOptionUserDO();
+            comActDiscussOptionUserDO.setUserId(userId);
+            comActDiscussOptionUserDO.setDiscussOptionId(optionId);
+            comActDiscussOptionUserDO.setDiscussId(discussId);
+            comActDiscussOptionUserDAO.insert(comActDiscussOptionUserDO);
+        });
+        return R.ok();
     }
 
     /**
@@ -1098,7 +1152,9 @@
     @Override
     public R discussJurisdictionGet(Long communityId, Long userId) {
         List<SysConfDO> confDOList = sysConfDao.selectList(new LambdaQueryWrapper<SysConfDO>()
-                .eq(SysConfDO::getCommunityId, communityId).orderByDesc(SysConfDO::getCreateAt));
+                .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);
@@ -1222,11 +1278,22 @@
             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));
     }
 
     /**
@@ -1243,8 +1310,14 @@
                 //组装viewNum key
                 List<String> viewNumKeys = new ArrayList<>();
                 Iterator<String> iterator = needWriteDiscussIdSet.iterator();
+                List<String> idList = new ArrayList<>();
                 while (iterator.hasNext()) {
-                    viewNumKeys.add(String.join("_", DISCUSS_VIEW_NUM_PREFIX, iterator.next()));
+                    String next = iterator.next();
+                    String key = String.join("_", DISCUSS_VIEW_NUM_PREFIX, next);
+                    if (stringRedisTemplate.hasKey(key)) {
+                        idList.add(next);
+                        viewNumKeys.add(key);
+                    }
                 }
 
                 ValueOperations opsForValue = stringRedisTemplate.opsForValue();
@@ -1252,13 +1325,18 @@
 
                 //待处理集合,以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;
+                if (nonNull(idList) && !idList.isEmpty()) {
+                    log.error("一起议id列表:" + idList.toString());
+                    log.error("一起议浏览量:" + viewNumList.toString());
+                    for (String discussId : idList) {
+                        try {
+                            needDealMap.put(Long.parseLong(discussId), Integer.parseInt(viewNumList.get(0)));
+                            viewNumList.remove(0);
+                        } catch (IndexOutOfBoundsException e) {
+                            log.error("数据异常:" + discussId, e.getMessage());
+                            //数据存在异常了,跳过,继续执行正确的
+                            continue;
+                        }
                     }
                 }
                 int result = comActDiscussDAO.batchUpdateViewNum(needDealMap);

--
Gitblit v1.7.1