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

维护人员平均分数字段

lutong 3 hónapja
szülő
commit
462b963bb1

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreStaffConfig.java

@@ -136,4 +136,8 @@ public class StoreStaffConfig extends Model<StoreStaffConfig> {
     @ApiModelProperty(value = "好评数量")
     @TableField(exist = false)
     private Integer positiveCommentsCount;
+
+    @ApiModelProperty(value = "平均评分(1-5星,支持0.5星)")
+    @TableField("service_score")
+    private java.math.BigDecimal serviceScore;
 }

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

@@ -40,5 +40,13 @@ public interface StoreStaffReviewMapper extends BaseMapper<StoreStaffReview> {
      * @return 评价详情
      */
     StoreStaffReviewVo getReviewDetailById(@Param("reviewId") Integer reviewId, @Param("currentUserId") Integer currentUserId);
+
+    /**
+     * 计算员工的平均评分(overallRating的平均值)
+     *
+     * @param staffUserId 员工用户ID
+     * @return 平均评分(1-5星)
+     */
+    java.math.BigDecimal getAverageRatingByStaffUserId(@Param("staffUserId") Integer staffUserId);
 }
 

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

@@ -118,5 +118,15 @@
         LIMIT 1
     </select>
 
+    <!-- 计算员工的平均评分(overallRating的平均值) -->
+    <select id="getAverageRatingByStaffUserId" resultType="java.math.BigDecimal">
+        SELECT 
+            COALESCE(AVG(overall_rating), 0) AS average_rating
+        FROM store_staff_review
+        WHERE staff_user_id = #{staffUserId}
+          AND delete_flag = 0
+          AND overall_rating IS NOT NULL
+    </select>
+
 </mapper>
 

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

@@ -20,12 +20,17 @@ 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.StoreStaffReviewVo;
+import shop.alien.entity.store.StoreStaffConfig;
 import shop.alien.mapper.LifeLikeRecordMapper;
 import shop.alien.mapper.StoreStaffCommentMapper;
+import shop.alien.mapper.StoreStaffConfigMapper;
 import shop.alien.mapper.StoreStaffReviewMapper;
 import shop.alien.store.service.StoreStaffCommentService;
 import shop.alien.store.service.StoreStaffReviewService;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -48,6 +53,7 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
     private final StoreStaffCommentService storeStaffCommentService;
     private final StoreStaffCommentMapper storeStaffCommentMapper;
     private final LifeLikeRecordMapper lifeLikeRecordMapper;
+    private final StoreStaffConfigMapper storeStaffConfigMapper;
 
     @Override
     public R<StoreStaffReview> createReview(StoreStaffReviewDto reviewDto) {
@@ -65,6 +71,8 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
         
         if (success) {
             log.info("创建评价成功, 评价ID={}", review.getId());
+            // 更新员工评分
+            updateStaffServiceScore(review.getStaffUserId());
             return R.data(review, "提交成功");
         } else {
             log.error("创建评价失败");
@@ -368,6 +376,9 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
                 .eq(StoreStaffComment::getDeleteFlag, 0);
         List<StoreStaffComment> comments = storeStaffCommentService.list(commentWrapper);
 
+        // 保存员工ID,用于后续更新评分
+        Integer staffUserId = review.getStaffUserId();
+
         // 删除评价(逻辑删除)
         int num = storeStaffReviewMapper.deleteById(reviewId);
 
@@ -375,6 +386,9 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
             // 级联删除该评价下的所有评论和回复
             comments.forEach(comment -> deleteCommentAndReplies(comment, userId));
 
+            // 更新员工评分
+            updateStaffServiceScore(staffUserId);
+
             if (userId != null) {
                 log.info("用户删除评价成功, reviewId={}, userId={}", reviewId, userId);
             } else {
@@ -388,6 +402,54 @@ public class StoreStaffReviewServiceImpl extends ServiceImpl<StoreStaffReviewMap
     }
 
     /**
+     * 更新员工服务评分
+     * 计算公式:员工评分 = overallRating平均值 (保留1位小数)
+     *
+     * @param staffUserId 员工用户ID
+     */
+    private void updateStaffServiceScore(Integer staffUserId) {
+        if (staffUserId == null) {
+            log.warn("更新员工评分失败:员工ID为空");
+            return;
+        }
+
+        try {
+            // 计算平均评分(1-5星)
+            BigDecimal averageRating = storeStaffReviewMapper.getAverageRatingByStaffUserId(staffUserId);
+
+            BigDecimal serviceScore;
+            if (averageRating != null) {
+                // 保留1位小数,四舍五入
+                serviceScore = averageRating.setScale(1, RoundingMode.HALF_UP);
+                // 确保在0-5范围内
+                if (serviceScore.compareTo(BigDecimal.ZERO) < 0) {
+                    serviceScore = BigDecimal.ZERO;
+                } else if (serviceScore.compareTo(new BigDecimal("5.0")) > 0) {
+                    serviceScore = new BigDecimal("5.0");
+                }
+            } else {
+                // 如果没有评价,设置为0.0
+                serviceScore = BigDecimal.ZERO;
+                log.info("员工暂无评价,将评分设置为0.0, 员工ID={}", staffUserId);
+            }
+
+            // 更新员工评分
+            LambdaUpdateWrapper<StoreStaffConfig> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(StoreStaffConfig::getId, staffUserId);
+            updateWrapper.set(StoreStaffConfig::getServiceScore, serviceScore);
+            int result = storeStaffConfigMapper.update(null, updateWrapper);
+
+            if (result > 0) {
+                log.info("更新员工评分成功, 员工ID={}, 平均评分={}, 服务评分={}", staffUserId, averageRating, serviceScore);
+            } else {
+                log.warn("更新员工评分失败,员工ID={}", staffUserId);
+            }
+        } catch (Exception e) {
+            log.error("更新员工评分异常,员工ID={}, 错误信息={}", staffUserId, e.getMessage(), e);
+        }
+    }
+
+    /**
      * 删除评论及其回复
      */
     private void deleteCommentAndReplies(StoreStaffComment comment, Integer userId) {