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