zoujiajian 3 лет назад
Родитель
Сommit
21149fb363
42 измененных файлов с 1680 добавлено и 97 удалено
  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. 28 1
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  10. 46 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java
  11. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfigUserClickRecord.java
  12. 1 1
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSpuInsert.java
  13. 1 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/GoodsDonViewer.java
  14. 28 0
      netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java
  15. 36 0
      netflix-dao/src/main/java/com/cyksj/model/request/HomeManageConfigReq.java
  16. 71 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryDetailView.java
  17. 22 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryFrontView.java
  18. 44 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryGoodsView.java
  19. 42 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java
  20. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonPopularizeView.java
  21. 23 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSearchView.java
  22. 12 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java
  23. 8 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonViews.java
  24. 21 5
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  25. 2 2
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsHomePageView.java
  26. 33 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementAvailableGoodsView.java
  27. 58 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java
  28. 154 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java
  29. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  30. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRateView.java
  31. 13 0
      netflix-service/src/main/java/com/cyksj/service/home/ClickRecordFrontService.java
  32. 15 0
      netflix-service/src/main/java/com/cyksj/service/home/HomeManagementConfigService.java
  33. 91 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java
  34. 76 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java
  35. 16 0
      netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonCategoryService.java
  36. 45 0
      netflix-service/src/main/java/com/cyksj/service/mange/goods/GoodsDonCategoryServiceImpl.java
  37. 4 4
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  38. 329 73
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  39. 187 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java
  40. 4 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  41. 136 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java
  42. 7 0
      netflix-web/src/main/java/com/cyksj/web/util/StpUserUtil.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 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);
 	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 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);
 	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、流媒体
      * 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;
+}

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

@@ -7,6 +7,7 @@ import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 
 
@@ -128,5 +129,31 @@ public class GoodsDonSku extends BaseEntity {
      */
      */
     @DbIgnore
     @DbIgnore
     @TableField(exist = false)
     @TableField(exist = false)
-    private List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuViews;
+    private List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuList;
+
+    /**
+     * 特定价格
+     */
+    private BigDecimal specificPrice;
+
+    /**
+     * 特定平台购买用户人群
+     */
+    private String specificGoodsIds;
+
+    /**
+     * 前端展示
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    @JsonProperty("gname")
+    private String gName;
+
+    /**
+     * 前端展示
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    @JsonProperty("sname")
+    private String sName;
 }
 }

+ 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、流媒体
      * 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、流媒体
      * 1、AI  2、流媒体
      */
      */
     @DbField("g.category")
     @DbField("g.category")
-    private Integer category;
+    private Long category;
 
 
     /**
     /**
      * banner
      * 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;
+}

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

@@ -0,0 +1,71 @@
+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.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonCategoryDetailView
+ *创建者: JavaZou
+ *创建时间:2023/9/1 13:48
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g left join goods_don_category gc on gc.id = g.category")
+public class GoodsDonCategoryDetailView {
+	@DbField("g.id")
+	private Long id;
+
+	/**
+	 * 商品名称
+	 */
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * true 上架 / false 下架
+	 */
+	@DbField("g.status")
+	private Boolean status;
+
+	@DbField("g.deleted")
+	private Boolean deleted;
+
+	@DbField("g.logo")
+	private String logo;
+
+	@DbField("g.type")
+	private Integer type;
+
+	@DbField("g.category")
+	private Long category;
+
+	/**
+	 * 分类
+	 * 1、AI  2、流媒体
+	 */
+	@DbField("gc.name")
+	private String categoryTitle;
+
+	/**
+	 * 排序
+	 */
+	@DbField("g.sort_by")
+	private Integer sortBy;
+
+	/**
+	 * 虚拟销量
+	 */
+	@DbField("g.virtual_sold")
+	private Integer virtualSold;
+
+	@DbField("g.created_time")
+	private Date createdTime;
+
+	@DbField("g.update_time")
+	private Date updateTime;
+}

+ 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 asc")
+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、流媒体
 	 * 1、AI  2、流媒体
 	 */
 	 */
 	@DbField("g.category")
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 
 	@DbField("g.second_type")
 	@DbField("g.second_type")
 	private Integer secondType;
 	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;
+}

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

@@ -3,6 +3,7 @@ package com.cyksj.model.views;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 
 
@@ -93,4 +94,15 @@ public class GoodsDonSkuFrontView {
 	 */
 	 */
 	@DbIgnore
 	@DbIgnore
 	private List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuViews;
 	private List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuViews;
+
+	/**
+	 * 特定价格
+	 */
+	private BigDecimal specificPrice;
+
+	/**
+	 * 特定购买平台
+	 */
+	@JsonIgnore
+	private String specificGoodsIds;
 }
 }

+ 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.cyksj.model.entity.GoodsDon;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 
 
@@ -57,7 +58,7 @@ public class GoodsDonViews {
      * 分类
      * 分类
      * 1、AI  2、流媒体
      * 1、AI  2、流媒体
      */
      */
-    private Integer category;
+    private Long category;
 
 
     /**
     /**
      * 二级分类
      * 二级分类
@@ -122,6 +123,12 @@ public class GoodsDonViews {
      */
      */
     private String recommendGoods;
     private String recommendGoods;
 
 
+    @DbIgnore
+    private Integer sold;
+
+    @JsonIgnore
+    private Integer virtualSold;
+
     @DbIgnore
     @DbIgnore
     private List<GoodsDonSkuFrontView> skuList;
     private List<GoodsDonSkuFrontView> skuList;
 
 

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

@@ -1,11 +1,11 @@
 package com.cyksj.model.views;
 package com.cyksj.model.views;
 
 
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.GoodsDonSpec;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 
 
@@ -21,8 +21,9 @@ import java.util.List;
 @Getter
 @Getter
 @Setter
 @Setter
 @SearchBean(tables = "goods_don g",
 @SearchBean(tables = "goods_don g",
-		where = "g.deleted is true and g.status is true and g.type = 1",
-		orderBy = "g.sort_by desc, g.id")
+		where = "g.deleted is true and g.status is true",
+		orderBy = "g.sort_by asc, g.id")
+@JsonInclude(JsonInclude.Include.NON_NULL)
 public class GoodsFrontListView {
 public class GoodsFrontListView {
 	@DbField("g.id")
 	@DbField("g.id")
 	private Long id;
 	private Long id;
@@ -62,7 +63,7 @@ public class GoodsFrontListView {
 	 * 1、AI  2、流媒体
 	 * 1、AI  2、流媒体
 	 */
 	 */
 	@DbField("g.category")
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 
 	@DbField("g.second_type")
 	@DbField("g.second_type")
 	private Integer secondType;
 	private Integer secondType;
@@ -101,6 +102,21 @@ public class GoodsFrontListView {
 	@JsonIgnore
 	@JsonIgnore
 	private Integer virtualSold;
 	private Integer virtualSold;
 
 
+	@DbIgnore
+	private BigDecimal specificPrice;
+
+	@DbIgnore
+	private Long specificSkuId;
+
+	@DbField("g.pay_desc")
+	private String payDesc;
+
+	/**
+	 * 是否是特定价格平台
+	 */
+	@DbField("g.is_sp")
+	private Boolean isSp;
+
 	/**
 	/**
 	 * 购买通知信息
 	 * 购买通知信息
 	 */
 	 */
@@ -111,7 +127,7 @@ public class GoodsFrontListView {
 	private List<GoodsDonSkuFrontView> skuList;
 	private List<GoodsDonSkuFrontView> skuList;
 
 
 	@DbIgnore
 	@DbIgnore
-	private GoodsDonSpec specs;
+	private GoodsDonSpecFrontView specs;
 
 
 	@DbIgnore
 	@DbIgnore
 	private OrderCommentFrontView comments;
 	private OrderCommentFrontView comments;

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

@@ -20,7 +20,7 @@ import java.math.BigDecimal;
 @Setter
 @Setter
 @SearchBean(tables = "goods_don g",
 @SearchBean(tables = "goods_don g",
 		where = "g.deleted is true and g.status is true and g.type = 1",
 		where = "g.deleted is true and g.status is true and g.type = 1",
-		orderBy = "g.sort_by desc, g.id")
+		orderBy = "g.sort_by asc, g.id")
 public class GoodsHomePageView {
 public class GoodsHomePageView {
 	@DbField("g.id")
 	@DbField("g.id")
 	private Long id;
 	private Long id;
@@ -57,7 +57,7 @@ public class GoodsHomePageView {
 	 * 1、AI  2、流媒体
 	 * 1、AI  2、流媒体
 	 */
 	 */
 	@DbField("g.category")
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 
 	/**
 	/**
 	 * 最低规格价格
 	 * 最低规格价格

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

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

@@ -0,0 +1,154 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSpec;
+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 com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/*
+ *项目名: 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 asc")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class HomeManagementFrontView {
+	@DbField("hc.id")
+	private Long homeManageConfigId;
+
+	@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;
+
+	/**
+	 * 商品标签
+	 */
+	@DbField("g.tags")
+	private String goodsTags;
+
+	/**
+	 * 缩略图
+	 */
+	@DbField("g.logo")
+	private String goodsLogo;
+
+	/**
+	 * 背景图
+	 */
+	@DbField("g.img")
+	private String goodsImg;
+
+	/**
+	 * 类型
+	 */
+	@DbField("g.type")
+	private Integer goodsType;
+
+	/**
+	 * 分类
+	 * 1、AI  2、流媒体
+	 */
+	@DbField("g.category")
+	private Long category;
+
+	@DbField("g.second_type")
+	private Integer secondType;
+
+	@DbField("g.special_type")
+	private GoodsDon.SpecialType specialType;
+
+	/**
+	 * 最低规格价格
+	 */
+	@DbField("g.min_price")
+	private BigDecimal price;
+
+	/**
+	 * 最低规格月份
+	 */
+	@DbField("g.min_months")
+	private Integer months;
+
+	/**
+	 * 最低规格天数
+	 */
+	@DbField("g.min_days")
+	private Integer days;
+
+	/**
+	 * 已售
+	 */
+	@DbIgnore
+	private Integer sold;
+
+	/**
+	 * 虚拟销量
+	 */
+	@DbField("g.virtual_sold")
+	@JsonIgnore
+	private Integer virtualSold;
+
+	@DbIgnore
+	private BigDecimal specificPrice;
+
+	@DbIgnore
+	private Long specificSkuId;
+
+	@DbField("g.pay_desc")
+	private String payDesc;
+
+	/**
+	 * 是否是特定价格平台
+	 */
+	@DbField("g.is_sp")
+	private Boolean isSp;
+
+	/**
+	 * 购买通知信息
+	 */
+	@DbIgnore
+	private String notifyMsg;
+
+	@DbIgnore
+	private List<GoodsDonSkuFrontView> skuList;
+
+	@DbIgnore
+	private GoodsDonSpec specs;
+
+	@DbIgnore
+	private OrderCommentFrontView comments;
+}

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

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

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

@@ -18,7 +18,7 @@ import lombok.Setter;
 public class UserDistributeRateView {
 public class UserDistributeRateView {
 
 
 	@DbField("g.category")
 	@DbField("g.category")
-	private Integer category;
+	private Long category;
 
 
 	@DbField("g.title")
 	@DbField("g.title")
 	private String 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);
 		excelMonthlyDistributeOrderData.setMonthDsFAmountOfOrder(monthDsFAmountOfOrder);
 		//自然渠道
 		//自然渠道
 		//流媒体
 		//流媒体
-		BigDecimal monthStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 2, startDate, endDate);
+		BigDecimal monthStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 2l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthStreamingAmountOfOrder(monthStreamingAmountOfOrder);
 		excelMonthlyDistributeOrderData.setMonthStreamingAmountOfOrder(monthStreamingAmountOfOrder);
 		// AI销售金额
 		// AI销售金额
-		BigDecimal monthAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 1, startDate, endDate);
+		BigDecimal monthAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, null, 1l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthAiAmountOfOrder(monthAiAmountOfOrder);
 		excelMonthlyDistributeOrderData.setMonthAiAmountOfOrder(monthAiAmountOfOrder);
 		//设备销售金额
 		//设备销售金额
 		BigDecimal monthOfEqAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, 2, null, startDate, endDate);
 		BigDecimal monthOfEqAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(1, 2, null, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthOfEqAmountOfOrder(monthOfEqAmountOfOrder);
 		excelMonthlyDistributeOrderData.setMonthOfEqAmountOfOrder(monthOfEqAmountOfOrder);
 		//渠道商+个人分销
 		//渠道商+个人分销
 		//流媒体
 		//流媒体
-		BigDecimal monthOfSpecStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 2, startDate, endDate);
+		BigDecimal monthOfSpecStreamingAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 2l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthOfSpecStreamingAmountOfOrder(monthOfSpecStreamingAmountOfOrder);
 		excelMonthlyDistributeOrderData.setMonthOfSpecStreamingAmountOfOrder(monthOfSpecStreamingAmountOfOrder);
 		// AI销售金额
 		// AI销售金额
-		BigDecimal monthOfSpecAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 1, startDate, endDate);
+		BigDecimal monthOfSpecAiAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, null, 1l, startDate, endDate);
 		excelMonthlyDistributeOrderData.setMonthOfSpecAiAmountOfOrder(monthOfSpecAiAmountOfOrder);
 		excelMonthlyDistributeOrderData.setMonthOfSpecAiAmountOfOrder(monthOfSpecAiAmountOfOrder);
 		//设备销售金额
 		//设备销售金额
 		BigDecimal monthOfSpecEqAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, 2, null, startDate, endDate);
 		BigDecimal monthOfSpecEqAmountOfOrder = statisticsExportMapper.getMonthGoodsTypeAmountOfOrderByType(2, 2, null, startDate, endDate);

+ 329 - 73
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -15,11 +15,14 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
+import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ClickRecordReq;
 import com.cyksj.model.views.*;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 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.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.param.Operator;
@@ -30,9 +33,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
 
 
 /**
 /**
  * @author chan
  * @author chan
@@ -58,6 +62,35 @@ public class GoodsDonController {
 
 
     private final SysConfigMapper sysConfigMapper;
     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);
+    }
+
     /**
     /**
      * 获取商品列表
      * 获取商品列表
      */
      */
@@ -66,7 +99,7 @@ public class GoodsDonController {
         SearchResult<GoodsDon> search = beanSearcher.search(GoodsDon.class, MapUtils.flatBuilder(request.getParameterMap())
         SearchResult<GoodsDon> search = beanSearcher.search(GoodsDon.class, MapUtils.flatBuilder(request.getParameterMap())
                 .field(GoodsDon::getStatus, true)
                 .field(GoodsDon::getStatus, true)
                 .field(GoodsDon::getDeleted, true)
                 .field(GoodsDon::getDeleted, true)
-                .orderBy(GoodsDon::getSortBy).desc()
+                .orderBy(GoodsDon::getSortBy).asc()
                 .orderBy(GoodsDon::getId).asc()
                 .orderBy(GoodsDon::getId).asc()
                 .build()
                 .build()
         );
         );
@@ -95,7 +128,7 @@ public class GoodsDonController {
                 .field(GoodsDonPopularizeView::getStatus, true)
                 .field(GoodsDonPopularizeView::getStatus, true)
                 .field(GoodsDonPopularizeView::getDeleted, true)
                 .field(GoodsDonPopularizeView::getDeleted, true)
                 .field(GoodsDonPopularizeView::getType, 1)
                 .field(GoodsDonPopularizeView::getType, 1)
-                .orderBy(GoodsDonPopularizeView::getSortBy).desc()
+                .orderBy(GoodsDonPopularizeView::getSortBy).asc()
                 .orderBy(GoodsDonPopularizeView::getId).asc()
                 .orderBy(GoodsDonPopularizeView::getId).asc()
                 .build());
                 .build());
         DateTime now = DateTime.now();
         DateTime now = DateTime.now();
@@ -161,11 +194,14 @@ public class GoodsDonController {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
             pcCacheKey += ":hz-ip";
             pcCacheKey += ":hz-ip";
         }
         }
+        Long fUid = StpUserUtil.getUserIdAfterLogin();
         Object value = redisService.get(pcCacheKey);
         Object value = redisService.get(pcCacheKey);
         if (value != null) {
         if (value != null) {
             try {
             try {
-                List<GoodsFrontListView> list = Jsons.parseObject(value, List.class);
+                List<GoodsFrontListView> list = Jsons.parseList(value, GoodsFrontListView.class);
                 if (CollUtil.isNotEmpty(list)) {
                 if (CollUtil.isNotEmpty(list)) {
+                    //设置特定价格
+                    setSpecificPrice(list, fUid);
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
@@ -175,17 +211,18 @@ public class GoodsDonController {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
             builder.field(GoodsFrontListView::getId, filter_goodsIds).op(Operator.NotIn);
             builder.field(GoodsFrontListView::getId, filter_goodsIds).op(Operator.NotIn);
         }
         }
+        builder.field(GoodsFrontListView::getType, 1);
         List<GoodsFrontListView> list = beanSearcher.searchAll(GoodsFrontListView.class, builder.build());
         List<GoodsFrontListView> list = beanSearcher.searchAll(GoodsFrontListView.class, builder.build());
         DateTime now = DateTime.now();
         DateTime now = DateTime.now();
         list.forEach(data -> {
         list.forEach(data -> {
-            data.setSpecs(beanSearcher.searchFirst(GoodsDonSpec.class, MapUtils.builder().field(GoodsDonSpec::getGoodsId, data.getId()).build()));
-            data.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, data.getId()).field(GoodsDonSkuFrontView::getStatus, true).orderBy(GoodsDonSkuFrontView::getPrice).asc().build()));
-            data.getSkuList().forEach(sku -> {
-                if (sku.getIsDp()) {
-                    List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuViews = beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelationFrontView.class, MapUtils.builder().field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId()).build());
-                    sku.setDpSkuViews(dpSkuViews);
-                }
-            });
+//            data.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, data.getId()).build()));
+//            data.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, data.getId()).field(GoodsDonSkuFrontView::getStatus, true).orderBy(GoodsDonSkuFrontView::getPrice).asc().build()));
+//            data.getSkuList().forEach(sku -> {
+//                if (sku.getIsDp()) {
+//                    List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuViews = beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelationFrontView.class, MapUtils.builder().field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId()).build());
+//                    sku.setDpSkuViews(dpSkuViews);
+//                }
+//            });
             Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
             Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
                     .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
                     .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
             data.setSold(sold + data.getVirtualSold());
             data.setSold(sold + data.getVirtualSold());
@@ -195,9 +232,11 @@ public class GoodsDonController {
                     .orderBy(OrderCommentFrontView::getId).desc()
                     .orderBy(OrderCommentFrontView::getId).desc()
                     .build());
                     .build());
             data.setComments(comments);
             data.setComments(comments);
-	        data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
+            data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
         });
         });
         redisService.setNx(pcCacheKey, list, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
         redisService.setNx(pcCacheKey, list, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
+        //设置特定价格
+        setSpecificPrice(list, fUid);
         return GatewayResponse.SUCCESS.newBuilder().toResult(list);
         return GatewayResponse.SUCCESS.newBuilder().toResult(list);
     }
     }
 
 
@@ -205,17 +244,21 @@ public class GoodsDonController {
      * h5 银河首页平台展示
      * h5 银河首页平台展示
      */
      */
     @GetMapping("/get/homePage")
     @GetMapping("/get/homePage")
-    public Result<List<GoodsHomePageView>> getGoodsHomePage() {
+    @Deprecated
+    public Result<List<GoodsFrontListView>> getGoodsHomePage() {
         List<Long> filter_goodsIds = getFilterGoodsIds();
         List<Long> filter_goodsIds = getFilterGoodsIds();
         String h5CacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "H5";
         String h5CacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "H5";
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
             h5CacheKey += ":hz-ip";
             h5CacheKey += ":hz-ip";
         }
         }
+        Long fUid = StpUserUtil.getUserIdAfterLogin();
         Object value = redisService.get(h5CacheKey);
         Object value = redisService.get(h5CacheKey);
         if (value != null) {
         if (value != null) {
             try {
             try {
-                List<GoodsHomePageView> list = Jsons.parseObject(value, List.class);
+                List<GoodsFrontListView> list = Jsons.parseList(value, GoodsFrontListView.class);
                 if (CollUtil.isNotEmpty(list)) {
                 if (CollUtil.isNotEmpty(list)) {
+                    //设置特定价格
+                    setSpecificPrice(list, fUid);
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
@@ -225,7 +268,8 @@ public class GoodsDonController {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
             builder.field(GoodsFrontListView::getId, filter_goodsIds).op(Operator.NotIn);
             builder.field(GoodsFrontListView::getId, filter_goodsIds).op(Operator.NotIn);
         }
         }
-        List<GoodsHomePageView> dataList = beanSearcher.searchAll(GoodsHomePageView.class, builder.build());
+        builder.field(GoodsFrontListView::getType, 1);
+        List<GoodsFrontListView> dataList = beanSearcher.searchAll(GoodsFrontListView.class, builder.build());
         DateTime now = DateTime.now();
         DateTime now = DateTime.now();
         dataList.forEach(data -> {
         dataList.forEach(data -> {
             Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
             Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
@@ -234,6 +278,8 @@ public class GoodsDonController {
             data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
             data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
         });
         });
         redisService.setNx(h5CacheKey, dataList, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
         redisService.setNx(h5CacheKey, dataList, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
+        //设置特定价格
+        setSpecificPrice(dataList, fUid);
         return GatewayResponse.SUCCESS.newBuilder().toResult(dataList);
         return GatewayResponse.SUCCESS.newBuilder().toResult(dataList);
     }
     }
 
 
@@ -255,12 +301,12 @@ public class GoodsDonController {
         }
         }
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         List<RegisterGoodsDonView> dataList = beanSearcher.searchAll(RegisterGoodsDonView.class, builder.build());
         List<RegisterGoodsDonView> dataList = beanSearcher.searchAll(RegisterGoodsDonView.class, builder.build());
-	    DateTime now = DateTime.now();
-	    dataList.forEach(data->{
+        DateTime now = DateTime.now();
+        dataList.forEach(data -> {
             Integer sold = registerOrderDonMapper.selectCount(Wrappers.lambdaQuery(RegisterOrderDon.class)
             Integer sold = registerOrderDonMapper.selectCount(Wrappers.lambdaQuery(RegisterOrderDon.class)
                     .eq(RegisterOrderDon::getGoodsId, data.getId()).notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus));
                     .eq(RegisterOrderDon::getGoodsId, data.getId()).notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus));
             data.setSold(sold + data.getVirtualSold());
             data.setSold(sold + data.getVirtualSold());
-		    data.setNotifyMsg(getPayMsgTime(data.getId(), now, 2));
+            data.setNotifyMsg(getPayMsgTime(data.getId(), now, 2));
         });
         });
         redisService.setNx(registerCacheKey, dataList, RedisService.key.REGISTER_HOME_PAGE_CACHE.getTimeout());
         redisService.setNx(registerCacheKey, dataList, RedisService.key.REGISTER_HOME_PAGE_CACHE.getTimeout());
         return GatewayResponse.SUCCESS.newBuilder().toResult(dataList);
         return GatewayResponse.SUCCESS.newBuilder().toResult(dataList);
@@ -271,8 +317,14 @@ public class GoodsDonController {
      * 获取商品详情
      * 获取商品详情
      */
      */
     @GetMapping("/get/{id}")
     @GetMapping("/get/{id}")
-    public Result<GoodsDonViews> getDetail(@PathVariable Long id) {
-        GoodsDonViews views = beanSearcher.searchFirst(GoodsDonViews.class, MapUtils.builder().field(GoodsDonViews::getId, id).build());
+    public Result<GoodsFrontListView> getDetail(@PathVariable Long id) {
+        Long fUid = StpUserUtil.getUserIdAfterLogin();
+        GoodsFrontListView views = beanSearcher.searchFirst(GoodsFrontListView.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()));
         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);
         MapBuilder builder = MapUtils.builder().field(GoodsDonSku::getGoodsId, views.getId()).field(GoodsDonSku::getStatus, true);
@@ -287,6 +339,30 @@ public class GoodsDonController {
                         .field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId())
                         .field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId())
                         .build()));
                         .build()));
             }
             }
+            if (views.getIsSp()) {
+                if (fUid == null) {
+                    sku.setSpecificPrice(null);
+                    sku.setSpecificGoodsIds(null);
+                    return;
+                }
+                //设置特定价格
+                if (!isPaySpecificGoodsIds(sku.getSpecificGoodsIds(), fUid)) {
+                    sku.setSpecificGoodsIds(null);
+                    sku.setSpecificPrice(null);
+                } else {
+                    BigDecimal specificPrice = views.getSpecificPrice();
+
+                    BigDecimal skuSpecificPrice = sku.getSpecificPrice();
+                    Long specificSkuId = sku.getId();
+                    if (specificPrice == null) {
+                        views.setSpecificPrice(skuSpecificPrice);
+                        views.setSpecificSkuId(specificSkuId);
+                    } else if (specificPrice.compareTo(skuSpecificPrice) > 0) {
+                        views.setSpecificPrice(skuSpecificPrice);
+                        views.setSpecificSkuId(specificSkuId);
+                    }
+                }
+            }
         });
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(views);
         return GatewayResponse.SUCCESS.newBuilder().toResult(views);
     }
     }
@@ -295,11 +371,13 @@ public class GoodsDonController {
      * 获取商品推荐平台
      * 获取商品推荐平台
      */
      */
     @GetMapping("/get/recommend/{id}")
     @GetMapping("/get/recommend/{id}")
-    public Result<List<GoodsRecommendViews>> getRecommendGoodsByGid(@PathVariable Long id) throws Exception {
+    public Result<List<GoodsFrontListView>> getRecommendGoodsByGid(@PathVariable Long id) throws Exception {
         String key = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "recommend:" + id;
         String key = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "recommend:" + id;
         Object value = redisService.get(key);
         Object value = redisService.get(key);
+        Long fUid = StpUserUtil.getUserIdAfterLogin();
         if (value != null) {
         if (value != null) {
-            List<GoodsRecommendViews> goodsRecommendViews = Jsons.parseList(value.toString(), GoodsRecommendViews.class);
+            List<GoodsFrontListView> goodsRecommendViews = Jsons.parseList(value.toString(), GoodsFrontListView.class);
+            setSpecificPrice(goodsRecommendViews, fUid);
             return GatewayResponse.SUCCESS.newBuilder().toResult(goodsRecommendViews);
             return GatewayResponse.SUCCESS.newBuilder().toResult(goodsRecommendViews);
         }
         }
         if (value == null) {
         if (value == null) {
@@ -310,13 +388,15 @@ public class GoodsDonController {
                     .build());
                     .build());
             if (goodsDon != null && StrUtil.isNotEmpty(goodsDon.getRecommendGoods())) {
             if (goodsDon != null && StrUtil.isNotEmpty(goodsDon.getRecommendGoods())) {
                 List<Long> recommend_gidList = Jsons.parseList(goodsDon.getRecommendGoods(), Long.class);
                 List<Long> recommend_gidList = Jsons.parseList(goodsDon.getRecommendGoods(), Long.class);
-                List<GoodsRecommendViews> goodsRecommendViews = beanSearcher.searchAll(GoodsRecommendViews.class, MapUtils.builder().field(GoodsRecommendViews::getGoodsId, recommend_gidList).op(Operator.InList).build());
-                goodsRecommendViews.forEach(data->{
+                List<GoodsFrontListView> goodsRecommendViews = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.builder().field(GoodsRecommendViews::getGoodsId, recommend_gidList).op(Operator.InList).build());
+                goodsRecommendViews.forEach(data -> {
                     Integer sold = registerOrderDonMapper.selectCount(Wrappers.lambdaQuery(RegisterOrderDon.class)
                     Integer sold = registerOrderDonMapper.selectCount(Wrappers.lambdaQuery(RegisterOrderDon.class)
-                            .eq(RegisterOrderDon::getGoodsId, data.getGoodsId()).notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus));
+                            .eq(RegisterOrderDon::getGoodsId, data.getId()).notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus));
                     data.setSold(sold + data.getVirtualSold());
                     data.setSold(sold + data.getVirtualSold());
                 });
                 });
                 redisService.setNx(key, Jsons.toJson(goodsRecommendViews), 60 * 15l);
                 redisService.setNx(key, Jsons.toJson(goodsRecommendViews), 60 * 15l);
+                //设置特定价格
+                setSpecificPrice(goodsRecommendViews, fUid);
                 return GatewayResponse.SUCCESS.newBuilder().toResult(goodsRecommendViews);
                 return GatewayResponse.SUCCESS.newBuilder().toResult(goodsRecommendViews);
             }
             }
         }
         }
@@ -349,6 +429,70 @@ public class GoodsDonController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
         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";
+        Long fUid = StpUserUtil.getUserIdAfterLogin();
+        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());
+                        if (type == HomeManagementConfig.Type.ex || type == HomeManagementConfig.Type.vg) {
+                            DateTime now = DateTime.now();
+                            homeManagementFrontViews.forEach(data -> {
+                                Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+                                        .eq(OrderDon::getGoodsId, data.getGoodsId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
+                                data.setSold(sold + data.getVirtualSold());
+                                data.setNotifyMsg(getPayMsgTime(data.getGoodsId(), now, 1));
+                            });
+                        }
+                        map.putIfAbsent(type.name(), homeManagementFrontViews);
+                    });
+            redisService.setNx(key, map, 50 * 60l);
+            o = redisService.get(key);
+        }
+        Map<String, List<HomeManagementFrontView>> map = Jsons.parseObject(o, Map.class);
+        if (map.containsKey(HomeManagementConfig.Type.ex.name()) || map.containsKey(HomeManagementConfig.Type.vg.name())) {
+            try {
+                //设置特定价格
+                List<HomeManagementFrontView> exList = Jsons.parseList(Jsons.toJson(map.get(HomeManagementConfig.Type.ex.name())), HomeManagementFrontView.class);
+                if (CollUtil.isNotEmpty(exList)) {
+                    setHomeManageSpecific(exList, fUid);
+                    map.put(HomeManagementConfig.Type.ex.name(), exList);
+                }
+                //设置特定价格
+                List<HomeManagementFrontView> vgList = Jsons.parseList(Jsons.toJson(map.get(HomeManagementConfig.Type.vg.name())), HomeManagementFrontView.class);
+                if (CollUtil.isNotEmpty(vgList)) {
+                    setHomeManageSpecific(vgList, fUid);
+                    map.put(HomeManagementConfig.Type.vg.name(), vgList);
+                }
+            } catch (Exception e) {
+            }
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(map);
+    }
+
+    /**
+     * 首页点击 记录
+     */
+    @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() {
     public List<Long> getFilterGoodsIds() {
         //过滤杭州Ai ChatGPT平台
         //过滤杭州Ai ChatGPT平台
         //获取当前ip地址
         //获取当前ip地址
@@ -373,49 +517,161 @@ public class GoodsDonController {
      * @return
      * @return
      */
      */
     public String getPayMsgTime(Long goodsId, DateTime now, Integer type) {
     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();
+    }
+
+    /**
+     * 设置平台 特定价格
+     */
+    public void setSpecificPrice(List<GoodsFrontListView> list, Long fUid) {
+        if (fUid != null && CollUtil.isNotEmpty(list)) {
+            list.forEach(data -> {
+                if (data.getIsSp()) {
+                    //查找所有特定规格最小价格 满足条件
+                    List<GoodsDonSku> specificSkus = getSpecificSku(data.getId());
+                    specificSkus.forEach(specificSku -> {
+                        String specificGoodsIdsStr = specificSku.getSpecificGoodsIds();
+                        if (isPaySpecificGoodsIds(specificGoodsIdsStr, fUid)) {
+                            BigDecimal specificPrice = data.getSpecificPrice();
+                            BigDecimal skuSpecificPrice = specificSku.getSpecificPrice();
+                            Long specificSkuId = specificSku.getId();
+                            if (specificPrice == null) {
+                                data.setSpecificPrice(skuSpecificPrice);
+                                data.setSpecificSkuId(specificSkuId);
+                            } else if (specificPrice.compareTo(skuSpecificPrice) > 0) {
+                                data.setSpecificPrice(skuSpecificPrice);
+                                data.setSpecificSkuId(specificSkuId);
+                            }
+                        }
+                    });
+                    //先保留
+                    List<GoodsDonSkuFrontView> skuList = data.getSkuList();
+                    if (CollUtil.isNotEmpty(skuList)) {
+                        skuList.forEach(sku -> {
+                            //设置特定价格
+                            if (!isPaySpecificGoodsIds(sku.getSpecificGoodsIds(), fUid)) {
+                                sku.setSpecificGoodsIds(null);
+                                sku.setSpecificPrice(null);
+                            }
+                        });
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 是否购买过特定平台
+     */
+    public Boolean isPaySpecificGoodsIds(String specificGoodsIdsStr, Long userId) {
+        if (StrUtil.isNotBlank(specificGoodsIdsStr)) {
+            try {
+                Set<Long> specificGoodsIds = Jsons.parseSet(specificGoodsIdsStr, Long.class);
+                Number number = beanSearcher.searchCount(OrderDon.class, MapUtils.builder().field(OrderDon::getGoodsId, specificGoodsIds).op(Operator.InList)
+                        .field(OrderDon::getUserId, userId)
+                        .field(OrderDon::getStatus, Constant.noOrderAllStatus).op(Operator.NotIn)
+                        .build());
+                if (number.intValue() == 0) {
+                    return false;
+                }
+                return true;
+            } catch (Exception e) {
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 获取特定规格
+     */
+    public List<GoodsDonSku> getSpecificSku(Long goodsId) {
+        //查找所有特定规格最小价格 满足条件
+        String specificGoodsKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "specific:" + goodsId;
+        Object speciObj = redisService.get(specificGoodsKey);
+        List<GoodsDonSku> specificSkus = null;
+        if (speciObj != null) {
+            specificSkus = Jsons.parseList(speciObj, GoodsDonSku.class);
+        } else {
+            specificSkus = goodsDonSkuMapper.selectList(
+                    Wrappers.lambdaQuery(GoodsDonSku.class)
+                            .eq(GoodsDonSku::getGoodsId, goodsId)
+                            .eq(GoodsDonSku::getStatus, true)
+                            .gt(GoodsDonSku::getSpecificPrice, 0));
+            redisService.setNx(specificGoodsKey, specificSkus, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
+        }
+        specificSkus = Optional.ofNullable(specificSkus).orElse(new ArrayList<>());
+        return specificSkus;
+    }
+
+    /**
+     * 设置首页配置 涉及平台特定价格
+     */
+    public void setHomeManageSpecific(List<HomeManagementFrontView> list, Long fUid) {
+        if (fUid != null && CollUtil.isNotEmpty(list)) {
+            list.forEach(data -> {
+                if (data.getIsSp() != null && data.getIsSp()) {
+                    //查找所有特定规格最小价格 满足条件
+                    List<GoodsDonSku> specificSkus = getSpecificSku(data.getGoodsId());
+                    specificSkus.forEach(specificSku -> {
+                        String specificGoodsIdsStr = specificSku.getSpecificGoodsIds();
+                        if (isPaySpecificGoodsIds(specificGoodsIdsStr, fUid)) {
+                            BigDecimal specificPrice = data.getSpecificPrice();
+                            BigDecimal skuSpecificPrice = specificSku.getSpecificPrice();
+                            Long specificSkuId = specificSku.getId();
+                            if (specificPrice == null) {
+                                data.setSpecificPrice(skuSpecificPrice);
+                                data.setSpecificSkuId(specificSkuId);
+                            } else if (specificPrice.compareTo(skuSpecificPrice) > 0) {
+                                data.setSpecificPrice(skuSpecificPrice);
+                                data.setSpecificSkuId(specificSkuId);
+                            }
+                        }
+                    });
+                }
+            });
+        }
     }
     }
 }
 }

+ 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);
+	}
+}

+ 4 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -15,6 +15,7 @@ import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.manage.request.ReqGoodsSpuInsert;
 import com.cyksj.model.manage.request.ReqGoodsSpuInsert;
 import com.cyksj.model.manage.views.GoodsDonViewer;
 import com.cyksj.model.manage.views.GoodsDonViewer;
+import com.cyksj.model.views.GoodsDonCategoryDetailView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.BeanSearcher;
@@ -50,9 +51,9 @@ public class CmsGoodsDonController {
     private final RedisService redisService;
     private final RedisService redisService;
 
 
     @GetMapping("/get")
     @GetMapping("/get")
-    public Result<SearchResult<GoodsDon>> get(){
-        SearchResult<GoodsDon> search = beanSearcher.search(GoodsDon.class, MapUtils.flatBuilder(request.getParameterMap())
-                .field(GoodsDon::getDeleted,true)
+    public Result<SearchResult<GoodsDonCategoryDetailView>> get(){
+        SearchResult<GoodsDonCategoryDetailView> search = beanSearcher.search(GoodsDonCategoryDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+                .field(GoodsDonCategoryDetailView::getDeleted,true)
                 .build());
                 .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
     }

+ 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);
+	}
+}

+ 7 - 0
netflix-web/src/main/java/com/cyksj/web/util/StpUserUtil.java

@@ -86,6 +86,13 @@ public class StpUserUtil {
         return stpLogic.isLogin();
         return stpLogic.isLogin();
     }
     }
 
 
+    public static Long getUserIdAfterLogin() {
+        if (isLogin()) {
+            return StpUserUtil.getLoginIdAsLong();
+        }
+        return null;
+    }
+
     public static void checkLogin() {
     public static void checkLogin() {
         stpLogic.checkLogin();
         stpLogic.checkLogin();
     }
     }