zhangchen hace 5 días
padre
commit
9dde2b7988

+ 7 - 7
alien-lawyer/src/main/java/shop/alien/lawyer/controller/StoreCommentController.java

@@ -216,18 +216,18 @@ public class StoreCommentController {
     @ApiOperation("获取评价详情(包含评论和回复)")
     @ApiOperationSupport(order = 21)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "query", required = true),
-            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+            @ApiImplicitParam(name = "orderId", value = "评价ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "用户ID", dataType = "int", paramType = "query", required = true)
     })
     @GetMapping("/orderReview/detail")
     public R<OrderReviewDetailVo> getOrderReviewDetail(
-            @RequestParam Integer reviewId,
+            @RequestParam(required = false) Integer orderId,
             @RequestParam(required = false) Integer currentUserId) {
-        log.info("StoreCommentController.getOrderReviewDetail?reviewId={}, currentUserId={}", reviewId, currentUserId);
-        if (reviewId == null) {
-            return R.fail("评价ID不能为空");
+        log.info("StoreCommentController.getOrderReviewDetail?reviewId={}, currentUserId={}", orderId, currentUserId);
+        if (orderId == null) {
+            return R.fail("订单id不为空");
         }
-        return storeCommentService.getOrderReviewDetail(reviewId, currentUserId);
+        return storeCommentService.getOrderReviewDetail(orderId, currentUserId);
     }
 
     @ApiOperation("点赞评价")

+ 2 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/StoreCommentService.java

@@ -154,11 +154,11 @@ public interface StoreCommentService extends IService<StoreComment> {
     /**
      * 获取评价详情(包含评论和回复)
      *
-     * @param reviewId 评价ID
+     * @param orderId 评价ID
      * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<OrderReviewDetailVo>
      */
-    R<OrderReviewDetailVo> getOrderReviewDetail(Integer reviewId, Integer currentUserId);
+    R<OrderReviewDetailVo> getOrderReviewDetail(Integer orderId, Integer currentUserId);
 
     /**
      * 点赞评价

+ 200 - 18
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/StoreCommentServiceImpl.java

@@ -85,6 +85,7 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
 
     private final LawyerConsultationOrderMapper lawyerConsultationOrderMapper;
     private final LawyerUserMapper lawyerUserMapper;
+    private final LawFirmMapper lawFirmMapper;
 
     @Autowired
     private TextModerationUtil textModerationUtil;
@@ -1116,11 +1117,41 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
         review.setBusinessType(5); // 订单评价
         review.setIsAnonymous(reviewDto.getIsAnonymous() != null ? reviewDto.getIsAnonymous() : 0);
         review.setLikeCount(0);
+
         
-        // 处理评价图片:将JSON数组转换为img_id(这里需要根据实际情况处理)
+        // 处理评价图片:将图片URL存入store_img表,并将图片ID存入store_comment的img_id字段
         if (reviewDto.getReviewImages() != null && !reviewDto.getReviewImages().isEmpty()) {
-            // 注意:这里需要将图片URL上传并获取img_id,暂时先不处理
-            // review.setImgId(...);
+            StringBuilder imgIdBuilder = new StringBuilder();
+            Integer orderId = reviewDto.getOrderId();
+            
+            for (int i = 0; i < reviewDto.getReviewImages().size(); i++) {
+                String imgUrl = reviewDto.getReviewImages().get(i);
+                if (StringUtils.isNotEmpty(imgUrl)) {
+                    StoreImg storeImg = new StoreImg();
+                    storeImg.setImgType(8); // 用户评论图片类型
+                    storeImg.setBusinessId(orderId); // 订单ID作为业务ID
+                    storeImg.setImgUrl(imgUrl);
+                    storeImg.setImgSort(i + 1); // 图片排序
+                    storeImg.setCreatedUserId(userId);
+                    storeImg.setCreatedTime(new Date());
+                    storeImg.setDeleteFlag(0);
+                    storeImg.setStoreId(0);
+                    int insertResult = storeImgMapper.insert(storeImg);
+                    if (insertResult > 0 && storeImg.getId() != null) {
+                        imgIdBuilder.append(storeImg.getId()).append(",");
+                        log.info("创建评价图片成功,图片ID={}, 订单ID={}", storeImg.getId(), orderId);
+                    } else {
+                        log.warn("创建评价图片失败,图片URL={}, 订单ID={}", imgUrl, orderId);
+                    }
+                }
+            }
+            
+            // 将图片ID用逗号分隔存入img_id字段
+            if (imgIdBuilder.length() > 0) {
+                String imgIdStr = imgIdBuilder.substring(0, imgIdBuilder.length() - 1);
+                review.setImgId(imgIdStr);
+                log.info("评价图片ID设置成功,imgId={}, 订单ID={}", imgIdStr, orderId);
+            }
         }
         
         review.setCreatedUserId(userId);
@@ -1203,30 +1234,181 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
     }
 
     @Override
-    public R<OrderReviewDetailVo> getOrderReviewDetail(Integer reviewId, Integer currentUserId) {
-        log.info("StoreCommentServiceImpl.getOrderReviewDetail?reviewId={}, currentUserId={}", reviewId, currentUserId);
+    public R<OrderReviewDetailVo> getOrderReviewDetail(Integer orderId, Integer currentUserId) {
+        log.info("StoreCommentServiceImpl.getOrderReviewDetail?orderId={}, currentUserId={}", orderId, currentUserId);
 
-        if (reviewId == null) {
-            return R.fail("评价ID不能为空");
+        if (orderId == null) {
+            return R.fail("订单ID不能为空");
         }
 
-        // 查询评价详情(从 store_comment 表,business_type=5)
-        StoreComment review = this.getById(reviewId);
-        if (review == null || review.getDeleteFlag() == 1 || review.getBusinessType() != 5) {
+        // 根据orderId从store_comment表查询评价详情
+        // 条件:business_id=orderId, store_id为空, business_type=5
+        LambdaQueryWrapper<StoreComment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StoreComment::getBusinessId, orderId)
+                .isNull(StoreComment::getStoreId)
+                .eq(StoreComment::getBusinessType, 5)
+                .eq(StoreComment::getDeleteFlag, 0);
+        
+        StoreComment review = this.getOne(queryWrapper);
+        if (review == null) {
+            log.warn("评价不存在,orderId={}", orderId);
             return R.fail("评价不存在");
         }
 
-        // 构建 OrderReviewDetailVo(需要关联用户和律师信息)
-        OrderReviewDetailVo detailVo = new OrderReviewDetailVo();
-        // TODO: 需要从 store_comment 查询并关联用户、律师信息,构建完整的 OrderReviewDetailVo
-        // 这里需要根据实际的查询需求来实现,可能需要自定义SQL查询
-        
-        // 查询评论列表(business_type=6,business_id=reviewId)
+        // 构建 OrderReviewVo
+        OrderReviewVo reviewVo = new OrderReviewVo();
+        reviewVo.setId(review.getId());
+        reviewVo.setOrderId(orderId);
+        reviewVo.setUserId(review.getUserId());
+        reviewVo.setReviewContent(review.getCommentContent());
+        reviewVo.setOverallRating(review.getScore());
+        reviewVo.setIsAnonymous(review.getIsAnonymous());
+        reviewVo.setLikeCount(review.getLikeCount());
+        reviewVo.setCreatedTime(review.getCreatedTime());
+
+        // 查询订单信息获取订单编号
+        LawyerConsultationOrder order = lawyerConsultationOrderMapper.selectById(orderId);
+        if (order != null) {
+            reviewVo.setOrderNumber(order.getOrderNumber());
+            reviewVo.setLawyerUserId(order.getLawyerUserId());
+        }
+
+        // 查询用户信息
+        if (review.getUserId() != null) {
+            LifeUser lifeUser = lifeUserMapper.selectById(review.getUserId());
+            if (lifeUser != null) {
+                reviewVo.setUserName(lifeUser.getUserName());
+                reviewVo.setUserAvatar(lifeUser.getUserImage());
+            }
+        }
+
+        // 查询律师信息
+        Integer lawyerId = review.getLawyerId();
+        if (lawyerId == null && order != null) {
+            lawyerId = order.getLawyerUserId();
+        }
+        if (lawyerId != null) {
+            LawyerUser lawyerUser = lawyerUserMapper.selectById(lawyerId);
+            if (lawyerUser != null) {
+                reviewVo.setLawyerUserId(lawyerId);
+                reviewVo.setLawyerName(lawyerUser.getName());
+                reviewVo.setLawyerAvatar(lawyerUser.getHeadImg());
+                
+                // 查询律所信息
+                if (lawyerUser.getFirmId() != null) {
+                    try {
+                        LawFirm lawFirm = lawFirmMapper.selectById(lawyerUser.getFirmId());
+                        if (lawFirm != null && StringUtils.isNotEmpty(lawFirm.getFirmName())) {
+                            reviewVo.setLawFirmName(lawFirm.getFirmName());
+                        }
+                    } catch (Exception e) {
+                        log.warn("查询律所信息失败,firmId={}", lawyerUser.getFirmId(), e);
+                    }
+                }
+            }
+        }
+
+        // 解析评分信息(从otherScore字段)
+        if (StringUtils.isNotEmpty(review.getOtherScore())) {
+            try {
+                List<com.alibaba.fastjson.JSONObject> scoreList = JSONArray.parseArray(review.getOtherScore(), com.alibaba.fastjson.JSONObject.class);
+                if (scoreList != null && !scoreList.isEmpty()) {
+                    for (com.alibaba.fastjson.JSONObject scoreObj : scoreList) {
+                        if (scoreObj != null) {
+                            String name = scoreObj.getString("name");
+                            String rateScore = scoreObj.getString("rateScore");
+                            if (StringUtils.isNotEmpty(name) && StringUtils.isNotEmpty(rateScore)) {
+                                try {
+                                    Double scoreValue = Double.parseDouble(rateScore);
+                                    if ("服务态度".equals(name)) {
+                                        reviewVo.setServiceAttitudeRating(scoreValue);
+                                    } else if ("响应时间".equals(name)) {
+                                        reviewVo.setResponseTimeRating(scoreValue);
+                                    } else if ("专业能力".equals(name)) {
+                                        reviewVo.setProfessionalAbilityRating(scoreValue);
+                                    }
+                                } catch (NumberFormatException e) {
+                                    log.warn("解析评分失败,name={}, rateScore={}", name, rateScore, e);
+                                }
+                            }
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                log.warn("解析otherScore失败,otherScore={}", review.getOtherScore(), e);
+            }
+        }
+
+        // 查询评价图片(从store_img表,img_type=8, business_id=orderId)
+        List<String> imageUrls = new ArrayList<>();
+        if (StringUtils.isNotEmpty(review.getImgId())) {
+            String[] imgIds = review.getImgId().split(",");
+            if (imgIds.length > 0) {
+                List<Integer> imgIdList = new ArrayList<>();
+                for (String imgIdStr : imgIds) {
+                    if (StringUtils.isNotEmpty(imgIdStr.trim())) {
+                        try {
+                            imgIdList.add(Integer.parseInt(imgIdStr.trim()));
+                        } catch (NumberFormatException e) {
+                            log.warn("图片ID格式错误,imgId={}", imgIdStr, e);
+                        }
+                    }
+                }
+                if (!imgIdList.isEmpty()) {
+                    LambdaQueryWrapper<StoreImg> imgWrapper = new LambdaQueryWrapper<>();
+                    imgWrapper.in(StoreImg::getId, imgIdList)
+                            .eq(StoreImg::getDeleteFlag, 0)
+                            .orderByAsc(StoreImg::getImgSort);
+                    List<StoreImg> storeImgs = storeImgMapper.selectList(imgWrapper);
+                    if (CollectionUtils.isNotEmpty(storeImgs)) {
+                        imageUrls = storeImgs.stream()
+                                .map(StoreImg::getImgUrl)
+                                .filter(url -> StringUtils.isNotEmpty(url))
+                                .collect(java.util.stream.Collectors.toList());
+                    }
+                }
+            }
+        }
+        reviewVo.setReviewImages(imageUrls);
+
+        // 检查当前用户是否已点赞
+        if (currentUserId != null) {
+            LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
+            likeWrapper.eq(LifeLikeRecord::getType, "7")
+                    .eq(LifeLikeRecord::getDianzanId, String.valueOf(currentUserId))
+                    .eq(LifeLikeRecord::getHuifuId, String.valueOf(review.getId()))
+                    .eq(LifeLikeRecord::getDeleteFlag, 0);
+            long likeCount = lifeLikeRecordMapper.selectCount(likeWrapper);
+            reviewVo.setIsLiked(likeCount > 0 ? 1 : 0);
+        } else {
+            reviewVo.setIsLiked(0);
+        }
+
+        // 查询评论列表(business_type=6,business_id=评价ID)
+        Integer reviewId = review.getId();
         R<List<ReviewCommentVo>> commentsResult = getReviewCommentListByReviewId(reviewId, currentUserId);
-        if (commentsResult.getCode() == 200) {
-            detailVo.setComments(commentsResult.getData());
+        List<ReviewCommentVo> comments = new ArrayList<>();
+        if (commentsResult.getCode() == 200 && commentsResult.getData() != null) {
+            comments = commentsResult.getData();
+        }
+
+        // 统计评论总数(包括首评和回复)
+        int totalCommentCount = comments.size();
+        for (ReviewCommentVo comment : comments) {
+            if (comment.getReplies() != null) {
+                totalCommentCount += comment.getReplies().size();
+            }
         }
 
+        // 构建返回结果
+        OrderReviewDetailVo detailVo = new OrderReviewDetailVo();
+        detailVo.setReview(reviewVo);
+        detailVo.setComments(comments);
+        detailVo.setTotalCommentCount(totalCommentCount);
+        detailVo.setLikeCount(reviewVo.getLikeCount() != null ? reviewVo.getLikeCount() : 0);
+        detailVo.setIsLiked(reviewVo.getIsLiked() != null ? reviewVo.getIsLiked() : 0);
+
+        log.info("查询评价详情成功,orderId={}, reviewId={}", orderId, reviewId);
         return R.data(detailVo);
     }