소스 검색

Merge branch 'information-27'

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/redis/RedisService.java
#	netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSkuServiceImpl.java
zoujiajian 2 년 전
부모
커밋
23771de05a
93개의 변경된 파일2534개의 추가작업 그리고 203개의 파일을 삭제
  1. 4 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 35 0
      netflix-common/src/main/java/com/cyksj/common/util/TimeUtil.java
  3. 15 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationCategoryMapper.java
  4. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationClickUserRecordMapper.java
  5. 20 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationMapper.java
  6. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/SearchHistoryMapper.java
  7. 21 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserSysMsgNotifyMapper.java
  8. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/order/ShoppingCartDonMapper.java
  9. 28 0
      netflix-dao/src/main/java/com/cyksj/model/dto/RealGoodsConfigDto.java
  10. 11 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
  11. 4 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonCategory.java
  12. 42 1
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java
  13. 78 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Information.java
  14. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/InformationCategory.java
  15. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/InformationClickUserRecord.java
  16. 10 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  17. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SearchHistory.java
  18. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ShoppingCartDon.java
  19. 1 1
      netflix-dao/src/main/java/com/cyksj/model/entity/SignUser.java
  20. 3 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Task.java
  21. 9 7
      netflix-dao/src/main/java/com/cyksj/model/entity/UserBalanceSourceRecord.java
  22. 30 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserSysMsgNotify.java
  23. 28 19
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuSpec.java
  24. 7 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSpuInsert.java
  25. 9 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/GoodsDonViewer.java
  26. 1 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  27. 6 0
      netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java
  28. 9 0
      netflix-dao/src/main/java/com/cyksj/model/request/HomeManageConfigReq.java
  29. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  30. 0 0
      netflix-dao/src/main/java/com/cyksj/model/request/ShoppingCartDonReq.java
  31. 44 0
      netflix-dao/src/main/java/com/cyksj/model/request/UnifiedOrderPayReq.java
  32. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryGoodsView.java
  33. 8 3
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java
  34. 142 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonDetailFrontView.java
  35. 36 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuDetailView.java
  36. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListCategoryView.java
  37. 12 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  38. 13 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java
  39. 17 1
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java
  40. 95 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationDetailView.java
  41. 52 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationListView.java
  42. 122 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationView.java
  43. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/OrderDonUserCommentView.java
  44. 17 0
      netflix-dao/src/main/java/com/cyksj/model/views/SearchView.java
  45. 25 0
      netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonPayDetailView.java
  46. 41 0
      netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonView.java
  47. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/TaskFrontView.java
  48. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/TaskView.java
  49. 12 0
      netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsFrontView.java
  50. 11 0
      netflix-dao/src/main/resources/mapper/InformationCategoryMapper.xml
  51. 28 0
      netflix-dao/src/main/resources/mapper/InformationMapper.xml
  52. 23 0
      netflix-dao/src/main/resources/mapper/UserSysMsgNotifyMapper.xml
  53. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  54. 15 0
      netflix-service/src/main/java/com/cyksj/service/goods/GoodsDonFrontService.java
  55. 104 0
      netflix-service/src/main/java/com/cyksj/service/goods/impl/GoodsDonFrontServiceImpl.java
  56. 16 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java
  57. 9 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java
  58. 14 0
      netflix-service/src/main/java/com/cyksj/service/information/InformationCategoryService.java
  59. 17 0
      netflix-service/src/main/java/com/cyksj/service/information/InformationService.java
  60. 21 0
      netflix-service/src/main/java/com/cyksj/service/information/impl/InformationCategoryServiceImpl.java
  61. 32 0
      netflix-service/src/main/java/com/cyksj/service/information/impl/InformationServiceImpl.java
  62. 1 1
      netflix-service/src/main/java/com/cyksj/service/mange/CmsGroupService.java
  63. 1 1
      netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSkuServiceImpl.java
  64. 16 3
      netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java
  65. 7 5
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  66. 24 3
      netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java
  67. 1 1
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java
  68. 18 0
      netflix-service/src/main/java/com/cyksj/service/order/ShoppingCartDonService.java
  69. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonCommentServiceImpl.java
  70. 61 9
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  71. 79 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/ShoppingCartOrderServiceImpl.java
  72. 11 2
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  73. 7 7
      netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java
  74. 70 70
      netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java
  75. 33 26
      netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java
  76. 2 2
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  77. 20 0
      netflix-service/src/main/java/com/cyksj/service/user/UserSysMsgNotifyService.java
  78. 13 11
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  79. 0 3
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserIdentCertServiceImpl.java
  80. 9 10
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  81. 64 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserSysMsgNotifyServiceImpl.java
  82. 64 0
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  83. 82 0
      netflix-web/src/main/java/com/cyksj/web/controller/information/InformationController.java
  84. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  85. 4 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
  86. 9 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java
  87. 203 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/information/CmsInformationController.java
  88. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java
  89. 14 2
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  90. 100 0
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderShopCartController.java
  91. 84 0
      netflix-web/src/main/java/com/cyksj/web/controller/search/SearchController.java
  92. 81 0
      netflix-web/src/main/java/com/cyksj/web/controller/sys/UserSysMsgController.java
  93. 14 6
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

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

@@ -252,6 +252,10 @@ public interface Constant {
 	 */
 	Integer CORP_LINK_JOB_ID = 192;
 
+	String ACCOUNT_PWD_UPDATE_SYS_MSG_NOTIFY = "您购买的%s账号,密码已修改";
+
+	String ACCOUNT_SET_SYS_MSG_NOTIFY = "您购买的%s账号,账号已配置";
+
 	String DUTY_SERVICE_CHANGE_MSG = "%s值班人员不足三人【银河录像局】";
 
 	/**

+ 35 - 0
netflix-common/src/main/java/com/cyksj/common/util/TimeUtil.java

@@ -0,0 +1,35 @@
+package com.cyksj.common.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 18:06
+ */
+public class TimeUtil {
+    /**
+     * 差值日期
+     */
+    public static String getDifferenceTime(Date date){
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        long span = (System.currentTimeMillis() - date.getTime()) / 1000;
+        //比当前时间还大
+        if(span < 0){
+            return format.format(date);
+        }else if(span/(60*60*24*30) > 0){
+            //大于30天直接显示年月日
+            return format.format(date);
+        }else if(span/(60*60*24*7) > 0){
+            return  span/(60*60*24*7) +"周前";
+        }else if(span/(60*60*24) > 0){
+            return span/(60*60*24) +"天前";
+        }else if(span/(60*60) > 0 ){
+            return span/(60*60) +"小时前";
+        }else if(span/(60) > 0){
+            return span/(60) +"分钟前";
+        }
+
+        return "刚刚";
+    }
+}

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationCategoryMapper.java

@@ -0,0 +1,15 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.InformationCategory;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:47
+ */
+public interface InformationCategoryMapper extends BaseMapper<InformationCategory> {
+    List<InformationCategory> getInformationCategory();
+
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationClickUserRecordMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.InformationClickUserRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 14:03
+ */
+public interface InformationClickUserRecordMapper extends BaseMapper<InformationClickUserRecord> {
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationMapper.java

@@ -0,0 +1,20 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:32
+ */
+public interface InformationMapper extends BaseMapper<Information> {
+    IPage<InformationListView> getInformation(@Param("page") Page<InformationListView> page, @Param("categoryId") Long categoryId);
+
+    List<InformationListView> getInformationByTitle(@Param("title") String title);
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/SearchHistoryMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SearchHistory;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 10:55
+ */
+public interface SearchHistoryMapper extends BaseMapper<SearchHistory> {
+}

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserSysMsgNotifyMapper.java

@@ -0,0 +1,21 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.entity.UserSysMsgNotify;
+import com.cyksj.model.manage.views.GroupsRelationView;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSysMsgNotifyMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/2/4 16:02
+ */
+public interface UserSysMsgNotifyMapper extends BaseMapper<UserSysMsgNotify> {
+	void recordUserAccountUpdateSysMsg(@Param("goodsId") Long goodsId, @Param("skuId") Long skuId, @Param("list") List<GroupsRelationView> relations, @Param("account") String account, @Param("msg") String msg);
+
+	void recordUserAccountSetSysMsg(@Param("goodsId") Long goodsId, @Param("skuId") Long skuId, @Param("list") List<GroupsRelation> collect, @Param("account") String account, @Param("msg") String msg);
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.order;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ShoppingCartDon;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 15:47
+ */
+public interface ShoppingCartDonMapper extends BaseMapper<ShoppingCartDon> {
+}

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/RealGoodsConfigDto.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: RealGoodsConfigDto
+ * 创建者: JavaZou
+ * 创建时间:2023/10/19 17:16
+ */
+@Getter
+@Setter
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class RealGoodsConfigDto {
+	private Long id;
+
+	private String title;
+
+	private String logo;
+
+	private String tags;
+
+	private BigDecimal price;
+}

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

@@ -47,6 +47,12 @@ public class GoodsDon extends BaseEntity {
      */
     private String img;
 
+    /**
+     * 视频封面
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String videoCover;
+
 
     /**
      * true 上架 / false 下架
@@ -159,6 +165,11 @@ public class GoodsDon extends BaseEntity {
      */
     private String payDesc;
 
+    /**
+     * 购买说明
+     */
+    private String buyDesc;
+
     /**
      * 特殊类型
      */

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

@@ -1,5 +1,6 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.cyksj.model.views.GoodsDonCategoryGoodsView;
 import com.ejlchina.searcher.bean.DbIgnore;
@@ -21,6 +22,9 @@ public class GoodsDonCategory extends BaseEntity {
 	@NotEmpty(message = "名称不为空")
 	private String name;
 
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String icon;
+
 	private Integer sorted;
 
 	private Boolean status;

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

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: HomeManagementConfig
@@ -30,6 +32,7 @@ public class HomeManagementConfig extends BaseEntity{
 
 	private Boolean status;
 
+
 	/**
 	 * 定时上下架状态 默认null
 	 */
@@ -42,6 +45,18 @@ public class HomeManagementConfig extends BaseEntity{
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long time;
 
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private AdType adType;
+
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private RgType rgType;
+
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private BigDecimal rgPrice;
+
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String rgSubTitle;
+
 	private Boolean deleted;
 
 	@Getter
@@ -57,4 +72,30 @@ public class HomeManagementConfig extends BaseEntity{
 			this.desc = desc;
 		}
 	}
-}
+
+	@Getter
+	public enum AdType {
+		pc("pc首页"),
+		h5("h5首页"),
+		pcSec("pc首页副"),
+		pcDis("pc发现首页"),
+		;
+		String desc;
+
+		AdType(String desc) {
+			this.desc = desc;
+		}
+	}
+
+	@Getter
+	public enum RgType {
+		pc("pc"),
+		h5("h5")
+		;
+		String desc;
+
+		RgType(String desc) {
+			this.desc = desc;
+		}
+	}
+}

+ 78 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Information.java

@@ -0,0 +1,78 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/11 17:11
+ */
+@Getter
+@Setter
+public class Information extends BaseEntity{
+    /**
+     * 文章标题
+     */
+    private String title;
+
+    /**
+     * 副标题
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String subTitle;
+
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String logo;
+
+    /**
+     * 是否是黑色文字 默认false
+     */
+    private Boolean isBlackFont;
+
+    /**
+     * 缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    private String categoryIds;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    private Boolean top;
+
+    /**
+     * 排序
+     */
+    private Integer sorted;
+
+    /**
+     * true 存在 || false 删除
+     */
+    private Boolean deleted;
+
+    /**
+     * 推荐商品
+     */
+    private String goodsIds;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/InformationCategory.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:36
+ */
+@Getter
+@Setter
+public class InformationCategory extends BaseEntity{
+    /**
+     * 类型名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Integer sortBy;
+}

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

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 14:02
+ */
+@Getter
+@Setter
+public class InformationClickUserRecord extends BaseEntity{
+    private Long userId;
+
+    private Long goodsId;
+
+    private Long infoId;
+
+    private Long orderId;
+}

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

@@ -59,6 +59,11 @@ public class OrderDon extends BaseEntity implements Serializable {
     /** 金额 */
     private BigDecimal money;
 
+    /**
+     * 押金
+     */
+    private BigDecimal deposit;
+
     /**
      * 加购商品金额
      */
@@ -275,6 +280,11 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private Long yhsId;
 
+    /**
+     * 文章id
+     */
+    private Long infoId;
+
     /**
      * 下单手机号
      */

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

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 10:43
+ */
+@Getter
+@Setter
+public class SearchHistory extends BaseEntity{
+
+    /**
+     * 搜索名称
+     */
+    private String name;
+
+    private Long userId;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ShoppingCartDon.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDon
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 15:47
+ */
+@Getter
+@Setter
+public class ShoppingCartDon extends BaseEntity{
+	private Long userId;
+
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Integer num;
+}

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

@@ -21,7 +21,7 @@ public class SignUser extends BaseEntity{
     private Integer dayPeriod;
 
     /**
-     * 是否已签 true 签到成功 false 签到
+     * 是否已签 true 签到成功 false 签到
      */
     @TableField(exist = false)
     private Boolean isHadChecked;

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Task.java

@@ -24,6 +24,9 @@ public class Task extends BaseEntity{
 	@NotEmpty(message = "任务名称不能为空")
 	private String name;
 
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String icon;
+
 	/**
 	 * 类型id
 	 */

+ 9 - 7
netflix-dao/src/main/java/com/cyksj/model/entity/UserBalanceSourceRecord.java

@@ -20,20 +20,22 @@ public class UserBalanceSourceRecord extends BaseEntity{
 
 	private Source source;
 
+	private String detail;
+
+	private Long orderId;
+
 	@Getter
 	public enum Source {
-		payment("下单"),
-		balance("余额支付"),
-		refund("订单退款"),
-		close("订单关闭"),
-		clear_valid("车票未到期清除"),
+		payment("购买"),
+		refund("退款"),
+		clear_valid("未到期车票清除"),
 		ds_transport("分销实物发货"),
 		follow_task("关注引导"),
 		rd_comment("实物评论"),
 		price_differ("订单补差价"),
-		compensate("补偿"),
+		compensate("系统补偿"),
 		manual("手动扣除")
-				;
+		;
 		String desc;
 
 		Source(String desc) {

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserSysMsgNotify.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSysMsgNotify
+ * 创建者: JavaZou
+ * 创建时间:2024/2/4 16:01
+ */
+@Getter
+@Setter
+public class UserSysMsgNotify extends BaseEntity{
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Long userId;
+
+	private Long relationId;
+
+	private String account;
+
+	private String msg;
+
+	private Boolean isView;
+
+	private Boolean deleted;
+}

+ 28 - 19
netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuSpec.java

@@ -13,29 +13,38 @@ import java.util.List;
 @Getter
 @Setter
 public class ReqGoodsSkuSpec {
-    private String key;
+	private String key;
 
-    private List<Node> values;
+	private List<Node> values;
 
-    @Getter
-    @Setter
-    public static class Node {
-        private Integer id;
+	@Getter
+	@Setter
+	public static class Node {
+		private Integer id;
 
-        private String value;
+		private String value;
 
-        private BigDecimal price;
+		private Boolean hide;
 
-        /**
-         * 预览图
-         */
-        private String previewImgs;
+		private String logo;
 
-        private String benefitsList;
+		private BigDecimal price;
 
-        /**
-         * 原价
-         */
-        private BigDecimal benefitsPrice;
-    }
-}
+		/**
+		 * 租赁押金
+		 */
+		private BigDecimal deposit;
+
+		/**
+		 * 预览图
+		 */
+		private String previewImgs;
+
+		private String benefitsList;
+
+		/**
+		 * 原价
+		 */
+		private BigDecimal benefitsPrice;
+	}
+}

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

@@ -33,6 +33,11 @@ public class ReqGoodsSpuInsert {
 
     private String img;
 
+    /**
+     * 视频封面
+     */
+    private String videoCover;
+
     private String tags;
 
     /**
@@ -126,6 +131,8 @@ public class ReqGoodsSpuInsert {
      */
     private String payDesc;
 
+    private String buyDesc;
+
     private GoodsDon.SpecialType specialType;
 
 

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

@@ -54,6 +54,12 @@ public class GoodsDonViewer {
     @DbField("img")
     private String img;
 
+    /**
+     * 视频封面
+     */
+    @DbField("g.video_cover")
+    private String videoCover;
+
 
     /**
      * true 上架 / false 下架
@@ -161,6 +167,9 @@ public class GoodsDonViewer {
     @DbField("g.pay_desc")
     private String payDesc;
 
+    @DbField("g.buy_desc")
+    private String buyDesc;
+
     @DbField("g.special_type")
     private GoodsDon.SpecialType specialType;
 

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

@@ -259,4 +259,4 @@ public class OrderDonBackView {
 
 	@DbIgnore
 	private List<GoodsDonSkuView> benefitsViews;
-}
+}

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

@@ -20,9 +20,15 @@ public class ClickRecordReq {
 
 	private Long goodsId;
 
+	/**
+	 * 文章id
+	 */
+	private Long infoId;
+
 	/**
 	 * 1、首页点击
 	 * 2、平台分类点击
+	 * 3、文章点击
 	 */
 	private Integer type;
 }

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

@@ -4,6 +4,7 @@ import com.cyksj.model.entity.HomeManagementConfig;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /*
@@ -30,6 +31,14 @@ public class HomeManageConfigReq {
 
 	private HomeManagementConfig.Type type;
 
+	private HomeManagementConfig.AdType adType;
+
+	private HomeManagementConfig.RgType rgType;
+
+	private BigDecimal rgPrice;
+
+	private String rgSubTitle;
+
 	private Integer sorted;
 
 	private String tag;

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -74,6 +74,11 @@ public class OrderPayRequest {
      */
     private Long popularizeId;
 
+    /**
+     * 文章id
+     */
+    private Long infoId;
+
     private Boolean isNoLogin;
 
     /**

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


+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/request/UnifiedOrderPayReq.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UnifiedOrderPayReq
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 18:27
+ */
+@Getter
+@Setter
+public class UnifiedOrderPayReq {
+	private Long userId;
+
+	/**
+	 * 推荐人id
+	 */
+	private Long sharedId;
+
+	/**
+	 * 是否是网页端支付 默认0移动端支付
+	 */
+	private Boolean isWebPay;
+
+	private String callback;
+
+	private String callbackType;
+
+	private Boolean isNoLogin;
+
+	/**
+	 * 店铺id
+	 */
+	private String customId;
+
+	/**
+	 * 购买商品
+	 */
+	private List<OrderPayRequest> payGoods;
+}

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

@@ -28,6 +28,9 @@ public class GoodsDonCategoryGoodsView {
 	@DbField("gcr.category")
 	private Long category;
 
+	@DbField("gcr.id")
+	private Long relateId;
+
 	@DbField("g.title")
 	private String title;
 

+ 8 - 3
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java

@@ -1,7 +1,6 @@
 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;
@@ -18,7 +17,7 @@ import java.util.Date;
 @Setter
 @SearchBean(tables = "goods_don_category gc left join goods_don_category_relate gcr on gcr.category = gc.id" +
 		" left join goods_don g on g.id = gcr.goods_id and g.deleted is true",
-		groupBy = "gc.id,gc.name,gc.sorted,gc.update_time")
+		groupBy = "gc.id,gc.name,gc.icon,gc.sorted,gc.update_time")
 public class GoodsDonCategoryView {
 	@DbField("gc.id")
 	private Long id;
@@ -26,15 +25,21 @@ public class GoodsDonCategoryView {
 	@DbField("gc.name")
 	private String name;
 
+	@DbField("gc.icon")
+	private String icon;
+
 	@DbField("gc.sorted")
 	private Integer sorted;
 
 	@DbField("count(g.id)")
 	private Integer count;
 
-	@DbIgnore
+	@DbField("select count(*) from goods_click_user_record gcur where gcur.category = gc.id")
 	private Integer click;
 
+	@DbField("select count(*) from goods_don_category_relate gcr left join order_don o on o.goods_id = gcr.goods_id where gcr.category = gc.id and o.status not in ('close','noPayment','refund')")
+	private Integer orderNum;
+
 	@DbField("gc.status")
 	private Boolean status;
 

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

@@ -0,0 +1,142 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.GoodsDon;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsDonDetailFrontView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/19 17:42
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don",
+		where = "deleted is true and status is true")
+public class GoodsDonDetailFrontView {
+	private Integer id;
+
+	/**
+	 * 标签
+	 */
+	private String tags;
+
+	/**
+	 * 商品名称
+	 */
+	private String title;
+
+	/**
+	 * 缩略图
+	 */
+	private String logo;
+
+	/**
+	 * 背景图
+	 */
+	private String img;
+
+	/**
+	 * 详情
+	 */
+	private String detail;
+
+	/**
+	 * 描述
+	 */
+	private String remark;
+
+	private Integer type;
+
+	/**
+	 * 分类
+	 * 1、AI  2、流媒体
+	 */
+	private Integer category;
+
+	/**
+	 * 二级分类
+	 * 虚物品 1邀请制 2非邀请制
+	 */
+	private Integer secondType;
+
+	private String banner;
+
+	/**
+	 * 最小规格价格
+	 */
+	private BigDecimal minPrice;
+
+	/**
+	 * 最小规格价格月份
+	 */
+	private Integer minMonths;
+
+	/**
+	 * 最小规格 天数
+	 */
+	private Integer minDays;
+
+	/**
+	 * 最大规格价格
+	 */
+	private BigDecimal maxPrice;
+
+	/**
+	 * 最大规格价格月份
+	 */
+	private Integer maxMonths;
+
+	/**
+	 * 最大规格 天数
+	 */
+	private Integer maxDays;
+
+	/**
+	 * 付款说明
+	 */
+	private String payDesc;
+
+	/**
+	 * 特殊类型
+	 */
+	private GoodsDon.SpecialType specialType;
+
+	/**
+	 * 视频
+	 */
+	private String video;
+
+	/**
+	 * 推荐标题
+	 */
+	private String recommendTitle;
+
+	/**
+	 * 推荐平台
+	 */
+	private String recommendGoods;
+
+	private Boolean isSp;
+
+	@DbIgnore
+	private List<GoodsDonSkuFrontView> skuList;
+
+	@DbIgnore
+	private GoodsDonSpecFrontView specs;
+
+	@DbIgnore
+	private String giftCards;
+
+	@DbIgnore
+	private List<GoodsSkuGiftCardView> giftCardsView;
+
+	@DbIgnore
+	private OrderCommentFrontView comments;
+}

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

@@ -0,0 +1,36 @@
+ package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsDonSkuDetailView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 18:05
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g left join goods_don_sku sku on sku.goods_id = g.id",
+		where = "g.deleted is true")
+public class GoodsDonSkuDetailView {
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("sku.id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("sku.status")
+	private Boolean goodsStatus;
+
+	@DbField("g.status")
+	private Boolean goodsSkuStatus;
+}

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

@@ -55,7 +55,7 @@ public class GoodsFrontListCategoryView {
 	 * 分类
 	 * 1、AI  2、流媒体
 	 */
-	@DbField("g.category")
+	@DbField("gcr.category")
 	private Long category;
 
 	/**

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

@@ -51,6 +51,15 @@ public class GoodsFrontListView {
 	@DbField("g.img")
 	private String img;
 
+	/**
+	 * 视频封面
+	 */
+	@DbField("g.video_cover")
+	private String videoCover;
+
+	@DbField("g.banner")
+	private String banner;
+
 	/**
 	 * 商品搭配图
 	 */
@@ -122,6 +131,9 @@ public class GoodsFrontListView {
 	@DbField("g.pay_desc")
 	private String payDesc;
 
+	@DbField("g.buy_desc")
+	private String buyDesc;
+
 	/**
 	 * 是否是特定价格平台
 	 */

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

@@ -7,6 +7,7 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /*
@@ -41,6 +42,18 @@ public class HomeManagementConfigView {
 	@DbField("hc.type")
 	private HomeManagementConfig.Type type;
 
+	@DbField("hc.ad_type")
+	private HomeManagementConfig.AdType adType;
+
+	@DbField("hc.rg_type")
+	private HomeManagementConfig.AdType rgType;
+
+	@DbField("hc.rg_price")
+	private BigDecimal rgPrice;
+
+	@DbField("hc.rg_sub_title")
+	private String rgSubTitle;
+
 	@DbField("hc.tag")
 	private String tag;
 

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

@@ -1,5 +1,6 @@
 package com.cyksj.model.views;
 
+import com.cyksj.model.dto.RealGoodsConfigDto;
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonSpec;
 import com.cyksj.model.entity.HomeManagementConfig;
@@ -50,6 +51,18 @@ public class HomeManagementFrontView {
 	@DbField("hc.type")
 	private HomeManagementConfig.Type type;
 
+	@DbField("hc.ad_type")
+	private HomeManagementConfig.AdType adType;
+
+	@DbField("hc.rg_type")
+	private HomeManagementConfig.RgType rgType;
+
+	@DbField("hc.rg_price")
+	private BigDecimal rgPrice;
+
+	@DbField("hc.rg_sub_title")
+	private String rgSubTitle;
+
 	@DbField("hc.pic")
 	private String pic;
 
@@ -142,4 +155,7 @@ public class HomeManagementFrontView {
 
 	@DbIgnore
 	private OrderCommentFrontView comments;
-}
+
+	@DbIgnore
+	private List<RealGoodsConfigDto> subInfoList;
+}

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

@@ -0,0 +1,95 @@
+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;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 13:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "information i")
+public class InformationDetailView {
+    @DbField("i.id")
+    private Long id;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.title")
+    private String title;
+
+    /**
+     * 副标题
+     */
+    @DbField("i.sub_title")
+    private String subTitle;
+
+    /**
+     * 副标题
+     */
+    @DbField("i.logo")
+    private String logo;
+
+    @DbField("i.is_black_font")
+    private Boolean isBlackFont;
+
+    /**
+     * 缩略图
+     */
+    @DbField("i.thumbnail")
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    @DbField("i.category_ids")
+    private String categoryIds;
+
+
+    /**
+     * 内容
+     */
+    @DbField("i.content")
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    @DbField("i.status")
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    @DbField("i.recommend")
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    @DbField("i.top")
+    private Boolean top;
+
+    /**
+     * 推荐商品id
+     */
+    @DbField("i.goods_ids")
+    private String goodsIds;
+
+    /**
+     * 推荐商品名
+     */
+    @DbIgnore
+    private List<GoodsFrontListView> goods;
+
+    @DbField("i.update_time")
+    private Date releaseTime;
+}

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

@@ -0,0 +1,52 @@
+package com.cyksj.model.views;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.common.util.TimeUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 18:02
+ */
+@Getter
+@Setter
+public class InformationListView {
+
+    private Long id;
+    /**
+     * 文章标题
+     */
+    private String title;
+
+    /**
+     * 副标题
+     */
+    private String subTitle;
+
+    private String logo;
+
+    private Boolean isBlackFont;
+
+    /**
+     * 缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    private Date createdTime;
+
+    @TableField(exist = false)
+    private String differenceTime;
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+        this.differenceTime = TimeUtil.getDifferenceTime(createdTime);
+    }
+}

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

@@ -0,0 +1,122 @@
+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;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:58
+ */
+@Getter
+@Setter
+@SearchBean(tables = "information i",where = "i.deleted is true :ct:")
+public class InformationView {
+    @DbField("i.id")
+    private Long id;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.title")
+    private String title;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.sub_title")
+    private String subTitle;
+
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.logo")
+    private String logo;
+
+    @DbField("i.is_black_font")
+    private Boolean isBlackFont;
+
+    /**
+     * 缩略图
+     */
+    @DbField("i.thumbnail")
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    @DbField("i.category_ids")
+    private String categoryIds;
+
+    /**
+     * 文章类型名
+     */
+    @DbIgnore
+    private List<String> categoryNames;
+
+    /**
+     * 内容
+     */
+    @DbField("i.content")
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    @DbField("i.status")
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    @DbField("i.recommend")
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    @DbField("i.top")
+    private Boolean top;
+
+    @DbField("i.sorted")
+    private Integer sorted;
+
+    /**
+     * 推荐商品id
+     */
+    @DbField("i.goods_ids")
+    private String goodsIds;
+
+    @DbField("i.created_time")
+    private Date createdTime;
+
+    /**
+     * 推荐商品名
+     */
+    @DbIgnore
+    private List<String> goodsTitles;
+
+    /**
+     * 点击数
+     */
+    @DbField("select count(*) from information_click_user_record ir where ir.info_id = i.id and ir.goods_id is not null")
+    private Integer click;
+
+    /**
+     * 下单数
+     */
+    @DbField("select count(*) from information_click_user_record ir left join order_don o on o.id = ir.order_id where ir.info_id = i.id and o.status not in ('close','noPayment','refund')")
+    private Integer orderNum;
+
+    /**
+     * 浏览量
+     */
+    @DbField("select count(*) from information_click_user_record ir where ir.info_id = i.id and ir.goods_id is null and ir.order_id is null")
+    private Integer visit;
+}

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

@@ -6,6 +6,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: OrderDonUserCommentView
@@ -35,6 +37,9 @@ public class OrderDonUserCommentView {
 	@DbField("sku.picture")
 	private String picture;
 
+	@DbField("sku.price")
+	private BigDecimal price;
+
 	@DbField("g.type")
 	@JsonIgnore
 	private Integer goodsType;

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

@@ -0,0 +1,17 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 12:11
+ */
+@Getter
+@Setter
+public class SearchView {
+    private List<GoodsFrontListView> goodsList;
+    private List<InformationListView> informationList;
+}

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

@@ -0,0 +1,25 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonPayDetailView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:16
+ */
+@Getter
+@Setter
+public class ShoppingCartDonPayDetailView {
+	private String orderNo;
+
+	private BigDecimal money;
+
+	private String payTitle;
+
+	private Date createdTime;
+}

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

@@ -0,0 +1,41 @@
+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;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:06
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from shopping_cart_don :uid:) sc left join goods_don g on g.id = sc.goods_id" +
+		" left join goods_don_sku sku on sku.id = sc.sku_id :uid:")
+public class ShoppingCartDonView {
+	@DbField("sc.id")
+	private Long shopCartId;
+
+	@DbField("sc.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("sc.sku_id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("sc.num")
+	private Integer num;
+
+	@DbField("sc.created_time")
+	private Date createdTime;
+}

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

@@ -28,6 +28,9 @@ public class TaskFrontView {
 	@DbField("t.name")
 	private String name;
 
+	@DbField(("t.icon"))
+	private String icon;
+
 	/**
 	 * 类型id
 	 */

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

@@ -34,6 +34,9 @@ public class TaskView {
 	@DbField("tt.name")
 	private String typeName;
 
+	@DbField("t.icon")
+	private String icon;
+
 	@DbField("t.description")
 	private String description;
 

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

@@ -52,6 +52,15 @@ public class YhShopGoodsFrontView {
 	@DbField("g.img")
 	private String img;
 
+	/**
+	 * 视频封面
+	 */
+	@DbField("g.video_cover")
+	private String videoCover;
+
+	@DbField("g.banner")
+	private String banner;
+
 	/**
 	 * 类型
 	 */
@@ -104,6 +113,9 @@ public class YhShopGoodsFrontView {
 	@DbField("g.pay_desc")
 	private String payDesc;
 
+	@DbField("g.buy_desc")
+	private String buyDesc;
+
 	/**
 	 * 是否是特定价格平台
 	 */

+ 11 - 0
netflix-dao/src/main/resources/mapper/InformationCategoryMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.InformationCategoryMapper">
+
+
+    <select id="getInformationCategory" resultType="com.cyksj.model.entity.InformationCategory">
+        select ic.* from information_category ic, information i where JSON_CONTAINS(i.category_ids, CONCAT('"',ic.id,'"')) = 1 GROUP BY id,sort_by order by sort_by
+    </select>
+
+</mapper>

+ 28 - 0
netflix-dao/src/main/resources/mapper/InformationMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.InformationMapper">
+
+
+    <select id="getInformation" resultType="com.cyksj.model.views.InformationListView">
+        select id,title,thumbnail,created_time,content,sub_title,logo,is_black_font from information where status is true and deleted is true
+        <choose>
+            <when test="categoryId != null">
+                and JSON_CONTAINS(category_ids,'"${categoryId}"') = 1
+            </when>
+            <otherwise>
+                and recommend is true
+            </otherwise>
+        </choose>
+        order by sorted, case when top is true then 1 else 2 end,created_time desc
+    </select>
+
+    <select id="getInformationByTitle" resultType="com.cyksj.model.views.InformationListView">
+        select id,title,thumbnail,created_time,content,sub_title,logo,is_black_font
+        from information
+        where title like '%${title}%'
+          and status is true
+          and deleted is true
+        order by created_time desc
+    </select>
+</mapper>

+ 23 - 0
netflix-dao/src/main/resources/mapper/UserSysMsgNotifyMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.UserSysMsgNotifyMapper">
+
+    <insert id="recordUserAccountUpdateSysMsg">
+        insert into
+        user_sys_msg_notify(`goods_id`,`sku_id`,`user_id`,`relation_id`,`account`,`msg`,`created_time`,`update_time`)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{goodsId},#{skuId},#{item.userId},#{item.id},#{account},#{msg},now(),now())
+        </foreach>
+    </insert>
+
+    <insert id="recordUserAccountSetSysMsg">
+        insert into
+        user_sys_msg_notify(`goods_id`,`sku_id`,`user_id`,`relation_id`,`account`,`msg`,`created_time`,`update_time`)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{goodsId},#{skuId},#{item.userId},#{item.id},#{account},#{msg},now(),now())
+        </foreach>
+    </insert>
+</mapper>

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -670,6 +670,7 @@ public class RedisService {
 
         WX_INDENT_BIND_KEY("wx_indent_bind:key:", "微信身份授权绑定key", 60 * 60 * 24),
         EQUIPMENT_USER_SERVICE_RECORD("equipment_user_service_record:", "用户设备客服获取记录key", 60 * 60 * 24),
+        INFORMATION_KEY("information_key:", "文章", 30 * 60L),
         ;
 
         private String name;

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/goods/GoodsDonFrontService.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.goods;
+
+import com.cyksj.model.views.HomeManagementFrontView;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsDonFrontService
+ * 创建者: JavaZou
+ * 创建时间:2023/10/19 17:53
+ */
+public interface GoodsDonFrontService {
+	List<HomeManagementFrontView> getRealGoodsConfig() throws Exception;
+}

+ 104 - 0
netflix-service/src/main/java/com/cyksj/service/goods/impl/GoodsDonFrontServiceImpl.java

@@ -0,0 +1,104 @@
+package com.cyksj.service.goods.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.GoodsDonSpecMapper;
+import com.cyksj.model.dto.RealGoodsConfigDto;
+import com.cyksj.model.entity.GoodsDonSpec;
+import com.cyksj.model.entity.HomeManagementConfig;
+import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
+import com.cyksj.model.views.GoodsDonDetailFrontView;
+import com.cyksj.model.views.HomeManagementFrontView;
+import com.cyksj.service.goods.GoodsDonFrontService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsDonFrontServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/10/19 17:53
+ */
+@Service
+@RequiredArgsConstructor
+public class GoodsDonFrontServiceImpl implements GoodsDonFrontService {
+
+	private final BeanSearcher beanSearcher;
+
+	private final GoodsDonSpecMapper goodsDonSpecMapper;
+
+	@Override
+	public List<HomeManagementFrontView> getRealGoodsConfig() throws Exception {
+		List<HomeManagementFrontView> realGoodsConfigList = beanSearcher.searchAll(HomeManagementFrontView.class, MapUtils.builder().field(HomeManagementFrontView::getType, HomeManagementConfig.Type.rg.name()).build());
+		Map<String, List<RealGoodsConfigDto>> map = new HashMap<>();
+		List<ReqGoodsSkuSpec> reqGoodsSkuSpecList = null;
+		for (HomeManagementFrontView realGoodsConfig : realGoodsConfigList) {
+			if (StrUtil.isEmpty(realGoodsConfig.getTitle())) {
+				continue;
+			}
+			boolean isCtRoute = realGoodsConfig.getTitle().contains("路由器");
+			boolean isCtApple = realGoodsConfig.getTitle().contains("Apple");
+			if (isCtRoute || isCtApple) {
+				List<RealGoodsConfigDto> subInfoList = new ArrayList<>();
+				String type = null;
+				if (CollUtil.isEmpty(reqGoodsSkuSpecList)) {
+					GoodsDonSpec goodsDonSpec = goodsDonSpecMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSpec.class)
+							.eq(GoodsDonSpec::getGoodsId, 15).last("limit 1")
+							.select(GoodsDonSpec::getSpecsJson));
+					reqGoodsSkuSpecList = Jsons.parseList(goodsDonSpec.getSpecsJson(), ReqGoodsSkuSpec.class);
+				}
+				if (CollUtil.isEmpty(realGoodsConfigList)) {
+					continue;
+				}
+				for (ReqGoodsSkuSpec reqGoodsSkuSpec : reqGoodsSkuSpecList) {
+					if (StrUtil.isEmpty(reqGoodsSkuSpec.getKey())) {
+						continue;
+					}
+					boolean subIsCtRoute = reqGoodsSkuSpec.getKey().contains("路由器");
+					boolean subIsCtApple = reqGoodsSkuSpec.getKey().contains("机顶盒");
+					if ((isCtRoute && subIsCtRoute) || (isCtApple && subIsCtApple)) {
+						List<ReqGoodsSkuSpec.Node> values = reqGoodsSkuSpec.getValues();
+						for (ReqGoodsSkuSpec.Node value : values) {
+							RealGoodsConfigDto subInfo = new RealGoodsConfigDto();
+							subInfo.setTitle(value.getValue());
+							subInfo.setLogo(value.getLogo());
+							subInfo.setPrice(value.getPrice());
+							subInfoList.add(subInfo);
+						}
+					}
+				}
+				realGoodsConfig.setSubInfoList(subInfoList);
+			}
+			if (realGoodsConfig.getTitle().contains("潮玩")) {
+				List<GoodsDonDetailFrontView> fashionGoodsList = beanSearcher.searchAll(GoodsDonDetailFrontView.class, MapUtils.builder().field(GoodsDonDetailFrontView::getType, 3)
+						.field(GoodsDonDetailFrontView::getId, 27).op(Operator.NotEqual)
+						.onlySelect(GoodsDonDetailFrontView::getTitle, GoodsDonDetailFrontView::getLogo, GoodsDonDetailFrontView::getMinPrice, GoodsDonDetailFrontView::getId, GoodsDonDetailFrontView::getTags)
+						.build());
+				if (CollUtil.isEmpty(fashionGoodsList)) {
+					continue;
+				}
+				List<RealGoodsConfigDto> subInfoList = new ArrayList<>();
+				for (GoodsDonDetailFrontView fashionGoods : fashionGoodsList) {
+					RealGoodsConfigDto subInfo = new RealGoodsConfigDto();
+					subInfo.setLogo(fashionGoods.getLogo());
+					subInfo.setTitle(fashionGoods.getTitle());
+					subInfo.setPrice(fashionGoods.getMinPrice());
+					subInfo.setTags(fashionGoods.getTags());
+					subInfoList.add(subInfo);
+				}
+				realGoodsConfig.setSubInfoList(subInfoList);
+			}
+		}
+		return realGoodsConfigList;
+	}
+}

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

@@ -5,6 +5,7 @@ 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.InformationClickUserRecordMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigUserClickRecordMapper;
 import com.cyksj.model.entity.*;
@@ -35,6 +36,8 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 
 	private final GoodsClickUserRecordMapper goodsClickUserRecordMapper;
 
+	private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
 
 	@Override
 	public void click(Long userId, ClickRecordReq request) {
@@ -47,6 +50,9 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 			clickGoodsCategoryOrGoods(userId, request.getGoodsId(), request.getCategory());
 			return;
 		}
+		if (request.getType() == 3) {
+			clickInformation(userId,request.getGoodsId(),request.getInfoId());
+		}
 	}
 
 	public void clickHomePage(Long userId, Long configId) {
@@ -88,4 +94,14 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 			}
 		}
 	}
+	public void clickInformation(Long userId,Long goodsId,Long infoId){
+		if (infoId == null && goodsId == null) {
+			throw BusinessRuntimeException.getInstance("参数错误");
+		}
+		InformationClickUserRecord record = new InformationClickUserRecord();
+		record.setUserId(userId);
+		record.setGoodsId(goodsId);
+		record.setInfoId(infoId);
+		informationClickUserRecordMapper.insert(record);
+	}
 }

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

@@ -47,6 +47,15 @@ public class HomeManagementConfigServiceImpl extends ServiceImpl<HomeManagementC
 			Assert.notEmpty(config.getTitle(), "标题不为空");
 			HomeManagementConfig homeManagementConfig = new HomeManagementConfig();
 			BeanUtil.copyProperties(config, homeManagementConfig);
+			if (config.getType() == HomeManagementConfig.Type.ad) {
+				if (config.getAdType() == null) {
+					throw BusinessRuntimeException.getInstance("请选择对应的广告配置类型");
+				}
+			}else if (config.getType() == HomeManagementConfig.Type.rg) {
+				if (config.getRgType() == null) {
+					throw BusinessRuntimeException.getInstance("请选择对应的实物配置类型");
+				}
+			}
 			this.saveOrUpdate(homeManagementConfig);
 			return;
 		}

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/information/InformationCategoryService.java

@@ -0,0 +1,14 @@
+package com.cyksj.service.information;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.InformationCategory;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:48
+ */
+public interface InformationCategoryService extends IService<InformationCategory> {
+    List<InformationCategory> getInformationCategory();
+}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/information/InformationService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.information;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:39
+ */
+public interface InformationService extends IService<Information> {
+    IPage<InformationListView> getInformation(Long categoryId, Integer start, Integer limit);
+    List<InformationListView> getInformationByTitle(String name);
+}

+ 21 - 0
netflix-service/src/main/java/com/cyksj/service/information/impl/InformationCategoryServiceImpl.java

@@ -0,0 +1,21 @@
+package com.cyksj.service.information.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.InformationCategoryMapper;
+import com.cyksj.model.entity.InformationCategory;
+import com.cyksj.service.information.InformationCategoryService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:48
+ */
+@Service
+public class InformationCategoryServiceImpl extends ServiceImpl<InformationCategoryMapper, InformationCategory> implements InformationCategoryService {
+    @Override
+    public List<InformationCategory> getInformationCategory() {
+        return baseMapper.getInformationCategory();
+    }
+}

+ 32 - 0
netflix-service/src/main/java/com/cyksj/service/information/impl/InformationServiceImpl.java

@@ -0,0 +1,32 @@
+package com.cyksj.service.information.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.InformationMapper;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.service.information.InformationService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:40
+ */
+@Service
+public class InformationServiceImpl extends ServiceImpl<InformationMapper, Information> implements InformationService {
+
+
+    @Override
+    public IPage<InformationListView> getInformation(Long categoryId, Integer start, Integer limit) {
+        return baseMapper.getInformation(new Page<>(start,limit),categoryId);
+    }
+
+
+    @Override
+    public List<InformationListView> getInformationByTitle(String name) {
+        return baseMapper.getInformationByTitle(name);
+    }
+}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/mange/CmsGroupService.java

@@ -20,5 +20,5 @@ public interface CmsGroupService extends IService<GroupsTrips> {
 
 	Integer getAvailableRelation(Long goodsId, Long skuId);
 
-    void sendChangeAccountMsg(Long groupsId, Long goodsId);
+    void sendChangeAccountMsg(Long groupsId, Long goodsId, String account);
 }

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSkuServiceImpl.java

@@ -97,7 +97,7 @@ public class CmsGoodsDonSkuServiceImpl extends ServiceImpl<GoodsDonSkuMapper,Goo
 		GoodsDonSku sku = skuMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSku.class)
 				.eq(GoodsDonSku::getId, disSid).last("limit 1"));
 		if (sku == null) {
-			throw BusinessRuntimeException.getInstance("优惠加购规格不存在");
+			throw BusinessRuntimeException.getInstance("优惠加购规格不存在");
 		}
 		if (!sku.getStatus()) {
 			throw BusinessRuntimeException.getInstance("{0}规格未上架", sku.getSpecVal());

+ 16 - 3
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.mange.group;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -16,12 +17,14 @@ import com.cyksj.mapper.manage.GroupsTripsAccountReplaceRecordMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.AccountView;
+import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.request.ReplaceTripsAccountReq;
 import com.cyksj.model.views.GroupsAccountView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mange.AccountCommonService;
 import com.cyksj.service.mange.CmsGroupService;
 import com.cyksj.service.sms.SmsService;
+import com.cyksj.service.user.UserSysMsgNotifyService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
@@ -74,6 +77,8 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
 
     private final GroupsRelationAlertMapper alertMapper;
 
+    private final UserSysMsgNotifyService userSysMsgNotifyService;
+
     private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 
@@ -272,6 +277,9 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
         }
        updateById(groupsTrips);
 
+        GoodsDon goodsDon = goodsDonMapper.selectById(account.getGoodsId());
+        userSysMsgNotifyService.recordUserAccountSetSysMsg(account.getGoodsId(), groupsTrips.getSkuId(), groupsRelations, account.getAccount(), goodsDon.getTitle());
+
         Integer alertCount = alertMapper.selectCount(Wrappers.lambdaQuery(GroupsRelationAlert.class)
                 .eq(GroupsRelationAlert::getSkuId, sku.getId())
                 .last("limit 1"));
@@ -369,7 +377,7 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
 
         replaceRecordMapper.insert(replaceRecord);
 
-        TASK_EXECUTOR.execute(() -> sendChangeAccountMsg(groupsId, goodsId));;
+        TASK_EXECUTOR.execute(() -> sendChangeAccountMsg(groupsId, goodsId, account));;
     }
 
     @Override
@@ -424,12 +432,17 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
     }
 
     @Override
-    public void sendChangeAccountMsg(Long groupsId, Long goodsId) {
+    public void sendChangeAccountMsg(Long groupsId, Long goodsId, String account) {
         GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
         String title = goodsDon != null ? goodsDon.getTitle() : "车票";
         DateTime now = DateTime.now();
         Boolean isPrd = envCommonService.isPrdEnv();
-        List<GroupsRelation> groupsRelations = beanSearcher.searchAll(GroupsRelation.class, MapUtils.builder().field(GroupsRelation::getGroupsId, groupsId).build());
+        List<GroupsRelationView> groupsRelations = beanSearcher.searchAll(GroupsRelationView.class, MapUtils.builder().field(GroupsRelationView::getGroupsId, groupsId).build());
+        if (CollUtil.isEmpty(groupsRelations)) {
+            return;
+        }
+        Long skuId = groupsMapper.selectById(groupsId).getSkuId();
+        userSysMsgNotifyService.recordUserAccountUpdateSysMsg(goodsId, skuId, groupsRelations, account, goodsDon.getTitle());
         groupsRelations.forEach(relation -> {
             if (relation.getExpiryTime() == null) {
                 return;

+ 7 - 5
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -710,16 +710,18 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (orderDon.getCouponUserId() != 0) {
                 couponFontService.updateOrderDonCouponStatus(orderDon);
             }
-            //退等比例
+            //退等比例
             if (isOnly != null && isOnly) {
-                userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.refund, orderDon.getYhsId());
+	            userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.refund, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
                 BigDecimal orderDonRefundBalance = Optional.ofNullable(orderDon.getRefundBalance()).orElse(BigDecimal.ZERO);
                 orderDon.setRefundBalance(orderDonRefundBalance.add(refundBalance));
             }
+
             //若存在余额支付,退还余额
             if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-                userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.balance, orderDon.getYhsId());
+                userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.refund, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
             }
+
             try {
                 marketFrontService.subSpecificChanceNum(orderDon.getUserId(), orderDon.getId(), orderDon.getGoodsId(), orderDon.getUpdateTime());
                 if (goodsDon.getType() == 2) {
@@ -732,7 +734,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             }
             if (OrderDon.Type.BALANCE.getType().equals(refundType)) {
                 if (isOnly == null && orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
-                    userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getRefundBalance(), UserBalanceSourceRecord.Source.refund, orderDon.getYhsId());
+                    userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getRefundBalance(), UserBalanceSourceRecord.Source.refund, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
                 }
             } else {
                 //余额退款不需要扣除积分
@@ -957,7 +959,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (refundBalance == null || refundBalance.compareTo(BigDecimal.ZERO) <= 0 || refundBalance.compareTo(orderDon.getMoney()) > 0) {
                 throw BusinessRuntimeException.getInstance("请输入正确的差价金额");
             }
-            userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.price_differ, orderDon.getYhsId());
+            userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.price_differ, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.price_differ.getDesc(), true);
             orderDon.setRefundBalance(orderDonRefundBalance.add(refundBalance));
             orderDonMapper.updateById(orderDon);
         }

+ 24 - 3
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -137,8 +137,29 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 
 	@Override
 	public SignUser getUserSignDetail(Long userId) {
-		//未签到时,签到
-		SignUser signUser = signByUserId(userId);
+		SignUser signUser = signUserMapper.selectOne(Wrappers.lambdaQuery(SignUser.class)
+				.eq(SignUser::getUserId, userId).last("limit 1"));
+		if (signUser == null) {
+			signUser = new SignUser();
+			signUser.setUserId(userId);
+			signUser.setDay(0);
+			signUser.setDayPeriod(0);
+			signUser.setIsHadChecked(false);
+			return signUser;
+		}
+		Date updateTime = signUser.getUpdateTime();
+		DateTime signZero = DateUtil.beginOfDay(updateTime);
+		DateTime thisZero = DateUtil.beginOfDay(DateTime.now());
+		if (updateTime.getTime() < thisZero.getTime()) {
+			if (thisZero.getTime() - signZero.getTime() != Constant.DAY_MILLS) {
+				log.info("用户:{}断签,断签天数为:{}", signUser.getUserId(), signUser.getDayPeriod());
+				signUser.setDay(0);
+				signUser.setDayPeriod(0);
+			}
+			signUser.setIsHadChecked(false);
+		} else {
+			signUser.setIsHadChecked(true);
+		}
 		return signUser;
 	}
 
@@ -361,7 +382,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		DateTime signZero = DateUtil.beginOfDay(updateTime);
 		DateTime thisZero = DateUtil.beginOfDay(DateTime.now());
 		if (updateTime.getTime() >= thisZero.getTime()) {
-			signUser.setIsHadChecked(false);
+			signUser.setIsHadChecked(true);
 //            throw BusinessRuntimeException.getInstance("您已签到");
 		} else {
 			if (updateTime.before(thisZero) && thisZero.getTime() - signZero.getTime() == Constant.DAY_MILLS) {

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java

@@ -154,7 +154,7 @@ public class TaskServiceImpl implements TaskService {
 						if (taskView != null) {
 							if ("关注引导".equals(taskView.getTypeName()) && taskView.getBalance().compareTo(BigDecimal.ZERO) > 0) {
 								//发送余额
-								userBenefitsService.addUserBalance(dbPlatVerify.getUserId(), taskView.getBalance(), UserBalanceSourceRecord.Source.follow_task, 0l);
+								userBenefitsService.addUserBalance(dbPlatVerify.getUserId(), taskView.getBalance(), UserBalanceSourceRecord.Source.follow_task, 0l, null, taskView.getName(), true);
 								record.setBalance(taskView.getBalance());
 							}
 						}

+ 18 - 0
netflix-service/src/main/java/com/cyksj/service/order/ShoppingCartDonService.java

@@ -0,0 +1,18 @@
+package com.cyksj.service.order;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.ShoppingCartDon;
+import com.cyksj.model.request.UnifiedOrderPayReq;
+import com.cyksj.model.views.ShoppingCartDonPayDetailView;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonService
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:01
+ */
+public interface ShoppingCartDonService extends IService<ShoppingCartDon> {
+	void addGoodsShoppingCart(ShoppingCartDon goodsCartDon);
+
+	ShoppingCartDonPayDetailView unifiedPayShoppingCartGoods(UnifiedOrderPayReq unifiedOrderPayReq);
+}

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

@@ -64,7 +64,7 @@ public class OrderDonCommentServiceImpl implements OrderDonCommentService {
 						.eq(OrderCommentRewardConfig::getGoodsId, goodsId).last("limit 1"));
 				if (orderCommentRewardConfig != null) {
 					BigDecimal balance = orderCommentRewardConfig.getBalance();
-					userBenefitsService.addUserBalance(orderComment.getUserId(), balance, UserBalanceSourceRecord.Source.rd_comment, 0l);
+					userBenefitsService.addUserBalance(orderComment.getUserId(), balance, UserBalanceSourceRecord.Source.rd_comment, 0l, orderComment.getOrderId(), UserBalanceSourceRecord.Source.rd_comment.getDesc(), true);
 					log.info("审核订单:{}评价成功,发放余额:{}", orderComment.getOrderId(), balance.divide(BigDecimal.valueOf(100)));
 					orderCommentMapper.update(null, Wrappers.lambdaUpdate(OrderComment.class)
 							.set(OrderComment::getBalance, balance)

+ 61 - 9
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -54,6 +54,7 @@ import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.dto.ChannelBaiDuDiscountDto;
 import com.cyksj.model.manage.dto.GiftCardDto;
+import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.*;
@@ -131,6 +132,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final GoodsDonMapper goodsDonMapper;
 
+	private final GoodsDonSpecMapper goodsDonSpecMapper;
+
 	private final GroupsRelationMapper groupsRelationMapper;
 
 	private final BeanSearcher beanSearcher;
@@ -261,6 +264,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final EquipmentActivityReduceMapper equipmentActivityReduceMapper;
 
+	private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
+	private final UserCertRecordMapper userCertRecordMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -399,6 +406,23 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			payRequest.setDonMoney(sku.getPrice());
 		}
 
+		//租赁商品
+		if (goodsDon.getType() == 4) {
+			//是否已实名认证过
+			List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
+			Integer count = userCertRecordMapper.selectCount(Wrappers.lambdaQuery(UserCertRecord.class).in(UserCertRecord::getUserId, userIdList));
+			if (count == 0) throw BusinessRuntimeException.getInstance("请您先完成实名认证..");
+
+			//租赁商品押金
+			BigDecimal rentGoodsDonDeposit = getRentGoodsDonDeposit(goodsId, sku.getSpecIds());
+			if (rentGoodsDonDeposit == null) throw BusinessRuntimeException.getInstance("应付押金异常..");
+			BigDecimal sPay = rentGoodsDonDeposit.add(sku.getPrice());
+			if (payRequest.getDonMoney().compareTo(sPay) < 0) {
+				payRequest.setDonMoney(sPay);
+			}
+			orderDon.setDeposit(rentGoodsDonDeposit);
+		}
+
 		orderDon.setMoney(payRequest.getDonMoney());
 		orderDon.setRealMoney(payRequest.getDonMoney());
 		orderDon.setOriMoney(sku.getPrice());
@@ -603,6 +627,13 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
 		}
+		//记录文章下单量
+		if (payRequest.getInfoId() != null){
+			InformationClickUserRecord informationClickUserRecord = new InformationClickUserRecord();
+			informationClickUserRecord.setInfoId(payRequest.getInfoId());
+			informationClickUserRecord.setOrderId(orderDon.getId());
+			informationClickUserRecordMapper.insert(informationClickUserRecord);
+		}
 		return orderDon;
 	}
 
@@ -818,7 +849,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 				//返还余额
 				if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-					userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.close, orderDon.getYhsId());
+					userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), null, null, null, null, false);
 				}
 
 				//是否是礼品卡 现金支付订单
@@ -1227,16 +1258,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getSkuId() != null) {
 			sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
 		}
-		orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
-		updateGroupsTicket(orderDon, goodsDon, sku);
 		if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
 			orderDon.setType(OrderDon.Type.BALANCE);
 			orderDon.setPayTime(DateTime.now());
 		}
-		this.updateById(orderDon);
-
-		//调整指定规格车队下次可 停用车位数的时间
-		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
+		unifiedHandlerOrderNotify(orderDon, goodsDon, sku);
 	}
 
 	public void updateCarParkAndSendMsg(GoodsDon goodsDon, GoodsDonSku sku, OrderDon order) {
@@ -2257,7 +2283,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				.in(OrderDon::getStatus, List.of(OrderDon.Status.noPayment, OrderDon.Status.close))
 				.eq(OrderDon::getId, orderDon.getId()));
 		if (!isSuccess) {
-			log.info("支付宝回调商家订单号:{}订单状态已修改", orderDon.getOrderNo());
+			log.info("该订单{}状态已修改", orderDon.getOrderNo());
 			return;
 		}
 
@@ -2280,6 +2306,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//调整指定规格车队下次可 停用车位数的时间
 		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
 
+		//余额使用记录
+		if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+			userBenefitsService.recordBalanceBySource(orderDon.getUserId(), orderDon.getBalance().negate(), UserBalanceSourceRecord.Source.payment, orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.payment.getDesc());
+		}
+
 		TASK_POOL.execute(()->{
 			try {
 				//发放积分
@@ -2777,7 +2808,28 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			Integer success = userMapper.deductBalance(user.getId(), subBalance, userBalance);
 			if (success != 1) throw BusinessRuntimeException.getInstance("您的余额不足!");
 			orderDon.setBalance(subBalance);
-			userBenefitsService.recordBalanceBySource(user.getId(), BigDecimal.valueOf(-subBalance.longValue()), UserBalanceSourceRecord.Source.payment);
 		}
 	}
+
+	/**
+	 * 获取租赁商品的应付押金
+	 */
+	private BigDecimal getRentGoodsDonDeposit(Long goodsId, String specIdsStr) throws Exception {
+		GoodsDonSpec rentGoodsDonSpec = goodsDonSpecMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSpec.class)
+				.eq(GoodsDonSpec::getGoodsId, goodsId)
+				.last("limit 1"));
+		List<Integer> specIds = Jsons.parseList(specIdsStr, Integer.class);
+		String specsJson = rentGoodsDonSpec.getSpecsJson();
+		List<ReqGoodsSkuSpec> reqGoodsSkuSpec = Jsons.parseList(specsJson, ReqGoodsSkuSpec.class);
+		for (ReqGoodsSkuSpec spec : reqGoodsSkuSpec) {
+			if (spec.getKey().contains("版本")) {
+				for (ReqGoodsSkuSpec.Node value : spec.getValues()) {
+					if (specIds.contains(value.getId())) {
+						return value.getDeposit();
+					}
+				}
+			}
+		}
+		return null;
+	}
 }

+ 79 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/ShoppingCartOrderServiceImpl.java

@@ -0,0 +1,79 @@
+package com.cyksj.service.order.impl;
+
+import cn.hutool.core.collection.CollUtil;
+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.order.ShoppingCartDonMapper;
+import com.cyksj.model.entity.ShoppingCartDon;
+import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.UnifiedOrderPayReq;
+import com.cyksj.model.views.GoodsDonSkuDetailView;
+import com.cyksj.model.views.ShoppingCartDonPayDetailView;
+import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.order.ShoppingCartDonService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartOrderServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:01
+ */
+@Service
+@RequiredArgsConstructor
+public class ShoppingCartOrderServiceImpl extends ServiceImpl<ShoppingCartDonMapper, ShoppingCartDon> implements ShoppingCartDonService {
+	private final BeanSearcher beanSearcher;
+
+	private final OrderDonService orderDonService;
+	@Override
+	public void addGoodsShoppingCart(ShoppingCartDon goodsCartDon) {
+		//最多添加购物车数量30
+		int count = this.count(Wrappers.lambdaQuery(ShoppingCartDon.class)
+				.eq(ShoppingCartDon::getUserId, goodsCartDon.getUserId()));
+		if (count >= 30) {
+			throw BusinessRuntimeException.getInstance("最多添加30件商品至购物车");
+		}
+		Long skuId = goodsCartDon.getSkuId();
+		if (skuId == null) {
+			throw BusinessRuntimeException.getInstance("请指定商品添加至购物车");
+		}
+		GoodsDonSkuDetailView goodsDonSkuDetailView = beanSearcher.searchFirst(GoodsDonSkuDetailView.class, MapUtils.builder()
+				.field(GoodsDonSkuDetailView::getSkuId, skuId).build());
+		if (goodsDonSkuDetailView == null) {
+			throw BusinessRuntimeException.getInstance("该商品已不存在..");
+		}
+		if (!goodsDonSkuDetailView.getGoodsStatus()) {
+			throw BusinessRuntimeException.getInstance("该商品已下架..");
+		}
+		if (!goodsDonSkuDetailView.getGoodsSkuStatus()) {
+			throw BusinessRuntimeException.getInstance("该商品规格已下架..");
+		}
+		if (goodsCartDon.getNum() == null) {
+			goodsCartDon.setNum(1);
+		}
+		goodsCartDon.setGoodsId(goodsDonSkuDetailView.getGoodsId());
+		goodsCartDon.setSkuId(skuId);
+		this.save(goodsCartDon);
+	}
+
+	@Override
+	public ShoppingCartDonPayDetailView unifiedPayShoppingCartGoods(UnifiedOrderPayReq unifiedOrderPayReq) {
+		Long userId = unifiedOrderPayReq.getUserId();
+		//处理订单
+		List<OrderPayRequest> payGoods = unifiedOrderPayReq.getPayGoods();
+		if (CollUtil.isEmpty(payGoods)) {
+			throw BusinessRuntimeException.getInstance("请选择商品后再进行下单..");
+		}
+		ShoppingCartDonPayDetailView payDetailView = new ShoppingCartDonPayDetailView();
+//		String orderNo = ;
+//		String payTitle = ;
+//		orderDonService.submit();
+		return null;
+	}
+}

+ 11 - 2
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -43,6 +43,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
@@ -118,7 +119,15 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				.build());
 		//过滤邀请制、已失效的车位
 		DateTime now = DateTime.now();
-		list.stream().forEach(ticket -> {
+		list = list.stream().filter(e -> {
+			if (e.getExpiryTime() != null && e.getExpiryTime().before(now)) {
+				return false;
+			}
+			return true;
+		}).collect(Collectors.toList());
+		Integer size = list.size();
+
+		list.forEach(ticket -> {
 			if (ticket.getSkuId() == null || ticket.getGoodsId() == null) {
 				return;
 			}
@@ -180,7 +189,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				ticket.setTransactionId(orderDon.getTransactionId());
 			}
 
-			if (list.size() > 1 && ticket.getGoodsId() != 18) {
+			if (size > 1 && ticket.getGoodsId() != 18) {
 				Date payTime = null;
 				if (orderDon != null) {
 					payTime = Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime());

+ 7 - 7
netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java

@@ -201,19 +201,19 @@ public class SchedulerServiceImpl implements SchedulerService {
 							log.info("user_id:{},relationId:{}返回余额为0", userId, change_relationId);
 							return;
 						}
-						userBenefitsService.addUserBalance(userId, re_balance, UserBalanceSourceRecord.Source.clear_valid, relationView.getYhsId());
-						log.info("车票未到期清除,退款至用户user_id:{}余额:{}成功", userId, re_balance);
-						//修改订单状态 为退款
-						orderDon.setStatus(OrderDon.Status.refund);
-						orderDon.setRefundBalance(re_balance);
-						orderDon.setRefundMoney(BigDecimal.ZERO);
-						orderDonMapper.updateById(orderDon);
 						GoodsDon goodsDon = goodsMap.get(relationView.getGoodsId());
 						if (goodsDon == null) {
 							goodsDon = goodsDonMapper.selectById(relationView.getGoodsId());
 							if (goodsDon == null) return;
 							goodsMap.putIfAbsent(relationView.getGoodsId(), goodsDon);
 						}
+						userBenefitsService.addUserBalance(userId, re_balance, UserBalanceSourceRecord.Source.clear_valid, relationView.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.clear_valid.getDesc(), true);
+						log.info("车票未到期清除,退款至用户user_id:{}余额:{}成功", userId, re_balance);
+						//修改订单状态 为退款
+						orderDon.setStatus(OrderDon.Status.refund);
+						orderDon.setRefundBalance(re_balance);
+						orderDon.setRefundMoney(BigDecimal.ZERO);
+						orderDonMapper.updateById(orderDon);
 						GoodsDonSku sku = skuMap.get(orderDon.getSkuId());
 						if (sku == null) {
 							sku = skuMapper.selectById(orderDon.getSkuId());

+ 70 - 70
netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java

@@ -43,76 +43,76 @@ public class StripeService {
 
 
 
-   public String checkOutStripe(Long orderId,String successUrl) throws Exception{
-       OrderDon orderDon = orderDonService.getById(orderId);
-       BigDecimal money = orderDon.getMoney();
-       orderDon.setType(OrderDon.Type.STRIPE);
-       orderDonService.updateById(orderDon);
-       HashMap<String, String> responseData = new HashMap<String, String>();
-       if (OrderDon.Status.hasPayment.equals(orderDon.getStatus())) {
-           throw new BusinessRuntimeException(GatewayApiCode.METADATA_SYSTEM_ERROR.getCode(),"The donation has been paid");
-       }
-       StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
-       try {
-           Stripe.apiKey = stripePayConfig.getApiKey();
-           SessionCreateParams params =
-                   SessionCreateParams.builder()
-                           .setMode(SessionCreateParams.Mode.PAYMENT)
-                           .setSuccessUrl(successUrl)
-                           .setCancelUrl(stripePayConfig.getCancelUrl())
-                           .setClientReferenceId(orderDon.getId().toString())
-                           .addLineItem(
-                                   SessionCreateParams.LineItem.builder()
-                                           .setQuantity(1L)
-                                           .setPriceData(
-                                                   SessionCreateParams.LineItem.PriceData.builder()
-                                                           .setCurrency("USD")
-                                                           .setUnitAmount(money.longValue())
-                                                           .setProductData(
-                                                                   SessionCreateParams.LineItem.PriceData.ProductData.builder()
-                                                                           .setName("donation")
-                                                                           .setDescription("donation")
-                                                                           .build()).build()).build()).build();
-           Session session = Session.create(params);
-           responseData.put("id", session.getId());
-       } catch (StripeException e) {
-           e.printStackTrace();
-       }
-       return Jsons.toJson(responseData);
-   }
-
-
-   public void fulfillOrder(Session session) throws Exception{
-       if (null == session){
-           log.error("支付回调失败");
-           return;
-       }
-       String orderId = session.getClientReferenceId();
-       if (!"paid".equals(session.getPaymentStatus())){
-           return;
-       }
-       OrderDon orderDon = orderDonService.getById(orderId);
-       if (orderDon == null){
-           return;
-       }
-       if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
-           log.info("已回调,重复修改状态 id:{}", orderDon.getId());
-           return;
-       }
-       String paymentIntentId = session.getPaymentIntent();
-       PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId);
-       String chargeId = paymentIntent.getLatestCharge();
-       BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve(chargeId).getBalanceTransaction());
-       //更新订单支付状态
-
-       orderDon.setTransactionId(chargeId);
-       orderDon.setAbroadTransactionFee(BigDecimal.valueOf(balanceTransaction.getFee()));
-       orderDon.setPayTime(new Date());
-       orderDonService.orderNotify(orderDon);
-       log.info("支付成功订单:"+orderId+",支付交易号:"+chargeId);
-       log.info("支付成功订单:"+orderId+",返回参数:"+Jsons.toJson(session));
-
-   }
+    public String checkOutStripe(Long orderId,String successUrl) throws Exception{
+        OrderDon orderDon = orderDonService.getById(orderId);
+        BigDecimal money = orderDon.getMoney();
+        orderDon.setType(OrderDon.Type.STRIPE);
+        orderDonService.updateById(orderDon);
+        HashMap<String, String> responseData = new HashMap<String, String>();
+        if (OrderDon.Status.hasPayment.equals(orderDon.getStatus())) {
+            throw new BusinessRuntimeException(GatewayApiCode.METADATA_SYSTEM_ERROR.getCode(),"The donation has been paid");
+        }
+        StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
+        try {
+            Stripe.apiKey = stripePayConfig.getApiKey();
+            SessionCreateParams params =
+                    SessionCreateParams.builder()
+                            .setMode(SessionCreateParams.Mode.PAYMENT)
+                            .setSuccessUrl(successUrl)
+                            .setCancelUrl(stripePayConfig.getCancelUrl())
+                            .setClientReferenceId(orderDon.getId().toString())
+                            .addLineItem(
+                                    SessionCreateParams.LineItem.builder()
+                                            .setQuantity(1L)
+                                            .setPriceData(
+                                                    SessionCreateParams.LineItem.PriceData.builder()
+                                                            .setCurrency("USD")
+                                                            .setUnitAmount(money.longValue())
+                                                            .setProductData(
+                                                                    SessionCreateParams.LineItem.PriceData.ProductData.builder()
+                                                                            .setName("donation")
+                                                                            .setDescription("donation")
+                                                                            .build()).build()).build()).build();
+            Session session = Session.create(params);
+            responseData.put("id", session.getId());
+        } catch (StripeException e) {
+            e.printStackTrace();
+        }
+        return Jsons.toJson(responseData);
+    }
+
+
+    public void fulfillOrder(Session session) throws Exception{
+        if (null == session){
+            log.error("支付回调失败");
+            return;
+        }
+        String orderId = session.getClientReferenceId();
+        if (!"paid".equals(session.getPaymentStatus())){
+            return;
+        }
+        OrderDon orderDon = orderDonService.getById(orderId);
+        if (orderDon == null){
+            return;
+        }
+        if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
+            log.info("已回调,重复修改状态 id:{}", orderDon.getId());
+            return;
+        }
+        String paymentIntentId = session.getPaymentIntent();
+        PaymentIntent paymentIntent = PaymentIntent.retrieve(paymentIntentId);
+        String chargeId = paymentIntent.getLatestCharge();
+        BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve(chargeId).getBalanceTransaction());
+        //更新订单支付状态
+
+        orderDon.setTransactionId(chargeId);
+        orderDon.setAbroadTransactionFee(BigDecimal.valueOf(balanceTransaction.getFee()));
+        orderDon.setPayTime(new Date());
+        orderDonService.orderNotify(orderDon);
+        log.info("支付成功订单:"+orderId+",支付交易号:"+chargeId);
+        log.info("支付成功订单:"+orderId+",返回参数:"+Jsons.toJson(session));
+
+    }
 
 
     public Boolean refund(OrderRefundReq refundReq, OrderDon orderDon) throws StripeException {

+ 33 - 26
netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.template.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -23,9 +24,9 @@ import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.WxAppTemplateView;
 import com.cyksj.service.sms.SmsService;
 import com.cyksj.service.template.TemplateCommonService;
+import com.cyksj.service.user.UserSysMsgNotifyService;
 import com.cyksj.service.wechat.WeChatService;
 import com.ejlchina.searcher.BeanSearcher;
-import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
@@ -65,6 +66,8 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 
 	private final SmsService smsService;
 
+	private final UserSysMsgNotifyService userSysMsgNotifyService;
+
 	public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, User user, String toPeople, Boolean isCustomer) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
 			String openId = toPeople;
@@ -209,31 +212,35 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 
 	@Override
 	public void sendAccountTemplateMsg(Account account) throws Exception {
-		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
-			List<GroupsRelationView> relations = beanSearcher.searchList(GroupsRelationView.class, MapUtils.builder()
-					.field(GroupsRelationView::getAccountId, account.getId()).op(Operator.Equal)
-					.field(GroupsRelationView::getStatus, "validity").op(Operator.Equal)
-					.build());
-			Boolean isPrdEnv = envCommonService.isPrdEnv();
-			GoodsDon goodsDon = goodsDonMapper.selectById(account.getGoodsId());
-			String title = goodsDon != null ? goodsDon.getTitle() : "车票";
-			DateTime now = DateTime.now();
-			log.info("开始发送账号修改密码模板消息,大小:{}", relations.size());
-			for (GroupsRelationView relation : relations) {
-				if (relation.getExpiryTime() == null) {
-					return;
-				}
-				//账号有效期小于5天的人,不发账号替换/改密码短信提醒
-				if (now.after(DateUtil.offsetDay(relation.getExpiryTime(), -5))) {
-					return;
-				}
-				//去掉GPT过滤平台
-				if (Constant.CHANGE_ACCOUNT_PWD_FILTER_GIDS.get(1) == account.getGoodsId()) {
-					return;
-				}
-				if (relation.getUserId() != 0 && isPrdEnv && relation.getYhsId() == 0) {
-					smsService.sendSmsToRelationUser(relation.getUserId(), Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
-				}
+		boolean isPrd = envCommonService.isPrdEnv();
+		List<GroupsRelationView> relations = beanSearcher.searchList(GroupsRelationView.class, MapUtils.builder()
+				.field(GroupsRelationView::getAccountId, account.getId())
+				.field(GroupsRelationView::getStatus, "validity")
+				.build());
+		if (CollUtil.isEmpty(relations)) {
+			return;
+		}
+		GoodsDon goodsDon = goodsDonMapper.selectById(account.getGoodsId());
+		String title = goodsDon != null ? goodsDon.getTitle() : "车票";
+		DateTime now = DateTime.now();
+		log.info("开始发送账号修改密码模板消息,大小:{}", relations.size());
+		Long skuId = relations.get(0).getSkuId();
+		userSysMsgNotifyService.recordUserAccountUpdateSysMsg(account.getGoodsId(), skuId, relations, account.getAccount(), goodsDon.getTitle());
+		for (GroupsRelationView relation : relations) {
+			if (relation.getExpiryTime() == null) {
+				return;
+			}
+			//账号有效期小于5天的人,不发账号替换/改密码短信提醒
+			if (now.after(DateUtil.offsetDay(relation.getExpiryTime(), -5))) {
+				return;
+			}
+			//去掉GPT过滤平台
+			if (Constant.CHANGE_ACCOUNT_PWD_FILTER_GIDS.get(1) == account.getGoodsId()) {
+				return;
+			}
+			if (relation.getUserId() != 0 && relation.getYhsId() == 0 && isPrd) {
+				String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
+				smsService.sendSmsToRelationUser(relation.getUserId(), msg);
 			}
 		}
 	}

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java

@@ -26,7 +26,7 @@ public interface UserBenefitsService {
 	/**
 	 * 增加用户余额
 	 */
-	void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source, Long yhsId);
+	void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source, Long yhsId, Long orderId, String detail, Boolean isRecord);
 
 	/**
 	 * 扣除用户余额
@@ -36,7 +36,7 @@ public interface UserBenefitsService {
 	/**
 	 * 记录用于余额来源
 	 */
-	void recordBalanceBySource(Long userId, BigDecimal balance, UserBalanceSourceRecord.Source source);
+	void recordBalanceBySource(Long userId, BigDecimal balance, UserBalanceSourceRecord.Source source, Long orderId, String detail);
 
 	void addYhsMoney(Long userId, BigDecimal money);
 

+ 20 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserSysMsgNotifyService.java

@@ -0,0 +1,20 @@
+package com.cyksj.service.user;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.entity.UserSysMsgNotify;
+import com.cyksj.model.manage.views.GroupsRelationView;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSysMsgNotifyService
+ * 创建者: JavaZou
+ * 创建时间:2024/2/4 16:03
+ */
+public interface UserSysMsgNotifyService extends IService<UserSysMsgNotify> {
+	void recordUserAccountUpdateSysMsg(Long goodsId, Long skuId, List<GroupsRelationView> relations, String account, String title);
+
+	void recordUserAccountSetSysMsg(Long goodsId, Long skuId, List<GroupsRelation> groupsRelations, String account, String title);
+}

+ 13 - 11
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java

@@ -17,7 +17,6 @@ import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 
 /*
  *项目名: netflix
@@ -73,7 +72,7 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 	}
 
 	@Override
-	public void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source,Long yhsId) {
+	public void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source, Long yhsId, Long orderId, String detail, Boolean isRecord) {
 		if (addBalance.compareTo(BigDecimal.ZERO) <= 0) {
 			return;
 		}
@@ -83,14 +82,15 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 			BigDecimal balance = user.getBalance();
 			Integer success = userMapper.addUserBalance(user.getId(), balance, addBalance);
 			if (success == 1) {
-				recordBalanceBySource(userId, addBalance, source);
-				if (envCommonService.isPrdEnv()) {
-					if (source != UserBalanceSourceRecord.Source.close && source != UserBalanceSourceRecord.Source.balance && yhsId == 0) {
-						try {
-							//短信到账提醒
-							smsService.sendSmsToRelationUser(userId, Constant.BALANCE_NOTIFY_MSG, String.valueOf(addBalance.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN)));
-						} catch (Exception e) {
-						}
+				if (isRecord) {
+					recordBalanceBySource(userId, addBalance, source, orderId, detail);
+				}
+				if (envCommonService.isPrdEnv() && isRecord && yhsId == 0) {
+					try {
+						//短信到账提醒
+						String msg = String.format(Constant.BALANCE_NOTIFY_MSG, addBalance.divide(BigDecimal.valueOf(100)));
+						smsService.sendSmsToRelationUser(userId, msg);
+					} catch (Exception e) {
 					}
 				}
 				break;
@@ -125,11 +125,13 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 	}
 
 	@Override
-	public void recordBalanceBySource(Long userId, BigDecimal balance, UserBalanceSourceRecord.Source source) {
+	public void recordBalanceBySource(Long userId, BigDecimal balance, UserBalanceSourceRecord.Source source, Long orderId, String detail) {
 		UserBalanceSourceRecord userBalanceSourceRecord = new UserBalanceSourceRecord();
 		userBalanceSourceRecord.setUserId(userId);
 		userBalanceSourceRecord.setBalance(balance);
 		userBalanceSourceRecord.setSource(source);
+		userBalanceSourceRecord.setOrderId(orderId);
+		userBalanceSourceRecord.setDetail(detail);
 		userBalanceSourceRecordMapper.insert(userBalanceSourceRecord);
 	}
 

+ 0 - 3
netflix-service/src/main/java/com/cyksj/service/user/impl/UserIdentCertServiceImpl.java

@@ -16,7 +16,6 @@ import com.cyksj.model.entity.UserCertRecord;
 import com.cyksj.model.request.UserIndentCertReq;
 import com.cyksj.model.response.WxCertAuthTokenResp;
 import com.cyksj.redis.RedisService;
-import com.cyksj.service.market.task.BindTaskService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserIdentCertService;
 import com.tencentcloudapi.common.Credential;
@@ -44,8 +43,6 @@ public class UserIdentCertServiceImpl implements UserIdentCertService {
 
 	private final UserCertRecordMapper userCertRecordMapper;
 
-	private final BindTaskService bindTaskService;
-
 	private final UserMapper userMapper;
 
 	private final RedisService redisService;

+ 9 - 10
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -218,16 +218,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 	    }
 	    BeanUtil.copyProperties(user, userWhoami);
 
-	    if (StrUtil.isEmpty(user.getLoginPhone())) {
-		    UserBindDetail bindPhone = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
-				    .eq(StrUtil.isNotEmpty(user.getOpenId()), UserBindDetail::getUserId, userId)
-				    .eq(StrUtil.isNotEmpty(user.getEmail()), UserBindDetail::getEmailUserId, userId).last("limit 1"));
-		    //手机号
-		    if (bindPhone != null) {
-			    userWhoami.setBindPhone(bindPhone.getPhone());
-			    userWhoami.setBindEmail(bindPhone.getEmail());
-		    }
-	    }
+		UserBindDetail bindPhone = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
+				.eq(StrUtil.isNotEmpty(user.getOpenId()), UserBindDetail::getUserId, userId)
+				.eq(StrUtil.isNotBlank(user.getLoginPhone()), UserBindDetail::getPhoneUserId, userId)
+				.eq(StrUtil.isNotEmpty(user.getEmail()), UserBindDetail::getEmailUserId, userId).last("limit 1"));
+		//手机号
+		if (bindPhone != null) {
+			userWhoami.setBindPhone(bindPhone.getPhone());
+			userWhoami.setBindEmail(bindPhone.getEmail());
+		}
 	    Integer type = 3;
 	    if (StrUtil.isNotBlank(user.getLoginPhone())) {
 		    type = 1;

+ 64 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserSysMsgNotifyServiceImpl.java

@@ -0,0 +1,64 @@
+package com.cyksj.service.user.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.mapper.UserSysMsgNotifyMapper;
+import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.entity.UserSysMsgNotify;
+import com.cyksj.model.manage.views.GroupsRelationView;
+import com.cyksj.service.user.UserSysMsgNotifyService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSysMsgNotifyServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/2/4 16:03
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserSysMsgNotifyServiceImpl extends ServiceImpl<UserSysMsgNotifyMapper, UserSysMsgNotify> implements UserSysMsgNotifyService {
+	private final UserSysMsgNotifyMapper userSysMsgNotifyMapper;
+
+
+	@Override
+	public void recordUserAccountUpdateSysMsg(Long goodsId, Long skuId, List<GroupsRelationView> relations, String account, String title) {
+		String sysMsg = String.format(Constant.ACCOUNT_PWD_UPDATE_SYS_MSG_NOTIFY, title);
+		Set<Long> userSet = new HashSet<>();
+		List<GroupsRelationView> collect = relations.stream().filter(e -> {
+			if (userSet.contains(e.getUserId())) {
+				return false;
+			}
+			userSet.add(e.getUserId());
+			return true;
+		}).collect(Collectors.toList());
+		if (CollUtil.isNotEmpty(collect)) {
+			userSysMsgNotifyMapper.recordUserAccountUpdateSysMsg(goodsId, skuId, collect, account, sysMsg);
+		}
+	}
+
+	@Override
+	public void recordUserAccountSetSysMsg(Long goodsId, Long skuId, List<GroupsRelation> relations, String account, String title) {
+		String sysMsg = String.format(Constant.ACCOUNT_SET_SYS_MSG_NOTIFY, title);
+		Set<Long> userSet = new HashSet<>();
+		List<GroupsRelation> collect = relations.stream().filter(e -> {
+			if (userSet.contains(e.getUserId())) {
+				return false;
+			}
+			userSet.add(e.getUserId());
+			return true;
+		}).collect(Collectors.toList());
+		if (CollUtil.isNotEmpty(collect)) {
+			userSysMsgNotifyMapper.recordUserAccountSetSysMsg(goodsId, skuId, collect, account, sysMsg);
+		}
+	}
+}

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

@@ -23,6 +23,7 @@ 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.goods.GoodsDonFrontService;
 import com.cyksj.service.home.ClickRecordFrontService;
 import com.cyksj.service.shop.YhShopFrontService;
 import com.cyksj.service.user.UserService;
@@ -75,6 +76,8 @@ public class GoodsDonController {
 
 	private final UserService userService;
 
+	private final GoodsDonFrontService goodsDonFrontService;
+
 	/**
      * 获取平台商品分类
      */
@@ -1051,4 +1054,65 @@ public class GoodsDonController {
 				.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(equipmentActivityReduce);
 	}
+
+	/**
+	 * 获取租赁商品列表
+	 */
+	@GetMapping("/get/deposit")
+	public Result<? extends Object> getDepositGoods() {
+		String depositGoodsKey = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "deposit";
+		Object o = redisService.get(depositGoodsKey);
+		if (o == null) {
+			List<GoodsDon> depositList = beanSearcher.searchAll(GoodsDon.class, MapUtils.builder()
+					.field(GoodsDon::getType, 4)
+					.field(GoodsDon::getStatus, true)
+					.field(GoodsDon::getDeleted, true)
+					.onlySelect(GoodsDon::getId, GoodsDon::getTitle, GoodsDon::getLogo)
+					.build());
+			if (CollUtil.isEmpty(depositList)) {
+				return GatewayResponse.SUCCESS.newBuilder().toResult();
+			}
+			redisService.setNx(depositGoodsKey, depositList, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 60 * RandomUtil.randomInt(10));
+			o = redisService.get(depositGoodsKey);
+		}
+		List<GoodsDon> depositList = Jsons.parseList(o, GoodsDon.class);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(depositList);
+	}
+
+	/**
+	 * 获取pc广告配置
+	 */
+	@GetMapping("/get/pc/homeManage")
+	public Result<Map<String, List<HomeManagementFrontView>>> getPcHomeManagementFrontPage() {
+		String key = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "pc:homeManage";
+		Object o = redisService.get(key);
+		if (o == null) {
+			MapBuilder builder = MapUtils.builder()
+					.field(HomeManagementFrontView::getAdType, List.of(HomeManagementConfig.AdType.pc.name(), HomeManagementConfig.AdType.pcSec.name(), HomeManagementConfig.AdType.pcDis.name())).op(Operator.InList);
+			List<HomeManagementFrontView> homeManagementFrontViews = beanSearcher.searchAll(HomeManagementFrontView.class, builder.build());
+			Map<HomeManagementConfig.AdType, List<HomeManagementFrontView>> map = homeManagementFrontViews.stream().collect(Collectors.groupingBy(HomeManagementFrontView::getAdType));
+			redisService.setNx(key, map, 50 * 60l);
+			o = redisService.get(key);
+		}
+		Map<String, List<HomeManagementFrontView>> map = Jsons.parseObject(o, Map.class);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(map);
+	}
+
+	/**
+	 * 获取pc实物配置
+	 */
+	@GetMapping("/get/pc/realGoodsConfig")
+	public Result<? extends Object> getPcRealGoodsConfig() throws Exception {
+		String key = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "pc:realHomePage";
+		Object o = redisService.get(key);
+		List<HomeManagementFrontView> list = null;
+		if (o == null) {
+			list = goodsDonFrontService.getRealGoodsConfig();
+			redisService.setNx(key, list, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 300);
+		}
+		if (list == null && o != null) {
+			list = Jsons.parseList(o, HomeManagementFrontView.class);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+	}
 }

+ 82 - 0
netflix-web/src/main/java/com/cyksj/web/controller/information/InformationController.java

@@ -0,0 +1,82 @@
+package com.cyksj.web.controller.information;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.InformationCategory;
+import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.InformationDetailView;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.information.InformationCategoryService;
+import com.cyksj.service.information.InformationService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 17:20
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/information")
+@RequiredArgsConstructor
+public class InformationController {
+    private final BeanSearcher beanSearcher;
+
+    private final InformationCategoryService informationCategoryService;
+
+    private final InformationService informationService;
+
+    private final HttpServletRequest request;
+
+    private final RedisService redisService;
+
+    /**
+     * 查询发现页文章列表
+     */
+    @GetMapping("/get")
+    public Result<IPage<InformationListView>> getInformation(Long categoryId, @RequestParam(defaultValue = "0") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+        IPage<InformationListView> information = informationService.getInformation(categoryId, start, limit);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(information);
+    }
+
+
+    /**
+     * 查询分类
+     */
+    @GetMapping("/get/category")
+    public Result<List<InformationCategory>> getInformationCategory() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(informationCategoryService.getInformationCategory());
+    }
+
+    /**
+     * 获取文章详情
+     */
+    @GetMapping("/get/detail/{id}")
+    public Result<InformationDetailView> getInformation(@PathVariable Long id) {
+        String key = RedisService.key.INFORMATION_KEY.getEnvName() + "id:" + id;
+        InformationDetailView view = (InformationDetailView) redisService.get(key);
+        if (view == null){
+            view = beanSearcher.searchFirst(InformationDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+                    .field(InformationDetailView::getId, id).build());
+            try {
+                List<Long> goodsIds = Jsons.parseList(view.getGoodsIds(), Long.class);
+                List<GoodsFrontListView> goodsList = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsFrontListView::getId,goodsIds).op(Operator.InList).build());
+                view.setGoods(goodsList);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            redisService.setNx(key, view, RedisService.key.INFORMATION_KEY.getTimeout());
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+    }
+}

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -76,7 +76,7 @@ public class CmsUserController{
 
     private final OrderDonMapper orderDonMapper;
 
-    private final UserBenefitsService UserBenefitsService;
+    private final UserBenefitsService userBenefitsService;
 
     private final UserPayOrderBlockService userPayOrderBlockService;
 
@@ -364,7 +364,7 @@ public class CmsUserController{
         if (update == 0) {
             throw BusinessRuntimeException.getInstance("扣除用户余额失败,请重试...");
         }
-        UserBenefitsService.recordBalanceBySource(userId, deductBalance.negate(), UserBalanceSourceRecord.Source.manual);
+        userBenefitsService.recordBalanceBySource(userId, deductBalance.negate(), UserBalanceSourceRecord.Source.manual, null, UserBalanceSourceRecord.Source.manual.getDesc());
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 

+ 4 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -514,7 +514,7 @@ public class CmsAccountController {
     @PutMapping("/update")
     @SaCheckPermission("account:update")
     @Log(module = "平台管理/编辑账号", businessType = BusinessType.PUT, isSaveRequestData = true)
-    public Result<String> update(@RequestBody Account account){
+    public Result<String> update(@RequestBody Account account) throws Exception {
 	    Account db = accountService.getById(account.getId());
 	    if (db == null) {
 		    throw BusinessRuntimeException.getInstance("该账号不存在");
@@ -580,6 +580,7 @@ public class CmsAccountController {
 		    //清除gpt token
 		    redisService.del(RedisKey.CHATGPT_ACCESS_TOKEN + dbAccount);
 		    redisService.del(RedisService.key.CHAT_GPT_TOKEN_EXCEPTION_KEY.getName() + dbAccount);
+		    templateCommonService.sendAccountTemplateMsg(account);
 	    }
 	    //时间有效
 	    if (account.getExpiryTime() != null && account.getExpiryTime().after(DateTime.now())) {
@@ -1064,7 +1065,8 @@ public class CmsAccountController {
 					GroupsTrips groupsTrips = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
 							.eq(GroupsTrips::getAccountId, accountId).last("limit 1"));
 					if (groupsTrips != null) {
-						cmsGroupService.sendChangeAccountMsg(groupsTrips.getId(), goodsId);
+						Account byId = accountService.getById(accountId);
+						cmsGroupService.sendChangeAccountMsg(groupsTrips.getId(), goodsId, byId.getAccount());
 					}
 				});
 			});

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

@@ -176,6 +176,15 @@ public class CmsGoodsDonCategoryController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
+	/**
+	 * 移除分类下的平台
+	 */
+	@DeleteMapping("/delete/{relateId}")
+	public Result<String> deleteCategoryByRelateId(@PathVariable Long relateId) {
+		goodsDonCategoryRelateService.removeById(relateId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 	/**
 	 * 获取所有分类列表
 	 */

+ 203 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/information/CmsInformationController.java

@@ -0,0 +1,203 @@
+package com.cyksj.web.controller.manage.information;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.InformationClickUserRecordMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.views.InformationView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.information.InformationCategoryService;
+import com.cyksj.service.information.InformationService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:41
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/information")
+public class CmsInformationController {
+    private final InformationService informationService;
+
+    private final BeanSearcher beanSearcher;
+
+    private final HttpServletRequest request;
+
+    private final InformationCategoryService informationCategoryService;
+
+    private final GoodsDonMapper goodsDonMapper;
+
+    private final RedisService redisService;
+
+    private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
+    private final OrderDonMapper orderDonMapper;
+
+    /**
+     * 保存文章
+     */
+    @PostMapping("/post")
+    public Result<String> saveInformation(@RequestBody Information information) {
+        informationService.save(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 修改文章
+     */
+    @PutMapping("/put")
+    public Result<String> updateInformation(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章");
+        }
+        informationService.updateById(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+    /**
+     * 文章排序
+     */
+    @PutMapping("/sorted")
+    public Result<String> sortedInformation(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要排序的文章");
+        }
+        Integer sorted = information.getSorted();
+        if (sorted != null && sorted >= 0) {
+            Information byId = informationService.getById(information.getId());
+            if (byId != null && byId.getSorted() != sorted) {
+                byId.setSorted(sorted);
+                informationService.updateById(byId);
+                Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+                redisService.del(keys.toArray(String[]::new));
+            }
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+    /**
+     * 获取文章
+     */
+    @GetMapping("/get")
+    public Result<SearchResult<InformationView>> getInformation(Long category) {
+        MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+        if (category != null) {
+            builder.put("ct", String.format(" and JSON_CONTAINS(i.category_ids,'\"%s\"')", category));
+        }
+        SearchResult<InformationView> list = beanSearcher.search(InformationView.class, builder.build());
+        list.getDataList().forEach(data -> {
+            try {
+                List<Long> goodsIds = Jsons.parseList(data.getGoodsIds(), Long.class);
+                data.setGoodsTitles(goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class)
+                        .select(GoodsDon::getTitle)
+                        .in(GoodsDon::getId, goodsIds)
+                        .eq(GoodsDon::getStatus, true)
+                        .eq(GoodsDon::getDeleted,true)).stream().map(GoodsDon::getTitle).collect(Collectors.toList()));
+                List<Long> categoryIds = Jsons.parseList(data.getCategoryIds(), Long.class);
+                data.setCategoryNames(informationCategoryService.list(Wrappers.lambdaQuery(InformationCategory.class)
+                        .select(InformationCategory::getName)
+                        .in(InformationCategory::getId,categoryIds)).stream().map(InformationCategory::getName).collect(Collectors.toList()));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    }
+
+    /**
+     * 修改文章状态
+     */
+    @PutMapping("/update/status")
+    public Result<String> updateStatus(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章");
+        }
+        informationService.updateById(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除文章
+     */
+    @DeleteMapping("/del/{id}")
+    public Result<String> delById(@PathVariable Long id) {
+        Information byId = informationService.getById(id);
+        if (byId == null) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
+        byId.setDeleted(false);
+        informationService.updateById(byId);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+    /**
+     * 保存文章类型
+     */
+    @PostMapping("/post/category")
+    public Result<String> saveInformationCategory(@RequestBody List<InformationCategory> informationCategorys) {
+        log.info("保存文章类型 categorys:{}",informationCategorys);
+        informationCategoryService.saveBatch(informationCategorys);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 修改文章类型
+     */
+    @PutMapping("/put/category")
+    public Result<String> updateInformationCategory(@RequestBody List<InformationCategory> informationCategorys) {
+        informationCategoryService.updateBatchById(informationCategorys);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 获取文章类型
+     */
+    @GetMapping("/get/category")
+    public Result<List<InformationCategory>> getInformationCategory() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(informationCategoryService.list(Wrappers.lambdaQuery(InformationCategory.class).orderByAsc(InformationCategory::getSortBy)));
+    }
+
+    /**
+     * 删除文章类型
+     */
+    @DeleteMapping("/del/category/{id}")
+    public Result<String> delCategoryById(@PathVariable Long id) {
+        int count = informationService.count(Wrappers.lambdaQuery(Information.class).apply("JSON_CONTAINS(category_ids,'\"" + id + "\"')").eq(Information::getDeleted, true));
+        if (count > 0){
+            throw BusinessRuntimeException.getInstance("该类型下存在文章,无法删除");
+        }
+        informationCategoryService.removeById(id);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+}

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java

@@ -52,10 +52,10 @@ public class SignFrontController {
      * 每日签到
      */
     @PostMapping("/post")
-    public Result<Integer> sign() {
+    public Result<SignUser> sign() {
         Long userId = StpUserUtil.getLoginIdAsLong();
         SignUser signUser = marketFrontService.signByUserId(userId);
-        return GatewayResponse.SUCCESS.newBuilder().setMsg("签到成功").toResult(signUser.getDayPeriod());
+        return GatewayResponse.SUCCESS.newBuilder().setMsg("签到成功").toResult(signUser);
     }
 
     /**

+ 14 - 2
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -630,6 +630,18 @@ public class OrderController {
         return "";
     }
 
-
-
+    /**
+     * 余额明细
+     */
+    @GetMapping("/get/balance/detail")
+    public Result<SearchResult<UserBalanceSourceRecord>> getUserBalanceSourceRecord() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        SearchResult<UserBalanceSourceRecord> search = beanSearcher.search(UserBalanceSourceRecord.class, MapUtils.flatBuilder(request.getParameterMap())
+                .field(UserBalanceSourceRecord::getUserId, userId)
+                .field(UserBalanceSourceRecord::getDetail).op(Operator.NotNull)
+                .orderBy(UserBalanceSourceRecord::getId).desc()
+                .onlySelect(UserBalanceSourceRecord::getBalance, UserBalanceSourceRecord::getDetail, UserBalanceSourceRecord::getCreatedTime)
+                .build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }

+ 100 - 0
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderShopCartController.java

@@ -0,0 +1,100 @@
+package com.cyksj.web.controller.payment;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.ShoppingCartDon;
+import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.UnifiedOrderPayReq;
+import com.cyksj.model.views.ShoppingCartDonPayDetailView;
+import com.cyksj.model.views.ShoppingCartDonView;
+import com.cyksj.service.order.ShoppingCartDonService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderShopCartController
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 11:05
+ */
+@RestController
+@RequestMapping("/applet/order/shopCart")
+@RequiredArgsConstructor
+public class OrderShopCartController {
+	private final ShoppingCartDonService shoppingCartDonService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	/**
+	 * 将商品添加至购物车
+	 */
+	@PostMapping("/add")
+	public Result<String> addGoodsShoppingCart(@RequestBody ShoppingCartDon goods) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		goods.setUserId(userId);
+		shoppingCartDonService.addGoodsShoppingCart(goods);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 将商品 移除购物车
+	 */
+	@DeleteMapping("/remove/{id}")
+	public Result<String> removeShoppingCartGoodsById(@PathVariable Long id) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		shoppingCartDonService.remove(Wrappers.lambdaQuery(ShoppingCartDon.class)
+				.eq(ShoppingCartDon::getUserId, userId)
+				.eq(ShoppingCartDon::getId, id));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 一键清空 购物车
+	 */
+	@DeleteMapping("/clean")
+	public Result<String> cleanShoppingCart() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		shoppingCartDonService.remove(Wrappers.lambdaQuery(ShoppingCartDon.class)
+				.eq(ShoppingCartDon::getUserId, userId));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 个人 购物车列表
+	 */
+	@DeleteMapping("/get")
+	public Result<SearchResult<ShoppingCartDonView>> getShoppingCartGoods() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		builder.put("uid", String.format(" where user_id = %s", userId));
+		SearchResult<ShoppingCartDonView> search = beanSearcher.search(ShoppingCartDonView.class, builder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 购物车 下单
+	 */
+	@PostMapping("/unified/pay")
+	public Result<ShoppingCartDonPayDetailView> unifiedPayShoppingCartGoods(@RequestBody UnifiedOrderPayReq unifiedOrderPayReq) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		unifiedOrderPayReq.setUserId(userId);
+		ShoppingCartDonPayDetailView payDetailView = shoppingCartDonService.unifiedPayShoppingCartGoods(unifiedOrderPayReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(payDetailView);
+	}
+
+
+}

+ 84 - 0
netflix-web/src/main/java/com/cyksj/web/controller/search/SearchController.java

@@ -0,0 +1,84 @@
+package com.cyksj.web.controller.search;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.SearchHistoryMapper;
+import com.cyksj.model.entity.SearchHistory;
+import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.model.views.SearchView;
+import com.cyksj.service.information.InformationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.operator.Contain;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 17:13
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/search")
+@RequiredArgsConstructor
+public class SearchController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final InformationService informationService;
+
+    private final SearchHistoryMapper searchHistoryMapper;
+
+    private final HttpServletRequest request;
+
+    /**
+     * 查询搜索结果
+     */
+    @GetMapping("/get")
+    public Result<SearchView> search(String name){
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        if (userId != null){
+            SearchHistory searchHistory = new SearchHistory();
+            searchHistory.setName(name);
+            searchHistory.setUserId(userId);
+            searchHistoryMapper.insert(searchHistory);
+        }
+        List<GoodsFrontListView> goodsList = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsFrontListView::getTitle,name).op(Operator.Contain).build());
+        List<InformationListView> informationList = informationService.getInformationByTitle(name);
+        SearchView view = new SearchView();
+        view.setGoodsList(goodsList);
+        view.setInformationList(informationList);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+    }
+
+
+    /**
+     * 查询搜索历史
+     */
+    @GetMapping("/get/searchHistory")
+    public Result<List<SearchHistory>> getSearchHistory(){
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        if (userId != null){
+            return GatewayResponse.SUCCESS.newBuilder().toResult(searchHistoryMapper.selectList(Wrappers.lambdaQuery(SearchHistory.class).eq(SearchHistory::getUserId,userId).orderByDesc(SearchHistory::getCreatedTime).last("limit 10")));
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除搜索历史
+     */
+    @DeleteMapping("/delete/history")
+    private Result<Void> delHistory(Long id){
+        long userId = StpUserUtil.getLoginIdAsLong();
+        searchHistoryMapper.delete(Wrappers.lambdaQuery(SearchHistory.class).eq(id != null,SearchHistory::getId,id).eq(SearchHistory::getUserId,userId));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+}

+ 81 - 0
netflix-web/src/main/java/com/cyksj/web/controller/sys/UserSysMsgController.java

@@ -0,0 +1,81 @@
+package com.cyksj.web.controller.sys;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserSysMsgNotifyMapper;
+import com.cyksj.model.entity.UserSysMsgNotify;
+import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
+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.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSysMsgController
+ * 创建者: JavaZou
+ * 创建时间:2024/2/4 16:58
+ */
+@RequestMapping("/sys/msg")
+@RestController
+@RequiredArgsConstructor
+public class UserSysMsgController {
+
+	private final BeanSearcher beanSearcher;
+
+	private final UserBindRelationService userBindRelationService;
+
+	private final UserSysMsgNotifyMapper userSysMsgNotifyMapper;
+
+	private final HttpServletRequest request;
+
+
+	/**
+	 * 用户系统消息
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<UserSysMsgNotify>> getSysMsg() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		SearchResult<UserSysMsgNotify> search = beanSearcher.search(UserSysMsgNotify.class, MapUtils.flatBuilder(request.getParameterMap()).field(UserSysMsgNotify::getUserId, userIdList).op(Operator.InList).field(UserSysMsgNotify::getDeleted, 1).orderBy(UserSysMsgNotify::getIsView).orderBy(UserSysMsgNotify::getCreatedTime).desc().onlySelect(UserSysMsgNotify::getId, UserSysMsgNotify::getAccount, UserSysMsgNotify::getRelationId, UserSysMsgNotify::getMsg, UserSysMsgNotify::getIsView).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 查看消息
+	 */
+	@GetMapping("/view/detail/{id}")
+	public Result viewMsgDetail(@PathVariable Long id) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		Optional.ofNullable(userSysMsgNotifyMapper.selectOne(Wrappers.lambdaQuery(UserSysMsgNotify.class).eq(UserSysMsgNotify::getId, id).in(UserSysMsgNotify::getUserId, userIdList).eq(UserSysMsgNotify::getDeleted, 1))).ifPresent(e -> {
+			if (!e.getIsView()) {
+				e.setIsView(false);
+				userSysMsgNotifyMapper.updateById(e);
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除消息
+	 */
+	@DeleteMapping("/del/{id}")
+	public Result delMsg(@PathVariable Long id) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		Optional.ofNullable(userSysMsgNotifyMapper.selectOne(Wrappers.lambdaQuery(UserSysMsgNotify.class).eq(UserSysMsgNotify::getId, id).in(UserSysMsgNotify::getUserId, userIdList).eq(UserSysMsgNotify::getDeleted, 1))).ifPresent(e -> {
+			e.setDeleted(false);
+			userSysMsgNotifyMapper.updateById(e);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 14 - 6
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -38,6 +38,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -98,16 +99,23 @@ public class UserController {
         long userId = StpUserUtil.getLoginIdAsLong();
         List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-        Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
-        Number ticketNum = beanSearcher.searchCount(UserTicketView.class, builder
-                .field(UserTicketView::getYhsId, yhsId)
-                .field(UserTicketView::getUserId, userIds).op(Operator.InList)
+        List<RenewalView> renewalViews = beanSearcher.searchAll(RenewalView.class, builder
+                .field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
+                .field(RenewalView::getUserId, userIds).op(Operator.InList)
                 .field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
+                .orderBy(RenewalView::getExpiryTime).asc()
+                .onlySelect(RenewalView::getExpiryTime)
                 .build());
-        UserPersonalView personalView = new UserPersonalView();
         DateTime now = DateTime.now();
+        renewalViews = renewalViews.stream().filter(e -> {
+            if (e.getExpiryTime() != null && e.getExpiryTime().before(now)) {
+                return false;
+            }
+            return true;
+        }).collect(Collectors.toList());
+        UserPersonalView personalView = new UserPersonalView();
         //车票
-        personalView.setNumOfTickets(ticketNum.intValue());
+        personalView.setNumOfTickets(renewalViews.size());
         //优惠券
         Integer couponSize = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
                 .eq(CouponUser::getUserId, userId)