From 0b8a348d0b978eeddfa3995b87cd11f7cbdd48a9 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期五, 23 八月 2024 17:42:05 +0800
Subject: [PATCH] 工单查询优化

---
 ycl-server/src/main/java/com/ycl/task/ContractTask.java |  286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 279 insertions(+), 7 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 a07570c..ac7cb70 100644
--- a/ycl-server/src/main/java/com/ycl/task/ContractTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -3,20 +3,22 @@
 
 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.PicAccessResult;
 import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
+import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
 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;
@@ -31,6 +33,7 @@
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
+
 
 /**
  * 鍚堝悓鑰冩牳瀹氭椂浠诲姟
@@ -52,10 +55,14 @@
     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 = "绯荤粺鐢熸垚";
+    private static final Integer randomSize = 50;
 
     /**
      * 鍚堝悓鑰冩牳 鍦ㄧ嚎鐜囨瘡鏃ヤ换鍔℃娴�
@@ -66,9 +73,12 @@
      * 鏈堝簳璁$畻骞冲潎鍊硷紝鏍规嵁鍦ㄧ嚎鐜囧拰鍚堝悓鏍囧噯鎵e噺鍒嗘暟
      */
     public void onlineCheck() {
-        List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
+        log.info("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼");
+        List<CalculateRuleVO> ruleVos = contractMapper.getCalculateRule(new Date()).stream()
+                .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_Online.getName().equals(calculateRuleVO.getRuleName()))
+                .collect(Collectors.toList());
         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鏄痷nitId value鏄澶囩紪鐮侀泦鍚�
         Map<Long, List<String>> unitMap = ywPoints.stream()
                 .collect(Collectors.groupingBy(
@@ -116,13 +126,275 @@
                     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("寮�濮嬭绠楀悎鍚岀偣浣嶅湪绾跨巼鍒嗘暟");
+        //濡傛灉鏄湀搴曪紝闇�瑕佺粺璁″钩鍧囧湪绾跨巼鐒跺悗杩涜绉垎鎵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));
+        //鏌ュ湪绾跨巼瑙勫垯 鑾峰彇key涓哄悎鍚宨d锛寁alue涓哄湪绾跨巼瑙勫垯鐨刴ap
+        Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream()
+                .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_Online.getName().equals(calculateRuleVO.getRuleName()))
+                .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.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);
+                        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;
+    }
+
+    /**
+     * 妫�娴嬪伐鍗曡〃 杩涜鍚堝悓绉垎鎵i櫎
+     * 鏌ュ嚭宸ュ崟闇�瑕佹墸鍒嗙殑鎵�鏈夎鍒�
+     * 鏌ュ嚭鏈墸鍒嗕笖宸茬粡瀹℃牳瀹屾垚浜嗙殑宸ュ崟缁勬垚map<unitId,List<WorkOrder>> 宸ュ崟闇�瑕佽繛宸ュ崟鏁呴殰琛ㄦ煡鍑哄涓晠闅滅被鍨�
+     * 寰幆宸ュ崟map锛屾瘡涓伐鍗曟晠闅滅被鍨嬫煡瀵瑰簲鐨勮鍒欙紝鏍规嵁瑙勫垯鍜屽伐鍗曞垱寤烘椂闂村拰瀹℃牳閫氳繃鏃堕棿杩涜鎵e垎
+     * 鎻掑叆鍚堝悓绉垎琛紝淇敼宸ュ崟鐘舵�佷负宸叉墸鍒�
+     */
+    public void workOrderDeduct() {
+        //鏌ヨ鐢熸晥鍚堝悓瀵瑰簲鎵�鏈夌殑瑙勫垯
+        List<CalculateRuleVO> calculateRules = contractMapper.getCalculateRule(new Date());
+        Map<String, Map<Integer, List<CalculateRuleVO>>> ruleMap = calculateRules.stream()
+                .collect(Collectors.groupingBy(
+                        CalculateRuleVO::getRuleName,  // 鎸夎鍒欏悕绉板垎缁�
+                        Collectors.groupingBy(
+                                CalculateRuleVO::getContractId // 姣忎釜瑙勫垯鍚嶇О鍐呴儴鍐嶆寜鍚堝悓ID鍒嗙粍,value涓鸿鍒欓泦鍚�
+                        )
+                ));
+        //鍓嶇鎰熺煡婧愭不鐞嗗伐浣滐紙鏃堕挓鍚屾瑙勫垯銆丱SD瑙勫垯銆佷竴鏈轰竴妗h鍒欙級 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map
+        Map<Integer, List<CalculateRuleVO>> monitorRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Monitor.getName());
+        //瀛樺偍鏁呴殰锛�24灏忔椂浠ュ唴锛�48灏忔椂浠ュ唴锛� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map
+        Map<Integer, List<CalculateRuleVO>> storeRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Store.getName());
+        //鐐逛綅寮傚父鎯呭喌澶勭悊 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map
+        Map<Integer, List<CalculateRuleVO>> siteRuleMap = ruleMap.get(ContractRule.CONTRACT_RULE_Site.getName());
+
+    }
+
+    /**
+     * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎
+     * 姣忓ぉ涓�娆¢殢鏈烘暟鍒ゆ柇鎴愬姛灏辨墽琛�
+     * 娴峰悍鍙栦汉鑴歌溅杈�
+     */
+    public void randomDeductPic() {
+        Random random = new Random();
+        //缁欏畾闅忔満鑼冨洿
+        int number = random.nextInt(randomSize);
+        if (number == 0) {
+            log.info("寮�濮嬫娊鏌ュ浘鐗囧畬鏁寸姸鎬�");
+            //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚�
+            List<ContractScore> contractScoreList = new ArrayList<>();
+
+            Date date = DateUtils.getDay(2024, 7, 13);
+            //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map
+            Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream()
+                    .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_PicComplete.getName().equals(calculateRuleVO.getRuleName()))
+                    .collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
+
+            //鍒ゆ柇杞﹁締銆佷汉鑴稿浘鐗囨槸鍚﹀彲鐢�
+            Query query = new Query(Criteria
+                    .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
+            List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class);
+            List<String> serialNumbers = picAccessResults.stream().map(PicAccessResult::getExternalIndexCode).collect(Collectors.toList());
+            QueryWrapper<YwPoint> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("serial_number", serialNumbers);
+            //鑾峰彇鍏徃鎵�杩愮淮鐨勮澶囬泦鍚堬紝key涓簎nitId value涓鸿澶囧浗鏍囩爜闆嗗悎
+            Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream()
+                    .collect(Collectors.groupingBy(YwPoint::getUnitId,
+                            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 (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);
+                }
+            });
+            contractScoreService.saveBatch(contractScoreList);
+            log.info("缁撴潫鎶芥煡鍥剧墖瀹屾暣鐘舵��");
+        }
+    }
+
+
+    /**
+     * 涓嶅畾鏈熸鏌ユ暟鎹� 鎵i櫎绉垎
+     * 姣忓ぉ涓�娆¢殢鏈烘暟鍒ゆ柇鎴愬姛灏辨墽琛�
+     * 浼樹簯鍙栧綍鍍�
+     */
+    public void randomDeductVideo() {
+        Random random = new Random();
+        //缁欏畾闅忔満鑼冨洿
+        int number = random.nextInt(randomSize);
+        if (number == 0) {
+            log.info("寮�濮嬫娊鏌ュ綍鍍忓畬鏁寸姸鎬�");
+            //鍑嗗鎵归噺鎵撳垎鐨勯泦鍚�
+            List<ContractScore> contractScoreList = new ArrayList<>();
+
+            Date date = DateUtils.getDay(2024, 7, 13);
+            //鏌ュ浘鐗囧畬鏁存�ц鍒� 鑾峰彇key涓哄悎鍚宨d锛寁alue涓鸿鍒欑殑map
+            Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream()
+                    .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_VideoRecord.getName().equals(calculateRuleVO.getRuleName()))
+                    .collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
+
+            //鍙栧綍鍍忔暟鎹�
+            Query query = new Query(Criteria
+                    .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
+            List<RecordMetaDSumResult> recordMetaDSumResults = mongoTemplate.find(query, RecordMetaDSumResult.class);
+            List<String> serialNumbers = recordMetaDSumResults.stream().map(RecordMetaDSumResult::getDeviceId).collect(Collectors.toList());
+            QueryWrapper<YwPoint> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("serial_number", serialNumbers);
+            //鑾峰彇鍏徃鎵�杩愮淮鐨勮澶囬泦鍚堬紝key涓簎nitId value涓鸿澶囧浗鏍囩爜闆嗗悎
+            Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream()
+                    .collect(Collectors.groupingBy(YwPoint::getUnitId,
+                            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);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                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);
+                }
+            });
+            contractScoreService.saveBatch(contractScoreList);
+            log.info("缁撴潫鎶芥煡鍥剧墖瀹屾暣鐘舵��");
+        }
     }
 }

--
Gitblit v1.8.0