From 70d2a5d0f9c6951b2d4cac954041ed73582ff7eb Mon Sep 17 00:00:00 2001 From: liujie <1793218484@qq.com> Date: 星期一, 09 六月 2025 11:54:00 +0800 Subject: [PATCH] 6.9新增登录失败冻结逻辑 --- springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComActDiscussServiceImpl.java | 895 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 846 insertions(+), 49 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..dec89f4 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,88 @@ 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 javax.validation.constraints.NotEmpty; -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 cn.hutool.core.util.DesensitizedUtil; +import com.panzhihua.common.model.dtos.community.ComActDiscussVoteOptionDTO; +import com.panzhihua.common.model.dtos.community.DiscussVoteOptionDTO; +import com.panzhihua.common.model.dtos.community.PageVoteSituationDTO; +import com.panzhihua.service_community.dao.ComPbMemberDAO; 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 +91,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 +114,14 @@ private ComActDiscussOptionService comActDiscussOptionService; @Resource private SysConfMapper sysConfDao; + @Resource + private SysConfService sysConfService; + @Resource + private UserService userService; + @Resource + private StringRedisTemplate stringRedisTemplate; + @Resource + private ComPbMemberDAO pbMemberDAO; /** * 议事投票-新增 @@ -69,6 +132,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 +153,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); @@ -105,6 +171,7 @@ comActDiscussOptionDO.setDiscussId(comActDiscussDO1Id); comActDiscussOptionDO.setOptionContent(s.getOptionContent()); comActDiscussOptionDO.setOptionUrl(s.getOptionUrl()); + comActDiscussOptionDO.setNeedReason(s.getNeedReason()); comActDiscussOptionDOS.add(comActDiscussOptionDO); }); comActDiscussOptionService.saveBatch(comActDiscussOptionDOS); @@ -112,6 +179,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 +263,7 @@ } else { comActDiscussDO.setStatus(ComActDiscussDO.status.yfb); } - comActDiscussDO.setUpdateAt(new Date()); + comActDiscussDO.setUpdateAt(nowDate); int insert = comActDiscussDAO.updateById(comActDiscussDO); if (insert > 0) { //如果是投票,需要把投票的选项存储 @@ -190,15 +302,90 @@ BeanUtils.copyProperties(comActDiscussDO, comActDiscussVO); comActDiscussVO.setSignNum(comActDiscussDO.getFabulousNum()); Integer type = comActDiscussVO.getType(); + Integer num=comActDiscussDAO.getCommentNum(id+""); + comActDiscussVO.setCommentNum(num); if (type.equals(ComActDiscussVO.type.tp)) { //查询选项列表 List<ComActDiscussOptionVO> comActDiscussOptionList = comActDiscussOptionDAO.getDiscussOptionList(id); + comActDiscussOptionList.forEach(option -> { + if (option.getAllNum() ==null || option.getAllNum() == 0) { + option.setPercent(new BigDecimal(0)); + } else { + //占比 + BigDecimal percent = BigDecimal.valueOf(option.getNum()).divide(BigDecimal.valueOf(option.getAllNum()), 2, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).setScale(0); + option.setPercent(percent); + } + }); comActDiscussVO.setComActDiscussOptionVOS(comActDiscussOptionList); } Long userId = comActDiscussDO.getUserId(); LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(userId); comActDiscussVO.setUserName(loginUserInfoVO.getName()); comActDiscussVO.setUserNickName(loginUserInfoVO.getNickName()); + comActDiscussVO.setImageUrl(loginUserInfoVO.getImageUrl()); + + //分页查询评论列表 + 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()); + 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); + } + + /** + * 议事投票-详情 脱敏 + * + * @param discussDetailDTO 请求参数 + * @return ComActDiscussVO + */ + @Override + public R detailDiscussDesensitize(ComActDiscussDetailDTO discussDetailDTO) { + Long id = discussDetailDTO.getId(); + 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(); + Integer num=comActDiscussDAO.getCommentNum(id+""); + comActDiscussVO.setCommentNum(num); + if (type.equals(ComActDiscussVO.type.tp)) { + //查询选项列表 + List<ComActDiscussOptionVO> comActDiscussOptionList = comActDiscussOptionDAO.getDiscussOptionList(id); + comActDiscussOptionList.forEach(option -> { + if (option.getAllNum() ==null || option.getAllNum() == 0) { + option.setPercent(new BigDecimal(0)); + } else { + //占比 + BigDecimal percent = BigDecimal.valueOf(option.getNum()).divide(BigDecimal.valueOf(option.getAllNum()), 2, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)).setScale(0); + option.setPercent(percent); + } + }); + comActDiscussVO.setComActDiscussOptionVOS(comActDiscussOptionList); + } + Long userId = comActDiscussDO.getUserId(); + LoginUserInfoVO loginUserInfoVO = comActDiscussDAO.selectUserByUserId(userId); + comActDiscussVO.setUserName(DesensitizedUtil.chineseName(loginUserInfoVO.getName())); + comActDiscussVO.setUserNickName(loginUserInfoVO.getNickName()); + comActDiscussVO.setImageUrl(loginUserInfoVO.getImageUrl()); //分页查询评论列表 PageComActDiscussCommentDTO pageComActDiscussCommentDTO = new PageComActDiscussCommentDTO(); @@ -213,6 +400,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); } @@ -228,6 +420,7 @@ comActDiscussDO.setId(id); comActDiscussDO.setIsDel(ComActDiscussDO.isOk.yes); if (comActDiscussDAO.updateById(comActDiscussDO) > 0) { + comActDiscussDAO.incrCommentAndJoinNumById(id, false,false); return R.ok(); } return R.fail(); @@ -246,16 +439,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,true); + } else { + comActDiscussDAO.incrCommentAndJoinNumById(discussId, true,true); + } return R.ok(); } return R.fail(); @@ -282,7 +486,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); } /** @@ -349,6 +565,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 +627,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,true); + } else { + comActDiscussDAO.incrCommentAndJoinNumById(discussId, true,true); + } return R.ok(); } return R.fail(); @@ -452,6 +679,11 @@ return R.ok(iPage); } + @Override + public R deleteId(String id) { + return R.ok(comActDiscussDAO.deleteId(id)); + } + /** * 议事投票-分页查询 小程序 * @@ -472,16 +704,28 @@ } page.setSize(pageSize); page.setCurrent(pageNum); + pageComActDiscussDTO.setIsPbMember(0); + pageComActDiscussDTO.setIsVolunteer(0); + if (nonNull(loginUserId)) { + pageComActDiscussDTO.setIsPbMember(pbMemberDAO.checkIsPbMember(loginUserId) > 0 ? 1 : 0); + pageComActDiscussDTO.setIsVolunteer(pbMemberDAO.checkIsVolunteer(loginUserId) > 0 ? 1 : 0); + } 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 = @@ -495,12 +739,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 +789,127 @@ } /** + * 议事投票-分页查询 小程序 + * + * @param pageComActDiscussDTO 查询参数 + * @return ComActDiscussVO 分页 + */ + @Override + public R pageDiscussAppletsDesensitize(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); + pageComActDiscussDTO.setIsPbMember(0); + pageComActDiscussDTO.setIsVolunteer(0); + if (nonNull(loginUserId)) { + pageComActDiscussDTO.setIsPbMember(pbMemberDAO.checkIsPbMember(loginUserId) > 0 ? 1 : 0); + pageComActDiscussDTO.setIsVolunteer(pbMemberDAO.checkIsVolunteer(loginUserId) > 0 ? 1 : 0); + } + 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); + } + } + comActDiscussVO.setUserName(DesensitizedUtil.chineseName(comActDiscussVO.getUserName())); + //填充投票记录列表 + 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 操作类型 @@ -533,7 +921,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 +930,8 @@ .eq(ComActDiscussUserDO::getDiscussId, comActDiscussUserDTO.getDiscussId())); } if (num > 0) { + //点赞成功 总数+1 || 取消点赞成功 总数-1 + comActDiscussDAO.incrOrDecrFabulousNumByType(comActDiscussUserDTO.getDiscussId(), isIncr); return R.ok(); } return R.fail(); @@ -638,6 +1029,104 @@ return R.ok(iPage); } + /** + * 议事投票-评论-分页查询 小程序 + * + * @param pageComActDiscussCommentDTO 分页参数 + * @return ComActDiscussCommentVO + */ + @Override + public R pageDiscussCommentAppletsDesensitize(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(); + comActDiscussCommentVO.setPhone(DesensitizedUtil.mobilePhone(comActDiscussCommentVO.getPhone())); + comActDiscussCommentVO.setUserName(DesensitizedUtil.chineseName(comActDiscussCommentVO.getUserName())); + comActDiscussCommentVO.setUserNameBack(DesensitizedUtil.chineseName(comActDiscussCommentVO.getUserNameBack())); + 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); + } + comActDiscussCommentVO1.setPhone(DesensitizedUtil.mobilePhone(comActDiscussCommentVO1.getPhone())); + comActDiscussCommentVO1.setUserName(DesensitizedUtil.chineseName(comActDiscussCommentVO1.getUserName())); + comActDiscussCommentVO1.setUserNameBack(DesensitizedUtil.chineseName(comActDiscussCommentVO1.getUserNameBack())); + 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); + } + /** * 议事投票-详情 小程序 * @@ -653,17 +1142,15 @@ } 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(); + Integer num=comActDiscussDAO.getCommentNum(id+""); + comActDiscussVO.setCommentNum(num); 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 +1163,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,20 +1217,144 @@ 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 id 主键 + * @param loginUserId 登录用户主键 + * @return ComActDiscussVO + */ + @Override + public R detailDiscussAppletsDesensitize(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(); + Integer num=comActDiscussDAO.getCommentNum(id+""); + comActDiscussVO.setCommentNum(num); + 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(DesensitizedUtil.chineseName(loginUserInfoVO.getName())); + if (StringUtils.isEmpty(loginUserInfoVO.getNickName())) { + comActDiscussVO.setUserNickName(DesensitizedUtil.chineseName(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 投票信息 + * @param discussVoteOptionDTO 投票信息 * @return 投票结果 */ @Override - public R addDiscussOptionUser(ComActDiscussOptionUserDTO comActDiscussOptionUserDTO) { - Long discussOptionId = comActDiscussOptionUserDTO.getDiscussOptionId(); - Long userId = comActDiscussOptionUserDTO.getUserId(); + public R addDiscussOptionUser(DiscussVoteOptionDTO discussVoteOptionDTO) { + List<ComActDiscussVoteOptionDTO> options = discussVoteOptionDTO.getOptions(); + Long discussOptionId = options.get(0).getId(); + Long userId = discussVoteOptionDTO.getUserId(); ComActDiscussOptionDO comActDiscussOptionDO = comActDiscussOptionDAO.selectById(discussOptionId); if (ObjectUtils.isEmpty(comActDiscussOptionDO)) { return R.fail("选项不存在"); @@ -730,20 +1364,40 @@ // QueryWrapper<ComActDiscussOptionDO>().lambda().eq(ComActDiscussOptionDO::getDiscussId, discussId)); // List<Long> longList=comActDiscussOptionDOS.stream().map(comActDiscussOptionDO1 -> // comActDiscussOptionDO1.getId()).collect(Collectors.toList()); - Integer integer = comActDiscussOptionUserDAO.selectCount( + 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 = options.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::getDiscussOptionId, discussOptionId)); - if (integer > 0) { - return R.fail("不要重复投票"); + .eq(ComActDiscussOptionUserDO::getDiscussId, discussId)); + if (usableVoteVotes <= alreadyVotedVotes || currentVoteNum > usableVoteVotes - alreadyVotedVotes) { + return R.fail("票数不足"); + } } - ComActDiscussOptionUserDO comActDiscussOptionUserDO = new ComActDiscussOptionUserDO(); - comActDiscussOptionUserDO.setUserId(userId); - comActDiscussOptionUserDO.setDiscussOptionId(discussOptionId); - int insert = comActDiscussOptionUserDAO.insert(comActDiscussOptionUserDO); - if (insert > 0) { - return R.ok(); - } - return R.fail(); + List<ComActDiscussOptionUserDO> comActDiscussOptionUserDOList = new ArrayList<>(); + options.forEach(option -> { + ComActDiscussOptionUserDO comActDiscussOptionUserDO = new ComActDiscussOptionUserDO(); + comActDiscussOptionUserDO.setUserId(userId); + comActDiscussOptionUserDO.setDiscussOptionId(option.getId()); + comActDiscussOptionUserDO.setDiscussId(discussId); + comActDiscussOptionUserDO.setSignUrl(option.getSignUrl()); + comActDiscussOptionUserDO.setReason(option.getReason()); + comActDiscussOptionUserDAO.insert(comActDiscussOptionUserDO); + }); + return R.ok(); } /** @@ -898,7 +1552,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 +1632,145 @@ }); 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)); + } + + /** + * 投票情况-分页查询 + * @param pageVoteSituationDTO + * @return + */ + @Override + public R pageVoteSituation(PageVoteSituationDTO pageVoteSituationDTO) { + Page page = new Page<>(); + page.setCurrent(pageVoteSituationDTO.getPageNum()); + page.setSize(pageVoteSituationDTO.getPageSize()); + return R.ok(comActDiscussOptionUserDAO.pageVoteSituation(page, pageVoteSituationDTO)); + } + + /** + * 投票情况详情 + * @param optionUserId + * @return + */ + @Override + public R detailVoteSituation(Long optionUserId) { + return R.ok(comActDiscussOptionUserDAO.detailVoteSituation(optionUserId)); + } + + /** + * 将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(); + List<String> idList = new ArrayList<>(); + while (iterator.hasNext()) { + 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(); + List<String> viewNumList = opsForValue.multiGet(viewNumKeys); + + //待处理集合,以key-value/discussId-viewNum 存放 + HashMap<Long, Integer> needDealMap = new HashMap<>(); + 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); + if (result <= 0) { + return R.fail("处理失败"); + } + } + } catch (Exception e) { + log.error("写入浏览量失败【{}】", e.getMessage()); + return R.fail("处理失败"); + } + return R.ok(); + } } -- Gitblit v1.7.1