package com.gkhy.testFourierSpecialGasMonitor.service.impl; import com.gkhy.testFourierSpecialGasMonitor.commons.domain.Result; import com.gkhy.testFourierSpecialGasMonitor.commons.domain.SearchResult; import com.gkhy.testFourierSpecialGasMonitor.commons.enums.ResultCode; import com.gkhy.testFourierSpecialGasMonitor.commons.exception.BusinessException; import com.gkhy.testFourierSpecialGasMonitor.commons.model.PageQuery; import com.gkhy.testFourierSpecialGasMonitor.domain.account.entity.User; import com.gkhy.testFourierSpecialGasMonitor.domain.account.enums.UserStatusEnum; import com.gkhy.testFourierSpecialGasMonitor.domain.account.repository.jpa.UserRepository; import com.gkhy.testFourierSpecialGasMonitor.entity.GasConcentration; import com.gkhy.testFourierSpecialGasMonitor.entity.GasWarnLog; import com.gkhy.testFourierSpecialGasMonitor.entity.query.FindGasWarnLogPageQuery; import com.gkhy.testFourierSpecialGasMonitor.entity.query.GasWarnTimesCountTimeSlotQuery; import com.gkhy.testFourierSpecialGasMonitor.entity.query.WindRoseTimeSlotQuery; import com.gkhy.testFourierSpecialGasMonitor.entity.req.GasWarnLogCountByTimeReqDTO; import com.gkhy.testFourierSpecialGasMonitor.entity.req.GasWarnLogInfoReqDTO; import com.gkhy.testFourierSpecialGasMonitor.entity.req.HandleGasWarnLogReqDTO; import com.gkhy.testFourierSpecialGasMonitor.entity.req.WindRoseByTimeReqDTO; import com.gkhy.testFourierSpecialGasMonitor.entity.resp.*; import com.gkhy.testFourierSpecialGasMonitor.enums.GasWarnTimesCountEnum; import com.gkhy.testFourierSpecialGasMonitor.enums.WarnHandleStatusEnum; import com.gkhy.testFourierSpecialGasMonitor.enums.WindRoseEnum; import com.gkhy.testFourierSpecialGasMonitor.repository.GasConcentrationRepository; import com.gkhy.testFourierSpecialGasMonitor.repository.GasWarnLogRepository; import com.gkhy.testFourierSpecialGasMonitor.service.GasWarnLogService; import com.gkhy.testFourierSpecialGasMonitor.utils.ThreadLocalUtil; import io.micrometer.core.instrument.util.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; /** * @author Mr.huang * @decription * @date 2023/8/9 16:47 */ @Service public class GasWarnLogServiceImpl implements GasWarnLogService { @Autowired private GasWarnLogRepository gasWarnLogRepository; @Resource private GasConcentrationRepository gasConcentrationRepository; @Autowired private UserRepository userRepository; private User getCurrentUser(){ Long userId = ThreadLocalUtil.get().getId(); User user = userRepository.findUserByIdAndStatus(userId, UserStatusEnum.STATUS_ACTIVE.getStatus()); if (user == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL.getCode(),"未成功获取用户信息"); return user; } @Override public Result findGasWarnLogPage(PageQuery pageQuery) { if (pageQuery == null || pageQuery.getPageIndex() == null || pageQuery.getPageSize() == null){ throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"分页参数不能为空"); } Pageable pageable = PageRequest.of(pageQuery.getPageIndex()-1, pageQuery.getPageSize(), Sort.Direction.DESC, "warnTime"); Specification specification = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { Set predicateList = new HashSet<>(); FindGasWarnLogPageQuery searchParams = pageQuery.getSearchParams(); if (searchParams != null && searchParams.getStartTime() != null && searchParams.getEndTime() != null){ predicateList.add(criteriaBuilder.between(root.get("warnTime").as(LocalDateTime.class),searchParams.getStartTime(),searchParams.getEndTime())); } if (searchParams != null && searchParams.getStatus() != null){ predicateList.add(criteriaBuilder.equal(root.get("status").as(Byte.class), searchParams.getStatus())); } if (searchParams != null && searchParams.getGasCategoryId() != null){ predicateList.add(criteriaBuilder.equal(root.get("gasCategoryId").as(Integer.class), searchParams.getGasCategoryId())); } if (searchParams != null && searchParams.getGasThresholdId() != null){ predicateList.add(criteriaBuilder.equal(root.get("gasThresholdId").as(Long.class), searchParams.getGasThresholdId())); } return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); } }; SearchResult> searchResult = new SearchResult<>(); searchResult.setPageIndex(pageQuery.getPageIndex()); searchResult.setPageSize(pageQuery.getPageSize()); searchResult.setSuccess(); Page pageResult = gasWarnLogRepository.findAll(specification,pageable); searchResult.setTotal(pageResult.getTotalElements()); searchResult.setPages(pageResult.getTotalPages()); if (!CollectionUtils.isEmpty(pageResult.getContent())){ List respDTOS = pageResult.getContent().stream().map(gasWarnLog -> { FindGasWarnLogPageRespDTO dto = new FindGasWarnLogPageRespDTO(); BeanUtils.copyProperties(gasWarnLog, dto); if (!CollectionUtils.isEmpty(gasWarnLog.getGasWarnLogSmsUsers())) { List gasWarnLogSmsUsers = new ArrayList<>(); BeanUtils.copyProperties(gasWarnLog.getGasWarnLogSmsUsers(), gasWarnLogSmsUsers); dto.setGasWarnLogSmsUsers(gasWarnLogSmsUsers); } return dto; }).collect(Collectors.toList()); searchResult.setData(respDTOS); } return searchResult; } @Override public Result handleGasWarnLog(HandleGasWarnLogReqDTO reqDto) { User currentUser = getCurrentUser(); if (reqDto == null){ throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); } if (reqDto.getId() == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); if (reqDto.getUserId() == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); if (StringUtils.isBlank(reqDto.getHandlerDesc())) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); GasWarnLog gasWarnLog = gasWarnLogRepository.findByIdAndStatus(reqDto.getId(), WarnHandleStatusEnum.HANDLE_NO.getStatus()); if (gasWarnLog == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"预警信息不存在"); User user = userRepository.findUserByIdAndStatus(reqDto.getUserId(), UserStatusEnum.STATUS_ACTIVE.getStatus()); if (user == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"处理人不存在"); gasWarnLog.setHandlerId(user.getId()); gasWarnLog.setHandlerName(user.getName()); gasWarnLog.setHandlerRealName(user.getRealName()); gasWarnLog.setHandlerTime(LocalDateTime.now()); gasWarnLog.setHandlerDesc(reqDto.getHandlerDesc()); gasWarnLog.setStatus(WarnHandleStatusEnum.HANDLE_YES.getStatus()); GasWarnLog save = gasWarnLogRepository.save(gasWarnLog); if (save == null) throw new BusinessException(this.getClass(), ResultCode.SYSTEM_ERROR_DATABASE_FAIL,"预警信息处理失败"); return Result.success(); } @Override public GasWarnLog save(GasWarnLog gasWarnLog) { return gasWarnLogRepository.save(gasWarnLog); } @Override public List listYesterday() { // 获取当前时间 LocalDateTime now = LocalDateTime.now(); // 获取昨天的日期 LocalDateTime yesterday = now.minusDays(1); // 获取昨天的9点时间 LocalDateTime yesterdayStart = LocalDateTime.of(yesterday.toLocalDate(), LocalTime.of(9,0,0)); // 获取今天的9点时间 LocalDateTime yesterdayEnd = LocalDateTime.of(yesterday.toLocalDate(), LocalTime.of(9,0,0)); Specification specification = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { Set predicateList = new HashSet<>(); predicateList.add(criteriaBuilder.between(root.get("warnTime").as(LocalDateTime.class),yesterdayStart,yesterdayEnd)); return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); } }; List warnLogs = gasWarnLogRepository.findAll(specification); return warnLogs; } @Override public Result gasWarnLogCountByTime(GasWarnLogCountByTimeReqDTO gasWarnLogCountByTimeReqDTO) { if (gasWarnLogCountByTimeReqDTO == null && gasWarnLogCountByTimeReqDTO .getCountTime() == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); Integer countTime = gasWarnLogCountByTimeReqDTO.getCountTime(); GasWarnTimesCountTimeSlotQuery query = GasWarnTimesCountEnum.getQueryObject(countTime).getTimeSlotByStrategy(); Result result = Result.success(); List gasWarnLog = gasWarnLogRepository.findAllByWarnTimeBetweenOrderByWarnTimeDesc(query.getStartTime(), query.getEndTime()); if (CollectionUtils.isEmpty(gasWarnLog)) return result; GasWarnLogCountByTimeRespDTO gasWarnLogCountByTimeRespDTO = new GasWarnLogCountByTimeRespDTO(); Map nameCountMap = gasWarnLog.stream() .collect(Collectors.groupingBy(GasWarnLog::getGasThresholdId, Collectors.counting())); gasWarnLogCountByTimeRespDTO.setYellowWarnNum(nameCountMap.get(1)); gasWarnLogCountByTimeRespDTO.setRedWarnNum(nameCountMap.get(2)); result.setData(gasWarnLogCountByTimeRespDTO); return result; } @Override public Result gasWindRoseByTime(WindRoseByTimeReqDTO reqDTO) { if (reqDTO == null && reqDTO .getCountTime() == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); Integer countTime = reqDTO.getCountTime(); List gasConcentrations; if (reqDTO.getCountTime().equals(WindRoseEnum.CUSTOM_TIME.getState())){ if (reqDTO.getStartTime() == null && reqDTO.getEndTime() == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL,"参数不能为空"); gasConcentrations = gasConcentrationRepository.findAllByDataReceivingTimeBetweenOrderByDataReceivingTimeDesc(reqDTO.getStartTime(), reqDTO.getEndTime()); }else { WindRoseTimeSlotQuery query = WindRoseEnum.getQueryObject(countTime).getTimeSlotByStrategy(); gasConcentrations = gasConcentrationRepository.findAllByDataReceivingTimeBetweenOrderByDataReceivingTimeDesc(query.getStartTime(), query.getEndTime()); } Result result = Result.success(); if (CollectionUtils.isEmpty(gasConcentrations)) return result; List collect = gasConcentrations.stream().map(gasConcentration -> { WindRoseByTimeRespDTO dto = new WindRoseByTimeRespDTO(); BeanUtils.copyProperties(gasConcentration, dto); return dto; }).collect(Collectors.toList()); result.setData(collect); return result; } @Override public Result gasWarnLogInfoByTime(GasWarnLogInfoReqDTO gasWarnLogInfoReqDTO) { LocalDateTime now = LocalDateTime.now(); LocalDateTime startTime = now.with(LocalTime.MIN); if (gasWarnLogInfoReqDTO != null && gasWarnLogInfoReqDTO.getStartTime() != null) { startTime = gasWarnLogInfoReqDTO.getStartTime(); } if (gasWarnLogInfoReqDTO != null && gasWarnLogInfoReqDTO.getEndTime() != null) { now = gasWarnLogInfoReqDTO.getEndTime(); } Result result = Result.success(); List gasWarnLogs = gasWarnLogRepository.findAllByWarnTimeBetweenOrderByWarnTimeDesc(startTime, now); if (CollectionUtils.isEmpty(gasWarnLogs)) return result; List dtos = gasWarnLogs.stream().map(gasWarnLog -> { GasWarnLogInfoByTimeRespDTO dto = new GasWarnLogInfoByTimeRespDTO(); BeanUtils.copyProperties(gasWarnLog, dto); return dto; }).collect(Collectors.toList()); result.setData(dtos); return result; } }