Browse Source

每小时将议题表决数字从缓存同步到db逻辑修改

dev_shibei_match
wangchao 5 years ago
parent
commit
a6cb06aae6
  1. 10
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueVoteDetailDao.java
  2. 24
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueVoteDetailRedis.java
  3. 43
      epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueVoteStatisticalServiceImpl.java
  4. 14
      epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueVoteDetailDao.xml

10
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,13 @@ 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);
} }

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

@ -29,14 +29,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,6 +65,9 @@ public class IssueVoteDetailRedis {
@Autowired @Autowired
private IssueService issueService; private IssueService issueService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired @Autowired
private IssueVoteDetailService issueVoteDetailService; private IssueVoteDetailService issueVoteDetailService;
@ -66,7 +75,22 @@ public class IssueVoteDetailRedis {
} }
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){
String key = IssueConstant.REDIS_KEY +vote.getIssueId(); String key = IssueConstant.REDIS_KEY +vote.getIssueId();

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

@ -267,7 +267,7 @@ 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);
@ -287,9 +287,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<>();
@ -304,8 +303,8 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
if (notExistedIds.size() > NumConstant.ZERO) { if (notExistedIds.size() > NumConstant.ZERO) {
//新增 //新增
List<IssueVoteStatisticalDTO> toInsert = new ArrayList<>(); List<IssueVoteStatisticalDTO> toInsert = new ArrayList<>();
Map<String,String> issueGridMap = issues.stream().collect(Collectors.toMap(IssueDTO::getId,IssueDTO::getGridId,(o, n) -> o));
List<IssueAttitudeCountResultDTO> summaryList = issueVoteDetailDao.getVotingSummaryList(ids); 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()) {
@ -322,19 +321,15 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
} }
}); });
} else { } else {
if (StringUtils.equals(ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT, v.get(0).getAttitude())) {
obj.setSupportCount(v.get(0).getCount());
obj.setOppositionCount(NumConstant.ZERO); obj.setOppositionCount(NumConstant.ZERO);
} else {
obj.setOppositionCount(v.get(0).getCount());
obj.setSupportCount(NumConstant.ZERO); 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 +367,27 @@ public class IssueVoteStatisticalServiceImpl extends BaseServiceImpl<IssueVoteSt
); );
} }
} }
} }*/
// 批量插入 // 批量插入
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批量更新
@ -517,9 +509,8 @@ 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 = Optional.ofNullable(issueVoteDetailRedis.getVoteStatistical(issue.getId())).orElse(issueVoteDetailDao.selectInfo4Cache(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);

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

@ -119,4 +119,18 @@
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
issue_id = #{issueId}
</select>
</mapper> </mapper>
Loading…
Cancel
Save