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<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
|
List<Integer> unitIds = ruleVos.stream().map(CalculateRuleVO::getUnitId).collect(Collectors.toList());
|
List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unitId", unitIds));
|
//key是unitId value是设备编码集合
|
Map<Long, List<String>> unitMap = ywPoints.stream()
|
.collect(Collectors.groupingBy(
|
YwPoint::getUnitId,
|
Collectors.mapping(
|
YwPoint::getSerialNumber,
|
Collectors.toList()
|
)
|
));
|
Map<String, Integer> 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<SnapshotDataMonitorResult> 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<VideoOnlineResult> videoOnlineResults = mongoTemplate.find(videoQuery, VideoOnlineResult.class);
|
for (VideoOnlineResult videoOnlineResult : videoOnlineResults) {
|
onlineStatusMap.put(videoOnlineResult.getDeviceId(), videoOnlineResult.getStatus());
|
}
|
//查询报备列表
|
List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate());
|
//计算每个公司的点位在线率
|
List<ContractRuleRecord> 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);
|
}
|
}
|