Просмотр исходного кода

导入装备词条excel和装备模板excel完成

toby 1 год назад
Родитель
Сommit
a7992003fe

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

@@ -49,7 +49,7 @@ public class Equip {
     /** 要求等级 */
     int level;
     /** 品质 1白色,2黄色,3绿色,4蓝色,5紫色,6鬼装*/
-    int quality;
+    String quality;
     /** 耐久度 */
     int durability;
     /** 当前耐久度 */

+ 22 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipPropertyBasic.java

@@ -49,9 +49,9 @@ public class EquipPropertyBasic {
     /** 法术攻击最大值 */
     Integer magicAttackMax;
     /** 物理攻击速度 */
-    Integer physicsAttackSpeed;
+    Double physicsAttackSpeed;
     /** 法术攻击速度 */
-    Integer magicAttackSpeed;
+    Double magicAttackSpeed;
 
     /** 物理防御 */
     Integer physicsDefense;
@@ -76,6 +76,26 @@ public class EquipPropertyBasic {
     /** 基础属性增加百分比 */
     Integer basicAllPct;
 
+    public EquipPropertyBasic() {
+    }
+
+    public EquipPropertyBasic(Integer physicsAttackMin, Integer physicsAttackMax, Integer magicAttackMin, Integer magicAttackMax, Double physicsAttackSpeed, Double magicAttackSpeed, Integer physicsDefense, Integer magicDefense, Integer physicsHit, Integer magicHit, Integer physicsDodge, Integer magicDodge, Integer hp, Integer mp) {
+        this.physicsAttackMin = physicsAttackMin;
+        this.physicsAttackMax = physicsAttackMax;
+        this.magicAttackMin = magicAttackMin;
+        this.magicAttackMax = magicAttackMax;
+        this.physicsAttackSpeed = physicsAttackSpeed;
+        this.magicAttackSpeed = magicAttackSpeed;
+        this.physicsDefense = physicsDefense;
+        this.magicDefense = magicDefense;
+        this.physicsHit = physicsHit;
+        this.magicHit = magicHit;
+        this.physicsDodge = physicsDodge;
+        this.magicDodge = magicDodge;
+        this.hp = hp;
+        this.mp = mp;
+    }
+
     public static EquipPropertyBasic randomFixed(EquipPropertyBasic fixedEquipPropertyMin,
                                                  EquipPropertyBasic fixedEquipPropertyMax){
 

+ 12 - 3
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/EquipTemplate.java

@@ -23,7 +23,6 @@ import lombok.Data;
 import lombok.experimental.FieldDefaults;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
-
 import java.util.List;
 
 /**
@@ -44,14 +43,24 @@ public class EquipTemplate {
     String position;
     /** 要求等级 */
     int level;
-    /** 品质 1白色,2黄色,3绿色,4蓝色,5紫色,6鬼装*/
-    int quality;
+    /** 品质 white白色,yellow黄色,green绿色,blue蓝色,red红色,purple紫色,ghost鬼装*/
+    String quality;
     /** 耐久度 */
     int durability;
+    /** 出现权重 */
+    int prizeWeight;
+    /** 初始数量 */
+    Integer initCount;
+    /** 剩余数量 */
+    Integer residualCount;
     /** 装备基础属性最小值 */
     EquipPropertyBasic equipPropertyBasicMin;
     /** 装备基础属性最大值 */
     EquipPropertyBasic equipPropertyBasicMax;
+    /** 固定属性最小条数 */
+    int equipPropertyFixedMin;
+    /** 固定属性最大条数 */
+    int equipPropertyFixedMax;
     /** 装备固定属性 */
     List<EquipEntry> equipPropertyFixedList;
     /** 随机属性最小条数 */

+ 1 - 2
logic/equip-logic/src/main/java/com/iohao/mmo/equip/kit/EquipRandomKit.java

@@ -2,7 +2,6 @@ package com.iohao.mmo.equip.kit;
 
 import com.iohao.mmo.common.kit.RandomKit;
 import com.iohao.mmo.equip.entity.EquipEntryTemplate;
-import com.iohao.mmo.equip.service.MathRandom;
 import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -87,7 +86,7 @@ public class EquipRandomKit {
         List<EquipEntryTemplate> results = new ArrayList<>();
         int[] indexCount = new int[equipEntryTemplateList.size()];
 
-        for (int i = 0; i <= count; i++)// 打印100个测试概率的准确性
+        for (int i = 0; i < count; i++)
         {
             int index = RandomKit.weightRandom(prizeWeightArr);
             if(equipEntryTemplateList.get(index).getPrizeAmount()<=indexCount[index]){

+ 23 - 1
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipEntryTemplateService.java

@@ -95,7 +95,7 @@ public class EquipEntryTemplateService {
     public List<EquipEntryTemplate> randomEntryTemplateBatch(String position,int count){
         // 创建条件对象
         Criteria criteria = new Criteria();
-        criteria.and("positionList").is(position);
+        criteria.orOperator(Criteria.where("positionList").isNull(),Criteria.where("positionList").is(position));
 
         Query query = new Query();
         query.addCriteria(criteria);
@@ -126,6 +126,12 @@ public class EquipEntryTemplateService {
         return equipEntryList;
     }
 
+    /**
+     * 列表过滤
+     * @param equipEntryPropertyList
+     * @param level
+     * @return
+     */
     public List<EquipEntryProperty> filterByStream(List<EquipEntryProperty> equipEntryPropertyList,int level) {
         return equipEntryPropertyList.stream()
                 .filter(equipEntryProperty -> equipEntryProperty.getLevelMin()<=level)
@@ -133,4 +139,20 @@ public class EquipEntryTemplateService {
                 .collect(Collectors.toList());
     }
 
+    /**
+     * 根据装备等级、编号查找词条模板并随机出词条
+     * @param level 等级
+     * @param code 编号
+     * @return
+     */
+    public EquipEntry entryByCode(int level,String code){
+        EquipEntryTemplate equipEntryTemplate = findByCode(code);
+        EquipEntry equipEntry = ConvertKit.sourceToTarget(equipEntryTemplate, EquipEntry.class);
+        //筛选出符合条件的list
+        List<EquipEntryProperty> newEntryPropertyList = filterByStream(equipEntryTemplate.getEntryPropertyList(),level);
+        equipEntry.setEntryPropertyList(newEntryPropertyList);
+
+        return equipEntry;
+    }
+
 }

+ 0 - 134
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/MathRandom.java

@@ -1,134 +0,0 @@
-package com.iohao.mmo.equip.service;
-
-/**
- * @author 唐斌
- * @date 2023-08-31
- * @description:
- */
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * JAVA 返回随机数,并根据概率、比率
- *
- */
-public class MathRandom {
-
-    private static Log logger = LogFactory.getLog(MathRandom.class);
-
-    /**
-     * Math.random()产生一个double型的随机数,判断一下 每个奖品出现的概率
-     *
-     * @return int
-     *
-     */
-    public int WeightRandom(List<RewardPrize> prizes) {
-        int random = -2;
-        try{
-            double sumWeight = 0;
-            //计算总权重
-            for(RewardPrize rp_1 : prizes){
-                sumWeight += rp_1.getPrize_weight();
-            }
-            double randomNumber;
-            randomNumber = Math.random();
-            double d1 = 0;
-            double d2 = 0;
-
-            for(int i=0;i<prizes.size();i++){
-                d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrize_weight()))/sumWeight;
-                if(i==0){
-                    d1 = 0;
-                }else{
-                    d1 +=Double.parseDouble(String.valueOf(prizes.get(i-1).getPrize_weight()))/sumWeight;
-                }
-                if(randomNumber >= d1 && randomNumber <= d2){
-                    random = i;
-                    break;
-                }
-            }
-        }catch(Exception e){
-            System.out.println(e.getMessage());
-            logger.error("生成抽奖随机数出错,出错原因:" + e.getMessage());
-            random = -1;
-        }
-        return random;
-    }
-
-    /**
-     * 测试主程序
-     *
-     * @param agrs
-     */
-    public static void main(String[] agrs) {
-        MathRandom a = new MathRandom();
-        List<RewardPrize> prizes = new ArrayList();
-        List<RewardPrize> results = new ArrayList();
-        prizes.add(new RewardPrize(10000,"一等奖",1,5));
-        prizes.add(new RewardPrize(10001,"二等奖",5,10));
-        prizes.add(new RewardPrize(10002,"四等奖",1000000,30));
-        prizes.add(new RewardPrize(10003,"三等奖",1000000,20));
-        prizes.add(new RewardPrize(10004,"安慰奖",1000000,35));
-
-        int[] indexCount = new int[prizes.size()];
-
-        for (int i = 0; i <= 850000; i++)// 打印100个测试概率的准确性
-        {
-            int index = a.WeightRandom(prizes);
-            if(prizes.get(index).getPrize_amount()<=indexCount[index]){
-                i--;
-                continue;
-            }
-            indexCount[index] = indexCount[index] + 1;
-            results.add(prizes.get(index));
-        }
-        System.out.println(indexCount[0]+"---"+indexCount[1]+"---"+indexCount[2]+"---"+indexCount[3]+"---"+indexCount[4]);
-
-    }
-    public static class RewardPrize  {
-        private int rewardId;//奖励id
-        private String rewardName;//奖励名称
-        private int prize_amount;//数量
-        private int prize_weight;//权重
-
-        public String getRewardName() {
-            return rewardName;
-        }
-
-        public void setRewardName(String rewardName) {
-            this.rewardName = rewardName;
-        }
-
-        public int getPrize_amount() {
-            return prize_amount;
-        }
-
-        public void setPrize_amount(int prize_amount) {
-            this.prize_amount = prize_amount;
-        }
-
-        public int getPrize_weight() {
-            return prize_weight;
-        }
-
-        public void setPrize_weight(int prize_weight) {
-            this.prize_weight = prize_weight;
-        }
-
-        public RewardPrize() {
-        }
-
-        public RewardPrize(int rewardId, String rewardName, int prize_amount, int prize_weight) {
-            this.rewardId = rewardId;
-            this.rewardName = rewardName;
-            this.prize_amount = prize_amount;
-            this.prize_weight = prize_weight;
-        }
-    }
-}
-

+ 56 - 33
logic/excel-logic/src/main/java/com/iohao/mmo/excel/dto/EquipTemplateExcelDTO.java

@@ -4,6 +4,9 @@ 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 com.iohao.mmo.excel.dto.converter.PositionConverter;
+import com.iohao.mmo.excel.dto.converter.QualityConverter;
+import com.iohao.mmo.excel.dto.converter.StatusConverter;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -22,64 +25,84 @@ public class EquipTemplateExcelDTO {
     @ExcelProperty(value ="itemTypeId",index = 0)
     private String itemTypeId;
 
-    @ExcelProperty(value ="部位",index = 1)
+    @ExcelProperty(value ="部位",index = 1, converter = PositionConverter.class)
     private String position;
 
     @ColumnWidth(20)
     @ExcelProperty(value = "要求等级",index = 2)
     private int level;
 
-    @ExcelProperty(value = "品质",index = 3)
-    private int quality;
+    @ExcelProperty(value = "品质",index = 3, converter = QualityConverter.class)
+    private String quality;
 
     @ColumnWidth(20)
     @ExcelProperty(value = "耐久度",index = 4)
     private int durability;
 
-    @ExcelProperty(value = {"装备基础属性范围","物理攻击最小值"},index = 5)
-    private Integer physicsAttackMin;
+    @ColumnWidth(20)
+    @ExcelProperty(value = "出现权重",index = 5)
+    private int prizeWeight;
+
+    @ColumnWidth(20)
+    @ExcelProperty(value = "初始数量",index = 6)
+    private Integer initCount;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理攻击最小值"},index = 7)
+    private int physicsAttackMin;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理攻击最大值"},index = 8)
+    private int physicsAttackMax;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术攻击最小值"},index = 9)
+    private int magicAttackMin;
+
+    @ExcelProperty(value = {"装备基础属性范围","法术攻击最大值"},index = 10)
+    private int magicAttackMax;
+
+    @ExcelProperty(value = {"装备基础属性范围","物理攻击速度"},index = 11)
+    private double physicsAttackSpeed;
 
-    @ExcelProperty(value = {"装备基础属性范围","物理攻击最大值"},index = 6)
-    private Integer physicsAttackMax;
+    @ExcelProperty(value = {"装备基础属性范围","法术攻击速度"},index = 12)
+    private double magicAttackSpeed;
 
-    @ExcelProperty(value = {"装备基础属性范围","法术攻击最小值"},index = 7)
-    private Integer magicAttackMin;
+    @ExcelProperty(value = {"装备基础属性范围","物理防御"},index = 13)
+    private int physicsDefense;
 
-    @ExcelProperty(value = {"装备基础属性范围","法术攻击最大值"},index = 8)
-    private Integer magicAttackMax;
+    @ExcelProperty(value = {"装备基础属性范围","法术防御"},index = 14)
+    private int magicDefense;
 
-    @ExcelProperty(value = {"装备基础属性范围","物理攻击速度"},index = 9)
-    private Integer physicsAttackSpeed;
+    @ExcelProperty(value = {"装备基础属性范围","物理命中"},index = 15)
+    private int physicsHit;
 
-    @ExcelProperty(value = {"装备基础属性范围","法术攻击速度"},index = 10)
-    private Integer magicAttackSpeed;
+    @ExcelProperty(value = {"装备基础属性范围","法术命中"},index = 16)
+    private int magicHit;
 
-    @ExcelProperty(value = {"装备基础属性范围","物理防御"},index = 11)
-    private Integer physicsDefense;
+    @ExcelProperty(value = {"装备基础属性范围","物理躲避"},index = 17)
+    private int physicsDodge;
 
-    @ExcelProperty(value = {"装备基础属性范围","法术防御"},index = 12)
-    private Integer magicDefense;
+    @ExcelProperty(value = {"装备基础属性范围","法术躲避"},index = 18)
+    private int magicDodge;
 
-    @ExcelProperty(value = {"装备基础属性范围","物理命中"},index = 13)
-    private Integer physicsHit;
+    @ExcelProperty(value = {"装备基础属性范围","生命值"},index = 19)
+    private int hp;
 
-    @ExcelProperty(value = {"装备基础属性范围","法术命中"},index = 14)
-    private Integer magicHit;
+    @ExcelProperty(value = {"装备基础属性范围","能量值"},index = 20)
+    private int mp;
 
-    @ExcelProperty(value = {"装备基础属性范围","物理躲避"},index = 15)
-    private Integer physicsDodge;
+    @ExcelProperty(value = {"装备固定属性","最小条数"},index = 21)
+    private int equipPropertyFixedMin;
 
-    @ExcelProperty(value = {"装备基础属性范围","法术躲避"},index = 16)
-    private Integer magicDodge;
+    @ExcelProperty(value = {"装备固定属性","最大条数"},index = 22)
+    private int equipPropertyFixedMax;
 
-    @ExcelProperty(value = {"装备基础属性范围","生命值"},index = 17)
-    private Integer hp;
+    @ExcelProperty(value = {"装备固定属性","属性编码"},index = 23)
+    private String codes;
 
-    @ExcelProperty(value = {"装备基础属性范围","能量值"},index = 18)
-    private Integer mp;
+    @ExcelProperty(value = {"装备随机属性","最小条数"},index = 24)
+    private int equipPropertyRandomMin;
 
-    @ExcelProperty(value = {"装备固定属性","属性编码"},index = 19)
-    private String code;
+    @ExcelProperty(value = {"装备随机属性","最大条数"},index = 25)
+    private int equipPropertyRandomMax;
 
 
 }

+ 75 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/dto/converter/PositionConverter.java

@@ -0,0 +1,75 @@
+package com.iohao.mmo.excel.dto.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+public class PositionConverter implements Converter<String> {
+    @Override
+    public Class<String> supportJavaTypeKey() {
+        return String.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        String cellValue = cellData.getStringValue();
+        if(cellValue.equals("武器")){
+            return "wuqi";
+        }else if(cellValue.equals("帽子")){
+            return "maozi";
+        }else if(cellValue.equals("衣服")){
+            return "yifu";
+        }else if(cellValue.equals("裤子")){
+            return "kuzi";
+        }else if(cellValue.equals("鞋子")){
+            return "xiezi";
+        }else if(cellValue.equals("护腕")){
+            return "huwan";
+        }else if(cellValue.equals("项链")){
+            return "xianglian";
+        }else if(cellValue.equals("手镯")){
+            return "shouzhuo";
+        }else if(cellValue.equals("戒指")){
+            return "jiezhi";
+        }else if(cellValue.equals("腰佩")){
+            return "yaopei";
+        }else {
+            return "-";
+        }
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        if(value.equals("wuqi")){
+            return new WriteCellData<>("武器");
+        }else if(value.equals("maozi")){
+            return new WriteCellData<>("帽子");
+        }else if(value.equals("yifu")){
+            return new WriteCellData<>("衣服");
+        }else if(value.equals("kuzi")){
+            return new WriteCellData<>("裤子");
+        }else if(value.equals("xiezi")){
+            return new WriteCellData<>("鞋子");
+        }else if(value.equals("huwan")){
+            return new WriteCellData<>("护腕");
+        }else if(value.equals("xianglian")){
+            return new WriteCellData<>("项链");
+        }else if(value.equals("shouzhuo")){
+            return new WriteCellData<>("手镯");
+        }else if(value.equals("jiezhi")){
+            return new WriteCellData<>("戒指");
+        }else if(value.equals("yaopei")){
+            return new WriteCellData<>("腰佩");
+        }else {
+            return new WriteCellData<>("-");
+        }
+    }
+}

+ 63 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/dto/converter/QualityConverter.java

@@ -0,0 +1,63 @@
+package com.iohao.mmo.excel.dto.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+public class QualityConverter implements Converter<String> {
+    @Override
+    public Class<String> supportJavaTypeKey() {
+        return String.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        String cellValue = cellData.getStringValue();
+        if(cellValue.equals("白")){
+            return "white";
+        }else if(cellValue.equals("黄")){
+            return "yellow";
+        }else if(cellValue.equals("绿")){
+            return "green";
+        }else if(cellValue.equals("蓝")){
+            return "blue";
+        }else if(cellValue.equals("红")){
+            return "red";
+        }else if(cellValue.equals("紫")){
+            return "purple";
+        }else if(cellValue.equals("鬼")){
+            return "ghost";
+        }else {
+            return "-";
+        }
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
+        if(value.equals("white")){
+            return new WriteCellData<>("白");
+        }else if(value.equals("yellow")){
+            return new WriteCellData<>("黄");
+        }else if(value.equals("green")){
+            return new WriteCellData<>("绿");
+        }else if(value.equals("blue")){
+            return new WriteCellData<>("蓝");
+        }else if(value.equals("red")){
+            return new WriteCellData<>("红");
+        }else if(value.equals("purple")){
+            return new WriteCellData<>("紫");
+        }else if(value.equals("ghost")){
+            return new WriteCellData<>("鬼");
+        }else {
+            return new WriteCellData<>("-");
+        }
+    }
+}

+ 64 - 27
logic/excel-logic/src/main/java/com/iohao/mmo/excel/listener/EquipTemplateExcelListener.java

@@ -6,17 +6,16 @@ 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.common.kit.RandomKit;
+import com.iohao.mmo.equip.entity.EquipEntry;
+import com.iohao.mmo.equip.entity.EquipPropertyBasic;
 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;
 
 /**
@@ -29,12 +28,9 @@ public class EquipTemplateExcelListener<E, T> extends AnalysisEventListener<T> {
     /**
      * 每隔2000条存储数据库,然后清理list,方便内存回收
      */
-    private static final int BATCH_COUNT = 2000;
+    private static final int BATCH_COUNT = 200;
     private final List<EquipTemplate> equipTemplateList = new ArrayList<>();
 
-    private EquipTemplate nowEquipTemplate;
-    private final List<EquipProperty> equipPropertyList = new ArrayList<>();
-
     /**
      * 通过构造器注入Service
      */
@@ -59,29 +55,70 @@ public class EquipTemplateExcelListener<E, T> extends AnalysisEventListener<T> {
      */
     @Override
     public void invoke(T data, AnalysisContext context) {
+        //装备属性浮动,最小值为最大值的多少比例
+        double minPct = 0.8;
         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());
+
+        EquipTemplate equipTemplate = ConvertKit.sourceToTarget(excel, EquipTemplate.class);
+        //剩余数量
+        equipTemplate.setResidualCount(excel.getInitCount());
+        //装备属性最小值
+        EquipPropertyBasic equipPropertyBasicMin = new EquipPropertyBasic(
+                (int)Math.round(excel.getPhysicsAttackMin()*minPct),
+                (int)Math.round(excel.getPhysicsAttackMax()*minPct),
+                (int)Math.round(excel.getMagicAttackMin()*minPct),
+                (int)Math.round(excel.getMagicAttackMax()*minPct),
+                Math.round(excel.getPhysicsAttackSpeed()*minPct*100)/100.0,
+                Math.round(excel.getMagicAttackSpeed()*minPct*100)/100.0,
+                (int)Math.round(excel.getPhysicsDefense()*minPct),
+                (int)Math.round(excel.getMagicDefense()*minPct),
+                (int)Math.round(excel.getPhysicsHit()*minPct),
+                (int)Math.round(excel.getMagicHit()*minPct),
+                (int)Math.round(excel.getPhysicsDodge()*minPct),
+                (int)Math.round(excel.getMagicDodge()*minPct),
+                (int)Math.round(excel.getHp()*minPct),
+                (int)Math.round(excel.getMp()*minPct)
+        );
+        equipTemplate.setEquipPropertyBasicMin(equipPropertyBasicMin);
+        //装备属性最大值
+        EquipPropertyBasic equipPropertyBasicMax = new EquipPropertyBasic(
+                excel.getPhysicsAttackMin(),
+                excel.getPhysicsAttackMax(),
+                excel.getMagicAttackMin(),
+                excel.getMagicAttackMax(),
+                excel.getPhysicsAttackSpeed(),
+                excel.getMagicAttackSpeed(),
+                excel.getPhysicsDefense(),
+                excel.getMagicDefense(),
+                excel.getPhysicsHit(),
+                excel.getMagicHit(),
+                excel.getPhysicsDodge(),
+                excel.getMagicDodge(),
+                excel.getHp(),
+                excel.getMp()
+        );
+        equipTemplate.setEquipPropertyBasicMax(equipPropertyBasicMax);
+
+        //固定属性列表
+        List<EquipEntry> equipEntryList = new ArrayList<>();
+        String codes = excel.getCodes();
+        if(StringUtils.isNotBlank(codes)){
+            String[] codeArr = codes.split("-");
+            for(String code:codeArr){
+                EquipEntry equipEntry = equipTemplateExcelService.entryByCode(excel.getLevel(),code);
+                if(equipEntry!=null){
+                    equipEntryList.add(equipEntry);
+                }
             }
-            //将一级类加入缓存list
-            equipTemplateList.add(nowEquipTemplate);
+        }else {
+            equipEntryList = equipTemplateExcelService.randomEntryBatch(
+                    excel.getLevel(),
+                    excel.getPosition(),
+                    RandomKit.randomFromInt(excel.getEquipPropertyFixedMin(),excel.getEquipPropertyFixedMax()));
         }
-        //拷贝二级类属性
-        EquipProperty equipProperty = ConvertKit.sourceToTarget(excel, EquipProperty.class);
-        //把二级类放入一级类的子列表中
-        List<EquipProperty> lastPropertyList = nowEquipTemplate.getPropertyList();
-        if(lastPropertyList==null){
-            lastPropertyList = new ArrayList<>();
-        }
-        lastPropertyList.add(equipProperty);
-        nowEquipTemplate.setPropertyList(lastPropertyList);
-
+        equipTemplate.setEquipPropertyFixedList(equipEntryList);
+        equipTemplateList.add(equipTemplate);
         // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
         if (equipTemplateList.size() >= BATCH_COUNT) {
             saveData();

+ 0 - 2
logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/EquipEntryTemplateExcelService.java

@@ -1,10 +1,8 @@
 package com.iohao.mmo.excel.service;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.iohao.mmo.equip.entity.EquipEntry;
 import com.iohao.mmo.equip.entity.EquipEntryTemplate;
 import org.springframework.transaction.annotation.Transactional;
-
 import java.util.List;
 
 

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

@@ -1,6 +1,7 @@
 package com.iohao.mmo.excel.service;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.iohao.mmo.equip.entity.EquipEntry;
 import com.iohao.mmo.equip.entity.EquipTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import java.util.List;
@@ -17,4 +18,8 @@ public interface EquipTemplateExcelService extends BaseService<EquipTemplate>{
 
     @Transactional(rollbackFor = Exception.class)
     void updateBatch(List<EquipTemplate> entityList) throws JsonProcessingException;
+
+    EquipEntry entryByCode(int level, String code);
+
+    List<EquipEntry> randomEntryBatch(int level, String position, int count);
 }

+ 98 - 0
logic/excel-logic/src/main/java/com/iohao/mmo/excel/service/impl/EquipTemplateExcelServiceImpl.java

@@ -0,0 +1,98 @@
+package com.iohao.mmo.excel.service.impl;
+
+import com.iohao.mmo.equip.entity.EquipEntry;
+import com.iohao.mmo.equip.entity.EquipTemplate;
+import com.iohao.mmo.equip.service.EquipEntryTemplateService;
+import com.iohao.mmo.excel.service.EquipTemplateExcelService;
+import com.mongodb.bulk.BulkWriteResult;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.BulkOperations;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.data.util.Pair;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 装备词条Excel
+ *
+ * @author 唐斌
+ * @date 2023-08-30
+ * @description: 装备词条Excel
+ */
+@Service
+public class EquipTemplateExcelServiceImpl extends BaseServiceImpl<EquipTemplate> implements EquipTemplateExcelService {
+    final MongoTemplate mongoTemplate;
+
+    @Autowired
+    EquipEntryTemplateService equipEntryTemplateService;
+
+    public EquipTemplateExcelServiceImpl(MongoTemplate mongoTemplate) {
+        super(mongoTemplate);
+        this.mongoTemplate = mongoTemplate;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateBatch(List<EquipTemplate> entityList) {
+        if (CollectionUtils.isEmpty(entityList)) {
+            return;
+        }
+        List<Pair<Query, Update>> updateList = new ArrayList<>(entityList.size());
+        BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "equipTemplate");
+        entityList.forEach(data -> {
+            //以code为标识判断新增或者修改
+            Query query = new Query(new Criteria("itemTypeId").is(data.getItemTypeId()));
+            Update update = new Update();
+            //如果userId是主键,必须使用setOnInsert()
+            update.set("position",data.getPosition());
+            update.set("level",data.getLevel());
+            update.set("quality",data.getQuality());
+            update.set("durability",data.getDurability());
+            update.set("prizeWeight",data.getPrizeWeight());
+            update.set("initCount",data.getInitCount());
+            update.set("residualCount",data.getResidualCount());
+            update.set("equipPropertyBasicMin",data.getEquipPropertyBasicMin());
+            update.set("equipPropertyBasicMax",data.getEquipPropertyBasicMax());
+            update.set("equipPropertyFixedMin",data.getEquipPropertyFixedMin());
+            update.set("equipPropertyFixedMax",data.getEquipPropertyFixedMax());
+            update.set("equipPropertyFixedList",data.getEquipPropertyFixedList());
+            update.set("equipPropertyRandomMin",data.getEquipPropertyRandomMin());
+            update.set("equipPropertyRandomMax",data.getEquipPropertyRandomMax());
+
+            Pair<Query, Update> updatePair = Pair.of(query, update);
+            updateList.add(updatePair);
+        });
+        operations.upsert(updateList);
+        BulkWriteResult result = operations.execute();
+        System.out.println(result.getUpserts());
+    }
+
+    /**
+     * 根据装备等级、编号查找词条模板并随机出词条
+     * @param level 等级
+     * @param code 编号
+     * @return
+     */
+    @Override
+    public EquipEntry entryByCode(int level, String code){
+        return equipEntryTemplateService.entryByCode(level,code);
+    }
+
+    /**
+     * 根据装备等级、编号查找词条模板并随机出词条
+     * @param level 等级
+     * @param position 部位
+     * @param count 随机数量
+     * @return
+     */
+    @Override
+    public List<EquipEntry> randomEntryBatch(int level,String position,int count){
+        return equipEntryTemplateService.randomEntryBatch(level,position,count);
+    }
+}