Explorar o código

优化分销订单数据展示

zoujiajian hai 7 meses
pai
achega
c9f4b9b394

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

@@ -2,6 +2,7 @@ package com.cyksj.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.dto.UserDistributeOrderDataDto;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.OrderDonCustomerServiceRelate;
 import com.cyksj.model.entity.RealGoodsInterestUser;
@@ -101,4 +102,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	Integer hasPaymentAiGoods(Long userId);
 
 	List<Long> selectTransportOids(@Param("phone") String phone, @Param("receiver") String receiver);
+
+	UserDistributeOrderDataDto selectUserDistributeOrders(@Param("sharedId") Long sharedId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/UserDistributeOrderDataDto.java

@@ -0,0 +1,43 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: UserDistributeOrderDataDto
+ * 创建者: JavaZou
+ * 创建时间:2026/1/21 14:40
+ */
+@Getter
+@Setter
+public class UserDistributeOrderDataDto {
+
+	/**
+	 * 邀请人数
+	 */
+	private Integer inviteNum;
+
+	/**
+	 * 订单数
+	 */
+	private Integer orders;
+
+	/**
+	 * 分销人数
+	 * 其中拉新用户购买一单又退款,且无后续下单动作的不算分销用户,不统计在此字段内
+	 */
+	private Integer distributeUserNum;
+
+	/**
+	 * 分销订单金额(无需产生积分)
+	 */
+	private BigDecimal distributeOrdersMoney;
+
+	/**
+	 * 分销消费占比
+	 */
+	private BigDecimal distributeConsumerRate;
+}

+ 12 - 14
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeViews.java

@@ -17,10 +17,8 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "user_distribute ud left join user_distribute_shared us on ud.user_id = us.shared_id" +
-		" left join order_don od on od.user_id = us.user_id and od.is_fixed_distribute = 1 and od.status not in ('noPayment', 'close') :time:",
-		where = "ud.deleted is true :condition:",
-		groupBy = "ud.id,ud.user_id,ud.business_id,ud.remark,ud.created_time,ud.update_time,ud.business_bind_time,ud.type")
+@SearchBean(tables = ":tb2:",
+		where = "ud.deleted is true :condition:")
 public class UserDistributeViews {
 
 	@DbField("ud.id")
@@ -44,21 +42,21 @@ public class UserDistributeViews {
 	@DbField("ud.type")
 	private String type;
 
-	@DbField("count(od.id)")
-	private Integer orders;
+	@DbIgnore
+	private Integer orders = 0;
 
 	/**
 	 * 分销人数
 	 * 其中拉新用户购买一单又退款,且无后续下单动作的不算分销用户,不统计在此字段内
 	 */
-	@DbField("count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END)")
-	private Integer distributeUserNum;
+	@DbIgnore
+	private Integer distributeUserNum = 0;
 
 	/**
 	 * 邀请人数
 	 */
-	@DbField("count(DISTINCT us.user_id)")
-	private Integer inviteNum;
+	@DbIgnore
+	private Integer inviteNum = 0;
 
 	@DbField("ud.business_bind_time")
 	private Date businessBindTime;
@@ -66,14 +64,14 @@ public class UserDistributeViews {
 	/**
 	 * 分销订单金额(无需产生积分)
 	 */
-	@DbField("(ifnull(sum(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money)),0) - ifnull(sum(od.refund_money),0))")
-	private BigDecimal distributeOrdersMoney;
+	@DbIgnore
+	private BigDecimal distributeOrdersMoney = BigDecimal.ZERO;
 
 	/**
 	 * 分销消费占比
 	 */
-	@DbField("ifnull(cast(count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END)/count(DISTINCT us.user_id) as decimal(10,2)),0)")
-	private BigDecimal distributeConsumerRate;
+	@DbIgnore
+	private BigDecimal distributeConsumerRate = BigDecimal.ZERO;
 
 	/**
 	 * 销量最高的产品

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

@@ -609,4 +609,22 @@
             and receiver = #{receiver}
         </if>
     </select>
+
+    <select id="selectUserDistributeOrders" resultType="com.cyksj.model.dto.UserDistributeOrderDataDto">
+        select
+        count(DISTINCT us.user_id) as inviteNum,
+        count(od.id) as orders,
+        count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END) as distributeUserNum,
+        (ifnull(sum(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money)),0) - ifnull(sum(od.refund_money),0)) as
+        distributeOrdersMoney,
+        ifnull(cast(count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END)/count(DISTINCT
+        us.user_id) as decimal(10,2)),0) as distributeConsumerRate
+        from user_distribute_shared us left join order_don od on od.user_id = us.user_id and od.is_fixed_distribute = 1
+        and od.status not in ('noPayment', 'close')
+        <if test="startTime != null">
+            and od.created_time >= #{startTime}
+            and od.created_time &lt; #{endTime}
+        </if>
+        where us.shared_id = #{sharedId}
+    </select>
 </mapper>

+ 45 - 13
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -23,6 +23,7 @@ import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubMapper;
+import com.cyksj.model.dto.UserDistributeOrderDataDto;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.BusinessDistributeDefaultRateDetailReq;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
@@ -298,9 +299,40 @@ public class DistributeController {
 	 * 固定推广者列表
 	 */
 	@GetMapping
-	public Result<SearchResult<UserDistributeViews>> distributeList(String nickname, String showId, String startTime, String endTime, Boolean isSpecialEp) {
+	public Result<SearchResult<UserDistributeViews>> distributeList(Long userId, String nickname, String showId, String startTime, String endTime, Boolean isSpecialEp, String sort, String order) {
 		long adminId = StpUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		String tb2 = "user_distribute ud";
+		builder.put("tb2", tb2);
+		if (userId != null) {
+			builder.field(UserDistributeViews::getUserId, userId);
+		} else {
+			if ((StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) || (StrUtil.isNotBlank(sort) && List.of("inviteNum", "orders", "distributeUserNum", "distributeOrdersMoney", "distributeConsumerRate").contains(sort))) {
+				tb2 = "select ud.* " +
+						" from user_distribute ud left join user_distribute_shared us on us.shared_id = ud.user_id left join order_don od on od.user_id = us.user_id and od.is_fixed_distribute = 1" +
+						" and od.status not in ('noPayment', 'close')";
+				if (StrUtil.isNotBlank(startTime)) {
+					tb2 += String.format(" and od.created_time >= '%s' and od.created_time < '%s'", startTime, endTime);
+				}
+				tb2 += " where ud.deleted group by ud.id,ud.user_id,ud.business_id,ud.remark,ud.created_time,ud.update_time,ud.business_bind_time,ud.type";
+				if ("inviteNum".equals(sort)) {
+					tb2 += String.format(" order by count(DISTINCT us.user_id) %s", order);
+				}
+				if ("orders".equals(sort)) {
+					tb2 += String.format(" order by count(od.id) %s", order);
+				}
+				if ("distributeUserNum".equals(sort)) {
+					tb2 += String.format(" order by count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END) %s", order);
+				}
+				if ("distributeOrdersMoney".equals(sort)) {
+					tb2 += String.format(" order by (ifnull(sum(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money)),0) - ifnull(sum(od.refund_money),0)) %s", order);
+				}
+				if ("distributeConsumerRate".equals(sort)) {
+					tb2 += String.format(" order by (ifnull(cast(count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END)/count(DISTINCT us.user_id) as decimal(10,2)),0)) %s", order);
+				}
+				builder.put("tb2", String.format("(%s) ud", tb2));
+			}
+		}
 		//是否是商务人员
 		if (userBusinessRateService.isBusiness(adminId)) {
 			builder.field(UserDistributeViews::getBusinessId, adminId);
@@ -314,27 +346,27 @@ public class DistributeController {
 				builder.field(UserDistributeViews::getUserId, userIds).op(Operator.InList);
 			}
 		}
-		String timeSql = StrUtil.EMPTY;
-		if (StrUtil.isNotBlank(startTime)) {
-			timeSql += String.format("and od.created_time >= '%s'", startTime);
-		}
-		if (StrUtil.isNotBlank(endTime)) {
-			timeSql += String.format("and od.created_time < '%s'", endTime);
-		}
-		if (StrUtil.isNotBlank(timeSql)) {
-			builder.put("time", timeSql);
-			//按时间筛选 固定推广人分销情况 倒序
-			builder.orderBy(UserDistributeViews::getDistributeOrdersMoney).desc();
-		}
 		if (isSpecialEp != null) {
 			//是否是特殊设备分销渠道商
 			String condition = String.format(" and %s (select 1 from user_distribute_equipment up where up.distribute_id = ud.id limit 1)", isSpecialEp ? "exists" : "not exists");
 			builder.put("condition", condition);
 		}
+
 		Map<Long, String> businessNameMap = new ConcurrentHashMap<>();
 		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class,
 				builder.build());
 		search.getDataList().forEach(view -> {
+			//查询订单数据
+			Long dsUserId = view.getUserId();
+			UserDistributeOrderDataDto orderDataDto = orderDonMapper.selectUserDistributeOrders(dsUserId, startTime, endTime);
+			if (orderDataDto != null) {
+				view.setInviteNum(orderDataDto.getInviteNum());
+				view.setOrders(orderDataDto.getOrders());
+				view.setDistributeOrdersMoney(orderDataDto.getDistributeOrdersMoney());
+				view.setDistributeConsumerRate(orderDataDto.getDistributeConsumerRate());
+				view.setDistributeUserNum(orderDataDto.getDistributeUserNum());
+			}
+
 			if (view.getDistributeOrdersMoney().compareTo(BigDecimal.ZERO) > 0) {
 				Optional.ofNullable(userDistributeMapper.selectSoldMaxGoods(view.getUserId())).ifPresent(title -> view.setGoodsTitle(title));
 			}