|
@@ -6,14 +6,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import shop.alien.entity.result.R;
|
|
import shop.alien.entity.result.R;
|
|
|
-import shop.alien.entity.store.LawyerConsultationReview;
|
|
|
|
|
|
|
+import shop.alien.entity.store.*;
|
|
|
|
|
+import shop.alien.entity.store.dto.LawyerConsultationReviewDto;
|
|
|
|
|
+import shop.alien.entity.store.dto.LawyerConsultationReviewReplyDto;
|
|
|
|
|
+import shop.alien.entity.store.vo.LawyerConsultationReviewReplyVo;
|
|
|
|
|
+import shop.alien.entity.store.vo.LawyerConsultationReviewVo;
|
|
|
import shop.alien.lawyer.service.LawyerConsultationReviewService;
|
|
import shop.alien.lawyer.service.LawyerConsultationReviewService;
|
|
|
-import shop.alien.mapper.LawyerConsultationReviewMapper;
|
|
|
|
|
|
|
+import shop.alien.mapper.*;
|
|
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 咨询评价 服务实现类
|
|
* 咨询评价 服务实现类
|
|
@@ -28,6 +35,12 @@ import java.util.List;
|
|
|
public class LawyerConsultationReviewServiceImpl extends ServiceImpl<LawyerConsultationReviewMapper, LawyerConsultationReview> implements LawyerConsultationReviewService {
|
|
public class LawyerConsultationReviewServiceImpl extends ServiceImpl<LawyerConsultationReviewMapper, LawyerConsultationReview> implements LawyerConsultationReviewService {
|
|
|
|
|
|
|
|
private final LawyerConsultationReviewMapper consultationReviewMapper;
|
|
private final LawyerConsultationReviewMapper consultationReviewMapper;
|
|
|
|
|
+ private final LawyerConsultationReviewImageMapper reviewImageMapper;
|
|
|
|
|
+ private final LawyerConsultationReviewReplyMapper reviewReplyMapper;
|
|
|
|
|
+ private final LawyerConsultationReviewLikeMapper reviewLikeMapper;
|
|
|
|
|
+ private final LawyerUserMapper lawyerUserMapper;
|
|
|
|
|
+ private final LifeUserMapper lifeUserMapper;
|
|
|
|
|
+ private final LawyerConsultationOrderMapper consultationOrderMapper;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public R<IPage<LawyerConsultationReview>> getConsultationReviewList(int pageNum, int pageSize, Integer consultationOrderId,
|
|
public R<IPage<LawyerConsultationReview>> getConsultationReviewList(int pageNum, int pageSize, Integer consultationOrderId,
|
|
@@ -90,5 +103,384 @@ public class LawyerConsultationReviewServiceImpl extends ServiceImpl<LawyerConsu
|
|
|
}
|
|
}
|
|
|
return R.fail("删除失败");
|
|
return R.fail("删除失败");
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public R<LawyerConsultationReviewVo> createReview(LawyerConsultationReviewDto reviewDto, Integer clientUserId) {
|
|
|
|
|
+ log.info("LawyerConsultationReviewServiceImpl.createReview?reviewDto={}, clientUserId={}", reviewDto, clientUserId);
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 检查订单是否存在且属于该用户
|
|
|
|
|
+ LawyerConsultationOrder order = consultationOrderMapper.selectById(reviewDto.getConsultationOrderId());
|
|
|
|
|
+ if (order == null || !order.getClientUserId().equals(clientUserId)) {
|
|
|
|
|
+ return R.fail("订单不存在或不属于当前用户");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查是否已经评价过
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReview> checkWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ checkWrapper.eq(LawyerConsultationReview::getConsultationOrderId, reviewDto.getConsultationOrderId())
|
|
|
|
|
+ .eq(LawyerConsultationReview::getDeleteFlag, 0);
|
|
|
|
|
+ long count = this.count(checkWrapper);
|
|
|
|
|
+ if (count > 0) {
|
|
|
|
|
+ return R.fail("该订单已评价,不能重复评价");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 创建评价
|
|
|
|
|
+ LawyerConsultationReview review = new LawyerConsultationReview();
|
|
|
|
|
+ review.setConsultationOrderId(reviewDto.getConsultationOrderId());
|
|
|
|
|
+ review.setClientUserId(clientUserId);
|
|
|
|
|
+ review.setLawyerUserId(reviewDto.getLawyerUserId());
|
|
|
|
|
+ review.setRating(reviewDto.getRating());
|
|
|
|
|
+ review.setServiceQuality(reviewDto.getServiceQuality());
|
|
|
|
|
+ review.setResponseSpeed(reviewDto.getResponseSpeed());
|
|
|
|
|
+ review.setProfessionalLevel(reviewDto.getProfessionalLevel());
|
|
|
|
|
+ review.setComment(reviewDto.getComment());
|
|
|
|
|
+ review.setIsAnonymous(reviewDto.getIsAnonymous() != null ? reviewDto.getIsAnonymous() : 0);
|
|
|
|
|
+ review.setLikeCount(0);
|
|
|
|
|
+ review.setReplyCount(0);
|
|
|
|
|
+ review.setCreatedUserId(clientUserId);
|
|
|
|
|
+
|
|
|
|
|
+ boolean saved = this.save(review);
|
|
|
|
|
+ if (!saved) {
|
|
|
|
|
+ return R.fail("创建评价失败");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 保存评价图片
|
|
|
|
|
+ if (reviewDto.getImageUrls() != null && !reviewDto.getImageUrls().isEmpty()) {
|
|
|
|
|
+ for (int i = 0; i < reviewDto.getImageUrls().size(); i++) {
|
|
|
|
|
+ LawyerConsultationReviewImage image = new LawyerConsultationReviewImage();
|
|
|
|
|
+ image.setReviewId(review.getId());
|
|
|
|
|
+ image.setImageUrl(reviewDto.getImageUrls().get(i));
|
|
|
|
|
+ image.setSortOrder(i + 1);
|
|
|
|
|
+ image.setCreatedUserId(clientUserId);
|
|
|
|
|
+ reviewImageMapper.insert(image);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 更新律师评分统计
|
|
|
|
|
+ updateLawyerRatingStats(reviewDto.getLawyerUserId());
|
|
|
|
|
+
|
|
|
|
|
+ // 返回评价详情
|
|
|
|
|
+ return getReviewDetail(review.getId(), clientUserId);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("创建评价失败", e);
|
|
|
|
|
+ return R.fail("创建评价失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public R<LawyerConsultationReviewVo> getReviewDetail(Integer reviewId, Integer currentUserId) {
|
|
|
|
|
+ log.info("LawyerConsultationReviewServiceImpl.getReviewDetail?reviewId={}, currentUserId={}", reviewId, currentUserId);
|
|
|
|
|
+ try {
|
|
|
|
|
+ LawyerConsultationReview review = this.getById(reviewId);
|
|
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
|
|
+ return R.fail("评价不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ LawyerConsultationReviewVo vo = new LawyerConsultationReviewVo();
|
|
|
|
|
+ BeanUtils.copyProperties(review, vo);
|
|
|
|
|
+
|
|
|
|
|
+ // 查询评价图片
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReviewImage> imageWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ imageWrapper.eq(LawyerConsultationReviewImage::getReviewId, reviewId)
|
|
|
|
|
+ .eq(LawyerConsultationReviewImage::getDeleteFlag, 0)
|
|
|
|
|
+ .orderByAsc(LawyerConsultationReviewImage::getSortOrder);
|
|
|
|
|
+ List<LawyerConsultationReviewImage> images = reviewImageMapper.selectList(imageWrapper);
|
|
|
|
|
+ vo.setImageUrls(images.stream().map(LawyerConsultationReviewImage::getImageUrl).collect(Collectors.toList()));
|
|
|
|
|
+
|
|
|
|
|
+ // 查询用户信息
|
|
|
|
|
+ if (review.getIsAnonymous() == 0) {
|
|
|
|
|
+ LifeUser clientUser = lifeUserMapper.selectById(review.getClientUserId());
|
|
|
|
|
+ if (clientUser != null) {
|
|
|
|
|
+ vo.setClientUserName(clientUser.getUserName());
|
|
|
|
|
+ vo.setClientUserImage(clientUser.getUserImage());
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ vo.setClientUserName("匿名用户");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ LawyerUser lawyerUser = lawyerUserMapper.selectById(review.getLawyerUserId());
|
|
|
|
|
+ if (lawyerUser != null) {
|
|
|
|
|
+ vo.setLawyerUserName(lawyerUser.getName());
|
|
|
|
|
+ vo.setLawyerUserImage(lawyerUser.getHeadImg());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 查询订单信息
|
|
|
|
|
+ LawyerConsultationOrder order = consultationOrderMapper.selectById(review.getConsultationOrderId());
|
|
|
|
|
+ if (order != null) {
|
|
|
|
|
+ vo.setOrderNumber(order.getOrderNumber());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 查询回复列表
|
|
|
|
|
+ List<LawyerConsultationReviewReplyVo> replies = getReplyList(reviewId, currentUserId);
|
|
|
|
|
+ vo.setReplies(replies);
|
|
|
|
|
+
|
|
|
|
|
+ // 查询是否已点赞
|
|
|
|
|
+ if (currentUserId != null) {
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReviewLike> likeWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ likeWrapper.eq(LawyerConsultationReviewLike::getReviewId, reviewId)
|
|
|
|
|
+ .eq(LawyerConsultationReviewLike::getLikeUserId, currentUserId)
|
|
|
|
|
+ .eq(LawyerConsultationReviewLike::getDeleteFlag, 0);
|
|
|
|
|
+ long likeCount = reviewLikeMapper.selectCount(likeWrapper);
|
|
|
|
|
+ vo.setIsLiked(likeCount > 0 ? 1 : 0);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ vo.setIsLiked(0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return R.data(vo);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("获取评价详情失败", e);
|
|
|
|
|
+ return R.fail("获取评价详情失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public R<IPage<LawyerConsultationReviewVo>> getReviewListWithDetail(int pageNum, int pageSize, Integer lawyerUserId, Integer currentUserId) {
|
|
|
|
|
+ log.info("LawyerConsultationReviewServiceImpl.getReviewListWithDetail?pageNum={}, pageSize={}, lawyerUserId={}, currentUserId={}",
|
|
|
|
|
+ pageNum, pageSize, lawyerUserId, currentUserId);
|
|
|
|
|
+ try {
|
|
|
|
|
+ Page<LawyerConsultationReview> page = new Page<>(pageNum, pageSize);
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReview> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(LawyerConsultationReview::getLawyerUserId, lawyerUserId)
|
|
|
|
|
+ .eq(LawyerConsultationReview::getDeleteFlag, 0)
|
|
|
|
|
+ .orderByDesc(LawyerConsultationReview::getCreatedTime);
|
|
|
|
|
+ IPage<LawyerConsultationReview> pageResult = this.page(page, queryWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // 转换为VO
|
|
|
|
|
+ Page<LawyerConsultationReviewVo> voPage = new Page<>(pageResult.getCurrent(), pageResult.getSize(), pageResult.getTotal());
|
|
|
|
|
+ List<LawyerConsultationReviewVo> voList = new ArrayList<>();
|
|
|
|
|
+ for (LawyerConsultationReview review : pageResult.getRecords()) {
|
|
|
|
|
+ R<LawyerConsultationReviewVo> detailResult = getReviewDetail(review.getId(), currentUserId);
|
|
|
|
|
+ if (detailResult.getCode() == 200 && detailResult.getData() != null) {
|
|
|
|
|
+ voList.add(detailResult.getData());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ voPage.setRecords(voList);
|
|
|
|
|
+ return R.data(voPage);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("获取评价列表失败", e);
|
|
|
|
|
+ return R.fail("获取评价列表失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public R<Boolean> addReply(LawyerConsultationReviewReplyDto replyDto, Integer replyUserId) {
|
|
|
|
|
+ log.info("LawyerConsultationReviewServiceImpl.addReply?replyDto={}, replyUserId={}", replyDto, replyUserId);
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 检查评价是否存在
|
|
|
|
|
+ LawyerConsultationReview review = this.getById(replyDto.getReviewId());
|
|
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
|
|
+ return R.fail("评价不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 创建回复
|
|
|
|
|
+ LawyerConsultationReviewReply reply = new LawyerConsultationReviewReply();
|
|
|
|
|
+ reply.setReviewId(replyDto.getReviewId());
|
|
|
|
|
+ reply.setReplyUserId(replyUserId);
|
|
|
|
|
+ reply.setTargetUserId(replyDto.getTargetUserId());
|
|
|
|
|
+ reply.setParentReplyId(replyDto.getParentReplyId() != null ? replyDto.getParentReplyId() : 0);
|
|
|
|
|
+ reply.setReplyContent(replyDto.getReplyContent());
|
|
|
|
|
+ reply.setLikeCount(0);
|
|
|
|
|
+ reply.setCreatedUserId(replyUserId);
|
|
|
|
|
+
|
|
|
|
|
+ boolean saved = reviewReplyMapper.insert(reply) > 0;
|
|
|
|
|
+ if (!saved) {
|
|
|
|
|
+ return R.fail("添加回复失败");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 更新评价的回复数
|
|
|
|
|
+ review.setReplyCount((review.getReplyCount() == null ? 0 : review.getReplyCount()) + 1);
|
|
|
|
|
+ this.updateById(review);
|
|
|
|
|
+
|
|
|
|
|
+ return R.success("添加回复成功");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("添加回复失败", e);
|
|
|
|
|
+ return R.fail("添加回复失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public R<Boolean> toggleLike(Integer reviewId, Integer replyId, Integer userId) {
|
|
|
|
|
+ log.info("LawyerConsultationReviewServiceImpl.toggleLike?reviewId={}, replyId={}, userId={}", reviewId, replyId, userId);
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (reviewId == null && replyId == null) {
|
|
|
|
|
+ return R.fail("评价ID和回复ID不能同时为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReviewLike> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ if (reviewId != null) {
|
|
|
|
|
+ queryWrapper.eq(LawyerConsultationReviewLike::getReviewId, reviewId);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (replyId != null) {
|
|
|
|
|
+ queryWrapper.eq(LawyerConsultationReviewLike::getReplyId, replyId);
|
|
|
|
|
+ }
|
|
|
|
|
+ queryWrapper.eq(LawyerConsultationReviewLike::getLikeUserId, userId)
|
|
|
|
|
+ .eq(LawyerConsultationReviewLike::getDeleteFlag, 0);
|
|
|
|
|
+
|
|
|
|
|
+ LawyerConsultationReviewLike existingLike = reviewLikeMapper.selectOne(queryWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ if (existingLike != null) {
|
|
|
|
|
+ // 取消点赞
|
|
|
|
|
+ existingLike.setDeleteFlag(1);
|
|
|
|
|
+ reviewLikeMapper.updateById(existingLike);
|
|
|
|
|
+ // 更新点赞数
|
|
|
|
|
+ if (reviewId != null) {
|
|
|
|
|
+ LawyerConsultationReview review = this.getById(reviewId);
|
|
|
|
|
+ if (review != null) {
|
|
|
|
|
+ review.setLikeCount(Math.max(0, (review.getLikeCount() == null ? 0 : review.getLikeCount()) - 1));
|
|
|
|
|
+ this.updateById(review);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (replyId != null) {
|
|
|
|
|
+ LawyerConsultationReviewReply reply = reviewReplyMapper.selectById(replyId);
|
|
|
|
|
+ if (reply != null) {
|
|
|
|
|
+ reply.setLikeCount(Math.max(0, (reply.getLikeCount() == null ? 0 : reply.getLikeCount()) - 1));
|
|
|
|
|
+ reviewReplyMapper.updateById(reply);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return R.success("取消点赞成功");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 添加点赞
|
|
|
|
|
+ LawyerConsultationReviewLike like = new LawyerConsultationReviewLike();
|
|
|
|
|
+ like.setReviewId(reviewId);
|
|
|
|
|
+ like.setReplyId(replyId);
|
|
|
|
|
+ like.setLikeUserId(userId);
|
|
|
|
|
+ reviewLikeMapper.insert(like);
|
|
|
|
|
+ // 更新点赞数
|
|
|
|
|
+ if (reviewId != null) {
|
|
|
|
|
+ LawyerConsultationReview review = this.getById(reviewId);
|
|
|
|
|
+ if (review != null) {
|
|
|
|
|
+ review.setLikeCount((review.getLikeCount() == null ? 0 : review.getLikeCount()) + 1);
|
|
|
|
|
+ this.updateById(review);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (replyId != null) {
|
|
|
|
|
+ LawyerConsultationReviewReply reply = reviewReplyMapper.selectById(replyId);
|
|
|
|
|
+ if (reply != null) {
|
|
|
|
|
+ reply.setLikeCount((reply.getLikeCount() == null ? 0 : reply.getLikeCount()) + 1);
|
|
|
|
|
+ reviewReplyMapper.updateById(reply);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return R.success("点赞成功");
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("点赞操作失败", e);
|
|
|
|
|
+ return R.fail("点赞操作失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取回复列表(包含嵌套回复)
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<LawyerConsultationReviewReplyVo> getReplyList(Integer reviewId, Integer currentUserId) {
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReviewReply> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(LawyerConsultationReviewReply::getReviewId, reviewId)
|
|
|
|
|
+ .eq(LawyerConsultationReviewReply::getParentReplyId, 0)
|
|
|
|
|
+ .eq(LawyerConsultationReviewReply::getDeleteFlag, 0)
|
|
|
|
|
+ .orderByAsc(LawyerConsultationReviewReply::getCreatedTime);
|
|
|
|
|
+ List<LawyerConsultationReviewReply> replies = reviewReplyMapper.selectList(queryWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ List<LawyerConsultationReviewReplyVo> voList = new ArrayList<>();
|
|
|
|
|
+ for (LawyerConsultationReviewReply reply : replies) {
|
|
|
|
|
+ LawyerConsultationReviewReplyVo vo = convertReplyToVo(reply, currentUserId);
|
|
|
|
|
+ // 查询子回复
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReviewReply> childWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ childWrapper.eq(LawyerConsultationReviewReply::getParentReplyId, reply.getId())
|
|
|
|
|
+ .eq(LawyerConsultationReviewReply::getDeleteFlag, 0)
|
|
|
|
|
+ .orderByAsc(LawyerConsultationReviewReply::getCreatedTime);
|
|
|
|
|
+ List<LawyerConsultationReviewReply> childReplies = reviewReplyMapper.selectList(childWrapper);
|
|
|
|
|
+ List<LawyerConsultationReviewReplyVo> childVoList = new ArrayList<>();
|
|
|
|
|
+ for (LawyerConsultationReviewReply childReply : childReplies) {
|
|
|
|
|
+ childVoList.add(convertReplyToVo(childReply, currentUserId));
|
|
|
|
|
+ }
|
|
|
|
|
+ vo.setChildReplies(childVoList);
|
|
|
|
|
+ voList.add(vo);
|
|
|
|
|
+ }
|
|
|
|
|
+ return voList;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 转换回复为VO
|
|
|
|
|
+ */
|
|
|
|
|
+ private LawyerConsultationReviewReplyVo convertReplyToVo(LawyerConsultationReviewReply reply, Integer currentUserId) {
|
|
|
|
|
+ LawyerConsultationReviewReplyVo vo = new LawyerConsultationReviewReplyVo();
|
|
|
|
|
+ BeanUtils.copyProperties(reply, vo);
|
|
|
|
|
+
|
|
|
|
|
+ // 查询回复用户信息
|
|
|
|
|
+ LifeUser replyUser = lifeUserMapper.selectById(reply.getReplyUserId());
|
|
|
|
|
+ if (replyUser != null) {
|
|
|
|
|
+ vo.setReplyUserName(replyUser.getUserName());
|
|
|
|
|
+ vo.setReplyUserImage(replyUser.getUserImage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 查询被回复用户信息
|
|
|
|
|
+ if (reply.getTargetUserId() != null) {
|
|
|
|
|
+ LifeUser targetUser = lifeUserMapper.selectById(reply.getTargetUserId());
|
|
|
|
|
+ if (targetUser != null) {
|
|
|
|
|
+ vo.setTargetUserName(targetUser.getUserName());
|
|
|
|
|
+ vo.setTargetUserImage(targetUser.getUserImage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 查询是否已点赞
|
|
|
|
|
+ if (currentUserId != null) {
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReviewLike> likeWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ likeWrapper.eq(LawyerConsultationReviewLike::getReplyId, reply.getId())
|
|
|
|
|
+ .eq(LawyerConsultationReviewLike::getLikeUserId, currentUserId)
|
|
|
|
|
+ .eq(LawyerConsultationReviewLike::getDeleteFlag, 0);
|
|
|
|
|
+ long likeCount = reviewLikeMapper.selectCount(likeWrapper);
|
|
|
|
|
+ vo.setIsLiked(likeCount > 0 ? 1 : 0);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ vo.setIsLiked(0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return vo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 更新律师评分统计
|
|
|
|
|
+ */
|
|
|
|
|
+ private void updateLawyerRatingStats(Integer lawyerUserId) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 查询该律师的所有评价
|
|
|
|
|
+ LambdaQueryWrapper<LawyerConsultationReview> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(LawyerConsultationReview::getLawyerUserId, lawyerUserId)
|
|
|
|
|
+ .eq(LawyerConsultationReview::getDeleteFlag, 0);
|
|
|
|
|
+ List<LawyerConsultationReview> reviews = this.list(queryWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ if (reviews.isEmpty()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算平均分
|
|
|
|
|
+ double totalRating = 0;
|
|
|
|
|
+ int goodCount = 0;
|
|
|
|
|
+ int mediumCount = 0;
|
|
|
|
|
+ int badCount = 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (LawyerConsultationReview review : reviews) {
|
|
|
|
|
+ totalRating += review.getRating();
|
|
|
|
|
+ if (review.getRating() >= 4) {
|
|
|
|
|
+ goodCount++;
|
|
|
|
|
+ } else if (review.getRating() >= 3) {
|
|
|
|
|
+ mediumCount++;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ badCount++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ double avgRating = totalRating / reviews.size();
|
|
|
|
|
+ int serviceScore = (int) (avgRating * 20); // 转换为0-100分
|
|
|
|
|
+
|
|
|
|
|
+ // 更新律师信息
|
|
|
|
|
+ LawyerUser lawyerUser = lawyerUserMapper.selectById(lawyerUserId);
|
|
|
|
|
+ if (lawyerUser != null) {
|
|
|
|
|
+ lawyerUser.setServiceScore(serviceScore);
|
|
|
|
|
+ lawyerUser.setServiceCount(reviews.size());
|
|
|
|
|
+ lawyerUser.setGoodReviewCount(goodCount);
|
|
|
|
|
+ lawyerUser.setMediumReviewCount(mediumCount);
|
|
|
|
|
+ lawyerUser.setBadReviewCount(badCount);
|
|
|
|
|
+ lawyerUserMapper.updateById(lawyerUser);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("更新律师评分统计失败", e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|