Browse Source

开发评分评论,维护律师所名称

lutong 3 days ago
parent
commit
2732a19597
23 changed files with 581 additions and 32 deletions
  1. 8 0
      alien-entity/src/main/java/shop/alien/entity/store/ReviewComment.java
  2. 40 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerReplyDto.java
  3. 6 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/ReviewReplyDto.java
  4. 31 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/PendingReviewVo.java
  5. 6 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/ReviewCommentVo.java
  6. 3 1
      alien-entity/src/main/java/shop/alien/mapper/OrderReviewMapper.java
  7. 5 3
      alien-entity/src/main/resources/mapper/LawyerConsultationOrderMapper.xml
  8. 22 1
      alien-entity/src/main/resources/mapper/OrderReviewMapper.xml
  9. 6 0
      alien-entity/src/main/resources/mapper/ReviewCommentMapper.xml
  10. 3 2
      alien-entity/src/main/resources/mapper/second/LawyerReconcMapper.xml
  11. 1 1
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/OrderReviewController.java
  12. 59 4
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java
  13. 12 0
      alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java
  14. 9 1
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerClientConsultationOrderServiceImpl.java
  15. 33 2
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java
  16. 9 1
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserServiceImpl.java
  17. 2 2
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/OrderReviewServiceImpl.java
  18. 200 2
      alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java
  19. 3 0
      alien-store/src/main/java/shop/alien/store/controller/StoreCommentController.java
  20. 33 2
      alien-store/src/main/java/shop/alien/store/service/impl/LawyerConsultationOrderServiceImpl.java
  21. 13 6
      alien-store/src/main/java/shop/alien/store/service/impl/LawyerUserServiceImpl.java
  22. 2 2
      alien-store/src/main/java/shop/alien/store/service/impl/OrderReviewServiceImpl.java
  23. 75 2
      alien-store/src/main/java/shop/alien/store/service/impl/ReviewCommentServiceImpl.java

+ 8 - 0
alien-entity/src/main/java/shop/alien/entity/store/ReviewComment.java

@@ -38,6 +38,14 @@ public class ReviewComment {
     @TableField("receive_user_id")
     private Integer receiveUserId;
 
+    @ApiModelProperty(value = "发送用户类型:1-普通用户,2-律师")
+    @TableField("send_user_type")
+    private Integer sendUserType;
+
+    @ApiModelProperty(value = "接收用户类型:1-普通用户,2-律师")
+    @TableField("receive_user_type")
+    private Integer receiveUserType;
+
     @ApiModelProperty(value = "评论内容")
     @TableField("comment_content")
     private String commentContent;

+ 40 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/LawyerReplyDto.java

@@ -0,0 +1,40 @@
+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 = "LawyerReplyDto对象", description = "律师回复DTO")
+public class LawyerReplyDto {
+
+    @ApiModelProperty(value = "回复类型:1-回复评价,2-回复评论", required = true)
+    private Integer replyType;
+
+    @ApiModelProperty(value = "评价ID(replyType=1时必填)")
+    private Integer reviewId;
+
+    @ApiModelProperty(value = "评论ID(replyType=2时必填)")
+    private Integer commentId;
+
+    @ApiModelProperty(value = "被回复用户ID(可选,不填时默认回复评价/评论的创建者)")
+    private Integer replyToUserId;
+
+    @ApiModelProperty(value = "回复内容", required = true)
+    private String replyContent;
+
+    @ApiModelProperty(value = "律师用户ID(必填)", required = true)
+    private Integer lawyerUserId;
+
+    @ApiModelProperty(value = "发送用户类型:1-普通用户,2-律师(必填)", required = true)
+    private Integer sendUserType;
+
+    @ApiModelProperty(value = "接收用户类型:1-普通用户,2-律师(必填)", required = true)
+    private Integer receiveUserType;
+}

+ 6 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/ReviewReplyDto.java

@@ -25,5 +25,11 @@ public class ReviewReplyDto {
 
     @ApiModelProperty(value = "用户ID")
     private Integer userId;
+
+    @ApiModelProperty(value = "发送用户类型:1-普通用户,2-律师(可选,不填时使用首评的接收用户类型)")
+    private Integer sendUserType;
+
+    @ApiModelProperty(value = "接收用户类型:1-普通用户,2-律师(可选,不填时使用首评的发送用户类型)")
+    private Integer receiveUserType;
 }
 

+ 31 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/PendingReviewVo.java

@@ -49,5 +49,36 @@ public class PendingReviewVo {
     @ApiModelProperty(value = "订单完成时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date completedTime;
+
+    @ApiModelProperty(value = "问题描述")
+    private String problemDescription;
+
+    @ApiModelProperty(value = "订单金额,单位分")
+    private Integer orderAmount;
+
+    @ApiModelProperty(value = "咨询费用,单位分")
+    private Integer consultationFee;
+
+    @ApiModelProperty(value = "咨询开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty(value = "咨询结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty(value = "下单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date orderTime;
+
+    @ApiModelProperty(value = "支付时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date paymentTime;
+
+    @ApiModelProperty(value = "订单状态, 0:待支付,1.待接单 2:进行中, 3:已完成, 4:已取消,5.已退款")
+    private Integer orderStatus;
+
+    @ApiModelProperty(value = "支付状态, 0:未支付, 1:已支付")
+    private Integer paymentStatus;
 }
 

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

@@ -39,6 +39,12 @@ public class ReviewCommentVo {
     @ApiModelProperty(value = "接收用户名称")
     private String receiveUserName;
 
+    @ApiModelProperty(value = "发送用户类型:1-普通用户,2-律师")
+    private Integer sendUserType;
+
+    @ApiModelProperty(value = "接收用户类型:1-普通用户,2-律师")
+    private Integer receiveUserType;
+
     @ApiModelProperty(value = "评论内容")
     private String commentContent;
 

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

@@ -25,6 +25,7 @@ public interface OrderReviewMapper extends BaseMapper<OrderReview> {
      * @param lawyerUserId 律师用户ID
      * @param userId 评价用户ID
      * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
+     * @param filterAppealId 是否只查询申诉ID为空的评价(true:只查询申诉ID为空的评价,false或null:不过滤)
      * @return 分页结果
      */
     IPage<OrderReviewVo> getReviewListWithUser(
@@ -32,7 +33,8 @@ public interface OrderReviewMapper extends BaseMapper<OrderReview> {
             @Param("orderId") Integer orderId,
             @Param("lawyerUserId") Integer lawyerUserId,
             @Param("userId") Integer userId,
-            @Param("currentUserId") Integer currentUserId
+            @Param("currentUserId") Integer currentUserId,
+            @Param("filterAppealId") Boolean filterAppealId
     );
 
     /**

+ 5 - 3
alien-entity/src/main/resources/mapper/LawyerConsultationOrderMapper.xml

@@ -75,7 +75,7 @@
         <result column="lawyer_phone" property="lawyerPhone" />
         <result column="lawyer_email" property="lawyerEmail" />
         <result column="lawyer_certificate_no" property="lawyerCertificateNo" />
-        <result column="law_firm" property="lawFirm" />
+        <result column="firm_name" property="lawFirm" />
         <result column="practice_years" property="practiceYears" />
         <result column="specialty_fields" property="specialtyFields" />
         <result column="certification_status" property="certificationStatus" />
@@ -120,7 +120,7 @@
             l.phone AS lawyer_phone,
             l.email AS lawyer_email,
             l.lawyer_certificate_no,
-            l.law_firm,
+            lf.firm_name AS law_firm,
             l.practice_years,
             l.specialty_fields,
             l.certification_status,
@@ -136,6 +136,7 @@
             l.personal_introduction
         FROM lawyer_consultation_order o
         LEFT JOIN lawyer_user l ON o.lawyer_user_id = l.id AND l.delete_flag = 0
+        LEFT JOIN law_firm lf ON lf.id = l.firm_id AND lf.delete_flag = 0
         WHERE o.delete_flag = 0
         <if test="orderNumber != null and orderNumber != ''">
             AND o.order_number = #{orderNumber}
@@ -189,7 +190,7 @@
         lu.phone AS lawyer_phone,
         lu.email AS lawyer_email,
         lu.lawyer_certificate_no,
-        lu.law_firm,
+        lf.firm_name AS law_firm,
         lu.practice_years,
         lu.specialty_fields,
         lu.certification_status,
@@ -206,6 +207,7 @@
         lea.expertise_area_info
         FROM lawyer_consultation_order lco
         LEFT JOIN lawyer_user lu ON lco.lawyer_user_id = lu.id AND lu.delete_flag = 0
+        LEFT JOIN law_firm lf ON lf.id = lu.firm_id AND lf.delete_flag = 0
         left join lawyer_expertise_area lea on lea.id = lu.lawyer_expertise_area_id and lea.delete_flag = 0
         WHERE lco.delete_flag = 0
         <if test="userId != null and userId !=''">

+ 22 - 1
alien-entity/src/main/resources/mapper/OrderReviewMapper.xml

@@ -79,6 +79,9 @@
         <if test="userId != null">
             AND orv.user_id = #{userId}
         </if>
+        <if test="filterAppealId != null and filterAppealId == true">
+            AND (orv.appeal_id IS NULL OR orv.appeal_id = '')
+        </if>
         ORDER BY orv.created_time DESC
     </select>
 
@@ -191,6 +194,15 @@
         <result column="review_content" property="reviewContent" />
         <result column="created_time" property="createdTime" />
         <result column="completed_time" property="completedTime" />
+        <result column="problem_description" property="problemDescription" />
+        <result column="order_amount" property="orderAmount" />
+        <result column="consultation_fee" property="consultationFee" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="order_time" property="orderTime" />
+        <result column="payment_time" property="paymentTime" />
+        <result column="order_status" property="orderStatus" />
+        <result column="payment_status" property="paymentStatus" />
     </resultMap>
 
     <!-- 分页查询待评价列表(查询用户已完成但未评价的订单对应的律师信息) -->
@@ -205,7 +217,16 @@
             NULL AS overall_rating,
             NULL AS review_content,
             lco.end_time AS created_time,
-            lco.end_time AS completed_time
+            lco.end_time AS completed_time,
+            lco.problem_description,
+            lco.order_amount,
+            lco.consultation_fee,
+            lco.start_time,
+            lco.end_time,
+            lco.order_time,
+            lco.payment_time,
+            lco.order_status,
+            lco.payment_status
         FROM lawyer_consultation_order lco
         LEFT JOIN lawyer_user lu ON lu.id = lco.lawyer_user_id AND lu.delete_flag = 0
         LEFT JOIN law_firm lf ON lf.id = lu.firm_id AND lf.delete_flag = 0

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

@@ -11,6 +11,8 @@
         <result column="user_name" property="sendUserName" />
         <result column="user_avatar" property="userAvatar" />
         <result column="receive_user_name" property="receiveUserName" />
+        <result column="send_user_type" property="sendUserType" />
+        <result column="receive_user_type" property="receiveUserType" />
         <result column="comment_content" property="commentContent" />
         <result column="like_count" property="likeCount" />
         <result column="reply_count" property="replyCount" />
@@ -30,6 +32,8 @@
             lu.user_name AS user_name,
             lu.user_image AS user_avatar,
             lu2.user_name AS receive_user_name,
+            rc.send_user_type,
+            rc.receive_user_type,
             rc.comment_content,
             rc.like_count,
             rc.reply_count,
@@ -63,6 +67,8 @@
             lu.user_name AS user_name,
             lu.user_image AS user_avatar,
             lu2.user_name AS receive_user_name,
+            rc.send_user_type,
+            rc.receive_user_type,
             rc.comment_content,
             rc.like_count,
             rc.reply_count,

+ 3 - 2
alien-entity/src/main/resources/mapper/second/LawyerReconcMapper.xml

@@ -31,7 +31,7 @@
         <result column="lawyer_phone" property="lawyerPhone" />
         <result column="lawyer_email" property="lawyerEmail" />
         <result column="lawyer_certificate_no" property="lawyerCertificateNo" />
-        <result column="law_firm" property="lawFirm" />
+        <result column="firm_name" property="lawFirm" />
         <result column="practice_years" property="practiceYears" />
         <result column="specialty_fields" property="specialtyFields" />
         <result column="certification_status" property="certificationStatus" />
@@ -149,7 +149,7 @@
             lu.phone AS lawyer_phone,
             lu.email AS lawyer_email,
             lu.lawyer_certificate_no,
-            lu.law_firm,
+            lf.firm_name AS law_firm,
             lu.practice_years,
             lu.specialty_fields,
             lu.certification_status,
@@ -165,6 +165,7 @@
             lu.personal_introduction
         FROM lawyer_consultation_order lco
         LEFT JOIN lawyer_user lu ON lco.lawyer_user_id = lu.id AND lu.delete_flag = 0
+        LEFT JOIN law_firm lf ON lf.id = lu.firm_id AND lf.delete_flag = 0
         WHERE lco.delete_flag = 0
         <if test="orderNumber != null and orderNumber != ''">
             AND lco.order_number LIKE CONCAT('%', #{orderNumber}, '%')

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

@@ -183,7 +183,7 @@ public class OrderReviewController {
     }
 
 
-    @ApiOperation("分页查询我的评价列表")
+    @ApiOperation("分页查询待评价的订单列表(返回未评论的订单信息以及律师信息)")
     @ApiOperationSupport(order = 7)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "page", value = "页数(默认1)", dataType = "int", paramType = "query"),

+ 59 - 4
alien-lawyer/src/main/java/shop/alien/lawyer/controller/ReviewCommentController.java

@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.ReviewComment;
+import shop.alien.entity.store.dto.LawyerReplyDto;
 import shop.alien.entity.store.dto.ReviewCommentRequestDto;
 import shop.alien.entity.store.dto.ReviewReplyDto;
 import shop.alien.entity.store.vo.ReviewCommentVo;
@@ -30,14 +31,38 @@ public class ReviewCommentController {
 
     private final ReviewCommentService reviewCommentService;
 
-    @ApiOperation("创建评论(其他用户对评价的评论)")
+    @ApiOperation("创建评论(用户对评价的评论,支持普通用户和律师)")
     @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reviewId", value = "评价ID", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "sendUserId", value = "发送用户ID(评论用户ID,如果传入userId则自动映射到sendUserId)", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID(登录用户ID,会自动映射到sendUserId,如果sendUserId已存在则优先使用sendUserId)", dataType = "int", paramType = "body", required = false),
+            @ApiImplicitParam(name = "receiveUserId", value = "接收用户ID(可选,不填时默认为评价的创建者)", dataType = "int", paramType = "body", required = false),
+            @ApiImplicitParam(name = "sendUserType", value = "发送用户类型:1-普通用户,2-律师(必填)", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "receiveUserType", value = "接收用户类型:1-普通用户,2-律师(必填)", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "commentContent", value = "评论内容", dataType = "String", paramType = "body", required = true)
+    })
     @PostMapping("/create")
     public R<ReviewComment> createComment(@RequestBody ReviewComment comment) {
         log.info("ReviewCommentController.createComment?comment={}", comment);
-        if (comment.getUserId() == null) {
-            return R.fail("用户未登录");
+        
+        // 参数校验:优先使用sendUserId,如果不存在则使用userId
+        if (comment.getSendUserId() == null) {
+            if (comment.getUserId() == null) {
+                return R.fail("用户ID不能为空");
+            }
+            // 将userId映射到sendUserId
+            comment.setSendUserId(comment.getUserId());
         }
+        
+        // 校验用户类型字段:必须传入
+        if (comment.getSendUserType() == null) {
+            return R.fail("发送用户类型不能为空");
+        }
+        if (comment.getReceiveUserType() == null) {
+            return R.fail("接收用户类型不能为空");
+        }
+        
         return reviewCommentService.createComment(comment);
     }
 
@@ -103,12 +128,30 @@ public class ReviewCommentController {
 
     @ApiOperation("创建回复(用户对评论的回复)")
     @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "commentId", value = "首评ID", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID(发送用户ID)", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "replyToUserId", value = "被回复用户ID(可选,不填时默认为首评的发送用户)", dataType = "int", paramType = "body", required = false),
+            @ApiImplicitParam(name = "sendUserType", value = "发送用户类型:1-普通用户,2-律师(必填)", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "receiveUserType", value = "接收用户类型:1-普通用户,2-律师(必填)", dataType = "int", paramType = "body", required = true),
+            @ApiImplicitParam(name = "replyContent", value = "回复内容", dataType = "String", paramType = "body", required = true)
+    })
     @PostMapping("/reply/create")
     public R<ReviewComment> createReply(@RequestBody ReviewReplyDto replyDto) {
         log.info("ReviewCommentController.createReply?replyDto={}", replyDto);
+        
         if (replyDto.getUserId() == null) {
-            return R.fail("用户未登录");
+            return R.fail("用户ID不能为空");
+        }
+        
+        // 校验用户类型字段:必须传入
+        if (replyDto.getSendUserType() == null) {
+            return R.fail("发送用户类型不能为空");
         }
+        if (replyDto.getReceiveUserType() == null) {
+            return R.fail("接收用户类型不能为空");
+        }
+        
         return reviewCommentService.createReply(replyDto);
     }
 
@@ -155,6 +198,18 @@ public class ReviewCommentController {
         return reviewCommentService.deleteReviewComment(reviewComment);
     }
 
+    @Deprecated
+    @ApiOperation(value = "律师回复(律师对用户的评价或评论的回复)", notes = "【已废弃】请使用 createComment(回复评价)或 createReply(回复评论)接口,通过 sendUserType=2 标识律师身份,系统会自动进行权限校验")
+    @ApiOperationSupport(order = 12)
+    @PostMapping("/lawyer/reply")
+    public R<ReviewComment> lawyerReply(@RequestBody LawyerReplyDto replyDto) {
+        log.warn("【废弃接口】ReviewCommentController.lawyerReply 已废弃,请使用 createComment 或 createReply 接口");
+        log.info("ReviewCommentController.lawyerReply?replyDto={}", replyDto);
+        if (replyDto.getLawyerUserId() == null) {
+            return R.fail("律师用户ID不能为空");
+        }
+        return reviewCommentService.lawyerReply(replyDto);
+    }
 
 }
 

+ 12 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/ReviewCommentService.java

@@ -3,6 +3,7 @@ package shop.alien.lawyer.service;
 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.LawyerReplyDto;
 import shop.alien.entity.store.dto.ReviewCommentRequestDto;
 import shop.alien.entity.store.dto.ReviewReplyDto;
 import shop.alien.entity.store.vo.ReviewCommentVo;
@@ -84,5 +85,16 @@ public interface ReviewCommentService extends IService<ReviewComment> {
      * @return R<Boolean>
      */
     R<Boolean> deleteReviewComment(ReviewComment reviewComment);
+
+    /**
+     * 律师回复(律师对用户的评价或评论的回复)
+     * 
+     * @deprecated 已废弃,请使用 createComment(回复评价)或 createReply(回复评论)接口
+     *             通过 sendUserType=2 标识律师身份,系统会自动进行权限校验
+     * @param replyDto 律师回复DTO
+     * @return R<ReviewComment>
+     */
+    @Deprecated
+    R<ReviewComment> lawyerReply(LawyerReplyDto replyDto);
 }
 

+ 9 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerClientConsultationOrderServiceImpl.java

@@ -57,6 +57,7 @@ public class LawyerClientConsultationOrderServiceImpl extends ServiceImpl<Lawyer
     private final LifeUserMapper lifeUserMapper;
     private final WebSocketProcess webSocketProcess;
     private final LifeMessageMapper lifeMessageMapper;
+    private final LawFirmMapper lawFirmMapper;
 
     /**
      * 系统发送者ID常量
@@ -680,7 +681,14 @@ public class LawyerClientConsultationOrderServiceImpl extends ServiceImpl<Lawyer
         orderVO.setLawyerPhone(lawyerUser.getPhone());
         orderVO.setLawyerEmail(lawyerUser.getEmail());
         orderVO.setLawyerCertificateNo(lawyerUser.getLawyerCertificateNo());
-        orderVO.setLawFirm(lawyerUser.getLawFirm());
+        // 通过firm_id查询律所名称
+        if (lawyerUser.getFirmId() != null) {
+            LawFirm lawFirm = lawFirmMapper.selectById(lawyerUser.getFirmId());
+            orderVO.setLawFirm(lawFirm != null && (lawFirm.getDeleteFlag() == null || lawFirm.getDeleteFlag() == 0) 
+                    ? lawFirm.getFirmName() : null);
+        } else {
+            orderVO.setLawFirm(null);
+        }
         orderVO.setPracticeYears(lawyerUser.getPracticeYears());
         orderVO.setSpecialtyFields(lawyerUser.getSpecialtyFields());
         orderVO.setCertificationStatus(lawyerUser.getCertificationStatus());

+ 33 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -206,8 +206,26 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
             }
         }
 
+        // 批量查询律所信息
+        Map<Integer, LawFirm> lawFirmMap = new HashMap<>();
+        if (lawyerMap != null && !lawyerMap.isEmpty()) {
+            Set<Integer> firmIds = lawyerMap.values().stream()
+                    .map(LawyerUser::getFirmId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            if (!firmIds.isEmpty()) {
+                List<LawFirm> lawFirms = lawFirmMapper.selectBatchIds(firmIds);
+                if (lawFirms != null) {
+                    lawFirmMap = lawFirms.stream()
+                            .filter(firm -> firm.getDeleteFlag() == null || firm.getDeleteFlag() == 0)
+                            .collect(Collectors.toMap(LawFirm::getId, firm -> firm, (k1, k2) -> k1));
+                }
+            }
+        }
+
         // 轉換為VO並填充律師信息
         final Map<Integer, LawyerUser> finalLawyerMap = lawyerMap;
+        final Map<Integer, LawFirm> finalLawFirmMap = lawFirmMap;
         List<LawyerConsultationOrderVO> voList = records.stream()
                 .map(order -> {
                     LawyerConsultationOrderVO vo = new LawyerConsultationOrderVO();
@@ -221,7 +239,13 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
                         vo.setLawyerPhone(lawyer.getPhone());
                         vo.setLawyerEmail(lawyer.getEmail());
                         vo.setLawyerCertificateNo(lawyer.getLawyerCertificateNo());
-                        vo.setLawFirm(lawyer.getLawFirm());
+                        // 通过firm_id查询律所名称
+                        if (lawyer.getFirmId() != null) {
+                            LawFirm lawFirm = finalLawFirmMap.get(lawyer.getFirmId());
+                            vo.setLawFirm(lawFirm != null ? lawFirm.getFirmName() : null);
+                        } else {
+                            vo.setLawFirm(null);
+                        }
                         vo.setPracticeYears(lawyer.getPracticeYears());
                         vo.setSpecialtyFields(lawyer.getSpecialtyFields());
                         vo.setCertificationStatus(lawyer.getCertificationStatus());
@@ -1388,7 +1412,14 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         orderVO.setLawyerPhone(lawyerUser.getPhone());
         orderVO.setLawyerEmail(lawyerUser.getEmail());
         orderVO.setLawyerCertificateNo(lawyerUser.getLawyerCertificateNo());
-        orderVO.setLawFirm(lawyerUser.getLawFirm());
+        // 通过firm_id查询律所名称
+        if (lawyerUser.getFirmId() != null) {
+            LawFirm lawFirm = lawFirmMapper.selectById(lawyerUser.getFirmId());
+            orderVO.setLawFirm(lawFirm != null && (lawFirm.getDeleteFlag() == null || lawFirm.getDeleteFlag() == 0) 
+                    ? lawFirm.getFirmName() : null);
+        } else {
+            orderVO.setLawFirm(null);
+        }
         orderVO.setPracticeYears(lawyerUser.getPracticeYears());
         orderVO.setSpecialtyFields(lawyerUser.getSpecialtyFields());
         orderVO.setCertificationStatus(lawyerUser.getCertificationStatus());

+ 9 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerUserServiceImpl.java

@@ -121,7 +121,15 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
                 (lawyer.getAccountBlurb() != null ? lawyer.getAccountBlurb() : "Ta还没有个人业务介绍"));
         result.put("field", lawyer.getSpecialtyFields() != null ? lawyer.getSpecialtyFields() : "");
         result.put("experience", lawyer.getPracticeYears() != null ? lawyer.getPracticeYears() : 0);
-        result.put("lawFirm", lawyer.getLawFirm() != null ? lawyer.getLawFirm() : "");
+        // 通过firm_id查询律所名称
+        String lawFirmName = "";
+        if (lawyer.getFirmId() != null) {
+            LawFirm lawFirm = lawFirmMapper.selectById(lawyer.getFirmId());
+            if (lawFirm != null && (lawFirm.getDeleteFlag() == null || lawFirm.getDeleteFlag() == 0)) {
+                lawFirmName = lawFirm.getFirmName() != null ? lawFirm.getFirmName() : "";
+            }
+        }
+        result.put("lawFirm", lawFirmName);
         result.put("online", lawyer.getIsOnline() != null && lawyer.getIsOnline() == 1);
         result.put("price", lawyer.getConsultationFee() != null ? lawyer.getConsultationFee() / 100 : 0);
 

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

@@ -206,7 +206,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
                 pageNum, pageSize, orderId, lawyerUserId, userId, currentUserId);
 
         Page<OrderReviewVo> page = new Page<>(pageNum, pageSize);
-        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, orderId, lawyerUserId, userId, currentUserId);
+        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, orderId, lawyerUserId, userId, currentUserId, null);
         
         // 处理评价图片JSON字符串转换为列表
         if (result.getRecords() != null) {
@@ -461,7 +461,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         Page<OrderReviewVo> page = new Page<>(pageNum, pageSize);
-        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, null, null, userId, currentUserId);
+        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, null, null, userId, currentUserId, true);
 
         // 处理评价图片:将JSON字符串转换为List<String>
         if (result.getRecords() != null) {

+ 200 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/ReviewCommentServiceImpl.java

@@ -12,13 +12,16 @@ 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.LawyerReplyDto;
 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.LawyerUserMapper;
 import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.ReviewCommentMapper;
+import shop.alien.entity.store.LawyerUser;
 
 import java.util.Date;
 import java.util.List;
@@ -38,13 +41,34 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     private final ReviewCommentMapper reviewCommentMapper;
     private final OrderReviewService orderReviewService;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
+    private final LawyerUserMapper lawyerUserMapper;
 
     public ReviewCommentServiceImpl(ReviewCommentMapper reviewCommentMapper,
                                     @Lazy OrderReviewService orderReviewService,
-                                    LifeLikeRecordMapper lifeLikeRecordMapper) {
+                                    LifeLikeRecordMapper lifeLikeRecordMapper,
+                                    LawyerUserMapper lawyerUserMapper) {
         this.reviewCommentMapper = reviewCommentMapper;
         this.orderReviewService = orderReviewService;
         this.lifeLikeRecordMapper = lifeLikeRecordMapper;
+        this.lawyerUserMapper = lawyerUserMapper;
+    }
+
+    /**
+     * 判断用户类型:1-普通用户,2-律师
+     *
+     * @param userId 用户ID
+     * @return 用户类型:1-普通用户,2-律师
+     */
+    private Integer getUserType(Integer userId) {
+        if (userId == null) {
+            return 1; // 默认为普通用户
+        }
+        // 查询律师表,如果存在且未删除,则为律师
+        LawyerUser lawyerUser = lawyerUserMapper.selectById(userId);
+        if (lawyerUser != null && (lawyerUser.getDeleteFlag() == null || lawyerUser.getDeleteFlag() == 0)) {
+            return 2; // 律师
+        }
+        return 1; // 普通用户
     }
 
     @Override
@@ -71,6 +95,21 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.fail("评价不存在或已删除");
         }
 
+        // 验证用户类型参数:必须传入
+        if (comment.getSendUserType() == null) {
+            return R.fail("发送用户类型不能为空");
+        }
+        if (comment.getReceiveUserType() == null) {
+            return R.fail("接收用户类型不能为空");
+        }
+
+        // 权限校验:如果是律师(sendUserType=2),只能回复自己订单的评价
+        if (comment.getSendUserType() == 2) {
+            if (!review.getLawyerUserId().equals(comment.getSendUserId())) {
+                return R.fail("只能回复自己的订单评价");
+            }
+        }
+
         // 设置评论属性
         // 接收用户ID为评价的创建者(如果未设置)
         if (comment.getReceiveUserId() == null) {
@@ -252,11 +291,34 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.fail("只能回复首评");
         }
 
+        // 校验用户类型参数:必须传入
+        if (replyDto.getSendUserType() == null) {
+            return R.fail("发送用户类型不能为空");
+        }
+        if (replyDto.getReceiveUserType() == null) {
+            return R.fail("接收用户类型不能为空");
+        }
+
+        // 权限校验:如果是律师(sendUserType=2),只能回复自己订单评价下的评论
+        if (replyDto.getSendUserType() == 2) {
+            OrderReview review = orderReviewService.getById(headComment.getReviewId());
+            if (review == null || review.getDeleteFlag() == 1) {
+                return R.fail("评价不存在或已删除");
+            }
+            if (!review.getLawyerUserId().equals(userId)) {
+                return R.fail("只能回复自己订单评价下的评论");
+            }
+        }
+
         // 创建回复
         ReviewComment reply = new ReviewComment();
         reply.setReviewId(headComment.getReviewId());
         reply.setSendUserId(userId);
-        reply.setReceiveUserId(replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId());
+        Integer receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId();
+        reply.setReceiveUserId(receiveUserId);
+        // 设置用户类型:Controller层已经校验过,直接使用
+        reply.setSendUserType(replyDto.getSendUserType());
+        reply.setReceiveUserType(replyDto.getReceiveUserType());
         reply.setCommentContent(replyDto.getReplyContent());
         reply.setLikeCount(0);
         reply.setReplyCount(0);
@@ -430,5 +492,141 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
         log.warn("删除评论失败,评论ID={}, userId={}", id, userId);
         return R.fail("删除失败");
     }
+
+    /**
+     * @deprecated 已废弃,请使用 createComment 或 createReply 接口
+     */
+    @Deprecated
+    @Override
+    public R<ReviewComment> lawyerReply(LawyerReplyDto replyDto) {
+        log.warn("【废弃方法】ReviewCommentServiceImpl.lawyerReply 已废弃,请使用 createComment 或 createReply 方法");
+        log.info("ReviewCommentServiceImpl.lawyerReply?replyDto={}", replyDto);
+
+        // 参数校验
+        if (replyDto == null) {
+            return R.fail("回复信息不能为空");
+        }
+        if (replyDto.getReplyType() == null) {
+            return R.fail("回复类型不能为空");
+        }
+        if (replyDto.getLawyerUserId() == null) {
+            return R.fail("律师用户ID不能为空");
+        }
+        if (replyDto.getReplyContent() == null || replyDto.getReplyContent().trim().isEmpty()) {
+            return R.fail("回复内容不能为空");
+        }
+
+        ReviewComment reply = new ReviewComment();
+        Integer receiveUserId = null;
+        Integer reviewId = null;
+
+        // 根据回复类型处理
+        if (replyDto.getReplyType() == 1) {
+            // 回复评价
+            if (replyDto.getReviewId() == null) {
+                return R.fail("评价ID不能为空");
+            }
+
+            // 验证评价是否存在
+            OrderReview review = orderReviewService.getById(replyDto.getReviewId());
+            if (review == null || review.getDeleteFlag() == 1) {
+                return R.fail("评价不存在或已删除");
+            }
+
+            // 验证律师权限:必须是该评价对应的律师
+            if (!review.getLawyerUserId().equals(replyDto.getLawyerUserId())) {
+                return R.fail("只能回复自己的订单评价");
+            }
+
+            reviewId = review.getId();
+            receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : review.getUserId();
+            reply.setReviewId(reviewId);
+            reply.setHeadType(0); // 0:是首评(对评价的直接回复)
+            reply.setHeadId(null);
+
+        } else if (replyDto.getReplyType() == 2) {
+            // 回复评论
+            if (replyDto.getCommentId() == null) {
+                return R.fail("评论ID不能为空");
+            }
+
+            // 验证评论是否存在
+            ReviewComment comment = this.getById(replyDto.getCommentId());
+            if (comment == null || comment.getDeleteFlag() == 1) {
+                return R.fail("评论不存在或已删除");
+            }
+
+            // 获取评价信息,验证律师权限
+            OrderReview review = orderReviewService.getById(comment.getReviewId());
+            if (review == null || review.getDeleteFlag() == 1) {
+                return R.fail("评价不存在或已删除");
+            }
+
+            // 验证律师权限:必须是该评价对应的律师
+            if (!review.getLawyerUserId().equals(replyDto.getLawyerUserId())) {
+                return R.fail("只能回复自己订单评价下的评论");
+            }
+
+            // 如果评论是首评,则回复首评;如果评论是回复,则需要回复首评
+            Integer headCommentId = comment.getHeadType() == 0 ? comment.getId() : comment.getHeadId();
+            ReviewComment headComment = this.getById(headCommentId);
+            if (headComment == null || headComment.getDeleteFlag() == 1) {
+                return R.fail("首评不存在或已删除");
+            }
+
+            reviewId = comment.getReviewId();
+            receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : comment.getSendUserId();
+            reply.setReviewId(reviewId);
+            reply.setHeadType(1); // 1:是回复
+            reply.setHeadId(headCommentId); // 指向首评ID
+
+        } else {
+            return R.fail("回复类型错误,只能是1(回复评价)或2(回复评论)");
+        }
+
+        // 创建回复
+        reply.setSendUserId(replyDto.getLawyerUserId());
+        reply.setReceiveUserId(receiveUserId);
+        // 验证用户类型参数:必须传入
+        if (replyDto.getSendUserType() == null) {
+            return R.fail("发送用户类型不能为空");
+        }
+        if (replyDto.getReceiveUserType() == null) {
+            return R.fail("接收用户类型不能为空");
+        }
+        reply.setSendUserType(replyDto.getSendUserType());
+        reply.setReceiveUserType(replyDto.getReceiveUserType());
+        reply.setCommentContent(replyDto.getReplyContent());
+        reply.setLikeCount(0);
+        reply.setReplyCount(0);
+        reply.setCreatedUserId(replyDto.getLawyerUserId());
+        reply.setCreatedTime(new Date());
+
+        boolean success = this.save(reply);
+        if (success) {
+            // 如果是回复评论,更新首评的回复数
+            if (replyDto.getReplyType() == 2 && reply.getHeadId() != null) {
+                ReviewComment headComment = this.getById(reply.getHeadId());
+                if (headComment != null) {
+                    headComment.setReplyCount((headComment.getReplyCount() == null ? 0 : headComment.getReplyCount()) + 1);
+                    this.updateById(headComment);
+                }
+            }
+
+            // 更新评价的评论数
+            OrderReview review = orderReviewService.getById(reviewId);
+            if (review != null) {
+                review.setCommentCount((review.getCommentCount() == null ? 0 : review.getCommentCount()) + 1);
+                orderReviewService.updateById(review);
+                log.info("更新评价评论数成功,评价ID={}, 评论数={}", reviewId, review.getCommentCount());
+            }
+
+            log.info("律师回复成功,回复ID={}, 律师ID={}", reply.getId(), replyDto.getLawyerUserId());
+            return R.data(reply, "回复成功");
+        } else {
+            log.error("律师回复失败");
+            return R.fail("回复失败");
+        }
+    }
 }
 

+ 3 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreCommentController.java

@@ -209,4 +209,7 @@ public class StoreCommentController {
         log.info("StoreCommentController.getUserAllOrders?pageNum={}&pageSize={}&userId={}&type={}", pageNum, pageSize, userId, type);
         return R.data(storeCommentService.getUserAllOrders(pageNum, pageSize, userId, type));
     }
+
+
+
 }

+ 33 - 2
alien-store/src/main/java/shop/alien/store/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -147,8 +147,26 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
             }
         }
 
+        // 批量查询律所信息
+        Map<Integer, LawFirm> lawFirmMap = new HashMap<>();
+        if (lawyerMap != null && !lawyerMap.isEmpty()) {
+            Set<Integer> firmIds = lawyerMap.values().stream()
+                    .map(LawyerUser::getFirmId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            if (!firmIds.isEmpty()) {
+                List<LawFirm> lawFirms = lawFirmMapper.selectBatchIds(firmIds);
+                if (lawFirms != null) {
+                    lawFirmMap = lawFirms.stream()
+                            .filter(firm -> firm.getDeleteFlag() == null || firm.getDeleteFlag() == 0)
+                            .collect(Collectors.toMap(LawFirm::getId, firm -> firm, (k1, k2) -> k1));
+                }
+            }
+        }
+
         // 轉換為VO並填充律師信息
         final Map<Integer, LawyerUser> finalLawyerMap = lawyerMap;
+        final Map<Integer, LawFirm> finalLawFirmMap = lawFirmMap;
         List<LawyerConsultationOrderVO> voList = records.stream()
                 .map(order -> {
                     LawyerConsultationOrderVO vo = new LawyerConsultationOrderVO();
@@ -162,7 +180,13 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
                         vo.setLawyerPhone(lawyer.getPhone());
                         vo.setLawyerEmail(lawyer.getEmail());
                         vo.setLawyerCertificateNo(lawyer.getLawyerCertificateNo());
-                        vo.setLawFirm(lawyer.getLawFirm());
+                        // 通过firm_id查询律所名称
+                        if (lawyer.getFirmId() != null) {
+                            LawFirm lawFirm = finalLawFirmMap.get(lawyer.getFirmId());
+                            vo.setLawFirm(lawFirm != null ? lawFirm.getFirmName() : null);
+                        } else {
+                            vo.setLawFirm(null);
+                        }
                         vo.setPracticeYears(lawyer.getPracticeYears());
                         vo.setSpecialtyFields(lawyer.getSpecialtyFields());
                         vo.setCertificationStatus(lawyer.getCertificationStatus());
@@ -903,7 +927,14 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         orderVO.setLawyerPhone(lawyerUser.getPhone());
         orderVO.setLawyerEmail(lawyerUser.getEmail());
         orderVO.setLawyerCertificateNo(lawyerUser.getLawyerCertificateNo());
-        orderVO.setLawFirm(lawyerUser.getLawFirm());
+        // 通过firm_id查询律所名称
+        if (lawyerUser.getFirmId() != null) {
+            LawFirm lawFirm = lawFirmMapper.selectById(lawyerUser.getFirmId());
+            orderVO.setLawFirm(lawFirm != null && (lawFirm.getDeleteFlag() == null || lawFirm.getDeleteFlag() == 0) 
+                    ? lawFirm.getFirmName() : null);
+        } else {
+            orderVO.setLawFirm(null);
+        }
         orderVO.setPracticeYears(lawyerUser.getPracticeYears());
         orderVO.setSpecialtyFields(lawyerUser.getSpecialtyFields());
         orderVO.setCertificationStatus(lawyerUser.getCertificationStatus());

+ 13 - 6
alien-store/src/main/java/shop/alien/store/service/impl/LawyerUserServiceImpl.java

@@ -1,7 +1,7 @@
 package shop.alien.store.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -12,12 +12,10 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.LawyerLegalProblemScenario;
-import shop.alien.entity.store.LawyerServiceArea;
-import shop.alien.entity.store.LawyerUser;
-import shop.alien.entity.store.LawyerUserSearchHistory;
+import shop.alien.entity.store.*;
 import shop.alien.entity.store.excelVo.LawyerUserExcelVo;
 import shop.alien.entity.store.vo.LawyerUserVo;
+import shop.alien.mapper.LawFirmMapper;
 import shop.alien.mapper.LawyerUserMapper;
 import shop.alien.store.service.LawyerLegalProblemScenarioService;
 import shop.alien.store.service.LawyerServiceAreaService;
@@ -47,6 +45,7 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
     private final LawyerServiceAreaService lawyerServiceAreaService;
     private final LawyerUserSearchHistoryService userSearchHistoryService;
     private final LawyerLegalProblemScenarioService lawyerLegalProblemScenarioService;
+    private final LawFirmMapper lawFirmMapper;
 
     @Override
     public R<IPage<LawyerUser>> getLawyerUserList(int pageNum, int pageSize, String name, String phone, Integer status) {
@@ -115,7 +114,15 @@ public class LawyerUserServiceImpl extends ServiceImpl<LawyerUserMapper, LawyerU
                 (lawyer.getAccountBlurb() != null ? lawyer.getAccountBlurb() : "Ta还没有个人业务介绍"));
         result.put("field", lawyer.getSpecialtyFields() != null ? lawyer.getSpecialtyFields() : "");
         result.put("experience", lawyer.getPracticeYears() != null ? lawyer.getPracticeYears() : 0);
-        result.put("lawFirm", lawyer.getLawFirm() != null ? lawyer.getLawFirm() : "");
+        // 通过firm_id查询律所名称
+        String lawFirmName = "";
+        if (lawyer.getFirmId() != null) {
+            LawFirm lawFirm = lawFirmMapper.selectById(lawyer.getFirmId());
+            if (lawFirm != null && (lawFirm.getDeleteFlag() == null || lawFirm.getDeleteFlag() == 0)) {
+                lawFirmName = lawFirm.getFirmName() != null ? lawFirm.getFirmName() : "";
+            }
+        }
+        result.put("lawFirm", lawFirmName);
         result.put("online", lawyer.getIsOnline() != null && lawyer.getIsOnline() == 1);
         result.put("price", lawyer.getConsultationFee() != null ? lawyer.getConsultationFee() / 100 : 0);
 

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/OrderReviewServiceImpl.java

@@ -198,7 +198,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
                 pageNum, pageSize, orderId, lawyerUserId, userId, currentUserId);
 
         Page<OrderReviewVo> page = new Page<>(pageNum, pageSize);
-        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, orderId, lawyerUserId, userId, currentUserId);
+        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, orderId, lawyerUserId, userId, currentUserId, null);
 
         // 处理评价图片JSON字符串转换为列表
         if (result.getRecords() != null) {
@@ -453,7 +453,7 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         }
 
         Page<OrderReviewVo> page = new Page<>(pageNum, pageSize);
-        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, null, null, userId, currentUserId);
+        IPage<OrderReviewVo> result = orderReviewMapper.getReviewListWithUser(page, null, null, userId, currentUserId, true);
 
         // 处理评价图片:将JSON字符串转换为List<String>
         if (result.getRecords() != null) {

+ 75 - 2
alien-store/src/main/java/shop/alien/store/service/impl/ReviewCommentServiceImpl.java

@@ -16,8 +16,10 @@ import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.ReviewCommentRequestDto;
 import shop.alien.entity.store.dto.ReviewReplyDto;
 import shop.alien.entity.store.vo.ReviewCommentVo;
+import shop.alien.mapper.LawyerUserMapper;
 import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.ReviewCommentMapper;
+import shop.alien.entity.store.LawyerUser;
 import shop.alien.store.service.OrderReviewService;
 import shop.alien.store.service.ReviewCommentService;
 
@@ -39,13 +41,34 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
     private final ReviewCommentMapper reviewCommentMapper;
     private final OrderReviewService orderReviewService;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
+    private final LawyerUserMapper lawyerUserMapper;
 
     public ReviewCommentServiceImpl(ReviewCommentMapper reviewCommentMapper,
                                     @Lazy OrderReviewService orderReviewService,
-                                    LifeLikeRecordMapper lifeLikeRecordMapper) {
+                                    LifeLikeRecordMapper lifeLikeRecordMapper,
+                                    LawyerUserMapper lawyerUserMapper) {
         this.reviewCommentMapper = reviewCommentMapper;
         this.orderReviewService = orderReviewService;
         this.lifeLikeRecordMapper = lifeLikeRecordMapper;
+        this.lawyerUserMapper = lawyerUserMapper;
+    }
+
+    /**
+     * 判断用户类型:1-普通用户,2-律师
+     * 
+     * @param userId 用户ID
+     * @return 用户类型:1-普通用户,2-律师
+     */
+    private Integer getUserType(Integer userId) {
+        if (userId == null) {
+            return 1; // 默认为普通用户
+        }
+        // 查询律师表,如果存在且未删除,则为律师
+        LawyerUser lawyerUser = lawyerUserMapper.selectById(userId);
+        if (lawyerUser != null && (lawyerUser.getDeleteFlag() == null || lawyerUser.getDeleteFlag() == 0)) {
+            return 2; // 律师
+        }
+        return 1; // 普通用户
     }
 
     @Override
@@ -72,6 +95,21 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.fail("评价不存在或已删除");
         }
 
+        // 验证用户类型参数:必须传入
+        if (comment.getSendUserType() == null) {
+            return R.fail("发送用户类型不能为空");
+        }
+        if (comment.getReceiveUserType() == null) {
+            return R.fail("接收用户类型不能为空");
+        }
+
+        // 权限校验:如果是律师(sendUserType=2),只能回复自己订单的评价
+        if (comment.getSendUserType() == 2) {
+            if (!review.getLawyerUserId().equals(comment.getSendUserId())) {
+                return R.fail("只能回复自己的订单评价");
+            }
+        }
+
         // 设置评论属性
         // 接收用户ID为评价的创建者(如果未设置)
         if (comment.getReceiveUserId() == null) {
@@ -253,11 +291,46 @@ public class ReviewCommentServiceImpl extends ServiceImpl<ReviewCommentMapper, R
             return R.fail("只能回复首评");
         }
 
+        // 校验用户类型参数:优先使用DTO传入的值,如果没有则使用首评中的信息
+        Integer sendUserType = replyDto.getSendUserType();
+        Integer receiveUserType = replyDto.getReceiveUserType();
+        
+        if (sendUserType == null) {
+            if (headComment.getReceiveUserType() != null) {
+                // 使用首评的接收用户类型作为回复的发送用户类型
+                sendUserType = headComment.getReceiveUserType();
+            } else {
+                return R.fail("发送用户类型不能为空");
+            }
+        }
+        if (receiveUserType == null) {
+            if (headComment.getSendUserType() != null) {
+                // 使用首评的发送用户类型作为回复的接收用户类型
+                receiveUserType = headComment.getSendUserType();
+            } else {
+                return R.fail("接收用户类型不能为空");
+            }
+        }
+
+        // 权限校验:如果是律师(sendUserType=2),只能回复自己订单评价下的评论
+        if (sendUserType == 2) {
+            OrderReview review = orderReviewService.getById(headComment.getReviewId());
+            if (review == null || review.getDeleteFlag() == 1) {
+                return R.fail("评价不存在或已删除");
+            }
+            if (!review.getLawyerUserId().equals(userId)) {
+                return R.fail("只能回复自己订单评价下的评论");
+            }
+        }
+
         // 创建回复
         ReviewComment reply = new ReviewComment();
         reply.setReviewId(headComment.getReviewId());
         reply.setSendUserId(userId);
-        reply.setReceiveUserId(replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId());
+        Integer receiveUserId = replyDto.getReplyToUserId() != null ? replyDto.getReplyToUserId() : headComment.getSendUserId();
+        reply.setReceiveUserId(receiveUserId);
+        reply.setSendUserType(sendUserType);
+        reply.setReceiveUserType(receiveUserType);
         reply.setCommentContent(replyDto.getReplyContent());
         reply.setLikeCount(0);
         reply.setReplyCount(0);