Browse Source

银月:通过模板导入装备库

tangbin 1 year ago
parent
commit
fa80ec1978

+ 2 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/Equip.java

@@ -52,6 +52,8 @@ public class Equip {
     int quality;
     int quality;
     /** 耐久度 */
     /** 耐久度 */
     int durability;
     int durability;
+    /** 当前耐久度 */
+    int nowDurability;
 
 
     /** 基础属性鉴定次数 */
     /** 基础属性鉴定次数 */
     int identifyBasicCount;
     int identifyBasicCount;

+ 0 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipEntry.java

@@ -36,8 +36,6 @@ import java.util.List;
 @Document
 @Document
 @FieldDefaults(level = AccessLevel.PRIVATE)
 @FieldDefaults(level = AccessLevel.PRIVATE)
 public class EquipEntry {
 public class EquipEntry {
-    @Id
-    String id;
     /** 名称 */
     /** 名称 */
     String name;
     String name;
     /** 编号 */
     /** 编号 */

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

@@ -2,15 +2,14 @@ package com.iohao.mmo.excel.controller;
 
 
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcel;
 import com.iohao.mmo.common.kit.Result;
 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.equip.entity.EquipEntryTemplate;
-import com.iohao.mmo.excel.dto.DemoExcelDTO;
 import com.iohao.mmo.excel.dto.EquipEntryTemplateExcelDTO;
 import com.iohao.mmo.excel.dto.EquipEntryTemplateExcelDTO;
+import com.iohao.mmo.excel.dto.EquipTemplateExcelDTO;
 import com.iohao.mmo.excel.kit.ExcelKit;
 import com.iohao.mmo.excel.kit.ExcelKit;
 import com.iohao.mmo.excel.listener.EquipEntryTemplateExcelListener;
 import com.iohao.mmo.excel.listener.EquipEntryTemplateExcelListener;
-import com.iohao.mmo.excel.listener.ExcelAnalysisHelper;
-import com.iohao.mmo.excel.listener.ExcelDataCustomListener;
+import com.iohao.mmo.excel.listener.EquipTemplateExcelListener;
 import com.iohao.mmo.excel.service.EquipEntryTemplateExcelService;
 import com.iohao.mmo.excel.service.EquipEntryTemplateExcelService;
+import com.iohao.mmo.excel.service.EquipTemplateExcelService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -32,30 +31,47 @@ import java.util.Map;
 @RequestMapping("/equipexcel")
 @RequestMapping("/equipexcel")
 @Tag(name = "EquipExcelController", description = "装备excel数据")
 @Tag(name = "EquipExcelController", description = "装备excel数据")
 public class EquipExcelController {
 public class EquipExcelController {
+    private final EquipTemplateExcelService equipTemplateExcelService;
+
     private final EquipEntryTemplateExcelService equipEntryTemplateExcelService;
     private final EquipEntryTemplateExcelService equipEntryTemplateExcelService;
 
 
     /**
     /**
-     * 导出
+     * 导入装备模板
+     * @param file
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "importEquipExcel", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @Operation(summary = "导入装备模板",description = "导入装备模板")
+    public Result importEquipExcel(@RequestPart("file") @Parameter(description = "文件")MultipartFile file) throws Exception {
+        //自定义读取
+        EasyExcel.read(file.getInputStream(), EquipTemplateExcelDTO.class, new EquipTemplateExcelListener<>(equipTemplateExcelService,2)).sheet(0).doRead();
+        return new Result().ok("导入成功!");
+    }
+
+
+    /**
+     * 导出装备词条模板
      * @param params
      * @param params
      * @param response
      * @param response
      * @throws Exception
      * @throws Exception
      */
      */
-    @Operation(summary = "导出",description = "导出")
-    @GetMapping("exportExcel")
-    public void exportExcel(@RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception{
+    @Operation(summary = "导出装备词条模板",description = "导出装备词条模板")
+    @GetMapping("exportEntryExcel")
+    public void exportEntryExcel(@RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception{
         List<EquipEntryTemplate> list = equipEntryTemplateExcelService.list(params,EquipEntryTemplate.class);
         List<EquipEntryTemplate> list = equipEntryTemplateExcelService.list(params,EquipEntryTemplate.class);
         ExcelKit.exportExcelToTarget(response, null, "装备词条", list, EquipEntryTemplateExcelDTO.class);
         ExcelKit.exportExcelToTarget(response, null, "装备词条", list, EquipEntryTemplateExcelDTO.class);
     }
     }
 
 
     /**
     /**
-     * 导入
+     * 导入装备词条模板
      * @param file
      * @param file
      * @return
      * @return
      * @throws Exception
      * @throws Exception
      */
      */
-    @PostMapping(value = "importExcel", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    @Operation(summary = "导入",description = "导入")
-    public Result importExcel(@RequestPart("file") @Parameter(description = "文件")MultipartFile file) throws Exception {
+    @PostMapping(value = "importEntryExcel", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @Operation(summary = "导入装备词条模板",description = "导入装备词条模板")
+    public Result importEntryExcel(@RequestPart("file") @Parameter(description = "文件")MultipartFile file) throws Exception {
         //自定义读取
         //自定义读取
         EasyExcel.read(file.getInputStream(), EquipEntryTemplateExcelDTO.class, new EquipEntryTemplateExcelListener<>(equipEntryTemplateExcelService,2)).sheet(0).doRead();
         EasyExcel.read(file.getInputStream(), EquipEntryTemplateExcelDTO.class, new EquipEntryTemplateExcelListener<>(equipEntryTemplateExcelService,2)).sheet(0).doRead();
 //        ExcelAnalysisHelper excelAnalysisHelper = new ExcelAnalysisHelper();
 //        ExcelAnalysisHelper excelAnalysisHelper = new ExcelAnalysisHelper();

+ 85 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/dto/EquipTemplateExcelDTO.java

@@ -0,0 +1,85 @@
+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 EquipTemplateExcelDTO {
+    @ColumnWidth(20)
+    @ExcelProperty(value ="itemTypeId",index = 0)
+    private String itemTypeId;
+
+    @ExcelProperty(value ="部位",index = 1)
+    private String position;
+
+    @ColumnWidth(20)
+    @ExcelProperty(value = "要求等级",index = 2)
+    private int level;
+
+    @ExcelProperty(value = "品质",index = 3)
+    private int quality;
+
+    @ColumnWidth(20)
+    @ExcelProperty(value = "耐久度",index = 4)
+    private int durability;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理攻击最小值"},index = 5)
+    private Integer physicsAttackMin;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理攻击最大值"},index = 6)
+    private Integer physicsAttackMax;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术攻击最小值"},index = 7)
+    private Integer magicAttackMin;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术攻击最大值"},index = 8)
+    private Integer magicAttackMax;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理攻击速度"},index = 9)
+    private Integer physicsAttackSpeed;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术攻击速度"},index = 10)
+    private Integer magicAttackSpeed;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理防御"},index = 11)
+    private Integer physicsDefense;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术防御"},index = 12)
+    private Integer magicDefense;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理命中"},index = 13)
+    private Integer physicsHit;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术命中"},index = 14)
+    private Integer magicHit;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理躲避"},index = 15)
+    private Integer physicsDodge;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术躲避"},index = 16)
+    private Integer magicDodge;
+
+    @ExcelProperty(value = {"装备基础属性范围","生命值"},index = 17)
+    private Integer hp;
+
+    @ExcelProperty(value = {"装备基础属性范围","能量值"},index = 18)
+    private Integer mp;
+
+    @ExcelProperty(value = {"装备固定属性","属性编码"},index = 19)
+    private String code;
+
+
+}

+ 152 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/listener/EquipTemplateExcelListener.java

@@ -0,0 +1,152 @@
+package com.iohao.mmo.excel.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.CellExtra;
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.iohao.mmo.common.kit.ConvertKit;
+import com.iohao.mmo.equip.entity.EquipProperty;
+import com.iohao.mmo.equip.entity.EquipTemplate;
+import com.iohao.mmo.equip.entity.EquipTemplate;
+import com.iohao.mmo.excel.dto.EquipTemplateExcelDTO;
+import com.iohao.mmo.excel.service.EquipTemplateExcelService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 装备模板excel(公共列未合并)
+ *
+ * @author Toby javatangbin@163.com
+ */
+public class EquipTemplateExcelListener<E, T> extends AnalysisEventListener<T> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(EquipTemplateExcelListener.class);
+    /**
+     * 每隔2000条存储数据库,然后清理list,方便内存回收
+     */
+    private static final int BATCH_COUNT = 2000;
+    private final List<EquipTemplate> equipTemplateList = new ArrayList<>();
+
+    private EquipTemplate nowEquipTemplate;
+    private final List<EquipProperty> equipPropertyList = new ArrayList<>();
+
+    /**
+     * 通过构造器注入Service
+     */
+    private final EquipTemplateExcelService equipTemplateExcelService;
+    /**
+     * 表头行数
+     */
+    int headRowNumber = 1;
+
+    /**
+     * 构造方法
+     *
+     * @param equipTemplateExcelService Service对象
+     */
+    public EquipTemplateExcelListener(EquipTemplateExcelService equipTemplateExcelService, int headRowNumber) {
+        this.equipTemplateExcelService = equipTemplateExcelService;
+        this.headRowNumber = headRowNumber;
+    }
+
+    /**
+     * 每条数据解析完,都会调用此方法
+     */
+    @Override
+    public void invoke(T data, AnalysisContext context) {
+        LOGGER.info("解析到一条数据:{}", JSONObject.toJSONString(data));
+        EquipTemplateExcelDTO excel = ConvertKit.sourceToTarget(data, EquipTemplateExcelDTO.class);
+        // (关键部分)这里对数据做自定义设置,如果一级类字段不为空,则一级类取本条数据新导入的,反之取缓存里面的
+        if(StringUtils.isNotBlank(excel.getCode())){
+            //拷贝一级类属性
+            nowEquipTemplate = ConvertKit.sourceToTarget(excel, EquipTemplate.class);
+            //一级类自定义属性
+            if(StringUtils.isNotBlank(excel.getPositionStrs())) {
+                nowEquipTemplate.setPositionList(Arrays.stream(excel.getPositionStrs().split("-")).toList());
+            }
+            //将一级类加入缓存list
+            equipTemplateList.add(nowEquipTemplate);
+        }
+        //拷贝二级类属性
+        EquipProperty equipProperty = ConvertKit.sourceToTarget(excel, EquipProperty.class);
+        //把二级类放入一级类的子列表中
+        List<EquipProperty> lastPropertyList = nowEquipTemplate.getPropertyList();
+        if(lastPropertyList==null){
+            lastPropertyList = new ArrayList<>();
+        }
+        lastPropertyList.add(equipProperty);
+        nowEquipTemplate.setPropertyList(lastPropertyList);
+
+        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
+        if (equipTemplateList.size() >= BATCH_COUNT) {
+            saveData();
+            // 存储完成清理 list
+            equipTemplateList.clear();
+        }
+    }
+    @Override
+    public void extra(CellExtra extra, AnalysisContext context) {
+        switch (extra.getType()) {
+            case COMMENT: {
+                LOGGER.info("额外信息是批注,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(), extra.getColumnIndex(),
+                        extra.getText());
+                break;
+            }
+            case HYPERLINK: {
+                if ("Sheet1!A1".equals(extra.getText())) {
+                    LOGGER.info("额外信息是超链接,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(),
+                            extra.getColumnIndex(), extra.getText());
+                } else if ("Sheet2!A1".equals(extra.getText())) {
+                    LOGGER.info(
+                            "额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{},"
+                                    + "内容是:{}",
+                            extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
+                            extra.getLastColumnIndex(), extra.getText());
+                } else {
+                    LOGGER.info("Unknown hyperlink!");
+                }
+                break;
+            }
+            case MERGE: {
+                LOGGER.info(
+                        "额外信息是合并单元格,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{}",
+                        extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
+                        extra.getLastColumnIndex());
+                if (extra.getRowIndex() >= headRowNumber) {
+//                    extraMergeInfoList.add(extra);
+                }
+                break;
+            }
+            default: {
+            }
+        }
+    }
+
+    /**
+     * 所有数据解析完成了 都会来调用
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
+        saveData();
+        LOGGER.info("所有数据解析完成!");
+    }
+    /**
+     * 加上存储数据库
+     */
+    private void saveData() {
+        LOGGER.info("{}条数据,开始存储数据库!", equipTemplateList.size());
+        try {
+            //根据code批量更新或者插入
+            equipTemplateExcelService.updateBatch(equipTemplateList);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+        LOGGER.info("存储数据库成功!");
+    }
+}

+ 20 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/EquipTemplateExcelService.java

@@ -0,0 +1,20 @@
+package com.iohao.mmo.excel.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.iohao.mmo.equip.entity.EquipTemplate;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+
+
+/**
+ * 装备模板Excel
+ *
+ * @author 唐斌
+ * @date 2023-08-30
+ * @description: 装备词条Excel
+ */
+public interface EquipTemplateExcelService extends BaseService<EquipTemplate>{
+
+    @Transactional(rollbackFor = Exception.class)
+    void updateBatch(List<EquipTemplate> entityList) throws JsonProcessingException;
+}