Forráskód Böngészése

开发 评分统计

LuTong 2 hete
szülő
commit
a4ef94fc89

+ 32 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LawyerReviewStatisticsVo.java

@@ -0,0 +1,32 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 律师评价统计数据VO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "LawyerReviewStatisticsVo对象", description = "律师评价统计数据VO")
+public class LawyerReviewStatisticsVo {
+
+    @ApiModelProperty(value = "全部评价数量")
+    private Integer totalCount;
+
+    @ApiModelProperty(value = "好评数量(4.5-5分)")
+    private Integer goodCount;
+
+    @ApiModelProperty(value = "中评数量(3-4分)")
+    private Integer mediumCount;
+
+    @ApiModelProperty(value = "差评数量(0-2.5分)")
+    private Integer badCount;
+
+    @ApiModelProperty(value = "有图评价数量")
+    private Integer imageCount;
+}
+

+ 16 - 0
alien-entity/src/main/java/shop/alien/mapper/OrderReviewMapper.java

@@ -112,5 +112,21 @@ public interface OrderReviewMapper extends BaseMapper<OrderReview> {
             @Param("type") Integer type,
             @Param("currentUserId") Integer currentUserId
     );
+
+    /**
+     * 统计律师的全部评价数量
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 全部评价数量
+     */
+    Integer getTotalReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);
+
+    /**
+     * 统计律师的有图评价数量
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return 有图评价数量
+     */
+    Integer getImageReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);
 }
 

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

@@ -263,6 +263,25 @@
         ]]>
     </select>
 
+    <!-- 统计律师的全部评价数量 -->
+    <select id="getTotalReviewCountByLawyerUserId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM lawyer_order_review
+        WHERE lawyer_user_id = #{lawyerUserId}
+        AND delete_flag = 0
+    </select>
+
+    <!-- 统计律师的有图评价数量 -->
+    <select id="getImageReviewCountByLawyerUserId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM lawyer_order_review
+        WHERE lawyer_user_id = #{lawyerUserId}
+        AND delete_flag = 0
+        AND review_images IS NOT NULL
+        AND review_images != ''
+        AND TRIM(review_images) != ''
+    </select>
+
     <!-- 根据律师ID和类型分页查询评价列表(包含用户和律师信息) -->
     <select id="getReviewListByLawyerAndType" resultMap="OrderReviewVoResultMap">
         SELECT

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

@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.OrderReview;
 import shop.alien.entity.store.dto.OrderReviewDto;
+import shop.alien.entity.store.vo.LawyerReviewStatisticsVo;
 import shop.alien.entity.store.vo.OrderReviewDetailVo;
 import shop.alien.entity.store.vo.OrderReviewVo;
 import shop.alien.entity.store.vo.PendingReviewVo;
@@ -186,6 +187,42 @@ public class OrderReviewController {
         return orderReviewService.getMyReviewList(page, size, userId, currentUserId);
     }
 
+    @ApiOperation("获取律师评价统计数据(全部数量、好评数量、中评数量、差评数量、有图数量)")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @GetMapping("/statistics")
+    public R<LawyerReviewStatisticsVo> getLawyerReviewStatistics(@RequestParam Integer lawyerUserId) {
+        log.info("OrderReviewController.getLawyerReviewStatistics?lawyerUserId={}", lawyerUserId);
+        if (lawyerUserId == null) {
+            return R.fail("律师ID不能为空");
+        }
+        return orderReviewService.getLawyerReviewStatistics(lawyerUserId);
+    }
+
+    @ApiOperation("根据律师ID分页查询评价列表(查询指定律师的所有评价)")
+    @ApiOperationSupport(order = 10)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "页数(默认1)", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "size", value = "页容(默认10)", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "lawyerUserId", value = "律师用户ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataType = "int", paramType = "query")
+    })
+    @GetMapping("/list/byLawyer")
+    public R<IPage<OrderReviewVo>> getReviewListByLawyer(
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "10") int size,
+            @RequestParam Integer lawyerUserId,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("OrderReviewController.getReviewListByLawyer?page={}, size={}, lawyerUserId={}, currentUserId={}", 
+                page, size, lawyerUserId, currentUserId);
+        if (lawyerUserId == null) {
+            return R.fail("律师ID不能为空");
+        }
+        return orderReviewService.getReviewList(page, size, null, lawyerUserId, null, currentUserId);
+    }
+
     @ApiOperation("根据律师ID和类型分页查询评价列表(不包含评论)")
     @ApiOperationSupport(order = 11)
     @ApiImplicitParams({

+ 8 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/OrderReviewService.java

@@ -118,5 +118,13 @@ public interface OrderReviewService extends IService<OrderReview> {
      */
     R<IPage<OrderReviewVo>> getReviewListByLawyerAndType(int pageNum, int pageSize, Integer lawyerUserId, Integer type, Integer currentUserId);
 
+    /**
+     * 获取律师评价统计数据
+     *
+     * @param lawyerUserId 律师用户ID
+     * @return R<LawyerReviewStatisticsVo>
+     */
+    R<shop.alien.entity.store.vo.LawyerReviewStatisticsVo> getLawyerReviewStatistics(Integer lawyerUserId);
+
 }
 

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

@@ -18,6 +18,7 @@ import shop.alien.entity.store.LifeLikeRecord;
 import shop.alien.entity.store.OrderReview;
 import shop.alien.entity.store.ReviewComment;
 import shop.alien.entity.store.dto.OrderReviewDto;
+import shop.alien.entity.store.vo.LawyerReviewStatisticsVo;
 import shop.alien.entity.store.vo.OrderReviewDetailVo;
 import shop.alien.entity.store.vo.OrderReviewVo;
 import shop.alien.entity.store.vo.PendingReviewVo;
@@ -210,9 +211,17 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
         // 处理评价图片JSON字符串转换为列表
         if (result.getRecords() != null) {
             for (OrderReviewVo vo : result.getRecords()) {
-                if (vo.getReviewImages() != null && !vo.getReviewImages().isEmpty()) {
-                    // 如果已经是列表,则不需要转换
-                    // 这里假设VO中的reviewImages已经是List<String>类型
+                // 处理评价图片:从JSON字符串解析为List
+                if (vo.getReviewImagesJson() != null && !vo.getReviewImagesJson().trim().isEmpty()) {
+                    try {
+                        List<String> images = JSON.parseArray(vo.getReviewImagesJson(), String.class);
+                        vo.setReviewImages(images != null ? images : new ArrayList<>());
+                    } catch (Exception e) {
+                        log.warn("解析评价图片失败:{}", e.getMessage());
+                        vo.setReviewImages(new ArrayList<>());
+                    }
+                } else {
+                    vo.setReviewImages(new ArrayList<>());
                 }
             }
         }
@@ -567,5 +576,47 @@ public class OrderReviewServiceImpl extends ServiceImpl<OrderReviewMapper, Order
 
         return R.data(result);
     }
+
+    @Override
+    public R<LawyerReviewStatisticsVo> getLawyerReviewStatistics(Integer lawyerUserId) {
+        log.info("OrderReviewServiceImpl.getLawyerReviewStatistics?lawyerUserId={}", lawyerUserId);
+
+        if (lawyerUserId == null) {
+            return R.fail("律师ID不能为空");
+        }
+
+        try {
+            LawyerReviewStatisticsVo statistics = new LawyerReviewStatisticsVo();
+
+            // 统计全部评价数量
+            Integer totalCount = orderReviewMapper.getTotalReviewCountByLawyerUserId(lawyerUserId);
+            statistics.setTotalCount(totalCount != null ? totalCount : 0);
+
+            // 统计好评数量
+            Integer goodCount = orderReviewMapper.getGoodReviewCountByLawyerUserId(lawyerUserId);
+            statistics.setGoodCount(goodCount != null ? goodCount : 0);
+
+            // 统计中评数量
+            Integer mediumCount = orderReviewMapper.getMediumReviewCountByLawyerUserId(lawyerUserId);
+            statistics.setMediumCount(mediumCount != null ? mediumCount : 0);
+
+            // 统计差评数量
+            Integer badCount = orderReviewMapper.getBadReviewCountByLawyerUserId(lawyerUserId);
+            statistics.setBadCount(badCount != null ? badCount : 0);
+
+            // 统计有图评价数量
+            Integer imageCount = orderReviewMapper.getImageReviewCountByLawyerUserId(lawyerUserId);
+            statistics.setImageCount(imageCount != null ? imageCount : 0);
+
+            log.info("获取律师评价统计数据成功,律师ID={}, 全部={}, 好评={}, 中评={}, 差评={}, 有图={}",
+                    lawyerUserId, statistics.getTotalCount(), statistics.getGoodCount(),
+                    statistics.getMediumCount(), statistics.getBadCount(), statistics.getImageCount());
+
+            return R.data(statistics);
+        } catch (Exception e) {
+            log.error("获取律师评价统计数据异常,律师ID={}, 错误信息={}", lawyerUserId, e.getMessage(), e);
+            return R.fail("获取统计数据失败");
+        }
+    }
 }