浏览代码

企微回调加好友恢复正常状态

xw 4 天之前
父节点
当前提交
1739ab6aba

+ 34 - 11
fs-qw-api/src/main/java/com/fs/app/service/QwDataCallbackService.java

@@ -214,9 +214,13 @@ public class QwDataCallbackService {
 
                             String userId = root.getElementsByTagName("UserID").item(0).getTextContent();
                             String externalUserId = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
-                            String cacheKey = "qwApiExternal:" + userId + ":" + corpId + ":" + externalUserId;
-                            String lockKey = "lock:qwApiExternal:" + userId + ":" + corpId + ":" + externalUserId; // 锁Key(Hash类型,加前缀lock:)
-                            QwUser qwUser = qwUserMapper.selectQwUserByCorpIdAndUserId(corpId, root.getElementsByTagName("UserID").item(0).getTextContent());
+                            String cacheKey = buildQwApiExternalCacheKey(userId, corpId, externalUserId);
+                            String lockKey = "lock:" + cacheKey;
+                            QwUser qwUser = qwUserMapper.selectQwUserByCorpIdAndUserId(corpId, userId);
+                            if (qwUser == null) {
+                                log.warn("add_external_contact:未找到企微员工,corpId={}, userId={}, externalUserId={}", corpId, userId, externalUserId);
+                                break;
+                            }
                             log.info("qw_user_id:{}:客户进量", qwUser.getId());
 
                             // 2. 获取 Redisson 分布式锁
@@ -232,20 +236,27 @@ public class QwDataCallbackService {
                                         try {
                                             // 5. 新增用户
                                             log.info("qw_user_id:{}:进入新增逻辑", qwUser.getId());
-                                            qwExternalContactService.insertQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),null,corpId,State,WelcomeCode, qwUser);
+                                            qwExternalContactService.insertQwExternalContactByExternalUserId(externalUserId, userId, null, corpId, State, WelcomeCode, qwUser);
                                             // 6. 业务逻辑执行成功后,写入 Redis 缓存(有效期 10 分钟)
                                             redisCache.setCacheObject(cacheKey, "1", 10, TimeUnit.MINUTES);
 
                                             // 广告线索处理
-                                            leadService.updateAddMemberLead(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId,State);
+                                            leadService.updateAddMemberLead(externalUserId, userId, corpId, State);
                                         } catch (Exception e) {
                                             // 7. 业务逻辑失败时,删除缓存
                                             redisCache.deleteObject(cacheKey);
+                                            log.error("add_external_contact 处理失败: externalUserId={}, userId={}", externalUserId, userId, e);
                                         }
+                                    } else {
+                                        log.info("qw_user_id:{}:命中Redis防重,执行删了又加恢复: externalUserId={}", qwUser.getId(), externalUserId);
+                                        qwExternalContactService.restoreExternalContactOnReAdd(externalUserId, userId, corpId);
                                     }
+                                } else {
+                                    log.warn("add_external_contact 未获取到锁: externalUserId={}, userId={}", externalUserId, userId);
                                 }
                             } catch (InterruptedException e) {
-                                logger.error("中断异常");
+                                logger.error("add_external_contact 中断异常", e);
+                                Thread.currentThread().interrupt();
                             } finally {
                                 // 4. 确保锁最终被释放(只有加锁成功的线程才需要释放)
                                 if (isLocked && lock.isHeldByCurrentThread()) {
@@ -258,16 +269,24 @@ public class QwDataCallbackService {
                             log.info("企业联系人时间变更,edit_external_contact:{}", sMsg);
                             qwExternalContactService.updateQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
                             break;
-                        case "del_external_contact":
+                        case "del_external_contact": {
+                            String delUserId = root.getElementsByTagName("UserID").item(0).getTextContent();
+                            String delExternalUserId = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
                             log.info("企业联系人时间变更,del_external_contact:{}", sMsg);
-                            qwExternalContactService.deleteQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
+                            redisCache.deleteObject(buildQwApiExternalCacheKey(delUserId, corpId, delExternalUserId));
+                            qwExternalContactService.deleteQwExternalContactByExternalUserId(delExternalUserId, delUserId, corpId);
                             break;
-                        case "del_follow_user":
+                        }
+                        case "del_follow_user": {
+                            String lossUserId = root.getElementsByTagName("UserID").item(0).getTextContent();
+                            String lossExternalUserId = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
                             log.info("企业联系人时间变更,del_follow_user:{}", sMsg);
-                            qwExternalContactService.deletefollowUserByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
+                            redisCache.deleteObject(buildQwApiExternalCacheKey(lossUserId, corpId, lossExternalUserId));
+                            qwExternalContactService.deletefollowUserByExternalUserId(lossExternalUserId, lossUserId, corpId);
                             // 广告线索处理
-                            leadService.updateDeleteMemberLead(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
+                            leadService.updateDeleteMemberLead(lossExternalUserId, lossUserId, corpId);
                             break;
+                        }
                         case "transfer_fail":
                             log.info("企业联系人时间变更,transfer_fail:{}", sMsg);
                             qwExternalContactService.transferFailByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId,root.getElementsByTagName("FailReason").item(0).getTextContent());
@@ -881,4 +900,8 @@ public class QwDataCallbackService {
         return s;
     }
 
+    private String buildQwApiExternalCacheKey(String userId, String corpId, String externalUserId) {
+        return "qwApiExternal:" + userId + ":" + corpId + ":" + externalUserId;
+    }
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -145,6 +145,11 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
 
     void deletefollowUserByExternalUserId(String externalUserID, String userID, String corpId);
 
+    /**
+     * 删了又加:命中 Redis 防重或仅需恢复好友关系时,将 status 恢复为 0
+     */
+    void restoreExternalContactOnReAdd(String externalUserID, String userID, String corpId);
+
     void transferFailByExternalUserId(String externalUserID, String userID, String corpId,String failReason);
 
     /**

+ 14 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -4877,6 +4877,20 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
 
     }
 
+    @Override
+    public void restoreExternalContactOnReAdd(String externalUserID, String userID, String corpId) {
+        QwExternalContact qwExternalContact = qwExternalContactMapper.selectQwExternalContactUserIdAndExternalIdAndCompanyId(externalUserID, userID, corpId);
+        if (qwExternalContact == null || qwExternalContact.getStatus() == null || qwExternalContact.getStatus() == 0) {
+            return;
+        }
+        QwExternalContact update = new QwExternalContact();
+        update.setId(qwExternalContact.getId());
+        update.setStatus(0);
+        qwExternalContactMapper.updateQwExternalContact(update);
+        log.info("删了又加-恢复客户状态: externalUserId={}, userId={}, contactId={}, oldStatus={}",
+                externalUserID, userID, qwExternalContact.getId(), qwExternalContact.getStatus());
+    }
+
     @Override
     public void applyTransferContactInfo(Long newContactId, QwExternalContactTransferLog transferLog, Long oldContactId) {
         if (newContactId == null) {