From addf625b08570ee04ac609bc13e3455ea5fe76e0 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Tue, 28 Dec 2021 15:54:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=86=B3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/SelectIssueVotingDetailFormDTO.java | 20 +++++ .../epmet/dao/IssueVoteStatisticalDao.java | 9 ++ .../com/epmet/redis/IssueVoteDetailRedis.java | 82 +++++++++++++------ .../epmet/service/IssueVoteDetailService.java | 13 +++ .../epmet/service/impl/IssueServiceImpl.java | 14 +++- .../impl/IssueVoteDetailServiceImpl.java | 54 ++++++++++-- .../mapper/IssueVoteStatisticalDao.xml | 11 +++ 7 files changed, 174 insertions(+), 29 deletions(-) create mode 100644 epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/form/SelectIssueVotingDetailFormDTO.java diff --git a/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/form/SelectIssueVotingDetailFormDTO.java b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/form/SelectIssueVotingDetailFormDTO.java new file mode 100644 index 0000000000..fb51463348 --- /dev/null +++ b/epmet-module/gov-issue/gov-issue-client/src/main/java/com/epmet/dto/form/SelectIssueVotingDetailFormDTO.java @@ -0,0 +1,20 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @DateTime 2021/12/28 2:59 下午 + * @DESC + */ +@Data +public class SelectIssueVotingDetailFormDTO implements Serializable { + + private static final long serialVersionUID = -2623635693971761693L; + + private String issueId; + + private String gridId; +} diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java index 134ec32bb1..cc4cc16127 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteStatisticalDao.java @@ -21,6 +21,7 @@ import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.IssueVoteStatisticalDTO; import com.epmet.dto.PolyLineDTO; import com.epmet.dto.form.IssueIdFormDTO; +import com.epmet.dto.form.VoteRedisFormDTO; import com.epmet.dto.result.VoteResultDTO; import com.epmet.dto.result.VotingTrendResultDTO; import com.epmet.entity.IssueVoteStatisticalEntity; @@ -121,4 +122,12 @@ public interface IssueVoteStatisticalDao extends BaseDao map = BeanUtil.beanToMap(vote, false, true); - redisUtils.hMSet(key, map,NOT_EXPIRE); + redisUtils.hMSet(key, map,DEFAULT_EXPIRE * 3); } public VoteRedisFormDTO get(String issueId){ @@ -202,41 +210,69 @@ public class IssueVoteDetailRedis { } /** - * @Description 根据issueId去缓存取表决统计数据,如果没有去数据库查询并放入缓存 + * @Description 根据issueId直接获取缓存,获取到直接返回 + * 缓存不存在,根据issue状态做不同处理 + * 表决中:应表决数,支持数,反对数 重新计算 + * 关闭、转项目:直接从表决统计表中查询 * @param issueId * @return * @author wangc * @date 2020.05.21 22:31 **/ +// public VoteRedisFormDTO getVoteStatistical(String issueId){ +// String key = new StringBuilder(IssueConstant.REDIS_KEY).append(issueId).toString(); +// Map stringObjectMap = redisUtils.hGetAll(key); +// if ( null != stringObjectMap && stringObjectMap.size() > NumConstant.ZERO ){ +// return mapToEntity(stringObjectMap, VoteRedisFormDTO.class); +// } +// //如果缓存中没有,去表决详情中计算出实时数据,并放入缓存中 +// //无需查询issue_vote_statistical中的数据,因为不是实时数据,可能不准确,有定时任务会自动同步 +// VoteRedisFormDTO voteCache = issueVoteDetailDao.selectInfo4Cache(issueId); +// if(StringUtils.isBlank(voteCache.getIssueId())) voteCache.setIssueId(issueId); +// IssueDTO issue = issueService.get(issueId); +// if(null != issue){ +// CommonGridIdFormDTO gridId = new CommonGridIdFormDTO(); +// gridId.setGridId(issue.getGridId()); +// Result votableCount = +// resiGroupFeignClient.votableCount(gridId); +// if(votableCount.success() && null != votableCount.getData()){ +// voteCache.setShouldVoteCount(votableCount.getData()); +// }else{ +// voteCache.setShouldVoteCount(NumConstant.ZERO); +// } +// set(voteCache); +// return voteCache; +// }else{ +// logger.warn(String.format(ModuleConstants.ISSUE_NOT_FOUND_EXCEPTION_TEMPLATE,issueId)); +// return null; +// } +// } public VoteRedisFormDTO getVoteStatistical(String issueId){ String key = new StringBuilder(IssueConstant.REDIS_KEY).append(issueId).toString(); Map stringObjectMap = redisUtils.hGetAll(key); if ( null != stringObjectMap && stringObjectMap.size() > NumConstant.ZERO ){ return mapToEntity(stringObjectMap, VoteRedisFormDTO.class); } - //如果缓存中没有,去表决详情中计算出实时数据,并放入缓存中 - //无需查询issue_vote_statistical中的数据,因为不是实时数据,可能不准确,有定时任务会自动同步 - VoteRedisFormDTO voteCache = issueVoteDetailDao.selectInfo4Cache(issueId); - if(StringUtils.isBlank(voteCache.getIssueId())) voteCache.setIssueId(issueId); - IssueDTO issue = issueService.get(issueId); - if(null != issue){ - CommonGridIdFormDTO gridId = new CommonGridIdFormDTO(); - gridId.setGridId(issue.getGridId()); - Result votableCount = - resiGroupFeignClient.votableCount(gridId); - if(votableCount.success() && null != votableCount.getData()){ - voteCache.setShouldVoteCount(votableCount.getData()); - }else{ - voteCache.setShouldVoteCount(NumConstant.ZERO); - } - set(voteCache); - return voteCache; - }else{ - logger.warn(String.format(ModuleConstants.ISSUE_NOT_FOUND_EXCEPTION_TEMPLATE,issueId)); - return null; + IssueDTO issue = issueService.get(issueId); + if(null != issue){ + // 如果是表决中的议题,数据现算 + VoteRedisFormDTO voteCache = new VoteRedisFormDTO(); + if (issue.getIssueStatus().equals(IssueConstant.ISSUE_VOTING)){ + SelectIssueVotingDetailFormDTO formDTO = new SelectIssueVotingDetailFormDTO(); + formDTO.setIssueId(issueId); + formDTO.setGridId(issue.getGridId()); + voteCache = issueVoteDetailService.selectIssueVotingDetail(formDTO); + }else { + // 状态是关闭,转议题的,直接从结果表查询 + voteCache = issueVoteStatisticalDao.selectVoteDetail(issueId); } + set(voteCache); + return voteCache; + }else{ + logger.warn(String.format(ModuleConstants.ISSUE_NOT_FOUND_EXCEPTION_TEMPLATE,issueId)); + return null; + } } - /** * @Description 修改缓存中某个属性 - hash * @param issueId diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueVoteDetailService.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueVoteDetailService.java index 61681bdfb0..5a1d237a20 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueVoteDetailService.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/IssueVoteDetailService.java @@ -20,8 +20,11 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.IssueVoteDetailDTO; +import com.epmet.dto.IssueVoteStatisticalDTO; import com.epmet.dto.form.CheckVoteFormDTO; +import com.epmet.dto.form.SelectIssueVotingDetailFormDTO; import com.epmet.dto.form.VoteFormDTO; +import com.epmet.dto.form.VoteRedisFormDTO; import com.epmet.dto.result.JoinVoteResultDTO; import com.epmet.entity.IssueVoteDetailEntity; import org.apache.ibatis.annotations.Param; @@ -121,4 +124,14 @@ public interface IssueVoteDetailService extends BaseService imp private EpmetMessageOpenFeignClient messageOpenFeignClient; @Autowired private GovProjectOpenFeignClient govProjectOpenFeignClient; + @Autowired + private IssueVoteDetailService issueVoteDetailService; @Value("${openapi.scan.server.url}") @@ -738,7 +740,11 @@ public class IssueServiceImpl extends BaseServiceImpl imp } try { - issueVoteStatisticalService.syncVotingCacheToDbByParams(formDTO.getIssueId(),entity.getGridId(),null); +// issueVoteStatisticalService.syncVotingCacheToDbByParams(formDTO.getIssueId(),entity.getGridId(),null); + SelectIssueVotingDetailFormDTO dto = new SelectIssueVotingDetailFormDTO(); + dto.setGridId(entity.getGridId()); + dto.setIssueId(formDTO.getIssueId()); + issueVoteDetailService.updateVote(dto); }catch (RenException e){ logger.error(e.getInternalMsg()); } @@ -1055,6 +1061,12 @@ public class IssueServiceImpl extends BaseServiceImpl imp logger.warn("com.epmet.service.impl.IssueServiceImpl.shiftProjectV2,话题被转为项目积分事件发送失败,参数:{}", JSON.toJSONString(formDTO)); } + // 8.数据库更新表决统计 + SelectIssueVotingDetailFormDTO dto = new SelectIssueVotingDetailFormDTO(); + dto.setGridId(entity.getGridId()); + dto.setIssueId(formDTO.getIssueId()); + issueVoteDetailService.updateVote(dto); + //8.记录日志 //SendMqMsgUtil.build().openFeignClient(messageOpenFeignClient).sendProjectChangedMqMsg(); } diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteDetailServiceImpl.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteDetailServiceImpl.java index 7016cf1431..7758cc57cb 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteDetailServiceImpl.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteDetailServiceImpl.java @@ -24,14 +24,18 @@ import com.epmet.commons.tools.constant.FieldConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.StrConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.Result; import com.epmet.constant.IssueConstant; import com.epmet.dao.IssueDao; import com.epmet.dao.IssueVoteDetailDao; +import com.epmet.dao.IssueVoteStatisticalDao; import com.epmet.dto.IssueDTO; import com.epmet.dto.IssueVoteDetailDTO; +import com.epmet.dto.IssueVoteStatisticalDTO; import com.epmet.dto.form.*; import com.epmet.dto.result.CheckTopicPublisherResultDTO; import com.epmet.dto.result.JoinVoteResultDTO; @@ -41,6 +45,7 @@ import com.epmet.feign.ResiGroupFeignClient; import com.epmet.redis.IssueVoteDetailRedis; import com.epmet.service.IssueService; import com.epmet.service.IssueVoteDetailService; +import com.epmet.service.IssueVoteStatisticalService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -68,6 +73,8 @@ public class IssueVoteDetailServiceImpl extends BaseServiceImpl page(Map params) { @@ -145,11 +152,17 @@ public class IssueVoteDetailServiceImpl extends BaseServiceImpl integerResult = resiGroupFeignClient.votableCount(dto); + if (!integerResult.success()){ + throw new EpmetException("查询应表决人数失败..."); + } + redisData.setShouldVoteCount(integerResult.getData()); issueVoteDetailRedis.set(redisData); Integer checkoutVoteCount = baseDao.checkoutVote(formDTO); if (checkoutVoteCount==0){ @@ -214,5 +227,36 @@ public class IssueVoteDetailServiceImpl extends BaseServiceImpl votableCount = resiGroupFeignClient.votableCount(gridId); + if(votableCount.success() && null != votableCount.getData()){ + voteCache.setShouldVoteCount(votableCount.getData()); + }else{ + voteCache.setShouldVoteCount(NumConstant.ZERO); + } + return voteCache; + } + + @Override + public void updateVote(SelectIssueVotingDetailFormDTO formDTO) { + VoteRedisFormDTO voteRedisFormDTO = this.selectIssueVotingDetail(formDTO); + IssueVoteStatisticalDTO dto = ConvertUtils.sourceToTarget(voteRedisFormDTO, IssueVoteStatisticalDTO.class); + dto.setVotableCount(voteRedisFormDTO.getShouldVoteCount()); + issueVoteStatisticalDao.updateBtIssueId(dto); + } + } \ No newline at end of file diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml b/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml index 8718c506db..3e124c02ad 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml +++ b/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteStatisticalDao.xml @@ -115,6 +115,17 @@ + +