|
|
@@ -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
|