|
|
@@ -0,0 +1,452 @@
|
|
|
+package shop.alien.lawyer.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+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.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import shop.alien.entity.result.R;
|
|
|
+import shop.alien.entity.store.*;
|
|
|
+import shop.alien.entity.store.dto.LawyerReviewDto;
|
|
|
+import shop.alien.entity.store.dto.LawyerReviewReplyDto;
|
|
|
+import shop.alien.entity.store.vo.LawyerReviewReplyVo;
|
|
|
+import shop.alien.entity.store.vo.LawyerReviewVo;
|
|
|
+import shop.alien.lawyer.service.LawyerReviewService;
|
|
|
+import shop.alien.mapper.*;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 律师评价 服务实现类
|
|
|
+ *
|
|
|
+ * @author system
|
|
|
+ * @since 2025-01-XX
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Transactional
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class LawyerReviewServiceImpl extends ServiceImpl<LawyerReviewMapper, LawyerReview> implements LawyerReviewService {
|
|
|
+
|
|
|
+ private final LawyerReviewImageMapper reviewImageMapper;
|
|
|
+ private final LawyerReviewReplyMapper reviewReplyMapper;
|
|
|
+ private final LawyerReviewLikeMapper reviewLikeMapper;
|
|
|
+ private final LawyerUserMapper lawyerUserMapper;
|
|
|
+ private final LifeUserMapper lifeUserMapper;
|
|
|
+ private final LawyerConsultationOrderMapper consultationOrderMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<LawyerReviewVo> createReview(LawyerReviewDto reviewDto, Integer userId) {
|
|
|
+ log.info("LawyerReviewServiceImpl.createReview?reviewDto={}, userId={}", reviewDto, userId);
|
|
|
+ try {
|
|
|
+ // 检查订单是否存在且属于该用户
|
|
|
+ LawyerConsultationOrder order = consultationOrderMapper.selectById(reviewDto.getOrderId());
|
|
|
+ if (order == null || !order.getClientUserId().equals(userId)) {
|
|
|
+ return R.fail("订单不存在或不属于当前用户");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否已经评价过
|
|
|
+ LambdaQueryWrapper<LawyerReview> checkWrapper = new LambdaQueryWrapper<>();
|
|
|
+ checkWrapper.eq(LawyerReview::getOrderId, reviewDto.getOrderId())
|
|
|
+ .eq(LawyerReview::getDeleteFlag, 0);
|
|
|
+ long count = this.count(checkWrapper);
|
|
|
+ if (count > 0) {
|
|
|
+ return R.fail("该订单已评价,不能重复评价");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建评价
|
|
|
+ LawyerReview review = new LawyerReview();
|
|
|
+ review.setOrderId(reviewDto.getOrderId());
|
|
|
+ review.setUserId(userId);
|
|
|
+ review.setLawyerId(reviewDto.getLawyerId());
|
|
|
+ review.setOverallRating(reviewDto.getOverallRating());
|
|
|
+ review.setServiceAttitudeRating(reviewDto.getServiceAttitudeRating());
|
|
|
+ review.setResponseTimeRating(reviewDto.getResponseTimeRating());
|
|
|
+ review.setProfessionalAbilityRating(reviewDto.getProfessionalAbilityRating());
|
|
|
+ review.setReviewContent(reviewDto.getReviewContent());
|
|
|
+ review.setIsAnonymous(reviewDto.getIsAnonymous() != null ? reviewDto.getIsAnonymous() : 0);
|
|
|
+ review.setLikeCount(0);
|
|
|
+ review.setReplyCount(0);
|
|
|
+ review.setAuditStatus(0); // 待审核
|
|
|
+ review.setCreatedUserId(userId);
|
|
|
+
|
|
|
+ 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++) {
|
|
|
+ LawyerReviewImage image = new LawyerReviewImage();
|
|
|
+ image.setReviewId(review.getId());
|
|
|
+ image.setImageUrl(reviewDto.getImageUrls().get(i));
|
|
|
+ image.setSortOrder(i + 1);
|
|
|
+ image.setCreatedUserId(userId);
|
|
|
+ reviewImageMapper.insert(image);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新律师评分统计
|
|
|
+ updateLawyerRatingStats(reviewDto.getLawyerId());
|
|
|
+
|
|
|
+ // 返回评价详情
|
|
|
+ return getReviewDetail(review.getId(), userId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("创建评价失败", e);
|
|
|
+ return R.fail("创建评价失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<LawyerReviewVo> getReviewDetail(Integer reviewId, Integer currentUserId) {
|
|
|
+ log.info("LawyerReviewServiceImpl.getReviewDetail?reviewId={}, currentUserId={}", reviewId, currentUserId);
|
|
|
+ try {
|
|
|
+ LawyerReview review = this.getById(reviewId);
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评价不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ LawyerReviewVo vo = new LawyerReviewVo();
|
|
|
+ BeanUtils.copyProperties(review, vo);
|
|
|
+
|
|
|
+ // 查询评价图片
|
|
|
+ LambdaQueryWrapper<LawyerReviewImage> imageWrapper = new LambdaQueryWrapper<>();
|
|
|
+ imageWrapper.eq(LawyerReviewImage::getReviewId, reviewId)
|
|
|
+ .eq(LawyerReviewImage::getDeleteFlag, 0)
|
|
|
+ .orderByAsc(LawyerReviewImage::getSortOrder);
|
|
|
+ List<LawyerReviewImage> images = reviewImageMapper.selectList(imageWrapper);
|
|
|
+ vo.setImageUrls(images.stream().map(LawyerReviewImage::getImageUrl).collect(Collectors.toList()));
|
|
|
+
|
|
|
+ // 查询用户信息
|
|
|
+ if (review.getIsAnonymous() == 0) {
|
|
|
+ LifeUser user = lifeUserMapper.selectById(review.getUserId());
|
|
|
+ if (user != null) {
|
|
|
+ vo.setUserName(user.getUserName());
|
|
|
+ vo.setUserImage(user.getUserImage());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ vo.setUserName("匿名用户");
|
|
|
+ }
|
|
|
+
|
|
|
+ LawyerUser lawyerUser = lawyerUserMapper.selectById(review.getLawyerId());
|
|
|
+ if (lawyerUser != null) {
|
|
|
+ vo.setLawyerName(lawyerUser.getName());
|
|
|
+ vo.setLawyerImage(lawyerUser.getHeadImg());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询订单信息
|
|
|
+ LawyerConsultationOrder order = consultationOrderMapper.selectById(review.getOrderId());
|
|
|
+ if (order != null) {
|
|
|
+ vo.setOrderNumber(order.getOrderNumber());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询回复列表
|
|
|
+ List<LawyerReviewReplyVo> replies = getReplyList(reviewId, currentUserId);
|
|
|
+ vo.setReplies(replies);
|
|
|
+
|
|
|
+ // 查询是否已点赞
|
|
|
+ if (currentUserId != null) {
|
|
|
+ LambdaQueryWrapper<LawyerReviewLike> likeWrapper = new LambdaQueryWrapper<>();
|
|
|
+ likeWrapper.eq(LawyerReviewLike::getReviewId, reviewId)
|
|
|
+ .eq(LawyerReviewLike::getLikeUserId, currentUserId)
|
|
|
+ .eq(LawyerReviewLike::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<LawyerReviewVo>> getReviewListWithDetail(int pageNum, int pageSize, Integer lawyerId, Integer currentUserId) {
|
|
|
+ log.info("LawyerReviewServiceImpl.getReviewListWithDetail?pageNum={}, pageSize={}, lawyerId={}, currentUserId={}",
|
|
|
+ pageNum, pageSize, lawyerId, currentUserId);
|
|
|
+ try {
|
|
|
+ Page<LawyerReview> page = new Page<>(pageNum, pageSize);
|
|
|
+ LambdaQueryWrapper<LawyerReview> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(LawyerReview::getLawyerId, lawyerId)
|
|
|
+ .eq(LawyerReview::getDeleteFlag, 0)
|
|
|
+ .eq(LawyerReview::getAuditStatus, 1) // 只显示已审核通过的
|
|
|
+ .orderByDesc(LawyerReview::getCreatedTime);
|
|
|
+ IPage<LawyerReview> pageResult = this.page(page, queryWrapper);
|
|
|
+
|
|
|
+ // 转换为VO
|
|
|
+ Page<LawyerReviewVo> voPage = new Page<>(pageResult.getCurrent(), pageResult.getSize(), pageResult.getTotal());
|
|
|
+ List<LawyerReviewVo> voList = new ArrayList<>();
|
|
|
+ for (LawyerReview review : pageResult.getRecords()) {
|
|
|
+ R<LawyerReviewVo> 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(LawyerReviewReplyDto replyDto, Integer replyUserId) {
|
|
|
+ log.info("LawyerReviewServiceImpl.addReply?replyDto={}, replyUserId={}", replyDto, replyUserId);
|
|
|
+ try {
|
|
|
+ // 检查评价是否存在
|
|
|
+ LawyerReview review = this.getById(replyDto.getReviewId());
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评价不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建回复
|
|
|
+ LawyerReviewReply reply = new LawyerReviewReply();
|
|
|
+ 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("LawyerReviewServiceImpl.toggleLike?reviewId={}, replyId={}, userId={}", reviewId, replyId, userId);
|
|
|
+ try {
|
|
|
+ if (reviewId == null && replyId == null) {
|
|
|
+ return R.fail("评价ID和回复ID不能同时为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ LambdaQueryWrapper<LawyerReviewLike> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ if (reviewId != null) {
|
|
|
+ queryWrapper.eq(LawyerReviewLike::getReviewId, reviewId);
|
|
|
+ }
|
|
|
+ if (replyId != null) {
|
|
|
+ queryWrapper.eq(LawyerReviewLike::getReplyId, replyId);
|
|
|
+ }
|
|
|
+ queryWrapper.eq(LawyerReviewLike::getLikeUserId, userId)
|
|
|
+ .eq(LawyerReviewLike::getDeleteFlag, 0);
|
|
|
+
|
|
|
+ LawyerReviewLike existingLike = reviewLikeMapper.selectOne(queryWrapper);
|
|
|
+
|
|
|
+ if (existingLike != null) {
|
|
|
+ // 取消点赞
|
|
|
+ existingLike.setDeleteFlag(1);
|
|
|
+ reviewLikeMapper.updateById(existingLike);
|
|
|
+ // 更新点赞数
|
|
|
+ if (reviewId != null) {
|
|
|
+ LawyerReview 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) {
|
|
|
+ LawyerReviewReply 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 {
|
|
|
+ // 添加点赞
|
|
|
+ LawyerReviewLike like = new LawyerReviewLike();
|
|
|
+ like.setReviewId(reviewId);
|
|
|
+ like.setReplyId(replyId);
|
|
|
+ like.setLikeUserId(userId);
|
|
|
+ reviewLikeMapper.insert(like);
|
|
|
+ // 更新点赞数
|
|
|
+ if (reviewId != null) {
|
|
|
+ LawyerReview review = this.getById(reviewId);
|
|
|
+ if (review != null) {
|
|
|
+ review.setLikeCount((review.getLikeCount() == null ? 0 : review.getLikeCount()) + 1);
|
|
|
+ this.updateById(review);
|
|
|
+ }
|
|
|
+ } else if (replyId != null) {
|
|
|
+ LawyerReviewReply 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<Boolean> auditReview(Integer reviewId, Integer auditStatus, String auditReason) {
|
|
|
+ log.info("LawyerReviewServiceImpl.auditReview?reviewId={}, auditStatus={}, auditReason={}", reviewId, auditStatus, auditReason);
|
|
|
+ try {
|
|
|
+ LawyerReview review = this.getById(reviewId);
|
|
|
+ if (review == null || review.getDeleteFlag() == 1) {
|
|
|
+ return R.fail("评价不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ review.setAuditStatus(auditStatus);
|
|
|
+ review.setAuditReason(auditReason);
|
|
|
+ boolean updated = this.updateById(review);
|
|
|
+ if (updated) {
|
|
|
+ // 如果审核通过,更新律师评分统计
|
|
|
+ if (auditStatus == 1) {
|
|
|
+ updateLawyerRatingStats(review.getLawyerId());
|
|
|
+ }
|
|
|
+ return R.success("审核成功");
|
|
|
+ }
|
|
|
+ return R.fail("审核失败");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("审核评价失败", e);
|
|
|
+ return R.fail("审核评价失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取回复列表(包含嵌套回复)
|
|
|
+ */
|
|
|
+ private List<LawyerReviewReplyVo> getReplyList(Integer reviewId, Integer currentUserId) {
|
|
|
+ LambdaQueryWrapper<LawyerReviewReply> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(LawyerReviewReply::getReviewId, reviewId)
|
|
|
+ .eq(LawyerReviewReply::getParentReplyId, 0)
|
|
|
+ .eq(LawyerReviewReply::getDeleteFlag, 0)
|
|
|
+ .orderByAsc(LawyerReviewReply::getCreatedTime);
|
|
|
+ List<LawyerReviewReply> replies = reviewReplyMapper.selectList(queryWrapper);
|
|
|
+
|
|
|
+ List<LawyerReviewReplyVo> voList = new ArrayList<>();
|
|
|
+ for (LawyerReviewReply reply : replies) {
|
|
|
+ LawyerReviewReplyVo vo = convertReplyToVo(reply, currentUserId);
|
|
|
+ // 查询子回复
|
|
|
+ LambdaQueryWrapper<LawyerReviewReply> childWrapper = new LambdaQueryWrapper<>();
|
|
|
+ childWrapper.eq(LawyerReviewReply::getParentReplyId, reply.getId())
|
|
|
+ .eq(LawyerReviewReply::getDeleteFlag, 0)
|
|
|
+ .orderByAsc(LawyerReviewReply::getCreatedTime);
|
|
|
+ List<LawyerReviewReply> childReplies = reviewReplyMapper.selectList(childWrapper);
|
|
|
+ List<LawyerReviewReplyVo> childVoList = new ArrayList<>();
|
|
|
+ for (LawyerReviewReply childReply : childReplies) {
|
|
|
+ childVoList.add(convertReplyToVo(childReply, currentUserId));
|
|
|
+ }
|
|
|
+ vo.setChildReplies(childVoList);
|
|
|
+ voList.add(vo);
|
|
|
+ }
|
|
|
+ return voList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换回复为VO
|
|
|
+ */
|
|
|
+ private LawyerReviewReplyVo convertReplyToVo(LawyerReviewReply reply, Integer currentUserId) {
|
|
|
+ LawyerReviewReplyVo vo = new LawyerReviewReplyVo();
|
|
|
+ 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<LawyerReviewLike> likeWrapper = new LambdaQueryWrapper<>();
|
|
|
+ likeWrapper.eq(LawyerReviewLike::getReplyId, reply.getId())
|
|
|
+ .eq(LawyerReviewLike::getLikeUserId, currentUserId)
|
|
|
+ .eq(LawyerReviewLike::getDeleteFlag, 0);
|
|
|
+ long likeCount = reviewLikeMapper.selectCount(likeWrapper);
|
|
|
+ vo.setIsLiked(likeCount > 0 ? 1 : 0);
|
|
|
+ } else {
|
|
|
+ vo.setIsLiked(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新律师评分统计
|
|
|
+ */
|
|
|
+ private void updateLawyerRatingStats(Integer lawyerId) {
|
|
|
+ try {
|
|
|
+ // 查询该律师的所有已审核通过的评价
|
|
|
+ LambdaQueryWrapper<LawyerReview> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(LawyerReview::getLawyerId, lawyerId)
|
|
|
+ .eq(LawyerReview::getDeleteFlag, 0)
|
|
|
+ .eq(LawyerReview::getAuditStatus, 1); // 只统计已审核通过的
|
|
|
+ List<LawyerReview> reviews = this.list(queryWrapper);
|
|
|
+
|
|
|
+ if (reviews.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算平均分
|
|
|
+ double totalRating = 0;
|
|
|
+ int goodCount = 0;
|
|
|
+ int mediumCount = 0;
|
|
|
+ int badCount = 0;
|
|
|
+
|
|
|
+ for (LawyerReview review : reviews) {
|
|
|
+ totalRating += review.getOverallRating();
|
|
|
+ if (review.getOverallRating() >= 4) {
|
|
|
+ goodCount++;
|
|
|
+ } else if (review.getOverallRating() >= 3) {
|
|
|
+ mediumCount++;
|
|
|
+ } else {
|
|
|
+ badCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ double avgRating = totalRating / reviews.size();
|
|
|
+ int serviceScore = (int) (avgRating * 20); // 转换为0-100分
|
|
|
+
|
|
|
+ // 更新律师信息
|
|
|
+ LawyerUser lawyerUser = lawyerUserMapper.selectById(lawyerId);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|