Browse Source

Merge branch 'dev' into 'mp-server-test'

用户盲票订单慢SQL优化

See merge request quanshu/mp-server!732
jiang hao 2 years ago
parent
commit
715a3405d0

+ 90 - 32
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java

@@ -1,13 +1,16 @@
 package com.qs.mp.web.controller.api.admin;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.excel.UserTicketOrderExcel;
 import com.qs.mp.admin.domain.excel.UserTicketOrderItemExcel;
 import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
 import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderItemVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
+import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
@@ -17,6 +20,8 @@ import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.excel.DeliverOrderExcel;
@@ -60,6 +65,12 @@ public class UserTicketOrderMgrController extends BaseApiController {
     @Autowired
     private IUserTicketOrderItemService userTicketOrderItemService;
 
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private ITicketBoxService ticketBoxService;
+
     @PostMapping("/list")
     @PreAuthorize("@ss.hasPermi('order:userTicket:list')")
     @ApiOperation("用户盲票订单列表")
@@ -67,31 +78,51 @@ public class UserTicketOrderMgrController extends BaseApiController {
             @ApiResponse(code = 200, message = "成功", response = UserTicketOrderListVO.class)
     )
     public TableDataInfo list(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
-        startPage();
-        QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+
+        LambdaQueryWrapper<UserTicketOrder> userTicketOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+
         if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
-            queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
-        }
-        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
-            queryWrapper.eq("t3.type", userTicketOrderQueryParam.getBoxType());
-        }
-        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
-            queryWrapper.eq("t2.phonenumber", userTicketOrderQueryParam.getPhone());
+            userTicketOrderLambdaQueryWrapper.like(UserTicketOrder::getTitle, userTicketOrderQueryParam.getBoxTitle());
         }
         if (Objects.nonNull(userTicketOrderQueryParam.getStatus())) {
-            queryWrapper.eq("t1.status", userTicketOrderQueryParam.getStatus());
+            userTicketOrderLambdaQueryWrapper.eq(UserTicketOrder::getStatus, userTicketOrderQueryParam.getStatus());
         }
         if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
-            queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+            userTicketOrderLambdaQueryWrapper.between(UserTicketOrder::getCreatedTime, userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
         }
         if (Objects.nonNull(userTicketOrderQueryParam.getChannelId()) && userTicketOrderQueryParam.getChannelId() != 0) {
-            queryWrapper.eq("t1.channel_id", userTicketOrderQueryParam.getChannelId());
+            userTicketOrderLambdaQueryWrapper.eq(UserTicketOrder::getChannelId, userTicketOrderQueryParam.getChannelId());
+        }
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            SysUser sysUser = sysUserService.selectUserByPhoneNumber(userTicketOrderQueryParam.getPhone());
+            if (sysUser != null) {
+                userTicketOrderLambdaQueryWrapper.eq(UserTicketOrder::getUserId, sysUser.getUserId());
+            }
         }
 
-        queryWrapper.orderByDesc("t1.created_time");
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            List<TicketBox> ticketBoxList = ticketBoxService.list(new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, userTicketOrderQueryParam.getBoxType()));
+            if (CollectionUtils.isNotEmpty(ticketBoxList)) {
+                List<String> boxIds = ticketBoxList.stream().map(TicketBox::getBoxId).collect(Collectors.toList());
+                userTicketOrderLambdaQueryWrapper.in(UserTicketOrder::getBoxId, boxIds);
+            }
+        }
+
+        userTicketOrderLambdaQueryWrapper.orderByDesc(UserTicketOrder::getCreatedTime);
+
+        startPage();
+        List<UserTicketOrder> userTicketOrderList = userTicketOrderService.list(userTicketOrderLambdaQueryWrapper);
+
 
-        List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
-        return getDataTable(list);
+        if (CollectionUtils.isNotEmpty(userTicketOrderList)) {
+            List<String> orderIds = userTicketOrderList.stream().map(UserTicketOrder::getOrderId).collect(Collectors.toList());
+            QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("t1.order_id",orderIds);
+            queryWrapper.orderByDesc("t1.created_time");
+            List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
+            return getDataTable(list);
+        }
+        return getDataTable(userTicketOrderList);
     }
 
     @PostMapping("/detail/{orderId}")
@@ -121,44 +152,71 @@ public class UserTicketOrderMgrController extends BaseApiController {
             return AjaxResult.error("导出的数据不能超过31天");
         }
 
-        QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+
+
+        LambdaQueryWrapper<UserTicketOrder> userTicketOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+
         if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
-            queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
-        }
-        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
-            queryWrapper.eq("t3.type", userTicketOrderQueryParam.getBoxType());
-        }
-        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
-            queryWrapper.eq("t2.phonenumber", userTicketOrderQueryParam.getPhone());
+            userTicketOrderLambdaQueryWrapper.like(UserTicketOrder::getTitle, userTicketOrderQueryParam.getBoxTitle());
         }
         if (Objects.nonNull(userTicketOrderQueryParam.getStatus())) {
-            queryWrapper.eq("t1.status", userTicketOrderQueryParam.getStatus());
+            userTicketOrderLambdaQueryWrapper.eq(UserTicketOrder::getStatus, userTicketOrderQueryParam.getStatus());
         }
         if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
-            queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+            userTicketOrderLambdaQueryWrapper.between(UserTicketOrder::getCreatedTime, userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
         }
         if (Objects.nonNull(userTicketOrderQueryParam.getChannelId()) && userTicketOrderQueryParam.getChannelId() != 0) {
-            queryWrapper.eq("t1.channel_id", userTicketOrderQueryParam.getChannelId());
+            userTicketOrderLambdaQueryWrapper.eq(UserTicketOrder::getChannelId, userTicketOrderQueryParam.getChannelId());
         }
-        queryWrapper.orderByDesc("t1.created_time");
-        int totalSize = userTicketOrderService.countUserTicketOrder(queryWrapper);
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            SysUser sysUser = sysUserService.selectUserByPhoneNumber(userTicketOrderQueryParam.getPhone());
+            if (sysUser != null) {
+                userTicketOrderLambdaQueryWrapper.eq(UserTicketOrder::getUserId, sysUser.getUserId());
+            }
+        }
+
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            List<TicketBox> ticketBoxList = ticketBoxService.list(new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, userTicketOrderQueryParam.getBoxType()));
+            if (CollectionUtils.isNotEmpty(ticketBoxList)) {
+                List<String> boxIds = ticketBoxList.stream().map(TicketBox::getBoxId).collect(Collectors.toList());
+                userTicketOrderLambdaQueryWrapper.in(UserTicketOrder::getBoxId, boxIds);
+            }
+        }
+
+        userTicketOrderLambdaQueryWrapper.orderByDesc(UserTicketOrder::getCreatedTime);
+
+        int totalSize = userTicketOrderService.count(userTicketOrderLambdaQueryWrapper);
         if (totalSize == 0) {
             return AjaxResult.error("没有符合条件的用户订单");
         }
+
         int pageSize = 2000;
         List<UserTicketOrderListVO> userTicketOrderListVOList = new ArrayList<>();
         if (totalSize > pageSize) {
             int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
             for (int i = 0; i < totalPage; i++) {
-                queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
-                List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
-                if (CollectionUtils.isNotEmpty(list)) {
+                userTicketOrderLambdaQueryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+                List<UserTicketOrder> userTicketOrderList = userTicketOrderService.list(userTicketOrderLambdaQueryWrapper);
+                if (CollectionUtils.isNotEmpty(userTicketOrderList)) {
+                    List<String> orderIds = userTicketOrderList.stream().map(UserTicketOrder::getOrderId).collect(Collectors.toList());
+                    QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.in("t1.order_id",orderIds);
+                    queryWrapper.orderByDesc("t1.created_time");
+                    List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
                     userTicketOrderListVOList.addAll(list);
                 }
             }
         } else {
-            userTicketOrderListVOList = userTicketOrderService.listUserTicketOrder(queryWrapper);
+            List<UserTicketOrder> userTicketOrderList = userTicketOrderService.list(userTicketOrderLambdaQueryWrapper);
+            if (CollectionUtils.isNotEmpty(userTicketOrderList)) {
+                List<String> orderIds = userTicketOrderList.stream().map(UserTicketOrder::getOrderId).collect(Collectors.toList());
+                QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+                queryWrapper.in("t1.order_id", orderIds);
+                queryWrapper.orderByDesc("t1.created_time");
+                userTicketOrderListVOList = userTicketOrderService.listUserTicketOrder(queryWrapper);
+            }
         }
+
         List<UserTicketOrderExcel> excelList = userTicketOrderListVOList.stream().map(userTicketOrderListVO -> {
             UserTicketOrderExcel userTicketOrderExcel = new UserTicketOrderExcel();
             BeanUtils.copyProperties(userTicketOrderListVO, userTicketOrderExcel);

+ 8 - 0
mp-service/src/main/java/com/qs/mp/system/mapper/SysUserMapper.java

@@ -152,4 +152,12 @@ public interface SysUserMapper  extends BaseMapper<SysUser>
      * @return
      */
     List<SysUser> selectUserListByRand(@Param("userType") String userType,@Param("num") int num);
+
+    /**
+     * 根据手机号获取用户信息
+     * @param phone
+     * @return
+     */
+    SysUser selectUserByPhoneNumber(@Param("phone") String phone);
+
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/system/service/ISysUserService.java

@@ -229,4 +229,11 @@ public interface ISysUserService  extends IService<SysUser>
      * @return
      */
     List<SysUser> selectUserListByRand(String userType, int num);
+
+    /**
+     * 根据手机号查询用户信息
+     * @param phone
+     * @return
+     */
+    SysUser selectUserByPhoneNumber(String phone);
 }

+ 5 - 0
mp-service/src/main/java/com/qs/mp/system/service/impl/SysUserServiceImpl.java

@@ -577,4 +577,9 @@ public class SysUserServiceImpl  extends ServiceImpl<SysUserMapper, SysUser> imp
     public List<SysUser> selectUserListByRand(String userType, int num) {
         return userMapper.selectUserListByRand(userType, num);
     }
+
+    @Override
+    public SysUser selectUserByPhoneNumber(String phone) {
+        return userMapper.selectUserByPhoneNumber(phone);
+    }
 }

+ 6 - 0
mp-service/src/main/resources/mapper/system/SysUserMapper.xml

@@ -243,4 +243,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			order by rand()
 			LIMIT #{num};
     </select>
+
+	<select id="selectUserByPhoneNumber" resultMap="SysUserResult">
+		select *
+		from sys_user
+		where phonenumber = #{phone}
+    </select>
 </mapper>