Parcourir la source

feat(feedback): 完善反馈状态更新和通知功能

- 新增LifeUserMapper依赖注入
- 在更新反馈状态时查询原始反馈记录用于发送通知
- 支持动态处理状态值,默认为已解决(1)
- 实现问题已解决通知发送功能
- 区分用户端和商家端用户表查询逻辑
- 重构反馈回复通知方法以支持双端用户查询
- 添加详细的已解决通知发送逻辑和错误处理
fcw il y a 2 mois
Parent
commit
fbea4b526d

+ 137 - 14
alien-store/src/main/java/shop/alien/store/service/impl/LifeFeedbackServiceImpl.java

@@ -45,6 +45,7 @@ public class LifeFeedbackServiceImpl extends ServiceImpl<LifeFeedbackMapper, Lif
     private final WebSocketProcess webSocketProcess;
     private final AiFeedbackAssignUtils aiFeedbackAssignUtils;
     private final LifeSysMapper lifeSysMapper;
+    private final LifeUserMapper lifeUserMapper;
 
     @Override
     public R<String> submitFeedback(LifeFeedbackDto dto) {
@@ -606,10 +607,18 @@ public class LifeFeedbackServiceImpl extends ServiceImpl<LifeFeedbackMapper, Lif
                 return R.fail("反馈ID不能为空");
             }
 
-            // 2. 更新状态为已解决
+            // 2. 查询原始反馈记录(用于发送通知)
+            LifeFeedback feedback = lifeFeedbackMapper.selectById(statusDto.getFeedbackId());
+            if (feedback == null) {
+                return R.fail("反馈记录不存在");
+            }
+
+            // 3. 更新状态
             LifeFeedback updateFeedback = new LifeFeedback();
             updateFeedback.setId(statusDto.getFeedbackId());
-            updateFeedback.setHandleStatus(1); // 已解决
+            // 如果DTO中有状态值,使用DTO的值;否则默认为已解决(1)
+            Integer handleStatus = statusDto.getHandleStatus() != null ? statusDto.getHandleStatus() : 1;
+            updateFeedback.setHandleStatus(handleStatus);
             updateFeedback.setUpdateTime(new Date());
 
             boolean result = this.updateById(updateFeedback);
@@ -621,6 +630,11 @@ public class LifeFeedbackServiceImpl extends ServiceImpl<LifeFeedbackMapper, Lif
             String logContent = "问题已解决";
             saveFeedbackLog(statusDto.getFeedbackId(), 0, logContent);
 
+            // 5. 如果状态为已解决,发送问题已解决通知给用户
+            if (handleStatus == 1) {
+                sendFeedbackResolvedNotice(feedback);
+            }
+
             return R.success("更新成功");
         } catch (Exception e) {
             log.error("中台-更新反馈状态失败", e);
@@ -656,6 +670,7 @@ public class LifeFeedbackServiceImpl extends ServiceImpl<LifeFeedbackMapper, Lif
     private void sendFeedbackReplyNotice(LifeFeedback feedback, String replyContent) {
         try {
             String receiverId = null;
+            String userPhone = null;
             
             // 根据反馈来源判断是用户端还是商家端
             if (feedback.getFeedbackSource() == null) {
@@ -663,25 +678,30 @@ public class LifeFeedbackServiceImpl extends ServiceImpl<LifeFeedbackMapper, Lif
                 return;
             }
             
-            // userId对应store_user表的id,统一从store_user表查询
             if (feedback.getUserId() == null) {
                 log.warn("用户ID为空,无法发送通知,feedbackId={}", feedback.getId());
                 return;
             }
             
-            StoreUser storeUser = storeUserMapper.selectById(feedback.getUserId());
-            if (storeUser == null || storeUser.getPhone() == null || storeUser.getPhone().trim().isEmpty()) {
-                log.warn("未找到商户用户信息或手机号为空,无法发送通知,userId={}", feedback.getUserId());
-                return;
-            }
-            
-            // 根据feedbackSource设置不同的接收者ID格式
+            // 根据feedbackSource查询对应的用户表
             if (feedback.getFeedbackSource() == 0) {
-                // 用户端 - 使用user_手机号格式
-                receiverId = "user_" + storeUser.getPhone();
+                // 用户端 - 查询life_user表
+                LifeUser lifeUser = lifeUserMapper.selectById(feedback.getUserId());
+                if (lifeUser == null || lifeUser.getUserPhone() == null || lifeUser.getUserPhone().trim().isEmpty()) {
+                    log.warn("未找到用户信息或手机号为空,无法发送通知,userId={}", feedback.getUserId());
+                    return;
+                }
+                userPhone = lifeUser.getUserPhone();
+                receiverId = "user_" + userPhone;
             } else if (feedback.getFeedbackSource() == 1) {
-                // 商家端 - 使用store_手机号格式
-                receiverId = "store_" + storeUser.getPhone();
+                // 商家端 - 查询store_user表
+                StoreUser storeUser = storeUserMapper.selectById(feedback.getUserId());
+                if (storeUser == null || storeUser.getPhone() == null || storeUser.getPhone().trim().isEmpty()) {
+                    log.warn("未找到商户用户信息或手机号为空,无法发送通知,userId={}", feedback.getUserId());
+                    return;
+                }
+                userPhone = storeUser.getPhone();
+                receiverId = "store_" + userPhone;
             } else {
                 log.warn("未知的反馈来源,feedbackSource={}, feedbackId={}", feedback.getFeedbackSource(), feedback.getId());
                 return;
@@ -728,6 +748,109 @@ public class LifeFeedbackServiceImpl extends ServiceImpl<LifeFeedbackMapper, Lif
     }
 
     /**
+     * 发送问题已解决通知给用户
+     * @param feedback 反馈记录
+     */
+    private void sendFeedbackResolvedNotice(LifeFeedback feedback) {
+        try {
+            String receiverId = null;
+            
+            // 根据反馈来源判断是用户端还是商家端
+            if (feedback.getFeedbackSource() == null) {
+                log.warn("反馈来源为空,无法发送通知,feedbackId={}", feedback.getId());
+                return;
+            }
+            
+            if (feedback.getUserId() == null) {
+                log.warn("用户ID为空,无法发送通知,feedbackId={}", feedback.getId());
+                return;
+            }
+            
+            // 根据feedbackSource查询对应的用户表
+            if (feedback.getFeedbackSource() == 0) {
+                // 用户端 - 查询life_user表
+                LifeUser lifeUser = lifeUserMapper.selectById(feedback.getUserId());
+                if (lifeUser == null || lifeUser.getUserPhone() == null || lifeUser.getUserPhone().trim().isEmpty()) {
+                    log.warn("未找到用户信息或手机号为空,无法发送通知,userId={}", feedback.getUserId());
+                    return;
+                }
+                receiverId = "user_" + lifeUser.getUserPhone();
+            } else if (feedback.getFeedbackSource() == 1) {
+                // 商家端 - 查询store_user表
+                StoreUser storeUser = storeUserMapper.selectById(feedback.getUserId());
+                if (storeUser == null || storeUser.getPhone() == null || storeUser.getPhone().trim().isEmpty()) {
+                    log.warn("未找到商户用户信息或手机号为空,无法发送通知,userId={}", feedback.getUserId());
+                    return;
+                }
+                receiverId = "store_" + storeUser.getPhone();
+            } else {
+                log.warn("未知的反馈来源,feedbackSource={}, feedbackId={}", feedback.getFeedbackSource(), feedback.getId());
+                return;
+            }
+            
+            // 根据反馈类型生成通知消息
+            String feedbackTypeText = "";
+            if (feedback.getFeedbackType() != null) {
+                switch (feedback.getFeedbackType()) {
+                    case 0:
+                        feedbackTypeText = "BUG";
+                        break;
+                    case 1:
+                        feedbackTypeText = "优化";
+                        break;
+                    case 2:
+                        feedbackTypeText = "功能";
+                        break;
+                    default:
+                        feedbackTypeText = "BUG/优化/功能";
+                        break;
+                }
+            } else {
+                feedbackTypeText = "BUG/优化/功能";
+            }
+            String message = "您反馈的" + feedbackTypeText + "问题已解决,感谢您的反馈";
+            
+            // 构建通知消息
+            JSONObject messageJson = new JSONObject();
+            messageJson.put("feedbackId", feedback.getId());
+            messageJson.put("message", message);
+
+            // 创建通知记录
+            LifeNotice lifeNotice = new LifeNotice();
+            lifeNotice.setReceiverId(receiverId);
+            lifeNotice.setContext(messageJson.toJSONString());
+            lifeNotice.setTitle("意见反馈解决通知");
+            lifeNotice.setSenderId("system");
+            lifeNotice.setIsRead(0);
+            lifeNotice.setNoticeType(1); // 1-系统通知
+            lifeNotice.setBusinessId(feedback.getId());
+
+            // 保存通知
+            lifeNoticeMapper.insert(lifeNotice);
+
+            // 通过WebSocket发送实时通知
+            WebSocketVo webSocketVo = new WebSocketVo();
+            webSocketVo.setSenderId("system");
+            webSocketVo.setReceiverId(receiverId);
+            webSocketVo.setCategory("notice");
+            webSocketVo.setNoticeType("1");
+            webSocketVo.setIsRead(0);
+            webSocketVo.setText(JSONObject.toJSONString(lifeNotice));
+
+            try {
+                webSocketProcess.sendMessage(receiverId, JSONObject.toJSONString(webSocketVo));
+                log.info("问题已解决通知发送成功,feedbackId={}, receiverId={}", feedback.getId(), receiverId);
+            } catch (Exception e) {
+                log.error("发送WebSocket通知失败,feedbackId={}, receiverId={}, error={}",
+                        feedback.getId(), receiverId, e.getMessage());
+            }
+
+        } catch (Exception e) {
+            log.error("发送问题已解决通知异常,feedbackId={}, error={}", feedback.getId(), e.getMessage(), e);
+        }
+    }
+
+    /**
      * 调用AI分配跟踪人员
      * @param feedback 反馈记录
      * @return 分配的跟踪人员ID(对应life_sys表的id),失败返回null