Przeglądaj źródła

修复BUG单-W301H-561,增加添加好友时返回对应结果类型

tea.yu 1 miesiąc temu
rodzic
commit
bb4c1f5f2f

+ 3 - 2
api-user/src/main/java/com/sikey/wa04/api/user/client/wristwatch/FriendWristwatchController.java

@@ -4,6 +4,7 @@ import com.sikey.wa04.business.application.service.user.FriendService;
 import com.sikey.wa04.business.infrastructure.configuration.ProjectContextConstant;
 import com.sikey.wa04.business.infrastructure.dto.request.contact.AddFriendRequest;
 import com.sikey.wa04.business.infrastructure.dto.request.contact.GenerateFriendCodeRequest;
+import com.sikey.wa04.business.infrastructure.dto.response.contact.AddFriendResponse;
 import com.sikey.wa04.business.infrastructure.dto.response.contact.GenerateFriendCodeResponse;
 import com.sikey.wa04.common.BaseController;
 import com.sikey.wa04.common.dto.header.GenericManufacturerHeader;
@@ -44,10 +45,10 @@ public class FriendWristwatchController extends BaseController {
      */
     @Authenticated
     @PostMapping("/friend/add")
-    public void addFriend(@Valid @RequestBody AddFriendRequest request) throws Exception {
+    public AddFriendResponse addFriend(@Valid @RequestBody AddFriendRequest request) {
         request.setId(CurrentRequestUser.get().getId());
         request.setHeaders(genericManufacturerHeader());
-        friendService.addFriend(request);
+        return friendService.addFriend(request);
     }
 
 }

+ 79 - 61
business-application/src/main/java/com/sikey/wa04/business/application/service/user/FriendService.java

@@ -1,47 +1,41 @@
 package com.sikey.wa04.business.application.service.user;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONUtil;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import com.sikey.wa04.business.application.converter.MessageConverter;
 import com.sikey.wa04.business.domain.adapter.*;
-import com.sikey.wa04.business.domain.entity.*;
+import com.sikey.wa04.business.domain.entity.Child;
+import com.sikey.wa04.business.domain.entity.ChildId;
+import com.sikey.wa04.business.domain.entity.MessageCenter;
 import com.sikey.wa04.business.domain.entity.message.Message;
 import com.sikey.wa04.business.domain.entity.message.MessageId;
 import com.sikey.wa04.business.domain.usecase.ChildIdFactory;
 import com.sikey.wa04.business.infrastructure.adapter.RabbitMQMessaging;
 import com.sikey.wa04.business.infrastructure.adapter.RedisMessageIdIncrementingAdapter;
-import com.sikey.wa04.business.infrastructure.dto.model.ChildModel;
 import com.sikey.wa04.business.infrastructure.dto.model.ContactModel;
 import com.sikey.wa04.business.infrastructure.dto.model.DeviceModel;
 import com.sikey.wa04.business.infrastructure.dto.request.contact.AddFriendRequest;
 import com.sikey.wa04.business.infrastructure.dto.request.contact.GenerateFriendCodeRequest;
+import com.sikey.wa04.business.infrastructure.dto.response.contact.AddFriendResponse;
 import com.sikey.wa04.business.infrastructure.dto.response.contact.GenerateFriendCodeResponse;
 import com.sikey.wa04.business.infrastructure.repository.ChildRepository;
 import com.sikey.wa04.business.infrastructure.repository.ContactRepository;
 import com.sikey.wa04.business.infrastructure.repository.DeviceRepository;
 import com.sikey.wa04.common.dto.header.GenericManufacturerHeader;
 import com.sikey.wa04.common.dto.message.AddFriendNoticeMessage;
-import com.sikey.wa04.common.enums.ContactRole;
-import com.sikey.wa04.common.enums.MessageCenterType;
-import com.sikey.wa04.common.enums.MessageType;
-import com.sikey.wa04.common.enums.UserType;
+import com.sikey.wa04.common.enums.*;
 import jakarta.annotation.Resource;
 import jakarta.transaction.Transactional;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
 import java.time.Instant;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 
@@ -146,7 +140,6 @@ public class FriendService {
         return new GenerateFriendCodeResponse(friendCode);
     }
 
-
     /**
      * 添加好友
      *
@@ -154,59 +147,83 @@ public class FriendService {
      * @throws Exception 异常
      */
     @Transactional
-    public void addFriend(AddFriendRequest request) throws Exception {
-        ConcurrentMap<String, String> cacheCodes = friendCodeCache.asMap();
-
+    public AddFriendResponse addFriend(AddFriendRequest request) {
         String ticket = null;
-        Set<String> keys = cacheCodes.keySet();
-        for (String key : keys) {
-            Optional<String> friendCodeOptional = Optional.ofNullable(cacheCodes.getOrDefault(key, null));
-            if (friendCodeOptional.isEmpty()) {
-                continue;
+        ChildId passiveChildId;
+        Child passiveChild;
+        Child activeChild;
+        try {
+            ConcurrentMap<String, String> cacheCodes = friendCodeCache.asMap();
+
+            Set<String> keys = cacheCodes.keySet();
+            for (String key : keys) {
+                Optional<String> friendCodeOptional = Optional.ofNullable(cacheCodes.getOrDefault(key, null));
+                if (friendCodeOptional.isEmpty()) {
+                    continue;
+                }
+
+                String friendCode = friendCodeOptional.get();
+                if (request.getCode().equals(friendCode)) {
+                    ticket = key;
+                }
             }
 
-            String friendCode = friendCodeOptional.get();
-            if (request.getCode().equals(friendCode)) {
-                ticket = key;
+            // 判断好友码是否存在,如果 ticket 存在 则开始执行下面的逻辑
+            if (ticket == null) {
+                AddFriendResponse  resp = new AddFriendResponse().setResultType(AddFriendResultType.FRIEND_CODE_NOT_EXIST.getValue());
+                log.info("[addFriend] JSONUtil resp:{}", JSONUtil.toJsonPrettyStr(resp));
+                log.info("[addFriend] resp:{}", resp);
+                log.info("[addFriend] resp.toString:{}", resp.toString());
+                return resp;
             }
-        }
 
-        // 如果 ticket 存在 则开始执行下面的逻辑
-        if (ticket == null) {
-            throw new RuntimeException("好友码不存在");
-        }
+            // 获取 被动添加 小孩信息
+            passiveChildId = deviceBindStateAdapter.getBinder(ticket);
+            passiveChild = childQueryAdapter.findByChildId(passiveChildId);
+            // 获取 主动添加 小孩信息
+            activeChild = childQueryAdapter.findByChildId(ChildIdFactory.create(request.getId()));
 
-        // 获取双方小孩信息
-        ChildId passiveChildId = deviceBindStateAdapter.getBinder(ticket);
-        Child passiveChild = childQueryAdapter.findByChildId(passiveChildId);
-        Child activeChild = childQueryAdapter.findByChildId(ChildIdFactory.create(request.getId()));
-
-        // 向被加用户的好友列表中添加好友
-        ContactModel passiveContactModel = new ContactModel();
-        passiveContactModel.setChildId(passiveChildId.getId())
-                .setRefId(request.getId())
-                .setRefRole(ContactRole.FRIEND.getValue())
-                .setRefType(UserType.CHILD.getValue())
-                .setRemarkName(activeChild.getName())
-                .setRemarkAvatar(activeChild.getAvatar());
-        contactRepository.save(passiveContactModel);
-
-        // 向发起用户的好友列表中添加好友
-        ContactModel activeContactModel = new ContactModel();
-        activeContactModel.setChildId(activeChild.getId())
-                .setRefId(passiveChildId.getId())
-                .setRefRole(ContactRole.FRIEND.getValue())
-                .setRefType(UserType.CHILD.getValue())
-                .setRemarkName(passiveChild.getName())
-                .setRemarkAvatar(passiveChild.getAvatar());
-        contactRepository.save(activeContactModel);
-
-        friendCodeCache.invalidate(ticket);
-
-        // 更新家长通讯录中的手表儿童昵称等信息
-        contactRepository.updateContactByChildId(passiveChild.getName(), passiveChild.getAvatar(), Instant.now(), activeChild.getId(), passiveChildId.getId());
-
-        log.info("添加好友成功, ticket: {}", ticket);
+            //判断是否添加自己为好友
+            if (Objects.equals(activeChild.getId(), passiveChild.getId())) {
+                return new AddFriendResponse().setResultType(AddFriendResultType.ADD_MYSELF_FRIEND.getValue());
+            }
+
+            //判断是否重复添加好友 查询主动添加的小孩的通讯录中是否有被动添加的小孩了
+            ContactModel contactModel = contactRepository.findByChildIdAndRefId(request.getId(), passiveChildId.getId());
+            if (Objects.nonNull(contactModel)) {
+                return new AddFriendResponse().setResultType(AddFriendResultType.FRIEND_REPEAT.getValue());
+            }
+
+            // 向被加用户的好友列表中添加好友
+            ContactModel passiveContactModel = new ContactModel();
+            passiveContactModel.setChildId(passiveChildId.getId())
+                    .setRefId(request.getId())
+                    .setRefRole(ContactRole.FRIEND.getValue())
+                    .setRefType(UserType.CHILD.getValue())
+                    .setRemarkName(activeChild.getName())
+                    .setRemarkAvatar(activeChild.getAvatar());
+            contactRepository.save(passiveContactModel);
+
+            // 向发起用户的好友列表中添加好友
+            ContactModel activeContactModel = new ContactModel();
+            activeContactModel.setChildId(activeChild.getId())
+                    .setRefId(passiveChildId.getId())
+                    .setRefRole(ContactRole.FRIEND.getValue())
+                    .setRefType(UserType.CHILD.getValue())
+                    .setRemarkName(passiveChild.getName())
+                    .setRemarkAvatar(passiveChild.getAvatar());
+            contactRepository.save(activeContactModel);
+
+            friendCodeCache.invalidate(ticket);
+
+            // 更新家长通讯录中的手表儿童昵称等信息
+            contactRepository.updateContactByChildId(passiveChild.getName(), passiveChild.getAvatar(), Instant.now(), activeChild.getId(), passiveChildId.getId());
+
+            log.info("添加好友成功, ticket: {}", ticket);
+        } catch (Exception e) {
+            log.error("AddFriend failed error: Id:{}; ", request.getId(), e);
+            return new AddFriendResponse().setResultType(AddFriendResultType.FAILED.getValue());
+        }
 
         // 消息中心
         String finalTicket = ticket;
@@ -235,8 +252,8 @@ public class FriendService {
             deviceRepository.updateVersionAndModelById(deviceModel.getId(), softWareVersion, model);
         });
 
-        GenericManufacturerHeader genericManufacturerHeader = request.getHeaders();
         // 添加好友加过通知消息
+        GenericManufacturerHeader genericManufacturerHeader = request.getHeaders();
         myTaskExecutor.execute(() -> {
             // 向被加用户和发起用户发送加好友成功的通知消息
             AddFriendNoticeMessage.AddFriendNoticeContent content = new AddFriendNoticeMessage.AddFriendNoticeContent()
@@ -268,6 +285,7 @@ public class FriendService {
             publish(genericManufacturerHeader, activeChildMessage);
         });
 
+        return new AddFriendResponse().setResultType(AddFriendResultType.SUCC.getValue());
     }
 
     private void publish(GenericManufacturerHeader headers, Message message) {

+ 47 - 0
business-common/src/main/java/com/sikey/wa04/common/enums/AddFriendResultType.java

@@ -0,0 +1,47 @@
+package com.sikey.wa04.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 添加好友结果类型
+ *
+ * @author yuzenghui
+ */
+@Getter
+public enum AddFriendResultType {
+    /**
+     * 成功添加好友
+     */
+    SUCC(1),
+    /**
+     * 添加失败
+     */
+    FAILED(2),
+    /**
+     * 您已添加过好友
+     */
+    FRIEND_REPEAT(3),
+    /**
+     * 好友码未找到或已过期
+     */
+    FRIEND_CODE_NOT_EXIST(4),
+    /**
+     * 无法添加自己为好友
+     */
+    ADD_MYSELF_FRIEND(5);
+
+    private final Integer value;
+
+    AddFriendResultType(Integer value) {
+        this.value = value;
+    }
+
+    public static AddFriendResultType valueOf(Integer value) {
+        for (AddFriendResultType role : values()) {
+            if (role.value.equals(value)) {
+                return role;
+            }
+        }
+        throw new IllegalArgumentException("No such value: " + value);
+    }
+}

+ 21 - 0
business-infrastructure/src/main/java/com/sikey/wa04/business/infrastructure/dto/response/contact/AddFriendResponse.java

@@ -0,0 +1,21 @@
+package com.sikey.wa04.business.infrastructure.dto.response.contact;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Author: yuzenghui
+ * @Date: 2025/08/22
+ * @Description: 添加好友
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class AddFriendResponse {
+
+    /**
+     * 添加好友状态码
+     */
+    private Integer resultType;
+}