Эх сурвалжийг харах

使用背包物品打造装备

toby 1 жил өмнө
parent
commit
18e6217e08

+ 2 - 2
logic/bag-logic/src/main/java/com/iohao/mmo/bag/region/internal/equip/BuildEquipUseProcess.java

@@ -107,8 +107,8 @@ public class BuildEquipUseProcess implements UseProcess {
 
         log.info("调用【装备模块-api】开始打造装备 : {}", bagItem);
         EquipResetMessage equipResetMessage = new EquipResetMessage();
-        equipResetMessage.itemId = "";
-        equipResetMessage.excellentRateString = "0.3";
+        equipResetMessage.itemId = "64dce13e57b5d15c8a6972d0";
+        equipResetMessage.excellentRateString = "0.5";
         EquipExchange.resetEquip(equipResetMessage,flowContext);
         return bagItem;
     }

+ 5 - 5
logic/equip-logic/src/main/java/com/iohao/mmo/equip/action/EquipAction.java

@@ -17,6 +17,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -37,13 +38,12 @@ public class EquipAction {
      * 获取某人装备列表信息
      *
      * @param flowContext flowContext
-     * @param store 所属位置:1包裹,2仓库,3穿戴
      */
     @ActionMethod(EquipCmd.getEquipList)
-    public List<EquipMessage> getEquipList(FlowContext flowContext,int store) { //参数值
+    public List<EquipMessage> getEquipList(FlowContext flowContext) { //参数值
         long userId = flowContext.getUserId();
         // 初始化装备数据,暂时放这
-        List<Equip> equipList = equipService.listByUser(userId,store);
+        List<Equip> equipList = equipService.listByUser(userId);
 
         return EquipMapper.ME.convert(equipList);
     }
@@ -57,7 +57,7 @@ public class EquipAction {
     @ActionMethod(EquipCmd.getEquip)
     public EquipMessage getEquip(FlowContext flowContext, StringValue stringValue) { //参数值
         // 初始化装备数据,暂时放这
-        Equip equip = equipService.findById(stringValue.value);
+        Equip equip = equipService.findByItemId(stringValue.value);
         return EquipMapper.ME.convert(equip);
     }
 
@@ -91,6 +91,6 @@ public class EquipAction {
      */
     @ActionMethod(EquipCmd.delBatch)
     public void delBatch(FlowContext flowContext, StringValue stringValue) { //参数值
-        equipService.delBatch(stringValue.value);
+        equipService.delBatch(Arrays.asList(stringValue.value.split("-")));
     }
 }

+ 3 - 3
logic/equip-logic/src/main/java/com/iohao/mmo/equip/action/EquipTemplateAction.java

@@ -68,11 +68,11 @@ public class EquipTemplateAction {
     @ActionMethod(EquipCmd.randomEquip)
     public List<EquipMessage> randomEquip(FlowContext flowContext, StringValue stringValve) { //参数值
         long userId = flowContext.getUserId();
-        String[] ids = stringValve.value.split("-");
+        String[] itemIds = stringValve.value.split("-");
         List<EquipMessage> equipMessageList = new ArrayList<>();
-        for(String id:ids){
+        for(String item:itemIds){
             // 初始化装备数据,暂时放这
-            Equip equip = equipTemplateService.randomEquip(id,userId);
+            Equip equip = equipTemplateService.randomEquip(item,userId);
             EquipMessage equipMessage = EquipMapper.ME.convert(equip);
             equipMessageList.add(equipMessage);
         }

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

@@ -34,6 +34,8 @@ import org.springframework.data.mongodb.core.mapping.Document;
 public class Equip {
     @Id
     String id;
+    /** 物品id */
+    String itemId;
     /** 玩家 */
     long userId;
     /** 装备名 */
@@ -58,6 +60,4 @@ public class Equip {
     String equipTemplateId;
     /** 基础属性 */
     BasicEquipProperty basicEquipProperty;
-    /** 是否删除 */
-    boolean delFlag = false;
 }

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

@@ -34,6 +34,8 @@ import org.springframework.data.mongodb.core.mapping.Document;
 public class EquipTemplate {
     @Id
     String id;
+    /** 物品id */
+    String itemId;
     /** 所属物品 */
     Goods goods;
     /** 部位(0帽子,1衣服,2武器,3手镯,4裤子,5鞋子) */
@@ -44,6 +46,4 @@ public class EquipTemplate {
     int totalAttrMin;
     /** 自定义属性随机范围最大值 */
     int totalAttrMax;
-    /** 是否删除 */
-    boolean delFlag = false;
 }

+ 0 - 4
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/Goods.java

@@ -50,8 +50,4 @@ public class Goods {
     boolean dealFlag;
     /** 物品类型:0装备,1药品,2材料,3装备库 */
     int type;
-    /** 所属位置:1包裹,2仓库,3穿戴 */
-    int store = 1;
-    /** 是否删除 */
-    boolean delFlag = false;
 }

+ 33 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/entity/GoodsGarbage.java

@@ -0,0 +1,33 @@
+package com.iohao.mmo.equip.entity;
+
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.experimental.FieldDefaults;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @author 唐斌
+ * @date 2023-08-16
+ * @description: 物品回收站
+ */
+@Data
+@Document
+@FieldDefaults(level = AccessLevel.PRIVATE)
+public class GoodsGarbage {
+    private String id;
+    private String type;
+    private Object data;
+    @Indexed
+    private String collectedTime;
+
+    public GoodsGarbage() {
+    }
+
+    public GoodsGarbage(String id, String type, Object data, String collectedTime) {
+        this.id = id;
+        this.type = type;
+        this.data = data;
+        this.collectedTime = collectedTime;
+    }
+}

+ 53 - 0
logic/equip-logic/src/main/java/com/iohao/mmo/equip/listener/EquipEventListener.java

@@ -0,0 +1,53 @@
+package com.iohao.mmo.equip.listener;
+
+import com.iohao.mmo.equip.entity.GoodsGarbage;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
+import org.springframework.data.mongodb.core.mapping.event.BeforeDeleteEvent;
+import org.springframework.data.mongodb.core.query.BasicQuery;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author 唐斌
+ * @date 2023-08-16
+ * @description: 监听删除事件,重写删除装备为逻辑删除
+ */
+@Component
+public class EquipEventListener extends AbstractMongoEventListener<Object> {
+    private final MongoTemplate mongoTemplate;
+    //声明需要格式化的格式(日期加时间)
+    DateTimeFormatter dfDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    public EquipEventListener(MongoTemplate mongoTemplate) {
+        this.mongoTemplate = mongoTemplate;
+    }
+
+    @Override
+    public void onBeforeDelete(BeforeDeleteEvent<Object> event) {
+        Set<String> setString = Stream.of("goods","equip", "equipTemplate")
+                .collect(Collectors.toUnmodifiableSet());
+        if (event.getType() == null || CollectionUtils.isEmpty(event.getDocument())
+                || StringUtils.isBlank(event.getCollectionName()) || !setString.contains(event.getCollectionName())) {
+            return;
+        }
+        // 通过事件中返回的`document`对象查询待删除的数据
+        List<Object> objects = mongoTemplate.find(new BasicQuery(event.getDocument()), event.getType());
+        if (!CollectionUtils.isEmpty(objects)) {
+            // 在数据删除前,将所有数据迁移至`garbage`集合中
+            String type = event.getCollectionName();
+            String nowStr = LocalDateTime.now().format(dfDateTime);
+            List<GoodsGarbage> equipGarbageList = objects.stream()
+                    .map(o -> new GoodsGarbage(null, type, o, nowStr))
+                    .collect(Collectors.toList());
+            mongoTemplate.insertAll(equipGarbageList);
+        }
+    }
+}

+ 15 - 49
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipService.java

@@ -21,6 +21,7 @@ package com.iohao.mmo.equip.service;
 import com.iohao.mmo.common.config.GameCode;
 import com.iohao.mmo.equip.entity.BasicEquipProperty;
 import com.iohao.mmo.equip.entity.Equip;
+import com.iohao.mmo.equip.entity.EquipTemplate;
 import com.iohao.mmo.equip.entity.Goods;
 import com.iohao.mmo.equip.utils.RandomUtils;
 import com.mongodb.bulk.BulkWriteResult;
@@ -35,6 +36,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 /**
@@ -50,64 +52,28 @@ public class EquipService {
     public Equip findById(String id) {
         return  mongoTemplate.findById(id, Equip.class);
     }
+    public Equip findByItemId(String itemId) {
+        return  Objects.requireNonNull(mongoTemplate.findOne(Query.query(new Criteria("itemId").is(itemId)), Equip.class));
+    }
 
     /**
      * 根据用户查找所有装备
      * @param userId
-     * @param store 所属位置:1包裹,2仓库,3穿戴
      * @return
      */
-    public List<Equip> listByUser(long userId,int store) {
+    public List<Equip> listByUser(long userId) {
         Query query = new Query();
         query.addCriteria(Criteria.where("userId").is(userId));
-        query.addCriteria(Criteria.where("delFlag").is(false));
-        if(store>0) {
-            query.addCriteria(Criteria.where("goods.store").is(store));
-        }
 
         return  mongoTemplate.find(query,Equip.class);
     }
+    public void delBatch(List<String> idList) {
+        Query query = new Query(new Criteria("itemId").in(idList));
+        mongoTemplate.remove(query, Equip.class);
 
-    public void delBatch(String ids) {
-        String[] idsArr = ids.split("-");
-        GameCode.objNotFound.assertTrue(idsArr.length>0);
-        Query query = new Query();
-        query.addCriteria(Criteria.where("id").in(Arrays.asList(idsArr)));
-
-        // 更新的字段
-        Update update = new Update();
-        //获取分配的字段
-        update.set("delFlag", true);
-        update.set("goods.delFlag", true);
-
-        //UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
-        BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Equip.class);
-        bulkOps.updateMulti(query, update);
-        BulkWriteResult result = bulkOps.execute();
-        //逻辑删除对应的商品
-        delGoodsByChildBatch(idsArr);
-    }
-
-    /**
-     * 根据子表id批量删除物品(逻辑删除)
-     * @param detailIdArr 子表主键
-     */
-    public void delGoodsByChildBatch(String[] detailIdArr) {
-        if (detailIdArr.length==0) {
-            return;
-        }
-        Query query = new Query();
-        query.addCriteria(Criteria.where("detailId").in(Arrays.asList(detailIdArr)));
-
-        // 更新的字段
-        Update update = new Update();
-        //获取分配的字段
-        update.set("delFlag", true);
-
-        //UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
-        BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Goods.class);
-        bulkOps.updateMulti(query, update);
-        BulkWriteResult result = bulkOps.execute();
+        //删除物品
+        Query goodsQuery = new Query(new Criteria("id").in(idList));
+        mongoTemplate.remove(goodsQuery, Goods.class);
     }
 
     /**
@@ -116,7 +82,7 @@ public class EquipService {
      */
     public void allotEquip(Equip equip){
         //判定总点数是否合法
-        Equip oldEquip = mongoTemplate.findById(equip.getId(), Equip.class);
+        Equip oldEquip = findByItemId(equip.getItemId());
 
         GameCode.objNotFound.assertTrue(oldEquip!=null);
 
@@ -127,7 +93,7 @@ public class EquipService {
 
         // 查询条件,如果数据存在更新
         Query query = new Query();
-        query.addCriteria(Criteria.where("id").is(equip.getId()));
+        query.addCriteria(Criteria.where("itemId").is(equip.getItemId()));
 
         // 更新的字段
         Update update = new Update();
@@ -144,7 +110,7 @@ public class EquipService {
      * @param excellentRate 增加的极品率
      */
     public Equip resetEquip(String itemId, BigDecimal excellentRate){
-        Equip equip = findById(itemId);
+        Equip equip = findByItemId(itemId);
         GameCode.objNotFound.assertTrue(equip!=null);
 
         int randomMin = equip.getTotalAttrMin();

+ 19 - 49
logic/equip-logic/src/main/java/com/iohao/mmo/equip/service/EquipTemplateService.java

@@ -38,6 +38,8 @@ import org.springframework.stereotype.Service;
 import java.beans.JavaBean;
 import java.math.BigDecimal;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * @author 唐斌
@@ -53,6 +55,9 @@ public class EquipTemplateService {
     public EquipTemplate findById(String id) {
         return  mongoTemplate.findById(id, EquipTemplate.class);
     }
+    public EquipTemplate findByItemId(String itemId) {
+        return  Objects.requireNonNull(mongoTemplate.findOne(Query.query(new Criteria("itemId").is(itemId)), EquipTemplate.class));
+    }
 
     public void save(EquipTemplate equipTemplate) {
         if(StringUtils.isNotBlank(equipTemplate.getId())){
@@ -62,54 +67,20 @@ public class EquipTemplateService {
             Goods goods = equipTemplate.getGoods();
             goods.setType(3);
             mongoTemplate.save(goods);
-            equipTemplate.setId(goods.getId());
+            equipTemplate.setItemId(goods.getId());
             equipTemplate.setGoods(goods);
             mongoTemplate.save(equipTemplate);
         }
     }
 
-    public void delBatch(String ids) {
-        String[] idsArr = ids.split("-");
-        GameCode.objNotFound.assertTrue(idsArr.length>0);
-        Query query = new Query();
-        query.addCriteria(Criteria.where("id").in(Arrays.asList(idsArr)));
-
-        // 更新的字段
-        Update update = new Update();
-        //获取分配的字段
-        update.set("delFlag", true);
-        update.set("goods.delFlag", true);
-
-        //UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
-        BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, EquipTemplate.class);
-        bulkOps.updateMulti(query, update);
-        BulkWriteResult result = bulkOps.execute();
-
-        //逻辑删除对应的商品
-        delGoodsByChildBatch(idsArr);
+    public void delBatch(List<String> idList) {
+        Query query = new Query(new Criteria("itemId").in(idList));
+        mongoTemplate.remove(query, EquipTemplate.class);
+        //删除物品
+        Query goodsQuery = new Query(new Criteria("id").in(idList));
+        mongoTemplate.remove(goodsQuery, Goods.class);
     }
 
-    /**
-     * 根据子表id批量删除物品(逻辑删除)
-     * @param detailIdArr 子表主键
-     */
-    public void delGoodsByChildBatch(String[] detailIdArr) {
-        if (detailIdArr.length==0) {
-            return;
-        }
-        Query query = new Query();
-        query.addCriteria(Criteria.where("detailId").in(Arrays.asList(detailIdArr)));
-
-        // 更新的字段
-        Update update = new Update();
-        //获取分配的字段
-        update.set("delFlag", true);
-
-        //UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
-        BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Goods.class);
-        bulkOps.updateMulti(query, update);
-        BulkWriteResult result = bulkOps.execute();
-    }
 
     public void initEquipTemplate() {
         // 初始化一些装备配置,后期将移到 excel 中做。
@@ -129,7 +100,7 @@ public class EquipTemplateService {
         goods.setDealFlag(true);
         goods.setType(3);
         mongoTemplate.save(goods);
-        equipTemplate.setId(goods.getId());
+        equipTemplate.setItemId(goods.getId());
         equipTemplate.setGoods(goods);
 
         mongoTemplate.save(equipTemplate);
@@ -151,7 +122,7 @@ public class EquipTemplateService {
         goods2.setDealFlag(true);
         goods2.setType(3);
         mongoTemplate.save(goods2);
-        equipTemplate2.setId(goods2.getId());
+        equipTemplate2.setItemId(goods2.getId());
         equipTemplate2.setGoods(goods2);
 
         mongoTemplate.save(equipTemplate2);
@@ -160,14 +131,12 @@ public class EquipTemplateService {
 
     /**
      * 根据装备库随机一件新的装备
-     * @param equipTemplateId
+     * @param equipTemplateItemId
      * @return
      */
-    public Equip randomEquip(String equipTemplateId,long userId){
+    public Equip randomEquip(String equipTemplateItemId,long userId){
         //取到装备库
-        EquipTemplate equipTemplate = mongoTemplate.findById(equipTemplateId, EquipTemplate.class);
-
-        GameCode.objNotFound.assertTrue(equipTemplate!=null);
+        EquipTemplate equipTemplate = findByItemId(equipTemplateItemId);
 
         Equip equip = new Equip();
         //新建装备对应的物品类
@@ -178,7 +147,8 @@ public class EquipTemplateService {
         //将装备库属性拷贝到装备中
         //对应的物品数据是新建的
         BeanUtils.copyProperties(equipTemplate,equip);
-        equip.setId(goods.getId());
+        equip.setId(null);
+        equip.setItemId(goods.getId());
         equip.setGoods(goods);
         equip.setName(equipTemplate.getGoods().getName());
         //品质

+ 5 - 14
provide/equip-provide/src/main/java/com/iohao/mmo/equip/client/EquipInputCommandRegion.java

@@ -54,20 +54,11 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
     private void request() {
         InputRequestData inputRequestData;
 
-        // 动态请求参数(参数值)
-        inputRequestData = () -> {
-            ScannerKit.log(() -> log.info("请输入获取的装备存储位置:0所有,1包裹,2仓库,3穿戴"));
-            int inputValue = ScannerKit.nextInt(0);
-
-            // 请求参数
-            IntValue intValue = IntValue.of(inputValue);
-            return intValue;
-        };
         // 10-1
         ofCommand(EquipCmd.getEquipList).callback(ByteValueList.class, result -> {
             List<EquipMessage> value = result.toList(EquipMessage.class);
             log.info("装备列表信息 : {}", JsonKit.toJsonString(value));
-        }).setDescription("获取装备列表信息").setInputRequestData(inputRequestData);
+        }).setDescription("获取装备列表信息");
 
         // 动态请求参数(参数值)
         inputRequestData = () -> {
@@ -89,7 +80,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
         // 动态请求参数(参数值)
         inputRequestData = () -> {
             ScannerKit.log(() -> log.info("请输入装备itemId"));
-            String id = ScannerKit.nextLine();
+            String itemId = ScannerKit.nextLine();
             ScannerKit.log(() -> log.info("请输入体质、魔力、力量、耐力、敏捷,格式[体质-魔力-力量-耐力-敏捷]"));
             String inputValue = ScannerKit.nextLine("1-1-1-1-1");
             SplitParam param = new SplitParam(inputValue);
@@ -102,7 +93,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
             BasicEquipPropertyMessage basicEquipPropertyMessage = new BasicEquipPropertyMessage(constitution,magicPower,power,endurance,agile);
             EquipMessage equipMessage = new EquipMessage();
             equipMessage.basicEquipProperty = basicEquipPropertyMessage;
-            equipMessage.id = id;
+            equipMessage.itemId = itemId;
             return equipMessage;
         };
 
@@ -115,7 +106,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
 
         // 动态请求参数(参数值)
         inputRequestData = () -> {
-            ScannerKit.log(() -> log.info("请输入装备id和消耗道具id,格式 [装备id-增益百分比]"));
+            ScannerKit.log(() -> log.info("请输入装备itemId和极品概率增益百分比,格式 [装备id-增益百分比]"));
             String inputValue = ScannerKit.nextLine("1-0.3");
             SplitParam param = new SplitParam(inputValue);
             String itemId = param.getString(0);
@@ -158,7 +149,7 @@ public class EquipInputCommandRegion extends AbstractInputCommandRegion {
 
         // 动态请求参数(参数值)
         inputRequestData = () -> {
-            ScannerKit.log(() -> log.info("请输入装备库id列表,格式 [装备库1id-装备库2id-装备库3id...]"));
+            ScannerKit.log(() -> log.info("请输入装备库itemId列表,格式 [装备库itemId1-装备库itemId2-装备库itemId3...]"));
             String ids = ScannerKit.nextLine("1-1");
 
             // 请求参数

+ 2 - 2
provide/equip-provide/src/main/java/com/iohao/mmo/equip/proto/EquipMessage.java

@@ -34,6 +34,8 @@ import lombok.experimental.FieldDefaults;
 public class EquipMessage{
     /** 装备id */
     String id;
+    /** 对应物品id */
+    String itemId;
     /** 玩家 */
     long userId;
     /** 装备名 */
@@ -58,6 +60,4 @@ public class EquipMessage{
     String equipTemplateId;
     /** 基础属性 */
     BasicEquipPropertyMessage basicEquipProperty;
-    /** 是否删除 */
-    boolean delFlag = false;
 }

+ 0 - 2
provide/equip-provide/src/main/java/com/iohao/mmo/equip/proto/EquipTemplateMessage.java

@@ -46,6 +46,4 @@ public class EquipTemplateMessage{
     int totalAttrMin;
     /** 自定义属性随机范围最大值 */
     int totalAttrMax;
-    /** 是否删除 */
-    boolean delFlag = false;
 }

+ 0 - 4
provide/equip-provide/src/main/java/com/iohao/mmo/equip/proto/GoodsMessage.java

@@ -54,8 +54,4 @@ public class GoodsMessage {
     int type;
     /** 子表主键 */
     String detailId;
-    /** 所属位置:1包裹,2仓库,3穿戴 */
-    int store = 1;
-    /** 是否删除 */
-    boolean delFlag = false;
 }