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. 86
      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.commons.mybatis.dao.BaseDao;
import com.epmet.dto.IssueVoteDetailDTO; import com.epmet.dto.IssueVoteDetailDTO;
import com.epmet.dto.form.VoteFormDTO; import com.epmet.dto.form.VoteFormDTO;
import com.epmet.dto.form.VoteRedisFormDTO;
import com.epmet.dto.result.IssueAttitudeCountResultDTO; import com.epmet.dto.result.IssueAttitudeCountResultDTO;
import com.epmet.dto.result.MyPartIssuesResultDTO; import com.epmet.dto.result.MyPartIssuesResultDTO;
import com.epmet.entity.IssueVoteDetailEntity; import com.epmet.entity.IssueVoteDetailEntity;
@ -95,4 +96,21 @@ public interface IssueVoteDetailDao extends BaseDao<IssueVoteDetailEntity> {
* @Date 2020/11/18 14:35 * @Date 2020/11/18 14:35
**/ **/
IssueVoteDetailDTO selectUserIssueDet(@Param("userId") String userId, @Param("issueId") String issueId); 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.redis.RedisUtils;
import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.IssueConstant; import com.epmet.constant.IssueConstant;
import com.epmet.dao.IssueVoteDetailDao;
import com.epmet.dto.IssueDTO; import com.epmet.dto.IssueDTO;
import com.epmet.dto.form.CommonGridIdFormDTO; import com.epmet.dto.form.CommonGridIdFormDTO;
import com.epmet.dto.form.VoteRedisFormDTO; import com.epmet.dto.form.VoteRedisFormDTO;
@ -29,14 +30,20 @@ import com.epmet.feign.ResiGroupFeignClient;
import com.epmet.service.IssueService; import com.epmet.service.IssueService;
import com.epmet.service.IssueVoteDetailService; import com.epmet.service.IssueVoteDetailService;
import com.epmet.utils.ModuleConstants; import com.epmet.utils.ModuleConstants;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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 org.springframework.stereotype.Component;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static com.epmet.commons.tools.redis.RedisUtils.NOT_EXPIRE; import static com.epmet.commons.tools.redis.RedisUtils.NOT_EXPIRE;
@ -59,13 +66,37 @@ public class IssueVoteDetailRedis {
@Autowired @Autowired
private IssueService issueService; private IssueService issueService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired @Autowired
private IssueVoteDetailService issueVoteDetailService; private IssueVoteDetailService issueVoteDetailService;
@Autowired
private IssueVoteDetailDao issueVoteDetailDao;
public void delete(Object[] ids) { 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){ public void set(VoteRedisFormDTO vote){
@ -185,10 +216,8 @@ public class IssueVoteDetailRedis {
} }
//如果缓存中没有,去表决详情中计算出实时数据,并放入缓存中 //如果缓存中没有,去表决详情中计算出实时数据,并放入缓存中
//无需查询issue_vote_statistical中的数据,因为不是实时数据,可能不准确,有定时任务会自动同步 //无需查询issue_vote_statistical中的数据,因为不是实时数据,可能不准确,有定时任务会自动同步
VoteRedisFormDTO voteCache = new VoteRedisFormDTO(); VoteRedisFormDTO voteCache = issueVoteDetailDao.selectInfo4Cache(issueId);
voteCache.setIssueId(issueId); if(StringUtils.isBlank(voteCache.getIssueId())) voteCache.setIssueId(issueId);
voteCache.setSupportAmount(issueVoteDetailService.getVotingCount(issueId,IssueConstant.SUPPORT));
voteCache.setOppositionAmount(issueVoteDetailService.getVotingCount(issueId,IssueConstant.OPPOSE));
IssueDTO issue = issueService.get(issueId); IssueDTO issue = issueService.get(issueId);
if(null != issue){ if(null != issue){
CommonGridIdFormDTO gridId = new CommonGridIdFormDTO(); CommonGridIdFormDTO gridId = new CommonGridIdFormDTO();

86
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.time.ZoneOffset;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; 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 * @date 2020.05.21 09:07
**/ **/
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void syncVotingCacheToDb() { public void syncVotingCacheToDb() {
IssueDTO issueParam = new IssueDTO(); IssueDTO issueParam = new IssueDTO();
issueParam.setIssueStatus(ModuleConstants.ISSUE_STATUS_VOTING); 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()); 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(); CommonGridIdListFormDTO gridIdList = new CommonGridIdListFormDTO();
gridIdList.setGridIds(gridIds); gridIdList.setGridIds(gridIds);
Result<GridVotableCountResultDTO> votableCountResult = resiGroupFeignClient.votableCounts(gridIdList); 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()){ 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 = List<IssueVoteStatisticalDTO> statisticalList =
baseDao.selectListByIds(ids); baseDao.selectListByIds(ids);
@ -287,9 +288,8 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
notExistedIds.addAll(ids); notExistedIds.addAll(ids);
notExistedIds.removeAll(statisiticalIds); notExistedIds.removeAll(statisiticalIds);
//交集 //交集
Set<String> existedIds = new HashSet<>(); Set<String> existedIds = new HashSet<>(statisiticalIds);
existedIds.addAll(ids);
existedIds.retainAll(statisiticalIds);
//更新 //更新
//对ids进行更新 - 从缓存中拿取 //对ids进行更新 - 从缓存中拿取
List<IssueVoteStatisticalDTO> listToUpdate = new ArrayList<>(); List<IssueVoteStatisticalDTO> listToUpdate = new ArrayList<>();
@ -302,12 +302,42 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
baseDao.updateBatchByIssueId(listToUpdate); baseDao.updateBatchByIssueId(listToUpdate);
if (notExistedIds.size() > NumConstant.ZERO) { 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());
}
List<IssueAttitudeCountResultDTO> summaryList = issueVoteDetailDao.getVotingSummaryList(ids); 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(notExistedIds);
Map<String, List<IssueAttitudeCountResultDTO>> summaryMap = Map<String, List<IssueAttitudeCountResultDTO>> summaryMap =
summaryList.stream().collect(Collectors.groupingBy(IssueAttitudeCountResultDTO::getIssueId)); summaryList.stream().collect(Collectors.groupingBy(IssueAttitudeCountResultDTO::getIssueId));
for (Map.Entry<String, List<IssueAttitudeCountResultDTO>> entry : summaryMap.entrySet()) { for (Map.Entry<String, List<IssueAttitudeCountResultDTO>> entry : summaryMap.entrySet()) {
IssueVoteStatisticalDTO obj = new IssueVoteStatisticalDTO(); IssueVoteStatisticalDTO obj = new IssueVoteStatisticalDTO();
obj.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM); obj.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM);
@ -322,19 +352,15 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
} }
}); });
} else { } else {
obj.setOppositionCount(NumConstant.ZERO);
if (StringUtils.equals(ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT, v.get(0).getAttitude())) { obj.setSupportCount(NumConstant.ZERO);
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); 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>(); Set<String> issuesNeverVotedIds = new HashSet<String>();
issuesNeverVotedIds.addAll(ids); 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>(); //Set<String> redundantIds = new HashSet<String>();
redundantIds.addAll(statisiticalIds); //redundantIds.addAll(statisiticalIds);
redundantIds.removeAll(ids); //redundantIds.removeAll(ids);
//将redundantIds的议题统计信息删除 //将redundantIds的议题统计信息删除
//因为statisiticalIds是通过ids查询出,因此不会出现这种情况 //因为statisiticalIds是通过ids查询出,因此不会出现这种情况
} else { } else {
//数据吻合,全部更新 //数据吻合,全部更新
List<IssueVoteStatisticalDTO> listToUpdate = new ArrayList<>(); List<IssueVoteStatisticalDTO> listToUpdate = new ArrayList<>();
Map<String,List<IssueDTO>> gridIssueMap =
issues.stream().collect(Collectors.groupingBy(IssueDTO::getGridId));
setVotableCountsAndUpdateCache(listToUpdate,issues,votableCountMap); setVotableCountsAndUpdateCache(listToUpdate,issues,votableCountMap);
// listToUpdate批量更新 // listToUpdate批量更新
@ -518,8 +541,7 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
IssueVoteStatisticalDTO vote = new IssueVoteStatisticalDTO(); IssueVoteStatisticalDTO vote = new IssueVoteStatisticalDTO();
vote.setIssueId(issue.getId()); vote.setIssueId(issue.getId());
VoteRedisFormDTO cache = issueVoteDetailRedis.getVoteStatistical(issue.getId()); VoteRedisFormDTO cache = issueVoteDetailRedis.getVoteStatistical(issue.getId());
if(null == cache) if(null == cache) continue;
continue;
if(StringUtils.isBlank(cache.getIssueId())) cache.setIssueId(issue.getId()); if(StringUtils.isBlank(cache.getIssueId())) cache.setIssueId(issue.getId());
vote.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM); vote.setCreatedBy(ModuleConstants.CREATED_BY_SYSTEM);
vote.setUpdatedBy(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 ISSUE_VOTE_DETAIL
WHERE WHERE
del_flag = '0' del_flag = '0'
<foreach collection="ids" item="issueId" open="AND (" separator=" or " close=" )">
issue_id = #{issueId}
</foreach>
GROUP BY GROUP BY
issue_id, issue_id,
attitude attitude
@ -119,4 +122,37 @@
AND ivd.ISSUE_ID =#{issueId} AND ivd.ISSUE_ID =#{issueId}
AND ivd.CREATED_BY =#{userId} AND ivd.CREATED_BY =#{userId}
</select> </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> </mapper>
Loading…
Cancel
Save