package com.ycl.task; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mongodb.client.result.DeleteResult; import com.ycl.platform.domain.entity.ContractRuleRecord; import com.ycl.platform.domain.entity.Report; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.domain.result.UY.VideoOnlineResult; import com.ycl.platform.domain.vo.CalculateRuleVO; import com.ycl.platform.domain.vo.ContractVO; import com.ycl.platform.domain.vo.ReportVO; import com.ycl.platform.mapper.*; import com.ycl.utils.DateUtils; import constant.ApiConstants; import constant.RedisConstant; import enumeration.ContractRule; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.management.monitor.Monitor; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * 合同考核定时任务 */ @Slf4j @Component("contractTask") public class ContractTask { @Autowired private MongoTemplate mongoTemplate; @Autowired private RedisTemplate redisTemplate; @Autowired private TMonitorMapper monitorMapper; @Autowired private TContractMapper contractMapper; @Autowired private YwPointMapper ywPointMapper; @Autowired private ReportMapper reportMapper; @Autowired private ContractRuleRecordMapper recordMapper; private static final Integer Online = 1; private static final Integer Offline = -1; private static final String AuditStatus_Pass = "1"; /** * 合同考核 在线率每日任务检测 * 查生效的合同关联的公司,获取unitId集合 * 根据unitId查询对应点位获取各个公司管理的设备Ids * 查询三种设备在线不在线情况,封装为一个map<国标码,在线状态> * 计算每日每家公司的在线率存入mysql * 月底计算平均值,根据在线率和合同标准扣减分数 */ public void onlineCheck() { List ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date()); List unitIds = ruleVos.stream().map(CalculateRuleVO::getUnitId).collect(Collectors.toList()); List ywPoints = ywPointMapper.selectList(new QueryWrapper().in("unitId", unitIds)); //key是unitId value是设备编码集合 Map> unitMap = ywPoints.stream() .collect(Collectors.groupingBy( YwPoint::getUnitId, Collectors.mapping( YwPoint::getSerialNumber, Collectors.toList() ) )); Map onlineStatusMap = new HashMap<>(); //查mongo获取设备在线情况 Date date = DateUtils.getDay(2024, 7, 13); //车辆、人脸 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List results = mongoTemplate.find(query, SnapshotDataMonitorResult.class); for (SnapshotDataMonitorResult result : results) { if (ApiConstants.HK_SnapCount_ResultType_Null != result.getResultType()) { onlineStatusMap.put(result.getExternalIndexCode(), Online); } else { onlineStatusMap.put(result.getExternalIndexCode(), Offline); } } //视频 Query videoQuery = new Query(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List videoOnlineResults = mongoTemplate.find(videoQuery, VideoOnlineResult.class); for (VideoOnlineResult videoOnlineResult : videoOnlineResults) { onlineStatusMap.put(videoOnlineResult.getDeviceId(), videoOnlineResult.getStatus()); } //查询报备列表 List reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); //计算每个公司的点位在线率 List ruleRecordList = new ArrayList<>(); unitMap.forEach((unitId, serialNumberList) -> { int totalSite = 0; int onlineSite = 0; for (String number : serialNumberList) { //报备过不纳入计算 if (!CollectionUtils.isEmpty(reportNumbers) && reportNumbers.contains(number)) continue; Integer status = onlineStatusMap.get(number); totalSite++; if (Online.equals(status)) { onlineSite++; } } ContractRuleRecord contractRuleRecord = new ContractRuleRecord(); contractRuleRecord.setSiteOnline( onlineSite / totalSite); contractRuleRecord.setCreateTime(new Date()); contractRuleRecord.setUnitId(unitId); ruleRecordList.add(contractRuleRecord); }); //存储结果 recordMapper.insertBatch(ruleRecordList); } }