浏览代码

融表 comment_reply 至 lawyer_review_comment 中 作废 comment_reply

LuTong 3 周之前
父节点
当前提交
b544d50abe
共有 17 个文件被更改,包括 452 次插入804 次删除
  1. 0 76
      alien-entity/src/main/java/shop/alien/entity/store/CommentReply.java
  2. 0 32
      alien-entity/src/main/java/shop/alien/entity/store/dto/CommentReplyDto.java
  3. 0 64
      alien-entity/src/main/java/shop/alien/entity/store/vo/CommentReplyVo.java
  4. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/vo/ReviewCommentVo.java
  5. 0 54
      alien-entity/src/main/java/shop/alien/mapper/CommentReplyMapper.java
  6. 9 0
      alien-entity/src/main/java/shop/alien/mapper/ReviewCommentMapper.java
  7. 0 104
      alien-entity/src/main/resources/mapper/CommentReplyMapper.xml
  8. 34 0
      alien-entity/src/main/resources/mapper/ReviewCommentMapper.xml
  9. 2 2
      alien-lawyer/src/main/java/shop/alien/lawyer/config/MyBatisFieldHandler.java
  10. 0 106
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/CommentReplyController.java
  11. 90 13
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java
  12. 0 64
      alien-lawyer/src/main/java/shop/alien/lawyer/service/CommentReplyService.java
  13. 51 9
      alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java
  14. 8 2
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentAppealServiceImpl.java
  15. 0 254
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentReplyServiceImpl.java
  16. 10 4
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java
  17. 247 19
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

+ 0 - 76
alien-entity/src/main/java/shop/alien/entity/store/CommentReply.java

@@ -1,76 +0,0 @@
-package shop.alien.entity.store;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * 评论回复表
- * 用户对评论的回复(支持嵌套回复)
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("comment_reply")
-@ApiModel(value = "CommentReply对象", description = "评论回复")
-public class CommentReply {
-
-    @ApiModelProperty(value = "主键")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "评论ID")
-    @TableField("comment_id")
-    private Integer commentId;
-
-    @ApiModelProperty(value = "回复用户ID")
-    @TableField("user_id")
-    private Integer userId;
-
-    @ApiModelProperty(value = "被回复用户ID(如果是回复评论,则为评论用户ID;如果是回复回复,则为被回复用户ID)")
-    @TableField("reply_to_user_id")
-    private Integer replyToUserId;
-
-    @ApiModelProperty(value = "父回复ID(如果是回复评论,则为0;如果是回复回复,则为父回复ID)")
-    @TableField("parent_reply_id")
-    private Integer parentReplyId;
-
-    @ApiModelProperty(value = "回复内容")
-    @TableField("reply_content")
-    private String replyContent;
-
-    @ApiModelProperty(value = "点赞数")
-    @TableField("like_count")
-    private Integer likeCount;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}
-

+ 0 - 32
alien-entity/src/main/java/shop/alien/entity/store/dto/CommentReplyDto.java

@@ -1,32 +0,0 @@
-package shop.alien.entity.store.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * 评论回复DTO
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@ApiModel(value = "CommentReplyDto对象", description = "评论回复DTO")
-public class CommentReplyDto {
-
-    @ApiModelProperty(value = "评论ID")
-    private Integer commentId;
-
-    @ApiModelProperty(value = "被回复用户ID(如果是回复评论,则为评论用户ID;如果是回复回复,则为被回复用户ID)")
-    private Integer replyToUserId;
-
-    @ApiModelProperty(value = "父回复ID(如果是回复评论,则为0;如果是回复回复,则为父回复ID)")
-    private Integer parentReplyId;
-
-    @ApiModelProperty(value = "回复内容")
-    private String replyContent;
-
-    @ApiModelProperty(value = "回复内容")
-    private Integer userId;
-}
-

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

@@ -1,64 +0,0 @@
-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;
-
-/**
- * 评论回复VO
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@ApiModel(value = "CommentReplyVo对象", description = "评论回复VO")
-public class CommentReplyVo {
-
-    @ApiModelProperty(value = "主键")
-    private Integer id;
-
-    @ApiModelProperty(value = "评论ID")
-    private Integer commentId;
-
-    @ApiModelProperty(value = "回复用户ID")
-    private Integer userId;
-
-    @ApiModelProperty(value = "回复用户名称")
-    private String userName;
-
-    @ApiModelProperty(value = "回复用户头像")
-    private String userAvatar;
-
-    @ApiModelProperty(value = "被回复用户ID")
-    private Integer replyToUserId;
-
-    @ApiModelProperty(value = "被回复用户名称")
-    private String replyToUserName;
-
-    @ApiModelProperty(value = "父回复ID")
-    private Integer parentReplyId;
-
-    @ApiModelProperty(value = "回复内容")
-    private String replyContent;
-
-    @ApiModelProperty(value = "点赞数")
-    private Integer likeCount;
-
-    @ApiModelProperty(value = "当前用户是否已点赞,0:未点赞,1:已点赞")
-    private Integer isLiked;
-
-    @ApiModelProperty(value = "回复数")
-    private Integer replyCount;
-
-    @ApiModelProperty(value = "子回复列表")
-    private List<CommentReplyVo> childReplies;
-
-    @ApiModelProperty(value = "创建时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-}
-

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

@@ -55,7 +55,7 @@ public class ReviewCommentVo {
     private Integer isLiked;
 
     @ApiModelProperty(value = "回复列表")
-    private List<CommentReplyVo> replies;
+    private List<ReviewCommentVo> replies;
 
     @ApiModelProperty(value = "创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

+ 0 - 54
alien-entity/src/main/java/shop/alien/mapper/CommentReplyMapper.java

@@ -1,54 +0,0 @@
-package shop.alien.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-import shop.alien.entity.store.CommentReply;
-import shop.alien.entity.store.vo.CommentReplyVo;
-
-import java.util.List;
-
-/**
- * 评论回复 Mapper 接口
- *
- * @author system
- * @since 2025-01-XX
- */
-@Mapper
-public interface CommentReplyMapper extends BaseMapper<CommentReply> {
-
-    /**
-     * 根据评论ID查询回复列表(包含用户信息)
-     *
-     * @param commentId 评论ID
-     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
-     * @return 回复列表
-     */
-    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查询回复数量
-     *
-     * @param commentId 评论ID
-     * @return 回复数量
-     */
-    Integer getReplyCountByCommentId(@Param("commentId") Integer commentId);
-
-    /**
-     * 根据评论ID删除所有回复(逻辑删除)
-     *
-     * @param commentId 评论ID
-     * @return 删除数量
-     */
-    Integer deleteRepliesByCommentId(@Param("commentId") Integer commentId);
-}
-

+ 9 - 0
alien-entity/src/main/java/shop/alien/mapper/ReviewCommentMapper.java

@@ -33,5 +33,14 @@ public interface ReviewCommentMapper extends BaseMapper<ReviewComment> {
      * @return 评论数量
      */
     Integer getCommentCountByReviewId(@Param("reviewId") Integer reviewId);
+
+    /**
+     * 根据首评ID查询回复列表(包含用户信息)
+     *
+     * @param headId 首评ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
+     * @return 回复列表
+     */
+    List<ReviewCommentVo> getReplyListByHeadId(@Param("headId") Integer headId, @Param("currentUserId") Integer currentUserId);
 }
 

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

@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="shop.alien.mapper.CommentReplyMapper">
-
-    <!-- 回复列表查询结果映射 -->
-    <resultMap id="CommentReplyVoResultMap" type="shop.alien.entity.store.vo.CommentReplyVo">
-        <id column="id" property="id" />
-        <result column="comment_id" property="commentId" />
-        <result column="user_id" property="userId" />
-        <result column="user_name" property="userName" />
-        <result column="user_avatar" property="userAvatar" />
-        <result column="reply_to_user_id" property="replyToUserId" />
-        <result column="reply_to_user_name" property="replyToUserName" />
-        <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>
-
-    <!-- 根据评论ID查询回复列表(包含用户信息) -->
-    <select id="getReplyListByCommentId" 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,
-            (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>
-
-    <!-- 根据评论ID查询回复数量 -->
-    <select id="getReplyCountByCommentId" resultType="java.lang.Integer">
-        SELECT COUNT(*)
-        FROM comment_reply
-        WHERE delete_flag = 0
-        AND comment_id = #{commentId}
-    </select>
-
-    <!-- 根据评论ID删除所有回复(逻辑删除) -->
-    <update id="deleteRepliesByCommentId">
-        UPDATE comment_reply
-        SET delete_flag = 1,
-            updated_time = NOW()
-        WHERE delete_flag = 0
-        AND comment_id = #{commentId}
-    </update>
-
-</mapper>
-

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

@@ -46,15 +46,49 @@
             AND llr.delete_flag = 0
         WHERE rc.delete_flag = 0
         AND rc.review_id = #{reviewId}
+        AND rc.head_type = 0
         ORDER BY rc.created_time DESC
     </select>
 
+    <!-- 根据首评ID查询回复列表(包含用户信息) -->
+    <select id="getReplyListByHeadId" resultMap="ReviewCommentVoResultMap">
+        SELECT
+            rc.id,
+            rc.review_id,
+            rc.send_user_id,
+            rc.receive_user_id,
+            lu.user_name AS user_name,
+            lu.user_image AS user_avatar,
+            rc.comment_content,
+            rc.like_count,
+            rc.reply_count,
+            rc.head_type,
+            rc.head_id,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
+            rc.created_time
+        FROM lawyer_review_comment rc
+        LEFT JOIN life_user lu ON lu.id = rc.send_user_id AND lu.delete_flag = 0
+        LEFT JOIN life_user lu2 ON lu2.id = rc.receive_user_id AND lu2.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.head_id = #{headId}
+        AND rc.head_type = 1
+        ORDER BY rc.created_time ASC
+    </select>
+
     <!-- 根据评价ID查询评论数量 -->
     <select id="getCommentCountByReviewId" resultType="java.lang.Integer">
         SELECT COUNT(*)
         FROM lawyer_review_comment
         WHERE delete_flag = 0
         AND review_id = #{reviewId}
+        AND head_type = 0
     </select>
 
 </mapper>

+ 2 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/config/MyBatisFieldHandler.java

@@ -52,8 +52,8 @@ public class MyBatisFieldHandler implements MetaObjectHandler {
         //字段为实体类名, 不是表字段名
         this.setFieldValByName("updatedTime", new Date(), metaObject);
         if (JwtUtil.hasToken()) {
-//            this.setFieldValByName("updatedUserId", 0, metaObject);
-            this.setFieldValByName("updatedUserId", Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId"), metaObject);
+            this.setFieldValByName("updatedUserId", 0, metaObject);
+//            this.setFieldValByName("updatedUserId", Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId"), metaObject);
         } else {
             this.setFieldValByName("updatedUserId", 0, metaObject);
         }

+ 0 - 106
alien-lawyer/src/main/java/shop/alien/lawyer/controller/CommentReplyController.java

@@ -1,106 +0,0 @@
-package shop.alien.lawyer.controller;
-
-import io.swagger.annotations.*;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-import shop.alien.entity.result.R;
-import shop.alien.entity.store.CommentReply;
-import shop.alien.entity.store.dto.CommentReplyDto;
-import shop.alien.entity.store.vo.CommentReplyVo;
-import shop.alien.entity.store.UserLoginInfo;
-import shop.alien.lawyer.service.CommentReplyService;
-import shop.alien.util.common.TokenInfo;
-
-import java.util.List;
-
-/**
- * 评论回复 前端控制器
- *
- * @author system
- * @since 2025-01-XX
- */
-@Slf4j
-@Api(tags = {"律师平台-评论回复"})
-@ApiSort(17)
-@CrossOrigin
-@RestController
-@RequestMapping("/lawyer/commentReply")
-@RequiredArgsConstructor
-public class CommentReplyController {
-
-    private final CommentReplyService commentReplyService;
-
-    @ApiOperation("创建回复(用户对评论的回复)")
-    @ApiOperationSupport(order = 1)
-    @PostMapping("/create")
-    public R<CommentReply> createReply(@RequestBody CommentReplyDto replyDto) {
-        log.info("CommentReplyController.createReply?replyDto={}", replyDto);
-        if (replyDto.getUserId() == null) {
-            return R.fail("用户未登录");
-        }
-        return commentReplyService.createReply(replyDto);
-    }
-
-    @ApiOperation("根据评论ID查询回复列表")
-    @ApiOperationSupport(order = 2)
-    @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,
-            @RequestParam(required = false) Integer currentUserId) {
-        log.info("CommentReplyController.getReplyListByCommentId?commentId={}, currentUserId={}", commentId, currentUserId);
-        return commentReplyService.getReplyListByCommentId(commentId, currentUserId);
-    }
-
-    @ApiOperation("删除回复")
-    @ApiOperationSupport(order = 3)
-    @ApiImplicitParam(name = "replyId", value = "回复ID", dataType = "int", paramType = "query", required = true)
-    @PostMapping("/delete/replyId")
-    public R<Boolean> deleteReply(  @RequestParam Integer replyId,
-                                    @RequestParam Integer userId) {
-        log.info("CommentReplyController.deleteReply?replyId={}, userId={}", replyId, userId);
-        if (userId == null) {
-            return R.fail("用户未登录");
-        }
-        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);
-    }
-}
-

+ 90 - 13
alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java

@@ -7,7 +7,8 @@ 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.dto.ReviewCommentRequestDto;
+import shop.alien.entity.store.dto.ReviewReplyDto;
 import shop.alien.entity.store.vo.ReviewCommentVo;
 import shop.alien.entity.store.UserLoginInfo;
 import shop.alien.lawyer.service.ReviewCommentService;
@@ -64,12 +65,12 @@ public class ReviewCommentController {
             @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) {
+    public R<Boolean> deleteComment(@RequestBody ReviewCommentRequestDto requestDto) {
+        log.info("ReviewCommentController.deleteComment?requestDto={}", requestDto);
+        if (requestDto.getUserId() == null) {
             return R.fail("用户未登录");
         }
-        return reviewCommentService.deleteComment(commentReplyVo);
+        return reviewCommentService.deleteComment(requestDto);
     }
 
     @ApiOperation("点赞评论")
@@ -79,12 +80,12 @@ public class ReviewCommentController {
             @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) {
+    public R<Boolean> likeComment(@RequestBody ReviewCommentRequestDto requestDto) {
+        log.info("ReviewCommentController.likeComment?requestDto={}", requestDto);
+        if (requestDto.getUserId() == null) {
             return R.fail("用户未登录");
         }
-        return reviewCommentService.likeComment(commentReplyVo);
+        return reviewCommentService.likeComment(requestDto);
     }
 
     @ApiOperation("取消点赞评论")
@@ -94,12 +95,88 @@ public class ReviewCommentController {
             @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) {
+    public R<Boolean> cancelLikeComment(@RequestBody ReviewCommentRequestDto requestDto) {
+        log.info("ReviewCommentController.cancelLikeComment?requestDto={}", requestDto);
+        if (requestDto.getUserId() == null) {
             return R.fail("用户未登录");
         }
-        return reviewCommentService.cancelLikeComment(commentReplyVo);
+        return reviewCommentService.cancelLikeComment(requestDto);
+    }
+
+    @ApiOperation("创建回复(用户对评论的回复)")
+    @ApiOperationSupport(order = 6)
+    @PostMapping("/reply/create")
+    public R<ReviewComment> createReply(@RequestBody ReviewReplyDto replyDto) {
+        log.info("ReviewCommentController.createReply?replyDto={}", replyDto);
+        if (replyDto.getUserId() == null) {
+            return R.fail("用户未登录");
+        }
+        return reviewCommentService.createReply(replyDto);
+    }
+
+    @ApiOperation("根据首评ID查询回复列表")
+    @ApiOperationSupport(order = 7)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "headId", value = "首评ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+    })
+    @GetMapping("/reply/list/headId")
+    public R<List<ReviewCommentVo>> getReplyListByHeadId(
+            @RequestParam Integer headId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("ReviewCommentController.getReplyListByHeadId?headId={}, currentUserId={}", headId, currentUserId);
+        return reviewCommentService.getReplyListByHeadId(headId, currentUserId);
+    }
+
+    @ApiOperation("删除回复")
+    @ApiOperationSupport(order = 8)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "replyId", value = "回复ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/reply/delete")
+    public R<Boolean> deleteReply(
+            @RequestParam Integer replyId,
+            @RequestParam Integer userId) {
+        log.info("ReviewCommentController.deleteReply?replyId={}, userId={}", replyId, userId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return reviewCommentService.deleteReply(replyId, userId);
+    }
+
+    @ApiOperation("点赞回复")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "replyId", value = "回复ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/reply/like")
+    public R<Boolean> likeReply(
+            @RequestParam Integer replyId,
+            @RequestParam Integer userId) {
+        log.info("ReviewCommentController.likeReply?replyId={}, userId={}", replyId, userId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return reviewCommentService.likeReply(replyId, userId);
+    }
+
+    @ApiOperation("取消点赞回复")
+    @ApiOperationSupport(order = 10)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "replyId", value = "回复ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @PostMapping("/reply/cancelLike")
+    public R<Boolean> cancelLikeReply(
+            @RequestParam Integer replyId,
+            @RequestParam Integer userId) {
+        log.info("ReviewCommentController.cancelLikeReply?replyId={}, userId={}", replyId, userId);
+        if (userId == null) {
+            return R.fail("用户未登录");
+        }
+        return reviewCommentService.cancelLikeReply(replyId, userId);
     }
 }
 

+ 0 - 64
alien-lawyer/src/main/java/shop/alien/lawyer/service/CommentReplyService.java

@@ -1,64 +0,0 @@
-package shop.alien.lawyer.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import shop.alien.entity.result.R;
-import shop.alien.entity.store.CommentReply;
-import shop.alien.entity.store.dto.CommentReplyDto;
-import shop.alien.entity.store.vo.CommentReplyVo;
-
-import java.util.List;
-
-/**
- * 评论回复 服务类
- *
- * @author system
- * @since 2025-01-XX
- */
-public interface CommentReplyService extends IService<CommentReply> {
-
-    /**
-     * 创建回复(用户对评论的回复)
-     *
-     * @param replyDto 回复DTO
-     *
-     * @return R<CommentReply>
-     */
-    R<CommentReply> createReply(CommentReplyDto replyDto);
-
-    /**
-     * 根据评论ID查询回复列表
-     *
-     * @param commentId 评论ID
-     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
-     * @return R<List<CommentReplyVo>>
-     */
-    R<List<CommentReplyVo>> getReplyListByCommentId(Integer commentId, Integer currentUserId);
-
-    /**
-     * 删除回复
-     *
-     * @param replyId 回复ID
-     * @param userId 用户ID(验证是否为回复用户)
-     * @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);
-}
-

+ 51 - 9
alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java

@@ -4,7 +4,8 @@ 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.dto.ReviewCommentRequestDto;
+import shop.alien.entity.store.dto.ReviewReplyDto;
 import shop.alien.entity.store.vo.ReviewCommentVo;
 
 import java.util.List;
@@ -38,28 +39,69 @@ public interface ReviewCommentService extends IService<ReviewComment> {
     /**
      * 删除评论(删除评论时,会级联删除该评论下的所有回复)
      *
-     * @param
-     * @param
+     * @param requestDto 请求DTO
      * @return R<Boolean>
      */
-    R<Boolean> deleteComment(CommentReplyVo commentReplyVo);
+    R<Boolean> deleteComment(ReviewCommentRequestDto requestDto);
 
     /**
      * 点赞评论
      *
-     * @param commentId 评论ID
-     * @param userId 用户ID
+     * @param requestDto 请求DTO
      * @return R<Boolean>
      */
-    R<Boolean> likeComment(CommentReplyVo commentReplyVo);
+    R<Boolean> likeComment(ReviewCommentRequestDto requestDto);
 
     /**
      * 取消点赞评论
      *
-     * @param commentId 评论ID
+     * @param requestDto 请求DTO
+     * @return R<Boolean>
+     */
+    R<Boolean> cancelLikeComment(ReviewCommentRequestDto requestDto);
+
+    /**
+     * 创建回复(用户对评论的回复)
+     *
+     * @param replyDto 回复DTO
+     * @return R<ReviewComment>
+     */
+    R<ReviewComment> createReply(ReviewReplyDto replyDto);
+
+    /**
+     * 根据首评ID查询回复列表
+     *
+     * @param headId 首评ID
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
+     * @return R<List<ReviewCommentVo>>
+     */
+    R<List<ReviewCommentVo>> getReplyListByHeadId(Integer headId, Integer currentUserId);
+
+    /**
+     * 删除回复
+     *
+     * @param replyId 回复ID
+     * @param userId 用户ID
+     * @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> cancelLikeComment(CommentReplyVo commentReplyVo);
+    R<Boolean> cancelLikeReply(Integer replyId, Integer userId);
 }
 

+ 8 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentAppealServiceImpl.java

@@ -2,6 +2,7 @@ package shop.alien.lawyer.service.impl;
 
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -40,7 +41,6 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
 
     private final OrderReviewService orderReviewService;
     private final ReviewCommentService reviewCommentService;
-    private final CommentReplyMapper commentReplyMapper;
     private final WebSocketProcess webSocketProcess;
     private final LifeNoticeMapper lifeNoticeMapper;
     private final OrderReviewMapper orderReviewMapper;
@@ -435,7 +435,13 @@ public class CommentAppealServiceImpl extends ServiceImpl<CommentAppealMapper, C
             // 2. 删除每个评论下的所有回复
             for (ReviewComment comment : comments) {
                 // 删除评论下的所有回复(逻辑删除)
-                commentReplyMapper.deleteRepliesByCommentId(comment.getId());
+                LambdaUpdateWrapper<ReviewComment> replyUpdateWrapper = new LambdaUpdateWrapper<>();
+                replyUpdateWrapper.eq(ReviewComment::getHeadId, comment.getId())
+                        .eq(ReviewComment::getHeadType, 1)
+                        .eq(ReviewComment::getDeleteFlag, 0);
+                replyUpdateWrapper.set(ReviewComment::getDeleteFlag, 1);
+                replyUpdateWrapper.set(ReviewComment::getUpdatedTime, new Date());
+                reviewCommentService.update(replyUpdateWrapper);
                 log.info("删除评论下的回复,commentId={}, 回复数已删除", comment.getId());
             }
 

+ 0 - 254
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/CommentReplyServiceImpl.java

@@ -1,254 +0,0 @@
-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;
-
-/**
- * 评论回复 服务实现类
- *
- * @author system
- * @since 2025-01-XX
- */
-@Slf4j
-@Transactional
-@Service
-@RequiredArgsConstructor
-public class CommentReplyServiceImpl extends ServiceImpl<CommentReplyMapper, CommentReply> implements CommentReplyService {
-
-    private final CommentReplyMapper commentReplyMapper;
-    private final ReviewCommentService reviewCommentService;
-    private final LifeLikeRecordMapper lifeLikeRecordMapper;
-
-    @Override
-    public R<CommentReply> createReply(CommentReplyDto replyDto) {
-        log.info("CommentReplyServiceImpl.createReply?replyDto={}", replyDto);
-
-        // 参数校验
-        if (replyDto == null) {
-            return R.fail("回复信息不能为空");
-        }
-        if (replyDto.getCommentId() == null) {
-            return R.fail("评论ID不能为空");
-        }
-        if (replyDto.getReplyContent() == null || replyDto.getReplyContent().trim().isEmpty()) {
-            return R.fail("回复内容不能为空");
-        }
-        Integer userId=replyDto.getUserId() ;
-        if (userId == null) {
-            return R.fail("用户ID不能为空");
-        }
-
-        // 验证评论是否存在
-        ReviewComment comment = reviewCommentService.getById(replyDto.getCommentId());
-        if (comment == null || comment.getDeleteFlag() == 1) {
-            return R.fail("评论不存在或已删除");
-        }
-
-        // 创建回复
-        CommentReply reply = new CommentReply();
-        reply.setCommentId(replyDto.getCommentId());
-        reply.setUserId(userId);
-        reply.setReplyToUserId(replyDto.getReplyToUserId());
-        reply.setParentReplyId(replyDto.getParentReplyId() != null ? replyDto.getParentReplyId() : 0);
-        reply.setReplyContent(replyDto.getReplyContent());
-        reply.setLikeCount(0);
-        reply.setCreatedUserId(userId);
-        reply.setCreatedTime(new Date());
-
-        boolean success = this.save(reply);
-        if (success) {
-            // 更新评论的回复数
-            comment.setReplyCount((comment.getReplyCount() == null ? 0 : comment.getReplyCount()) + 1);
-            reviewCommentService.updateById(comment);
-            
-            log.info("创建回复成功,回复ID={}", reply.getId());
-            return R.data(reply, "回复成功");
-        } else {
-            log.error("创建回复失败");
-            return R.fail("创建回复失败");
-        }
-    }
-
-    @Override
-    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, 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);
-    }
-
-    @Override
-    public R<Boolean> deleteReply(Integer replyId, Integer userId) {
-        log.info("CommentReplyServiceImpl.deleteReply?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) {
-            return R.fail("回复不存在");
-        }
-
-        // 验证是否为回复用户
-        if (!reply.getUserId().equals(userId)) {
-            return R.fail("只能删除自己的回复");
-        }
-
-        // 删除回复(逻辑删除)
-        reply.setDeleteFlag(1);
-        reply.setUpdatedUserId(userId);
-        reply.setUpdatedTime(new Date());
-        boolean success = this.updateById(reply);
-
-        if (success) {
-            // 更新评论的回复数
-            ReviewComment comment = reviewCommentService.getById(reply.getCommentId());
-            if (comment != null) {
-                comment.setReplyCount((comment.getReplyCount() == null ? 0 : comment.getReplyCount()) - 1);
-                reviewCommentService.updateById(comment);
-            }
-            
-            log.info("删除回复成功,回复ID={}", replyId);
-            return R.data(true, "删除成功");
-        } else {
-            log.error("删除回复失败,回复ID={}", replyId);
-            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, "未点赞");
-        }
-    }
-}
-

+ 10 - 4
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java

@@ -45,7 +45,6 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
     private final LawyerConsultationOrderMapper lawyerConsultationOrderMapper;
     private final ReviewCommentService reviewCommentService;
     private final ReviewCommentMapper reviewCommentMapper;
-    private final CommentReplyMapper commentReplyMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
 
     @Override
@@ -179,7 +178,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         // 为每个评论查询回复列表
         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);
+                List<shop.alien.entity.store.vo.ReviewCommentVo> replies = reviewCommentMapper.getReplyListByHeadId(comment.getId(), currentUserId);
                 comment.setReplies(replies);
             }
         }
@@ -239,8 +238,15 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         if (num>0) {
             // 级联删除该评价下的所有评论和回复
             for (ReviewComment comment : comments) {
-                // 删除评论下的所有回复
-                commentReplyMapper.deleteRepliesByCommentId(comment.getId());
+                // 删除评论下的所有回复(逻辑删除)
+                LambdaUpdateWrapper<ReviewComment> replyUpdateWrapper = new LambdaUpdateWrapper<>();
+                replyUpdateWrapper.eq(ReviewComment::getHeadId, comment.getId())
+                        .eq(ReviewComment::getHeadType, 1)
+                        .eq(ReviewComment::getDeleteFlag, 0);
+                replyUpdateWrapper.set(ReviewComment::getDeleteFlag, 1);
+                replyUpdateWrapper.set(ReviewComment::getUpdatedUserId, userId);
+                replyUpdateWrapper.set(ReviewComment::getUpdatedTime, new Date());
+                reviewCommentService.update(replyUpdateWrapper);
                 
                 // 删除评论
                 comment.setDeleteFlag(1);

+ 247 - 19
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

@@ -13,11 +13,11 @@ 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.dto.ReviewCommentRequestDto;
+import shop.alien.entity.store.dto.ReviewReplyDto;
 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;
 
@@ -36,16 +36,13 @@ import java.util.List;
 public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, ReviewComment> implements ReviewCommentService {
 
     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,
                                     LifeLikeRecordMapper lifeLikeRecordMapper) {
         this.reviewCommentMapper = reviewCommentMapper;
-        this.commentReplyMapper = commentReplyMapper;
         this.orderReviewService = orderReviewService;
         this.lifeLikeRecordMapper = lifeLikeRecordMapper;
     }
@@ -111,15 +108,24 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         }
 
         List<ReviewCommentVo> comments = reviewCommentMapper.getCommentListByReviewId(reviewId, currentUserId);
+        
+        // 为每个首评加载回复列表
+        if (comments != null && !comments.isEmpty()) {
+            for (ReviewCommentVo comment : comments) {
+                List<ReviewCommentVo> replies = reviewCommentMapper.getReplyListByHeadId(comment.getId(), currentUserId);
+                comment.setReplies(replies);
+            }
+        }
+        
         return R.data(comments);
     }
 
     @Override
-    public R<Boolean> deleteComment(CommentReplyVo commentReplyVo) {
-        log.info("ReviewCommentController.deleteComment?CommentReplyVo={}", commentReplyVo);
+    public R<Boolean> deleteComment(ReviewCommentRequestDto requestDto) {
+        log.info("ReviewCommentServiceImpl.deleteComment?requestDto={}", requestDto);
 
-        Integer commentId = commentReplyVo.getCommentId();
-        Integer userId = commentReplyVo.getUserId();
+        Integer commentId = requestDto.getCommentId();
+        Integer userId = requestDto.getUserId();
 
         if (commentId == null) {
             return R.fail("评论ID不能为空");
@@ -139,8 +145,15 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.fail("只能删除自己的评论");
         }
 
-        // 删除评论下的所有回复
-        commentReplyMapper.deleteRepliesByCommentId(commentId);
+        // 删除评论下的所有回复(逻辑删除)
+        LambdaUpdateWrapper<ReviewComment> replyUpdateWrapper = new LambdaUpdateWrapper<>();
+        replyUpdateWrapper.eq(ReviewComment::getHeadId, commentId)
+                .eq(ReviewComment::getHeadType, 1)
+                .eq(ReviewComment::getDeleteFlag, 0);
+        replyUpdateWrapper.set(ReviewComment::getDeleteFlag, 1);
+        replyUpdateWrapper.set(ReviewComment::getUpdatedUserId, userId);
+        replyUpdateWrapper.set(ReviewComment::getUpdatedTime, new Date());
+        this.update(replyUpdateWrapper);
 
         // 删除评论(逻辑删除)
         comment.setDeleteFlag(1);
@@ -165,11 +178,11 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     }
 
     @Override
-    public R<Boolean> likeComment(CommentReplyVo commentReplyVo) {
-        log.info("ReviewCommentServiceImpl.likeComment?CommentReplyVo={}", commentReplyVo);
+    public R<Boolean> likeComment(ReviewCommentRequestDto requestDto) {
+        log.info("ReviewCommentServiceImpl.likeComment?requestDto={}", requestDto);
 
-        Integer commentId = commentReplyVo.getCommentId();
-        Integer userId = commentReplyVo.getUserId();
+        Integer commentId = requestDto.getCommentId();
+        Integer userId = requestDto.getUserId();
 
         if (commentId == null) {
             return R.fail("评论ID不能为空");
@@ -220,11 +233,11 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     }
 
     @Override
-    public R<Boolean> cancelLikeComment(CommentReplyVo commentReplyVo) {
-        log.info("ReviewCommentServiceImpl.cancelLikeComment?CommentReplyVo={}", commentReplyVo);
+    public R<Boolean> cancelLikeComment(ReviewCommentRequestDto requestDto) {
+        log.info("ReviewCommentServiceImpl.cancelLikeComment?requestDto={}", requestDto);
 
-        Integer commentId = commentReplyVo.getCommentId();
-        Integer userId = commentReplyVo.getUserId();
+        Integer commentId = requestDto.getCommentId();
+        Integer userId = requestDto.getUserId();
         if (commentId == null) {
             return R.fail("评论ID不能为空");
         }
@@ -266,5 +279,220 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.data(true, "未点赞");
         }
     }
+
+    @Override
+    public R<ReviewComment> createReply(ReviewReplyDto replyDto) {
+        log.info("ReviewCommentServiceImpl.createReply?replyDto={}", replyDto);
+
+        // 参数校验
+        if (replyDto == null) {
+            return R.fail("回复信息不能为空");
+        }
+        if (replyDto.getCommentId() == null) {
+            return R.fail("评论ID不能为空");
+        }
+        if (replyDto.getReplyContent() == null || replyDto.getReplyContent().trim().isEmpty()) {
+            return R.fail("回复内容不能为空");
+        }
+        Integer userId = replyDto.getUserId();
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 验证首评是否存在
+        ReviewComment headComment = this.getById(replyDto.getCommentId());
+        if (headComment == null || headComment.getDeleteFlag() == 1) {
+            return R.fail("评论不存在或已删除");
+        }
+        if (headComment.getHeadType() != 0) {
+            return R.fail("只能回复首评");
+        }
+
+        // 创建回复
+        ReviewComment reply = new ReviewComment();
+        reply.setReviewId(headComment.getReviewId());
+        reply.setSendUserId(userId);
+        reply.setReceiveUserId(replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId());
+        reply.setCommentContent(replyDto.getReplyContent());
+        reply.setLikeCount(0);
+        reply.setReplyCount(0);
+        reply.setHeadType(1); // 1:是回复
+        reply.setHeadId(replyDto.getCommentId()); // 指向首评ID
+        reply.setCreatedUserId(userId);
+        reply.setCreatedTime(new Date());
+
+        boolean success = this.save(reply);
+        if (success) {
+            // 更新首评的回复数
+            headComment.setReplyCount((headComment.getReplyCount() == null ? 0 : headComment.getReplyCount()) + 1);
+            this.updateById(headComment);
+            
+            log.info("创建回复成功,回复ID={}", reply.getId());
+            return R.data(reply, "回复成功");
+        } else {
+            log.error("创建回复失败");
+            return R.fail("创建回复失败");
+        }
+    }
+
+    @Override
+    public R<List<ReviewCommentVo>> getReplyListByHeadId(Integer headId, Integer currentUserId) {
+        log.info("ReviewCommentServiceImpl.getReplyListByHeadId?headId={}, currentUserId={}", headId, currentUserId);
+
+        if (headId == null) {
+            return R.fail("首评ID不能为空");
+        }
+
+        List<ReviewCommentVo> replies = reviewCommentMapper.getReplyListByHeadId(headId, currentUserId);
+        return R.data(replies);
+    }
+
+    @Override
+    public R<Boolean> deleteReply(Integer replyId, Integer userId) {
+        log.info("ReviewCommentServiceImpl.deleteReply?replyId={}, userId={}", replyId, userId);
+
+        if (replyId == null) {
+            return R.fail("回复ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 查询回复
+        ReviewComment reply = this.getById(replyId);
+        if (reply == null) {
+            return R.fail("回复不存在");
+        }
+        if (reply.getHeadType() != 1) {
+            return R.fail("该记录不是回复");
+        }
+
+        // 验证是否为回复用户
+        if (!reply.getSendUserId().equals(userId)) {
+            return R.fail("只能删除自己的回复");
+        }
+
+        // 删除回复(逻辑删除)
+        reply.setDeleteFlag(1);
+        reply.setUpdatedUserId(userId);
+        reply.setUpdatedTime(new Date());
+        boolean success = this.updateById(reply);
+
+        if (success) {
+            // 更新首评的回复数
+            ReviewComment headComment = this.getById(reply.getHeadId());
+            if (headComment != null) {
+                headComment.setReplyCount((headComment.getReplyCount() == null ? 0 : headComment.getReplyCount()) - 1);
+                this.updateById(headComment);
+            }
+            
+            log.info("删除回复成功,回复ID={}", replyId);
+            return R.data(true, "删除成功");
+        } else {
+            log.error("删除回复失败,回复ID={}", replyId);
+            return R.fail("删除回复失败");
+        }
+    }
+
+    @Override
+    public R<Boolean> likeReply(Integer replyId, Integer userId) {
+        log.info("ReviewCommentServiceImpl.likeReply?replyId={}, userId={}", replyId, userId);
+
+        if (replyId == null) {
+            return R.fail("回复ID不能为空");
+        }
+        if (userId == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 验证回复是否存在
+        ReviewComment reply = this.getById(replyId);
+        if (reply == null || reply.getDeleteFlag() == 1) {
+            return R.fail("回复不存在或已删除");
+        }
+        if (reply.getHeadType() != 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(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("8");
+            likeRecord.setCreatedTime(new Date());
+            likeRecord.setCreatedUserId(userId);
+            lifeLikeRecordMapper.insert(likeRecord);
+
+            // 更新回复点赞数
+            LambdaUpdateWrapper<ReviewComment> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(ReviewComment::getId, replyId);
+            updateWrapper.setSql("like_count = like_count + 1");
+            int result = reviewCommentMapper.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("ReviewCommentServiceImpl.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, "8")
+                .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<ReviewComment> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(ReviewComment::getId, replyId);
+            updateWrapper.gt(ReviewComment::getLikeCount, 0);
+            updateWrapper.setSql("like_count = like_count - 1");
+            int result = reviewCommentMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("取消点赞回复成功,回复ID={}", replyId);
+                return R.data(true, "取消点赞成功");
+            } else {
+                return R.fail("取消点赞失败");
+            }
+        } else {
+            return R.data(true, "未点赞");
+        }
+    }
 }