Browse Source

cursor生成查询订单返回律师信息

jyc 1 month ago
parent
commit
9b47d1917b

+ 139 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LawyerConsultationOrderVO.java

@@ -0,0 +1,139 @@
+package shop.alien.entity.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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 = "LawyerConsultationOrderVO對象", description = "諮詢訂單視圖對象(包含律師信息)")
+public class LawyerConsultationOrderVO implements Serializable {
+
+    @ApiModelProperty(value = "主鍵")
+    private Integer id;
+
+    @ApiModelProperty(value = "訂單編號")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "客戶端用戶ID")
+    private Integer clientUserId;
+
+    @ApiModelProperty(value = "律師用戶ID")
+    private Integer lawyerUserId;
+
+    @ApiModelProperty(value = "法律問題場景ID")
+    private Integer problemScenarId;
+
+    @ApiModelProperty(value = "問題描述")
+    private String problemDescription;
+
+    @ApiModelProperty(value = "訂單金額,單位分")
+    private Integer orderAmount;
+
+    @ApiModelProperty(value = "諮詢費用,單位分")
+    private Integer consultationFee;
+
+    @ApiModelProperty(value = "諮詢開始時間")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @ApiModelProperty(value = "諮詢結束時間")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    @ApiModelProperty(value = "訂單狀態, 0:待支付, 1:已支付, 2:進行中, 3:已完成, 4:已取消")
+    private Integer orderStatus;
+
+    @ApiModelProperty(value = "支付狀態, 0:未支付, 1:已支付")
+    private Integer paymentStatus;
+
+    @ApiModelProperty(value = "下單時間")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date orderTime;
+
+    @ApiModelProperty(value = "支付時間")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date paymentTime;
+
+    @ApiModelProperty(value = "訂單有效期")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date validityPeriod;
+
+    @ApiModelProperty(value = "用戶評分, 1-5星")
+    private Integer rating;
+
+    @ApiModelProperty(value = "用戶評價內容")
+    private String comment;
+
+    @ApiModelProperty(value = "創建時間")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    // ========== 律師信息 ==========
+
+    @ApiModelProperty(value = "律師姓名")
+    private String lawyerName;
+
+    @ApiModelProperty(value = "律師手機號")
+    private String lawyerPhone;
+
+    @ApiModelProperty(value = "律師郵箱")
+    private String lawyerEmail;
+
+    @ApiModelProperty(value = "律師執業證號")
+    private String lawyerCertificateNo;
+
+    @ApiModelProperty(value = "所屬律師事務所")
+    private String lawFirm;
+
+    @ApiModelProperty(value = "執業年限")
+    private Integer practiceYears;
+
+    @ApiModelProperty(value = "專業領域,多個用逗號分隔")
+    private String specialtyFields;
+
+    @ApiModelProperty(value = "資質認證狀態, 0:未認證, 1:認證中, 2:已認證, 3:認證失敗")
+    private Integer certificationStatus;
+
+    @ApiModelProperty(value = "服務評分, 0-100分")
+    private Integer serviceScore;
+
+    @ApiModelProperty(value = "服務次數")
+    private Integer serviceCount;
+
+    @ApiModelProperty(value = "諮詢收費標準(單位分/小時)")
+    private Integer lawyerConsultationFee;
+
+    @ApiModelProperty(value = "所屬省份")
+    private String province;
+
+    @ApiModelProperty(value = "所屬城市")
+    private String city;
+
+    @ApiModelProperty(value = "所屬區縣")
+    private String district;
+
+    @ApiModelProperty(value = "詳細地址")
+    private String address;
+
+    @ApiModelProperty(value = "頭像")
+    private String headImg;
+
+    @ApiModelProperty(value = "昵稱")
+    private String nickName;
+
+    @ApiModelProperty(value = "個人簡介(詳細)")
+    private String personalIntroduction;
+}
+

+ 3 - 2
alien-store/src/main/java/shop/alien/store/controller/LawyerConsultationOrderController.java

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
 import shop.alien.store.service.LawyerConsultationOrderService;
 import shop.alien.util.myBaticsPlus.QueryBuilder;
 
@@ -29,7 +30,7 @@ public class LawyerConsultationOrderController {
 
     private final LawyerConsultationOrderService consultationOrderService;
 
-    @ApiOperation("分页查询咨询订单列表(支持按律师姓名关联查询)")
+    @ApiOperation("分页查询咨询订单列表(支持按律师姓名关联查询,返回结果包含律师信息)")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "page", value = "页数(默认1)", dataType = "int", paramType = "query"),
@@ -41,7 +42,7 @@ public class LawyerConsultationOrderController {
             @ApiImplicitParam(name = "orderStatus", value = "订单状态, 0:待支付, 1:已支付, 2:进行中, 3:已完成, 4:已取消", dataType = "Integer", paramType = "query")
     })
     @GetMapping("/getConsultationOrderList")
-    public R<IPage<LawyerConsultationOrder>> getConsultationOrderList(@RequestParam(defaultValue = "1") int page,
+    public R<IPage<LawyerConsultationOrderVO>> getConsultationOrderList(@RequestParam(defaultValue = "1") int page,
                                                                  @RequestParam(defaultValue = "10") int size,
                                                                  @RequestParam(required = false) String orderNumber,
                                                                  @RequestParam(required = false) Integer clientUserId,

+ 4 - 3
alien-store/src/main/java/shop/alien/store/service/LawyerConsultationOrderService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
 
 /**
  * 咨询订单 服务类
@@ -14,7 +15,7 @@ import shop.alien.entity.store.LawyerConsultationOrder;
 public interface LawyerConsultationOrderService extends IService<LawyerConsultationOrder> {
 
     /**
-     * 分页查询咨询订单列表
+     * 分页查询咨询订单列表(包含律师信息)
      *
      * @param pageNum      页码
      * @param pageSize     页容
@@ -23,9 +24,9 @@ public interface LawyerConsultationOrderService extends IService<LawyerConsultat
      * @param lawyerUserId 律师用户ID
      * @param lawyerName   律师姓名
      * @param orderStatus  订单状态
-     * @return IPage<LawyerConsultationOrder>
+     * @return IPage<LawyerConsultationOrderVO>
      */
-    R<IPage<LawyerConsultationOrder>> getConsultationOrderList(int pageNum, int pageSize, String orderNumber,
+    R<IPage<LawyerConsultationOrderVO>> getConsultationOrderList(int pageNum, int pageSize, String orderNumber,
                                                           Integer clientUserId, Integer lawyerUserId, String lawyerName, Integer orderStatus);
 
     /**

+ 80 - 3
alien-store/src/main/java/shop/alien/store/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -8,15 +8,17 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.beans.BeanUtils;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LawyerConsultationOrder;
 import shop.alien.entity.store.LawyerUser;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
 import shop.alien.mapper.LawyerConsultationOrderMapper;
 import shop.alien.store.service.LawyerConsultationOrderService;
 import shop.alien.store.service.LawyerUserService;
 
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -35,7 +37,7 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
     private final LawyerUserService lawyerUserService;
 
     @Override
-    public R<IPage<LawyerConsultationOrder>> getConsultationOrderList(int pageNum, int pageSize, String orderNumber,
+    public R<IPage<LawyerConsultationOrderVO>> getConsultationOrderList(int pageNum, int pageSize, String orderNumber,
                                                                  Integer clientUserId, Integer lawyerUserId, String lawyerName, Integer orderStatus) {
         log.info("LawyerConsultationOrderServiceImpl.getConsultationOrderList?pageNum={},pageSize={},orderNumber={},clientUserId={},lawyerUserId={},lawyerName={},orderStatus={}",
                 pageNum, pageSize, orderNumber, clientUserId, lawyerUserId, lawyerName, orderStatus);
@@ -72,7 +74,82 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
         }
         queryWrapper.orderByDesc(LawyerConsultationOrder::getCreatedTime);
         IPage<LawyerConsultationOrder> pageResult = this.page(page, queryWrapper);
-        return R.data(pageResult);
+        
+        // 轉換為VO並填充律師信息
+        IPage<LawyerConsultationOrderVO> voPage = convertToVO(pageResult);
+        
+        return R.data(voPage);
+    }
+
+    /**
+     * 將訂單分頁結果轉換為VO並填充律師信息
+     */
+    private IPage<LawyerConsultationOrderVO> convertToVO(IPage<LawyerConsultationOrder> pageResult) {
+        // 創建VO分頁對象
+        Page<LawyerConsultationOrderVO> voPage = new Page<>(pageResult.getCurrent(), pageResult.getSize(), pageResult.getTotal());
+        
+        List<LawyerConsultationOrder> records = pageResult.getRecords();
+        if (records == null || records.isEmpty()) {
+            voPage.setRecords(Collections.emptyList());
+            return voPage;
+        }
+        
+        // 收集所有律師ID
+        Set<Integer> lawyerUserIds = records.stream()
+                .map(LawyerConsultationOrder::getLawyerUserId)
+                .filter(id -> id != null)
+                .collect(Collectors.toSet());
+        
+        // 批量查詢律師信息
+        Map<Integer, LawyerUser> lawyerMap = new HashMap<>();
+        if (!lawyerUserIds.isEmpty()) {
+            LambdaQueryWrapper<LawyerUser> lawyerWrapper = new LambdaQueryWrapper<>();
+            lawyerWrapper.in(LawyerUser::getId, lawyerUserIds);
+            lawyerWrapper.eq(LawyerUser::getDeleteFlag, 0);
+            List<LawyerUser> lawyerUsers = lawyerUserService.list(lawyerWrapper);
+            if (lawyerUsers != null && !lawyerUsers.isEmpty()) {
+                lawyerMap = lawyerUsers.stream()
+                        .collect(Collectors.toMap(LawyerUser::getId, lawyer -> lawyer, (k1, k2) -> k1));
+            }
+        }
+        
+        // 轉換為VO並填充律師信息
+        final Map<Integer, LawyerUser> finalLawyerMap = lawyerMap;
+        List<LawyerConsultationOrderVO> voList = records.stream()
+                .map(order -> {
+                    LawyerConsultationOrderVO vo = new LawyerConsultationOrderVO();
+                    // 複製訂單基本信息
+                    BeanUtils.copyProperties(order, vo);
+                    
+                    // 填充律師信息
+                    LawyerUser lawyer = finalLawyerMap.get(order.getLawyerUserId());
+                    if (lawyer != null) {
+                        vo.setLawyerName(lawyer.getName());
+                        vo.setLawyerPhone(lawyer.getPhone());
+                        vo.setLawyerEmail(lawyer.getEmail());
+                        vo.setLawyerCertificateNo(lawyer.getLawyerCertificateNo());
+                        vo.setLawFirm(lawyer.getLawFirm());
+                        vo.setPracticeYears(lawyer.getPracticeYears());
+                        vo.setSpecialtyFields(lawyer.getSpecialtyFields());
+                        vo.setCertificationStatus(lawyer.getCertificationStatus());
+                        vo.setServiceScore(lawyer.getServiceScore());
+                        vo.setServiceCount(lawyer.getServiceCount());
+                        vo.setLawyerConsultationFee(lawyer.getConsultationFee());
+                        vo.setProvince(lawyer.getProvince());
+                        vo.setCity(lawyer.getCity());
+                        vo.setDistrict(lawyer.getDistrict());
+                        vo.setAddress(lawyer.getAddress());
+                        vo.setHeadImg(lawyer.getHeadImg());
+                        vo.setNickName(lawyer.getNickName());
+                        vo.setPersonalIntroduction(lawyer.getPersonalIntroduction());
+                    }
+                    
+                    return vo;
+                })
+                .collect(Collectors.toList());
+        
+        voPage.setRecords(voList);
+        return voPage;
     }
 
     @Override