From db86411bb09d9a3450d14a91125adb26a53cc191 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期三, 21 八月 2024 17:50:54 +0800
Subject: [PATCH] 合同在线率 打分

---
 ycl-server/src/main/java/com/ycl/task/ContractTask.java |  176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 172 insertions(+), 4 deletions(-)

diff --git a/ycl-server/src/main/java/com/ycl/task/ContractTask.java b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
index bb95a81..4fc6abd 100644
--- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -1,12 +1,36 @@
 package com.ycl.task;
 
 
-import com.ycl.platform.mapper.TContractMapper;
-import com.ycl.platform.mapper.TMonitorMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mongodb.client.result.DeleteResult;
+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;
+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;
 
 /**
  * 鍚堝悓鑰冩牳瀹氭椂浠诲姟
@@ -17,20 +41,164 @@
     @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;
+    @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 = "绯荤粺鐢熸垚";
 
     /**
      * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴�
      * 鏌ョ敓鏁堢殑鍚堝悓鍏宠仈鐨勫叕鍙革紝鑾峰彇unitId闆嗗悎
      * 鏍规嵁unitId鏌ヨ瀵瑰簲鐐逛綅鑾峰彇鍚勪釜鍏徃绠$悊鐨勮澶嘔ds
      * 鏌ヨ涓夌璁惧鍦ㄧ嚎涓嶅湪绾挎儏鍐碉紝灏佽涓轰竴涓猰ap<鍥芥爣鐮�,鍦ㄧ嚎鐘舵��>
-     * 璁$畻姣忔棩姣忓鍏徃鐨勫湪绾跨巼瀛樺叆redis
+     * 璁$畻姣忔棩姣忓鍏徃鐨勫湪绾跨巼瀛樺叆mysql
      * 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵e噺鍒嗘暟
      */
     public void onlineCheck() {
-//        contractMapper.selectByRuleName();
+        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("unit_id", unitIds));
+        //key鏄痷nitId 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<>();
+        //鏌ongo鑾峰彇璁惧鍦ㄧ嚎鎯呭喌
+        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++;
+                }
+            }
+            BigDecimal online = new BigDecimal(onlineSite).divide(new BigDecimal(totalSite), 2, RoundingMode.DOWN);
+            ContractRuleRecord contractRuleRecord = new ContractRuleRecord();
+            contractRuleRecord.setSiteOnline(online);
+            contractRuleRecord.setCreateTime(new Date());
+            contractRuleRecord.setUnitId(unitId);
+            ruleRecordList.add(contractRuleRecord);
+        });
+        //瀛樺偍缁撴灉
+        recordMapper.insertBatch(ruleRecordList);
+        log.info("缁撴潫璁$畻鍚堝悓鐐逛綅鍦ㄧ嚎鐜�");
+    }
+
+    //鏈堝簳璁$畻鍦ㄧ嚎鐜囧垎鏁�
+    public void calculateOnlineScore() {
+        log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼鍒嗘暟");
+        //濡傛灉鏄湀搴曪紝闇�瑕佺粺璁″钩鍧囧湪绾跨巼鐒跺悗杩涜绉垎鎵i櫎
+//        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涓哄悎鍚宨d锛寁alue涓哄湪绾跨巼瑙勫垯鐨刴ap
+            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;
     }
 
 }

--
Gitblit v1.8.0