From 9c2530bafbd5f502fd9bdc9abaa7c357d6f91e86 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 06 八月 2024 17:46:00 +0800
Subject: [PATCH] 点位导入导出

---
 ycl-server/src/main/java/com/ycl/dataListener/CurrencyDataListener.java          |  102 ++++++++++++++++++++
 ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml                      |   18 +++
 ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointSelectHandler.java     |   44 ++++++++
 ycl-server/src/main/java/com/ycl/platform/mapper/YwPointMapper.java              |    9 +
 ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointVO.java                 |    1 
 ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java |    1 
 ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java            |   32 ++++++
 ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java      |   17 +++
 ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java   |   48 +++++++++
 ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java            |   20 ++++
 10 files changed, 290 insertions(+), 2 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
new file mode 100644
index 0000000..b384837
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java
@@ -0,0 +1,32 @@
+package com.ycl.platform.domain.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+/**
+ * 鐐逛綅瀵煎叆瀵煎嚭
+ *
+ * @author锛歺p
+ * @date锛�2024/8/6 11:38
+ */
+@Data
+public class PointExport {
+
+    @ColumnWidth(50)
+    @ExcelProperty("鐐逛綅鍚嶇О")
+    private String pointName;
+
+    @ColumnWidth(30)
+    @ExcelProperty("鍥芥爣鐮�")
+    private String serialNumber;
+
+    @ColumnWidth(16)
+    @ExcelProperty("鐐逛綅IP")
+    private String pointIP;
+
+    @ColumnWidth(40)
+    @ExcelProperty("褰撳墠杩愮淮鍗曚綅")
+    private String unitName;
+
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointSelectHandler.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointSelectHandler.java
new file mode 100644
index 0000000..d86e1f4
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointSelectHandler.java
@@ -0,0 +1,44 @@
+package com.ycl.platform.domain.excel;
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+
+import java.util.List;
+
+/**
+ * 璁剧疆easy-excel涓嬫媺澶勭悊鍣�
+ *
+ * @author锛歺p
+ * @date锛�2024/3/15 17:27
+ */
+public class PointSelectHandler implements CellWriteHandler {
+
+    private List<String> unitNameList;
+
+    public PointSelectHandler(List unitNameList) {
+        this.unitNameList = unitNameList;
+    }
+
+    @Override
+    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+        // 鑾峰彇sheet瀵硅薄
+        Sheet sheet = writeSheetHolder.getSheet();
+
+
+        // 鑾峰彇鏁版嵁鏍¢獙helper锛宔xcel鐨勪笅鎷夊氨鏄�氳繃鏁版嵁鏍¢獙璁剧疆
+        DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
+
+        // 璁剧疆涓嬫媺鑼冨洿锛岀涓�鍒楋紝20000琛屽唴
+        CellRangeAddressList questionTypeRange = new CellRangeAddressList(1, 20000, 4, 4);
+        // 娣诲姞鍗曚綅涓嬫媺
+        DataValidationConstraint questionConstraint = dataValidationHelper.createExplicitListConstraint((String[]) unitNameList.toArray());
+        DataValidation questionValidation = dataValidationHelper.createValidation(questionConstraint, questionTypeRange);
+        sheet.addValidationData(questionValidation);
+
+    }
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointVO.java
index a67e7dc..f3265dd 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointVO.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/YwPointVO.java
@@ -17,7 +17,6 @@
  * @since 2024-03-05
  */
 @Data
-@Accessors(chain = true)
 public class YwPointVO extends AbsVo {
 
     /** 鐐逛綅鍚嶇О */
diff --git a/ycl-server/src/main/java/com/ycl/dataListener/CurrencyDataListener.java b/ycl-server/src/main/java/com/ycl/dataListener/CurrencyDataListener.java
new file mode 100644
index 0000000..50ef882
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/dataListener/CurrencyDataListener.java
@@ -0,0 +1,102 @@
+package com.ycl.dataListener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.read.listener.ReadListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+/**
+ * 閫氱敤easyexcel鏁版嵁鐩戝惉鍣�
+ *
+ * @author锛歺p
+ * @date锛�2024/8/6 15:04
+ */
+public class CurrencyDataListener<T> implements ReadListener<T> {
+
+    private Consumer<List<T>> consumer;
+
+    /**
+     * 姣忛殧100鏉″瓨鍌ㄦ暟鎹簱锛岀劧鍚庢竻鐞唋ist 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 100;
+
+    /**
+     * 缂撳瓨鐨勬暟鎹�
+     */
+    private List<T> cachedDataList = new ArrayList<>(BATCH_COUNT);
+
+    private final static Logger log = LoggerFactory.getLogger(CurrencyDataListener.class);
+
+    public CurrencyDataListener(Consumer<List<T>> consumer) {
+        this.consumer = consumer;
+    }
+
+    /**
+     * 璇诲彇鍑虹幇寮傚父澶勭悊
+     * @param e
+     * @param analysisContext
+     * @throws Exception
+     */
+    @Override
+    public void onException(Exception e, AnalysisContext analysisContext) throws Exception {
+
+    }
+
+    /**
+     * 澶勭悊琛ㄥご
+     * @param map
+     * @param analysisContext
+     */
+    @Override
+    public void invokeHead(Map<Integer, ReadCellData<?>> map, AnalysisContext analysisContext) {
+
+    }
+
+    /**
+     * 璇诲彇鏁版嵁,姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     * @param data
+     * @param analysisContext
+     */
+    @Override
+    public void invoke(T data, AnalysisContext analysisContext) {
+        cachedDataList.add(data);
+        // 杈惧埌BATCH_COUNT浜嗭紝闇�瑕佸幓瀛樺偍涓�娆℃暟鎹簱锛岄槻姝㈡暟鎹嚑涓囨潯鏁版嵁鍦ㄥ唴瀛橈紝瀹规槗OOM
+        if (cachedDataList.size() >= BATCH_COUNT) {
+            try {
+                saveData();
+            } catch(Exception e) {
+                // 杩欓噷闇�瑕佹崟鑾峰紓甯革紝鍚﹀垯list鏃犳硶娓呯┖锛屽鑷存瘡璇讳竴鏉℃暟鎹氨浼氭墽琛宻aveData鏂规硶
+            }
+            // 瀛樺偍瀹屾垚娓呯悊 list
+            cachedDataList = new ArrayList<>(BATCH_COUNT);
+        }
+    }
+
+    /**
+     * 璇诲彇瀹屾垚
+     * @param analysisContext
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        saveData();
+        log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒");
+    }
+
+    @Override
+    public boolean hasNext(AnalysisContext analysisContext) {
+        return true;
+    }
+
+    private void saveData() {
+        log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", cachedDataList.size());
+        consumer.accept(cachedDataList);
+        log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒");
+    }
+
+}
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 1260ea4..0207ee6 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
@@ -3,10 +3,13 @@
 import com.ycl.platform.domain.form.BatchEditPointForm;
 import com.ycl.system.domain.group.Update;
 import com.ycl.system.domain.group.Add;
+import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotBlank;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import lombok.RequiredArgsConstructor;
+
+import java.io.IOException;
 import java.util.List;
 import org.springframework.validation.annotation.Validated;
 import jakarta.validation.constraints.NotEmpty;
@@ -18,6 +21,7 @@
 import com.ycl.platform.domain.query.YwPointQuery;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 杩愮淮鐐逛綅 鍓嶇鎺у埗鍣�
@@ -102,4 +106,17 @@
     public Result select(@NotBlank(message = "璇疯緭鍏ョ偣浣�") String keyword) {
         return ywPointService.select(keyword);
     }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "瀵煎嚭鏁版嵁", notes = "瀵煎嚭鏁版嵁")
+    public void export(YwPointQuery query, HttpServletResponse response) throws IOException {
+        ywPointService.export(query, response);
+    }
+
+    @PostMapping("/import/{unitId}")
+    @ApiOperation(value = "瀵煎叆鏁版嵁", notes = "瀵煎叆鏁版嵁")
+    public Result importData(MultipartFile file, @PathVariable("unitId") Integer unitId) throws IOException {
+        return ywPointService.importData(file, unitId);
+    }
+
 }
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 650ff2d..c6b12d9 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
@@ -6,6 +6,7 @@
 import com.ycl.platform.domain.entity.YwPoint;
 import com.ycl.platform.domain.query.YwPointQuery;
 import com.ycl.platform.domain.vo.YwPointVO;
+import com.ycl.platform.domain.excel.PointExport;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -40,4 +41,12 @@
      * 閫氳繃鏍囩鏌ラ噸鐐圭偣浣嶆垨鐪佸巺鐐逛綅
      */
     List<YwPoint> selectByTag(@Param("important")String important, @Param("province")String province);
+
+    /**
+     * 瀵煎嚭鏁版嵁
+     *
+     * @param query
+     * @return
+     */
+    List<PointExport> export(@Param("query") YwPointQuery query);
 }
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 62ec7f9..447932b 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
@@ -6,7 +6,10 @@
 import com.ycl.platform.domain.form.YwPointForm;
 import com.ycl.platform.domain.query.YwPointQuery;
 import com.ycl.system.Result;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -101,4 +104,21 @@
      * @return 鏁版嵁
      */
     List<YwPoint> home();
+
+    /**
+     * 瀵煎嚭鏁版嵁
+     *
+     * @param query
+     * @param response
+     */
+    void export(YwPointQuery query, HttpServletResponse response) throws IOException;
+
+    /**
+     * 瀵煎叆鏁版嵁
+     *
+     * @param file
+     * @param unitId 杩愮淮鍗曚綅id
+     * @return
+     */
+    Result importData(MultipartFile file, Integer unitId) throws IOException;
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
index 47706e3..415f927 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -79,6 +79,7 @@
         workOrderList.stream().filter(item -> {
             return StringUtils.hasText(item.getSerialNumber()) && Objects.nonNull(item.getStatus()) && StringUtils.hasText(item.getErrorType());
         });
+        // TODO 鑷姩涓嬪彂宸ュ崟
         int real = workOrderList.size();
         boolean result = this.saveBatch(workOrderList);
         log.info("浼犲叆宸ュ崟鎬绘暟: {}锛屽疄闄呮坊鍔犲伐鍗曟暟锛歿}", total, real);
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 b8f6cfd..a379aa6 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
@@ -1,16 +1,21 @@
 package com.ycl.platform.service.impl;
 
+import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ycl.dataListener.CurrencyDataListener;
 import com.ycl.platform.base.BaseSelect;
 import com.ycl.platform.domain.entity.YwPeople;
 import com.ycl.platform.domain.entity.YwPoint;
+import com.ycl.platform.domain.entity.YwUnit;
 import com.ycl.platform.domain.form.BatchEditPointForm;
 import com.ycl.platform.domain.form.YwPointForm;
 import com.ycl.platform.domain.query.YwPointQuery;
 import com.ycl.platform.domain.vo.YwPointVO;
+import com.ycl.platform.domain.excel.PointExport;
+import com.ycl.platform.domain.excel.PointSelectHandler;
 import com.ycl.platform.mapper.YwPeopleMapper;
 import com.ycl.platform.mapper.YwPointMapper;
 import com.ycl.platform.service.YwPointService;
@@ -20,16 +25,20 @@
 import com.ycl.system.page.PageUtil;
 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.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
@@ -221,4 +230,41 @@
     public List<YwPoint> home() {
         return baseMapper.home();
     }
+
+    @Override
+    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) throws IOException {
+        Consumer<List<PointExport>> consumer = (dataList) -> {
+            this.updatePoint(dataList, unitId);
+        };
+        EasyExcel.read(file.getInputStream(), PointExport.class , new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll();
+        return Result.ok();
+    }
+
+    /**
+     * 淇敼鐐逛綅鐨勮繍缁村崟浣�
+     *
+     * @param dataList
+     * @param unitId
+     */
+    private void updatePoint(List<PointExport> dataList, Integer unitId) {
+        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)
+                .update();
+    }
+
 }
diff --git a/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
index ead5205..1bbc828 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
@@ -74,4 +74,22 @@
             </if>
         </where>
     </select>
+
+    <select id="export" resultType="com.ycl.platform.domain.excel.PointExport">
+        SELECT
+               m.name as pointName,
+               m.serial_number,
+               m.ip,
+               yu.unit_name
+        FROM
+             t_yw_point yp
+                 INNER JOIN t_monitor m ON yp.serial_number = m.serial_number
+                 INNER JOIN t_yw_unit yu ON yu.id = yp.unit_id
+        <where>
+            <if test="query.pointName != null and query.pointName != ''">
+                AND m.name like concat('%', #{query.pointName} ,'%')
+            </if>
+        </where>
+    </select>
+
 </mapper>

--
Gitblit v1.8.0