2 Commits 91b9d667e9 ... e73cd02f40

Author SHA1 Message Date
  Valley e73cd02f40 Merge remote-tracking branch 'origin/master' 1 year ago
  Valley 49bd0bc19f 评价管理update 1 year ago

+ 39 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/AssessRecoverDto.java

@@ -0,0 +1,39 @@
+package com.chelvc.cloud.vehicle.api.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author valley
+ * @date 2024/02/03 15:45
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+public class AssessRecoverDto implements Serializable {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 回复内容
+     */
+    private String recoverMsg;
+    /**
+     * 回复时间
+     */
+    private Date recoverTime;
+
+    /**
+     * 回复时间格式化
+     */
+    private String recoverTimeFormat;
+}

+ 78 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsAssessDto.java

@@ -0,0 +1,78 @@
+package com.chelvc.cloud.vehicle.api.dto;
+
+import com.chelvc.framework.common.model.File;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author valley
+ * @date 2024/02/03 15:46
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+public class GoodsAssessDto implements Serializable {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 评价内容
+     */
+    private String remark;
+
+    /**
+     * 评价分数
+     */
+    private BigDecimal score;
+
+    /**
+     * 评价图片
+     */
+    private List<File> images;
+
+    /**
+     * 点击数
+     */
+    private Long hits;
+    /**
+     * 评价人id
+     */
+    private Long creator;
+
+    /**
+     * 评价人昵称
+     */
+    private String creatorNickName;
+
+    /**
+     * 评价人头像
+     */
+    private String creatorAvatar;
+
+    /**
+     * 评价时间
+     */
+    private Date createTime;
+
+    /**
+     * 是否回复 0 否 1 是
+     */
+    private Integer isRecover;
+
+    /**
+     * 评价时间格式化
+     */
+    private String creatorTimeFormat;
+
+    private AssessRecoverDto assessRecoverDto;
+}

+ 64 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/AssessModifyParam.java

@@ -0,0 +1,64 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.framework.common.model.File;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author valley
+ * @date 2024/02/03 16:40
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssessModifyParam  implements Serializable {
+
+    /**
+     * 店铺id
+     */
+    @NotEmpty
+    @Min(value = 0, message = "店铺id必须大于0")
+    private Long merchantId;
+
+    /**
+     * 商品id
+     */
+    @NotEmpty
+    @Min(value = 0, message = "商品id必须大于0")
+    private Long goodsId;
+    /**
+     * 订单id
+     */
+    @NotEmpty
+    @Min(value = 0, message = "订单id必须大于0")
+    private Long orderId;
+
+    /**
+     * 评价内容
+     */
+    @Max(value = 200, message = "评价内容不能超过200字")
+    private String remark;
+
+    /**
+     * 评价分数
+     */
+    @NotEmpty
+    private BigDecimal score;
+
+    /**
+     * 评价图片
+     */
+    private List<File> images;
+
+
+}

+ 56 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/AssessQueryParam.java

@@ -0,0 +1,56 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.Min;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author valley
+ * @date 2024/02/03 16:02
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssessQueryParam  implements Serializable {
+    /**
+     * 主键
+     */
+    @Min(value = 0, message = "评论id必须大于0")
+    private Long id;
+
+    /**
+     * 商品id
+     */
+    @Min(value = 0, message = "商品id必须大于0")
+    private Long goodsId;
+
+    /**
+     * 订单id
+     */
+    @Min(value = 0, message = "订单id必须大于0")
+    private Long orderId;
+
+    /**
+     * 分数
+     */
+    private String score;
+
+    /**
+     * 是否回复 0 否 1 是
+     */
+    private Integer isRecover;
+
+    /**
+     * 评价人
+     */
+    private Long creator;
+
+}

+ 29 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/AssessRecoverModifyParam.java

@@ -0,0 +1,29 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.io.Serializable;
+
+/**
+ * @author valley
+ * @date 2024/02/03 17:09
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssessRecoverModifyParam implements Serializable {
+
+    @Min(value = 0, message = "评论id必须大于0")
+    private String assessId;
+    /**
+     * 回复内容
+     */
+    @Max(value = 200, message = "评价内容不能超过200字")
+    private String recoverMsg;
+}

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

@@ -0,0 +1,23 @@
+package com.chelvc.cloud.vehicle.api.service;
+
+import com.chelvc.cloud.vehicle.api.dto.AssessRecoverDto;
+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 java.util.List;
+
+/**
+ * @author valley
+ * @date 2024/01/30 00:03
+ **/
+public interface AssessService {
+    Long add(AssessModifyParam param);
+
+    List<GoodsAssessDto> query(AssessQueryParam param);
+
+    Long addAssessRecover(AssessRecoverModifyParam param);
+
+    void computeAvgScore();
+}

+ 31 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/AssessRecoverCopier.java

@@ -0,0 +1,31 @@
+package com.chelvc.cloud.vehicle.server.copier;
+
+import com.chelvc.cloud.vehicle.api.dto.AssessRecoverDto;
+import com.chelvc.cloud.vehicle.api.param.AssessRecoverModifyParam;
+import com.chelvc.cloud.vehicle.server.entity.AssessRecover;
+import org.mapstruct.*;
+import org.mapstruct.factory.Mappers;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author valley
+ * @date 2024/02/03 19:08
+ **/
+@Mapper(builder = @Builder(disableBuilder = true))
+public interface AssessRecoverCopier {
+    AssessRecoverCopier INSTANCE = Mappers.getMapper(AssessRecoverCopier.class);
+
+
+    AssessRecover copying(AssessRecoverModifyParam param);
+
+    @Named("entity2dto")
+    AssessRecoverDto copying(AssessRecover goodsAssess);
+
+
+    @IterableMapping(qualifiedByName = "entity2dto")
+    List<AssessRecoverDto> copying(Collection<AssessRecover> assessRecovers);
+
+    void copying(AssessRecoverModifyParam param, @MappingTarget AssessRecover assessRecover);
+}

+ 32 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/GoodsAssessCopier.java

@@ -0,0 +1,32 @@
+package com.chelvc.cloud.vehicle.server.copier;
+
+import com.chelvc.cloud.vehicle.api.dto.GoodsAssessDto;
+import com.chelvc.cloud.vehicle.api.param.AssessModifyParam;
+import com.chelvc.cloud.vehicle.server.entity.GoodsAssess;
+import org.mapstruct.*;
+import org.mapstruct.factory.Mappers;
+
+import java.util.Collection;
+import java.util.List;
+
+
+/**
+ * @author valley
+ * @date 2024/02/03 19:08
+ **/
+@Mapper(builder = @Builder(disableBuilder = true))
+public interface GoodsAssessCopier {
+
+    GoodsAssessCopier INSTANCE = Mappers.getMapper(GoodsAssessCopier.class);
+
+    GoodsAssess copying(AssessModifyParam param);
+
+    @Named("entity2dto")
+    GoodsAssessDto copying(GoodsAssess goodsAssess);
+
+
+    @IterableMapping(qualifiedByName = "entity2dto")
+    List<GoodsAssessDto> copying(Collection<GoodsAssess> goodsAssesses);
+
+    void copying(AssessModifyParam param, @MappingTarget GoodsAssess goodsAssess);
+}

+ 13 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/AssessRecoverMapper.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.AssessRecover;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author valley
+ * @date 2024/02/03 15:26
+ **/
+@Mapper
+public interface AssessRecoverMapper extends BaseMapper<AssessRecover> {
+}

+ 13 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/GoodsAssessMapper.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.GoodsAssess;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author valley
+ * @date 2024/02/03 15:27
+ **/
+@Mapper
+public interface GoodsAssessMapper extends BaseMapper<GoodsAssess> {
+}

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

@@ -0,0 +1,45 @@
+package com.chelvc.cloud.vehicle.server.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.chelvc.framework.database.entity.ModifyEntity;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author valley
+ * @date 2024/02/02 00:29
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@TableName(autoResultMap = true)
+public class AssessRecover extends ModifyEntity<Long> {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 评价id
+     */
+    private Long assessId;
+
+    /**
+     * 回复内容
+     */
+    private String recoverMsg;
+    /**
+     * 回复时间
+     */
+    private Date recoverTime;
+
+}

+ 74 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/GoodsAssess.java

@@ -0,0 +1,74 @@
+package com.chelvc.cloud.vehicle.server.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.chelvc.framework.common.model.File;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.chelvc.framework.database.entity.ModifyEntity;
+import com.chelvc.framework.database.interceptor.FilesTypeHandler;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author valley
+ * @date 2024/02/02 00:29
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@TableName(autoResultMap = true)
+public class GoodsAssess extends ModifyEntity<Long> {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 店铺id
+     */
+    private Long merchantId;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * 评价内容
+     */
+    private String remark;
+
+    /**
+     * 评价分数
+     */
+    private BigDecimal score;
+
+    /**
+     * 评价图片
+     */
+    @TableField(typeHandler = FilesTypeHandler.class)
+    private List<File> images;
+
+    /**
+     * 点击数
+     */
+    private Long hits;
+
+    /**
+     * 是否回复 0 否 1 是
+     */
+    private Integer isRecover;
+
+}

+ 11 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/AssessService.java

@@ -0,0 +1,11 @@
+package com.chelvc.cloud.vehicle.server.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.chelvc.cloud.vehicle.server.entity.GoodsAssess;
+
+/**
+ * @author valley
+ * @date 2024/02/03 19:17
+ **/
+public interface AssessService extends IService<GoodsAssess> {
+}

+ 166 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/AssessServiceImpl.java

@@ -0,0 +1,166 @@
+package com.chelvc.cloud.vehicle.server.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.dto.AssessRecoverDto;
+import com.chelvc.cloud.vehicle.api.dto.GoodsAssessDto;
+import com.chelvc.cloud.uc.api.dto.UserDTO;
+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.chelvc.cloud.vehicle.api.service.AssessService;
+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.GoodsAssessMapper;
+import com.chelvc.cloud.vehicle.server.entity.AssessRecover;
+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 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.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author valley
+ * @date 2024/01/30 00:03
+ **/
+@Slf4j
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@DubboService(interfaceClass = AssessService.class)
+public class AssessServiceImpl extends ServiceImpl<GoodsAssessMapper, GoodsAssess> implements com.chelvc.cloud.vehicle.server.service.AssessService, AssessService {
+
+    private final UserService userService;
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
+
+    private final AssessRecoverMapper assessRecoverMapper;
+
+    @Override
+    public Long add(AssessModifyParam param) {
+        Session user = SessionContextHolder.getSession();
+        ResourceUtils.required(this.getOne(new QueryWrapper<GoodsAssess>().eq("order_id", param.getOrderId()).eq("creator", user.getId())) == null, "该订单已评价");
+
+        GoodsAssess goodsAssess = GoodsAssessCopier.INSTANCE.copying(param);
+        goodsAssess.setHits(0L);
+        goodsAssess.setIsRecover(0);
+        this.save(goodsAssess);
+        return goodsAssess.getId();
+    }
+
+    @Override
+    public List<GoodsAssessDto> query(AssessQueryParam param) {
+        QueryWrapper<GoodsAssess> wrapper = new QueryWrapper<>();
+        //查询评价内容详情  单条查询时 增加点击数
+        if (param.getId() != null) {
+            wrapper.eq("id", param.getId());
+        }
+        //查询商品所有评价内容
+        if (param.getGoodsId() != null) {
+            wrapper.eq("goods_id", param.getGoodsId());
+        }
+        //查询个人订单评价内容
+        if (param.getOrderId() != null) {
+            wrapper.eq("order_id", param.getOrderId());
+        }
+        //按评价级别查询
+        if (param.getScore() != null) {
+            switch (param.getScore()) {
+                case "1":
+                    wrapper.ge("score", 0);
+                    wrapper.lt("score", 2);
+                    break;
+                case "2":
+                    wrapper.ge("score", 2);
+                    wrapper.lt("score", 3);
+                    break;
+                case "3":
+                    wrapper.ge("score", 3);
+                    wrapper.lt("score", 4);
+                    break;
+                case "4":
+                    wrapper.ge("score", 4);
+                    wrapper.lt("score", 5);
+                    break;
+                case "5":
+                    wrapper.eq("score", 5);
+                    break;
+                default:
+                    break;
+            }
+
+        }
+        //过滤是否回复
+        if (param.getIsRecover() != null) {
+            wrapper.eq("is_recover", param.getIsRecover());
+        }
+
+        if (param.getCreator() != null) {
+            wrapper.eq("creator", param.getCreator());
+        }
+
+        //排序规则
+        if (param.getCreator() == null){
+            wrapper.orderByDesc("hits", "score");
+        }else{
+            //查询个人时按照评论时间排序
+            wrapper.orderByDesc("create_time");
+        }
+        List<GoodsAssess> goodsAssesses = this.list(wrapper);
+        List<GoodsAssessDto> goodsAssesseDtos = GoodsAssessCopier.INSTANCE.copying(goodsAssesses);
+        return goodsAssesseDtos.stream().peek(item -> {
+            //个人信息获取
+            UserDTO user = userService.getUser(item.getCreator());
+            item.setCreatorAvatar(user.getAvatar());
+            item.setCreatorNickName(user.getNickname());
+            item.setCreatorTimeFormat(SDF.format(item.getCreateTime()));
+            AssessRecover assessRecover = assessRecoverMapper.selectOne(new QueryWrapper<AssessRecover>().eq("assess_id", item.getId()));
+            if (assessRecover != null) {
+                AssessRecoverDto assessRecoverDto = AssessRecoverCopier.INSTANCE.copying(assessRecover);
+                assessRecoverDto.setRecoverTimeFormat(SDF.format(assessRecoverDto.getRecoverTime()));
+                item.setAssessRecoverDto(assessRecoverDto);
+            }
+            if (param.getId() != null) {
+                GoodsAssess updateAssess = this.getById(item.getId());
+                updateAssess.setHits(item.getHits() + 1);
+                this.updateById(updateAssess);
+            }
+
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public Long addAssessRecover(AssessRecoverModifyParam param) {
+
+        ResourceUtils.required(assessRecoverMapper.selectOne(new QueryWrapper<AssessRecover>().eq("assess_id", param.getAssessId())) == null, "该订单已回复");
+        AssessRecover assessRecover = AssessRecoverCopier.INSTANCE.copying(param);
+        assessRecover.setRecoverTime(new Date());
+        assessRecoverMapper.insert(assessRecover);
+        GoodsAssess goodsAssess = this.getById(param.getAssessId());
+        goodsAssess.setIsRecover(1);
+        this.updateById(goodsAssess);
+        return assessRecover.getId();
+
+    }
+
+    /**
+     * 每天计算年、半年、季度、月、周商品平均分
+     */
+
+//    @Scheduled(cron = "0 0 1 * * ? *")
+    @Override
+    public void computeAvgScore() {
+        //获取所有评论, 按商品分类 分别计算 一年 半年 一个季度 一个月 一周 的评价分数
+        //TODO
+    }
+}