Browse Source

issueVoteStats任务修改

master
wangchao 4 years ago
parent
commit
57900ec03f
  1. 18
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteDetailDao.java
  2. 37
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java
  3. 82
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteStatisticalServiceImpl.java
  4. 36
      epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteDetailDao.xml

18
epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteDetailDao.java

@ -20,6 +20,7 @@ package com.epmet.dao;
import com.epmet.commons.mybatis.dao.BaseDao;
import com.epmet.dto.IssueVoteDetailDTO;
import com.epmet.dto.form.VoteFormDTO;
import com.epmet.dto.form.VoteRedisFormDTO;
import com.epmet.dto.result.IssueAttitudeCountResultDTO;
import com.epmet.dto.result.MyPartIssuesResultDTO;
import com.epmet.entity.IssueVoteDetailEntity;
@ -95,4 +96,21 @@ public interface IssueVoteDetailDao extends BaseDao<IssueVoteDetailEntity> {
* @Date 2020/11/18 14:35
**/
IssueVoteDetailDTO selectUserIssueDet(@Param("userId") String userId, @Param("issueId") String issueId);
/**
* @Description 统计出一个议题的所有支持数和反对数
* @param issueId
* @return com.epmet.dto.form.VoteRedisFormDTO
* @author wangc
* @date 2021.03.03 18:09
*/
VoteRedisFormDTO selectInfo4Cache(@Param("issueId") String issueId);
/**
* @Description 批量统计出议题的所有支持数和反对数
* @param issueIds
* @return java.util.Set<com.epmet.dto.form.VoteRedisFormDTO>
* @author wangc
* @date 2021.03.18 14:58
*/
List<VoteRedisFormDTO> selectBatchVoteCount(@Param("issueIds")Set<String> issueIds);
}

37
epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java

@ -22,6 +22,7 @@ import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.redis.RedisUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.IssueConstant;
import com.epmet.dao.IssueVoteDetailDao;
import com.epmet.dto.IssueDTO;
import com.epmet.dto.form.CommonGridIdFormDTO;
import com.epmet.dto.form.VoteRedisFormDTO;
@ -29,14 +30,20 @@ import com.epmet.feign.ResiGroupFeignClient;
import com.epmet.service.IssueService;
import com.epmet.service.IssueVoteDetailService;
import com.epmet.utils.ModuleConstants;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static com.epmet.commons.tools.redis.RedisUtils.NOT_EXPIRE;
@ -59,13 +66,37 @@ public class IssueVoteDetailRedis {
@Autowired
private IssueService issueService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private IssueVoteDetailService issueVoteDetailService;
@Autowired
private IssueVoteDetailDao issueVoteDetailDao;
public void delete(Object[] ids) {
}
public void deleteBatch(List<String> issueIds){
if(CollectionUtils.isEmpty(issueIds)) return ;
Set<String> keys = issueIds.stream().map(id -> {
return IssueConstant.REDIS_KEY + id;
}).collect(Collectors.toSet());
redisTemplate.executePipelined((RedisCallback<String>) connection ->{
keys.forEach( ser -> {connection.del(redisTemplate.getKeySerializer().serialize(ser));});
return null;
});
}
public void delete(String issueId){
redisUtils.delete(IssueConstant.REDIS_KEY +issueId);
}
public void set(VoteRedisFormDTO vote){
@ -185,10 +216,8 @@ public class IssueVoteDetailRedis {
}
//如果缓存中没有,去表决详情中计算出实时数据,并放入缓存中
//无需查询issue_vote_statistical中的数据,因为不是实时数据,可能不准确,有定时任务会自动同步
VoteRedisFormDTO voteCache = new VoteRedisFormDTO();
voteCache.setIssueId(issueId);
voteCache.setSupportAmount(issueVoteDetailService.getVotingCount(issueId,IssueConstant.SUPPORT));
voteCache.setOppositionAmount(issueVoteDetailService.getVotingCount(issueId,IssueConstant.OPPOSE));
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();

82
epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteStatisticalServiceImpl.java

@ -63,7 +63,6 @@ import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 议题表决统计表
@ -256,6 +255,7 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
* @date 2020.05.21 09:07
**/
@Override
@Transactional(rollbackFor = Exception.class)
public void syncVotingCacheToDb() {
IssueDTO issueParam = new IssueDTO();
issueParam.setIssueStatus(ModuleConstants.ISSUE_STATUS_VOTING);
@ -267,14 +267,15 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
}
Set<String> ids = issues.stream().map(IssueDTO::getId).collect(Collectors.toSet());
List<String> gridIds = issues.stream().map(IssueDTO::getGridId).collect(Collectors.toList());
List<String> gridIds = issues.stream().map(IssueDTO::getGridId).distinct().collect(Collectors.toList());
CommonGridIdListFormDTO gridIdList = new CommonGridIdListFormDTO();
gridIdList.setGridIds(gridIds);
Result<GridVotableCountResultDTO> votableCountResult = resiGroupFeignClient.votableCounts(gridIdList);
Map<String,Integer> votableCountMap = null;
Map<String,Integer> votableCountMap1 = null;
if(votableCountResult.success() && null != votableCountResult.getData() && null != votableCountResult.getData().getVotableCountMap()){
votableCountMap = votableCountResult.getData().getVotableCountMap();
votableCountMap1 = votableCountResult.getData().getVotableCountMap();
}
final Map<String,Integer> votableCountMap = votableCountMap1;
List<IssueVoteStatisticalDTO> statisticalList =
baseDao.selectListByIds(ids);
@ -287,9 +288,8 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
notExistedIds.addAll(ids);
notExistedIds.removeAll(statisiticalIds);
//交集
Set<String> existedIds = new HashSet<>();
existedIds.addAll(ids);
existedIds.retainAll(statisiticalIds);
Set<String> existedIds = new HashSet<>(statisiticalIds);
//更新
//对ids进行更新 - 从缓存中拿取
List<IssueVoteStatisticalDTO> listToUpdate = new ArrayList<>();
@ -302,12 +302,42 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
baseDao.updateBatchByIssueId(listToUpdate);
if (notExistedIds.size() > NumConstant.ZERO) {
Map<String,String> issueGridMap = issues.stream().collect(Collectors.toMap(IssueDTO::getId,IssueDTO::getGridId,(o, n) -> o));
//新增
List<IssueVoteStatisticalDTO> toInsert = new ArrayList<>();
List<IssueVoteStatisticalDTO> toInsert = new LinkedList<>();
List<VoteRedisFormDTO> voteList = issueVoteDetailDao.selectBatchVoteCount(notExistedIds);
List<String> votedIssueIds = new ArrayList<>();
if(!CollectionUtils.isEmpty(voteList) && StringUtils.isNotBlank(voteList.get(NumConstant.ZERO).getIssueId())) {
toInsert = voteList.stream().map(o -> {
IssueVoteStatisticalDTO dto = new IssueVoteStatisticalDTO();
dto.setIssueId(o.getIssueId());
dto.setOppositionCount(o.getOppositionAmount());
dto.setSupportCount(o.getSupportAmount());
dto.setVotableCount(Optional.ofNullable(votableCountMap.get(issueGridMap.get(o.getIssueId()))).orElse(NumConstant.ZERO));
dto.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM);dto.setUpdatedBy(ModuleConstants.CREATED_BY_SYSTEM);
return dto;
}).collect(Collectors.toList());
votedIssueIds = voteList.stream().map(VoteRedisFormDTO::getIssueId).collect(Collectors.toList());
}
notExistedIds.removeAll(votedIssueIds);
if(!notExistedIds.isEmpty()){
List<IssueVoteStatisticalDTO> collect = notExistedIds.stream().map(issueId -> {
IssueVoteStatisticalDTO dto = new IssueVoteStatisticalDTO();
dto.setIssueId(issueId);
dto.setSupportCount(NumConstant.ZERO);
dto.setOppositionCount(NumConstant.ZERO);
dto.setVotableCount(Optional.ofNullable(votableCountMap.get(issueGridMap.get(issueId))).orElse(NumConstant.ZERO));
dto.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM);dto.setUpdatedBy(ModuleConstants.CREATED_BY_SYSTEM);
return dto;
}).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(collect)) toInsert.addAll(collect);}
List<IssueAttitudeCountResultDTO> summaryList = issueVoteDetailDao.getVotingSummaryList(ids);
/*
List<IssueAttitudeCountResultDTO> summaryList = issueVoteDetailDao.getVotingSummaryList(notExistedIds);
Map<String, List<IssueAttitudeCountResultDTO>> summaryMap =
summaryList.stream().collect(Collectors.groupingBy(IssueAttitudeCountResultDTO::getIssueId));
for (Map.Entry<String, List<IssueAttitudeCountResultDTO>> entry : summaryMap.entrySet()) {
IssueVoteStatisticalDTO obj = new IssueVoteStatisticalDTO();
obj.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM);
@ -322,19 +352,15 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
}
});
} else {
if (StringUtils.equals(ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT, v.get(0).getAttitude())) {
obj.setSupportCount(v.get(0).getCount());
obj.setOppositionCount(NumConstant.ZERO);
} else {
obj.setOppositionCount(v.get(0).getCount());
obj.setSupportCount(NumConstant.ZERO);
}
}
obj.setVotableCount(Optional.ofNullable(votableCountMap.get(issueGridMap.get(entry.getKey()))).orElse(NumConstant.ZERO));
toInsert.add(obj);
}
Set<String> setToInsert = toInsert.stream().map(IssueVoteStatisticalDTO::getIssueId).collect(Collectors.toSet());
*/
/* Set<String> setToInsert = toInsert.stream().map(IssueVoteStatisticalDTO::getIssueId).collect(Collectors.toSet());
Set<String> issuesNeverVotedIds = new HashSet<String>();
issuesNeverVotedIds.addAll(ids);
@ -372,30 +398,27 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
);
}
}
}
}*/
if(!toInsert.isEmpty())
// 批量插入
baseDao.insertBatch(summary);
}
baseDao.insertBatch(toInsert);
}
else if (ids.size() < statisiticalIds.size()) {
//}
//else if (ids.size() < statisiticalIds.size()) {
//统计数大于议题数,数据出错
//找出多余数据,删除
//差集
Set<String> redundantIds = new HashSet<String>();
redundantIds.addAll(statisiticalIds);
redundantIds.removeAll(ids);
//Set<String> redundantIds = new HashSet<String>();
//redundantIds.addAll(statisiticalIds);
//redundantIds.removeAll(ids);
//将redundantIds的议题统计信息删除
//因为statisiticalIds是通过ids查询出,因此不会出现这种情况
} else {
//数据吻合,全部更新
List<IssueVoteStatisticalDTO> listToUpdate = new ArrayList<>();
Map<String,List<IssueDTO>> gridIssueMap =
issues.stream().collect(Collectors.groupingBy(IssueDTO::getGridId));
setVotableCountsAndUpdateCache(listToUpdate,issues,votableCountMap);
// listToUpdate批量更新
@ -518,8 +541,7 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
IssueVoteStatisticalDTO vote = new IssueVoteStatisticalDTO();
vote.setIssueId(issue.getId());
VoteRedisFormDTO cache = issueVoteDetailRedis.getVoteStatistical(issue.getId());
if(null == cache)
continue;
if(null == cache) continue;
if(StringUtils.isBlank(cache.getIssueId())) cache.setIssueId(issue.getId());
vote.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM);
vote.setUpdatedBy(ModuleConstants.CREATED_BY_SYSTEM);

36
epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteDetailDao.xml

@ -67,6 +67,9 @@
ISSUE_VOTE_DETAIL
WHERE
del_flag = '0'
<foreach collection="ids" item="issueId" open="AND (" separator=" or " close=" )">
issue_id = #{issueId}
</foreach>
GROUP BY
issue_id,
attitude
@ -119,4 +122,37 @@
AND ivd.ISSUE_ID =#{issueId}
AND ivd.CREATED_BY =#{userId}
</select>
<select id="selectInfo4Cache" resultType="com.epmet.dto.form.VoteRedisFormDTO">
SELECT
issue_id,
count( ATTITUDE = 'opposition' OR NULL ) AS oppositionAmount,
count( ATTITUDE = 'support' OR NULL ) AS supportAmount,
0 as shouldVoteCount
FROM
`issue_vote_detail`
WHERE
del_flag = '0' and
issue_id = #{issueId}
</select>
<select id="selectBatchVoteCount" resultType="com.epmet.dto.form.VoteRedisFormDTO">
SELECT
issue_id,
count( ATTITUDE = 'opposition' OR NULL ) AS oppositionAmount,
count( ATTITUDE = 'support' OR NULL ) AS supportAmount,
0 as shouldVoteCount
FROM
`issue_vote_detail`
WHERE
del_flag = '0'
<foreach collection="issueIds" item="issueId" open="AND (" separator=" or " close=" )">
issue_id = #{issueId}
</foreach>
</select>
</mapper>
Loading…
Cancel
Save