|
|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|