浏览代码

add 潮玩好物数据统计以及修改关联流程

zoujiajian 3 年之前
父节点
当前提交
bed5944d7b

+ 6 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -20,6 +20,12 @@ public interface Constant {
 
 	List<String> noOrderAllStatus = List.of("noPayment", "close", "refund");
 
+	/**
+	 * 实物类型
+	 * 2实物、3潮玩好物
+	 */
+	List<Long> realGoodsType = List.of(2l, 3l);
+
 	/**
 	 * 默认头像
 	 */

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsFashionGoodsDataMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.statistics;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.StatisticsFashionGoodsData;
+
+/*
+ *项目名: netflix
+ *文件名: StatisticsFashionGoodsDataMapper
+ *创建者: JavaZou
+ *创建时间:2023/2/14 11:46
+ */
+public interface StatisticsFashionGoodsDataMapper extends BaseMapper<StatisticsFashionGoodsData> {
+}

+ 54 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/StatisticsFashionGoodsData.java

@@ -0,0 +1,54 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: StatisticsFashionGoodsData
+ *创建者: JavaZou
+ *创建时间:2023/2/14 11:25
+ */
+@Getter
+@Setter
+public class StatisticsFashionGoodsData extends BaseEntity{
+	/**
+	 * 平台id
+	 */
+	private Long goodsId;
+
+	/**
+	 * 商品名称
+	 */
+	private String goodsTitle;
+
+	/**
+	 * 规格id
+	 */
+	private Long skuId;
+
+	/**
+	 * 规格名称
+	 */
+	private String specVal;
+
+	/**
+	 * 用户数
+	 */
+	private Integer numOfUser;
+
+	/**
+	 * 订单数
+	 */
+	private Integer numOfOrder;
+
+	/**
+	 * 金额
+	 */
+	private BigDecimal money;
+
+	private Date statisticsDate;
+}

+ 6 - 4
netflix-dao/src/main/java/com/cyksj/model/views/BackgroundDataView.java

@@ -1,9 +1,6 @@
 package com.cyksj.model.views;
 
-import com.cyksj.model.entity.AppleOneData;
-import com.cyksj.model.entity.RealGoodsData;
-import com.cyksj.model.entity.RegisterAccountData;
-import com.cyksj.model.entity.StreamingAccountData;
+import com.cyksj.model.entity.*;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -122,6 +119,11 @@ public class BackgroundDataView {
 	 */
 	private List<RealGoodsData> realGoodsDataViews;
 
+	/**
+	 * 潮玩好物数据
+	 */
+	private List<StatisticsFashionGoodsData> fashionGoodsDataViews;
+
 	/**
 	 * 注册账号数据
 	 */

+ 56 - 0
netflix-dao/src/main/java/com/cyksj/model/views/StatisticsGoodsDataView.java

@@ -0,0 +1,56 @@
+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
+ *文件名: StatisticsGoodsDataView
+ *创建者: JavaZou
+ *创建时间:2023/2/14 11:31
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don gd left join goods_don_sku gdk on gdk.goods_id = gd.id" +
+		" left join order_don od on od.sku_id = gdk.id",
+		where = "od.status not in ('close','noPayment') and :time:",
+		groupBy = "gd.id,gdk.id")
+public class StatisticsGoodsDataView {
+
+	@DbField("gd.id")
+	private Long goodsId;
+
+	/**
+	 * 规格id
+	 */
+	@DbField("gdk.id")
+	private Long skuId;
+
+	/**
+	 * 规格名称
+	 */
+	@DbField("any_value(gdk.spec_val)")
+	private String specVal;
+
+	/**
+	 * 用户数
+	 */
+	@DbField("count(distinct od.user_id)")
+	private Integer numOfUser;
+
+	/**
+	 * 订单数
+	 */
+	@DbField("count(od.id)")
+	private Integer numOfOrder;
+
+	/**
+	 * 金额
+	 */
+	@DbField("ifnull(sum(od.money),0)")
+	private BigDecimal money;
+}

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -80,8 +80,8 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		if (goodsDon == null) {
 			throw BusinessRuntimeException.getInstance("所选平台已被删除");
 		}
-		if (goodsDon.getType() == 2) {
-			throw BusinessRuntimeException.getInstance("实物商品不支持生成兑换码");
+		if (Constant.realGoodsType.contains(goodsDon.getType())) {
+			throw BusinessRuntimeException.getInstance("该类商品不支持生成兑换码");
 		}
 		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(exchangeCodeReq.getSkuId());
 		if (goodsDonSku == null) {

+ 31 - 7
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -18,11 +18,7 @@ import com.cyksj.mapper.manage.statistics.StreamingAccountDataMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.manage.views.GroupsRelationView;
-import com.cyksj.model.views.BackgroundDataView;
-import com.cyksj.model.views.DistributeOrdersView;
-import com.cyksj.model.views.ExpiredAccountDataView;
-import com.cyksj.model.views.GoodsDonSkuView;
-import com.cyksj.redis.RedisService;
+import com.cyksj.model.views.*;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
 import com.cyksj.service.order.OrderDonService;
@@ -55,8 +51,6 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private final CmsAccountService accountService;
 
-	private final RedisService redisService;
-
 	private final AppleOneDataMapper appleOneDataMapper;
 
 	private final StreamingAccountDataMapper streamingAccountDataMapper;
@@ -94,9 +88,39 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		getRealGoodsData(backgroundDataView, startDate, endDate);
 		//注册账号数据
 		getRegisterAccountData(backgroundDataView, startDate, endDate);
+		//潮玩好物数据
+		getFashionGoodsData(backgroundDataView, startDate, endDate);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(backgroundDataView);
 	}
 
+	private void getFashionGoodsData(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
+		if (DateUtil.beginOfDay(DateTime.now()).equals(startDate) && DateUtil.beginOfDay(DateUtil.offsetDay(DateTime.now(), 1)).equals(endDate)) {
+			List<StatisticsFashionGoodsData> fashionGoodsData = statistics.statisticsFashionGoodsData(startDate, endDate, true);
+			List<StatisticsFashionGoodsData> collect = fashionGoodsData.stream().filter(data -> {
+				if (data.getNumOfUser() != null && data.getNumOfUser() > 0) {
+					data.setMoney(data.getMoney().divide(BigDecimal.valueOf(100)));
+					return true;
+				}
+				return false;
+			}).collect(Collectors.toList());
+			backgroundDataView.setFashionGoodsDataViews(collect);
+		} else {
+			List<StatisticsFashionGoodsData> fashionGoodsData = beanSearcher.searchAll(StatisticsFashionGoodsData.class, MapUtils.builder()
+					.field(StatisticsFashionGoodsData::getCreatedTime, startDate, endDate).op(Operator.Between).build());
+			Optional.ofNullable(fashionGoodsData).ifPresent(list -> list.forEach(data -> {
+				GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getId, data.getGoodsId()).last("limit 1"));
+				if (goodsDon != null) {
+					data.setGoodsTitle(goodsDon.getTitle());
+				}
+				GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getId, data.getSkuId()).last("limit 1"));
+				if (goodsDonSku != null) {
+					data.setSpecVal(goodsDonSku.getSpecVal());
+				}
+			}));
+			backgroundDataView.setFashionGoodsDataViews(fashionGoodsData);
+		}
+	}
+
 	/**
 	 * 注册账号数据
 	 */

+ 1 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -61,7 +61,6 @@ import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.task.JobManager;
-import com.cyksj.task.OrderCustomerHandleScheduler;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
@@ -304,7 +303,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.saveOrUpdate(orderDon);
 
-		if (goodsDon.getType() == 2) {
+		if (Constant.realGoodsType.contains(goodsDon.getType())) {
 			saveTransport(payRequest.getAddressId(), orderDon.getId());
 		}
 		if (isNew) {

+ 35 - 5
netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java

@@ -1,5 +1,6 @@
 package com.cyksj.task;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -9,12 +10,10 @@ import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.RegisterAccountDataMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
-import com.cyksj.mapper.manage.statistics.AppleOneDataMapper;
-import com.cyksj.mapper.manage.statistics.RealGoodsDataMapper;
-import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
-import com.cyksj.mapper.manage.statistics.StreamingAccountDataMapper;
+import com.cyksj.mapper.manage.statistics.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.CorpUserTagView;
+import com.cyksj.model.views.StatisticsGoodsDataView;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import com.cyksj.service.order.OrderDonService;
@@ -69,6 +68,8 @@ public class StatisticsDataScheduler {
 
 	private final StatisticsUserDataMapper statisticsUserDataMapper;
 
+	private final StatisticsFashionGoodsDataMapper statisticsFashionGoodsDataMapper;
+
 	private final BeanSearcher beanSearcher;
 
 	/**
@@ -88,7 +89,36 @@ public class StatisticsDataScheduler {
 		TASK_POOL.execute(() -> statisticsRegisterAccountData(yesZeroDate, thisZeroDate, false));
 		//用户数据统计
 		statisticsUserData(yesZeroDate, thisZeroDate);
+		//潮玩好物数据统计
+		statisticsFashionGoodsData(yesZeroDate, thisZeroDate, false);
+
+	}
 
+	public List<StatisticsFashionGoodsData> statisticsFashionGoodsData(Date yesZeroDate, Date thisZeroDate, Boolean today) {
+		//潮玩好物
+		List<GoodsDon> goodsDons = goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getType, Constant.realGoodsType.get(1)));
+		List<StatisticsFashionGoodsData> fashionGoodsData = new ArrayList<>();
+		goodsDons.forEach(goods->{
+			List<StatisticsGoodsDataView> goodsDataViews = beanSearcher.searchAll(StatisticsGoodsDataView.class, MapUtils.builder()
+					.field(StatisticsGoodsDataView::getGoodsId, goods.getId())
+					.put("time", String.format("od.created_time between '%s' and '%s'", yesZeroDate, thisZeroDate))
+					.build());
+			goodsDataViews.forEach(goodsDataView->{
+				StatisticsFashionGoodsData statisticsFashionGoodsData = new StatisticsFashionGoodsData();
+				BeanUtil.copyProperties(goodsDataView, statisticsFashionGoodsData);
+				fashionGoodsData.add(statisticsFashionGoodsData);
+			});
+		});
+		if (today) {
+			return fashionGoodsData;
+		}
+		if (!fashionGoodsData.isEmpty()) {
+			fashionGoodsData.forEach(data -> {
+				data.setStatisticsDate(yesZeroDate);
+				statisticsFashionGoodsDataMapper.insert(data);
+			});
+		}
+		return null;
 	}
 
 	/**
@@ -241,7 +271,7 @@ public class StatisticsDataScheduler {
 	 * 统计实物数据
 	 */
 	public List<RealGoodsData> statisticsRealGoodsData(Date yesZeroDate, Date thisZeroDate, Boolean today) {
-		List<GoodsDon> goodsDons = goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getType, 2));
+		List<GoodsDon> goodsDons = goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getType, Constant.realGoodsType.get(0)));
 		List<RealGoodsData> realGoodsDataList = new ArrayList<>();
 		if (!goodsDons.isEmpty()) {
 			goodsDons.forEach(goods -> {