Просмотр исходного кода

开发评价类型 查询列表
开发评价类型统计接口

lutong 3 месяцев назад
Родитель
Сommit
eed4c02d01

+ 32 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreStaffReviewStatisticsVo.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 = "StoreStaffReviewStatisticsVo对象", description = "员工评价统计数据VO")
+public class StoreStaffReviewStatisticsVo {
+
+    @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;
+}
+

+ 56 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreStaffReviewMapper.java

@@ -48,5 +48,61 @@ public interface StoreStaffReviewMapper extends BaseMapper<StoreStaffReview> {
      * @return 平均评分(1-5星)
      */
     java.math.BigDecimal getAverageRatingByStaffUserId(@Param("staffUserId") Integer staffUserId);
+
+    /**
+     * 统计员工的全部评价数量
+     *
+     * @param staffUserId 员工用户ID
+     * @return 全部评价数量
+     */
+    Integer getTotalReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);
+
+    /**
+     * 统计员工的好评数(4.5-5分)
+     *
+     * @param staffUserId 员工用户ID
+     * @return 好评数
+     */
+    Integer getGoodReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);
+
+    /**
+     * 统计员工的中评数(3-4分)
+     *
+     * @param staffUserId 员工用户ID
+     * @return 中评数
+     */
+    Integer getMediumReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);
+
+    /**
+     * 统计员工的差评数(0-2.5分)
+     *
+     * @param staffUserId 员工用户ID
+     * @return 差评数
+     */
+    Integer getBadReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);
+
+    /**
+     * 统计员工的有图评价数量
+     *
+     * @param staffUserId 员工用户ID
+     * @return 有图评价数量
+     */
+    Integer getImageReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);
+
+    /**
+     * 根据员工ID和类型分页查询评价列表(包含用户和员工信息)
+     *
+     * @param page 分页对象
+     * @param staffUserId 员工用户ID
+     * @param type 查询分类(1:好评,2:中评,3:差评,4:有图,为空时返回全部)
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
+     * @return 分页结果
+     */
+    IPage<StoreStaffReviewVo> getReviewListByStaffAndType(
+            IPage<StoreStaffReviewVo> page,
+            @Param("staffUserId") Integer staffUserId,
+            @Param("type") Integer type,
+            @Param("currentUserId") Integer currentUserId
+    );
 }
 

+ 135 - 0
alien-entity/src/main/resources/mapper/StoreStaffReviewMapper.xml

@@ -128,5 +128,140 @@
           AND overall_rating IS NOT NULL
     </select>
 
+    <!-- 统计员工的全部评价数量 -->
+    <select id="getTotalReviewCountByStaffUserId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM store_staff_review
+        WHERE staff_user_id = #{staffUserId}
+        AND delete_flag = 0
+    </select>
+
+    <!-- 统计员工的好评数(4.5-5分) -->
+    <select id="getGoodReviewCountByStaffUserId" resultType="java.lang.Integer">
+        <![CDATA[
+        SELECT COUNT(*)
+        FROM store_staff_review
+        WHERE staff_user_id = #{staffUserId}
+        AND delete_flag = 0
+        AND overall_rating IS NOT NULL
+        AND overall_rating >= 4.5
+        AND overall_rating <= 5
+        ]]>
+    </select>
+
+    <!-- 统计员工的中评数(3-4分) -->
+    <select id="getMediumReviewCountByStaffUserId" resultType="java.lang.Integer">
+        <![CDATA[
+        SELECT COUNT(*)
+        FROM store_staff_review
+        WHERE staff_user_id = #{staffUserId}
+        AND delete_flag = 0
+        AND overall_rating IS NOT NULL
+        AND overall_rating >= 3
+        AND overall_rating < 4.5
+        ]]>
+    </select>
+
+    <!-- 统计员工的差评数(0-2.5分,包含2.5) -->
+    <select id="getBadReviewCountByStaffUserId" resultType="java.lang.Integer">
+        <![CDATA[
+        SELECT COUNT(*)
+        FROM store_staff_review
+        WHERE staff_user_id = #{staffUserId}
+        AND delete_flag = 0
+        AND overall_rating IS NOT NULL
+        AND overall_rating >= 0
+        AND overall_rating < 3
+        ]]>
+    </select>
+
+    <!-- 统计员工的有图评价数量 -->
+    <select id="getImageReviewCountByStaffUserId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM store_staff_review
+        WHERE staff_user_id = #{staffUserId}
+        AND delete_flag = 0
+        AND review_images IS NOT NULL
+        AND review_images != ''
+        AND TRIM(review_images) != ''
+    </select>
+
+    <!-- 根据员工ID和类型分页查询评价列表(包含用户和员工信息) -->
+    <select id="getReviewListByStaffAndType" resultMap="StoreStaffReviewVoResultMap">
+        SELECT
+            ssr.id,
+            ssr.user_id,
+            CASE 
+                WHEN ssr.is_anonymous = 1 THEN '匿名用户'
+                ELSE lu.user_name
+            END AS user_name,
+            CASE 
+                WHEN ssr.is_anonymous = 1 THEN NULL
+                ELSE lu.user_image
+            END AS user_avatar,
+            ssr.staff_user_id,
+            sp.personnel_name AS staff_name,
+            si.img_url AS staff_avatar,
+            ssr.overall_rating,
+            ssr.service_attitude_rating,
+            ssr.response_time_rating,
+            ssr.professional_ability_rating,
+            ssr.review_content,
+            ssr.is_anonymous,
+            COALESCE((
+                SELECT COUNT(1)
+                FROM life_like_record llr_count
+                WHERE CONVERT(llr_count.huifu_id, CHAR) = CONVERT(ssr.id, CHAR)
+                    AND llr_count.type = '9'
+                    AND llr_count.delete_flag = 0
+            ), 0) AS like_count,
+            ssr.comment_count,
+            ssr.review_images,
+            CASE 
+                WHEN #{currentUserId} IS NOT NULL AND llr.id IS NOT NULL THEN 1
+                ELSE 0
+            END AS is_liked,
+            ssr.created_time,
+            ssr.appeal_id
+        FROM store_staff_review ssr
+        LEFT JOIN life_user lu ON lu.id = ssr.user_id AND lu.delete_flag = 0
+        LEFT JOIN store_personnel sp ON sp.id = ssr.staff_user_id AND sp.delete_flag = 0
+        LEFT JOIN store_img si ON si.id = sp.img_id AND si.delete_flag = 0
+        LEFT JOIN life_like_record llr ON CONVERT(llr.huifu_id, CHAR) = CONVERT(ssr.id, CHAR)
+            AND llr.type = '9' 
+            AND CONVERT(llr.dianzan_id, CHAR) = CONVERT(#{currentUserId}, CHAR)
+            AND llr.delete_flag = 0
+        WHERE ssr.delete_flag = 0
+        AND ssr.staff_user_id = #{staffUserId}
+        <if test="type != null">
+            <choose>
+                <when test="type == 1">
+                    <![CDATA[
+                    AND ssr.overall_rating >= 4.5
+                    AND ssr.overall_rating <= 5
+                    ]]>
+                </when>
+                <when test="type == 2">
+                    <![CDATA[
+                    AND ssr.overall_rating >= 3
+                    AND ssr.overall_rating < 4.5
+                    ]]>
+                </when>
+                <when test="type == 3">
+                    <![CDATA[
+                    AND ssr.overall_rating >= 0
+                    AND ssr.overall_rating < 3
+                    ]]>
+                </when>
+                <when test="type == 4">
+                    AND ssr.review_images IS NOT NULL
+                    AND ssr.review_images != ''
+                    AND TRIM(ssr.review_images) != ''
+                </when>
+            </choose>
+        </if>
+        ORDER BY ssr.created_time DESC
+    </select>
+
 </mapper>
 

+ 39 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreStaffReviewController.java

@@ -10,6 +10,7 @@ import shop.alien.entity.store.StoreStaffReview;
 import shop.alien.entity.store.dto.StoreStaffReviewDto;
 import shop.alien.entity.store.vo.StoreStaffReviewDetailVo;
 import shop.alien.entity.store.vo.StoreStaffReviewListWithStaffVo;
+import shop.alien.entity.store.vo.StoreStaffReviewStatisticsVo;
 import shop.alien.entity.store.vo.StoreStaffReviewVo;
 import shop.alien.store.service.StoreStaffReviewService;
 
@@ -182,4 +183,42 @@ public class StoreStaffReviewController {
         }
         return storeStaffReviewService.getReviewListByStaffId(page, size, staffUserId, currentUserId);
     }
+
+    @ApiOperation("获取员工评价统计数据(全部数量、好评数量、中评数量、差评数量、有图数量)")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "staffUserId", value = "员工用户ID", dataTypeClass = Integer.class, paramType = "query", required = true)
+    })
+    @GetMapping("/statistics")
+    public R<StoreStaffReviewStatisticsVo> getStaffReviewStatistics(@RequestParam Integer staffUserId) {
+        log.info("获取员工评价统计数据, staffUserId={}", staffUserId);
+        if (staffUserId == null) {
+            return R.fail("员工ID不能为空");
+        }
+        return storeStaffReviewService.getStaffReviewStatistics(staffUserId);
+    }
+
+    @ApiOperation("根据员工ID和类型分页查询评价列表(不包含评论)")
+    @ApiOperationSupport(order = 10)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "页数(默认1)", dataTypeClass = Integer.class, paramType = "query", required = false),
+            @ApiImplicitParam(name = "size", value = "页容(默认10)", dataTypeClass = Integer.class, paramType = "query", required = false),
+            @ApiImplicitParam(name = "staffUserId", value = "员工用户ID", dataTypeClass = Integer.class, paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "查询分类(1:好评,2:中评,3:差评,4:有图,为空时返回全部)", dataTypeClass = Integer.class, paramType = "query", required = false),
+            @ApiImplicitParam(name = "currentUserId", value = "当前用户ID(用于判断是否已点赞)", dataTypeClass = Integer.class, paramType = "query", required = false)
+    })
+    @GetMapping("/list/byStaffAndType")
+    public R<IPage<StoreStaffReviewVo>> getReviewListByStaffAndType(
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "10") int size,
+            @RequestParam Integer staffUserId,
+            @RequestParam(required = false) Integer type,
+            @RequestParam(required = false) Integer currentUserId) {
+        log.info("根据员工ID和类型分页查询评价列表, page={}, size={}, staffUserId={}, type={}, currentUserId={}",
+                page, size, staffUserId, type, currentUserId);
+        if (staffUserId == null) {
+            return R.fail("员工ID不能为空");
+        }
+        return storeStaffReviewService.getReviewListByStaffAndType(page, size, staffUserId, type, currentUserId);
+    }
 }

+ 21 - 0
alien-store/src/main/java/shop/alien/store/service/StoreStaffReviewService.java

@@ -7,6 +7,7 @@ import shop.alien.entity.store.StoreStaffReview;
 import shop.alien.entity.store.dto.StoreStaffReviewDto;
 import shop.alien.entity.store.vo.StoreStaffReviewDetailVo;
 import shop.alien.entity.store.vo.StoreStaffReviewListWithStaffVo;
+import shop.alien.entity.store.vo.StoreStaffReviewStatisticsVo;
 import shop.alien.entity.store.vo.StoreStaffReviewVo;
 
 /**
@@ -91,5 +92,25 @@ public interface StoreStaffReviewService extends IService<StoreStaffReview> {
      * @return R<StoreStaffReviewListWithStaffVo>
      */
     R<StoreStaffReviewListWithStaffVo> getReviewListByStaffId(int pageNum, int pageSize, Integer staffUserId, Integer currentUserId);
+
+    /**
+     * 获取员工评价统计数据
+     *
+     * @param staffUserId 员工用户ID
+     * @return R<StoreStaffReviewStatisticsVo>
+     */
+    R<StoreStaffReviewStatisticsVo> getStaffReviewStatistics(Integer staffUserId);
+
+    /**
+     * 根据员工ID和类型分页查询评价列表(不包含评论)
+     *
+     * @param pageNum 页码
+     * @param pageSize 页大小
+     * @param staffUserId 员工用户ID
+     * @param type 查询分类(1:好评,2:中评,3:差评,4:有图,为空时返回全部)
+     * @param currentUserId 当前用户ID(用于判断是否已点赞,可为null)
+     * @return R<IPage<StoreStaffReviewVo>>
+     */
+    R<IPage<StoreStaffReviewVo>> getReviewListByStaffAndType(int pageNum, int pageSize, Integer staffUserId, Integer type, Integer currentUserId);
 }
 

+ 76 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffReviewServiceImpl.java

@@ -20,6 +20,7 @@ import shop.alien.entity.store.dto.StoreStaffReviewDto;
 import shop.alien.entity.store.vo.StoreStaffCommentVo;
 import shop.alien.entity.store.vo.StoreStaffReviewDetailVo;
 import shop.alien.entity.store.vo.StoreStaffReviewListWithStaffVo;
+import shop.alien.entity.store.vo.StoreStaffReviewStatisticsVo;
 import shop.alien.entity.store.vo.StoreStaffReviewVo;
 import shop.alien.entity.store.StoreStaffConfig;
 import shop.alien.mapper.LifeLikeRecordMapper;
@@ -520,4 +521,79 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
 
         return R.data(result);
     }
+
+    @Override
+    public R<StoreStaffReviewStatisticsVo> getStaffReviewStatistics(Integer staffUserId) {
+        log.info("获取员工评价统计数据, staffUserId={}", staffUserId);
+
+        if (staffUserId == null) {
+            return R.fail("员工ID不能为空");
+        }
+
+        try {
+            StoreStaffReviewStatisticsVo statistics = new StoreStaffReviewStatisticsVo();
+
+            // 统计全部评价数量
+            Integer totalCount = storeStaffReviewMapper.getTotalReviewCountByStaffUserId(staffUserId);
+            statistics.setTotalCount(totalCount != null ? totalCount : 0);
+
+            // 统计好评数量
+            Integer goodCount = storeStaffReviewMapper.getGoodReviewCountByStaffUserId(staffUserId);
+            statistics.setGoodCount(goodCount != null ? goodCount : 0);
+
+            // 统计中评数量
+            Integer mediumCount = storeStaffReviewMapper.getMediumReviewCountByStaffUserId(staffUserId);
+            statistics.setMediumCount(mediumCount != null ? mediumCount : 0);
+
+            // 统计差评数量
+            Integer badCount = storeStaffReviewMapper.getBadReviewCountByStaffUserId(staffUserId);
+            statistics.setBadCount(badCount != null ? badCount : 0);
+
+            // 统计有图评价数量
+            Integer imageCount = storeStaffReviewMapper.getImageReviewCountByStaffUserId(staffUserId);
+            statistics.setImageCount(imageCount != null ? imageCount : 0);
+
+            log.info("获取员工评价统计数据成功,员工ID={}, 全部={}, 好评={}, 中评={}, 差评={}, 有图={}",
+                    staffUserId, statistics.getTotalCount(), statistics.getGoodCount(),
+                    statistics.getMediumCount(), statistics.getBadCount(), statistics.getImageCount());
+
+            return R.data(statistics);
+        } catch (Exception e) {
+            log.error("获取员工评价统计数据异常,员工ID={}, 错误信息={}", staffUserId, e.getMessage(), e);
+            return R.fail("获取统计数据失败");
+        }
+    }
+
+    @Override
+    public R<IPage<StoreStaffReviewVo>> getReviewListByStaffAndType(int pageNum, int pageSize, Integer staffUserId, Integer type, Integer currentUserId) {
+        log.info("根据员工ID和类型分页查询评价列表, pageNum={}, pageSize={}, staffUserId={}, type={}, currentUserId={}",
+                pageNum, pageSize, staffUserId, type, currentUserId);
+
+        if (staffUserId == null) {
+            return R.fail("员工ID不能为空");
+        }
+
+        Page<StoreStaffReviewVo> page = new Page<>(pageNum, pageSize);
+        IPage<StoreStaffReviewVo> result = storeStaffReviewMapper.getReviewListByStaffAndType(page, staffUserId, type, currentUserId);
+
+        // 处理评价图片JSON字符串转换为列表
+        if (result.getRecords() != null) {
+            for (StoreStaffReviewVo vo : result.getRecords()) {
+                // 处理评价图片:从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<>());
+                }
+            }
+        }
+
+        return R.data(result);
+    }
 }