瀏覽代碼

cursor优化查询订单返回律师信息

jyc 1 月之前
父節點
當前提交
7e1280ea91

+ 27 - 0
alien-entity/src/main/java/shop/alien/mapper/LawyerConsultationOrderMapper.java

@@ -1,8 +1,14 @@
 package shop.alien.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import shop.alien.entity.store.LawyerConsultationOrder;
+import shop.alien.entity.store.vo.LawyerConsultationOrderVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -15,5 +21,26 @@ import shop.alien.entity.store.LawyerConsultationOrder;
 @Mapper
 public interface LawyerConsultationOrderMapper extends BaseMapper<LawyerConsultationOrder> {
 
+    /**
+     * 分頁查詢訂單列表,聯查律師信息
+     *
+     * @param page 分頁對象
+     * @param orderNumber 訂單編號
+     * @param clientUserId 客戶用戶ID
+     * @param lawyerUserId 律師用戶ID
+     * @param lawyerName 律師姓名
+     * @param orderStatus 訂單狀態
+     * @param lawyerUserIds 律師用戶ID列表(用於按律師姓名搜索)
+     * @return 分頁結果
+     */
+    IPage<LawyerConsultationOrderVO> getConsultationOrderListWithLawyer(
+            IPage<LawyerConsultationOrderVO> page,
+            @Param("orderNumber") String orderNumber,
+            @Param("clientUserId") Integer clientUserId,
+            @Param("lawyerUserId") Integer lawyerUserId,
+            @Param("lawyerName") String lawyerName,
+            @Param("orderStatus") Integer orderStatus,
+            @Param("lawyerUserIds") List<Integer> lawyerUserIds
+    );
 }
 

+ 109 - 0
alien-entity/src/main/resources/mapper/LawyerConsultationOrderMapper.xml

@@ -36,5 +36,114 @@
         created_user_id, updated_time, updated_user_id
     </sql>
 
+    <!-- 訂單VO結果映射,包含律師信息 -->
+    <resultMap id="OrderVOWithLawyerResultMap" type="shop.alien.entity.store.vo.LawyerConsultationOrderVO">
+        <!-- 訂單基本信息 -->
+        <id column="id" property="id" />
+        <result column="order_number" property="orderNumber" />
+        <result column="client_user_id" property="clientUserId" />
+        <result column="lawyer_user_id" property="lawyerUserId" />
+        <result column="problem_scenario_id" property="problemScenarId" />
+        <result column="problem_description" property="problemDescription" />
+        <result column="order_amount" property="orderAmount" />
+        <result column="consultation_fee" property="consultationFee" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="order_status" property="orderStatus" />
+        <result column="payment_status" property="paymentStatus" />
+        <result column="order_time" property="orderTime" />
+        <result column="payment_time" property="paymentTime" />
+        <result column="validity_period" property="validityPeriod" />
+        <result column="rating" property="rating" />
+        <result column="comment" property="comment" />
+        <result column="created_time" property="createdTime" />
+        <!-- 律師信息 -->
+        <result column="lawyer_name" property="lawyerName" />
+        <result column="lawyer_phone" property="lawyerPhone" />
+        <result column="lawyer_email" property="lawyerEmail" />
+        <result column="lawyer_certificate_no" property="lawyerCertificateNo" />
+        <result column="law_firm" property="lawFirm" />
+        <result column="practice_years" property="practiceYears" />
+        <result column="specialty_fields" property="specialtyFields" />
+        <result column="certification_status" property="certificationStatus" />
+        <result column="service_score" property="serviceScore" />
+        <result column="service_count" property="serviceCount" />
+        <result column="lawyer_consultation_fee" property="lawyerConsultationFee" />
+        <result column="province" property="province" />
+        <result column="city" property="city" />
+        <result column="district" property="district" />
+        <result column="address" property="address" />
+        <result column="head_img" property="headImg" />
+        <result column="nick_name" property="nickName" />
+        <result column="personal_introduction" property="personalIntroduction" />
+    </resultMap>
+
+    <!-- 分頁查詢訂單列表,聯查律師信息 -->
+    <select id="getConsultationOrderListWithLawyer" resultMap="OrderVOWithLawyerResultMap">
+        SELECT
+            o.id,
+            o.order_number,
+            o.client_user_id,
+            o.lawyer_user_id,
+            o.problem_scenario_id,
+            o.problem_description,
+            o.order_amount,
+            o.consultation_fee,
+            o.start_time,
+            o.end_time,
+            o.order_status,
+            o.payment_status,
+            o.order_time,
+            o.payment_time,
+            o.validity_period,
+            o.rating,
+            o.comment,
+            o.created_time,
+            -- 律師信息
+            l.name AS lawyer_name,
+            l.phone AS lawyer_phone,
+            l.email AS lawyer_email,
+            l.lawyer_certificate_no,
+            l.law_firm,
+            l.practice_years,
+            l.specialty_fields,
+            l.certification_status,
+            l.service_score,
+            l.service_count,
+            l.consultation_fee AS lawyer_consultation_fee,
+            l.province,
+            l.city,
+            l.district,
+            l.address,
+            l.head_img,
+            l.nick_name,
+            l.personal_introduction
+        FROM lawyer_consultation_order o
+        LEFT JOIN lawyer_user l ON o.lawyer_user_id = l.id AND l.delete_flag = 0
+        WHERE o.delete_flag = 0
+        <if test="orderNumber != null and orderNumber != ''">
+            AND o.order_number = #{orderNumber}
+        </if>
+        <if test="clientUserId != null">
+            AND o.client_user_id = #{clientUserId}
+        </if>
+        <if test="lawyerUserId != null">
+            AND o.lawyer_user_id = #{lawyerUserId}
+        </if>
+        <if test="lawyerUserIds != null and lawyerUserIds.size() > 0">
+            AND o.lawyer_user_id IN
+            <foreach collection="lawyerUserIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        <if test="lawyerName != null and lawyerName != '' and (lawyerUserIds == null or lawyerUserIds.size() == 0)">
+            AND l.name LIKE CONCAT('%', #{lawyerName}, '%')
+        </if>
+        <if test="orderStatus != null">
+            AND o.order_status = #{orderStatus}
+        </if>
+        ORDER BY o.created_time DESC
+    </select>
+
 </mapper>
 

+ 16 - 25
alien-store/src/main/java/shop/alien/store/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -45,42 +45,33 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
                                                                  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);
-        Page<LawyerConsultationOrder> page = new Page<>(pageNum, pageSize);
-        LambdaQueryWrapper<LawyerConsultationOrder> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(LawyerConsultationOrder::getDeleteFlag, 0);
-        if (StringUtils.hasText(orderNumber)) {
-            queryWrapper.eq(LawyerConsultationOrder::getOrderNumber, orderNumber);
-        }
-        if (clientUserId != null) {
-            queryWrapper.eq(LawyerConsultationOrder::getClientUserId, clientUserId);
-        }
-        if (lawyerUserId != null) {
-            queryWrapper.eq(LawyerConsultationOrder::getLawyerUserId, lawyerUserId);
-        }
-        // 按律师姓名搜索
+        
+        // 創建分頁對象
+        Page<LawyerConsultationOrderVO> page = new Page<>(pageNum, pageSize);
+        
+        // 如果按律師姓名搜索,先查詢匹配的律師ID列表
+        List<Integer> lawyerUserIds = null;
         if (StringUtils.hasText(lawyerName)) {
             LambdaQueryWrapper<LawyerUser> lawyerQueryWrapper = new LambdaQueryWrapper<>();
             lawyerQueryWrapper.eq(LawyerUser::getDeleteFlag, 0);
             lawyerQueryWrapper.like(LawyerUser::getName, lawyerName);
             List<LawyerUser> lawyerUsers = lawyerUserService.list(lawyerQueryWrapper);
             if (lawyerUsers != null && !lawyerUsers.isEmpty()) {
-                List<Integer> lawyerUserIds = lawyerUsers.stream()
+                lawyerUserIds = lawyerUsers.stream()
                         .map(LawyerUser::getId)
                         .collect(Collectors.toList());
-                queryWrapper.in(LawyerConsultationOrder::getLawyerUserId, lawyerUserIds);
             } else {
-                // 如果没有找到匹配的律师,返回空结果
-                queryWrapper.eq(LawyerConsultationOrder::getLawyerUserId, -1);
+                // 如果沒有找到匹配的律師,返回空結果
+                Page<LawyerConsultationOrderVO> emptyPage = new Page<>(pageNum, pageSize);
+                emptyPage.setRecords(Collections.emptyList());
+                emptyPage.setTotal(0);
+                return R.data(emptyPage);
             }
         }
-        if (orderStatus != null) {
-            queryWrapper.eq(LawyerConsultationOrder::getOrderStatus, orderStatus);
-        }
-        queryWrapper.orderByDesc(LawyerConsultationOrder::getCreatedTime);
-        IPage<LawyerConsultationOrder> pageResult = this.page(page, queryWrapper);
-
-        // 轉換為VO並填充律師信息
-        IPage<LawyerConsultationOrderVO> voPage = convertToVO(pageResult);
+        
+        // 使用JOIN查詢,直接聯查律師信息
+        IPage<LawyerConsultationOrderVO> voPage = consultationOrderMapper.getConsultationOrderListWithLawyer(
+                page, orderNumber, clientUserId, lawyerUserId, lawyerName, orderStatus, lawyerUserIds);
 
         return R.data(voPage);
     }