Browse Source

fix 用户查询、渠道查询慢sql

zoujiajian 3 years ago
parent
commit
17697cd891

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -6,6 +6,7 @@ import com.cyksj.model.entity.RealGoodsInterestUser;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.views.BrokenLineObjView;
+import com.cyksj.model.views.ChannelPopularizeView;
 import com.cyksj.model.views.ChannelStatisticsView;
 import org.apache.ibatis.annotations.Param;
 
@@ -38,4 +39,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	ChannelStatisticsView selectChannelStatistics(@Param("first") String first, @Param("end") String end);
 
 	Integer selectCouponCodeUserNum(@Param("dsPopularizeId") Long dsPopularizeId, @Param("noOrderAllStatus") List<String> noOrderAllStatus);
+
+	ChannelPopularizeView countPopularizeOrderDetail(@Param("popularizeId") Long popularizeId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

+ 2 - 3
netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java

@@ -15,8 +15,7 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "user u left join user_distribute_shared usd on usd.user_id = u.id" +
-        " left join user_bind_phone up on up.user_id = u.id" +
+@SearchBean(tables = "user u left join user_bind_phone up on up.user_id = u.id" +
         " left join channel_popularize cp on cp.id = u.popularize_id" +
         " left join channel c on c.id = cp.channel_id",
 where = ":otherPhone:")
@@ -94,7 +93,7 @@ public class UserView {
     /**
      * 邀请人id
      */
-    @DbField("usd.shared_id")
+    @DbIgnore
     private Long sharedId;
 
     /**

+ 5 - 8
netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeView.java

@@ -16,9 +16,6 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "channel_popularize cp " +
-        " LEFT JOIN order_don o on cp.id = o.popularize_id :time: " +
-        " LEFT JOIN order_don o1 on o.id = o1.id and o1.`status` not in ('close','noPayment') " +
-        " LEFT JOIN order_don o2 on o.id = o2.id and o2.`status` = 'refund' " +
         " LEFT JOIN channel c on c.id = cp.channel_id "
         ,groupBy = "cp.id,cp.name,cp.url,cp.modality,cp.pay_method,cp.created_time,cp.update_time"
 )
@@ -72,7 +69,7 @@ public class ChannelPopularizeView {
     /**
      * 浏览数
      */
-    @DbField("select count(v.id) from channel_popularize_visit v where v.popularize_id = cp.id :visitTime:")
+    @DbIgnore
     private Integer visit;
 
     /**
@@ -101,25 +98,25 @@ public class ChannelPopularizeView {
     /**
      * 订单数
      */
-    @DbField("count(o1.id)")
+    @DbIgnore
     private Integer orderCount;
 
     /**
      * 订单金额
      */
-    @DbField("IFNULL(sum(o1.money),0)")
+    @DbIgnore
     private BigDecimal orderMoney;
 
     /**
      * 退款订单数
      */
-    @DbField("count(o2.id)")
+    @DbIgnore
     private Integer refundCount;
 
     /**
      * 退款金额
      */
-    @DbField("IFNULL(sum(o2.money),0)")
+    @DbIgnore
     private BigDecimal refundMoney;
 
     @DbField("cp.created_time")

+ 26 - 0
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -142,4 +142,30 @@
             #{item}
         </foreach>
     </select>
+
+    <select id="countPopularizeOrderDetail" resultType="com.cyksj.model.views.ChannelPopularizeView">
+        select *
+        from (select count(*) as orderCount, ifnull(sum(money),0) as orderMoney
+        from order_don
+        where popularize_id = #{popularizeId}
+        <if test="startTime != null and startTime != ''">
+            and created_time >= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and created_time &lt; #{endTime}
+        </if>
+        and status not in ('close', 'noPayment')) s1
+        ,
+        (select count(*) as refundCount, ifnull(sum(money),0) as refundMoney
+        from order_don
+        where popularize_id = #{popularizeId}
+        <if test="startTime != null and startTime != ''">
+            and created_time >= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and created_time &lt; #{endTime}
+        </if>
+        and status = 'refund')
+        s2
+    </select>
 </mapper>

+ 14 - 9
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -1,16 +1,14 @@
 package com.cyksj.web.controller.manage;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.UserMapper;
-import com.cyksj.model.entity.GroupsRelation;
-import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserTicketClearedRecord;
+import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.UserView;
 import com.cyksj.model.views.RenewalView;
 import com.cyksj.service.relation.GroupRelationClearService;
@@ -51,6 +49,8 @@ public class CmsUserController{
 
     private final GroupRelationFrontService groupRelationFrontService;
 
+    private final UserDistributeSharedMapper userDistributeSharedMapper;
+
 
     @GetMapping("/get")
     @SaCheckPermission("user:view")
@@ -62,11 +62,16 @@ public class CmsUserController{
         SearchResult<UserView> search = beanSearcher.search(UserView.class, builder.build());
         search.getDataList().forEach((userView)->{
             userView.setAccountNum(relationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getUserId,userView.getId())));
-            if (userView.getSharedId() != null) {
-                User user = userMapper.selectById(userView.getSharedId());
-                if (user != null) {
-                    userView.setSharedNickName(user.getNickname());
-                    userView.setSharedHeadimgurl(user.getHeadimgurl());
+            UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class)
+                    .eq(UserDistributeShared::getUserId, userView.getId()).last("limit 1"));
+            if (userDistributeShared != null) {
+                userView.setSharedId(userDistributeShared.getSharedId());
+                if (userView.getSharedId() != null) {
+                    User user = userMapper.selectById(userView.getSharedId());
+                    if (user != null) {
+                        userView.setSharedNickName(user.getNickname());
+                        userView.setSharedHeadimgurl(user.getHeadimgurl());
+                    }
                 }
             }
         });

+ 16 - 13
netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java

@@ -1,13 +1,16 @@
 package com.cyksj.web.controller.manage.channel;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.channel.ChannelPopularizeVisitMapper;
 import com.cyksj.model.entity.ChannelPopularize;
+import com.cyksj.model.entity.ChannelPopularizeVisit;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.views.ChannelPopularizeDetailView;
@@ -44,23 +47,13 @@ public class CmsChannelPopularizeController {
 
     private final OrderDonMapper orderDonMapper;
 
+    private final ChannelPopularizeVisitMapper visitMapper;
+
     @GetMapping
     @SaCheckPermission("promotion:view")
-    public Result<SearchResult<ChannelPopularizeView>> get(String startTime, String endTime){
-        String timeSql = StringUtils.EMPTY;
-        String visitTimeSql = StringUtils.EMPTY;
-        if (StringUtils.isNotBlank(startTime)) {
-            timeSql += String.format(" and o.created_time >= '%s'", startTime);
-            visitTimeSql += String.format(" and v.created_time >= '%s'", startTime);
-        }
-        if (StringUtils.isNotBlank(endTime)) {
-            timeSql += String.format(" and o.created_time <= '%s'", endTime);
-            visitTimeSql += String.format(" and v.created_time <= '%s'", endTime);
-        }
+    public Result<SearchResult<ChannelPopularizeView>> get(String startTime, String endTime) {
         SearchResult<ChannelPopularizeView> searchResult = beanSearcher.search(ChannelPopularizeView.class,
                 MapUtils.flatBuilder(request.getParameterMap())
-                        .put("time", timeSql)
-                        .put("visitTime", visitTimeSql)
                         .build());
         searchResult.getDataList().forEach(data -> {
             Integer emailCount = userMapper.selectCount(Wrappers.lambdaQuery(User.class)
@@ -82,6 +75,16 @@ public class CmsChannelPopularizeController {
                     .eq(OrderDon::getIsWebPay, true)
                     .notIn(OrderDon::getStatus, Constant.noOrderStatus));
             data.setNumOfOrderWebPay(numOfOrderWebPay);
+            ChannelPopularizeView channelPopularizeView = orderDonMapper.countPopularizeOrderDetail(data.getId(), startTime, endTime);
+            data.setOrderCount(channelPopularizeView.getOrderCount());
+            data.setOrderMoney(channelPopularizeView.getOrderMoney());
+            data.setRefundCount(channelPopularizeView.getRefundCount());
+            data.setRefundMoney(channelPopularizeView.getRefundMoney());
+            Integer visitCount = visitMapper.selectCount(Wrappers.lambdaQuery(ChannelPopularizeVisit.class)
+                    .eq(ChannelPopularizeVisit::getPopularizeId, data.getId())
+                    .ge(StrUtil.isNotEmpty(startTime), ChannelPopularizeVisit::getCreatedTime, startTime)
+                    .lt(StrUtil.isNotEmpty(endTime), ChannelPopularizeVisit::getCreatedTime, endTime));
+            data.setVisit(visitCount);
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(searchResult);
     }