|
@ -20,23 +20,27 @@ package com.epmet.service.impl; |
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; |
|
|
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; |
|
|
|
|
|
import com.epmet.commons.tools.constant.NumConstant; |
|
|
import com.epmet.commons.tools.page.PageData; |
|
|
import com.epmet.commons.tools.page.PageData; |
|
|
import com.epmet.commons.tools.utils.ConvertUtils; |
|
|
import com.epmet.commons.tools.utils.ConvertUtils; |
|
|
import com.epmet.commons.tools.constant.FieldConstant; |
|
|
import com.epmet.commons.tools.constant.FieldConstant; |
|
|
|
|
|
import com.epmet.dao.IssueVoteDetailDao; |
|
|
import com.epmet.dao.IssueVoteStatisticalDailyDao; |
|
|
import com.epmet.dao.IssueVoteStatisticalDailyDao; |
|
|
import com.epmet.dto.IssueVoteStatisticalDailyDTO; |
|
|
import com.epmet.dto.IssueVoteStatisticalDailyDTO; |
|
|
import com.epmet.dto.result.IssuesToBeCountedResultDTO; |
|
|
import com.epmet.dto.result.IssuesToBeCountedResultDTO; |
|
|
import com.epmet.entity.IssueVoteStatisticalDailyEntity; |
|
|
import com.epmet.entity.IssueVoteStatisticalDailyEntity; |
|
|
import com.epmet.redis.IssueVoteStatisticalDailyRedis; |
|
|
import com.epmet.redis.IssueVoteStatisticalDailyRedis; |
|
|
import com.epmet.service.IssueVoteStatisticalDailyService; |
|
|
import com.epmet.service.IssueVoteStatisticalDailyService; |
|
|
|
|
|
import com.epmet.utils.ModuleConstants; |
|
|
|
|
|
import oracle.sql.NUMBER; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
|
import org.slf4j.Logger; |
|
|
|
|
|
import org.slf4j.LoggerFactory; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
import java.util.Arrays; |
|
|
import java.util.*; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.Map; |
|
|
|
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -51,6 +55,11 @@ public class IssueVoteStatisticalDailyServiceImpl extends BaseServiceImpl<IssueV |
|
|
@Autowired |
|
|
@Autowired |
|
|
private IssueVoteStatisticalDailyRedis issueVoteStatisticalDailyRedis; |
|
|
private IssueVoteStatisticalDailyRedis issueVoteStatisticalDailyRedis; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private IssueVoteDetailDao issueVoteDetailDao; |
|
|
|
|
|
|
|
|
|
|
|
protected static final Logger logger = LoggerFactory.getLogger(IssueVoteStatisticalDailyServiceImpl.class); |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public PageData<IssueVoteStatisticalDailyDTO> page(Map<String, Object> params) { |
|
|
public PageData<IssueVoteStatisticalDailyDTO> page(Map<String, Object> params) { |
|
|
IPage<IssueVoteStatisticalDailyEntity> page = baseDao.selectPage( |
|
|
IPage<IssueVoteStatisticalDailyEntity> page = baseDao.selectPage( |
|
@ -72,7 +81,9 @@ public class IssueVoteStatisticalDailyServiceImpl extends BaseServiceImpl<IssueV |
|
|
|
|
|
|
|
|
QueryWrapper<IssueVoteStatisticalDailyEntity> wrapper = new QueryWrapper<>(); |
|
|
QueryWrapper<IssueVoteStatisticalDailyEntity> wrapper = new QueryWrapper<>(); |
|
|
wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); |
|
|
wrapper.eq(StringUtils.isNotBlank(id), FieldConstant.ID, id); |
|
|
|
|
|
wrapper.eq(FieldConstant.DEL_FLAG,NumConstant.ZERO_STR); |
|
|
|
|
|
wrapper.eq(StringUtils.isNotBlank((String)params.get(ModuleConstants.FIELD_JAVA_ISSUE_ID)), ModuleConstants.FIELD_SQL_ISSUE_ID,params.get(ModuleConstants.FIELD_JAVA_ISSUE_ID)); |
|
|
|
|
|
wrapper.eq(null == params.get(ModuleConstants.FIELD_JAVA_STATISTICAL_DATE),ModuleConstants.FIELD_SQL_STATISTICAL_DATE,params.get(ModuleConstants.FIELD_JAVA_STATISTICAL_DATE)); |
|
|
return wrapper; |
|
|
return wrapper; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -111,24 +122,182 @@ public class IssueVoteStatisticalDailyServiceImpl extends BaseServiceImpl<IssueV |
|
|
* @date 2020.05.19 09:23 |
|
|
* @date 2020.05.19 09:23 |
|
|
**/ |
|
|
**/ |
|
|
@Override |
|
|
@Override |
|
|
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
public void countVotingDailyStatistic() { |
|
|
public void countVotingDailyStatistic() { |
|
|
|
|
|
//昨天的日期
|
|
|
|
|
|
Date yesterday = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); |
|
|
|
|
|
|
|
|
|
|
|
//昨天一日的统计List
|
|
|
List<IssuesToBeCountedResultDTO> issueStatisticalList = baseDao.getIssueVotingStatistical(); |
|
|
List<IssuesToBeCountedResultDTO> issueStatisticalList = baseDao.getIssueVotingStatistical(); |
|
|
Map<String,List<IssuesToBeCountedResultDTO>> issueStatisticalMap = |
|
|
Map<String,List<IssuesToBeCountedResultDTO>> issueStatisticalMap = |
|
|
issueStatisticalList.stream().collect(Collectors.groupingBy(IssuesToBeCountedResultDTO::getIssueId)); |
|
|
issueStatisticalList.stream().collect(Collectors.groupingBy(IssuesToBeCountedResultDTO::getIssueId)); |
|
|
|
|
|
//截至到昨天的统计List
|
|
|
List<IssuesToBeCountedResultDTO> issueStatisticalListUpToYes = baseDao.getIssueVotingStatisticalUpToYesterday(); |
|
|
List<IssuesToBeCountedResultDTO> issueStatisticalListUpToYes = baseDao.getIssueVotingStatisticalUpToYesterday(); |
|
|
Map<String,List<IssuesToBeCountedResultDTO>> issueStatisticalMapUpTpYes = |
|
|
Map<String,List<IssuesToBeCountedResultDTO>> issueStatisticalMapUpToYes = |
|
|
issueStatisticalListUpToYes.stream().collect(Collectors.groupingBy(IssuesToBeCountedResultDTO::getIssueId)); |
|
|
issueStatisticalListUpToYes.stream().collect(Collectors.groupingBy(IssuesToBeCountedResultDTO::getIssueId)); |
|
|
|
|
|
//日统计信息会出现若统计日内无人点“同意”或者“反对”,则返回列表中只有表决的单方面数据,未被选举的数据没有,因此需要截至当日的统计列表
|
|
|
|
|
|
//如果当日无人进行表决而昨日之前有表决,此时会返回一条议题记录,attitude为null,attitudeUpToYesterday不为null
|
|
|
|
|
|
//若昨日以及昨日之前都无人表决,此时attitude为null,attitudeUpToYesterday也为null
|
|
|
|
|
|
List<IssueVoteStatisticalDailyEntity> dailyListToInsert = new LinkedList<>(); |
|
|
|
|
|
List<IssueVoteStatisticalDailyEntity> dailyListToUpdate = new LinkedList<>(); |
|
|
issueStatisticalMap.forEach((key,value) -> { |
|
|
issueStatisticalMap.forEach((key,value) -> { |
|
|
|
|
|
//key为议题Id
|
|
|
|
|
|
//当List不为空时
|
|
|
|
|
|
if(null != value && value.size() > NumConstant.ZERO){ |
|
|
|
|
|
IssueVoteStatisticalDailyEntity dailyStatisticalToInsert = new IssueVoteStatisticalDailyEntity(); |
|
|
|
|
|
dailyStatisticalToInsert.setIssueId(key); |
|
|
|
|
|
dailyStatisticalToInsert.setStatisticalDate(yesterday); |
|
|
|
|
|
dailyStatisticalToInsert.setCreatedBy(ModuleConstants.CREATED_OR_UPDATED_BY_SYSTEM); |
|
|
|
|
|
//此列无意义,统一存0
|
|
|
|
|
|
dailyStatisticalToInsert.setVotableCount(NumConstant.ZERO); |
|
|
|
|
|
|
|
|
}); |
|
|
IssueVoteStatisticalDailyEntity dailyStatisticalToUpdate = new IssueVoteStatisticalDailyEntity(); |
|
|
|
|
|
dailyStatisticalToUpdate.setIssueId(key); |
|
|
|
|
|
dailyStatisticalToUpdate.setStatisticalDate(yesterday); |
|
|
|
|
|
dailyStatisticalToUpdate.setUpdatedBy(ModuleConstants.CREATED_OR_UPDATED_BY_SYSTEM); |
|
|
|
|
|
//判断数据库中是否有此数据
|
|
|
|
|
|
IssueVoteStatisticalDailyEntity |
|
|
|
|
|
existedInfo = |
|
|
|
|
|
baseDao.getDailyStatisticalCountByIssueIdAndStatisticalDate(dailyStatisticalToUpdate); |
|
|
|
|
|
|
|
|
|
|
|
for(IssuesToBeCountedResultDTO o : value){ |
|
|
|
|
|
//o的attitudeUpToYesterday有三种值:opposition 、 support 、 null
|
|
|
|
|
|
//当o的attitudeUpToYesterday为null时,List中只有一条
|
|
|
|
|
|
//当o的attitudeUpToYesterday不为null时,List中可能存在一条或者两条
|
|
|
|
|
|
if(null != existedInfo){ |
|
|
|
|
|
//数据库中已有此记录 - update
|
|
|
|
|
|
dailyStatisticalToUpdate.setId(existedInfo.getId()); |
|
|
|
|
|
if(StringUtils.isBlank(o.getAttitudeUpToYesterday())){ |
|
|
|
|
|
//昨日无人表决,昨日之前也无人表决
|
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionCount(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportCount(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToUpdate.setTotalCount(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionIncrement(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportIncrement(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToUpdate.setTodayIncrement(NumConstant.ZERO); |
|
|
|
|
|
}else if(StringUtils.equals(o.getAttitudeUpToYesterday(),ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT)){ |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportCount(o.getVoteCountUpToYesterday()); |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportIncrement(o.getVoteCount()); |
|
|
|
|
|
}else if(StringUtils.equals(o.getAttitudeUpToYesterday(),ModuleConstants.ISSUE_VOTING_ATTITUDE_OPPOSITION)){ |
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionCount(o.getVoteCountUpToYesterday()); |
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionIncrement(o.getVoteCount()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
//数据库中没有此纪录 - insert
|
|
|
|
|
|
if(StringUtils.isBlank(o.getAttitudeUpToYesterday())){ |
|
|
|
|
|
//昨日无人表决,昨日之前也无人表决
|
|
|
|
|
|
dailyStatisticalToInsert.setOppositionCount(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToInsert.setSupportCount(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToInsert.setTotalCount(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToInsert.setOppositionIncrement(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToInsert.setSupportIncrement(NumConstant.ZERO); |
|
|
|
|
|
dailyStatisticalToInsert.setTodayIncrement(NumConstant.ZERO); |
|
|
|
|
|
}else if(StringUtils.equals(o.getAttitudeUpToYesterday(),ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT)){ |
|
|
|
|
|
dailyStatisticalToInsert.setSupportCount(o.getVoteCountUpToYesterday()); |
|
|
|
|
|
dailyStatisticalToInsert.setSupportIncrement(o.getVoteCount()); |
|
|
|
|
|
}else if(StringUtils.equals(o.getAttitudeUpToYesterday(),ModuleConstants.ISSUE_VOTING_ATTITUDE_OPPOSITION)){ |
|
|
|
|
|
dailyStatisticalToInsert.setOppositionCount(o.getVoteCountUpToYesterday()); |
|
|
|
|
|
dailyStatisticalToInsert.setOppositionIncrement(o.getVoteCount()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
//遍历完List之后,检查是否有因为昨日未表决过某钟态度而漏掉昨日之前的表决信息
|
|
|
|
|
|
if(null != existedInfo){ |
|
|
|
|
|
if(null == dailyStatisticalToUpdate.getOppositionCount()){ |
|
|
|
|
|
//昨日无人反对该议题
|
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionIncrement(NumConstant.ZERO); |
|
|
|
|
|
if(null != issueStatisticalMapUpToYes.get(key)){ |
|
|
|
|
|
Optional<IssuesToBeCountedResultDTO> first = |
|
|
|
|
|
issueStatisticalMapUpToYes.get(key).stream().filter( |
|
|
|
|
|
obj -> ModuleConstants.ISSUE_VOTING_ATTITUDE_OPPOSITION.equals(obj.getAttitude())).findFirst(); |
|
|
|
|
|
if(first.isPresent()){ |
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionCount(first.get().getVoteCountUpToYesterday()); |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToUpdate.setOppositionCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
}else if(null == dailyStatisticalToUpdate.getSupportCount()){ |
|
|
|
|
|
//昨日无人赞同该议题
|
|
|
|
|
|
dailyStatisticalToUpdate.setSupportIncrement(NumConstant.ZERO); |
|
|
|
|
|
if(null != issueStatisticalMapUpToYes.get(key)){ |
|
|
|
|
|
Optional<IssuesToBeCountedResultDTO> first = |
|
|
|
|
|
issueStatisticalMapUpToYes.get(key).stream().filter( |
|
|
|
|
|
obj -> ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT.equals(obj.getAttitude())).findFirst(); |
|
|
|
|
|
if(first.isPresent()){ |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportCount(first.get().getVoteCountUpToYesterday()); |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToUpdate.setSupportCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//不会同时出现oppositionCount与supportCount同时为null的现象
|
|
|
|
|
|
//因为这表示该议题从未被表决过,已经在上方逻辑进行处理
|
|
|
|
|
|
dailyStatisticalToUpdate.setTotalCount(dailyStatisticalToUpdate.getOppositionCount() + dailyStatisticalToUpdate.getSupportCount()); |
|
|
|
|
|
dailyStatisticalToUpdate.setTodayIncrement(dailyStatisticalToUpdate.getOppositionIncrement() + dailyStatisticalToUpdate.getSupportIncrement()); |
|
|
|
|
|
|
|
|
|
|
|
dailyListToUpdate.add(dailyStatisticalToUpdate); |
|
|
|
|
|
}else{ |
|
|
|
|
|
if(null == dailyStatisticalToInsert.getOppositionCount()){ |
|
|
|
|
|
//昨日无人反对该议题
|
|
|
|
|
|
dailyStatisticalToInsert.setOppositionIncrement(NumConstant.ZERO); |
|
|
|
|
|
if(null != issueStatisticalMapUpToYes.get(key)){ |
|
|
|
|
|
Optional<IssuesToBeCountedResultDTO> first = |
|
|
|
|
|
issueStatisticalMapUpToYes.get(key).stream().filter( |
|
|
|
|
|
obj -> ModuleConstants.ISSUE_VOTING_ATTITUDE_OPPOSITION.equals(obj.getAttitude())).findFirst(); |
|
|
|
|
|
if(first.isPresent()){ |
|
|
|
|
|
dailyStatisticalToInsert.setOppositionCount(first.get().getVoteCountUpToYesterday()); |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToInsert.setOppositionCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToInsert.setOppositionCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
}else if(null == dailyStatisticalToInsert.getSupportCount()){ |
|
|
|
|
|
//昨日无人赞同该议题
|
|
|
|
|
|
dailyStatisticalToInsert.setSupportIncrement(NumConstant.ZERO); |
|
|
|
|
|
if(null != issueStatisticalMapUpToYes.get(key)){ |
|
|
|
|
|
Optional<IssuesToBeCountedResultDTO> first = |
|
|
|
|
|
issueStatisticalMapUpToYes.get(key).stream().filter( |
|
|
|
|
|
obj -> ModuleConstants.ISSUE_VOTING_ATTITUDE_SUPPORT.equals(obj.getAttitude())).findFirst(); |
|
|
|
|
|
if(first.isPresent()){ |
|
|
|
|
|
dailyStatisticalToInsert.setSupportCount(first.get().getVoteCountUpToYesterday()); |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToInsert.setSupportCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
dailyStatisticalToInsert.setSupportCount(NumConstant.ZERO); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
//不会同时出现oppositionCount与supportCount同时为null的现象
|
|
|
|
|
|
//因为这表示该议题从未被表决过,已经在上方逻辑进行处理
|
|
|
|
|
|
|
|
|
//1.获取所有表决中的议题以及在昨日表决截至的议题,将昨日新生成的议题单独拿出来
|
|
|
dailyStatisticalToInsert.setTotalCount(dailyStatisticalToInsert.getOppositionCount() + dailyStatisticalToInsert.getSupportCount()); |
|
|
|
|
|
dailyStatisticalToInsert.setTodayIncrement(dailyStatisticalToInsert.getOppositionIncrement() + dailyStatisticalToInsert.getSupportIncrement()); |
|
|
|
|
|
|
|
|
//2.对每一个表决中的议题校验有没有生成过前一天的统计数据,如果生成过则跳过次议题
|
|
|
dailyListToInsert.add(dailyStatisticalToInsert); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//3.如果没有生成过,取前一天的日统计信息与缓存中的表决数进行对比生成昨日数据(非昨日新生成议题)
|
|
|
}else{ |
|
|
|
|
|
//当List为空时
|
|
|
|
|
|
//不会出现List为空的现象
|
|
|
|
|
|
logger.warn(String.format("遍历issueStatisticalMap时候出现List为空现象,issueId:【%s】",key)); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
if(dailyListToInsert.size() > NumConstant.ZERO){ |
|
|
|
|
|
baseDao.insertBatch(dailyListToInsert); |
|
|
|
|
|
} |
|
|
|
|
|
if(dailyListToUpdate.size() > NumConstant.ZERO){ |
|
|
|
|
|
baseDao.updateBatch(dailyListToUpdate); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//4.获取人员投票详情对昨日的count数(昨日新生成议题,保证数据的准确性)
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |