|
|
@@ -12,13 +12,16 @@ import shop.alien.entity.result.R;
|
|
|
import shop.alien.entity.store.LifeLikeRecord;
|
|
|
import shop.alien.entity.store.OrderReview;
|
|
|
import shop.alien.entity.store.ReviewComment;
|
|
|
+import shop.alien.entity.store.dto.LawyerReplyDto;
|
|
|
import shop.alien.entity.store.dto.ReviewCommentRequestDto;
|
|
|
import shop.alien.entity.store.dto.ReviewReplyDto;
|
|
|
import shop.alien.entity.store.vo.ReviewCommentVo;
|
|
|
import shop.alien.lawyer.service.OrderReviewService;
|
|
|
import shop.alien.lawyer.service.ReviewCommentService;
|
|
|
+import shop.alien.mapper.LawyerUserMapper;
|
|
|
import shop.alien.mapper.LifeLikeRecordMapper;
|
|
|
import shop.alien.mapper.ReviewCommentMapper;
|
|
|
+import shop.alien.entity.store.LawyerUser;
|
|
|
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
@@ -38,13 +41,34 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
|
|
|
private final ReviewCommentMapper reviewCommentMapper;
|
|
|
private final OrderReviewService orderReviewService;
|
|
|
private final LifeLikeRecordMapper lifeLikeRecordMapper;
|
|
|
+ private final LawyerUserMapper lawyerUserMapper;
|
|
|
|
|
|
public ReviewCommentServiceImpl(ReviewCommentMapper reviewCommentMapper,
|
|
|
@Lazy OrderReviewService orderReviewService,
|
|
|
- LifeLikeRecordMapper lifeLikeRecordMapper) {
|
|
|
+ LifeLikeRecordMapper lifeLikeRecordMapper,
|
|
|
+ LawyerUserMapper lawyerUserMapper) {
|
|
|
this.reviewCommentMapper = reviewCommentMapper;
|
|
|
this.orderReviewService = orderReviewService;
|
|
|
this.lifeLikeRecordMapper = lifeLikeRecordMapper;
|
|
|
+ this.lawyerUserMapper = lawyerUserMapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断用户类型:1-普通用户,2-律师
|
|
|
+ *
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @return 用户类型:1-普通用户,2-律师
|
|
|
+ */
|
|
|
+ private Integer getUserType(Integer userId) {
|
|
|
+ if (userId == null) {
|
|
|
+ return 1; // 默认为普通用户
|
|
|
+ }
|
|
|
+ // 查询律师表,如果存在且未删除,则为律师
|
|
|
+ LawyerUser lawyerUser = lawyerUserMapper.selectById(userId);
|
|
|
+ if (lawyerUser != null && (lawyerUser.getDeleteFlag() == null || lawyerUser.getDeleteFlag() == 0)) {
|
|
|
+ return 2; // 律师
|
|
|
+ }
|
|
|
+ return 1; // 普通用户
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -71,6 +95,21 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
|
|
|
return R.fail("评价不存在或已删除");
|
|
|
}
|
|
|
|
|
|
+ // 验证用户类型参数:必须传入
|
|
|
+ if (comment.getSendUserType() == null) {
|
|
|
+ return R.fail("发送用户类型不能为空");
|
|
|
+ }
|
|
|
+ if (comment.getReceiveUserType() == null) {
|
|
|
+ return R.fail("接收用户类型不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 权限校验:如果是律师(sendUserType=2),只能回复自己订单的评价
|
|
|
+ if (comment.getSendUserType() == 2) {
|
|
|
+ if (!review.getLawyerUserId().equals(comment.getSendUserId())) {
|
|
|
+ return R.fail("只能回复自己的订单评价");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 设置评论属性
|
|
|
// 接收用户ID为评价的创建者(如果未设置)
|
|
|
if (comment.getReceiveUserId() == null) {
|
|
|
@@ -252,11 +291,34 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
|
|
|
return R.fail("只能回复首评");
|
|
|
}
|
|
|
|
|
|
+ // 校验用户类型参数:必须传入
|
|
|
+ if (replyDto.getSendUserType() == null) {
|
|
|
+ return R.fail("发送用户类型不能为空");
|
|
|
+ }
|
|
|
+ if (replyDto.getReceiveUserType() == null) {
|
|
|
+ return R.fail("接收用户类型不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 权限校验:如果是律师(sendUserType=2),只能回复自己订单评价下的评论
|
|
|
+ if (replyDto.getSendUserType() == 2) {
|
|
|
+ OrderReview review = orderReviewService.getById(headComment.getReviewId());
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评价不存在或已删除");
|
|
|
+ }
|
|
|
+ if (!review.getLawyerUserId().equals(userId)) {
|
|
|
+ return R.fail("只能回复自己订单评价下的评论");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 创建回复
|
|
|
ReviewComment reply = new ReviewComment();
|
|
|
reply.setReviewId(headComment.getReviewId());
|
|
|
reply.setSendUserId(userId);
|
|
|
- reply.setReceiveUserId(replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId());
|
|
|
+ Integer receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId();
|
|
|
+ reply.setReceiveUserId(receiveUserId);
|
|
|
+ // 设置用户类型:Controller层已经校验过,直接使用
|
|
|
+ reply.setSendUserType(replyDto.getSendUserType());
|
|
|
+ reply.setReceiveUserType(replyDto.getReceiveUserType());
|
|
|
reply.setCommentContent(replyDto.getReplyContent());
|
|
|
reply.setLikeCount(0);
|
|
|
reply.setReplyCount(0);
|
|
|
@@ -430,5 +492,141 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
|
|
|
log.warn("删除评论失败,评论ID={}, userId={}", id, userId);
|
|
|
return R.fail("删除失败");
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @deprecated 已废弃,请使用 createComment 或 createReply 接口
|
|
|
+ */
|
|
|
+ @Deprecated
|
|
|
+ @Override
|
|
|
+ public R<ReviewComment> lawyerReply(LawyerReplyDto replyDto) {
|
|
|
+ log.warn("【废弃方法】ReviewCommentServiceImpl.lawyerReply 已废弃,请使用 createComment 或 createReply 方法");
|
|
|
+ log.info("ReviewCommentServiceImpl.lawyerReply?replyDto={}", replyDto);
|
|
|
+
|
|
|
+ // 参数校验
|
|
|
+ if (replyDto == null) {
|
|
|
+ return R.fail("回复信息不能为空");
|
|
|
+ }
|
|
|
+ if (replyDto.getReplyType() == null) {
|
|
|
+ return R.fail("回复类型不能为空");
|
|
|
+ }
|
|
|
+ if (replyDto.getLawyerUserId() == null) {
|
|
|
+ return R.fail("律师用户ID不能为空");
|
|
|
+ }
|
|
|
+ if (replyDto.getReplyContent() == null || replyDto.getReplyContent().trim().isEmpty()) {
|
|
|
+ return R.fail("回复内容不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ ReviewComment reply = new ReviewComment();
|
|
|
+ Integer receiveUserId = null;
|
|
|
+ Integer reviewId = null;
|
|
|
+
|
|
|
+ // 根据回复类型处理
|
|
|
+ if (replyDto.getReplyType() == 1) {
|
|
|
+ // 回复评价
|
|
|
+ if (replyDto.getReviewId() == null) {
|
|
|
+ return R.fail("评价ID不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证评价是否存在
|
|
|
+ OrderReview review = orderReviewService.getById(replyDto.getReviewId());
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评价不存在或已删除");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证律师权限:必须是该评价对应的律师
|
|
|
+ if (!review.getLawyerUserId().equals(replyDto.getLawyerUserId())) {
|
|
|
+ return R.fail("只能回复自己的订单评价");
|
|
|
+ }
|
|
|
+
|
|
|
+ reviewId = review.getId();
|
|
|
+ receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : review.getUserId();
|
|
|
+ reply.setReviewId(reviewId);
|
|
|
+ reply.setHeadType(0); // 0:是首评(对评价的直接回复)
|
|
|
+ reply.setHeadId(null);
|
|
|
+
|
|
|
+ } else if (replyDto.getReplyType() == 2) {
|
|
|
+ // 回复评论
|
|
|
+ if (replyDto.getCommentId() == null) {
|
|
|
+ return R.fail("评论ID不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证评论是否存在
|
|
|
+ ReviewComment comment = this.getById(replyDto.getCommentId());
|
|
|
+ if (comment == null || comment.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评论不存在或已删除");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取评价信息,验证律师权限
|
|
|
+ OrderReview review = orderReviewService.getById(comment.getReviewId());
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评价不存在或已删除");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证律师权限:必须是该评价对应的律师
|
|
|
+ if (!review.getLawyerUserId().equals(replyDto.getLawyerUserId())) {
|
|
|
+ return R.fail("只能回复自己订单评价下的评论");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果评论是首评,则回复首评;如果评论是回复,则需要回复首评
|
|
|
+ Integer headCommentId = comment.getHeadType() == 0 ? comment.getId() : comment.getHeadId();
|
|
|
+ ReviewComment headComment = this.getById(headCommentId);
|
|
|
+ if (headComment == null || headComment.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("首评不存在或已删除");
|
|
|
+ }
|
|
|
+
|
|
|
+ reviewId = comment.getReviewId();
|
|
|
+ receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : comment.getSendUserId();
|
|
|
+ reply.setReviewId(reviewId);
|
|
|
+ reply.setHeadType(1); // 1:是回复
|
|
|
+ reply.setHeadId(headCommentId); // 指向首评ID
|
|
|
+
|
|
|
+ } else {
|
|
|
+ return R.fail("回复类型错误,只能是1(回复评价)或2(回复评论)");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建回复
|
|
|
+ reply.setSendUserId(replyDto.getLawyerUserId());
|
|
|
+ reply.setReceiveUserId(receiveUserId);
|
|
|
+ // 验证用户类型参数:必须传入
|
|
|
+ if (replyDto.getSendUserType() == null) {
|
|
|
+ return R.fail("发送用户类型不能为空");
|
|
|
+ }
|
|
|
+ if (replyDto.getReceiveUserType() == null) {
|
|
|
+ return R.fail("接收用户类型不能为空");
|
|
|
+ }
|
|
|
+ reply.setSendUserType(replyDto.getSendUserType());
|
|
|
+ reply.setReceiveUserType(replyDto.getReceiveUserType());
|
|
|
+ reply.setCommentContent(replyDto.getReplyContent());
|
|
|
+ reply.setLikeCount(0);
|
|
|
+ reply.setReplyCount(0);
|
|
|
+ reply.setCreatedUserId(replyDto.getLawyerUserId());
|
|
|
+ reply.setCreatedTime(new Date());
|
|
|
+
|
|
|
+ boolean success = this.save(reply);
|
|
|
+ if (success) {
|
|
|
+ // 如果是回复评论,更新首评的回复数
|
|
|
+ if (replyDto.getReplyType() == 2 && reply.getHeadId() != null) {
|
|
|
+ ReviewComment headComment = this.getById(reply.getHeadId());
|
|
|
+ if (headComment != null) {
|
|
|
+ headComment.setReplyCount((headComment.getReplyCount() == null ? 0 : headComment.getReplyCount()) + 1);
|
|
|
+ this.updateById(headComment);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新评价的评论数
|
|
|
+ OrderReview review = orderReviewService.getById(reviewId);
|
|
|
+ if (review != null) {
|
|
|
+ review.setCommentCount((review.getCommentCount() == null ? 0 : review.getCommentCount()) + 1);
|
|
|
+ orderReviewService.updateById(review);
|
|
|
+ log.info("更新评价评论数成功,评价ID={}, 评论数={}", reviewId, review.getCommentCount());
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("律师回复成功,回复ID={}, 律师ID={}", reply.getId(), replyDto.getLawyerUserId());
|
|
|
+ return R.data(reply, "回复成功");
|
|
|
+ } else {
|
|
|
+ log.error("律师回复失败");
|
|
|
+ return R.fail("回复失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|