Quellcode durchsuchen

add 用户新增数据、渠道订单数据折线图;

zoujiajian vor 3 Jahren
Ursprung
Commit
a123a04b88

+ 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.ChannelStatisticsView;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -33,4 +34,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	BrokenLineObjView selectPlatBrokenLineMoney(@Param("first") String first, @Param("end") String end);
 
 	BrokenLineObjView selectPersonDistributeBrokenLine(@Param("userId") Long userId, @Param("first") String first, @Param("end") String end);
+
+	ChannelStatisticsView selectChannelStatistics(@Param("first") String first, @Param("end") String end);
 }

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ChannelCommonView.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ChannelCommonView
+ *创建者: JavaZou
+ *创建时间:2023/3/31 16:40
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don od",
+		where = ":type: and  od.status not in ('noPayment','close','refund')"
+		, groupBy = "date_format(od.created_time,'%Y-%m-%d')")
+public class ChannelCommonView {
+
+	/**
+	 * 当前日期订单金额
+	 */
+	@DbField("cast(sum(od.money)/100 as decimal(10,2))")
+	private BigDecimal money;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(od.created_time,'%Y-%m-%d')")
+	private String date;
+}

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ChannelStatisticsView.java

@@ -0,0 +1,37 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: ChannelStatisticsView
+ *创建者: JavaZou
+ *创建时间:2023/3/31 16:18
+ */
+@Getter
+@Setter
+@SearchBean
+public class ChannelStatisticsView {
+	private String firstDate;
+
+	private String lastDate;
+
+	/**
+	 * 自然渠道
+	 */
+	private List<ChannelCommonView> natureChannelData;
+
+	/**
+	 * 普通推广渠道
+	 */
+	private List<ChannelCommonView> generalPopularizeChannelData;
+
+	/**
+	 * 固定推广渠道
+	 */
+	private List<ChannelCommonView> distributeChannelData;
+}

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersView.java

@@ -17,7 +17,7 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "order_don od inner join distribute_waiting_send_points dp on dp.order_id = od.id",
-		where = "od.is_distribute is true and od.status not in ('close','noPayment')")
+		where = "od.is_distribute is true and od.status not in ('close','noPayment','refund')")
 public class DistributeOrdersView {
 	@DbField("od.id")
 	private Long id;

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/views/NewAllUserView.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: NewAllUserView
+ *创建者: JavaZou
+ *创建时间:2023/4/3 10:23
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user",
+		groupBy = "date_format(created_time,'%Y-%m-%d')")
+public class NewAllUserView {
+	/**
+	 * 所有新增用户数
+	 */
+	@DbField("count(*)")
+	private Integer numOfAllNewUser;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(created_time,'%Y-%m-%d')")
+	private String date;
+}

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/views/NewCorpUserView.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: NewCorpUserView
+ *创建者: JavaZou
+ *创建时间:2023/4/3 10:09
+ */
+@Getter
+@Setter
+@SearchBean(tables = "corp_user_auth",
+		groupBy = "date_format(created_time,'%Y-%m-%d')")
+public class NewCorpUserView {
+	/**
+	 * 企业新增用户数
+	 */
+	@DbField("count(*)")
+	private Integer numOfUser;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(created_time,'%Y-%m-%d')")
+	private String date;
+}

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/views/NewDistributeUserView.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: NewDistributeUserView
+ *创建者: JavaZou
+ *创建时间:2023/4/3 10:06
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute_shared",
+		groupBy = "date_format(created_time,'%Y-%m-%d')")
+public class NewDistributeUserView {
+	/**
+	 * 分销新增用户数
+	 */
+	@DbField("count(*)")
+	private Integer numOfUser;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(created_time,'%Y-%m-%d')")
+	private String date;
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/views/NewPcUserView.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: NewPcUserView
+ *创建者: JavaZou
+ *创建时间:2023/4/3 9:59
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user",
+		where = "(login_phone != '' or email != '')"
+		, groupBy = "date_format(created_time,'%Y-%m-%d')")
+public class NewPcUserView {
+	/**
+	 * 当前日期订单金额
+	 */
+	@DbField("count(*)")
+	private Integer numOfUser;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(created_time,'%Y-%m-%d')")
+	private String date;
+}

+ 40 - 0
netflix-dao/src/main/java/com/cyksj/model/views/NewUserStatisticsView.java

@@ -0,0 +1,40 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: NewUserStatisticsView
+ *创建者: JavaZou
+ *创建时间:2023/4/3 9:51
+ */
+@Getter
+@Setter
+public class NewUserStatisticsView {
+	private String firstDate;
+
+	private String lastDate;
+
+	/**
+	 * h5新增用户数
+	 */
+	private List<NewUserView> newUserData;
+
+	/**
+	 * pc端新增用户数
+	 */
+	private List<NewPcUserView> newPcUserData;
+
+	/**
+	 * 分销新增用户数
+	 */
+	private List<NewDistributeUserView> newDistributeUserData;
+
+	/**
+	 * 企业微信新增用户数
+	 */
+	private List<NewCorpUserView> newCorpUserData;
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/views/NewUserView.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: NewUserCommonView
+ *创建者: JavaZou
+ *创建时间:2023/4/3 9:54
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user",
+		where = "unionid != ''",
+		groupBy = "date_format(created_time,'%Y-%m-%d')")
+public class NewUserView {
+	/**
+	 * h5新增用户数
+	 */
+	@DbField("count(distinct unionid)")
+	private Integer numOfUser;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(created_time,'%Y-%m-%d')")
+	private String date;
+}

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/views/PersonDistributeBrokenLineView.java

@@ -5,6 +5,8 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: PersonDistributeBrokenLineView
@@ -32,6 +34,12 @@ public class PersonDistributeBrokenLineView {
 	@DbField("count(od.id)")
 	private Integer orderNum;
 
+	/**
+	 * 当前日期订单金额
+	 */
+	@DbField("cast(sum(od.money)/100 as decimal(10,2))")
+	private BigDecimal money;
+
 	/**
 	 * 日期
 	 */

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/views/PlatOrderDonBrokenLineView.java

@@ -29,7 +29,7 @@ public class PlatOrderDonBrokenLineView {
 	private String goodsTitle;
 
 	/**
-	 * 当前日期订单
+	 * 当前日期订单金额
 	 */
 	@DbField("cast(sum(od.money)/100 as decimal(10,2))")
 	private BigDecimal money;

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

@@ -118,4 +118,20 @@
             and curdate &lt;= #{end}
         </if>
     </select>
+
+    <select id="selectChannelStatistics" resultType="com.cyksj.model.views.ChannelStatisticsView">
+        select min(curdate) as firstDate,
+        max(curdate) as lastDate
+        from (select cast(sum(od.money)/100 as decimal(10,2)) as curdateMoney,
+        date_format(od.created_time,'%Y-%m-%d') curdate from order_don od
+        where od.status not in ('noPayment','close','refund')
+        group by date_format(od.created_time,'%Y-%m-%d'))s
+        where 1 = 1
+        <if test="first != null">
+            and curdate >= #{first}
+        </if>
+        <if test="end != null">
+            and curdate &lt;= #{end}
+        </if>
+    </select>
 </mapper>

+ 2 - 2
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -46,9 +46,9 @@ public class Scheduler {
         private final UserMapper userMapper;
 
         private final GoodsDonSkuMapper skuMapper;
-        
+
         private final WeChatService weChatService;
-        
+
         private final AccountMapper accountMapper;
 
         private final CustomerServiceMapper customerServiceMapper;

+ 84 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.manage.statistics;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -48,6 +49,7 @@ import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /*
@@ -413,15 +415,94 @@ public class StatisticsDataController {
 		if (lastDate != null) {
 			end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd");
 		}
-		BrokenLineObjView brokenLineObjView = orderDonMapper.selectPlatBrokenLineMoney(first, end);
+		BrokenLineObjView brokenLineObjView = Optional.ofNullable(orderDonMapper.selectPlatBrokenLineMoney(first, end))
+				.orElse(new BrokenLineObjView());
+
 		if (brokenLineObjView != null) {
 			List<PlatOrderDonBrokenLineView> views = beanSearcher.searchAll(PlatOrderDonBrokenLineView.class, MapUtils.builder()
-					.field(PersonDistributeBrokenLineView::getDate, first, end).op(Operator.Between)
-					.orderBy(PersonDistributeBrokenLineView::getDate).asc()
+					.field(PlatOrderDonBrokenLineView::getDate, first, end).op(Operator.Between)
+					.orderBy(PlatOrderDonBrokenLineView::getDate).asc()
 					.build());
 			Map<Long, List<PlatOrderDonBrokenLineView>> goodsMap = views.stream().collect(Collectors.groupingBy(PlatOrderDonBrokenLineView::getGoodsId));
 			brokenLineObjView.setGoodsData(goodsMap);
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(brokenLineObjView);
 	}
+
+	/**
+	 * 渠道后台数据统计折线图
+	 * @return
+	 */
+	@GetMapping("/get/channelStatistics/brokenLine")
+	public Result<ChannelStatisticsView> getChannelStatisticsView(Long firstDate, Long lastDate) {
+		String first = null;
+		String end = null;
+		if (firstDate != null) {
+			first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd");
+		}
+		if (lastDate != null) {
+			end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd");
+		}
+		ChannelStatisticsView channelStatisticsView = Optional.ofNullable(orderDonMapper.selectChannelStatistics(first, end))
+				.orElse(new ChannelStatisticsView());
+
+		List<ChannelCommonView> natureChannelData = beanSearcher.searchAll(ChannelCommonView.class, MapUtils.builder()
+				.field(ChannelCommonView::getDate, first, end).op(Operator.Between)
+				.put("type", "od.is_distribute is false")
+				.orderBy(PlatOrderDonBrokenLineView::getDate).asc()
+				.build());
+		channelStatisticsView.setNatureChannelData(natureChannelData);
+
+		List<ChannelCommonView> generalPopularizeChannelData = beanSearcher.searchAll(ChannelCommonView.class, MapUtils.builder()
+				.field(ChannelCommonView::getDate, first, end).op(Operator.Between)
+				.put("type", "od.is_distribute is true and od.is_fixed_distribute is false")
+				.orderBy(PlatOrderDonBrokenLineView::getDate).asc()
+				.build());
+		channelStatisticsView.setGeneralPopularizeChannelData(generalPopularizeChannelData);
+
+		List<ChannelCommonView> distributeChannelData = beanSearcher.searchAll(ChannelCommonView.class, MapUtils.builder()
+				.field(ChannelCommonView::getDate, first, end).op(Operator.Between)
+				.put("type", "od.is_fixed_distribute is true")
+				.orderBy(PlatOrderDonBrokenLineView::getDate).asc()
+				.build());
+		channelStatisticsView.setDistributeChannelData(distributeChannelData);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(channelStatisticsView);
+	}
+
+	/**
+	 * 用户新增数据统计折线图
+	 */
+	@GetMapping("/get/newUserStatistics/brokenLine")
+	public Result<NewUserStatisticsView> getNewUserStatisticsView(Long firstDate, Long lastDate) {
+		String first = null;
+		String end = null;
+		if (firstDate != null) {
+			first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd");
+		}
+		if (lastDate != null) {
+			end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd");
+		}
+		NewUserStatisticsView newUserStatisticsView = new NewUserStatisticsView();
+
+		List<NewAllUserView> newAllUserViews = beanSearcher.searchAll(NewAllUserView.class, MapUtils.builder().field(NewAllUserView::getDate, first, end).build());
+
+		if (CollUtil.isNotEmpty(newAllUserViews)) {
+			newUserStatisticsView.setFirstDate(newAllUserViews.get(0).getDate());
+			newUserStatisticsView.setLastDate(newAllUserViews.get(newAllUserViews.size() - 1).getDate());
+		}
+
+		List<NewUserView> newUserViews = beanSearcher.searchAll(NewUserView.class, MapUtils.builder().field(NewUserView::getDate, first, end).op(Operator.Between).build());
+		newUserStatisticsView.setNewUserData(newUserViews);
+
+		List<NewPcUserView> newPcUserViews = beanSearcher.searchAll(NewPcUserView.class, MapUtils.builder().field(NewPcUserView::getDate, first, end).op(Operator.Between).build());
+		newUserStatisticsView.setNewPcUserData(newPcUserViews);
+
+		List<NewDistributeUserView> newDistributeUserViews = beanSearcher.searchAll(NewDistributeUserView.class, MapUtils.builder().field(NewDistributeUserView::getDate, first, end).op(Operator.Between).build());
+		newUserStatisticsView.setNewDistributeUserData(newDistributeUserViews);
+
+		List<NewCorpUserView> newCorpUserViews = beanSearcher.searchAll(NewCorpUserView.class, MapUtils.builder().field(NewCorpUserView::getDate, first, end).op(Operator.Between).build());
+		newUserStatisticsView.setNewCorpUserData(newCorpUserViews);
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult(newUserStatisticsView);
+	}
 }

+ 3 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -187,7 +187,9 @@ public class DistributePopularizeController {
 		if (lastDate != null) {
 			end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd");
 		}
-		BrokenLineObjView brokenLineObjView = orderDonMapper.selectPersonDistributeBrokenLine(userId, first, end);
+		BrokenLineObjView brokenLineObjView = Optional.ofNullable(orderDonMapper.selectPersonDistributeBrokenLine(userId, first, end))
+				.orElse(new BrokenLineObjView());
+
 		if (brokenLineObjView != null) {
 			List<PersonDistributeBrokenLineView> views = beanSearcher.searchAll(PersonDistributeBrokenLineView.class, MapUtils.builder()
 					.field(PersonDistributeBrokenLineView::getDate, first, end).op(Operator.Between)