فهرست منبع

Merge branch 'home_page_func' into pre

# Conflicts:
#	netflix-dao/src/main/java/com/cyksj/model/views/GoodsHomePageView.java
#	netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
zoujiajian 3 سال پیش
والد
کامیت
91e6fc9ff0
37فایلهای تغییر یافته به همراه1220 افزوده شده و 62 حذف شده
  1. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsClickUserRecordMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonCategoryMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/home/HomeManagementConfigMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/home/HomeManagementConfigUserClickRecordMapper.java
  5. 2 2
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsExportMapper.java
  6. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsClickUserRecord.java
  7. 1 1
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
  8. 31 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonCategory.java
  9. 46 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java
  10. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfigUserClickRecord.java
  11. 1 1
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSpuInsert.java
  12. 1 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/GoodsDonViewer.java
  13. 28 0
      netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java
  14. 36 0
      netflix-dao/src/main/java/com/cyksj/model/request/HomeManageConfigReq.java
  15. 22 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryFrontView.java
  16. 44 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryGoodsView.java
  17. 42 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java
  18. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonPopularizeView.java
  19. 23 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSearchView.java
  20. 8 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonViews.java
  21. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  22. 0 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsHomePageView.java
  23. 33 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementAvailableGoodsView.java
  24. 58 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java
  25. 49 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java
  26. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  27. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRateView.java
  28. 13 0
      netflix-service/src/main/java/com/cyksj/service/home/ClickRecordFrontService.java
  29. 15 0
      netflix-service/src/main/java/com/cyksj/service/home/HomeManagementConfigService.java
  30. 91 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java
  31. 76 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java
  32. 16 0
      netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonCategoryService.java
  33. 45 0
      netflix-service/src/main/java/com/cyksj/service/mange/goods/GoodsDonCategoryServiceImpl.java
  34. 4 4
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  35. 118 48
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  36. 187 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java
  37. 136 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsClickUserRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsClickUserRecord;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsClickUserRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/8/18 10:48
+ */
+public interface GoodsClickUserRecordMapper extends BaseMapper<GoodsClickUserRecord> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonCategoryMapper.java

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

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/home/HomeManagementConfigMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.home;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.HomeManagementConfig;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfigMapper
+ *创建者: JavaZou
+ *创建时间:2023/8/17 16:44
+ */
+public interface HomeManagementConfigMapper extends BaseMapper<HomeManagementConfig> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/home/HomeManagementConfigUserClickRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.home;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.HomeManagementConfigUserClickRecord;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfigUserClickRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/8/17 16:45
+ */
+public interface HomeManagementConfigUserClickRecordMapper extends BaseMapper<HomeManagementConfigUserClickRecord> {
+}

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsExportMapper.java

@@ -42,7 +42,7 @@ public interface StatisticsExportMapper{
 
 	Integer getMonthAiNewPayStreamingNumOfUser(@Param("thisMonth") DateTime thisMonth, @Param("nextMonth") DateTime nextMonth);
 
-	Integer getMonthPrivateCorpNumOfUser(@Param("type") Integer type, @Param("category") Integer category);
+	Integer getMonthPrivateCorpNumOfUser(@Param("type") Integer type, @Param("category") Long category);
 
 	BigDecimal getShouldApplyMoney(String endDate);
 
@@ -58,7 +58,7 @@ public interface StatisticsExportMapper{
 
 	BigDecimal getMonthAmountOfOrderByType(@Param("type") Integer type, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
-	BigDecimal getMonthGoodsTypeAmountOfOrderByType(@Param("type") Integer type, @Param("goodsType") Integer goodsType, @Param("category") Integer category, @Param("startDate") String startDate, @Param("endDate") String endDate);
+	BigDecimal getMonthGoodsTypeAmountOfOrderByType(@Param("type") Integer type, @Param("goodsType") Integer goodsType, @Param("category") Long category, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
 	Integer getMonthUserSourceNumOrderByType(@Param("type") Integer type, @Param("startDate") String startDate, @Param("endDate") String endDate);
 

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsClickUserRecord.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsClickUserRecord
+ *创建者: JavaZou
+ *创建时间:2023/8/18 10:47
+ */
+@Getter
+@Setter
+public class GoodsClickUserRecord extends BaseEntity{
+	private Long userId;
+
+	private Long goodsId;
+
+	private Long category;
+}

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

@@ -73,7 +73,7 @@ public class GoodsDon extends BaseEntity {
      * 分类
      * 1、AI  2、流媒体
      */
-    private Integer category;
+    private Long category;
 
     /**
      * 二级分类

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonCategory.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.views.GoodsDonCategoryGoodsView;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategory
+ *创建者: JavaZou
+ *创建时间:2023/8/11 13:38
+ */
+@Getter
+@Setter
+public class GoodsDonCategory extends BaseEntity {
+	@NotEmpty(message = "名称不为空")
+	private String name;
+
+	private Integer sorted;
+
+	private Boolean status;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private List<GoodsDonCategoryGoodsView> categoryGoodsList;
+}

+ 46 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java

@@ -0,0 +1,46 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfig
+ *创建者: JavaZou
+ *创建时间:2023/8/17 15:49
+ */
+@Getter
+@Setter
+public class HomeManagementConfig extends BaseEntity{
+	private String title;
+
+	private String pic;
+
+	private String url;
+
+	private Long goodsId;
+
+	private Type type;
+
+	private Integer sorted;
+
+	private String tag;
+
+	private Boolean status;
+
+	private Boolean deleted;
+
+	@Getter
+	public enum Type {
+		ad("广告"),
+		vg("虚拟平台推荐"),
+		rg("实物平台推荐"),
+		ex("精彩推荐"),
+		;
+		String desc;
+
+		Type(String desc) {
+			this.desc = desc;
+		}
+	}
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfigUserClickRecord.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfigUserClickRecord
+ *创建者: JavaZou
+ *创建时间:2023/8/17 16:44
+ */
+@Getter
+@Setter
+public class HomeManagementConfigUserClickRecord extends BaseEntity{
+	private Long userId;
+
+	private Long configId;
+}

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSpuInsert.java

@@ -70,7 +70,7 @@ public class ReqGoodsSpuInsert {
      * 分类
      * 1、AI  2、流媒体
      */
-    private Integer category;
+    private Long category;
 
     /**
      *  轮播图

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

@@ -111,7 +111,7 @@ public class GoodsDonViewer {
      * 1、AI  2、流媒体
      */
     @DbField("g.category")
-    private Integer category;
+    private Long category;
 
     /**
      * banner

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ClickRecordReq
+ *创建者: JavaZou
+ *创建时间:2023/8/17 18:13
+ */
+@Getter
+@Setter
+public class ClickRecordReq {
+	private Boolean isLogin;
+
+	private Long configId;
+
+	private Long category;
+
+	private Long goodsId;
+
+	/**
+	 * 1、首页点击
+	 * 2、平台分类点击
+	 */
+	private Integer type;
+}

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/request/HomeManageConfigReq.java

@@ -0,0 +1,36 @@
+package com.cyksj.model.request;
+
+import com.cyksj.model.entity.HomeManagementConfig;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManageConfigReq
+ *创建者: JavaZou
+ *创建时间:2023/8/17 17:17
+ */
+@Getter
+@Setter
+public class HomeManageConfigReq {
+	private Long id;
+
+	private String title;
+
+	private String pic;
+
+	private String url;
+
+	/**
+	 * 可以多选
+	 */
+	private List<Long> goodsIds;
+
+	private HomeManagementConfig.Type type;
+
+	private Integer sorted;
+
+	private String tag;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryFrontView.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryFrontView
+ *创建者: JavaZou
+ *创建时间:2023/8/11 14:13
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_category"
+		, where = "status is true"
+		, orderBy = "sorted desc")
+public class GoodsDonCategoryFrontView {
+	private Long id;
+
+	private String name;
+}

+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryGoodsView.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryGoodsView
+ *创建者: JavaZou
+ *创建时间:2023/8/18 11:11
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g",
+		where = "g.deleted is true")
+public class GoodsDonCategoryGoodsView {
+
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.category")
+	private Long category;
+
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * 前端组件使用
+	 */
+	@DbField("g.title")
+	private String name;
+
+	@DbField("g.status")
+	private Boolean status;
+
+	@DbIgnore
+	private Integer click;
+
+	@DbField("g.sort_by")
+	private Integer sorted;
+}

+ 42 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java

@@ -0,0 +1,42 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryView
+ *创建者: JavaZou
+ *创建时间:2023/8/18 10:36
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_category gc left join goods_don g on g.category = gc.id and g.deleted is true",
+		groupBy = "gc.id,gc.name,gc.sorted,gc.update_time")
+public class GoodsDonCategoryView {
+	@DbField("gc.id")
+	private Long id;
+
+	@DbField("gc.name")
+	private String name;
+
+	@DbField("gc.sorted")
+	private Integer sorted;
+
+	@DbField("count(g.id)")
+	private Integer count;
+
+	@DbIgnore
+	private Integer click;
+
+	@DbField("gc.status")
+	private Boolean status;
+
+	@DbField("gc.update_time")
+	private Date updateTime;
+}

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

@@ -64,7 +64,7 @@ public class GoodsDonPopularizeView {
 	 * 1、AI  2、流媒体
 	 */
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 	@DbField("g.second_type")
 	private Integer secondType;

+ 23 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSearchView.java

@@ -0,0 +1,23 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonSearchView
+ *创建者: JavaZou
+ *创建时间:2023/8/25 16:40
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g",
+		where = "g.deleted is true and g.status is true")
+public class GoodsDonSearchView {
+	@DbField("g.id")
+	private Long goodsId;
+
+	private String title;
+}

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

@@ -3,6 +3,7 @@ package com.cyksj.model.views;
 import com.cyksj.model.entity.GoodsDon;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -57,7 +58,7 @@ public class GoodsDonViews {
      * 分类
      * 1、AI  2、流媒体
      */
-    private Integer category;
+    private Long category;
 
     /**
      * 二级分类
@@ -124,6 +125,12 @@ public class GoodsDonViews {
 
     private Boolean isSp;
 
+    @DbIgnore
+    private Integer sold;
+
+    @JsonIgnore
+    private Integer virtualSold;
+
     @DbIgnore
     private List<GoodsDonSkuFrontView> skuList;
 

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

@@ -64,7 +64,7 @@ public class GoodsFrontListView {
 	 * 1、AI  2、流媒体
 	 */
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 	@DbField("g.second_type")
 	private Integer secondType;

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


+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementAvailableGoodsView.java

@@ -0,0 +1,33 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementAvailableGoodsView
+ *创建者: JavaZou
+ *创建时间:2023/8/17 18:23
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g left join (select * from home_management_config where :type: deleted is true) hc on hc.goods_id = g.id"
+		, where = "g.deleted is true and hc.id is null")
+public class HomeManagementAvailableGoodsView {
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.category")
+	private Long category;
+
+	@DbField("g.type")
+	private Long goodsType;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("g.status")
+	private Boolean status;
+}

+ 58 - 0
netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java

@@ -0,0 +1,58 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.HomeManagementConfig;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfigView
+ *创建者: JavaZou
+ *创建时间:2023/8/17 17:53
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from home_management_config where deleted is true)hc" +
+		" left join goods_don g on g.id = hc.goods_id")
+public class HomeManagementConfigView {
+	@DbField("hc.id")
+	private Long id;
+
+	@DbField("hc.title")
+	private String title;
+
+	@DbField("hc.pic")
+	private String pic;
+
+	@DbField("hc.goods_id")
+	private Long goodsId;
+
+	@DbField("hc.url")
+	private String url;
+
+	@DbField("g.title")
+	private String goodsTitle;
+
+	@DbField("hc.type")
+	private HomeManagementConfig.Type type;
+
+	@DbField("hc.tag")
+	private String tag;
+
+	@DbField("hc.sorted")
+	private Integer sorted;
+
+	@DbField("hc.status")
+	private Boolean status;
+
+	@DbIgnore
+	private Integer click;
+
+	@DbField("hc.created_time")
+	private Date createdTime;
+}

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.HomeManagementConfig;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementFrontView
+ *创建者: JavaZou
+ *创建时间:2023/8/18 9:36
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from home_management_config where status is true and deleted is true) hc left join goods_don g on g.id = hc.goods_id",
+		where = ":condition:",
+		orderBy = "hc.sorted desc")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class HomeManagementFrontView {
+	@DbField("hc.id")
+	private Long id;
+
+	@DbField("hc.title")
+	private String title;
+
+	@DbField("hc.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String goodsTitle;
+
+	@DbField("g.logo")
+	private String logo;
+
+	@DbField("hc.url")
+	private String url;
+
+	@DbField("hc.type")
+	private HomeManagementConfig.Type type;
+
+	@DbField("hc.pic")
+	private String pic;
+
+	@DbField("hc.tag")
+	private String tag;
+}

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

@@ -66,7 +66,7 @@ public class RenewalView {
     private String img;
 
     @DbField("g.category")
-    private Integer category;
+    private Long category;
 
     @DbField("g.type")
     @JsonIgnore

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

@@ -18,7 +18,7 @@ import lombok.Setter;
 public class UserDistributeRateView {
 
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 	@DbField("g.title")
 	private String title;

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/home/ClickRecordFrontService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.home;
+
+import com.cyksj.model.request.ClickRecordReq;
+
+/*
+ *项目名: netflix
+ *文件名: ClickRecordFrontService
+ *创建者: JavaZou
+ *创建时间:2023/8/17 18:07
+ */
+public interface ClickRecordFrontService {
+	void click(Long userId, ClickRecordReq request);
+}

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/home/HomeManagementConfigService.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.home;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.HomeManagementConfig;
+import com.cyksj.model.request.HomeManageConfigReq;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfigService
+ *创建者: JavaZou
+ *创建时间:2023/8/17 16:48
+ */
+public interface HomeManagementConfigService extends IService<HomeManagementConfig> {
+	void saveOrUpdateConfig(HomeManageConfigReq config);
+}

+ 91 - 0
netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java

@@ -0,0 +1,91 @@
+package com.cyksj.service.home.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.GoodsClickUserRecordMapper;
+import com.cyksj.mapper.GoodsDonCategoryMapper;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
+import com.cyksj.mapper.manage.home.HomeManagementConfigUserClickRecordMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ClickRecordReq;
+import com.cyksj.service.home.ClickRecordFrontService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: ClickRecordFrontServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/8/17 18:08
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
+
+	private final HomeManagementConfigMapper homeManagementConfigMapper;
+
+	private final HomeManagementConfigUserClickRecordMapper homeManagementConfigUserClickRecordMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final GoodsDonCategoryMapper goodsDonCategoryMapper;
+
+	private final GoodsClickUserRecordMapper goodsClickUserRecordMapper;
+
+
+	@Override
+	public void click(Long userId, ClickRecordReq request) {
+		Assert.notNull(request.getType(), "参数错误");
+		if (request.getType() == 1) {
+			clickHomePage(userId, request.getConfigId());
+			return;
+		}
+		if (request.getType() == 2) {
+			clickGoodsCategoryOrGoods(userId, request.getGoodsId(), request.getCategory());
+			return;
+		}
+	}
+
+	public void clickHomePage(Long userId, Long configId) {
+		Assert.notNull(configId, "参数错误");
+		HomeManagementConfig homeManagementConfig = homeManagementConfigMapper.selectById(configId);
+		if (homeManagementConfig == null) {
+			return;
+		}
+		HomeManagementConfigUserClickRecord clickRecord = new HomeManagementConfigUserClickRecord();
+		clickRecord.setConfigId(configId);
+		clickRecord.setUserId(userId);
+		homeManagementConfigUserClickRecordMapper.insert(clickRecord);
+	}
+
+	public void clickGoodsCategoryOrGoods(Long userId, Long goodsId, Long category) {
+		if (goodsId == null && category == null) {
+			throw BusinessRuntimeException.getInstance("参数错误");
+		}
+		GoodsClickUserRecord goodsClickUserRecord;
+		if (goodsId != null) {
+			GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+			if (goodsDon != null) {
+				goodsClickUserRecord = new GoodsClickUserRecord();
+				goodsClickUserRecord.setUserId(userId);
+				goodsClickUserRecord.setGoodsId(goodsId);
+				goodsClickUserRecordMapper.insert(goodsClickUserRecord);
+				return;
+			}
+		}
+
+		if (category != null) {
+			GoodsDonCategory goodsDonCategory = goodsDonCategoryMapper.selectById(category);
+			if (goodsDonCategory != null) {
+				goodsClickUserRecord = new GoodsClickUserRecord();
+				goodsClickUserRecord.setUserId(userId);
+				goodsClickUserRecord.setCategory(category);
+				goodsClickUserRecordMapper.insert(goodsClickUserRecord);
+				return;
+			}
+		}
+	}
+}

+ 76 - 0
netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java

@@ -0,0 +1,76 @@
+package com.cyksj.service.home.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.HomeManagementConfig;
+import com.cyksj.model.request.HomeManageConfigReq;
+import com.cyksj.service.home.HomeManagementConfigService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManagementConfigServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/8/17 16:48
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class HomeManagementConfigServiceImpl extends ServiceImpl<HomeManagementConfigMapper, HomeManagementConfig> implements HomeManagementConfigService {
+	private final GoodsDonMapper goodsDonMapper;
+
+	@Override
+	public void saveOrUpdateConfig(HomeManageConfigReq config) {
+		if (isSpecialType(config.getType())) {
+			Assert.notEmpty(config.getTitle(), "标题不为空");
+			HomeManagementConfig homeManagementConfig = new HomeManagementConfig();
+			BeanUtil.copyProperties(config, homeManagementConfig);
+			this.saveOrUpdate(homeManagementConfig);
+			return;
+		}
+
+		//首页平台推荐、首页精彩推荐
+		List<Long> goodsIds = config.getGoodsIds();
+		if (CollUtil.isEmpty(goodsIds)) {
+			throw BusinessRuntimeException.getInstance("请选择对应的平台");
+		}
+		goodsIds.forEach(goodsId -> {
+			GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+			if (goodsDon == null || !goodsDon.getStatus()) {
+				return;
+			}
+			HomeManagementConfig homeManagementConfig = this.getOne(Wrappers.lambdaQuery(HomeManagementConfig.class)
+					.ne(config.getId() != null, HomeManagementConfig::getId, config.getId())
+					.eq(HomeManagementConfig::getGoodsId, goodsId)
+					.eq(HomeManagementConfig::getType, config.getType())
+					.eq(HomeManagementConfig::getDeleted, true).last("limit 1"));
+			if (homeManagementConfig != null) {
+				return;
+			}
+			homeManagementConfig = new HomeManagementConfig();
+			BeanUtil.copyProperties(config, homeManagementConfig);
+			homeManagementConfig.setGoodsId(goodsId);
+			homeManagementConfig.setType(config.getType());
+			this.saveOrUpdate(homeManagementConfig);
+		});
+	}
+
+
+	public Boolean isSpecialType(HomeManagementConfig.Type type) {
+		if (type == HomeManagementConfig.Type.rg || type == HomeManagementConfig.Type.ad) {
+			return true;
+		}
+		return false;
+	}
+}

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonCategoryService.java

@@ -0,0 +1,16 @@
+package com.cyksj.service.mange;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GoodsDonCategory;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryService
+ *创建者: JavaZou
+ *创建时间:2023/8/11 13:45
+ */
+public interface GoodsDonCategoryService extends IService<GoodsDonCategory> {
+	void saveOrUpdateGoods(GoodsDonCategory category);
+
+	void delById(Long id);
+}

+ 45 - 0
netflix-service/src/main/java/com/cyksj/service/mange/goods/GoodsDonCategoryServiceImpl.java

@@ -0,0 +1,45 @@
+package com.cyksj.service.mange.goods;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.GoodsDonCategoryMapper;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonCategory;
+import com.cyksj.service.mange.GoodsDonCategoryService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/8/11 13:45
+ */
+@Service
+@RequiredArgsConstructor
+public class GoodsDonCategoryServiceImpl extends ServiceImpl<GoodsDonCategoryMapper, GoodsDonCategory> implements GoodsDonCategoryService {
+	private final GoodsDonMapper goodsDonMapper;
+
+	@Override
+	public void saveOrUpdateGoods(GoodsDonCategory category) {
+		try {
+			this.saveOrUpdate(category);
+		} catch (DuplicateKeyException e) {
+			throw BusinessRuntimeException.getInstance("分类名称重复");
+		}
+	}
+
+	@Override
+	public void delById(Long id) {
+		Integer count = goodsDonMapper.selectCount(Wrappers.lambdaQuery(GoodsDon.class)
+				.eq(GoodsDon::getCategory, id)
+				.eq(GoodsDon::getDeleted, true));
+		if (count > 0) {
+			throw BusinessRuntimeException.getInstance("存在该分类下的商品");
+		}
+		this.removeById(id);
+	}
+}

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

@@ -474,20 +474,20 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		excelMonthlyDistributeOrderData.setMonthDsFAmountOfOrder(monthDsFAmountOfOrder);
 		//自然渠道
 		//流媒体
-		BigDecimal monthStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 2, startDate, endDate);
+		BigDecimal monthStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 2l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthStreamingAmountOfOrder(monthStreamingAmountOfOrder);
 		// AI销售金额
-		BigDecimal monthAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 1, startDate, endDate);
+		BigDecimal monthAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 1l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthAiAmountOfOrder(monthAiAmountOfOrder);
 		//设备销售金额
 		BigDecimal monthOfEqAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, 2, null, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthOfEqAmountOfOrder(monthOfEqAmountOfOrder);
 		//渠道商+个人分销
 		//流媒体
-		BigDecimal monthOfSpecStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 2, startDate, endDate);
+		BigDecimal monthOfSpecStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 2l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthOfSpecStreamingAmountOfOrder(monthOfSpecStreamingAmountOfOrder);
 		// AI销售金额
-		BigDecimal monthOfSpecAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 1, startDate, endDate);
+		BigDecimal monthOfSpecAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 1l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthOfSpecAiAmountOfOrder(monthOfSpecAiAmountOfOrder);
 		//设备销售金额
 		BigDecimal monthOfSpecEqAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, 2, null, startDate, endDate);

+ 118 - 48
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -18,8 +18,10 @@ import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
 import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ClickRecordReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.home.ClickRecordFrontService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -31,11 +33,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
 
 /**
  * @author chan
@@ -61,6 +62,35 @@ public class GoodsDonController {
 
     private final SysConfigMapper sysConfigMapper;
 
+    private final ClickRecordFrontService clickRecordFrontService;
+
+    /**
+     * 获取平台商品分类
+     */
+    @GetMapping("/get/category")
+    public Result<List<GoodsDonCategoryFrontView>> getCategory() {
+        String key = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "category";
+        Object o = redisService.get(key);
+        List<GoodsDonCategoryFrontView> list;
+        if (o == null) {
+            list = beanSearcher.searchAll(GoodsDonCategoryFrontView.class, MapUtils.flatBuilder(request.getParameterMap())
+                    .build());
+            redisService.setNx(key, list, 30 * 60l);
+            o = redisService.get(key);
+        }
+        list = Jsons.parseList(o, GoodsDonCategoryFrontView.class);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    }
+
+    /**
+     * 商品搜索
+     */
+    @GetMapping("/search")
+    public Result<SearchResult<GoodsDonSearchView>> search() {
+        SearchResult<GoodsDonSearchView> search = beanSearcher.search(GoodsDonSearchView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+
     /**
      * 获取商品列表
      */
@@ -289,6 +319,10 @@ public class GoodsDonController {
         Long fUid = StpUserUtil.getUserIdAfterLogin();
         GoodsDonViews views = beanSearcher.searchFirst(GoodsDonViews.class, MapUtils.builder().field(GoodsDonViews::getId, id).build());
 
+        Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+                .eq(OrderDon::getGoodsId, views.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
+        views.setSold(sold + views.getVirtualSold());
+
         views.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
         MapBuilder builder = MapUtils.builder().field(GoodsDonSku::getGoodsId, views.getId()).field(GoodsDonSku::getStatus, true);
 
@@ -380,6 +414,42 @@ public class GoodsDonController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
+    /**
+     * 获取首页配置列表
+     */
+    @GetMapping("/get/homeManage")
+    public Result<Map<String, List<HomeManagementFrontView>>> getHomeManagementFrontPage() {
+        String key = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage";
+        Object o = redisService.get(key);
+        if (o == null) {
+            String condition = "g.deleted is true and g.status is true";
+            Map<String, List<HomeManagementFrontView>> map = new ConcurrentHashMap<>();
+            Stream.of(HomeManagementConfig.Type.values())
+                    .forEach(type -> {
+                        MapBuilder builder = MapUtils.builder()
+                                .field(HomeManagementConfig::getType, type.name());
+                        if (type == HomeManagementConfig.Type.ex || type == HomeManagementConfig.Type.vg) {
+                            builder.put("condition", condition);
+                        }
+                        List<HomeManagementFrontView> homeManagementFrontViews = beanSearcher.searchAll(HomeManagementFrontView.class, builder.build());
+                        map.putIfAbsent(type.name(), homeManagementFrontViews);
+                    });
+            redisService.setNx(key, map, 50 * 60l);
+            return GatewayResponse.SUCCESS.newBuilder().toResult(map);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(Jsons.parseObject(o, Map.class));
+    }
+
+    /**
+     * 首页点击 记录
+     */
+    @PostMapping("/homePage/click")
+    public Result<String> homeManageClick(@RequestBody ClickRecordReq request) {
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        clickRecordFrontService.click(userId, request);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
     public List<Long> getFilterGoodsIds() {
         //过滤杭州Ai ChatGPT平台
         //获取当前ip地址
@@ -404,50 +474,50 @@ public class GoodsDonController {
      * @return
      */
     public String getPayMsgTime(Long goodsId, DateTime now, Integer type) {
-	    Date startTime = null;
-	    StringBuilder notifyMsg = new StringBuilder();
-	    if (type == 1) {
-		    OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
-				    .eq(OrderDon::getGoodsId, goodsId)
-				    .notIn(OrderDon::getStatus, Constant.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
-				    .orderByDesc(OrderDon::getId)
-				    .last("limit 1"));
-		    if (orderDon == null) {
-			    notifyMsg.append("点击购买立即上车");
-			    return notifyMsg.toString();
-		    }
-		    startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
-	    } else if (type == 2) {
-		    RegisterOrderDon orderDon = registerOrderDonMapper.selectOne(Wrappers.lambdaQuery(RegisterOrderDon.class)
-				    .eq(RegisterOrderDon::getGoodsId, goodsId)
-				    .notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus).select(RegisterOrderDon::getCreatedTime, RegisterOrderDon::getPayTime, RegisterOrderDon::getId)
-				    .orderByDesc(RegisterOrderDon::getId)
-				    .last("limit 1"));
-		    if (orderDon == null) {
-			    return null;
-		    }
-		    startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
-	    }
-	    long hour = DateUtil.between(startTime, now, DateUnit.HOUR);
-	    if (hour == 0) {
-		    long minute = DateUtil.between(startTime, now, DateUnit.MINUTE);
-		    if (minute == 0) {
-			    notifyMsg.append("1分钟");
-		    } else {
-			    notifyMsg.append(minute);
-			    notifyMsg.append("分钟");
-		    }
-	    } else {
-		    if (hour > 3) {
-			    int hours = RandomUtil.randomInt(3) + 1;
-			    notifyMsg.append(hours);
-		    } else {
-			    notifyMsg.append(hour);
-		    }
-		    notifyMsg.append("小时");
-	    }
-	    notifyMsg.append("前有人购买");
-	    return notifyMsg.toString();
+        Date startTime = null;
+        StringBuilder notifyMsg = new StringBuilder();
+        if (type == 1) {
+            OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+                    .eq(OrderDon::getGoodsId, goodsId)
+                    .notIn(OrderDon::getStatus, Constant.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
+                    .orderByDesc(OrderDon::getId)
+                    .last("limit 1"));
+            if (orderDon == null) {
+                notifyMsg.append("点击购买立即上车");
+                return notifyMsg.toString();
+            }
+            startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
+        } else if (type == 2) {
+            RegisterOrderDon orderDon = registerOrderDonMapper.selectOne(Wrappers.lambdaQuery(RegisterOrderDon.class)
+                    .eq(RegisterOrderDon::getGoodsId, goodsId)
+                    .notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus).select(RegisterOrderDon::getCreatedTime, RegisterOrderDon::getPayTime, RegisterOrderDon::getId)
+                    .orderByDesc(RegisterOrderDon::getId)
+                    .last("limit 1"));
+            if (orderDon == null) {
+                return null;
+            }
+            startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
+        }
+        long hour = DateUtil.between(startTime, now, DateUnit.HOUR);
+        if (hour == 0) {
+            long minute = DateUtil.between(startTime, now, DateUnit.MINUTE);
+            if (minute == 0) {
+                notifyMsg.append("1分钟");
+            } else {
+                notifyMsg.append(minute);
+                notifyMsg.append("分钟");
+            }
+        } else {
+            if (hour > 3) {
+                int hours = RandomUtil.randomInt(3) + 1;
+                notifyMsg.append(hours);
+            } else {
+                notifyMsg.append(hour);
+            }
+            notifyMsg.append("小时");
+        }
+        notifyMsg.append("前有人购买");
+        return notifyMsg.toString();
     }
 
     /**

+ 187 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java

@@ -0,0 +1,187 @@
+package com.cyksj.web.controller.manage.goods;
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsClickUserRecordMapper;
+import com.cyksj.model.entity.GoodsClickUserRecord;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonCategory;
+import com.cyksj.model.views.GoodsDonCategoryGoodsView;
+import com.cyksj.model.views.GoodsDonCategoryView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.mange.CmsGoodsDonService;
+import com.cyksj.service.mange.GoodsDonCategoryService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Set;
+
+/*
+ *项目名: netflix
+ *文件名: CmsGoodsDonCategoryController
+ *创建者: JavaZou
+ *创建时间:2023/8/11 13:40
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/goods/category")
+public class CmsGoodsDonCategoryController {
+	private final GoodsDonCategoryService goodsDonCategoryService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final GoodsClickUserRecordMapper goodsClickUserRecordMapper;
+
+	private final CmsGoodsDonService goodsDonService;
+
+	private final RedisService redisService;
+
+	/**
+	 * 新增分类
+	 */
+	@PostMapping("/post")
+	public Result<String> saveGoodsDonCategory(@RequestBody @Validated GoodsDonCategory category) {
+		goodsDonCategoryService.saveOrUpdateGoods(category);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 编辑分类
+	 */
+	@PutMapping("/put")
+	public Result<String> updateGoodsDonCategory(@RequestBody List<GoodsDonCategory> categorys) {
+		categorys.forEach(category -> goodsDonCategoryService.saveOrUpdateGoods(category));
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "category" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 分类上下架
+	 */
+	@PutMapping("/update/status/{id}")
+	public Result<String> updateStatusById(@PathVariable Long id) {
+		GoodsDonCategory byId = goodsDonCategoryService.getById(id);
+		Assert.notNull(byId, "分类不存在");
+		byId.setStatus(!byId.getStatus());
+		goodsDonCategoryService.updateById(byId);
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "category" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 根据id删除分类
+	 */
+	@DeleteMapping("/del/{id}")
+	public Result<String> del(@PathVariable Long id) {
+		int count = goodsDonService.count(Wrappers.lambdaQuery(GoodsDon.class)
+				.eq(GoodsDon::getCategory, id));
+		if (count > 0) {
+			throw BusinessRuntimeException.getInstance("存在该分类下平台");
+		}
+		goodsDonCategoryService.delById(id);
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "category" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 修改分类排序
+	 */
+	@PutMapping("/sort")
+	public Result<String> sortCategory(@RequestBody GoodsDonCategory category) {
+		Long id = category.getId();
+		Assert.notNull(id, "分类不存在");
+		GoodsDonCategory byId = goodsDonCategoryService.getById(id);
+		if (category.getSorted() != null) {
+			byId.setSorted(category.getSorted());
+			goodsDonCategoryService.updateById(byId);
+			Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "category" + "*");
+			redisService.del(keys.toArray(String[]::new));
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 分类列表 分页
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<GoodsDonCategoryView>> getCategory() {
+		SearchResult<GoodsDonCategoryView> search = beanSearcher.search(GoodsDonCategoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		search.getDataList().forEach(data->{
+			Integer count = goodsClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(GoodsClickUserRecord.class)
+					.eq(GoodsClickUserRecord::getCategory, data.getId()));
+			data.setClick(count);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 分类平台列表
+	 */
+	@GetMapping("/get/goods")
+	public Result<SearchResult<GoodsDonCategoryGoodsView>> getCategoryGoodsView() {
+		SearchResult<GoodsDonCategoryGoodsView> search = beanSearcher.search(GoodsDonCategoryGoodsView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		search.getDataList().forEach(data->{
+			Integer count = goodsClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(GoodsClickUserRecord.class)
+					.eq(GoodsClickUserRecord::getGoodsId, data.getGoodsId()));
+			data.setClick(count);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 修改平台排序
+	 */
+	@PutMapping("/sort/goods")
+	public Result<String> sortGoods(@RequestBody GoodsDonCategoryGoodsView request) {
+		Long goodsId = request.getGoodsId();
+		Integer sorted = request.getSorted();
+		Assert.notNull(goodsId, "平台不存在");
+		GoodsDon byId = goodsDonService.getById(goodsId);
+		if (request.getSorted() != null) {
+			byId.setSortBy(sorted);
+			goodsDonService.updateById(byId);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 获取所有分类列表
+	 */
+	@GetMapping("/get/all")
+	public Result<List<GoodsDonCategory>> getAll() {
+		List<GoodsDonCategory> search = beanSearcher.searchAll(GoodsDonCategory.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 获取所有分类下平台 树形结构
+	 */
+	@GetMapping("/get/goods/tree")
+	public Result<List<GoodsDonCategory>> getCategoryGoodsTreeView() {
+		List<GoodsDonCategory> all = beanSearcher.searchAll(GoodsDonCategory.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(GoodsDonCategory::getStatus, true)
+				.orderBy(GoodsDonCategory::getSorted).desc()
+				.build());
+		all.forEach(data -> {
+			List<GoodsDonCategoryGoodsView> categoryGoodsViewList = beanSearcher.searchAll(GoodsDonCategoryGoodsView.class, MapUtils.
+					builder().field(GoodsDonCategoryGoodsView::getCategory, data.getId())
+					.field(GoodsDonCategoryGoodsView::getStatus, true).build());
+			data.setCategoryGoodsList(categoryGoodsViewList);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(all);
+	}
+}

+ 136 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java

@@ -0,0 +1,136 @@
+package com.cyksj.web.controller.manage.home;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.HomeManagementConfig;
+import com.cyksj.model.entity.HomeManagementConfigUserClickRecord;
+import com.cyksj.model.request.HomeManageConfigReq;
+import com.cyksj.model.views.HomeManagementAvailableGoodsView;
+import com.cyksj.model.views.HomeManagementConfigView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.home.HomeManagementConfigService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Set;
+
+/*
+ *项目名: netflix
+ *文件名: HomeManageConfigController
+ *创建者: JavaZou
+ *创建时间:2023/8/17 16:46
+ */
+@RestController
+@RequestMapping("/manage/homeManage/config")
+@RequiredArgsConstructor
+public class HomeManageConfigController {
+	private final HomeManagementConfigService homeManagementConfigService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final RedisService redisService;
+
+	/**
+	 * 新增首页配置
+	 */
+	@PostMapping("/post")
+	public Result<String> saveConfig(@RequestBody HomeManageConfigReq config) {
+		homeManagementConfigService.saveOrUpdateConfig(config);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 更新首页配置
+	 */
+	@PutMapping("/put")
+	public Result<String> updateConfig(@RequestBody HomeManageConfigReq config) {
+		homeManagementConfigService.saveOrUpdateConfig(config);
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 上下架配置
+	 */
+	@PutMapping("/update/status/{id}")
+	public Result<String> updateStatusById(@PathVariable Long id) {
+		HomeManagementConfig byId = homeManagementConfigService.getById(id);
+		Assert.notNull(byId, "配置不存在");
+		byId.setStatus(!byId.getStatus());
+		homeManagementConfigService.updateById(byId);
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 配置排序
+	 */
+	@PutMapping("/sort")
+	public Result<String> sortConfig(@RequestBody HomeManageConfigReq config) {
+		Long id = config.getId();
+		HomeManagementConfig byId = homeManagementConfigService.getById(id);
+		Assert.notNull(byId, "配置不存在");
+		Integer sorted = config.getSorted();
+		byId.setSorted(sorted);
+		homeManagementConfigService.updateById(byId);
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除首页配置
+	 */
+	@DeleteMapping("/del/{id}")
+	public Result<String> delById(@PathVariable Long id) {
+		homeManagementConfigService.update(null, Wrappers.lambdaUpdate(HomeManagementConfig.class)
+						.set(HomeManagementConfig::getDeleted, false)
+						.eq(HomeManagementConfig::getId, id)
+						.eq(HomeManagementConfig::getDeleted, true));
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		redisService.del(keys.toArray(String[]::new));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 首页配置列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<HomeManagementConfigView>> get(@RequestParam(defaultValue = "ad") HomeManagementConfig.Type type) {
+		SearchResult<HomeManagementConfigView> search = beanSearcher.search(HomeManagementConfigView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(HomeManagementConfigView::getType, type.name())
+				.build());
+		search.getDataList().forEach(data -> {
+			Number number = beanSearcher.searchCount(HomeManagementConfigUserClickRecord.class, MapUtils.builder()
+					.field(HomeManagementConfigUserClickRecord::getConfigId, data.getId()).build());
+			data.setClick(number.intValue());
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 首页配置 可选平台
+	 */
+	@GetMapping("/get/goods")
+	public Result<List<HomeManagementAvailableGoodsView>> getAvailableGoodsDon(HomeManagementConfig.Type type) {
+		Assert.notNull(type, "首页配置类型为空");
+		List<HomeManagementAvailableGoodsView> views = beanSearcher.searchAll(HomeManagementAvailableGoodsView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.put("type", String.format("type = '%s' and ", type.name()))
+				.field(HomeManagementAvailableGoodsView::getGoodsType, 1)
+				.field(HomeManagementAvailableGoodsView::getStatus, true)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(views);
+	}
+}