From 316d54ecdc49ce1625b429f3d0bdca54af647e74 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期一, 02 十二月 2024 18:20:22 +0800
Subject: [PATCH] 地图积分区分视频车辆人脸

---
 ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java |  336 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 325 insertions(+), 11 deletions(-)

diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
index 3dae6eb..bf9cd3d 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/YwThresholdServiceImpl.java
@@ -1,27 +1,57 @@
 package com.ycl.platform.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.fastjson2.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ycl.dataListener.CurrencyDataListener;
 import com.ycl.platform.domain.entity.WorkOrder;
+import com.ycl.platform.domain.entity.WorkOrderWhite;
+import com.ycl.platform.domain.entity.YwPoint;
 import com.ycl.platform.domain.entity.YwThreshold;
+import com.ycl.platform.domain.excel.ErrorExport;
+import com.ycl.platform.domain.excel.PointExport;
+import com.ycl.platform.domain.excel.WorkOrderWhiteExport;
+import com.ycl.platform.domain.query.WorkOrderWhiteQuery;
 import com.ycl.platform.domain.result.HK.FaceDeviceInspectionResult;
 import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult;
+import com.ycl.platform.domain.vo.DynamicColumnVO;
+import com.ycl.platform.mapper.WorkOrderWhiteMapper;
 import com.ycl.platform.mapper.YwThresholdMapper;
 import com.ycl.platform.service.IYwThresholdService;
 import com.ycl.platform.service.WorkOrderService;
+import com.ycl.system.Result;
+import com.ycl.system.page.PageUtil;
+import com.ycl.utils.SecurityUtils;
+import com.ycl.utils.StringUtils;
 import com.ycl.utils.ip.PingUtil;
+import com.ycl.utils.poi.EasyExcelImportUtils;
+import com.ycl.utils.uuid.IdUtils;
+import constant.PointHeaderConstant;
 import constant.YwThreadConstants;
 import enumeration.CompareType;
 import enumeration.ErrorType;
 import enumeration.general.BusinessTypeEnum;
 import enumeration.general.WorkOrderStatusEnum;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 import utils.DateUtils;
 
+import java.io.IOException;
+import java.io.OutputStream;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -40,6 +70,8 @@
     @Autowired
     private WorkOrderService workOrderService;
 
+    @Autowired
+    private WorkOrderWhiteMapper workOrderWhiteMapper;
     /**
      * 鏌ヨ杩愮淮闃堝��
      *
@@ -154,9 +186,9 @@
     @Override
     public void faceCheck(List<FaceDeviceInspectionResult> list) {
         Map<String, YwThreshold> thresholdMap = getYwThresholdMap(BusinessTypeEnum.FACE.name());
-        //鍑嗗涓嬪彂宸ュ崟闆嗗悎
+        //鍑嗗寰呬笅鍙戝伐鍗曢泦鍚�
         List<WorkOrder> distributeList = new ArrayList<>();
-        //鍑嗗鑷姩鐢熸垚宸ュ崟闆嗗悎
+        //鍑嗗鐩存帴涓嬪彂宸ュ崟闆嗗悎
         List<WorkOrder> workOrderList = new ArrayList<>();
         //澶勭悊鎺ュ彛鏁版嵁
         for (FaceDeviceInspectionResult result : list) {
@@ -239,9 +271,11 @@
             //妫�鏌ョ櫧澶╂湭璇嗗埆閲�
             Integer dayNoNumberCountResult = result.getSnapPlate().getDayNoNumberCount();
             check(YwThreadConstants.Car_DayNoNumberCount, dayNoNumberCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.UNRECOGNIZED_DAY_VOLUME.getValue());
-            //杞﹁締涓昏灞炴�т笉瀹屾暣鐜�
+            //杞﹁締涓昏灞炴�т竴鑷寸巼
             Integer noIntegrityCountResult = result.getIntegrity().getMainNoIntegrityCount();
-            check(YwThreadConstants.Car_NoIntegrityCount, noIntegrityCountResult, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.MORE_THAN_EQ, ErrorType.CAR_SIX.getValue());
+            Integer dataCount = result.getDataCount();
+            Double integrityRate = ((double)dataCount-noIntegrityCountResult)/dataCount;
+            check(YwThreadConstants.Car_NoIntegrityCount, integrityRate, result.getExternalIndexCode(), thresholdMap, workOrder, CompareType.LESS_THAN_EQ, ErrorType.CAR_SIX.getValue());
             // 鐐逛綅鍦ㄧ嚎鐜�
             if (2 == result.getSnapResult()) {
                 workOrder.setSerialNumber(result.getExternalIndexCode());
@@ -262,6 +296,7 @@
         /** 娣诲姞宸ュ崟 */
         workOrderService.innerAddWorkOrder(workOrderList);
         workOrderService.innerAddWorkOrder(distributeList);
+
     }
 
     /**
@@ -280,6 +315,264 @@
     }
 
     /**
+     * 鐧藉悕鍗曡鎯�
+     * @param id
+     * @return
+     */
+    @Override
+    public Result selectWorkOrderWhiteDetail(Integer id) {
+        WorkOrderWhite workOrderWhite = workOrderWhiteMapper.getById(id);
+        List<String> errorTypeList = Arrays.asList(workOrderWhite.getErrorType().split(","));
+        workOrderWhite.setErrorTypeList(errorTypeList);
+        return Result.ok().data(workOrderWhite);
+    }
+    /**
+     * 宸ュ崟鐧藉悕鍗曞垪琛�
+     *
+     * @param query 鏌ヨ
+     * @return {@link List }<{@link WorkOrderWhite }>
+     * @author
+     */
+    @Override
+    public Result selectWorkOrderWhiteList(WorkOrderWhiteQuery query) {
+        IPage<WorkOrderWhite> page = PageUtil.getPage(query, WorkOrderWhite.class);
+        workOrderWhiteMapper.page(page, query);
+        List<WorkOrderWhite> records = page.getRecords();
+        records.forEach(white-> {
+            List<String> errorTextList = new ArrayList<>();
+            List<String> errorTypeList = Arrays.asList(white.getErrorType().split(","));
+            errorTypeList.forEach(error->{
+                String errorText = ErrorType.getDescriptionByValue(error);
+                errorTextList.add(errorText);
+            });
+            white.setErrorType(String.join(",", errorTextList));
+        });
+        return Result.ok().data(records).total(page.getTotal());
+    }
+
+    /**
+     * 娣诲姞宸ュ崟鐧藉悕鍗�
+     *
+     * @param workOrderWhite 鐧借壊宸ュ崟
+     * @return {@link Result }
+     * @author
+     */
+    @Override
+    public Result addWorkOrderWhite(WorkOrderWhite workOrderWhite) {
+        // 妫�鏌ユ槸鍚﹀凡缁忓瓨鍦ㄨ鐧藉悕鍗�
+        WorkOrderWhite flag = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber());
+        if (flag != null) {
+            return Result.error("璇ヨ澶囧凡瀛樺湪鐧藉悕鍗�");
+        } else {
+            List<String> errorTypeList = workOrderWhite.getErrorTypeList();
+            workOrderWhite.setErrorType(String.join(",",errorTypeList));
+            workOrderWhite.setCreateBy(SecurityUtils.getUsername());
+            workOrderWhiteMapper.insert(workOrderWhite);
+            return Result.ok();
+        }
+    }
+    /**
+     * 淇敼宸ュ崟鐧藉悕鍗�
+     *
+     * @param workOrderWhite 鐧借壊宸ュ崟
+     * @return {@link Result }
+     * @author
+     */
+    @Override
+    public Result updateWorkOrderWhite(WorkOrderWhite workOrderWhite) {
+        WorkOrderWhite white = workOrderWhiteMapper.selectBySerialNumber(workOrderWhite.getSerialNumber());
+        workOrderWhite.setId(white.getId());
+        List<String> errorTypeList = workOrderWhite.getErrorTypeList();
+        workOrderWhite.setErrorType(String.join(",",errorTypeList));
+        workOrderWhiteMapper.updateById(workOrderWhite);
+        return Result.ok();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎宸ュ崟鐧藉悕鍗�
+     *
+     * @param ids ids
+     * @author
+     */
+    @Override
+    public Result batchDeleteWorkOrderWhite(List<String> ids) {
+        workOrderWhiteMapper.batchDelete(ids);
+        return Result.ok();
+    }
+    /**
+     * 鐧藉悕鍗曞鍑�
+     * @param response
+     * @throws IOException
+     */
+    @Override
+    public void whiteExport(HttpServletResponse response) throws IOException {
+        //鐧藉悕鍗曟暟鎹�
+        List<WorkOrderWhiteExport> data = workOrderWhiteMapper.whiteExport();
+        data.forEach(white-> {
+            List<String> errorTextList = new ArrayList<>();
+            List<String> errorTypeList = Arrays.asList(white.getErrorType().split(","));
+            errorTypeList.forEach(error->{
+                String errorText = ErrorType.getDescriptionByValue(error);
+                errorTextList.add(errorText);
+            });
+            white.setErrorType(String.join(",", errorTextList));
+        });
+        //鏁呴殰绫诲瀷鏁版嵁
+        List<String> errorTextList = ErrorType.getDescriptionList();
+        List<ErrorExport> errorExports = new ArrayList<>();
+        errorTextList.forEach(error -> {
+            ErrorExport errorExport = new ErrorExport();
+            errorExport.setError(error);
+            errorExports.add(errorExport);
+        });
+        ExcelWriter excelWriter = null;
+        try(OutputStream outputStream = response.getOutputStream()) {
+            excelWriter = EasyExcel.write(outputStream).build();
+
+            WriteSheet whiteSheet = EasyExcel.writerSheet(0, "宸ュ崟鐧藉悕鍗曟竻鍗�").head(WorkOrderWhiteExport.class).build();
+            WriteSheet errorSheet = EasyExcel.writerSheet(1, "鏁呴殰绫诲瀷").head(ErrorExport.class).build();
+
+            excelWriter.write(data, whiteSheet);
+            excelWriter.write(errorExports, errorSheet);
+            excelWriter.finish();
+            outputStream.flush();
+        }catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                excelWriter.finish();
+                response.getOutputStream().close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+
+    /**
+     * 瀵煎叆宸ュ崟鐧藉悕鍗�
+     * @param file
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result importWhite(MultipartFile file) throws IOException{
+//        Consumer<List<WorkOrderWhiteExport>> consumer = (dataList) -> {
+//            try {
+//                this.updateWhite(dataList);
+//            } catch (ExecutionException e) {
+//                e.printStackTrace();
+//            } catch (InterruptedException e) {
+//                e.printStackTrace();
+//            }
+//        };
+//        EasyExcel.read(file.getInputStream(), WorkOrderWhiteExport.class, new CurrencyDataListener(consumer))
+//                .sheet()
+//                .headRowNumber(1)
+//                .doRead();
+        List<WorkOrderWhiteExport> dataList = new ArrayList<>();
+        EasyExcel.read(file.getInputStream(), WorkOrderWhiteExport.class, new AnalysisEventListener<WorkOrderWhiteExport>() {
+            @Override
+            public void invoke(WorkOrderWhiteExport excel, AnalysisContext analysisContext) {
+                // 灏嗚鍙栧埌鐨勬瘡涓�琛屽瓨鍏eportDetails闆嗗悎涓�
+                dataList.add(excel);
+            }
+            @Override
+            public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
+        }).sheet().doRead();
+
+        if (CollectionUtils.isEmpty(dataList)) {
+            throw new RuntimeException("瀵煎叆鏁版嵁涓嶈兘涓虹┖");
+        }
+        boolean duplic = checkDuplic(dataList);
+        if(duplic) throw new RuntimeException("瀛樺湪閲嶅鍥芥爣璁惧");
+        //宸插瓨鍦ㄧ殑鐧藉悕鍗�
+        Map<String, WorkOrderWhite> whiteMap = workOrderWhiteMapper.selectList().stream().collect(Collectors.toMap(WorkOrderWhite::getSerialNumber, Function.identity()));
+        List<WorkOrderWhite> addList = new ArrayList<>();
+        dataList.stream().forEach(item -> {
+            WorkOrderWhite white = new WorkOrderWhite();
+            //鍥芥爣鐮�
+            white.setSerialNumber(item.getSerialNumber());
+            //澶囨敞
+            white.setRemark(item.getRemark());
+            String errorType = item.getErrorType();
+            if(StringUtils.isEmpty(errorType)){
+                throw new RuntimeException("鍥芥爣鐮佷负"+item.getSerialNumber()+"鐨勮澶囨晠闅滀笉鑳戒负绌�");
+            }
+            try {
+                List<String> errorDataList = new ArrayList<>();
+                List<String> errorExcelList = Arrays.asList(item.getErrorType().split(","));
+                errorExcelList.forEach(desc->{
+                    //鎶婁腑鏂囪浆鎹负鏁版嵁搴撳瓨鍌ㄦ牸寮�
+                    String errorText = ErrorType.getValueByDescription(desc);
+                    //鎵句笉鍒版姏鍑哄紓甯�
+                    if(errorText == null) throw new RuntimeException("鍥芥爣鐮佷负"+item.getSerialNumber()+"鐨勮澶囨晠闅滅被鍨嬫湁璇�");
+                    errorDataList.add(errorText);
+                });
+                white.setErrorType(String.join(",", errorDataList));
+                //濡傛灉宸插瓨鍦ㄨˉ鍏卛d
+                WorkOrderWhite whiteExsit = whiteMap.get(white.getSerialNumber());
+                if(whiteExsit!=null) white.setId(whiteExsit.getId());
+                addList.add(white);
+            } catch (Exception e) {
+                throw new RuntimeException("鍥芥爣鐮佷负"+item.getSerialNumber()+"鐨勮澶囨晠闅滅被鍨嬫湁璇�");
+            }
+        });
+        if(!CollectionUtils.isEmpty(addList)) {
+            workOrderWhiteMapper.deleteAll();
+            workOrderWhiteMapper.insertBatch(addList);
+        }
+        return Result.ok();
+    }
+    /**
+     * 淇敼鐧藉悕鍗�
+     *
+     * @param dataList
+     * @param unitId
+     */
+    public void updateWhite(List<WorkOrderWhiteExport> dataList) throws ExecutionException, InterruptedException {
+        if (CollectionUtils.isEmpty(dataList)) {
+            throw new RuntimeException("瀵煎叆鏁版嵁涓嶈兘涓虹┖");
+        }
+        //宸插瓨鍦ㄧ殑鐧藉悕鍗�
+        List<String> serialNumbers = workOrderWhiteMapper.selectList().stream().map(WorkOrderWhite::getSerialNumber).collect(Collectors.toList());
+        List<WorkOrderWhite> addList = new ArrayList<>();
+        List<WorkOrderWhite> updateList = new ArrayList<>();
+        dataList.stream().forEach(item -> {
+            WorkOrderWhite white = new WorkOrderWhite();
+            //鍥芥爣鐮�
+            white.setSerialNumber(item.getSerialNumber());
+            //澶囨敞
+            white.setRemark(item.getRemark());
+            String errorType = item.getErrorType();
+            if(StringUtils.isEmpty(errorType)){
+                throw new RuntimeException("鍥芥爣鐮佷负"+item.getSerialNumber()+"鐨勮澶囨晠闅滀笉鑳戒负绌�");
+            }
+            try {
+                List<String> errorDataList = new ArrayList<>();
+                List<String> errorExcelList = Arrays.asList(item.getErrorType().split(","));
+                errorExcelList.forEach(desc->{
+                    //鎶婁腑鏂囪浆鎹负鏁版嵁搴撳瓨鍌ㄦ牸寮�
+                    String errorText = ErrorType.getValueByDescription(desc);
+                    //鎵句笉鍒版姏鍑哄紓甯�
+                    if(errorText == null) throw new RuntimeException("鍥芥爣鐮佷负"+item.getSerialNumber()+"鐨勮澶囨晠闅滅被鍨嬫湁璇�");
+                    errorDataList.add(errorText);
+                });
+                white.setErrorType(String.join(",", errorDataList));
+                if(!CollectionUtils.isEmpty(serialNumbers) && serialNumbers.contains(white.getSerialNumber())){
+                    updateList.add(white);
+                }else {
+                    addList.add(white);
+                }
+            } catch (Exception e) {
+                throw new RuntimeException("鍥芥爣鐮佷负"+item.getSerialNumber()+"鐨勮澶囨晠闅滅被鍨嬫湁璇�");
+            }
+        });
+        if(!CollectionUtils.isEmpty(addList)) workOrderWhiteMapper.insertBatch(addList);
+        if(!CollectionUtils.isEmpty(updateList)) workOrderWhiteMapper.updateBatch(updateList);
+    }
+
+    /**
      * 妫�鏌ラ槇鍊�
      *
      * @param key 鏌愰槇鍊兼爣璇�
@@ -295,23 +588,33 @@
                 v -> {
                     YwThreshold ywThreshold = thresholds.get(key);
                     //杞崲绫诲瀷
-                    T thresholdValue = parseThreshold(ywThreshold.getValueAuto(), value.getClass());
-                    T thresholdAutoValue = parseThreshold(ywThreshold.getValue(), value.getClass());
+                    //寰呭伐鍗曢槇鍊�
+                    T thresholdAutoValue = parseThreshold(ywThreshold.getValueAuto(), value.getClass());
+                    //鐩存帴涓嬪彂宸ュ崟闃堝��
+                    T thresholdValue = parseThreshold(ywThreshold.getValue(), value.getClass());
+                    if("percent".equals(ywThreshold.getCountType())){
+                        if (thresholdAutoValue instanceof Float) {
+                            thresholdAutoValue = (T) Float.valueOf(((Float) thresholdAutoValue) / 100f);
+                        }
+                        if (thresholdValue instanceof Float) {
+                            thresholdValue = (T) Float.valueOf(((Float) thresholdValue) / 100f);
+                        }
+                    }
                     //姣旇緝澶у皬锛屽姞鍏ュ埌瀵瑰簲寰呭鐞嗛泦鍚�
-                    if (compareType.compare(v, thresholdAutoValue)) {
-                        //鑷姩涓嬪彂宸ュ崟
+                    if (compareType.compare(v, thresholdValue)) {
+                        //杩涘叆宸ュ崟鐩存帴涓嬪彂
                         workOrder.setSerialNumber(serialNumber);
-                        workOrder.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE);
+                        workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
                         if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) {
                             workOrder.setErrorTypeList(new ArrayList<>());
                             workOrder.getErrorTypeList().add(errorType);
                         } else {
                             workOrder.getErrorTypeList().add(errorType);
                         }
-                    } else if (compareType.compare(v, thresholdValue)) {
+                    } else if (compareType.compare(v, thresholdAutoValue)) {
                         //杩涘叆宸ュ崟浠d笅鍙�
                         workOrder.setSerialNumber(serialNumber);
-                        workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
+                        workOrder.setStatus(WorkOrderStatusEnum.WAIT_DISTRIBUTE);
                         if (CollectionUtils.isEmpty(workOrder.getErrorTypeList())) {
                             workOrder.setErrorTypeList(new ArrayList<>());
                             workOrder.getErrorTypeList().add(errorType);
@@ -338,4 +641,15 @@
         }
     }
 
+    public static boolean checkDuplic(List<WorkOrderWhiteExport> dataList) {
+        Set<String> serialNumbers = new HashSet<>();
+
+        for (WorkOrderWhiteExport white : dataList) {
+            String serialNumber = white.getSerialNumber();
+            if (!serialNumbers.add(serialNumber)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

--
Gitblit v1.8.0