From c1e48a47b39dbd6919bfd9cf2e7023e9f3d6fee8 Mon Sep 17 00:00:00 2001 From: 101captain <237651143@qq.com> Date: 星期五, 05 十一月 2021 10:24:21 +0800 Subject: [PATCH] 1105测试代码修改 --- springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java | 435 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 392 insertions(+), 43 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 a25fc36..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,39 +1,82 @@ package com.panzhihua.service_community.service.impl; +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 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; +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 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.model.dtos.community.*; +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.service_community.dao.*; -import com.panzhihua.service_community.model.dos.*; +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 @@ -42,7 +85,13 @@ * @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 @@ -59,6 +108,12 @@ private ComActDiscussOptionService comActDiscussOptionService; @Resource private SysConfMapper sysConfDao; + @Resource + private SysConfService sysConfService; + @Resource + private UserService userService; + @Resource + private StringRedisTemplate stringRedisTemplate; /** * 议事投票-新增 @@ -69,6 +124,9 @@ @Override @Transactional(rollbackFor = Exception.class) public R addDiscuss(ComActDiscussDTO comActDiscussDTO) { + if (!checkCurrentUserDiscussIdentity(comActDiscussDTO)) { + return R.fail("权限验证失败,请确认是否有发布权限"); + } ComActDiscussDO comActDiscussDO = new ComActDiscussDO(); BeanUtils.copyProperties(comActDiscussDTO, comActDiscussDO); Integer type = comActDiscussDTO.getType(); @@ -87,10 +145,10 @@ } else { comActDiscussDO.setStatus(ComActDiscussDO.status.yfb); } - //查询社区地址 - ComActVO comActVO = comActDiscussDAO.selectCommunity(comActDiscussDTO.getCommunityId()); String address = comActDiscussDO.getAddress(); if (ObjectUtils.isEmpty(address)) { + //查询社区地址 + ComActVO comActVO = comActDiscussDAO.selectCommunity(comActDiscussDTO.getCommunityId()); comActDiscussDO.setAddress(comActVO.getAddress()); } int insert = comActDiscussDAO.insert(comActDiscussDO); @@ -112,6 +170,51 @@ return R.ok(); } return R.fail(); + } + + /** + * 小程序用户验证是否拥有发布权限 + * @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; } /** @@ -151,7 +254,7 @@ } else { comActDiscussDO.setStatus(ComActDiscussDO.status.yfb); } - comActDiscussDO.setUpdateAt(new Date()); + comActDiscussDO.setUpdateAt(nowDate); int insert = comActDiscussDAO.updateById(comActDiscussDO); if (insert > 0) { //如果是投票,需要把投票的选项存储 @@ -246,16 +349,27 @@ 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 userId = comActDiscussCommentDTO.getUserId(); - Long userId1 = comActDiscussDO.getUserId(); - if (userId.equals(userId1)) { + Long discussUser = comActDiscussDO.getUserId(); + if (currentUser.equals(discussUser)) { comActDiscussCommentDO.setIsAuthor(1); } int insert = comActDiscussCommentDAO.insert(comActDiscussCommentDO); if (insert > 0) { - comActDiscussDAO.addCommentCount(discussId, 1); +// comActDiscussDAO.addCommentCount(discussId, 1); + //评论成功,评论总数+1 + //若首次参与评论,参与讨论人数+1 + if (currentUserCommentCount > 0) { + comActDiscussDAO.incrCommentAndJoinNumById(discussId, false); + } else { + comActDiscussDAO.incrCommentAndJoinNumById(discussId, true); + } return R.ok(); } return R.fail(); @@ -349,6 +463,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()); @@ -410,19 +525,29 @@ if (parentId.intValue() != 0) { return R.fail("二级评论不能回复"); } - Long userId = comActDiscussDO.getUserId(); - Long userId1 = comActDiscussCommentDTO.getUserId(); + 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 (userId.equals(userId1)) { + if (discussUser.equals(currentUser)) { comActDiscussCommentDO1.setIsAuthor(1); } int insert = comActDiscussCommentDAO.insert(comActDiscussCommentDO1); if (insert > 0) { - comActDiscussDAO.addCommentCount(discussId, 1); +// comActDiscussDAO.addCommentCount(discussId, 1); + //回复成功,评论总数+1 + //若首次参与评论,参与讨论人数+1 + if (currentUserCommentCount > 0) { + comActDiscussDAO.incrCommentAndJoinNumById(discussId, false); + } else { + comActDiscussDAO.incrCommentAndJoinNumById(discussId, true); + } return R.ok(); } return R.fail(); @@ -478,10 +603,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 = @@ -495,12 +626,35 @@ // 判断选项是否已投票 int haveVote = comActDiscussOptionUserDAO.selectHaveVotes(comActDiscussOptionDO.getId(), loginUserId); + votes.add(haveVote); comActDiscussOptionVO.setHaveVote(haveVote > 0 ? 1 : 0); } comActDiscussOptionVOS.add(comActDiscussOptionVO); }); - comActDiscussOptionVOS.sort(Comparator.comparing(ComActDiscussOptionVO::getNum).reversed()); + 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) { @@ -522,6 +676,22 @@ } /** + * 判断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 操作类型 @@ -533,7 +703,8 @@ int num = 0; ComActDiscussUserDO comActDiscussUserDO = new ComActDiscussUserDO(); BeanUtils.copyProperties(comActDiscussUserDTO, comActDiscussUserDO); - if (type.intValue() == 1) { + boolean isIncr = type.intValue() == 1; + if (isIncr) { num = comActDiscussUserDAO.insert(comActDiscussUserDO); } else { num = comActDiscussUserDAO.delete(new QueryWrapper<ComActDiscussUserDO>().lambda() @@ -541,6 +712,8 @@ .eq(ComActDiscussUserDO::getDiscussId, comActDiscussUserDTO.getDiscussId())); } if (num > 0) { + //点赞成功 总数+1 || 取消点赞成功 总数-1 + comActDiscussDAO.incrOrDecrFabulousNumByType(comActDiscussUserDTO.getDiscussId(), isIncr); return R.ok(); } return R.fail(); @@ -653,17 +826,13 @@ } 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.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 = @@ -676,12 +845,35 @@ // 判断选项是否已投票 int haveVote = comActDiscussOptionUserDAO.selectHaveVotes(comActDiscussOptionDO.getId(), loginUserId); + votes.add(haveVote); comActDiscussOptionVO.setHaveVote(haveVote > 0 ? 1 : 0); } comActDiscussOptionVOS.add(comActDiscussOptionVO); }); - comActDiscussOptionVOS.sort(Comparator.comparing(ComActDiscussOptionVO::getNum).reversed()); + 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); @@ -707,8 +899,33 @@ 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()); } /** @@ -719,7 +936,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)) { @@ -730,17 +948,39 @@ // QueryWrapper<ComActDiscussOptionDO>().lambda().eq(ComActDiscussOptionDO::getDiscussId, discussId)); // List<Long> longList=comActDiscussOptionDOS.stream().map(comActDiscussOptionDO1 -> // comActDiscussOptionDO1.getId()).collect(Collectors.toList()); - Integer integer = comActDiscussOptionUserDAO.selectCount( - new QueryWrapper<ComActDiscussOptionUserDO>().lambda().eq(ComActDiscussOptionUserDO::getUserId, userId) - .eq(ComActDiscussOptionUserDO::getDiscussOptionId, discussOptionId)); - if (integer > 0) { - return R.fail("不要重复投票"); + Long discussId = comActDiscussOptionDO.getDiscussId(); + ComActDiscussDO comActDiscussDO = comActDiscussDAO.selectById(comActDiscussOptionDO.getDiscussId()); + if (isNull(comActDiscussOptionDO)) { + return R.fail("投票主题不存在"); } - ComActDiscussOptionUserDO comActDiscussOptionUserDO = new ComActDiscussOptionUserDO(); - comActDiscussOptionUserDO.setUserId(userId); - comActDiscussOptionUserDO.setDiscussOptionId(discussOptionId); - int insert = comActDiscussOptionUserDAO.insert(comActDiscussOptionUserDO); - if (insert > 0) { + 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(); @@ -898,7 +1138,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); @@ -976,4 +1218,111 @@ }); 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