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