zhangchen 6 ore fa
parent
commit
4e2a2dbe7a

+ 160 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java

@@ -2,6 +2,7 @@ package shop.alien.lawyer.service.impl;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,12 +10,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.LawyerUser;
 import shop.alien.entity.store.LifeLikeRecord;
+import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.OrderReview;
 import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.OrderReviewDto;
@@ -22,12 +26,14 @@ import shop.alien.entity.store.vo.LawyerReviewStatisticsVo;
 import shop.alien.entity.store.vo.OrderReviewDetailVo;
 import shop.alien.entity.store.vo.OrderReviewVo;
 import shop.alien.entity.store.vo.PendingReviewVo;
+import shop.alien.entity.store.vo.WebSocketVo;
+import shop.alien.lawyer.config.WebSocketProcess;
 import shop.alien.lawyer.service.OrderReviewService;
 import shop.alien.lawyer.service.ReviewCommentService;
-import shop.alien.entity.store.LawyerUser;
 import shop.alien.mapper.LawyerConsultationOrderMapper;
 import shop.alien.mapper.LawyerUserMapper;
 import shop.alien.mapper.LifeLikeRecordMapper;
+import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.OrderReviewMapper;
 import shop.alien.mapper.ReviewCommentMapper;
 
@@ -53,6 +59,38 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     private final ReviewCommentMapper reviewCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
     private final LawyerUserMapper lawyerUserMapper;
+    private final LifeNoticeMapper lifeNoticeMapper;
+    private final WebSocketProcess webSocketProcess;
+
+    /**
+     * 系统发送者ID常量
+     */
+    private static final String SYSTEM_SENDER_ID = "system";
+
+    /**
+     * 差评阈值(0-2.5分=差评)
+     */
+    private static final double BAD_REVIEW_THRESHOLD = 3.0;
+
+    /**
+     * 律师接收者ID前缀
+     */
+    private static final String LAWYER_RECEIVER_PREFIX = "lawyer_";
+
+    /**
+     * 通知类型:系统通知
+     */
+    private static final Integer NOTICE_TYPE_SYSTEM = 1;
+
+    /**
+     * 业务类型:律师模块通知
+     */
+    private static final Integer BUSINESS_TYPE_LAWYER = 1;
+
+    /**
+     * 未读状态
+     */
+    private static final Integer IS_READ_UNREAD = 0;
 
     @Override
     public R<OrderReview> createReview(OrderReviewDto reviewDto) {
@@ -128,6 +166,12 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
             log.info("创建评价成功,评价ID={}", review.getId());
             // 更新律师评分
             updateLawyerServiceScore(review.getLawyerUserId());
+
+            // 如果为差评,则给律师发通知提醒
+            if (isBadReview(review.getOverallRating())) {
+                sendBadReviewNoticeToLawyer(review, order);
+            }
+
             return R.data(review, "提交成功");
         } else {
             log.error("创建评价失败");
@@ -690,5 +734,120 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
 
         return R.data(reviewVo);
     }
+
+    /**
+     * 判断是否为差评
+     * 评分规则:0-2.5分=差评
+     *
+     * @param overallRating 总体评分
+     * @return true表示差评,false表示非差评
+     */
+    private boolean isBadReview(Double overallRating) {
+        return overallRating != null && overallRating < BAD_REVIEW_THRESHOLD;
+    }
+
+    /**
+     * 发送差评通知给律师
+     *
+     * @param review 评价对象
+     * @param order  订单对象
+     */
+    private void sendBadReviewNoticeToLawyer(OrderReview review, LawyerConsultationOrder order) {
+        log.info("发送差评通知给律师,评价ID={},订单ID={},律师ID={}", 
+                review.getId(), review.getOrderId(), review.getLawyerUserId());
+
+        try {
+            // 获取律师信息
+            LawyerUser lawyerUser = lawyerUserMapper.selectById(review.getLawyerUserId());
+            if (lawyerUser == null || StringUtils.isBlank(lawyerUser.getPhone())) {
+                log.warn("发送差评通知失败,律师不存在或手机号为空,律师ID={}", review.getLawyerUserId());
+                return;
+            }
+
+            // 构建接收者ID
+            String receiverId = LAWYER_RECEIVER_PREFIX + lawyerUser.getPhone();
+
+            // 获取订单编号
+            String orderNumber = review.getOrderNumber();
+            if (StringUtils.isBlank(orderNumber) && order != null) {
+                orderNumber = order.getOrderNumber();
+            }
+            if (StringUtils.isBlank(orderNumber)) {
+                orderNumber = "未知";
+            }
+
+            // 构建通知消息
+            String message = String.format("编号为%s的订单有一条差评,您可查看评价内容是否属实,如不属实,可向平台进行申诉。", orderNumber);
+
+            // 创建通知对象
+            LifeNotice lifeNotice = createBadReviewNotice(review.getId(), receiverId, orderNumber, message);
+
+            // 保存通知
+            int insertResult = lifeNoticeMapper.insert(lifeNotice);
+            if (insertResult > 0) {
+                log.info("发送差评通知成功,评价ID={},订单编号={},接收人ID={}", 
+                        review.getId(), orderNumber, receiverId);
+                
+                // 发送WebSocket消息
+                sendWebSocketMessage(receiverId, lifeNotice);
+            } else {
+                log.warn("发送差评通知失败:保存通知失败,评价ID={},订单编号={}", 
+                        review.getId(), orderNumber);
+            }
+        } catch (Exception e) {
+            log.error("发送差评通知异常,评价ID={},订单ID={},异常信息:{}", 
+                    review.getId(), review.getOrderId(), e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 创建差评通知对象
+     *
+     * @param businessId 业务ID(评价ID)
+     * @param receiverId 接收人ID(律师接收者ID)
+     * @param orderNumber 订单编号
+     * @param message 通知消息
+     * @return 通知对象
+     */
+    private LifeNotice createBadReviewNotice(Integer businessId, String receiverId, String orderNumber, String message) {
+        LifeNotice lifeNotice = new LifeNotice();
+        lifeNotice.setSenderId(SYSTEM_SENDER_ID);
+        lifeNotice.setBusinessId(businessId);
+        lifeNotice.setReceiverId(receiverId);
+        lifeNotice.setTitle("差评通知");
+        lifeNotice.setNoticeType(NOTICE_TYPE_SYSTEM);
+        lifeNotice.setIsRead(IS_READ_UNREAD);
+        lifeNotice.setBusinessType(BUSINESS_TYPE_LAWYER);
+
+        // 构建通知内容JSON
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("title", "差评通知");
+        jsonObject.put("message", message);
+        lifeNotice.setContext(jsonObject.toJSONString());
+
+        return lifeNotice;
+    }
+
+    /**
+     * 发送WebSocket消息
+     *
+     * @param receiverId 接收人ID
+     * @param lifeNotice 通知对象
+     */
+    private void sendWebSocketMessage(String receiverId, LifeNotice lifeNotice) {
+        try {
+            WebSocketVo webSocketVo = new WebSocketVo();
+            webSocketVo.setSenderId(SYSTEM_SENDER_ID);
+            webSocketVo.setReceiverId(receiverId);
+            webSocketVo.setCategory("notice");
+            webSocketVo.setNoticeType("1");
+            webSocketVo.setIsRead(IS_READ_UNREAD);
+            webSocketVo.setText(JSON.toJSONString(lifeNotice));
+            webSocketProcess.sendMessage(receiverId, JSON.toJSONString(webSocketVo));
+            log.debug("发送WebSocket消息成功,接收人ID={}", receiverId);
+        } catch (Exception e) {
+            log.error("发送WebSocket消息异常,接收人ID={}, 异常信息={}", receiverId, e.getMessage(), e);
+        }
+    }
 }