فهرست منبع

开发 根据订单查询其评价接口/storeComment/getUserAllOrders

lutong 5 روز پیش
والد
کامیت
7e11205596

+ 117 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/UserOrderVo.java

@@ -0,0 +1,117 @@
+package shop.alien.entity.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户订单统一视图对象(包含商户订单和律师订单)
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "UserOrderVo对象", description = "用户订单统一视图对象")
+public class UserOrderVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "订单ID")
+    private String orderId;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "订单类型:1-商户订单,2-律师订单")
+    private Integer orderType;
+
+    @ApiModelProperty(value = "用户ID")
+    private String userId;
+
+    @ApiModelProperty(value = "商户/律师ID")
+    private String businessId;
+
+    @ApiModelProperty(value = "商户名称/律师名称")
+    private String businessName;
+
+    @ApiModelProperty(value = "订单金额(单位:分,商户订单)/订单金额(单位:分,律师订单)")
+    private String orderAmount;
+
+    @ApiModelProperty(value = "实付金额(商户订单)")
+    private String finalPrice;
+
+    @ApiModelProperty(value = "订单状态")
+    private Integer orderStatus;
+
+    @ApiModelProperty(value = "订单状态文本")
+    private String orderStatusValue;
+
+    @ApiModelProperty(value = "支付状态(律师订单:0-未支付,1-已支付)")
+    private Integer paymentStatus;
+
+    @ApiModelProperty(value = "下单时间")
+    private Date orderTime;
+
+    @ApiModelProperty(value = "支付时间")
+    private Date payTime;
+
+    @ApiModelProperty(value = "订单创建时间")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "商户订单相关:店铺ID")
+    private String storeId;
+
+    @ApiModelProperty(value = "商户订单相关:商品名称")
+    private String couponName;
+
+    @ApiModelProperty(value = "商户订单相关:商品图片URL")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "商户订单相关:是否已评价(0-未评价,1-已评价)")
+    private Integer orderAppraise;
+
+    @ApiModelProperty(value = "律师订单相关:律师用户ID")
+    private Integer lawyerUserId;
+
+    @ApiModelProperty(value = "律师订单相关:问题描述")
+    private String problemDescription;
+
+    @ApiModelProperty(value = "律师订单相关:咨询费用(单位:分)")
+    private Integer consultationFee;
+
+    @ApiModelProperty(value = "律师订单相关:咨询开始时间")
+    private Date startTime;
+
+    @ApiModelProperty(value = "律师订单相关:咨询结束时间")
+    private Date endTime;
+
+    @ApiModelProperty(value = "律师订单相关:律师头像")
+    private String lawyerHeadImg;
+
+    @ApiModelProperty(value = "律师订单相关:是否已评价")
+    private Boolean hasReview;
+
+    @ApiModelProperty(value = "商户订单评分(总体评分)")
+    private Double score;
+
+    @ApiModelProperty(value = "商户订单其他评分(口味/环境/服务)")
+    private String otherScore;
+
+    @ApiModelProperty(value = "律师订单总体评分(1-5星,支持0.5星)")
+    private Double overallRating;
+
+    @ApiModelProperty(value = "律师订单服务态度评分(1-5星,支持0.5星)")
+    private Double serviceAttitudeRating;
+
+    @ApiModelProperty(value = "律师订单响应时间评分(1-5星,支持0.5星)")
+    private Double responseTimeRating;
+
+    @ApiModelProperty(value = "律师订单专业能力评分(1-5星,支持0.5星)")
+    private Double professionalAbilityRating;
+
+}

+ 1 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/controller/StoreCommentController.java → alien-lawyer/src/main/java/shop/alien/lawyer/controller/LawyerStoreCommentController.java

@@ -37,7 +37,7 @@ import java.util.Set;
 @RestController
 @RequestMapping("/storeComment")
 @RequiredArgsConstructor
-public class StoreCommentController {
+public class LawyerStoreCommentController {
 
     private final StoreCommentService storeCommentService;
 

+ 18 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreCommentController.java

@@ -11,6 +11,7 @@ import shop.alien.entity.store.vo.LifeUserOrderCommentVo;
 import shop.alien.entity.store.vo.StoreCommentCountVo;
 import shop.alien.entity.store.vo.StoreCommentVo;
 import shop.alien.entity.store.vo.StoreCommitPercentVo;
+import shop.alien.entity.store.vo.UserOrderVo;
 import shop.alien.store.service.StoreCommentService;
 
 import java.util.Map;
@@ -191,4 +192,21 @@ public class StoreCommentController {
         log.info("StoreCommentController.getAppraiseCount?storeId={}", storeId);
         return R.data(storeCommentService.getAppraiseCount(storeId));
     }
+
+    @ApiOperation("分页查询当前用户所有订单(包含商户订单和律师订单)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "type", value = "订单类型:1-未评价,2-已评价", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/getUserAllOrders")
+    public R<IPage<UserOrderVo>> getUserAllOrders(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            @RequestParam("userId") Integer userId,
+            @RequestParam(required = false) Integer type) {
+        log.info("StoreCommentController.getUserAllOrders?pageNum={}&pageSize={}&userId={}&type={}", pageNum, pageSize, userId, type);
+        return R.data(storeCommentService.getUserAllOrders(pageNum, pageSize, userId, type));
+    }
 }

+ 12 - 0
alien-store/src/main/java/shop/alien/store/service/StoreCommentService.java

@@ -8,6 +8,7 @@ import shop.alien.entity.store.vo.LifeUserOrderCommentVo;
 import shop.alien.entity.store.vo.StoreCommentCountVo;
 import shop.alien.entity.store.vo.StoreCommentVo;
 import shop.alien.entity.store.vo.StoreCommitPercentVo;
+import shop.alien.entity.store.vo.UserOrderVo;
 
 import java.util.Map;
 
@@ -133,4 +134,15 @@ public interface StoreCommentService extends IService<StoreComment> {
      */
     StoreCommentCountVo getAppraiseCount(Integer storeId);
 
+    /**
+     * 分页查询当前用户所有订单(包含商户订单和律师订单)
+     *
+     * @param pageNum 页数
+     * @param pageSize 页容
+     * @param userId 用户ID
+     * @param type 订单类型:1-未评价,2-已评价
+     * @return 订单分页列表
+     */
+    IPage<UserOrderVo> getUserAllOrders(Integer pageNum, Integer pageSize, Integer userId, Integer type);
+
 }

+ 205 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreCommentServiceImpl.java

@@ -22,6 +22,8 @@ import org.springframework.web.multipart.MultipartRequest;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.*;
 import shop.alien.mapper.*;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+import shop.alien.entity.store.vo.UserOrderVo;
 import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.StoreCommentService;
 import shop.alien.store.service.StoreImgService;
@@ -79,6 +81,10 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
 
     private final LifeUserOrderMapper lifeUserOrderMapper;
 
+    private final LawyerConsultationOrderMapper lawyerConsultationOrderMapper;
+
+    private final OrderReviewMapper orderReviewMapper;
+
     @Autowired
     private TextModerationUtil textModerationUtil;
     @Autowired
@@ -1053,4 +1059,203 @@ public class StoreCommentServiceImpl extends ServiceImpl<StoreCommentMapper, Sto
                 .eq(StoreComment::getBusinessType, 5)
                 .eq(StoreComment::getDeleteFlag, 0);
     }
+
+    @Override
+    public IPage<UserOrderVo> getUserAllOrders(Integer pageNum, Integer pageSize, Integer userId, Integer type) {
+        log.info("StoreCommentServiceImpl.getUserAllOrders?pageNum={}&pageSize={}&userId={}&type={}", pageNum, pageSize, userId, type);
+
+        if (userId == null) {
+            log.warn("用户ID不能为空");
+            return new Page<>(pageNum, pageSize);
+        }
+
+        List<UserOrderVo> allOrders = new ArrayList<>();
+
+        // 1. 查询商户订单(已完成状态:status = 7)
+        Page<LifeUserOrderVo> storeOrderPage = new Page<>(pageNum, 10000); // 先查所有,后续合并分页
+        QueryWrapper<LifeUserOrderVo> storeOrderWrapper = new QueryWrapper<>();
+        storeOrderWrapper.eq("luo.user_id", String.valueOf(userId))
+                .eq("luo.status", 7) // 已完成状态
+                .eq("luo.delete_flag", 0);
+        
+        // 根据type筛选:1-未评价,2-已评价
+        if (type != null) {
+            if (type == 1) {
+                // 未评价:orderAppraise = 0
+                storeOrderWrapper.eq("luo.order_appraise", 0);
+            } else if (type == 2) {
+                // 已评价:orderAppraise = 1
+                storeOrderWrapper.eq("luo.order_appraise", 1);
+            }
+        }
+        
+        storeOrderWrapper.orderByDesc("luo.created_time");
+        IPage<LifeUserOrderVo> storeOrders = lifeUserOrderMapper.queryUserOrderList(storeOrderPage, storeOrderWrapper);
+
+        // 转换商户订单为统一VO
+        if (storeOrders != null && CollectionUtils.isNotEmpty(storeOrders.getRecords())) {
+            // 如果type=2(已评价),需要查询评价信息
+            Map<String, StoreComment> commentMap = new HashMap<>();
+            if (type != null && type == 2) {
+                List<String> orderIds = storeOrders.getRecords().stream()
+                        .map(LifeUserOrderVo::getId)
+                        .collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(orderIds)) {
+                    LambdaQueryWrapper<StoreComment> commentWrapper = new LambdaQueryWrapper<>();
+                    commentWrapper.in(StoreComment::getBusinessId, orderIds)
+                            .eq(StoreComment::getBusinessType, 5) // 订单评价
+                            .eq(StoreComment::getDeleteFlag, 0);
+                    List<StoreComment> comments = storeCommentMapper.selectList(commentWrapper);
+                    commentMap = comments.stream()
+                            .collect(Collectors.toMap(
+                                    c -> String.valueOf(c.getBusinessId()),
+                                    Function.identity(),
+                                    (existing, replacement) -> existing
+                            ));
+                }
+            }
+            
+            for (LifeUserOrderVo order : storeOrders.getRecords()) {
+                StoreComment comment = commentMap.get(order.getId());
+                UserOrderVo vo = convertStoreOrderToVo(order, comment);
+                allOrders.add(vo);
+            }
+        }
+
+        // 2. 查询律师订单(已完成状态:orderStatus = 3)
+        Page<LawyerConsultationOrderVO> lawyerOrderPage = new Page<>(pageNum, 10000);
+        IPage<LawyerConsultationOrderVO> lawyerOrders = lawyerConsultationOrderMapper.getConsultationOrderListById(
+                lawyerOrderPage, String.valueOf(userId), "3", null); // orderStatus = 3 表示已完成
+
+        // 转换律师订单为统一VO
+        if (lawyerOrders != null && CollectionUtils.isNotEmpty(lawyerOrders.getRecords())) {
+            // 查询所有律师订单的评价信息(用于type筛选和评分填充)
+            Map<Integer, OrderReview> reviewMap = new HashMap<>();
+            List<Integer> orderIds = lawyerOrders.getRecords().stream()
+                    .map(LawyerConsultationOrderVO::getId)
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(orderIds)) {
+                LambdaQueryWrapper<OrderReview> reviewWrapper = new LambdaQueryWrapper<>();
+                reviewWrapper.in(OrderReview::getOrderId, orderIds)
+                        .eq(OrderReview::getDeleteFlag, 0);
+                List<OrderReview> reviews = orderReviewMapper.selectList(reviewWrapper);
+                reviewMap = reviews.stream()
+                        .collect(Collectors.toMap(
+                                OrderReview::getOrderId,
+                                Function.identity(),
+                                (existing, replacement) -> existing
+                        ));
+            }
+            
+            for (LawyerConsultationOrderVO order : lawyerOrders.getRecords()) {
+                OrderReview review = reviewMap.get(order.getId());
+                
+                // 根据type筛选
+                if (type != null) {
+                    if (type == 1 && review != null) {
+                        // 未评价:跳过有评价的订单
+                        continue;
+                    } else if (type == 2 && review == null) {
+                        // 已评价:跳过没有评价的订单
+                        continue;
+                    }
+                }
+                
+                UserOrderVo vo = convertLawyerOrderToVo(order, review);
+                allOrders.add(vo);
+            }
+        }
+
+        // 3. 按创建时间倒序排序
+        allOrders.sort((o1, o2) -> {
+            Date date1 = o1.getCreatedTime();
+            Date date2 = o2.getCreatedTime();
+            if (date1 == null && date2 == null) return 0;
+            if (date1 == null) return 1;
+            if (date2 == null) return -1;
+            return date2.compareTo(date1);
+        });
+
+        // 4. 手动分页
+        int total = allOrders.size();
+        int start = (pageNum - 1) * pageSize;
+        int end = Math.min(start + pageSize, total);
+        List<UserOrderVo> pageRecords = start < total ? allOrders.subList(start, end) : new ArrayList<>();
+
+        // 5. 构建分页结果
+        Page<UserOrderVo> resultPage = new Page<>(pageNum, pageSize);
+        resultPage.setRecords(pageRecords);
+        resultPage.setTotal(total);
+        resultPage.setPages((total + pageSize - 1) / pageSize);
+
+        return resultPage;
+    }
+
+    /**
+     * 转换商户订单为统一VO
+     */
+    private UserOrderVo convertStoreOrderToVo(LifeUserOrderVo order, StoreComment comment) {
+        UserOrderVo vo = new UserOrderVo();
+        vo.setOrderId(order.getId());
+        vo.setOrderNumber(order.getOrderNo());
+        vo.setOrderType(1); // 1-商户订单
+        vo.setUserId(order.getUserId());
+        vo.setBusinessId(order.getStoreId());
+        vo.setBusinessName(order.getStoreName());
+        vo.setOrderAmount(order.getPrice());
+        vo.setFinalPrice(order.getFinalPrice());
+        vo.setOrderStatus(order.getStatus());
+        vo.setOrderStatusValue(order.getOrderStatusValue());
+        vo.setOrderTime(order.getBuyTime());
+        vo.setPayTime(order.getPayTime());
+        vo.setCreatedTime(order.getCreatedTime());
+        vo.setStoreId(order.getStoreId());
+        vo.setCouponName(order.getCouponName());
+        vo.setImgUrl(order.getImgUrl());
+        vo.setOrderAppraise(order.getOrderAppraise());
+        
+        // 如果已评价,填充评分信息
+        if (comment != null) {
+            vo.setScore(comment.getScore());
+            vo.setOtherScore(comment.getOtherScore());
+        }
+        
+        return vo;
+    }
+
+    /**
+     * 转换律师订单为统一VO
+     */
+    private UserOrderVo convertLawyerOrderToVo(LawyerConsultationOrderVO order, OrderReview review) {
+        UserOrderVo vo = new UserOrderVo();
+        vo.setOrderId(String.valueOf(order.getId()));
+        vo.setOrderNumber(order.getOrderNumber());
+        vo.setOrderType(2); // 2-律师订单
+        vo.setUserId(String.valueOf(order.getClientUserId()));
+        vo.setBusinessId(String.valueOf(order.getLawyerUserId()));
+        vo.setBusinessName(order.getLawyerName());
+        vo.setOrderAmount(String.valueOf(order.getOrderAmount()));
+        vo.setOrderStatus(order.getOrderStatus());
+        vo.setPaymentStatus(order.getPaymentStatus());
+        vo.setOrderTime(order.getOrderTime());
+        vo.setPayTime(order.getPaymentTime());
+        vo.setCreatedTime(order.getCreatedTime());
+        vo.setLawyerUserId(order.getLawyerUserId());
+        vo.setProblemDescription(order.getProblemDescription());
+        vo.setConsultationFee(order.getConsultationFee());
+        vo.setStartTime(order.getStartTime());
+        vo.setEndTime(order.getEndTime());
+        vo.setLawyerHeadImg(order.getHeadImg());
+        vo.setHasReview(review != null);
+        
+        // 如果已评价,填充评分信息
+        if (review != null) {
+            vo.setOverallRating(review.getOverallRating());
+            vo.setServiceAttitudeRating(review.getServiceAttitudeRating());
+            vo.setResponseTimeRating(review.getResponseTimeRating());
+            vo.setProfessionalAbilityRating(review.getProfessionalAbilityRating());
+        }
+        
+        return vo;
+    }
 }