| | |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.mongodb.client.result.DeleteResult; |
| | | import com.ycl.platform.domain.entity.*; |
| | | import com.ycl.platform.domain.result.HK.PicAccessResult; |
| | |
| | | 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.domain.vo.WorkOrderVO; |
| | | import com.ycl.platform.mapper.*; |
| | | import com.ycl.platform.service.IContractScoreService; |
| | | import com.ycl.utils.DateUtils; |
| | | import constant.ApiConstants; |
| | | import constant.RedisConstant; |
| | | import enumeration.ContractRule; |
| | | import enumeration.ErrorType; |
| | | import enumeration.general.AuditingStatus; |
| | | import enumeration.general.ErrorTypeEnum; |
| | | import enumeration.general.RuleDeductCategoryEnum; |
| | | import enumeration.general.WorkOrderStatusEnum; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.mongodb.core.MongoTemplate; |
| | |
| | | import javax.management.monitor.Monitor; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | @Autowired |
| | | private MongoTemplate mongoTemplate; |
| | | @Autowired |
| | | private RedisTemplate redisTemplate; |
| | | @Autowired |
| | | private TMonitorMapper monitorMapper; |
| | | @Autowired |
| | | private TContractMapper contractMapper; |
| | | @Autowired |
| | | private YwPointMapper ywPointMapper; |
| | |
| | | private ContractRuleRecordMapper recordMapper; |
| | | @Autowired |
| | | private IContractScoreService contractScoreService; |
| | | @Autowired |
| | | private WorkOrderMapper workOrderMapper; |
| | | |
| | | private static final Integer Online = 1; |
| | | private static final Integer Offline = -1; |
| | |
| | | if (checkRange(min, max, siteOnline.multiply(new BigDecimal(100)))) { |
| | | //需要扣除的分数 |
| | | Double deductScore = ruleVO.getCalcFraction(); |
| | | ContractScore contractScore = new ContractScore(); |
| | | contractScore.setContractId(Long.parseLong(contractId + "")); |
| | | contractScore.setAuditingStatus(AuditingStatus.PASS); |
| | | contractScore.setAuditingTime(new Date()); |
| | | contractScore.setAuditingUser(Remark); |
| | | contractScore.setUnitId(Long.parseLong(unitId + "")); |
| | | contractScore.setRuleId(Long.parseLong(ruleVO.getId() + "")); |
| | | contractScore.setRuleIds("0," + ruleVO.getId()); |
| | | contractScore.setNum(siteOnline + ""); |
| | | contractScore.setDeductCategory(ruleVO.getDeductCategory().getDesc()); |
| | | contractScore.setScore(new BigDecimal(deductScore)); |
| | | contractScore.setRuleName(ruleVO.getRuleName() + "/" + ruleVO.getRuleCondition()); |
| | | contractScore.setCreateTime(new Date()); |
| | | contractScore.setUpdateTime(new Date()); |
| | | contractScore.setRemark(Remark); |
| | | ContractScore contractScore = getContractScore(ruleVO, deductScore, siteOnline + "", Remark); |
| | | contractScoreList.add(contractScore); |
| | | } |
| | | } |
| | |
| | | log.info("结束计算合同点位在线率分数"); |
| | | } |
| | | |
| | | private boolean checkRange(Double min, Double max, BigDecimal siteOnline) { |
| | | if (siteOnline == null) { |
| | | return false; |
| | | } |
| | | if (max != null && siteOnline.compareTo(new BigDecimal(max)) > 0) { |
| | | return false; |
| | | } |
| | | if (min != null && siteOnline.compareTo(new BigDecimal(min)) < 0) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 检测工单表 进行合同积分扣除 |
| | | * 查出工单需要扣分的所有规则 |
| | |
| | | * 插入合同积分表,修改工单状态为已扣分 |
| | | */ |
| | | public void workOrderDeduct() { |
| | | log.info("开始扫描工单扣分"); |
| | | //准备批量打分的集合 |
| | | List<ContractScore> contractScoreList = new ArrayList<>(); |
| | | List<String> workOrderList = new ArrayList<>(); |
| | | //查询生效合同对应所有的规则 |
| | | List<CalculateRuleVO> calculateRules = contractMapper.getCalculateRule(new Date()); |
| | | Map<String, Map<Integer, List<CalculateRuleVO>>> ruleMap = calculateRules.stream() |
| | |
| | | Map<Integer, List<CalculateRuleVO>> storeRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Store.getName()); |
| | | //点位异常情况处理 获取key为合同id,value为规则的map |
| | | Map<Integer, List<CalculateRuleVO>> siteRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Site.getName()); |
| | | //查询报备列表 |
| | | List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); |
| | | //查询30天内所有未扣分、审核通过的工单 |
| | | // 获取当前日期 |
| | | LocalDateTime endTime = LocalDateTime.now(); |
| | | // 计算30天前的日期 |
| | | LocalDateTime startTime = endTime.minusDays(30); |
| | | List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(), "审核通过"); |
| | | for (WorkOrderVO workOrder : workOrders) { |
| | | //检测是否报备过 |
| | | if (!CollectionUtils.isEmpty(reportNumbers)) { |
| | | if(reportNumbers.contains(workOrder.getSerialNumber())) continue; |
| | | } |
| | | String errorType = workOrder.getErrorType(); |
| | | //存储故障 录像或图片访问异常 |
| | | if (ErrorType.VIDEO_NONE.getValue().equals(errorType) || ErrorType.PIC_URLABNORMAL.getValue().equals(errorType)) { |
| | | if (!CollectionUtils.isEmpty(storeRuleMap)) { |
| | | storeRuleMap.forEach((contractId, rules) -> { |
| | | Integer unitId = rules.get(0).getUnitId(); |
| | | //找到对应的规则 |
| | | if (workOrder.getUnitId().equals(unitId)) { |
| | | //工单下发时间 |
| | | Date createTime = workOrder.getDistributeTime(); |
| | | Date auditTime = workOrder.getAuditTime(); |
| | | double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60); |
| | | //选择时间范围内的规则 |
| | | for (CalculateRuleVO rule : rules) { |
| | | if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { |
| | | double deductScore = rule.getCalcFraction() * Math.ceil(diffTime); |
| | | ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "工单编号为:" + workOrder.getWorkOrderNo() + "处理超时,扣除" + deductScore + "分"); |
| | | contractScoreList.add(contractScore); |
| | | workOrderList.add(workOrder.getWorkOrderNo()); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | //前端感知源治理工作(时钟同步规则、OSD规则、一机一档规则) |
| | | if (ErrorType.MONITOR_UNQUALIFY.getValue().equals(errorType) || ErrorType.OSD_ERROR.getValue().equals(errorType) || ErrorType.CLOCK_SKEW.getValue().equals(errorType)) { |
| | | if (!CollectionUtils.isEmpty(monitorRuleMap)) { |
| | | monitorRuleMap.forEach((contractId, rules) -> { |
| | | Integer unitId = rules.get(0).getUnitId(); |
| | | //找到对应的规则 |
| | | if (workOrder.getUnitId().equals(unitId)) { |
| | | //工单下发时间 |
| | | Date createTime = workOrder.getDistributeTime(); |
| | | Date auditTime = workOrder.getAuditTime(); |
| | | double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60); |
| | | //选择时间范围内的规则 |
| | | for (CalculateRuleVO rule : rules) { |
| | | if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { |
| | | double deductScore = rule.getCalcFraction(); |
| | | ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "工单编号为:" + workOrder.getWorkOrderNo() + "处理超时,扣除" + deductScore + "分"); |
| | | contractScoreList.add(contractScore); |
| | | workOrderList.add(workOrder.getWorkOrderNo()); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | //点位异常情况处理(镜头异常、摄像头遮挡等) |
| | | if (ErrorType.SCREEN_COLOR_DEVIATION.getValue().equals(errorType) || ErrorType.SNOW_STORM.getValue().equals(errorType) || ErrorType.STRIPE_INTERFERENCE.getValue().equals(errorType) || ErrorType.SCREEN_OCCLUSION.getValue().equals(errorType) || ErrorType.ABNORMAL_CLARITY.getValue().equals(errorType) || ErrorType.ABNORMAL_BRIGHTNESS.getValue().equals(errorType)) { |
| | | if (!CollectionUtils.isEmpty(monitorRuleMap)) { |
| | | siteRuleMap.forEach((contractId, rules) -> { |
| | | Integer unitId = rules.get(0).getUnitId(); |
| | | //设备是否是该公司运维 |
| | | if (workOrder.getUnitId().equals(unitId)) { |
| | | //工单下发时间 |
| | | Date createTime = workOrder.getDistributeTime(); |
| | | Date auditTime = workOrder.getAuditTime(); |
| | | double diffTime = (double) (auditTime.getTime() - createTime.getTime()) / (1000 * 60 * 60); |
| | | //选择时间范围内的规则 |
| | | for (CalculateRuleVO rule : rules) { |
| | | if (checkRange(rule.getMin(), rule.getMax(), new BigDecimal(diffTime))) { |
| | | double deductScore = 0d; |
| | | if (ContractRule.CONTRACT_RULE_Store_48H.getName().equals(rule.getRuleCondition())) { |
| | | //计算超时天数 |
| | | int day = (int) ((diffTime - 48) / 24 + 1); |
| | | deductScore = rule.getCalcFraction() * (day); |
| | | } else { |
| | | deductScore = rule.getCalcFraction(); |
| | | } |
| | | ContractScore contractScore = getContractScore(rule, deductScore, Math.round(diffTime * 100) / 100 + "", Remark + "工单编号为:" + workOrder.getWorkOrderNo() + "处理超时,扣除" + deductScore + "分"); |
| | | contractScoreList.add(contractScore); |
| | | workOrderList.add(workOrder.getWorkOrderNo()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | contractScoreService.saveBatch(contractScoreList); |
| | | if (!CollectionUtils.isEmpty(workOrderList)) { |
| | | //修改工单扣分状态为已扣分 |
| | | UpdateWrapper<WorkOrder> updateWrapper = new UpdateWrapper<>(); |
| | | updateWrapper.in("work_order_no", workOrderList); |
| | | updateWrapper.set("deduct", 1); |
| | | workOrderMapper.update(null, updateWrapper); |
| | | } |
| | | log.info("结束执行工单扣分"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 不定期检查数据 扣除积分 |
| | |
| | | log.info("开始抽查图片完整状态"); |
| | | //准备批量打分的集合 |
| | | List<ContractScore> contractScoreList = new ArrayList<>(); |
| | | |
| | | //查询报备列表 |
| | | List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); |
| | | Date date = DateUtils.getDay(2024, 7, 13); |
| | | //查图片完整性规则 获取key为合同id,value为规则的map |
| | | Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() |
| | |
| | | Collectors.mapping( |
| | | YwPoint::getSerialNumber, |
| | | Collectors.toList()))); |
| | | contractMap.forEach((contractId, ruleList) -> { |
| | | boolean deduct = false; |
| | | String serialNumber = null; |
| | | //此规则对应的unitId均相等 |
| | | CalculateRuleVO ruleVO = ruleList.get(0); |
| | | Integer unitId = ruleVO.getUnitId(); |
| | | List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); |
| | | for (PicAccessResult picAccessResult : picAccessResults) { |
| | | //判断是否是该公司运维 |
| | | if (monitorList.contains(picAccessResult.getExternalIndexCode())) { |
| | | //存在大图不可用数据量,需要扣减 |
| | | if (picAccessResult.getBigDisableCount() > 0) { |
| | | deduct = true; |
| | | serialNumber = picAccessResult.getExternalIndexCode(); |
| | | break; |
| | | if (!CollectionUtils.isEmpty(contractMap)) { |
| | | contractMap.forEach((contractId, ruleList) -> { |
| | | boolean deduct = false; |
| | | String serialNumber = null; |
| | | //此规则对应的unitId均相等 |
| | | CalculateRuleVO ruleVO = ruleList.get(0); |
| | | Integer unitId = ruleVO.getUnitId(); |
| | | List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); |
| | | for (PicAccessResult picAccessResult : picAccessResults) { |
| | | //判断是否报备过 |
| | | if (!CollectionUtils.isEmpty(reportNumbers)) { |
| | | if(reportNumbers.contains(picAccessResult.getExternalIndexCode())) continue; |
| | | } |
| | | //判断是否是该公司运维 |
| | | if (monitorList.contains(picAccessResult.getExternalIndexCode())) { |
| | | //存在大图不可用数据量,需要扣减 |
| | | if (picAccessResult.getBigDisableCount() > 0) { |
| | | deduct = true; |
| | | serialNumber = picAccessResult.getExternalIndexCode(); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (deduct) { |
| | | //需要扣除的分数,此规则只有一条不需要判断范围 |
| | | Double deductScore = ruleVO.getCalcFraction(); |
| | | ContractScore contractScore = new ContractScore(); |
| | | contractScore.setContractId(Long.parseLong(contractId + "")); |
| | | contractScore.setAuditingStatus(AuditingStatus.PASS); |
| | | contractScore.setAuditingTime(new Date()); |
| | | contractScore.setAuditingUser(Remark); |
| | | contractScore.setUnitId(Long.parseLong(ruleVO.getUnitId() + "")); |
| | | contractScore.setRuleId(Long.parseLong(ruleVO.getId() + "")); |
| | | contractScore.setRuleIds("0," + ruleVO.getId()); |
| | | contractScore.setNum(1 + ""); |
| | | contractScore.setDeductCategory(ruleVO.getDeductCategory().getDesc()); |
| | | contractScore.setScore(new BigDecimal(deductScore)); |
| | | contractScore.setRuleName(ruleVO.getRuleName() + "/" + ruleVO.getRuleCondition()); |
| | | contractScore.setCreateTime(new Date()); |
| | | contractScore.setUpdateTime(new Date()); |
| | | contractScore.setRemark(Remark + "国标码为:" + serialNumber + "时间:" + new Date() + "存在大图不可用数据"); |
| | | contractScoreList.add(contractScore); |
| | | } |
| | | }); |
| | | if (deduct) { |
| | | //需要扣除的分数,此规则只有一条不需要判断范围 |
| | | Double deductScore = ruleVO.getCalcFraction(); |
| | | ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "国标码为:" + serialNumber + "时间:" + new Date() + "存在大图不可用数据"); |
| | | contractScoreList.add(contractScore); |
| | | } |
| | | }); |
| | | } |
| | | contractScoreService.saveBatch(contractScoreList); |
| | | log.info("结束抽查图片完整状态"); |
| | | } |
| | |
| | | log.info("开始抽查录像完整状态"); |
| | | //准备批量打分的集合 |
| | | List<ContractScore> contractScoreList = new ArrayList<>(); |
| | | |
| | | //查询报备列表 |
| | | List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); |
| | | Date date = DateUtils.getDay(2024, 7, 13); |
| | | //查图片完整性规则 获取key为合同id,value为规则的map |
| | | Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream() |
| | |
| | | Collectors.mapping( |
| | | YwPoint::getSerialNumber, |
| | | Collectors.toList()))); |
| | | contractMap.forEach((contractId, ruleList) -> { |
| | | //此规则对应的unitId均相等 |
| | | CalculateRuleVO ruleVO = ruleList.get(0); |
| | | Integer unitId = ruleVO.getUnitId(); |
| | | List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); |
| | | for (RecordMetaDSumResult result : recordMetaDSumResults) { |
| | | //判断是否是该公司运维 |
| | | if (monitorList.contains(result.getDeviceId())) { |
| | | //录像状态不完整 |
| | | if (!Objects.equals(result.getRecordStatus(), ApiConstants.UY_RecordStatus_Integrity)) { |
| | | for (CalculateRuleVO calculateRuleVO : ruleList) { |
| | | Double max = calculateRuleVO.getMax(); |
| | | Double min = calculateRuleVO.getMin(); |
| | | //判断范围在哪个区间 |
| | | if (checkRange(min, max, BigDecimal.valueOf(result.getMissDuration()))) { |
| | | if(calculateRuleVO.getNum() == null){ |
| | | calculateRuleVO.setNum(1); |
| | | }else { |
| | | calculateRuleVO.setNum(calculateRuleVO.getNum()+1); |
| | | if (!CollectionUtils.isEmpty(contractMap)) { |
| | | contractMap.forEach((contractId, ruleList) -> { |
| | | //此规则对应的unitId均相等 |
| | | CalculateRuleVO ruleVO = ruleList.get(0); |
| | | Integer unitId = ruleVO.getUnitId(); |
| | | List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + "")); |
| | | for (RecordMetaDSumResult result : recordMetaDSumResults) { |
| | | //判断是否报备过 |
| | | if (!CollectionUtils.isEmpty(reportNumbers)) { |
| | | if(reportNumbers.contains(result.getDeviceId())) continue; |
| | | } |
| | | //判断是否是该公司运维 |
| | | if (monitorList.contains(result.getDeviceId())) { |
| | | //录像状态不完整 |
| | | if (!Objects.equals(result.getRecordStatus(), ApiConstants.UY_RecordStatus_Integrity)) { |
| | | for (CalculateRuleVO calculateRuleVO : ruleList) { |
| | | Double max = calculateRuleVO.getMax(); |
| | | Double min = calculateRuleVO.getMin(); |
| | | //判断范围在哪个区间 |
| | | if (checkRange(min, max, BigDecimal.valueOf(result.getMissDuration()))) { |
| | | if (calculateRuleVO.getNum() == null) { |
| | | calculateRuleVO.setNum(1); |
| | | } else { |
| | | calculateRuleVO.setNum(calculateRuleVO.getNum() + 1); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | for (CalculateRuleVO calculateRuleVO : ruleList) { |
| | | //需要扣除的分数,此规则只有一条不需要判断范围 |
| | | double deductScore = calculateRuleVO.getCalcFraction()*calculateRuleVO.getNum(); |
| | | ContractScore contractScore = new ContractScore(); |
| | | contractScore.setContractId(Long.parseLong(contractId + "")); |
| | | contractScore.setAuditingStatus(AuditingStatus.PASS); |
| | | contractScore.setAuditingTime(new Date()); |
| | | contractScore.setAuditingUser(Remark); |
| | | contractScore.setUnitId(Long.parseLong(calculateRuleVO.getUnitId() + "")); |
| | | contractScore.setRuleId(Long.parseLong(calculateRuleVO.getId() + "")); |
| | | contractScore.setRuleIds("0," + calculateRuleVO.getId()); |
| | | contractScore.setNum(calculateRuleVO.getNum() + ""); |
| | | contractScore.setDeductCategory(calculateRuleVO.getDeductCategory().getDesc()); |
| | | contractScore.setScore(new BigDecimal(deductScore)); |
| | | contractScore.setRuleName(calculateRuleVO.getRuleName() + "/" + calculateRuleVO.getRuleCondition()); |
| | | contractScore.setCreateTime(new Date()); |
| | | contractScore.setUpdateTime(new Date()); |
| | | contractScore.setRemark(Remark+calculateRuleVO.getNum()+"路设备违反规则"); |
| | | contractScoreList.add(contractScore); |
| | | } |
| | | }); |
| | | for (CalculateRuleVO calculateRuleVO : ruleList) { |
| | | if (calculateRuleVO.getNum() > 0) { |
| | | //需要扣除的分数,此规则只有一条不需要判断范围 |
| | | double deductScore = calculateRuleVO.getCalcFraction() * calculateRuleVO.getNum(); |
| | | ContractScore contractScore = getContractScore(calculateRuleVO, deductScore, calculateRuleVO.getNum() + "", Remark + calculateRuleVO.getNum() + "路设备违反规则"); |
| | | contractScoreList.add(contractScore); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | contractScoreService.saveBatch(contractScoreList); |
| | | log.info("结束抽查图片完整状态"); |
| | | log.info("结束抽查录像完整状态"); |
| | | } |
| | | } |
| | | |
| | | private boolean checkRange(Double min, Double max, BigDecimal index) { |
| | | if (index == null) { |
| | | return false; |
| | | } |
| | | if (max == null && min == null) { |
| | | return false; |
| | | } |
| | | if (max != null && index.setScale(0, RoundingMode.DOWN).compareTo(new BigDecimal(max)) > 0) { |
| | | return false; |
| | | } |
| | | if (min != null && index.setScale(0, RoundingMode.UP).compareTo(new BigDecimal(min)) < 0) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | private ContractScore getContractScore(CalculateRuleVO rule, double deductScore, String num, String remark) { |
| | | ContractScore contractScore = new ContractScore(); |
| | | contractScore.setContractId(Long.parseLong(rule.getContractId() + "")); |
| | | contractScore.setAuditingStatus(AuditingStatus.PASS); |
| | | contractScore.setAuditingTime(new Date()); |
| | | contractScore.setAuditingUser(Remark); |
| | | contractScore.setUnitId(Long.parseLong(rule.getUnitId() + "")); |
| | | contractScore.setRuleId(Long.parseLong(rule.getId() + "")); |
| | | contractScore.setRuleIds("0," + rule.getId()); |
| | | contractScore.setNum(num); |
| | | contractScore.setDeductCategory(rule.getDeductCategory().getDesc()); |
| | | contractScore.setScore(new BigDecimal(deductScore)); |
| | | contractScore.setRuleName(rule.getRuleName() + "/" + rule.getRuleCondition()); |
| | | contractScore.setCreateTime(new Date()); |
| | | contractScore.setUpdateTime(new Date()); |
| | | contractScore.setRemark(remark); |
| | | return contractScore; |
| | | } |
| | | } |