| | |
| | | |
| | | 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.entity.*; |
| | | 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.platform.service.IContractScoreService; |
| | | import com.ycl.utils.DateUtils; |
| | | import constant.ApiConstants; |
| | | import constant.RedisConstant; |
| | | import enumeration.ContractRule; |
| | | import enumeration.general.AuditingStatus; |
| | | import enumeration.general.RuleDeductCategoryEnum; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.mongodb.core.MongoTemplate; |
| | |
| | | private ReportMapper reportMapper; |
| | | @Autowired |
| | | private ContractRuleRecordMapper recordMapper; |
| | | @Autowired |
| | | private IContractScoreService contractScoreService; |
| | | |
| | | private static final Integer Online = 1; |
| | | private static final Integer Offline = -1; |
| | | private static final String AuditStatus_Pass = "1"; |
| | | private static final String Remark = "系统生成"; |
| | | |
| | | /** |
| | | * 合同考核 在线率每日任务检测 |
| | |
| | | * 月底计算平均值,根据在线率和合同标准扣减分数 |
| | | */ |
| | | public void onlineCheck() { |
| | | log.info("开始计算合同点位在线率"); |
| | | 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)); |
| | | List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unit_id", unitIds)); |
| | | //key是unitId value是设备编码集合 |
| | | Map<Long, List<String>> unitMap = ywPoints.stream() |
| | | .collect(Collectors.groupingBy( |
| | |
| | | onlineSite++; |
| | | } |
| | | } |
| | | BigDecimal online = new BigDecimal(onlineSite).divide(new BigDecimal(totalSite), 2, RoundingMode.DOWN); |
| | | ContractRuleRecord contractRuleRecord = new ContractRuleRecord(); |
| | | contractRuleRecord.setSiteOnline( onlineSite / totalSite); |
| | | contractRuleRecord.setSiteOnline(online); |
| | | contractRuleRecord.setCreateTime(new Date()); |
| | | contractRuleRecord.setUnitId(unitId); |
| | | ruleRecordList.add(contractRuleRecord); |
| | | }); |
| | | //存储结果 |
| | | recordMapper.insertBatch(ruleRecordList); |
| | | log.info("结束计算合同点位在线率"); |
| | | } |
| | | |
| | | //月底计算在线率分数 |
| | | public void calculateOnlineScore() { |
| | | log.info("开始计算合同点位在线率分数"); |
| | | //如果是月底,需要统计平均在线率然后进行积分扣除 |
| | | // String now = DateUtils.getDate(); |
| | | String mouthStart = DateUtils.getMouthStart(new Date()); |
| | | String mouthEnd = DateUtils.getMouthEnd(new Date()); |
| | | // if (now.equals(mouthEnd)) { |
| | | //查一个月的记录 |
| | | List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd); |
| | | //通过unitId分单位 |
| | | Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId)); |
| | | //查在线率规则 |
| | | List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date()); |
| | | //获取key为合同id,value为在线率规则的map |
| | | Map<Integer, List<CalculateRuleVO>> contractMap = ruleVos.stream().collect(Collectors.groupingBy(CalculateRuleVO::getContractId)); |
| | | //准备批量打分的集合 |
| | | List<ContractScore> contractScoreList = new ArrayList<>(); |
| | | contractMap.forEach((contractId, ruleList) -> { |
| | | //一个合同对应一个单位,因此unitId都相同 |
| | | CalculateRuleVO calculateRuleVO = ruleList.get(0); |
| | | Integer unitId = calculateRuleVO.getUnitId(); |
| | | List<ContractRuleRecord> ruleRecordList = unitMap.get(Long.parseLong(unitId + "")); |
| | | if (!CollectionUtils.isEmpty(ruleMonthRecords)) { |
| | | BigDecimal siteOnlineTotal = ruleRecordList.stream().map(ContractRuleRecord::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | BigDecimal siteOnline = siteOnlineTotal.divide(new BigDecimal(ruleRecordList.size()), 2, RoundingMode.DOWN); |
| | | for (CalculateRuleVO ruleVO : ruleList) { |
| | | Double max = ruleVO.getMax(); |
| | | Double min = ruleVO.getMin(); |
| | | //判断范围在哪个区间 |
| | | 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.WAIT); |
| | | 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); |
| | | contractScoreList.add(contractScore); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | // } |
| | | contractScoreService.saveBatch(contractScoreList); |
| | | 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; |
| | | } |
| | | |
| | | } |