package com.ruoyi.doublePrevention.service.impl;
|
|
import com.ruoyi.doublePrevention.entity.DoublePreventDept;
|
import com.ruoyi.doublePrevention.entity.SPI.*;
|
import com.ruoyi.doublePrevention.entity.dto.DataCountDangerLevelRectifiedRespDO;
|
import com.ruoyi.doublePrevention.entity.dto.DataCountDangerLevelRespDO;
|
import com.ruoyi.doublePrevention.entity.dto.DataCountDangerResultRespDO;
|
import com.ruoyi.doublePrevention.entity.dto.req.SPIDataCountReqDTO;
|
import com.ruoyi.doublePrevention.entity.dto.resp.SPIDataCountRespDTO;
|
import com.ruoyi.doublePrevention.enums.CountContentEnum;
|
import com.ruoyi.doublePrevention.repository.param.DataCountStartAndEndTimeParams;
|
import com.ruoyi.doublePrevention.service.SPIDataCountService;
|
import com.ruoyi.doublePrevention.service.baseService.DoublePreventionDeptService;
|
import com.ruoyi.doublePrevention.service.baseService.PreventRiskDangerInfoService;
|
import com.ruoyi.doublePrevention.service.baseService.TrHiddenDangerCheckPointService;
|
import com.ruoyi.doublePrevention.vo.ResultVO;
|
import org.apache.commons.lang3.ObjectUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.CollectionUtils;
|
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.Period;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
@Service("SPIDataCountService")
|
public class SPIDataCountServiceImpl implements SPIDataCountService {
|
|
|
@Autowired
|
private RedisTemplate redisTemplate;
|
|
@Autowired
|
private DoublePreventionDeptService doublePreventionDeptService;
|
|
@Autowired
|
private PreventRiskDangerInfoService preventRiskDangerInfoService;
|
|
@Autowired
|
private TrHiddenDangerCheckPointService checkPointService;
|
|
|
/**
|
* 数据统计-隐患数据统计-根据月或者年
|
*/
|
@Override
|
public ResultVO<SPIDataCountRespDTO> listDangerResultCountByMonthOrYear(SPIDataCountReqDTO spiDataCountReqDTO) {
|
ResultVO<SPIDataCountRespDTO> parameterVerificationResult = parameterVerification(spiDataCountReqDTO);
|
if ("400".equals(parameterVerificationResult.getCode())){
|
return parameterVerificationResult;
|
}
|
Integer month = spiDataCountReqDTO.getMonth();
|
Integer year = spiDataCountReqDTO.getYear();
|
|
Long depId = spiDataCountReqDTO.getDepId();
|
//获取部门信息
|
DoublePreventDept depInfoByDepId = doublePreventionDeptService.getDepInfoByDepId(depId);
|
//获取部门及所有子部门信息
|
//祖级列表
|
String ancestors = depInfoByDepId.getAncestors();
|
ancestors = ancestors + ",";
|
List<Long> depIds = doublePreventionDeptService.listDepAndSubDepIds(ancestors);
|
depIds.add(depId);
|
if (CollectionUtils.isEmpty(depIds)){
|
throw new RuntimeException("部门不存在");
|
}
|
|
DataCountDangerResultRespDO resultCountByTime = null;
|
DataCountDangerLevelRespDO levelCountByTime = null;
|
DataCountDangerLevelRectifiedRespDO levelRectifiedCountByTime = null;
|
|
String SPIDataCountKey = "SPI_PREVENT_RISK_";
|
//判断month是否null
|
Calendar calendar = Calendar.getInstance();
|
int currentYear = calendar.get(Calendar.YEAR);
|
int currentMonth = calendar.get(Calendar.MONTH) + 1;
|
int currentDay = calendar.get(Calendar.DATE);
|
|
if (month == null){
|
if (currentYear != year){
|
SPIDataCountKey = SPIDataCountKey + year+"_"+"【1-12】_"+depId;
|
}else {
|
SPIDataCountKey = SPIDataCountKey + year + "_" + "【1-" + currentMonth + "/" + currentDay + "】_" + depId;
|
}
|
}else {
|
if (currentYear != year){
|
SPIDataCountKey = SPIDataCountKey + year+"_"+month+"_"+depId;
|
}else {
|
SPIDataCountKey = SPIDataCountKey + year + "_" + currentMonth +"_【1-" + currentDay + "】_" + depId;
|
}
|
}
|
|
if (ObjectUtils.isNotEmpty(month) && ObjectUtils.isNotEmpty(year)){
|
DataCountStartAndEndTimeParams params = timeInterval(month, year);
|
|
// 月-统计时间段内所有、死亡、重伤、轻伤的隐患数量
|
if (!redisTemplate.opsForHash().hasKey(SPIDataCountKey,CountContentEnum.RESULT_COUNT.name())){
|
resultCountByTime = preventRiskDangerInfoService.listDangerResultCountByTime(params.getStartTime(), params.getEndTime(), depIds);
|
redisTemplate.opsForHash().put(SPIDataCountKey,CountContentEnum.RESULT_COUNT.name(),resultCountByTime);
|
}
|
resultCountByTime = (DataCountDangerResultRespDO)redisTemplate.opsForHash().get(SPIDataCountKey,CountContentEnum.RESULT_COUNT.name());
|
|
|
// 月-统计时间段内一般、重大的隐患数量
|
if (!redisTemplate.opsForHash().hasKey(SPIDataCountKey,CountContentEnum.LEVEL_COUNT.name())){
|
levelCountByTime = checkPointService.listDangerLevelCountByTime(params.getStartTime(), params.getEndTime(), depIds);
|
redisTemplate.opsForHash().put(SPIDataCountKey,CountContentEnum.LEVEL_COUNT.name(),levelCountByTime);
|
}
|
levelCountByTime = (DataCountDangerLevelRespDO)redisTemplate.opsForHash().get(SPIDataCountKey,CountContentEnum.LEVEL_COUNT.name());
|
|
// 月-统计时间段内一般已整改、重大已整改的隐患数量
|
if (!redisTemplate.opsForHash().hasKey(SPIDataCountKey,CountContentEnum.LEVEL_RECTIFIED_COUNT.name())){
|
levelRectifiedCountByTime = checkPointService.listDangerLevelRectifiedCountByTime(params.getStartTime(), params.getEndTime(), depIds);
|
redisTemplate.opsForHash().put(SPIDataCountKey,CountContentEnum.LEVEL_RECTIFIED_COUNT.name(),levelRectifiedCountByTime);
|
}
|
levelRectifiedCountByTime = (DataCountDangerLevelRectifiedRespDO)redisTemplate.opsForHash().get(SPIDataCountKey,CountContentEnum.LEVEL_RECTIFIED_COUNT.name());
|
|
}else {
|
DataCountStartAndEndTimeParams params = timeInterval(null, year);
|
// 年-统计时间段内所有、死亡、重伤、轻伤的隐患数量
|
if (!redisTemplate.opsForHash().hasKey(SPIDataCountKey,CountContentEnum.RESULT_COUNT.name())){
|
resultCountByTime = preventRiskDangerInfoService.listDangerResultCountByTime(params.getStartTime(), params.getEndTime(), depIds);
|
redisTemplate.opsForHash().put(SPIDataCountKey,CountContentEnum.RESULT_COUNT.name(),resultCountByTime);
|
}
|
resultCountByTime = (DataCountDangerResultRespDO)redisTemplate.opsForHash().get(SPIDataCountKey,CountContentEnum.RESULT_COUNT.name());
|
|
|
// 年-统计时间段内一般、重大的隐患数量
|
if (!redisTemplate.opsForHash().hasKey(SPIDataCountKey,CountContentEnum.LEVEL_COUNT.name())){
|
levelCountByTime = checkPointService.listDangerLevelCountByTime(params.getStartTime(), params.getEndTime(), depIds);
|
redisTemplate.opsForHash().put(SPIDataCountKey,CountContentEnum.LEVEL_COUNT.name(),levelCountByTime);
|
}
|
levelCountByTime = (DataCountDangerLevelRespDO)redisTemplate.opsForHash().get(SPIDataCountKey,CountContentEnum.LEVEL_COUNT.name());
|
|
|
// 年-统计时间段内一般已整改、重大已整改的隐患数量
|
if (!redisTemplate.opsForHash().hasKey(SPIDataCountKey,CountContentEnum.LEVEL_RECTIFIED_COUNT.name())){
|
levelRectifiedCountByTime = checkPointService.listDangerLevelRectifiedCountByTime(params.getStartTime(), params.getEndTime(), depIds);
|
redisTemplate.opsForHash().put(SPIDataCountKey,CountContentEnum.LEVEL_RECTIFIED_COUNT.name(),levelRectifiedCountByTime);
|
}
|
levelRectifiedCountByTime = (DataCountDangerLevelRectifiedRespDO)redisTemplate.opsForHash().get(SPIDataCountKey,CountContentEnum.LEVEL_RECTIFIED_COUNT.name());
|
|
}
|
if (resultCountByTime == null || levelCountByTime == null || levelRectifiedCountByTime == null){
|
parameterVerificationResult.setCode("400");
|
parameterVerificationResult.setMsg("数据统计异常");
|
return parameterVerificationResult;
|
}
|
SPIDataCountRespDTO spiDataCountRespDTO = new SPIDataCountRespDTO();
|
BeanUtils.copyProperties(resultCountByTime,spiDataCountRespDTO);
|
BeanUtils.copyProperties(levelCountByTime,spiDataCountRespDTO);
|
BeanUtils.copyProperties(levelRectifiedCountByTime,spiDataCountRespDTO);
|
BeanUtils.copyProperties(spiDataCountReqDTO,spiDataCountRespDTO);
|
spiDataCountRespDTO.setDep(depInfoByDepId.getDeptName());
|
parameterVerificationResult.setData(spiDataCountRespDTO);
|
return parameterVerificationResult;
|
}
|
|
@Override
|
public ResultVO<TroubleData> getSPIData(SPIDataReqBO spiDataReqBO) {
|
|
ResultVO resultVO = new ResultVO<>();
|
resultVO.setCode("200");
|
resultVO.setMsg("查询成功");
|
|
String key = "006a4740-8f2d-4fdc-a25b-a7413a37a2ba";
|
|
if (ObjectUtils.isEmpty(spiDataReqBO.getKey())){
|
resultVO.setCode("400");
|
resultVO.setMsg("key不能为空");
|
return resultVO;
|
}
|
if (!spiDataReqBO.getKey().equals(key)){
|
resultVO.setCode("400");
|
resultVO.setMsg("key不正确");
|
return resultVO;
|
}
|
LocalDateTime startTime = LocalDate.now().withDayOfMonth(1).atStartOfDay();
|
for (int i = 0; i < 12; i++) {
|
startTime = startTime.minus(Period.ofMonths(1));
|
}
|
spiDataReqBO.setStartTime(startTime);
|
spiDataReqBO.setEndTime(LocalDateTime.now());
|
|
|
List<TroubleData> spiData = checkPointService.getSPIData(spiDataReqBO);
|
|
|
resultVO.setData(spiData);
|
|
return resultVO;
|
}
|
|
@Override
|
public ResultVO<TroubleLevel> getSPIDataForPieChart(SPIDataReqBO spiDataReqBO) {
|
|
ResultVO resultVO = new ResultVO<>();
|
resultVO.setCode("200");
|
resultVO.setMsg("查询成功");
|
|
String key = "006a4740-8f2d-4fdc-a25b-a7413a37a2ba";
|
|
if (ObjectUtils.isEmpty(spiDataReqBO.getKey())){
|
resultVO.setCode("400");
|
resultVO.setMsg("key不能为空");
|
return resultVO;
|
}
|
if (!spiDataReqBO.getKey().equals(key)){
|
resultVO.setCode("400");
|
resultVO.setMsg("key不正确");
|
return resultVO;
|
}
|
|
SPIDataForPieChartRespDTO spiDataForPieChartRespDTO = new SPIDataForPieChartRespDTO();
|
|
if (ObjectUtils.isEmpty(spiDataReqBO.getYear())){
|
|
spiDataReqBO.setYear("2024");
|
TroubleLevel troubleLevel = checkPointService.getTroubleLevel(spiDataReqBO);
|
resultVO.setData(troubleLevel);
|
return resultVO;
|
}
|
|
TroubleLevel troubleLevel = checkPointService.getTroubleLevel(spiDataReqBO);
|
resultVO.setData(troubleLevel);
|
|
return resultVO;
|
}
|
|
|
/**
|
* @description 参数校验
|
*/
|
private ResultVO<SPIDataCountRespDTO> parameterVerification(SPIDataCountReqDTO spiDataCountReqDTO){
|
ResultVO resultVO = new ResultVO<>();
|
resultVO.setCode("200");
|
resultVO.setMsg("查询成功");
|
if (ObjectUtils.isEmpty(spiDataCountReqDTO)){
|
resultVO.setCode("400");
|
resultVO.setMsg("参数为空,查询失败");
|
return resultVO;
|
}
|
|
if (ObjectUtils.isEmpty(spiDataCountReqDTO.getMonth())){
|
if (ObjectUtils.isEmpty(spiDataCountReqDTO.getYear())){
|
resultVO.setCode("400");
|
resultVO.setMsg("查询年份不能为空");
|
return resultVO;
|
}
|
}else {
|
if (ObjectUtils.isEmpty(spiDataCountReqDTO.getYear())){
|
resultVO.setCode("400");
|
resultVO.setMsg("查询年份不能为空");
|
return resultVO;
|
}
|
}
|
|
if (ObjectUtils.isNotEmpty(spiDataCountReqDTO.getDepId())){
|
DoublePreventDept depInfoByDepId = doublePreventionDeptService.getDepInfoByDepId(spiDataCountReqDTO.getDepId());
|
if (depInfoByDepId == null){
|
resultVO.setCode("400");
|
resultVO.setMsg("查询的部门不存在");
|
return resultVO;
|
}
|
}
|
return resultVO;
|
}
|
|
|
|
/**
|
* 数据统计-统计时间处理:根据传参判断是否为统计月还是统计年,月份为空表明是统计年 月份不为空表明是统计月
|
*/
|
private DataCountStartAndEndTimeParams timeInterval(Integer month, Integer year){
|
|
//确定结束时间
|
Calendar calendar = Calendar.getInstance();
|
int nowYear = calendar.get(Calendar.YEAR);
|
Date startTime = null;
|
Date endTime = null;
|
if (month == null){
|
//说明统计的是当前年份
|
if (nowYear == year){
|
endTime =calendar.getTime();
|
|
calendar.clear();
|
calendar.set(Calendar.YEAR,nowYear);
|
startTime = calendar.getTime();
|
|
}else {
|
calendar.clear();
|
calendar.set(Calendar.YEAR,year);
|
startTime = calendar.getTime();
|
|
calendar.set(Calendar.YEAR,year+1);
|
calendar.set(Calendar.DAY_OF_YEAR,-1);
|
calendar.set(Calendar.SECOND,59);
|
calendar.set(Calendar.MINUTE,59);
|
calendar.set(Calendar.HOUR_OF_DAY,23);
|
endTime = calendar.getTime();
|
|
}
|
//统计的是指定月份
|
}else{
|
calendar.set(year, month - 1, 1);
|
calendar.set(Calendar.SECOND,0);
|
calendar.set(Calendar.MINUTE,0);
|
calendar.set(Calendar.HOUR_OF_DAY,0);
|
startTime = calendar.getTime();
|
|
calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DATE)); //指定月份的最后一天
|
calendar.set(Calendar.SECOND,59);
|
calendar.set(Calendar.MINUTE,59);
|
calendar.set(Calendar.HOUR_OF_DAY,23);
|
endTime = calendar.getTime();
|
|
}
|
DataCountStartAndEndTimeParams params = new DataCountStartAndEndTimeParams();
|
params.setStartTime(startTime);
|
params.setEndTime(endTime);
|
return params;
|
}
|
}
|