Selaa lähdekoodia

律师端代码修改评价评论部分

ldz 3 viikkoa sitten
vanhempi
commit
ce9e1a34ba
19 muutettua tiedostoa jossa 705 lisäystä ja 70 poistoa
  1. 6 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/CommentReplyVo.java
  2. 6 2
      alien-entity/src/main/java/shop/alien/entity/store/vo/OrderReviewDetailVo.java
  3. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/OrderReviewVo.java
  4. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/ReviewCommentVo.java
  5. 11 1
      alien-entity/src/main/java/shop/alien/mapper/CommentReplyMapper.java
  6. 7 3
      alien-entity/src/main/java/shop/alien/mapper/OrderReviewMapper.java
  7. 2 1
      alien-entity/src/main/java/shop/alien/mapper/ReviewCommentMapper.java
  8. 44 0
      alien-entity/src/main/resources/mapper/CommentReplyMapper.xml
  9. 25 0
      alien-entity/src/main/resources/mapper/OrderReviewMapper.xml
  10. 9 0
      alien-entity/src/main/resources/mapper/ReviewCommentMapper.xml
  11. 43 4
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/CommentReplyController.java
  12. 64 16
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/OrderReviewController.java
  13. 49 11
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java
  14. 20 1
      alien-lawyer/src/main/java/shop/alien/lawyer/service/CommentReplyService.java
  15. 26 4
      alien-lawyer/src/main/java/shop/alien/lawyer/service/OrderReviewService.java
  16. 23 3
      alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java
  17. 116 3
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentReplyServiceImpl.java
  18. 127 15
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java
  19. 121 6
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

+ 6 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/CommentReplyVo.java

@@ -48,6 +48,12 @@ public class CommentReplyVo {
     @ApiModelProperty(value = "点赞数")
     private Integer likeCount;
 
+    @ApiModelProperty(value = "当前用户是否已点赞,0:未点赞,1:已点赞")
+    private Integer isLiked;
+
+    @ApiModelProperty(value = "回复数")
+    private Integer replyCount;
+
     @ApiModelProperty(value = "子回复列表")
     private List<CommentReplyVo> childReplies;
 

+ 6 - 2
alien-entity/src/main/java/shop/alien/entity/store/vo/OrderReviewDetailVo.java

@@ -1,11 +1,9 @@
 package shop.alien.entity.store.vo;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -26,5 +24,11 @@ public class OrderReviewDetailVo {
 
     @ApiModelProperty(value = "总评论数")
     private Integer totalCommentCount;
+
+    @ApiModelProperty(value = "评价点赞数")
+    private Integer likeCount;
+
+    @ApiModelProperty(value = "当前用户是否已点赞,0:未点赞,1:已点赞")
+    private Integer isLiked;
 }
 

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/OrderReviewVo.java

@@ -75,6 +75,9 @@ public class OrderReviewVo {
     @ApiModelProperty(value = "评论数")
     private Integer commentCount;
 
+    @ApiModelProperty(value = "当前用户是否已点赞,0:未点赞,1:已点赞")
+    private Integer isLiked;
+
     @ApiModelProperty(value = "创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createdTime;

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/ReviewCommentVo.java

@@ -42,6 +42,9 @@ public class ReviewCommentVo {
     @ApiModelProperty(value = "回复数")
     private Integer replyCount;
 
+    @ApiModelProperty(value = "当前用户是否已点赞,0:未点赞,1:已点赞")
+    private Integer isLiked;
+
     @ApiModelProperty(value = "回复列表")
     private List<CommentReplyVo> replies;
 

+ 11 - 1
alien-entity/src/main/java/shop/alien/mapper/CommentReplyMapper.java

@@ -21,9 +21,19 @@ public interface CommentReplyMapper extends BaseMapper<CommentReply> {
      * 根据评论ID查询回复列表(包含用户信息)
      *
      * @param commentId 评论ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return 回复列表
      */
-    List<CommentReplyVo> getReplyListByCommentId(@Param("commentId") Integer commentId);
+    List<CommentReplyVo> getReplyListByCommentId(@Param("commentId") Integer commentId, @Param("currentUserId") Integer currentUserId);
+
+    /**
+     * 根据父回复ID查询子回复列表(包含用户信息)
+     *
+     * @param parentReplyId 父回复ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
+     * @return 子回复列表
+     */
+    List<CommentReplyVo> getChildReplyListByParentId(@Param("parentReplyId") Integer parentReplyId, @Param("currentUserId") Integer currentUserId);
 
     /**
      * 根据评论ID查询回复数量

+ 7 - 3
alien-entity/src/main/java/shop/alien/mapper/OrderReviewMapper.java

@@ -24,30 +24,34 @@ public interface OrderReviewMapper extends BaseMapper<OrderReview> {
      * @param orderId 订单ID
      * @param lawyerUserId 律师用户ID
      * @param userId 评价用户ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return 分页结果
      */
     IPage<OrderReviewVo> getReviewListWithUser(
             IPage<OrderReviewVo> page,
             @Param("orderId") Integer orderId,
             @Param("lawyerUserId") Integer lawyerUserId,
-            @Param("userId") Integer userId
+            @Param("userId") Integer userId,
+            @Param("currentUserId") Integer currentUserId
     );
 
     /**
      * 根据订单ID查询评价
      *
      * @param orderId 订单ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return 评价信息
      */
-    OrderReviewVo getReviewByOrderId(@Param("orderId") Integer orderId);
+    OrderReviewVo getReviewByOrderId(@Param("orderId") Integer orderId, @Param("currentUserId") Integer currentUserId);
 
     /**
      * 根据评价ID查询评价详情(包含用户和律师信息)
      *
      * @param reviewId 评价ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return 评价详情
      */
-    OrderReviewVo getReviewDetailById(@Param("reviewId") Integer reviewId);
+    OrderReviewVo getReviewDetailById(@Param("reviewId") Integer reviewId, @Param("currentUserId") Integer currentUserId);
 
     /**
      * 分页查询待评价列表(查询用户已完成但未评价的订单对应的律师信息)

+ 2 - 1
alien-entity/src/main/java/shop/alien/mapper/ReviewCommentMapper.java

@@ -21,9 +21,10 @@ public interface ReviewCommentMapper extends BaseMapper<ReviewComment> {
      * 根据评价ID查询评论列表(包含用户信息)
      *
      * @param reviewId 评价ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return 评论列表
      */
-    List<ReviewCommentVo> getCommentListByReviewId(@Param("reviewId") Integer reviewId);
+    List<ReviewCommentVo> getCommentListByReviewId(@Param("reviewId") Integer reviewId, @Param("currentUserId") Integer currentUserId);
 
     /**
      * 根据评价ID查询评论数量

+ 44 - 0
alien-entity/src/main/resources/mapper/CommentReplyMapper.xml

@@ -14,6 +14,8 @@
         <result column="parent_reply_id" property="parentReplyId" />
         <result column="reply_content" property="replyContent" />
         <result column="like_count" property="likeCount" />
+        <result column="is_liked" property="isLiked" />
+        <result column="reply_count" property="replyCount" />
         <result column="created_time" property="createdTime" />
     </resultMap>
 
@@ -30,12 +32,54 @@
             cr.parent_reply_id,
             cr.reply_content,
             cr.like_count,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
+            (SELECT COUNT(*) FROM comment_reply cr2 
+             WHERE cr2.parent_reply_id = cr.id AND cr2.delete_flag = 0) AS reply_count,
             cr.created_time
         FROM comment_reply cr
         LEFT JOIN life_user lu ON lu.id = cr.user_id AND lu.delete_flag = 0
         LEFT JOIN life_user lu2 ON lu2.id = cr.reply_to_user_id AND lu2.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(cr.id, CHAR)
+            AND llr.type = '9' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
         WHERE cr.delete_flag = 0
         AND cr.comment_id = #{commentId}
+        AND cr.parent_reply_id = 0
+        ORDER BY cr.created_time ASC
+    </select>
+
+    <!-- 根据父回复ID查询子回复列表(包含用户信息) -->
+    <select id="getChildReplyListByParentId" resultMap="CommentReplyVoResultMap">
+        SELECT
+            cr.id,
+            cr.comment_id,
+            cr.user_id,
+            lu.user_name AS user_name,
+            lu.user_image AS user_avatar,
+            cr.reply_to_user_id,
+            lu2.user_name AS reply_to_user_name,
+            cr.parent_reply_id,
+            cr.reply_content,
+            cr.like_count,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
+            0 AS reply_count,
+            cr.created_time
+        FROM comment_reply cr
+        LEFT JOIN life_user lu ON lu.id = cr.user_id AND lu.delete_flag = 0
+        LEFT JOIN life_user lu2 ON lu2.id = cr.reply_to_user_id AND lu2.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(cr.id, CHAR)
+            AND llr.type = '9' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
+        WHERE cr.delete_flag = 0
+        AND cr.parent_reply_id = #{parentReplyId}
         ORDER BY cr.created_time ASC
     </select>
 

+ 25 - 0
alien-entity/src/main/resources/mapper/OrderReviewMapper.xml

@@ -22,6 +22,7 @@
         <result column="is_anonymous" property="isAnonymous" />
         <result column="like_count" property="likeCount" />
         <result column="comment_count" property="commentCount" />
+        <result column="is_liked" property="isLiked" />
         <result column="created_time" property="createdTime" />
     </resultMap>
 
@@ -53,11 +54,19 @@
             orv.like_count,
             orv.comment_count,
             orv.review_images,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
             orv.created_time
         FROM order_review orv
         LEFT JOIN life_user lu ON lu.id = orv.user_id AND lu.delete_flag = 0
         LEFT JOIN lawyer_user lu2 ON lu2.id = orv.lawyer_user_id AND lu2.delete_flag = 0
         LEFT JOIN law_firm lf ON lf.id = lu2.firm_id AND lf.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(orv.id, CHAR)
+            AND llr.type = '7' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
         WHERE orv.delete_flag = 0
         <if test="orderId != null">
             AND orv.order_id = #{orderId}
@@ -98,11 +107,19 @@
             orv.is_anonymous,
             orv.like_count,
             orv.comment_count,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
             orv.created_time
         FROM order_review orv
         LEFT JOIN life_user lu ON lu.id = orv.user_id AND lu.delete_flag = 0
         LEFT JOIN lawyer_user lu2 ON lu2.id = orv.lawyer_user_id AND lu2.delete_flag = 0
         LEFT JOIN law_firm lf ON lf.id = lu2.firm_id AND lf.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(orv.id, CHAR)
+            AND llr.type = '7' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
         WHERE orv.delete_flag = 0
         AND orv.order_id = #{orderId}
         LIMIT 1
@@ -135,11 +152,19 @@
             orv.is_anonymous,
             orv.like_count,
             orv.comment_count,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
             orv.created_time
         FROM order_review orv
         LEFT JOIN life_user lu ON lu.id = orv.user_id AND lu.delete_flag = 0
         LEFT JOIN lawyer_user lu2 ON lu2.id = orv.lawyer_user_id AND lu2.delete_flag = 0
         LEFT JOIN law_firm lf ON lf.id = lu2.firm_id AND lf.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(orv.id, CHAR)
+            AND llr.type = '7' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
         WHERE orv.delete_flag = 0
         AND orv.id = #{reviewId}
     </select>

+ 9 - 0
alien-entity/src/main/resources/mapper/ReviewCommentMapper.xml

@@ -12,6 +12,7 @@
         <result column="comment_content" property="commentContent" />
         <result column="like_count" property="likeCount" />
         <result column="reply_count" property="replyCount" />
+        <result column="is_liked" property="isLiked" />
         <result column="created_time" property="createdTime" />
     </resultMap>
 
@@ -26,9 +27,17 @@
             rc.comment_content,
             rc.like_count,
             rc.reply_count,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
             rc.created_time
         FROM review_comment rc
         LEFT JOIN life_user lu ON lu.id = rc.user_id AND lu.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(rc.id, CHAR)
+            AND llr.type = '8' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
         WHERE rc.delete_flag = 0
         AND rc.review_id = #{reviewId}
         ORDER BY rc.created_time DESC

+ 43 - 4
alien-lawyer/src/main/java/shop/alien/lawyer/controller/CommentReplyController.java

@@ -44,11 +44,16 @@ public class CommentReplyController {
 
     @ApiOperation("根据评论ID查询回复列表")
     @ApiOperationSupport(order = 2)
-    @ApiImplicitParam(name = "commentId", value = "评论ID", dataType = "int", paramType = "query", required = true)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commentId", value = "评论ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+    })
     @GetMapping("/list/commentId")
-    public R<List<CommentReplyVo>> getReplyListByCommentId(@RequestParam(required = true) Integer commentId) {
-        log.info("CommentReplyController.getReplyListByCommentId?commentId={}", commentId);
-        return commentReplyService.getReplyListByCommentId(commentId);
+    public R<List<CommentReplyVo>> getReplyListByCommentId(
+            @RequestParam(required = true) Integer commentId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("CommentReplyController.getReplyListByCommentId?commentId={}, currentUserId={}", commentId, currentUserId);
+        return commentReplyService.getReplyListByCommentId(commentId, currentUserId);
     }
 
     @ApiOperation("删除回复")
@@ -63,5 +68,39 @@ public class CommentReplyController {
         }
         return commentReplyService.deleteReply(replyId, userId);
     }
+
+    @ApiOperation("点赞回复")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "replyId", value = "回复ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/like")
+    public R<Boolean> likeReply(
+            @RequestParam Integer replyId,
+            @RequestParam Integer userId) {
+        log.info("CommentReplyController.likeReply?replyId={}, userId={}", replyId, userId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return commentReplyService.likeReply(replyId, userId);
+    }
+
+    @ApiOperation("取消点赞回复")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "replyId", value = "回复ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/cancelLike")
+    public R<Boolean> cancelLikeReply(
+            @RequestParam Integer replyId,
+            @RequestParam Integer userId) {
+        log.info("CommentReplyController.cancelLikeReply?replyId={}, userId={}", replyId, userId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return commentReplyService.cancelLikeReply(replyId, userId);
+    }
 }
 

+ 64 - 16
alien-lawyer/src/main/java/shop/alien/lawyer/controller/OrderReviewController.java

@@ -48,7 +48,8 @@ public class OrderReviewController {
             @ApiImplicitParam(name = "size", value = "页容(默认10)", dataType = "int", paramType = "query"),
             @ApiImplicitParam(name = "orderId", value = "订单ID", dataType = "int", paramType = "query"),
             @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "userId", value = "评价用户ID", dataType = "int", paramType = "query")
+            @ApiImplicitParam(name = "userId", value = "评价用户ID", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
     })
     @GetMapping("/list")
     public R<IPage<OrderReviewVo>> getReviewList(
@@ -56,19 +57,25 @@ public class OrderReviewController {
             @RequestParam(defaultValue = "10") int size,
             @RequestParam(required = false) Integer orderId,
             @RequestParam(required = false) Integer lawyerUserId,
-            @RequestParam(required = false) Integer userId) {
-        log.info("OrderReviewController.getReviewList?page={}, size={}, orderId={}, lawyerUserId={}, userId={}",
-                page, size, orderId, lawyerUserId, userId);
-        return orderReviewService.getReviewList(page, size, orderId, lawyerUserId, userId);
+            @RequestParam(required = false) Integer userId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("OrderReviewController.getReviewList?page={}, size={}, orderId={}, lawyerUserId={}, userId={}, currentUserId={}",
+                page, size, orderId, lawyerUserId, userId, currentUserId);
+        return orderReviewService.getReviewList(page, size, orderId, lawyerUserId, userId, currentUserId);
     }
 
     @ApiOperation("获取评价详情(包含评论和回复)")
     @ApiOperationSupport(order = 3)
-    @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "query", required = true)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+    })
     @GetMapping("/detail/reviewId")
-    public R<OrderReviewDetailVo> getReviewDetail(@RequestParam Integer reviewId) {
-        log.info("OrderReviewController.getReviewDetail?reviewId={}", reviewId);
-        return orderReviewService.getReviewDetail(reviewId);
+    public R<OrderReviewDetailVo> getReviewDetail(
+            @RequestParam Integer reviewId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("OrderReviewController.getReviewDetail?reviewId={}, currentUserId={}", reviewId, currentUserId);
+        return orderReviewService.getReviewDetail(reviewId, currentUserId);
     }
 
     @ApiOperation("删除评价(删除评价时,会级联删除该评价下的所有评论和回复)")
@@ -89,11 +96,16 @@ public class OrderReviewController {
 
     @ApiOperation("根据订单ID查询评价")
     @ApiOperationSupport(order = 5)
-    @ApiImplicitParam(name = "orderId", value = "订单ID", dataType = "int", paramType = "query", required = true)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderId", value = "订单ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+    })
     @GetMapping("/order/orderId")
-    public R<OrderReviewVo> getReviewByOrderId(@RequestParam Integer orderId) {
-        log.info("OrderReviewController.getReviewByOrderId?orderId={}", orderId);
-        return orderReviewService.getReviewByOrderId(orderId);
+    public R<OrderReviewVo> getReviewByOrderId(
+            @RequestParam Integer orderId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("OrderReviewController.getReviewByOrderId?orderId={}, currentUserId={}", orderId, currentUserId);
+        return orderReviewService.getReviewByOrderId(orderId, currentUserId);
     }
 
 
@@ -123,18 +135,54 @@ public class OrderReviewController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "page", value = "页数(默认1)", dataType = "int", paramType = "query"),
             @ApiImplicitParam(name = "size", value = "页容(默认10)", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
     })
     @GetMapping("/my/list")
     public R<IPage<OrderReviewVo>> getMyReviewList(
             @RequestParam(defaultValue = "1") int page,
             @RequestParam(defaultValue = "10") int size,
+            @RequestParam Integer userId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("OrderReviewController.getMyReviewList?page={}, size={}, userId={}, currentUserId={}", page, size, userId, currentUserId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return orderReviewService.getMyReviewList(page, size, userId, currentUserId);
+    }
+
+    @ApiOperation("点赞评价")
+    @ApiOperationSupport(order = 8)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/like")
+    public R<Boolean> likeReview(
+            @RequestParam Integer reviewId,
+            @RequestParam Integer userId) {
+        log.info("OrderReviewController.likeReview?reviewId={}, userId={}", reviewId, userId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return orderReviewService.likeReview(reviewId, userId);
+    }
+
+    @ApiOperation("取消点赞评价")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/cancelLike")
+    public R<Boolean> cancelLikeReview(
+            @RequestParam Integer reviewId,
             @RequestParam Integer userId) {
-        log.info("OrderReviewController.getMyReviewList?page={}, size={}, userId={}", page, size, userId);
+        log.info("OrderReviewController.cancelLikeReview?reviewId={}, userId={}", reviewId, userId);
         if (userId == null) {
             return R.fail("用户未登录");
         }
-        return orderReviewService.getMyReviewList(page, size, userId);
+        return orderReviewService.cancelLikeReview(reviewId, userId);
     }
 }
 

+ 49 - 11
alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java

@@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.ReviewCommentDto;
+import shop.alien.entity.store.vo.CommentReplyVo;
 import shop.alien.entity.store.vo.ReviewCommentVo;
 import shop.alien.entity.store.UserLoginInfo;
 import shop.alien.lawyer.service.ReviewCommentService;
@@ -44,24 +45,61 @@ public class ReviewCommentController {
 
     @ApiOperation("根据评价ID查询评论列表")
     @ApiOperationSupport(order = 2)
-    @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "path", required = true)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+    })
     @GetMapping("/list/reviewId")
-    public R<List<ReviewCommentVo>> getCommentListByReviewId( @RequestParam Integer reviewId) {
-        log.info("ReviewCommentController.getCommentListByReviewId?reviewId={}", reviewId);
-        return reviewCommentService.getCommentListByReviewId(reviewId);
+    public R<List<ReviewCommentVo>> getCommentListByReviewId(
+            @RequestParam Integer reviewId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("ReviewCommentController.getCommentListByReviewId?reviewId={}, currentUserId={}", reviewId, currentUserId);
+        return reviewCommentService.getCommentListByReviewId(reviewId, currentUserId);
     }
 
     @ApiOperation("删除评论(删除评论时,会级联删除该评论下的所有回复)")
     @ApiOperationSupport(order = 3)
-    @ApiImplicitParam(name = "commentId", value = "评论ID", dataType = "int", paramType = "path", required = true)
-    @DeleteMapping("/delete/commentId")
-    public R<Boolean> deleteComment( @RequestParam Integer commentId,
-                                     @RequestParam Integer userId) {
-        log.info("ReviewCommentController.deleteComment?commentId={}, userId={}", commentId, userId);
-        if (userId == null) {
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commentId", value = "评论ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/delete/commentId")
+    public R<Boolean> deleteComment( @RequestBody CommentReplyVo commentReplyVo) {
+        log.info("ReviewCommentController.deleteComment?CommentReplyVo={}", commentReplyVo);
+        if (commentReplyVo.getUserId() == null) {
             return R.fail("用户未登录");
         }
-        return reviewCommentService.deleteComment(commentId, userId);
+        return reviewCommentService.deleteComment(commentReplyVo);
+    }
+
+    @ApiOperation("点赞评论")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commentId", value = "评论ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/like")
+    public R<Boolean> likeComment(@RequestBody CommentReplyVo commentReplyVo) {
+        log.info("ReviewCommentController.likeComment?CommentReplyVo={}", commentReplyVo);
+        if (commentReplyVo.getUserId() == null) {
+            return R.fail("用户未登录");
+        }
+        return reviewCommentService.likeComment(commentReplyVo);
+    }
+
+    @ApiOperation("取消点赞评论")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commentId", value = "评论ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/cancelLike")
+    public R<Boolean> cancelLikeComment(@RequestBody CommentReplyVo commentReplyVo) {
+        log.info("ReviewCommentController.cancelLikeComment?CommentReplyVo={}", commentReplyVo);
+        if (commentReplyVo.getUserId() == null) {
+            return R.fail("用户未登录");
+        }
+        return reviewCommentService.cancelLikeComment(commentReplyVo);
     }
 }
 

+ 20 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/CommentReplyService.java

@@ -29,9 +29,10 @@ public interface CommentReplyService extends IService<CommentReply> {
      * 根据评论ID查询回复列表
      *
      * @param commentId 评论ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<List<CommentReplyVo>>
      */
-    R<List<CommentReplyVo>> getReplyListByCommentId(Integer commentId);
+    R<List<CommentReplyVo>> getReplyListByCommentId(Integer commentId, Integer currentUserId);
 
     /**
      * 删除回复
@@ -41,5 +42,23 @@ public interface CommentReplyService extends IService<CommentReply> {
      * @return R<Boolean>
      */
     R<Boolean> deleteReply(Integer replyId, Integer userId);
+
+    /**
+     * 点赞回复
+     *
+     * @param replyId 回复ID
+     * @param userId 用户ID
+     * @return R<Boolean>
+     */
+    R<Boolean> likeReply(Integer replyId, Integer userId);
+
+    /**
+     * 取消点赞回复
+     *
+     * @param replyId 回复ID
+     * @param userId 用户ID
+     * @return R<Boolean>
+     */
+    R<Boolean> cancelLikeReply(Integer replyId, Integer userId);
 }
 

+ 26 - 4
alien-lawyer/src/main/java/shop/alien/lawyer/service/OrderReviewService.java

@@ -34,17 +34,19 @@ public interface OrderReviewService extends IService<OrderReview> {
      * @param orderId 订单ID(可选)
      * @param lawyerUserId 律师用户ID(可选)
      * @param userId 评价用户ID(可选)
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<IPage<OrderReviewVo>>
      */
-    R<IPage<OrderReviewVo>> getReviewList(int pageNum, int pageSize, Integer orderId, Integer lawyerUserId, Integer userId);
+    R<IPage<OrderReviewVo>> getReviewList(int pageNum, int pageSize, Integer orderId, Integer lawyerUserId, Integer userId, Integer currentUserId);
 
     /**
      * 获取评价详情(包含评论和回复)
      *
      * @param reviewId 评价ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<OrderReviewDetailVo>
      */
-    R<OrderReviewDetailVo> getReviewDetail(Integer reviewId);
+    R<OrderReviewDetailVo> getReviewDetail(Integer reviewId, Integer currentUserId);
 
     /**
      * 删除评价(删除评价时,会级联删除该评价下的所有评论和回复)
@@ -59,9 +61,10 @@ public interface OrderReviewService extends IService<OrderReview> {
      * 根据订单ID查询评价
      *
      * @param orderId 订单ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<OrderReviewVo>
      */
-    R<OrderReviewVo> getReviewByOrderId(Integer orderId);
+    R<OrderReviewVo> getReviewByOrderId(Integer orderId, Integer currentUserId);
 
     /**
      * 分页查询待评价列表(查询用户已完成但未评价的订单对应的律师信息)
@@ -79,8 +82,27 @@ public interface OrderReviewService extends IService<OrderReview> {
      * @param pageNum 页码
      * @param pageSize 页大小
      * @param userId 用户ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<IPage<OrderReviewVo>>
      */
-    R<IPage<OrderReviewVo>> getMyReviewList(int pageNum, int pageSize, Integer userId);
+    R<IPage<OrderReviewVo>> getMyReviewList(int pageNum, int pageSize, Integer userId, Integer currentUserId);
+
+    /**
+     * 点赞评价
+     *
+     * @param reviewId 评价ID
+     * @param userId 用户ID
+     * @return R<Boolean>
+     */
+    R<Boolean> likeReview(Integer reviewId, Integer userId);
+
+    /**
+     * 取消点赞评价
+     *
+     * @param reviewId 评价ID
+     * @param userId 用户ID
+     * @return R<Boolean>
+     */
+    R<Boolean> cancelLikeReview(Integer reviewId, Integer userId);
 }
 

+ 23 - 3
alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.ReviewCommentDto;
+import shop.alien.entity.store.vo.CommentReplyVo;
 import shop.alien.entity.store.vo.ReviewCommentVo;
 
 import java.util.List;
@@ -29,17 +30,36 @@ public interface ReviewCommentService extends IService<ReviewComment> {
      * 根据评价ID查询评论列表
      *
      * @param reviewId 评价ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
      * @return R<List<ReviewCommentVo>>
      */
-    R<List<ReviewCommentVo>> getCommentListByReviewId(Integer reviewId);
+    R<List<ReviewCommentVo>> getCommentListByReviewId(Integer reviewId, Integer currentUserId);
 
     /**
      * 删除评论(删除评论时,会级联删除该评论下的所有回复)
      *
+     * @param
+     * @param
+     * @return R<Boolean>
+     */
+    R<Boolean> deleteComment(CommentReplyVo commentReplyVo);
+
+    /**
+     * 点赞评论
+     *
+     * @param commentId 评论ID
+     * @param userId 用户ID
+     * @return R<Boolean>
+     */
+    R<Boolean> likeComment(CommentReplyVo commentReplyVo);
+
+    /**
+     * 取消点赞评论
+     *
      * @param commentId 评论ID
-     * @param userId 用户ID(验证是否为评论用户)
+     * @param userId 用户ID
      * @return R<Boolean>
      */
-    R<Boolean> deleteComment(Integer commentId, Integer userId);
+    R<Boolean> cancelLikeComment(CommentReplyVo commentReplyVo);
 }
 

+ 116 - 3
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentReplyServiceImpl.java

@@ -1,18 +1,23 @@
 package shop.alien.lawyer.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.CommentReply;
+import shop.alien.entity.store.LifeLikeRecord;
 import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.CommentReplyDto;
 import shop.alien.entity.store.vo.CommentReplyVo;
 import shop.alien.lawyer.service.CommentReplyService;
 import shop.alien.lawyer.service.ReviewCommentService;
 import shop.alien.mapper.CommentReplyMapper;
+import shop.alien.mapper.LifeLikeRecordMapper;
 
 import java.util.Date;
 import java.util.List;
@@ -31,6 +36,7 @@ public class CommentReplyServiceImpl extends ServiceImpl<CommentReplyMapper, Com
 
     private final CommentReplyMapper commentReplyMapper;
     private final ReviewCommentService reviewCommentService;
+    private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
     @Override
     public R<CommentReply> createReply(CommentReplyDto replyDto) {
@@ -83,14 +89,23 @@ public class CommentReplyServiceImpl extends ServiceImpl<CommentReplyMapper, Com
     }
 
     @Override
-    public R<List<CommentReplyVo>> getReplyListByCommentId(Integer commentId) {
-        log.info("CommentReplyServiceImpl.getReplyListByCommentId?commentId={}", commentId);
+    public R<List<CommentReplyVo>> getReplyListByCommentId(Integer commentId, Integer currentUserId) {
+        log.info("CommentReplyServiceImpl.getReplyListByCommentId?commentId={}, currentUserId={}", commentId, currentUserId);
 
         if (commentId == null) {
             return R.fail("评论ID不能为空");
         }
 
-        List<CommentReplyVo> replies = commentReplyMapper.getReplyListByCommentId(commentId);
+        List<CommentReplyVo> replies = commentReplyMapper.getReplyListByCommentId(commentId, currentUserId);
+        
+        // 为每个回复查询子回复列表
+        if (replies != null && !replies.isEmpty()) {
+            for (CommentReplyVo reply : replies) {
+                List<CommentReplyVo> childReplies = commentReplyMapper.getChildReplyListByParentId(reply.getId(), currentUserId);
+                reply.setChildReplies(childReplies);
+            }
+        }
+        
         return R.data(replies);
     }
 
@@ -137,5 +152,103 @@ public class CommentReplyServiceImpl extends ServiceImpl<CommentReplyMapper, Com
             return R.fail("删除回复失败");
         }
     }
+
+    @Override
+    public R<Boolean> likeReply(Integer replyId, Integer userId) {
+        log.info("CommentReplyServiceImpl.likeReply?replyId={}, userId={}", replyId, userId);
+
+        if (replyId == null) {
+            return R.fail("回复ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 验证回复是否存在
+        CommentReply reply = this.getById(replyId);
+        if (reply == null || reply.getDeleteFlag() == 1) {
+            return R.fail("回复不存在或已删除");
+        }
+
+        // 检查是否已点赞
+        LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeLikeRecord::getType, "9")
+                .eq(LifeLikeRecord::getDianzanId, String.valueOf(userId))
+                .eq(LifeLikeRecord::getHuifuId, String.valueOf(replyId))
+                .eq(LifeLikeRecord::getDeleteFlag, 0);
+        List<LifeLikeRecord> records = lifeLikeRecordMapper.selectList(queryWrapper);
+
+        if (CollectionUtils.isEmpty(records)) {
+            // 插入点赞记录
+            LifeLikeRecord likeRecord = new LifeLikeRecord();
+            likeRecord.setDianzanId(String.valueOf(userId));
+            likeRecord.setHuifuId(String.valueOf(replyId));
+            likeRecord.setType("9");
+            likeRecord.setCreatedTime(new Date());
+            likeRecord.setCreatedUserId(userId);
+            lifeLikeRecordMapper.insert(likeRecord);
+
+            // 更新回复点赞数
+            LambdaUpdateWrapper<CommentReply> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(CommentReply::getId, replyId);
+            updateWrapper.setSql("like_count = like_count + 1");
+            int result = commentReplyMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("点赞回复成功,回复ID={}", replyId);
+                return R.data(true, "点赞成功");
+            } else {
+                return R.fail("点赞失败");
+            }
+        } else {
+            return R.data(true, "已点赞");
+        }
+    }
+
+    @Override
+    public R<Boolean> cancelLikeReply(Integer replyId, Integer userId) {
+        log.info("CommentReplyServiceImpl.cancelLikeReply?replyId={}, userId={}", replyId, userId);
+
+        if (replyId == null) {
+            return R.fail("回复ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 查询点赞记录
+        LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeLikeRecord::getType, "9")
+                .eq(LifeLikeRecord::getDianzanId, String.valueOf(userId))
+                .eq(LifeLikeRecord::getHuifuId, String.valueOf(replyId))
+                .eq(LifeLikeRecord::getDeleteFlag, 0);
+        List<LifeLikeRecord> records = lifeLikeRecordMapper.selectList(queryWrapper);
+
+        if (!CollectionUtils.isEmpty(records)) {
+            // 删除点赞记录(逻辑删除)
+            for (LifeLikeRecord record : records) {
+                record.setDeleteFlag(1);
+                record.setUpdatedUserId(userId);
+                record.setUpdatedTime(new Date());
+                lifeLikeRecordMapper.updateById(record);
+            }
+
+            // 更新回复点赞数
+            LambdaUpdateWrapper<CommentReply> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(CommentReply::getId, replyId);
+            updateWrapper.gt(CommentReply::getLikeCount, 0);
+            updateWrapper.setSql("like_count = like_count - 1");
+            int result = commentReplyMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("取消点赞回复成功,回复ID={}", replyId);
+                return R.data(true, "取消点赞成功");
+            } else {
+                return R.fail("取消点赞失败");
+            }
+        } else {
+            return R.data(true, "未点赞");
+        }
+    }
 }
 

+ 127 - 15
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java

@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.LifeLikeRecord;
 import shop.alien.entity.store.OrderReview;
 import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.OrderReviewDto;
@@ -26,6 +27,7 @@ import shop.alien.mapper.*;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 订单评价 服务实现类
@@ -44,6 +46,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     private final ReviewCommentService reviewCommentService;
     private final ReviewCommentMapper reviewCommentMapper;
     private final CommentReplyMapper commentReplyMapper;
+    private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
     @Override
     public R<OrderReview> createReview(OrderReviewDto reviewDto) {
@@ -125,12 +128,12 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     }
 
     @Override
-    public R<IPage<OrderReviewVo>> getReviewList(int pageNum, int pageSize, Integer orderId, Integer lawyerUserId, Integer userId) {
-        log.info("OrderReviewServiceImpl.getReviewList?pageNum={}, pageSize={}, orderId={}, lawyerUserId={}, userId={}",
-                pageNum, pageSize, orderId, lawyerUserId, userId);
+    public R<IPage<OrderReviewVo>> getReviewList(int pageNum, int pageSize, Integer orderId, Integer lawyerUserId, Integer userId, Integer currentUserId) {
+        log.info("OrderReviewServiceImpl.getReviewList?pageNum={}, pageSize={}, orderId={}, lawyerUserId={}, userId={}, currentUserId={}",
+                pageNum, pageSize, orderId, lawyerUserId, userId, currentUserId);
 
         Page<OrderReviewVo> page = new Page<>(pageNum, pageSize);
-        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, orderId, lawyerUserId, userId);
+        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, orderId, lawyerUserId, userId, currentUserId);
         
         // 处理评价图片JSON字符串转换为列表
         if (result.getRecords() != null) {
@@ -146,15 +149,15 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     }
 
     @Override
-    public R<OrderReviewDetailVo> getReviewDetail(Integer reviewId) {
-        log.info("OrderReviewServiceImpl.getReviewDetail?reviewId={}", reviewId);
+    public R<OrderReviewDetailVo> getReviewDetail(Integer reviewId, Integer currentUserId) {
+        log.info("OrderReviewServiceImpl.getReviewDetail?reviewId={}, currentUserId={}", reviewId, currentUserId);
 
         if (reviewId == null) {
             return R.fail("评价ID不能为空");
         }
 
         // 查询评价详情
-        OrderReviewVo reviewVo = orderReviewMapper.getReviewDetailById(reviewId);
+        OrderReviewVo reviewVo = orderReviewMapper.getReviewDetailById(reviewId, currentUserId);
         if (reviewVo == null) {
             return R.fail("评价不存在");
         }
@@ -171,13 +174,24 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         // 查询评论列表
-        List<shop.alien.entity.store.vo.ReviewCommentVo> comments = reviewCommentMapper.getCommentListByReviewId(reviewId);
+        List<shop.alien.entity.store.vo.ReviewCommentVo> comments = reviewCommentMapper.getCommentListByReviewId(reviewId, currentUserId);
+        
+        // 为每个评论查询回复列表
+        if (comments != null && !comments.isEmpty()) {
+            for (shop.alien.entity.store.vo.ReviewCommentVo comment : comments) {
+                List<shop.alien.entity.store.vo.CommentReplyVo> replies = commentReplyMapper.getReplyListByCommentId(comment.getId(), currentUserId);
+                comment.setReplies(replies);
+            }
+        }
         
         // 构建返回结果
         OrderReviewDetailVo detailVo = new OrderReviewDetailVo();
         detailVo.setReview(reviewVo);
         detailVo.setComments(comments);
         detailVo.setTotalCommentCount(comments != null ? comments.size() : 0);
+        // 设置评价的点赞数和是否已点赞(从 reviewVo 中获取)
+        detailVo.setLikeCount(reviewVo.getLikeCount());
+        detailVo.setIsLiked(reviewVo.getIsLiked());
 
         return R.data(detailVo);
     }
@@ -244,14 +258,14 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     }
 
     @Override
-    public R<OrderReviewVo> getReviewByOrderId(Integer orderId) {
-        log.info("OrderReviewServiceImpl.getReviewByOrderId?orderId={}", orderId);
+    public R<OrderReviewVo> getReviewByOrderId(Integer orderId, Integer currentUserId) {
+        log.info("OrderReviewServiceImpl.getReviewByOrderId?orderId={}, currentUserId={}", orderId, currentUserId);
 
         if (orderId == null) {
             return R.fail("订单ID不能为空");
         }
 
-        OrderReviewVo reviewVo = orderReviewMapper.getReviewByOrderId(orderId);
+        OrderReviewVo reviewVo = orderReviewMapper.getReviewByOrderId(orderId, currentUserId);
         if (reviewVo == null) {
             return R.fail("该订单暂无评价");
         }
@@ -288,16 +302,16 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     }
 
     @Override
-    public R<IPage<OrderReviewVo>> getMyReviewList(int pageNum, int pageSize, Integer userId) {
-        log.info("OrderReviewServiceImpl.getMyReviewList?pageNum={}, pageSize={}, userId={}",
-                pageNum, pageSize, userId);
+    public R<IPage<OrderReviewVo>> getMyReviewList(int pageNum, int pageSize, Integer userId, Integer currentUserId) {
+        log.info("OrderReviewServiceImpl.getMyReviewList?pageNum={}, pageSize={}, userId={}, currentUserId={}",
+                pageNum, pageSize, userId, currentUserId);
 
         if (userId == null) {
             return R.fail("用户ID不能为空");
         }
 
         Page<OrderReviewVo> page = new Page<>(pageNum, pageSize);
-        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, null, null, userId);
+        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, null, null, userId, currentUserId);
 
         // 处理评价图片:将JSON字符串转换为List<String>
         if (result.getRecords() != null) {
@@ -327,5 +341,103 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
 
         return R.data(result);
     }
+
+    @Override
+    public R<Boolean> likeReview(Integer reviewId, Integer userId) {
+        log.info("OrderReviewServiceImpl.likeReview?reviewId={}, userId={}", reviewId, userId);
+
+        if (reviewId == null) {
+            return R.fail("评价ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 验证评价是否存在
+        OrderReview review = this.getById(reviewId);
+        if (review == null || review.getDeleteFlag() == 1) {
+            return R.fail("评价不存在或已删除");
+        }
+
+        // 检查是否已点赞
+        LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeLikeRecord::getType, "7")
+                .eq(LifeLikeRecord::getDianzanId, String.valueOf(userId))
+                .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))
+                .eq(LifeLikeRecord::getDeleteFlag, 0);
+        List<LifeLikeRecord> records = lifeLikeRecordMapper.selectList(queryWrapper);
+
+        if (CollectionUtils.isEmpty(records)) {
+            // 插入点赞记录
+            LifeLikeRecord likeRecord = new LifeLikeRecord();
+            likeRecord.setDianzanId(String.valueOf(userId));
+            likeRecord.setHuifuId(String.valueOf(reviewId));
+            likeRecord.setType("7");
+            likeRecord.setCreatedTime(new Date());
+            likeRecord.setCreatedUserId(userId);
+            lifeLikeRecordMapper.insert(likeRecord);
+
+            // 更新评价点赞数
+            LambdaUpdateWrapper<OrderReview> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(OrderReview::getId, reviewId);
+            updateWrapper.setSql("like_count = like_count + 1");
+            int result = orderReviewMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("点赞评价成功,评价ID={}", reviewId);
+                return R.data(true, "点赞成功");
+            } else {
+                return R.fail("点赞失败");
+            }
+        } else {
+            return R.data(true, "已点赞");
+        }
+    }
+
+    @Override
+    public R<Boolean> cancelLikeReview(Integer reviewId, Integer userId) {
+        log.info("OrderReviewServiceImpl.cancelLikeReview?reviewId={}, userId={}", reviewId, userId);
+
+        if (reviewId == null) {
+            return R.fail("评价ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 查询点赞记录
+        LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeLikeRecord::getType, "7")
+                .eq(LifeLikeRecord::getDianzanId, String.valueOf(userId))
+                .eq(LifeLikeRecord::getHuifuId, String.valueOf(reviewId))
+                .eq(LifeLikeRecord::getDeleteFlag, 0);
+        List<LifeLikeRecord> records = lifeLikeRecordMapper.selectList(queryWrapper);
+
+        if (!CollectionUtils.isEmpty(records)) {
+            // 删除点赞记录(逻辑删除)
+            for (LifeLikeRecord record : records) {
+                record.setDeleteFlag(1);
+                record.setUpdatedUserId(userId);
+                record.setUpdatedTime(new Date());
+                lifeLikeRecordMapper.updateById(record);
+            }
+
+            // 更新评价点赞数
+            LambdaUpdateWrapper<OrderReview> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(OrderReview::getId, reviewId);
+            updateWrapper.gt(OrderReview::getLikeCount, 0);
+            updateWrapper.setSql("like_count = like_count - 1");
+            int result = orderReviewMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("取消点赞评价成功,评价ID={}", reviewId);
+                return R.data(true, "取消点赞成功");
+            } else {
+                return R.fail("取消点赞失败");
+            }
+        } else {
+            return R.data(true, "未点赞");
+        }
+    }
 }
 

+ 121 - 6
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

@@ -1,18 +1,24 @@
 package shop.alien.lawyer.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 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.ReviewCommentDto;
+import shop.alien.entity.store.vo.CommentReplyVo;
 import shop.alien.entity.store.vo.ReviewCommentVo;
 import shop.alien.lawyer.service.OrderReviewService;
 import shop.alien.lawyer.service.ReviewCommentService;
 import shop.alien.mapper.CommentReplyMapper;
+import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.ReviewCommentMapper;
 
 import java.util.Date;
@@ -32,13 +38,16 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     private final ReviewCommentMapper reviewCommentMapper;
     private final CommentReplyMapper commentReplyMapper;
     private final OrderReviewService orderReviewService;
+    private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
     public ReviewCommentServiceImpl(ReviewCommentMapper reviewCommentMapper,
                                     CommentReplyMapper commentReplyMapper,
-                                    @Lazy OrderReviewService orderReviewService) {
+                                    @Lazy OrderReviewService orderReviewService,
+                                    LifeLikeRecordMapper lifeLikeRecordMapper) {
         this.reviewCommentMapper = reviewCommentMapper;
         this.commentReplyMapper = commentReplyMapper;
         this.orderReviewService = orderReviewService;
+        this.lifeLikeRecordMapper = lifeLikeRecordMapper;
     }
 
     @Override
@@ -91,20 +100,23 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     }
 
     @Override
-    public R<List<ReviewCommentVo>> getCommentListByReviewId(Integer reviewId) {
-        log.info("ReviewCommentServiceImpl.getCommentListByReviewId?reviewId={}", reviewId);
+    public R<List<ReviewCommentVo>> getCommentListByReviewId(Integer reviewId, Integer currentUserId) {
+        log.info("ReviewCommentServiceImpl.getCommentListByReviewId?reviewId={}, currentUserId={}", reviewId, currentUserId);
 
         if (reviewId == null) {
             return R.fail("评价ID不能为空");
         }
 
-        List<ReviewCommentVo> comments = reviewCommentMapper.getCommentListByReviewId(reviewId);
+        List<ReviewCommentVo> comments = reviewCommentMapper.getCommentListByReviewId(reviewId, currentUserId);
         return R.data(comments);
     }
 
     @Override
-    public R<Boolean> deleteComment(Integer commentId, Integer userId) {
-        log.info("ReviewCommentServiceImpl.deleteComment?commentId={}, userId={}", commentId, userId);
+    public R<Boolean> deleteComment(CommentReplyVo commentReplyVo) {
+        log.info("ReviewCommentController.deleteComment?CommentReplyVo={}", commentReplyVo);
+
+        Integer commentId = commentReplyVo.getCommentId();
+        Integer userId = commentReplyVo.getUserId();
 
         if (commentId == null) {
             return R.fail("评论ID不能为空");
@@ -148,5 +160,108 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.fail("删除评论失败");
         }
     }
+
+    @Override
+    public R<Boolean> likeComment(CommentReplyVo commentReplyVo) {
+        log.info("ReviewCommentServiceImpl.likeComment?CommentReplyVo={}", commentReplyVo);
+
+        Integer commentId = commentReplyVo.getCommentId();
+        Integer userId = commentReplyVo.getUserId();
+
+        if (commentId == null) {
+            return R.fail("评论ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 验证评论是否存在
+        ReviewComment comment = this.getById(commentId);
+        if (comment == null || comment.getDeleteFlag() == 1) {
+            return R.fail("评论不存在或已删除");
+        }
+
+        // 检查是否已点赞
+        LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeLikeRecord::getType, "8")
+                .eq(LifeLikeRecord::getDianzanId, String.valueOf(userId))
+                .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
+                .eq(LifeLikeRecord::getDeleteFlag, 0);
+        List<LifeLikeRecord> records = lifeLikeRecordMapper.selectList(queryWrapper);
+
+        if (CollectionUtils.isEmpty(records)) {
+            // 插入点赞记录
+            LifeLikeRecord likeRecord = new LifeLikeRecord();
+            likeRecord.setDianzanId(String.valueOf(userId));
+            likeRecord.setHuifuId(String.valueOf(commentId));
+            likeRecord.setType("8");
+            likeRecord.setCreatedTime(new Date());
+            likeRecord.setCreatedUserId(userId);
+            lifeLikeRecordMapper.insert(likeRecord);
+
+            // 更新评论点赞数
+            LambdaUpdateWrapper<ReviewComment> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(ReviewComment::getId, commentId);
+            updateWrapper.setSql("like_count = like_count + 1");
+            int result = reviewCommentMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("点赞评论成功,评论ID={}", commentId);
+                return R.data(true, "点赞成功");
+            } else {
+                return R.fail("点赞失败");
+            }
+        } else {
+            return R.data(true, "已点赞");
+        }
+    }
+
+    @Override
+    public R<Boolean> cancelLikeComment(CommentReplyVo commentReplyVo) {
+        log.info("ReviewCommentServiceImpl.cancelLikeComment?CommentReplyVo={}", commentReplyVo);
+
+        Integer commentId = commentReplyVo.getCommentId();
+        Integer userId = commentReplyVo.getUserId();
+        if (commentId == null) {
+            return R.fail("评论ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 查询点赞记录
+        LambdaQueryWrapper<LifeLikeRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeLikeRecord::getType, "8")
+                .eq(LifeLikeRecord::getDianzanId, String.valueOf(userId))
+                .eq(LifeLikeRecord::getHuifuId, String.valueOf(commentId))
+                .eq(LifeLikeRecord::getDeleteFlag, 0);
+        List<LifeLikeRecord> records = lifeLikeRecordMapper.selectList(queryWrapper);
+
+        if (!CollectionUtils.isEmpty(records)) {
+            // 删除点赞记录(逻辑删除)
+            for (LifeLikeRecord record : records) {
+                record.setDeleteFlag(1);
+                record.setUpdatedUserId(userId);
+                record.setUpdatedTime(new Date());
+                lifeLikeRecordMapper.updateById(record);
+            }
+
+            // 更新评论点赞数
+            LambdaUpdateWrapper<ReviewComment> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(ReviewComment::getId, commentId);
+            updateWrapper.gt(ReviewComment::getLikeCount, 0);
+            updateWrapper.setSql("like_count = like_count - 1");
+            int result = reviewCommentMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("取消点赞评论成功,评论ID={}", commentId);
+                return R.data(true, "取消点赞成功");
+            } else {
+                return R.fail("取消点赞失败");
+            }
+        } else {
+            return R.data(true, "未点赞");
+        }
+    }
 }