From 60c2c06c064008586dece2762fcaeb90b8d739be Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 22 八月 2024 16:38:29 +0800
Subject: [PATCH] 点位导入优化

---
 ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml                    |   20 +++
 ycl-server/src/main/java/com/ycl/thread/PointImportCallable.java               |   59 +++++++++++
 ycl-server/src/main/java/com/ycl/platform/mapper/YwPointMapper.java            |    7 +
 ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java          |   27 +++--
 ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java    |   28 ++++-
 ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java |   99 ++++++++++++++++---
 ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java          |    2 
 7 files changed, 203 insertions(+), 39 deletions(-)

diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java
index df9e471..0fac11f 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java
@@ -4,6 +4,7 @@
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.format.DateTimeFormat;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
 import lombok.Data;
 
 import java.util.Date;
@@ -18,27 +19,28 @@
 public class PointExport {
 
     @ColumnWidth(50)
-    @ExcelProperty("鐐逛綅鍚嶇О")
+    @ExcelProperty("鐐逛綅鍚嶇О(鍙慨鏀�)")
+
     private String pointName;
 
     @ColumnWidth(30)
-    @ExcelProperty("鍥芥爣鐮�")
+    @ExcelProperty("鍥芥爣鐮�(涓嶅彲淇敼)")
     private String serialNumber;
 
-    @ColumnWidth(16)
-    @ExcelProperty("鐐逛綅IP")
+    @ColumnWidth(30)
+    @ExcelProperty("鐐逛綅IP(鍙慨鏀�)")
     private String pointIP;
 
     @ColumnWidth(40)
-    @ExcelProperty("褰撳墠杩愮淮鍗曚綅")
+    @ExcelProperty("褰撳墠杩愮淮鍗曚綅(瀵煎叆鐣岄潰鍙敼)")
     private String unitName;
 
-    @ColumnWidth(16)
+    @ColumnWidth(40)
     @DateTimeFormat("yyyy-MM-dd")
     @ExcelProperty("杩愮淮寮�濮嬫椂闂�")
     private Date startTime;
 
-    @ColumnWidth(16)
+    @ColumnWidth(40)
     @DateTimeFormat("yyyy-MM-dd")
     @ExcelProperty("杩愮淮缁撴潫鏃堕棿")
     private Date endTime;
@@ -46,19 +48,20 @@
     @ExcelIgnore
     private Boolean provinceTag;
 
-    @ExcelProperty("鏄惁鐪佸巺鏍囩")
+    @ColumnWidth(20)
+    @ExcelProperty("鏄惁鐪佸巺鏍囩(鍙慨鏀�)")
     private String provinceTagString;
 
     @ExcelIgnore
     private Boolean importantTag;
 
-    @ExcelProperty("鏄惁閲嶇偣鐐逛綅")
-    private String importantTagString;
+//    @ExcelProperty("鏄惁閲嶇偣鐐逛綅")
+//    private String importantTagString;
 
     @ExcelIgnore
     private Boolean importantCommandImageTag;
 
-    @ColumnWidth(16)
-    @ExcelProperty("鏄惁閲嶇偣鎸囨尌鍥惧儚")
+    @ColumnWidth(20)
+    @ExcelProperty("鏄惁閲嶇偣鎸囨尌鍥惧儚(鍙慨鏀�)")
     private String importantCommandImageTagString;
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java b/ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java
index b85ddb5..238f2f6 100644
--- a/ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java
+++ b/ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java
@@ -7,10 +7,13 @@
 import jakarta.validation.constraints.NotBlank;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import lombok.RequiredArgsConstructor;
 
 import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import org.springframework.validation.annotation.Validated;
@@ -115,15 +118,26 @@
         ywPointService.export(query, response);
     }
 
-    @PostMapping("/import/{unitId}")
+    @PostMapping("/import")
     @ApiOperation(value = "瀵煎叆鏁版嵁", notes = "瀵煎叆鏁版嵁")
     public Result importData(MultipartFile file,
-                             @PathVariable("unitId") Integer unitId,
-                             @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
-                             @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime,
-                             Boolean provinceTag,
-                             Boolean importantCommandImageTag) throws IOException {
-        return ywPointService.importData(file, unitId, startTime, endTime, provinceTag, importantCommandImageTag);
+                             Integer unitId,
+                             String startTime,
+                             String endTime) throws IOException, ParseException {
+        Date start = null;
+        Date end = null;
+        if (-1 == unitId) {
+            unitId = null;
+        }
+        if (StringUtils.hasText(startTime)) {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            start = format.parse(startTime);
+        }
+        if (StringUtils.hasText(startTime)) {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            end = format.parse(endTime);
+        }
+        return ywPointService.importData(file, unitId, start, end);
     }
 
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/YwPointMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/YwPointMapper.java
index a7eafd9..3f8d0ba 100644
--- a/ycl-server/src/main/java/com/ycl/platform/mapper/YwPointMapper.java
+++ b/ycl-server/src/main/java/com/ycl/platform/mapper/YwPointMapper.java
@@ -51,4 +51,11 @@
     List<PointExport> export(@Param("query") YwPointQuery query);
 
     void deleteAll();
+
+    /**
+     * 鏇存柊鐐逛綅淇℃伅
+     *
+     * @param point
+     */
+    int updatePoint(@Param("point") YwPoint point);
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java b/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
index 61e329d..79d6f48 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
@@ -121,5 +121,5 @@
      * @param unitId 杩愮淮鍗曚綅id
      * @return
      */
-    Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime, Boolean provinceTag, Boolean importantCommandImageTag) throws IOException;
+    Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime) throws IOException;
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
index e41a9c8..0d8ccb3 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
@@ -23,11 +23,13 @@
 import com.ycl.system.Result;
 import com.ycl.system.mapper.SysDeptMapper;
 import com.ycl.system.page.PageUtil;
+import com.ycl.thread.PointImportCallable;
 import com.ycl.utils.DateUtils;
 import com.ycl.utils.SecurityUtils;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
@@ -36,9 +38,8 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.concurrent.*;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -55,6 +56,14 @@
     private final SysDeptMapper sysDeptMapper;
     private final YwUnitService unitService;
     private final YwPeopleMapper ywPeopleMapper;
+
+    private static final ExecutorService executorService = new ThreadPoolExecutor(8,
+            24,
+            5000,
+            TimeUnit.SECONDS,
+            new ArrayBlockingQueue<>(10),
+            new ThreadPoolExecutor.CallerRunsPolicy()
+    );
 
     /**
      * 娣诲姞
@@ -238,16 +247,21 @@
     public void export(YwPointQuery query, HttpServletResponse response) throws IOException {
         // 瀵煎嚭鏁版嵁
         List<PointExport> exportData = baseMapper.export(query);
-
         EasyExcel.write(response.getOutputStream(), PointExport.class)
                 .sheet("鐐逛綅鏇存崲杩愮淮鍗曚綅")
                 .doWrite(exportData);
     }
 
     @Override
-    public Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime, Boolean provinceTag, Boolean importantCommandImageTag) throws IOException {
+    public Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime) throws IOException {
         Consumer<List<PointExport>> consumer = (dataList) -> {
-            this.updatePoint(dataList, unitId, startTime, endTime, provinceTag, importantCommandImageTag);
+            try {
+                this.updatePoint(dataList, unitId, startTime, endTime);
+            } catch (ExecutionException e) {
+                e.printStackTrace();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
         };
         EasyExcel.read(file.getInputStream(), PointExport.class , new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll();
         return Result.ok();
@@ -259,19 +273,72 @@
      * @param dataList
      * @param unitId
      */
-    private void updatePoint(List<PointExport> dataList, Integer unitId, Date startTime, Date endTime, Boolean provinceTag, Boolean importantCommandImageTag) {
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePoint(List<PointExport> dataList, Integer unitId, Date startTime, Date endTime) throws ExecutionException, InterruptedException {
         if (CollectionUtils.isEmpty(dataList)) {
             throw new RuntimeException("瀵煎叆鏁版嵁涓嶈兘涓虹┖");
         }
-        List<String> pointList = dataList.stream().map(PointExport::getSerialNumber).collect(Collectors.toList());
-        new LambdaUpdateChainWrapper<>(baseMapper)
-                .in(YwPoint::getSerialNumber, pointList)
-                .set(YwPoint::getUnitId, unitId)
-                .set(YwPoint::getStartTime, startTime)
-                .set(YwPoint::getEndTime, endTime)
-                .set(YwPoint::getProvinceTag, provinceTag)
-                .set(YwPoint::getImportantCommandImageTag, importantCommandImageTag)
-                .update();
+        List<YwPoint> pointList = dataList.stream().map(item -> {
+            YwPoint point = new YwPoint();
+            point.setImportantCommandImageTag("鏄�".equals(item.getImportantCommandImageTagString()));
+            point.setProvinceTag("鏄�".equals(item.getProvinceTagString()));
+            if (Objects.nonNull(unitId)) {
+                point.setUnitId(Long.valueOf(unitId));
+            }
+            point.setStartTime(startTime);
+            point.setEndTime(endTime);
+            point.setPointName(item.getPointName());
+            point.setSerialNumber(item.getSerialNumber());
+            return point;
+        }).collect(Collectors.toList());
+        this.waitAllFinishAndGetResult(pointList);
+//        for (PointExport pointExport : dataList) {
+//            YwPoint point = new YwPoint();
+//            point.setImportantCommandImageTag("鏄�".equals(pointExport.getImportantCommandImageTagString()));
+//            point.setProvinceTag("鏄�".equals(pointExport.getProvinceTagString()));
+//            point.setUnitId(Long.valueOf(unitId));
+//            point.setStartTime(startTime);
+//            point.setEndTime(endTime);
+//            point.setPointName(pointExport.getPointName());
+//            point.setSerialNumber(pointExport.getSerialNumber());
+//            this.baseMapper.updatePoint(point);
+//        }
+    }
+
+    public void waitAllFinishAndGetResult(List<YwPoint> dataList) throws InterruptedException, ExecutionException {
+        List<FutureTask<Boolean>> resultList = new ArrayList<>(512);
+        List<Boolean> data = new ArrayList<>(512);
+        int start = 0;
+        Date startTime = new Date();
+        while (true) {
+            if (dataList.size() < start + 50) {
+                List<YwPoint> list = dataList.subList(start, dataList.size() - 1);
+                Callable<Boolean> callable = new PointImportCallable(list, this.baseMapper);
+                FutureTask<Boolean> futureTask = new FutureTask(callable);
+                Thread thread = new Thread(futureTask);
+                thread.start();
+                // 涓嶈兘鐩存帴璋冪敤Future鐨刧et鏂规硶锛屽惁鍒欏氨鍙樻垚涓茶鎵ц浜嗭紝澶卞幓澶氱嚎绋嬫剰涔�
+                resultList.add(futureTask);
+                break;
+            } else {
+                List<YwPoint> list = dataList.subList(start, start + 50);
+                Callable<Boolean> callable = new PointImportCallable(list, this.baseMapper);
+                FutureTask<Boolean> futureTask = new FutureTask(callable);
+                Thread thread = new Thread(futureTask);
+                thread.start();
+                // 涓嶈兘鐩存帴璋冪敤Future鐨刧et鏂规硶锛屽惁鍒欏氨鍙樻垚涓茶鎵ц浜嗭紝澶卞幓澶氱嚎绋嬫剰涔�
+                resultList.add(futureTask);
+                start += 50;
+            }
+        }
+        for (FutureTask<Boolean> futureTask : resultList) {
+            data.add(futureTask.get());
+        }
+        Date endTime = new Date();
+        log.error("鎬诲叡鑰楁椂锛�" + (endTime.getTime() - startTime.getTime()) / 1000);
+        if (data.stream().allMatch(item -> item == Boolean.TRUE)) {
+            System.out.println("鎵ц鎴愬姛");
+        }
     }
 
 }
diff --git a/ycl-server/src/main/java/com/ycl/thread/PointImportCallable.java b/ycl-server/src/main/java/com/ycl/thread/PointImportCallable.java
new file mode 100644
index 0000000..3dbe6cd
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/thread/PointImportCallable.java
@@ -0,0 +1,59 @@
+package com.ycl.thread;
+
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.ycl.platform.domain.entity.YwPoint;
+import com.ycl.platform.mapper.YwPointMapper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/8/22 14:24
+ */
+public class PointImportCallable implements Callable<Boolean> {
+
+    private List<YwPoint> updateList;
+    private YwPointMapper ywPointMapper;
+    private List<YwPoint> failedList = new ArrayList<>();
+
+    private Integer maxFailedTimes = 5;
+
+    public PointImportCallable(List<YwPoint> updateList, YwPointMapper ywPointMapper) {
+        this.updateList = updateList;
+        this.ywPointMapper = ywPointMapper;
+    }
+
+    @Override
+    public Boolean call() throws Exception {
+        this.updateFailed(updateList);
+        return this.failedList.size() < 1;
+    }
+
+    private void updateFailed(List<YwPoint> list) {
+        this.maxFailedTimes -= 1;
+        if (this.maxFailedTimes < 0) {
+            return;
+        }
+        for (YwPoint ywPoint : list) {
+            boolean update = new LambdaUpdateChainWrapper<>(ywPointMapper)
+                    .eq(YwPoint::getSerialNumber, ywPoint.getSerialNumber())
+                    .set(YwPoint::getProvinceTag, ywPoint.getProvinceTag())
+                    .set(YwPoint::getImportantCommandImageTag, ywPoint.getImportantCommandImageTag())
+                    .set(YwPoint::getUnitId, ywPoint.getUnitId())
+                    .set(YwPoint::getStartTime, ywPoint.getStartTime())
+                    .set(YwPoint::getEndTime, ywPoint.getEndTime())
+                    .update();
+            if (! update) {
+                failedList.add(ywPoint);
+            } else if (failedList.contains(ywPoint)) {
+                failedList.remove(ywPoint);
+            }
+        }
+        if (failedList.size() > 0) {
+            this.updateFailed(failedList);
+        }
+    }
+}
diff --git a/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
index 572000a..0702c36 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
@@ -89,9 +89,9 @@
         yu.unit_name,
         yp.start_time,
         yp.end_time,
-        CASE WHEN yp.province_tag = 0 THEN '' ELSE '鐪佸巺鐐逛綅' END AS provinceTagString,
-        CASE WHEN yp.important_tag = 0 THEN '' ELSE '閲嶇偣鐐逛綅' END AS importantTagString,
-        CASE WHEN yp.important_command_image_tag = 0 THEN '' ELSE '閲嶇偣鎸囨尌鍥惧儚' END AS importantCommandImageTagString
+        CASE WHEN yp.province_tag = 0 THEN '鍚�' ELSE '鏄�' END AS provinceTagString,
+        CASE WHEN yp.important_tag = 0 THEN '鍚�' ELSE '鏄�' END AS importantTagString,
+        CASE WHEN yp.important_command_image_tag = 0 THEN '鍚�' ELSE '鏄�' END AS importantCommandImageTagString
         FROM
         t_yw_point yp
         INNER JOIN t_monitor m ON yp.serial_number = m.serial_number
@@ -101,9 +101,23 @@
                 AND m.name like concat('%', #{query.pointName} ,'%')
             </if>
         </where>
+        ORDER BY yu.unit_name
     </select>
 
     <delete id="deleteAll">
         delete from t_yw_point
     </delete>
+
+    <update id="updatePoint">
+        update t_yw_point
+        <set>
+            <if test="point.pointName != null and point.pointName != ''">point_name = #{point.pointName},</if>
+            unit_id = #{point.unitId},
+            start_time = #{point.startTime},
+            end_time = #{point.endTime},
+            province_tag = #{point.provinceTag},
+            important_command_image_tag = #{point.importantCommandImageTag},
+        </set>
+            WHERE serial_number = #{point.serialNumber}
+    </update>
 </mapper>

--
Gitblit v1.8.0