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 listDangerResultCountByMonthOrYear(SPIDataCountReqDTO spiDataCountReqDTO) { ResultVO 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 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 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 spiData = checkPointService.getSPIData(spiDataReqBO); resultVO.setData(spiData); return resultVO; } @Override public ResultVO 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 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; } }