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