Просмотр исходного кода

优化我的评价接口,将其循环调用数据库的方法优化

liu 2 месяцев назад
Родитель
Сommit
4fc0a7a49a

+ 2 - 0
src/main/java/com/sqx/modules/errand/dao/TbIndentDao.java

@@ -59,6 +59,8 @@ public interface TbIndentDao extends BaseMapper<TbIndent> {
 
     TbIndent selectIndentByIndentNumber(String indentNumber);
 
+    List<TbIndent> selectIndentByIndentNumbers(@Param("indentNumbers") List<String> indentNumbers);
+
     void updateRiderBalance(BigDecimal balance, Long userId);
 
     void userDelivery(Long userId, String indentNumber, String date);

+ 2 - 0
src/main/java/com/sqx/modules/errand/service/TbIndentService.java

@@ -81,6 +81,8 @@ public interface TbIndentService extends IService<TbIndent> {
 
     TbIndent findIndentByIndentNumber(String orderId);
 
+    List<TbIndent> findIndentsByIndentNumbers(List<String> indentNumbers);
+
     Result findAllIndent(String indentType, String phone, String indentState, Integer page, Integer limit, String date, String dateType, String riderPhone);
 
     Result findAllIndents(String indentType, String phone, String indentState, Integer page, Integer limit, String date, String dateType, String riderPhone);

+ 60 - 6
src/main/java/com/sqx/modules/errand/service/impl/ErrandEvaluateServiceImpl.java

@@ -1,10 +1,14 @@
 package com.sqx.modules.errand.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.Result;
+import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.errand.dao.ErrandEvaluateDao;
 import com.sqx.modules.errand.dao.TbIndentDao;
@@ -17,8 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class ErrandEvaluateServiceImpl extends ServiceImpl<ErrandEvaluateDao, ErrandEvaluate> implements ErrandEvaluateService {
@@ -55,14 +59,64 @@ public class ErrandEvaluateServiceImpl extends ServiceImpl<ErrandEvaluateDao, Er
 
     @Override
     public Result selectEvaluate(Integer page, Integer limit,String nickName,String riderName,Long userId,Long riderUserId,String satisfactionFlag,String indentNumber) {
+        // 参数校验
+        if (page == null || page < 1) {
+            page = 1;
+        }
+        if (limit == null || limit < 1) {
+            limit = 10;
+        }
+        
         Page<ErrandEvaluate> pages = new Page<>(page, limit);
         IPage<ErrandEvaluate> evaluateIPage = baseMapper.selectEvaluateList(pages, nickName, riderName, userId,riderUserId, satisfactionFlag, indentNumber);
         List<ErrandEvaluate> records = evaluateIPage.getRecords();
-        for(ErrandEvaluate evaluate:records){
-            evaluate.setUser(userService.getById(evaluate.getUserId()));
-            evaluate.setRiderUser(userService.getById(evaluate.getRiderUserId()));
-            evaluate.setIndent(indentService.findIndentByIndentNumber(evaluate.getIndentNumber()));
+//        校验参数
+        if (ObjectUtils.isNotEmpty(records)) {
+            // 批量查询用户信息
+            List<Long> userList = records.stream().map(ErrandEvaluate::getUserId).collect(Collectors.toList());
+            Map<Long, UserEntity> userMap = new HashMap<>();
+            if (userList.size()>0) {
+                LambdaQueryWrapper<UserEntity> wrapper=new LambdaQueryWrapper<>();
+                wrapper.in(UserEntity::getUserId,userList);
+                List<UserEntity> users = userService.list(wrapper);
+                userMap = users.stream().collect(Collectors.toMap(
+                        UserEntity::getUserId,
+                        user -> user
+                ));
+            }
+
+            // 批量查询骑手信息(riderUserId 也是用户表中的ID)
+            List<Long> riderUserList = records.stream().map(ErrandEvaluate::getRiderUserId).collect(Collectors.toList());
+            Map<Long, UserEntity> riderUserMap = new HashMap<>();
+            if (riderUserList.size()>0) {
+                LambdaQueryWrapper<UserEntity> wrapperR=new LambdaQueryWrapper<>();
+                wrapperR.in(UserEntity::getUserId,riderUserList);
+                List<UserEntity> riderUsers = userService.list(wrapperR);
+                riderUserMap = riderUsers.stream().collect(Collectors.toMap(
+                        UserEntity::getUserId,
+                        rider -> rider
+                ));
+            }
+
+            // 批量查询订单信息
+            List<String> indentNumberList = records.stream().map(ErrandEvaluate::getIndentNumber).collect(Collectors.toList());
+            Map<String, TbIndent> indentMap = new HashMap<>();
+            if (indentNumberList.size()>0) {
+                List<TbIndent> indents = indentService.findIndentsByIndentNumbers(indentNumberList);
+                indentMap = indents.stream().collect(Collectors.toMap(
+                        TbIndent::getIndentNumber,
+                        indent -> indent
+                ));
+            }
+
+            // 设置关联信息
+            for(ErrandEvaluate evaluate:records){
+                evaluate.setUser(userMap.get(evaluate.getUserId()));
+                evaluate.setRiderUser(riderUserMap.get(evaluate.getRiderUserId()));
+                evaluate.setIndent(indentMap.get(evaluate.getIndentNumber()));
+            }
         }
+
         return Result.success().put("data", evaluateIPage);
     }
 

+ 5 - 0
src/main/java/com/sqx/modules/errand/service/impl/TbIndentServiceImpl.java

@@ -965,6 +965,11 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
     }
 
     @Override
+    public List<TbIndent> findIndentsByIndentNumbers(List<String> indentNumbers) {
+        return baseMapper.selectIndentByIndentNumbers(indentNumbers);
+    }
+
+    @Override
     public PageUtils findNewIndent(WaitForAcceptOrderQueryDTO queryDTO) {
         Page<TbIndent> pages = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
 

+ 10 - 0
src/main/resources/mapper/errand/TbIndentMapper.xml

@@ -293,6 +293,16 @@
         where indent_number = #{indentNumber}
     </select>
 
+    <select id="selectIndentByIndentNumbers" resultType="com.sqx.modules.errand.entity.TbIndent">
+        select ti.*, t.nick_name as nickName, t.avatar
+        from tb_indent ti
+                 LEFT JOIN tb_user t on ti.user_id = t.user_id
+        where indent_number in
+        <foreach collection="indentNumbers" item="indentNumber" index="index" open="(" separator="," close=")">
+            #{indentNumber}
+        </foreach>
+    </select>
+
 
     <update id="updateRiderBalance">
         update tb_user