fuliqi
2024-08-21 db86411bb09d9a3450d14a91125adb26a53cc191
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -3,20 +3,20 @@
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;
@@ -52,10 +52,13 @@
    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 = "系统生成";
    /**
     * 合同考核 在线率每日任务检测
@@ -66,9 +69,10 @@
     * 月底计算平均值,根据在线率和合同标准扣减分数
     */
    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(
@@ -116,13 +120,85 @@
                    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;
    }
}