Bläddra i källkod

/storeComment/getUserAllCommentsPage 重新开发获取当前用户全部评价接口

lutong 5 dagar sedan
förälder
incheckning
943c76f7cd

+ 50 - 1
alien-entity/src/main/java/shop/alien/entity/store/LifeUserOrder.java

@@ -4,53 +4,102 @@ import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModel;
 import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
 
 /**
- * 用户订单
+ * 用户订单基础实体,对应表:life_user_order。
+ * 仅承载订单字段(不含评论信息),在评论视图中会被扩展为 VO。
+ *
+ * 字段对应:
+ * id                  - 主键
+ * userId              - 用户id
+ * storeId             - 商铺id
+ * quanId              - 优惠券券id(life_discount_coupon_user)
+ * quanCode            - 券编号
+ * orderNo             - 订单编号
+ * status              - 订单状态(0待支付;1已支付/待使用;2已核销;3已过期;4已取消;5已退款;6退款失败;7已完成)
+ * price               - 原价
+ * finalPrice          - 实付价
+ * buyTime             - 购买时间
+ * payTime             - 支付时间
+ * payMethod           - 支付方式
+ * usedTime            - 使用时间
+ * refundTime          - 退款时间
+ * deleteFlag          - 删除标记(0未删,1已删)
+ * createdTime         - 创建时间
+ * createdUserId       - 创建人ID
+ * updatedTime         - 更新时间
+ * updatedUserId       - 修改人ID
+ * sendDiscountCouponFlag - 核销发送优惠券标记(0未发,1已发)
+ * isSync              - 是否同步
+ * couponType          - 订单类型(1代金券;2团购订单)
+ * cancelTime          - 取消时间
+ * cancelReason        - 取消原因
+ * finishTime          - 完成时间
+ * orderStr            - 订单字符串
+ * expertOrderId       - 达人订单id
+ * orderAppraise       - 订单评价标记(0未评价;1已评价)
  */
 @Data
 @JsonInclude
 @TableName("life_user_order")
+@ApiModel(value = "LifeUserOrder对象", description = "用户订单表")
 public class LifeUserOrder {
 
+    @ApiModelProperty(value = "主键")
     @TableId(value = "id", type = IdType.AUTO)
     private String id;
 
+    @ApiModelProperty(value = "用户id")
     private String userId;
 
+    @ApiModelProperty(value = "商铺id")
     private String storeId;
 
+    @ApiModelProperty(value = "优惠券券id(life_discount_coupon_user)")
     private String quanId;
 
+    @ApiModelProperty(value = "券编号")
     private String quanCode;
 
+    @ApiModelProperty(value = "订单编号")
     private String orderNo;
 
+    @ApiModelProperty(value = "订单字符串")
     private String orderStr;
 
+    @ApiModelProperty(value = "订单状态,0待支付;1已支付/待使用;2已核销;3已过期;4已取消;5已退款;6退款失败;7已完成")
     private Integer status;
 
+    @ApiModelProperty(value = "订单价格(原价)")
     private String price;
 
+    @ApiModelProperty(value = "最终价格(付款)")
     private String finalPrice;
 
+    @ApiModelProperty(value = "购买时间")
     private Date buyTime;
 
+    @ApiModelProperty(value = "支付时间")
     private Date payTime;
 
+    @ApiModelProperty(value = "支付方法")
     private String payMethod;
 
+    @ApiModelProperty(value = "使用时间")
     private Date usedTime;
 
+    @ApiModelProperty(value = "退款时间")
     private Date refundTime;
 
     /**
      * 购买类型(订单类型,1,代金券;2,团购订单)
      */
+    @ApiModelProperty(value = "订单类型,1代金券;2团购订单")
     private Integer couponType;
 
 

+ 16 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LifeUserOrderCommentVo.java

@@ -7,6 +7,10 @@ import shop.alien.entity.store.LifeUserOrder;
 import java.util.Date;
 import java.util.List;
 
+/**
+ * 订单 + 评价视图 VO,承载用户的订单信息以及店铺/律师的评价数据。
+ * 在店铺评价场景中追加评分、图片等字段(src=1),在律师评价场景中同样复用(src=2)。
+ */
 @Data
 @JsonInclude
 public class LifeUserOrderCommentVo extends LifeUserOrder {
@@ -25,9 +29,21 @@ public class LifeUserOrderCommentVo extends LifeUserOrder {
 
     private String storeName;
 
+    /** 评价内容(店铺评论 comment_content / 律师评价 review_content) */
+    private String commentContent;
+
     private String score;
 
     private Date commentDate;
 
     private List<String> imgUrls;
+
+    /**
+     * 评论/评价图片或图片ID集合(兼容店铺评价 img_id、律师评价 review_images)
+     */
+    /** 原始图片ID或URL集合(店铺评价为 img_id,律师评价为 review_images JSON) */
+    private String imgId;
+
+    /** 数据来源:1-店铺评价(store_comment),2-律师评价(lawyer_order_review) */
+    private Integer src;
 }

+ 47 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreCommentMapper.java

@@ -198,4 +198,51 @@ WHERE
             "\tAND s.store_id = #{storeId}\n" +
             "\tLIMIT 1")
     StoreCommentVo getCommentOneInfo(@Param("storeId") int storeId);
+
+    /**
+     * 当前用户的全部评价(店铺订单评价 + 律师订单评价)
+     */
+    @Select("SELECT * FROM ( " +
+            "SELECT " +
+            "luo.id, luo.user_id, luo.store_id, " +
+            "CONVERT(luo.quan_id USING utf8mb4) COLLATE utf8mb4_unicode_ci AS quan_id, " +
+            "CONVERT(luo.quan_code USING utf8mb4) COLLATE utf8mb4_unicode_ci AS quan_code, " +
+            "CONVERT(luo.order_no USING utf8mb4) COLLATE utf8mb4_unicode_ci AS order_no, " +
+            "CONVERT(luo.order_str USING utf8mb4) COLLATE utf8mb4_unicode_ci AS order_str, " +
+            "luo.status, " +
+            "CONVERT(luo.price USING utf8mb4) COLLATE utf8mb4_unicode_ci AS price, " +
+            "CONVERT(luo.final_price USING utf8mb4) COLLATE utf8mb4_unicode_ci AS final_price, " +
+            "luo.buy_time, luo.pay_time, " +
+            "CONVERT(luo.pay_method USING utf8mb4) COLLATE utf8mb4_unicode_ci AS pay_method, " +
+            "luo.used_time, luo.refund_time, luo.coupon_type, luo.cancel_time, " +
+            "CONVERT(luo.cancel_reason USING utf8mb4) COLLATE utf8mb4_unicode_ci AS cancel_reason, " +
+            "luo.finish_time, luo.delete_flag, luo.created_time, luo.created_user_id, luo.updated_time, luo.updated_user_id, luo.send_discount_coupon_flag, luo.expert_order_id, luo.order_appraise, " +
+            "lgbm.image_id AS groupBuyImgId, NULL AS groupBuyImgUrl, " +
+            "CONVERT(lgbm.group_name USING utf8mb4) COLLATE utf8mb4_unicode_ci AS groupBuyName, " +
+            "lgbm.group_type AS groupBuyType, " +
+            "CONVERT(store.business_section USING utf8mb4) COLLATE utf8mb4_unicode_ci AS storeType, " +
+            "CONVERT(store.business_types_name USING utf8mb4) COLLATE utf8mb4_unicode_ci AS businessTypesName, " +
+            "CONVERT(store.store_name USING utf8mb4) COLLATE utf8mb4_unicode_ci AS storeName, " +
+            "CONVERT(sc.comment_content USING utf8mb4) COLLATE utf8mb4_unicode_ci AS commentContent, sc.score, sc.created_time AS commentDate, " +
+            "CONVERT(sc.img_id USING utf8mb4) COLLATE utf8mb4_unicode_ci AS imgId, 1 AS src " +
+            "FROM store_comment sc " +
+            "LEFT JOIN life_user_order luo ON sc.business_id = luo.id " +
+            "LEFT JOIN order_coupon_middle ocm ON luo.id = ocm.order_id " +
+            "LEFT JOIN life_group_buy_main lgbm ON ocm.coupon_id = lgbm.id " +
+            "LEFT JOIN store_info store ON luo.store_id = store.id " +
+            "WHERE sc.business_type = 5 AND sc.delete_flag = 0 AND sc.user_id = #{userId} " +
+            "UNION ALL " +
+            "SELECT " +
+            "CAST(lor.order_id AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci AS id, " +
+            "CAST(lor.user_id AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci AS user_id, " +
+            "NULL AS store_id, NULL AS quan_id, NULL AS quan_code, " +
+            "CONVERT(lor.order_number USING utf8mb4) COLLATE utf8mb4_unicode_ci AS order_no, " +
+            "NULL AS order_str, NULL AS status, NULL AS price, NULL AS final_price, NULL AS buy_time, NULL AS pay_time, NULL AS pay_method, NULL AS used_time, NULL AS refund_time, NULL AS coupon_type, NULL AS cancel_time, NULL AS cancel_reason, NULL AS finish_time, lor.delete_flag, lor.created_time, lor.created_user_id, lor.updated_time, lor.updated_user_id, NULL AS send_discount_coupon_flag, NULL AS expert_order_id, NULL AS order_appraise, " +
+            "NULL AS groupBuyImgId, NULL AS groupBuyImgUrl, NULL AS groupBuyName, NULL AS groupBuyType, NULL AS storeType, NULL AS businessTypesName, NULL AS storeName, " +
+            "lor.review_content AS commentContent, lor.overall_rating AS score, lor.created_time AS commentDate, " +
+            "CONVERT(lor.review_images USING utf8mb4) COLLATE utf8mb4_unicode_ci AS imgId, 2 AS src " +
+            "FROM lawyer_order_review lor " +
+            "WHERE lor.delete_flag = 0 AND lor.user_id = #{userId} " +
+            ") t ORDER BY t.commentDate DESC")
+    IPage<LifeUserOrderCommentVo> getUserAllCommentsPage(IPage<LifeUserOrderCommentVo> page, @Param("userId") Integer userId);
 }

+ 13 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/controller/StoreCommentController.java

@@ -190,6 +190,19 @@ public class StoreCommentController {
         return R.data(storeCommentService.getCommentOrderPage(pageNum, pageSize, type, userId));
     }
 
+    @ApiOperation("当前用户全部评价(店铺+律师)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "预留字段,传1或2均可", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", paramType = "query", required = true),
+    })
+    @GetMapping("/getUserAllCommentsPage")
+    public R<IPage<LifeUserOrderCommentVo>> getUserAllCommentsPage(Integer pageNum, Integer pageSize, Integer type, Integer userId) {
+        log.info("StoreCommentController.getUserAllCommentsPage?pageNum={}&pageSize={}&type={}&userId={}", pageNum, pageSize, type, userId);
+        return R.data(storeCommentService.getUserAllCommentsPage(pageNum, pageSize, userId));
+    }
+
     @ApiOperation("获取店铺评价计数统计")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)

+ 5 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/StoreCommentService.java

@@ -134,6 +134,11 @@ public interface StoreCommentService extends IService<StoreComment> {
     IPage<LifeUserOrderCommentVo> getCommentOrderPage(Integer pageNum, Integer pageSize, Integer type, String userId);
 
     /**
+     * 查询当前用户全部评价(店铺+律师),格式同 LifeUserOrderCommentVo
+     */
+    IPage<LifeUserOrderCommentVo> getUserAllCommentsPage(Integer pageNum, Integer pageSize, Integer userId);
+
+    /**
      * 获取店铺评价计数统计
      *
      * @param storeId 门店id

+ 95 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/StoreCommentServiceImpl.java

@@ -1014,6 +1014,101 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
     }
 
     /**
+     * 当前用户的全部评价(店铺订单评价 + 律师订单评价)
+     */
+    @Override
+    public IPage<LifeUserOrderCommentVo> getUserAllCommentsPage(Integer pageNum, Integer pageSize, Integer userId) {
+        IPage<LifeUserOrderCommentVo> page = new Page<>(pageNum, pageSize);
+        IPage<LifeUserOrderCommentVo> result = storeCommentMapper.getUserAllCommentsPage(page, userId);
+        List<LifeUserOrderCommentVo> records = result.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return result;
+        }
+
+        // 收集需要补全的图片ID
+        Set<Integer> allImgIds = new HashSet<>();
+        records.forEach(r -> {
+            // 团购图片
+            if (StringUtils.isNotEmpty(r.getGroupBuyImgId())) {
+                Arrays.stream(r.getGroupBuyImgId().split(","))
+                        .map(String::trim)
+                        .filter(s -> !s.isEmpty())
+                        .forEach(s -> {
+                            try { allImgIds.add(Integer.parseInt(s)); } catch (NumberFormatException ignored) {}
+                        });
+            }
+            // 店铺评价图片(img_id)
+            if (r.getSrc() != null && r.getSrc() == 1 && StringUtils.isNotEmpty(r.getImgId())) {
+                Arrays.stream(r.getImgId().split(","))
+                        .map(String::trim)
+                        .filter(s -> !s.isEmpty())
+                        .forEach(s -> {
+                            try { allImgIds.add(Integer.parseInt(s)); } catch (NumberFormatException ignored) {}
+                        });
+            }
+        });
+
+        final Map<Integer, StoreImg> imgIdToImgMap = new HashMap<>();
+        if (!allImgIds.isEmpty()) {
+            List<StoreImg> storeImgList = storeImgMapper.selectList(new QueryWrapper<StoreImg>().in("id", allImgIds));
+            imgIdToImgMap.putAll(storeImgList.stream().collect(Collectors.toMap(StoreImg::getId, Function.identity(), (a, b) -> a)));
+        }
+
+        // 补全 groupBuyImgUrl 与评价图片列表
+        for (LifeUserOrderCommentVo r : records) {
+            // 团购图片 URL
+            if (StringUtils.isNotEmpty(r.getGroupBuyImgId())) {
+                List<String> urls = Arrays.stream(r.getGroupBuyImgId().split(","))
+                        .map(String::trim)
+                        .filter(s -> !s.isEmpty())
+                        .map(idStr -> {
+                            try {
+                                StoreImg img = imgIdToImgMap.get(Integer.parseInt(idStr));
+                                return img != null ? img.getImgUrl() : null;
+                            } catch (NumberFormatException e) {
+                                return null;
+                            }
+                        })
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toList());
+                r.setGroupBuyImgUrl(String.join(",", urls));
+            }
+
+            // 评价图片 URL 列表
+            if (r.getSrc() != null && r.getSrc() == 1) {
+                // 店铺评价:imgId 是逗号分隔的图片ID
+                if (StringUtils.isNotEmpty(r.getImgId())) {
+                    List<String> imgUrls = Arrays.stream(r.getImgId().split(","))
+                            .map(String::trim)
+                            .filter(s -> !s.isEmpty())
+                            .map(idStr -> {
+                                try {
+                                    StoreImg img = imgIdToImgMap.get(Integer.parseInt(idStr));
+                                    return img != null ? img.getImgUrl() : null;
+                                } catch (NumberFormatException e) {
+                                    return null;
+                                }
+                            })
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toList());
+                    r.setImgUrls(imgUrls);
+                }
+            } else if (r.getSrc() != null && r.getSrc() == 2) {
+                // 律师评价:review_images 是 JSON 数组(URL 列表)
+                if (StringUtils.isNotEmpty(r.getImgId())) {
+                    try {
+                        List<String> imgUrls = JSONArray.parseArray(r.getImgId(), String.class);
+                        r.setImgUrls(imgUrls);
+                    } catch (Exception e) {
+                        log.warn("parse lawyer review images fail, raw={}", r.getImgId());
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
      * 获取店铺评价计数统计
      *
      * @param storeId 门店id