فهرست منبع

add 潮玩好物商品功能

zoujiajian 3 سال پیش
والد
کامیت
c8a19cc351

+ 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<Integer> realGoodsType = List.of(2, 3);
+
 	/**
 	 * 默认头像
 	 */

+ 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> {
+}

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java

@@ -6,6 +6,8 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * @author chan
  * @date 2022/9/26 4:58 PM
@@ -82,6 +84,14 @@ public class GoodsDon extends BaseEntity {
      */
     private Integer sortBy;
 
+    @TableField(exist = false)
+    @DbIgnore
+    private BigDecimal price;
+
+    @TableField(exist = false)
+    @DbIgnore
+    private Integer soldNum;
+
     @TableField(exist = false)
     @DbIgnore
     private Integer accountCount;

+ 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;
+
 	/**
 	 * 注册账号数据
 	 */

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

@@ -0,0 +1,62 @@
+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;
+
+	/**
+	 * 商品名称
+	 */
+	@DbField("gd.title")
+	private String goodsTitle;
+
+	/**
+	 * 规格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);
+		}
+	}
+
 	/**
 	 * 注册账号数据
 	 */

+ 2 - 3
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) {
@@ -1424,7 +1423,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					.eq(CouponSku::getCouponId, couponId)
 					.select(CouponSku::getId).last("limit 1"));
 			if (couponSku == null) {
-				throw BusinessRuntimeException.getInstance(String.format("该%s不可用于实物商品", isCouponCode ? "优惠码" : "优惠券"));
+				throw BusinessRuntimeException.getInstance(String.format("该%s不可用于ga商品", isCouponCode ? "优惠码" : "优惠券"));
 			}
 		}
 	}

+ 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 -> {

+ 17 - 0
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -8,6 +8,7 @@ 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.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.GoodsDonPopularizeView;
@@ -46,6 +47,8 @@ public class GoodsDonController {
 
     private final OrderDonMapper orderDonMapper;
 
+    private final GoodsDonSkuMapper goodsDonSkuMapper;
+
     /**
      * 获取商品列表
      */
@@ -58,6 +61,20 @@ public class GoodsDonController {
                 .orderBy(GoodsDon::getId).asc()
                 .build()
         );
+        Integer virtual = 2000;
+        search.getDataList().forEach(goods->{
+            GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goods.getId())
+                    .eq(GoodsDonSku::getStatus, true)
+                    .orderByAsc(GoodsDonSku::getPrice)
+                    .last("limit 1")
+                    .select(GoodsDonSku::getPrice));
+            goods.setPrice(goodsDonSku.getPrice());
+            if (goods.getType() != 3) {
+                goods.setSoldNum(virtual + orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+                        .eq(OrderDon::getGoodsId, goods.getId())
+                        .notIn(OrderDon::getStatus, Constant.noOrderStatus)));
+            }
+        });
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 

+ 31 - 23
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -77,7 +77,7 @@ public class CmsOrderController {
     public Result<SearchResult<OrderDonView>> get() {
         SearchResult<OrderDonView> search = beanSearcher.search(OrderDonView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
         search.getDataList().forEach(data -> {
-	        if (data.getGoodsDonType() != null && data.getGoodsDonType() == 2) {
+	        if (data.getGoodsDonType() != null && Constant.realGoodsType.contains(data.getGoodsDonType())) {
                 RealGoodsOrderHandle realGoodsOrderHandle = realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, data.getId()).last("limit 1"));
                 if (realGoodsOrderHandle != null) {
                     data.setBeforeServiceName(realGoodsOrderHandle.getBeforeServiceName());
@@ -107,7 +107,7 @@ public class CmsOrderController {
 			if (data.getChannelId() == null) {
 				data.setChannel("自然流量渠道");
 			}
-			if (data.getGoodsDonType() != null && data.getGoodsDonType() == 2) {
+			if (data.getGoodsDonType() != null && Constant.realGoodsType.contains(data.getGoodsDonType())) {
 				OrderDonTransportView transportView = beanSearcher.searchFirst(OrderDonTransportView.class, MapUtils.builder().field(OrderDonTransportView::getOrderId, data.getId()).build());
 				if (transportView != null) {
 					data.setTransportStr(String.format("%s%s%s%s", transportView.getProvince(), transportView.getCity(), transportView.getDistrict(), transportView.getAddress()));
@@ -252,27 +252,35 @@ public class CmsOrderController {
         if (orderDon == null || orderDon.getRelationId() != 0) {
             throw BusinessRuntimeException.getInstance("该订单不是实物订单");
         }
-        RealGoodsOrderHandle realGoodsOrderHandle = Optional.ofNullable(realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, request.getOrderId()).last("limit 1"))).orElse(new RealGoodsOrderHandle());
-        if (StringUtils.isNotBlank(request.getBeforeServiceName())) {
-            realGoodsOrderHandle.setBeforeServiceName(request.getBeforeServiceName());
-        }
-        if (StringUtils.isNotBlank(request.getAfterServiceName())) {
-            realGoodsOrderHandle.setAfterServiceName(request.getAfterServiceName());
-        }
-        if (realGoodsOrderHandle.getId() == null) {
-            realGoodsOrderHandle.setOrderId(request.getOrderId());
-            realGoodsOrderHandleMapper.insert(realGoodsOrderHandle);
-        }else {
-            if (realGoodsOrderHandle.getBeforeOpNum() > 2) {
-                throw BusinessRuntimeException.getInstance("售前客服已两次修改");
-            }
-            if (realGoodsOrderHandle.getAfterOpNum() > 2) {
-                throw BusinessRuntimeException.getInstance("售后客服已两次修改");
-            }
-            realGoodsOrderHandle.setBeforeOpNum(realGoodsOrderHandle.getBeforeOpNum() + 1);
-            realGoodsOrderHandle.setAfterOpNum(realGoodsOrderHandle.getAfterOpNum() + 1);
-            realGoodsOrderHandleMapper.updateById(realGoodsOrderHandle);
-        }
+	    Boolean isBefore = false;
+	    Boolean isAfter = false;
+	    RealGoodsOrderHandle realGoodsOrderHandle = Optional.ofNullable(realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, request.getOrderId()).last("limit 1"))).orElse(new RealGoodsOrderHandle());
+	    if (StringUtils.isNotBlank(request.getBeforeServiceName())) {
+		    realGoodsOrderHandle.setBeforeServiceName(request.getBeforeServiceName());
+		    isBefore = true;
+	    }
+	    if (StringUtils.isNotBlank(request.getAfterServiceName())) {
+		    realGoodsOrderHandle.setAfterServiceName(request.getAfterServiceName());
+		    isAfter = true;
+	    }
+	    if (realGoodsOrderHandle.getId() == null) {
+		    realGoodsOrderHandle.setOrderId(request.getOrderId());
+		    realGoodsOrderHandleMapper.insert(realGoodsOrderHandle);
+	    } else {
+		    if (realGoodsOrderHandle.getBeforeOpNum() > 2) {
+			    throw BusinessRuntimeException.getInstance("售前客服已两次修改");
+		    }
+		    if (realGoodsOrderHandle.getAfterOpNum() > 2) {
+			    throw BusinessRuntimeException.getInstance("售后客服已两次修改");
+		    }
+		    if (isBefore) {
+			    realGoodsOrderHandle.setBeforeOpNum(realGoodsOrderHandle.getBeforeOpNum() + 1);
+		    }
+		    if (isAfter) {
+			    realGoodsOrderHandle.setAfterOpNum(realGoodsOrderHandle.getAfterOpNum() + 1);
+		    }
+		    realGoodsOrderHandleMapper.updateById(realGoodsOrderHandle);
+	    }
         return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
     }