Prechádzať zdrojové kódy

评分计算
获取商品评分

Valley 1 rok pred
rodič
commit
257678aa4c

+ 6 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/AssessService.java

@@ -5,8 +5,11 @@ import com.chelvc.cloud.vehicle.api.dto.GoodsAssessDto;
 import com.chelvc.cloud.vehicle.api.param.AssessModifyParam;
 import com.chelvc.cloud.vehicle.api.param.AssessQueryParam;
 import com.chelvc.cloud.vehicle.api.param.AssessRecoverModifyParam;
+import com.fasterxml.jackson.databind.util.JSONPObject;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author valley
@@ -20,4 +23,7 @@ public interface AssessService {
     Long addAssessRecover(AssessRecoverModifyParam param);
 
     void computeAvgScore();
+
+    Map<String, BigDecimal> getGoodsScore(Long goodsId);
+    
 }

+ 13 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/AssessScoreMapper.java

@@ -0,0 +1,13 @@
+package com.chelvc.cloud.vehicle.server.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.server.entity.AssessScore;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author valley
+ * @date 2024/02/03 15:27
+ **/
+@Mapper
+public interface AssessScoreMapper extends BaseMapper<AssessScore> {
+}

+ 21 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/GoodsAssessMapper.java

@@ -2,7 +2,10 @@ package com.chelvc.cloud.vehicle.server.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.chelvc.cloud.vehicle.server.entity.GoodsAssess;
-import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.*;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @author valley
@@ -10,4 +13,21 @@ import org.apache.ibatis.annotations.Mapper;
  **/
 @Mapper
 public interface GoodsAssessMapper extends BaseMapper<GoodsAssess> {
+    @Select("select id from goods")
+    List<Long> getAllGoodsIds();
+
+    @Select("select avg(score) from goods_assess where goods_id = #{goodsId}")
+    BigDecimal getAvgScore(Long goodsId);
+
+    @Select("select IFNULL(avg(score),0)  from goods_assess where goods_id =  #{goodsId} AND create_time between DATE_SUB(now(), INTERVAL ${day} DAY) AND now()")
+    BigDecimal getGoodsScore(@Param("day") Integer day, @Param("goodsId") Long goodsId);
+
+    @Update("update goods set score = #{score} where id = #{goodsId}")
+    void updateGoodsAvgScore(@Param("score") BigDecimal goodsAvgScore, @Param("goodsId") Long goodsId);
+
+    @Delete("delete from assess_score")
+    void clearScore();
+
+    @Select("select score from goods where id = #{goodsId}")
+    BigDecimal getGoodsAvgScore(Long goodsId);
 }

+ 45 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/AssessScore.java

@@ -0,0 +1,45 @@
+package com.chelvc.cloud.vehicle.server.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.chelvc.framework.common.model.File;
+import com.chelvc.framework.database.entity.Entity;
+import com.chelvc.framework.database.interceptor.FilesTypeHandler;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author valley
+ * @date 2024/02/22 21:35
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@TableName(autoResultMap = true)
+public class AssessScore  implements Entity<Long> {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    private BigDecimal yearScore;
+    private BigDecimal halfYearScore;
+    private BigDecimal quarterScore;
+    private BigDecimal monthScore;
+    private BigDecimal weekScore;
+    private Date modifyTime;
+}

+ 57 - 8
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssessServiceImpl.java

@@ -1,5 +1,6 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.dto.AssessRecoverDto;
@@ -13,22 +14,27 @@ import com.chelvc.cloud.uc.api.service.UserService;
 import com.chelvc.cloud.vehicle.server.copier.AssessRecoverCopier;
 import com.chelvc.cloud.vehicle.server.copier.GoodsAssessCopier;
 import com.chelvc.cloud.vehicle.server.dao.AssessRecoverMapper;
+import com.chelvc.cloud.vehicle.server.dao.AssessScoreMapper;
 import com.chelvc.cloud.vehicle.server.dao.GoodsAssessMapper;
 import com.chelvc.cloud.vehicle.server.entity.AssessRecover;
+import com.chelvc.cloud.vehicle.server.entity.AssessScore;
 import com.chelvc.cloud.vehicle.server.entity.GoodsAssess;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.base.model.Session;
 import com.chelvc.framework.base.util.ResourceUtils;
+import com.fasterxml.jackson.databind.util.JSONPObject;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +51,7 @@ public class AssessServiceImpl extends ServiceImpl<GoodsAssessMapper, GoodsAsses
     private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
 
     private final AssessRecoverMapper assessRecoverMapper;
+    private final AssessScoreMapper assessScoreMapper;
 
     @Override
     public Long add(AssessModifyParam param) {
@@ -110,9 +117,9 @@ public class AssessServiceImpl extends ServiceImpl<GoodsAssessMapper, GoodsAsses
         }
 
         //排序规则
-        if (param.getCreator() == null){
+        if (param.getCreator() == null) {
             wrapper.orderByDesc("hits", "score");
-        }else{
+        } else {
             //查询个人时按照评论时间排序
             wrapper.orderByDesc("create_time");
         }
@@ -153,14 +160,56 @@ public class AssessServiceImpl extends ServiceImpl<GoodsAssessMapper, GoodsAsses
 
     }
 
+
     /**
-     * 每天计算年、半年、季度、月、周商品平均分
+     * 每天凌晨1点计算年、半年、季度、月、周商品平均分
      */
-
-//    @Scheduled(cron = "0 0 1 * * ? *")
+    @Transactional(rollbackFor = RuntimeException.class)
+    @Scheduled(cron = "0 0 1 * * ?")
     @Override
     public void computeAvgScore() {
+        Date date = new Date();
+        this.baseMapper.clearScore();
         //获取所有评论, 按商品分类 分别计算 一年 半年 一个季度 一个月 一周 的评价分数
-        //TODO
+        List<Long> goodsIds = this.baseMapper.getAllGoodsIds();
+        if (goodsIds == null) return;
+        goodsIds.forEach(goodsId -> {
+            List<GoodsAssess> goodsAssessList = this.list(new QueryWrapper<GoodsAssess>().eq("goods_id", goodsId));
+            if (goodsAssessList.isEmpty()) return;
+            BigDecimal goodsAvgScore = this.baseMapper.getAvgScore(goodsId).setScale(2, RoundingMode.HALF_UP);
+            this.baseMapper.updateGoodsAvgScore(goodsAvgScore, goodsId);
+
+            BigDecimal goodsYearScore = this.baseMapper.getGoodsScore(365, goodsId).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal goodsHalfYearScore = this.baseMapper.getGoodsScore(180, goodsId).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal goodsQuarterScore = this.baseMapper.getGoodsScore(90, goodsId).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal goodsMonthScore = this.baseMapper.getGoodsScore(30, goodsId).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal goodsWeekScore = this.baseMapper.getGoodsScore(7, goodsId).setScale(2, RoundingMode.HALF_UP);
+            AssessScore assessScore = new AssessScore();
+            assessScore.setGoodsId(goodsId);
+            assessScore.setYearScore(goodsYearScore);
+            goodsHalfYearScore = goodsHalfYearScore.intValue() == 0 ? goodsYearScore : goodsHalfYearScore;
+            assessScore.setHalfYearScore(goodsHalfYearScore);
+            goodsQuarterScore = goodsQuarterScore.intValue() == 0 ? goodsHalfYearScore : goodsQuarterScore;
+            assessScore.setQuarterScore(goodsQuarterScore);
+            goodsMonthScore = goodsMonthScore.intValue() == 0 ? goodsQuarterScore : goodsMonthScore;
+            assessScore.setMonthScore(goodsMonthScore);
+            goodsWeekScore = goodsWeekScore.intValue() == 0 ? goodsMonthScore : goodsWeekScore;
+            assessScore.setWeekScore(goodsWeekScore);
+            assessScore.setModifyTime(date);
+            this.assessScoreMapper.insert(assessScore);
+        });
+    }
+
+    @Override
+    public Map<String, BigDecimal> getGoodsScore(Long goodsId) {
+        Map<String, BigDecimal> data = new HashMap<>();
+        data.put("score", this.baseMapper.getGoodsAvgScore(goodsId).setScale(2, RoundingMode.HALF_UP));
+        AssessScore assessScore = this.assessScoreMapper.selectOne(new QueryWrapper<AssessScore>().eq("goods_id", goodsId));
+        data.put("yearScore", assessScore.getYearScore());
+        data.put("halfYearScore", assessScore.getHalfYearScore());
+        data.put("quarterScore", assessScore.getQuarterScore());
+        data.put("monthScore", assessScore.getMonthScore());
+        data.put("weekScore", assessScore.getWeekScore());
+        return data;
     }
 }