Przeglądaj źródła

装备词条模板excel

toby 1 rok temu
rodzic
commit
149b47c8bc

+ 15 - 28
logic/excel-logic/src/main/java/com/iohao/mmo/excel/controller/EquipExcelController.java

@@ -2,12 +2,14 @@ package com.iohao.mmo.excel.controller;
 
 import com.alibaba.excel.EasyExcel;
 import com.iohao.mmo.common.kit.Result;
+import com.iohao.mmo.equip.entity.EquipEntry;
+import com.iohao.mmo.equip.entity.EquipEntryTemplate;
 import com.iohao.mmo.excel.dto.DemoExcelDTO;
-import com.iohao.mmo.excel.entity.DemoExcel;
+import com.iohao.mmo.excel.dto.EquipEntryTemplateExcelDTO;
 import com.iohao.mmo.excel.kit.ExcelKit;
+import com.iohao.mmo.excel.listener.EquipEntryTemplateExcelListener;
 import com.iohao.mmo.excel.listener.ExcelDataCustomListener;
-import com.iohao.mmo.excel.listener.ExcelDataListener;
-import com.iohao.mmo.excel.service.DemoExcelService;
+import com.iohao.mmo.excel.service.EquipEntryTemplateExcelService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -16,7 +18,6 @@ import lombok.AllArgsConstructor;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import java.time.LocalTime;
 import java.util.List;
 import java.util.Map;
 
@@ -30,33 +31,19 @@ import java.util.Map;
 @RequestMapping("/equipexcel")
 @Tag(name = "EquipExcelController", description = "装备excel数据")
 public class EquipExcelController {
-    private final DemoExcelService demoExcelService;
+    private final EquipEntryTemplateExcelService equipEntryTemplateExcelService;
 
     /**
-     * 通用导出示例
+     * 导出
      * @param params
      * @param response
      * @throws Exception
      */
-    @Operation(summary = "通用导出示例",description = "通用导出示例")
-    @GetMapping("exportdemo")
-    public void exportDemo(@RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception{
-        List<DemoExcel> list = demoExcelService.list(params,DemoExcel.class);
-        ExcelKit.exportExcelToTarget(response, null, "Excel示例", list, DemoExcelDTO.class);
-    }
-
-    /**
-     * 通用导入示例
-     * @param file
-     * @return
-     * @throws Exception
-     */
-    @PostMapping(value = "importdemo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    @Operation(summary = "通用导入示例",description = "通用导入示例")
-    public Result importDemo(@RequestPart("file") @Parameter(description = "文件")MultipartFile file) throws Exception {
-        //通用读取
-        EasyExcel.read(file.getInputStream(), DemoExcelDTO.class, new ExcelDataListener<>(demoExcelService)).sheet(0).doRead();
-        return new Result().ok("导入成功!");
+    @Operation(summary = "导出",description = "导出")
+    @GetMapping("exportExcel")
+    public void exportExcel(@RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception{
+        List<EquipEntryTemplate> list = equipEntryTemplateExcelService.list(params,EquipEntryTemplate.class);
+        ExcelKit.exportExcelToTarget(response, null, "装备词条", list, DemoExcelDTO.class);
     }
 
     /**
@@ -65,11 +52,11 @@ public class EquipExcelController {
      * @return
      * @throws Exception
      */
-    @PostMapping(value = "importcustom", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @PostMapping(value = "importExcel", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     @Operation(summary = "导入数据自定义处理示例",description = "导入数据自定义处理示例")
-    public Result importCustom(@RequestPart("file") @Parameter(description = "文件")MultipartFile file) throws Exception {
+    public Result importExcel(@RequestPart("file") @Parameter(description = "文件")MultipartFile file) throws Exception {
         //自定义读取
-        EasyExcel.read(file.getInputStream(), DemoExcelDTO.class, new ExcelDataCustomListener<>(demoExcelService)).sheet(0).doRead();
+        EasyExcel.read(file.getInputStream(), EquipEntryTemplateExcelDTO.class, new EquipEntryTemplateExcelListener<>(equipEntryTemplateExcelService)).sheet(0).doRead();
         return new Result().ok("导入成功!");
     }
 }

+ 64 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/dto/EquipEntryTemplateExcelDTO.java

@@ -0,0 +1,64 @@
+package com.iohao.mmo.excel.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 装备词条Excel
+ *
+ * @author Toby javatangbin@163.com
+ */
+@Data
+@ContentRowHeight(20)
+@HeadRowHeight(20)
+@ColumnWidth(25)
+public class EquipEntryTemplateExcelDTO {
+    @ColumnWidth(20)
+    @ExcelProperty("名称")
+    private String name;
+
+    @ExcelProperty("编号")
+    private String code;
+
+    @ColumnWidth(20)
+    @ExcelProperty(value = "描述")
+    private String description;
+
+    @ExcelProperty(value = "出现概率")
+    private BigDecimal hitProb;
+
+    @ColumnWidth(20)
+    @ExcelProperty(value = "装备部位")
+    private String positionStrs;
+
+    @ExcelProperty(value = "最大次数")
+    private int maxExist;
+
+    @ExcelProperty(value = {"装备属性","等级最小值"})
+    private int levelMin;
+
+    @ExcelProperty(value = {"装备属性","等级最大值"})
+    private int levelMax;
+
+    @ExcelProperty(value = {"装备属性","属性计算方式"})
+    private int countType;
+
+    @ExcelProperty(value = {"装备属性","显示方式"})
+    private int showType;
+
+    @ExcelProperty(value = {"装备属性","影响属性"})
+    private String effectPropertyName;
+
+    @ExcelProperty(value = {"装备属性","属性范围最小值"})
+    private BigDecimal propertyValueMin;
+
+    @ExcelProperty(value = {"装备属性","属性范围最大值"})
+    private BigDecimal propertyValueMax;
+
+
+}

+ 88 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/listener/EquipEntryTemplateExcelListener.java

@@ -0,0 +1,88 @@
+package com.iohao.mmo.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.iohao.mmo.equip.entity.EquipEntryTemplate;
+import com.iohao.mmo.excel.dto.DemoExcelDTO;
+import com.iohao.mmo.excel.entity.DemoExcel;
+import com.iohao.mmo.excel.kit.ConvertKit;
+import com.iohao.mmo.excel.service.DemoExcelService;
+import com.iohao.mmo.excel.service.EquipEntryTemplateExcelService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 装备词条模板excel
+ *
+ * @author Toby javatangbin@163.com
+ */
+public class EquipEntryTemplateExcelListener<E, T> extends AnalysisEventListener<T> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(EquipEntryTemplateExcelListener.class);
+    /**
+     * 每隔2000条存储数据库,然后清理list,方便内存回收
+     */
+    private static final int BATCH_COUNT = 2000;
+    private final List<EquipEntryTemplate> list = new ArrayList<>();
+
+    /**
+     * 通过构造器注入Service
+     */
+    private final EquipEntryTemplateExcelService equipEntryTemplateExcelService;
+
+    /**
+     * 构造方法
+     *
+     * @param equipEntryTemplateExcelService Service对象
+     */
+    public EquipEntryTemplateExcelListener(EquipEntryTemplateExcelService equipEntryTemplateExcelService) {
+        this.equipEntryTemplateExcelService = equipEntryTemplateExcelService;
+    }
+
+    /**
+     * 每条数据解析完,都会调用此方法
+     */
+    @Override
+    public void invoke(T data, AnalysisContext context) {
+        LOGGER.info("解析到一条数据:{}", JSONObject.toJSONString(data));
+        DemoExcelDTO excel = ConvertKit.sourceToTarget(data, DemoExcelDTO.class);
+
+        // 这里对数据做自定义设置
+        EquipEntryTemplate entity = ConvertKit.sourceToTarget(excel, EquipEntryTemplate.class);
+
+        list.add(entity);
+
+        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
+        if (list.size() >= BATCH_COUNT) {
+            saveData();
+            // 存储完成清理 list
+            list.clear();
+        }
+    }
+    /**
+     * 所有数据解析完成了 都会来调用
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
+        saveData();
+        LOGGER.info("所有数据解析完成!");
+    }
+    /**
+     * 加上存储数据库
+     */
+    private void saveData() {
+        LOGGER.info("{}条数据,开始存储数据库!", list.size());
+        try {
+            //根据code批量更新或者插入
+            equipEntryTemplateExcelService.updateBatch(list);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+        LOGGER.info("存储数据库成功!");
+    }
+}

+ 3 - 3
logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/EquipEntryExcelService.java → logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/EquipEntryTemplateExcelService.java

@@ -2,7 +2,7 @@ package com.iohao.mmo.excel.service;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.iohao.mmo.equip.entity.EquipEntry;
-import com.iohao.mmo.excel.entity.DemoExcel;
+import com.iohao.mmo.equip.entity.EquipEntryTemplate;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
@@ -15,8 +15,8 @@ import java.util.List;
  * @date 2023-08-30
  * @description: 装备词条Excel
  */
-public interface EquipEntryExcelService extends BaseService<EquipEntry>{
+public interface EquipEntryTemplateExcelService extends BaseService<EquipEntryTemplate>{
 
     @Transactional(rollbackFor = Exception.class)
-    void updateBatch(List<EquipEntry> entityList) throws JsonProcessingException;
+    void updateBatch(List<EquipEntryTemplate> entityList) throws JsonProcessingException;
 }

+ 6 - 5
logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/impl/EquipEntryExcelServiceImpl.java → logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/impl/EquipEntryTemplateExcelServiceImpl.java

@@ -2,7 +2,8 @@ package com.iohao.mmo.excel.service.impl;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.iohao.mmo.equip.entity.EquipEntry;
-import com.iohao.mmo.excel.service.EquipEntryExcelService;
+import com.iohao.mmo.equip.entity.EquipEntryTemplate;
+import com.iohao.mmo.excel.service.EquipEntryTemplateExcelService;
 import com.mongodb.bulk.BulkWriteResult;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.data.mongodb.core.BulkOperations;
@@ -24,22 +25,22 @@ import java.util.List;
  * @description: 装备词条Excel
  */
 @Service
-public class EquipEntryExcelServiceImpl extends BaseServiceImpl<EquipEntry> implements EquipEntryExcelService {
+public class EquipEntryTemplateExcelServiceImpl extends BaseServiceImpl<EquipEntryTemplate> implements EquipEntryTemplateExcelService {
     final MongoTemplate mongoTemplate;
 
-    public EquipEntryExcelServiceImpl(MongoTemplate mongoTemplate) {
+    public EquipEntryTemplateExcelServiceImpl(MongoTemplate mongoTemplate) {
         super(mongoTemplate);
         this.mongoTemplate = mongoTemplate;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void updateBatch(List<EquipEntry> entityList) throws JsonProcessingException {
+    public void updateBatch(List<EquipEntryTemplate> entityList) throws JsonProcessingException {
         if (CollectionUtils.isEmpty(entityList)) {
             return;
         }
         List<Pair<Query, Update>> updateList = new ArrayList<>(entityList.size());
-        BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "demoExcel");
+        BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "equipEntryTemplate");
         entityList.forEach(data -> {
             //以code为标识判断新增或者修改
             Query query = new Query(new Criteria("code").is(data.getCode()));