Pārlūkot izejas kodu

cps后台优化

zoujiajian 2 gadi atpakaļ
vecāks
revīzija
2348b93408
29 mainītis faili ar 809 papildinājumiem un 25 dzēšanām
  1. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/CpsUserGuideRecordMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/DistributePopularizeClickRecordMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonPosterRelateMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserDistributePosterRecordMapper.java
  5. 2 1
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cps/UserDistributePopularizeMapper.java
  6. 17 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CpsUserGuideRecord.java
  7. 34 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributePopularizeClickRecord.java
  8. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonPosterRelate.java
  9. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistribute.java
  10. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributePosterRecord.java
  11. 25 0
      netflix-dao/src/main/java/com/cyksj/model/request/DistributePopularizeClickReq.java
  12. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  13. 76 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePosterGoodsCpsView.java
  14. 10 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePosterGoodsFrontView.java
  15. 32 2
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributePopularizeView.java
  16. 38 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributePosterOrderDetailView.java
  17. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRateView.java
  18. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserInfoView.java
  19. 6 0
      netflix-dao/src/main/resources/mapper/UserDistributePopularizeMapper.xml
  20. 13 0
      netflix-service/src/main/java/com/cyksj/service/click/UserClickRecordService.java
  21. 59 0
      netflix-service/src/main/java/com/cyksj/service/click/impl/UserClickRecordServiceImpl.java
  22. 1 1
      netflix-service/src/main/java/com/cyksj/service/cps/CpsPopularizeService.java
  23. 2 2
      netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsPopularizeServiceImpl.java
  24. 8 0
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  25. 32 5
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  26. 24 1
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java
  27. 253 7
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsPopularizeController.java
  28. 35 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserClickRecordController.java
  29. 38 5
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

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

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

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.DistributePopularizeClickRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributePopularizeClickRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/8/14 18:54
+ */
+public interface DistributePopularizeClickRecordMapper extends BaseMapper<DistributePopularizeClickRecord> {
+}

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

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

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

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

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/mapper/manage/cps/UserDistributePopularizeMapper.java

@@ -3,6 +3,7 @@ package com.cyksj.mapper.manage.cps;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.UserDistributePopularize;
 import com.cyksj.model.views.UserDistributePopularizeView;
+import org.apache.ibatis.annotations.Param;
 
 /*
  *项目名: netflix
@@ -11,5 +12,5 @@ import com.cyksj.model.views.UserDistributePopularizeView;
  *创建时间:2023/5/15 15:56
  */
 public interface UserDistributePopularizeMapper extends BaseMapper<UserDistributePopularize> {
-	UserDistributePopularizeView getDefaultPopularizeDetail(long cpsUserId);
+	UserDistributePopularizeView getDefaultPopularizeDetail(@Param("cpsUserId") long cpsUserId, @Param("start") String start, @Param("end") String end);
 }

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CpsUserGuideRecord.java

@@ -0,0 +1,17 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CpsUserGuideRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/8/14 18:47
+ */
+@Getter
+@Setter
+public class CpsUserGuideRecord extends BaseEntity{
+
+	private Long userId;
+}

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/DistributePopularizeClickRecord.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributePopularizeClickRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/8/14 18:54
+ */
+@Getter
+@Setter
+public class DistributePopularizeClickRecord extends BaseEntity{
+
+	private Long popularizeId;
+
+	/**
+	 * 用户海报记录id
+	 */
+	private Long rid;
+
+	/**
+	 * 推广链接标识
+	 */
+	private String showId;
+
+	/**
+	 * 推广链接所属用户
+	 */
+	private Long sharedId;
+
+	private Long userId;
+}

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

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderDonPosterRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/8/22 11:13
+ */
+@Getter
+@Setter
+public class OrderDonPosterRelate extends BaseEntity{
+	private Long recordId;
+
+	private Long orderId;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistribute.java

@@ -37,6 +37,11 @@ public class UserDistribute extends BaseEntity{
 	 */
 	private Date businessBindTime;
 
+	/**
+	 * 是否打开推荐海报 默认fasle
+	 */
+	private Boolean isPoster;
+
 	@TableLogic(value = "1", delval = "0")
 	private Boolean deleted;
 }

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

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributePosterRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/8/22 11:10
+ */
+@Getter
+@Setter
+public class UserDistributePosterRecord extends BaseEntity{
+	private Long userId;
+
+	private Long posterId;
+}

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

@@ -0,0 +1,25 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributePopularizeClickReq
+ * 创建者: JavaZou
+ * 创建时间:2024/8/22 10:40
+ */
+@Getter
+@Setter
+public class DistributePopularizeClickReq {
+
+	/**
+	 * 推广标识
+	 */
+	private String dsCode;
+
+	/**
+	 * 海报记录id
+	 */
+	private Long rid;
+}

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

@@ -180,4 +180,9 @@ public class OrderPayRequest {
      * 是否是试用车票跳转
      */
     private Boolean isTrial;
+
+    /**
+     * 用户海报记录id
+     */
+    private Long rid;
 }

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

@@ -0,0 +1,76 @@
+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.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributePosterGoodsCpsView
+ * 创建者: JavaZou
+ * 创建时间:2024/8/22 10:24
+ */
+@Getter
+@Setter
+@SearchBean(tables = "distribute_poster_goods dp inner join goods_don g on g.id = dp.goods_id",
+		where = "dp.status is true and g.status is true and g.deleted is true",
+		orderBy = "dp.update_time desc")
+public class DistributePosterGoodsCpsView {
+	@DbField("dp.id")
+	private Long id;
+
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * 推广名称
+	 */
+	@DbField("dp.name")
+	private String name;
+
+	@DbField("dp.img")
+	private String img;
+
+	@DbField("g.logo")
+	private String logo;
+
+	@DbField("g.rate")
+	private Integer rate;
+
+	@DbField("g.is_sku_distribute")
+	private Boolean isSkuRate;
+
+	@DbField("g.min_price")
+	private BigDecimal price;
+
+	@DbField("dp.sku_ids")
+	private String skuIds;
+
+	/**
+	 * 海报记录id
+	 */
+	@DbIgnore
+	private Long rid;
+
+	@DbIgnore
+	private Integer clickNum = 0;
+
+	@DbIgnore
+	private Integer orders;
+
+	@DbIgnore
+	private BigDecimal ordersMoney;
+
+	@DbIgnore
+	private BigDecimal wMoney;
+
+	@DbIgnore
+	private BigDecimal gotMoney;
+}

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

@@ -1,6 +1,7 @@
 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;
@@ -20,6 +21,9 @@ import java.math.BigDecimal;
 		where = "dp.status is true and g.status is true and g.deleted is true",
 		orderBy = "dp.update_time desc")
 public class DistributePosterGoodsFrontView {
+	@DbField("dp.id")
+	private Long id;
+
 	@DbField("g.id")
 	private Long goodsId;
 
@@ -49,4 +53,10 @@ public class DistributePosterGoodsFrontView {
 
 	@DbField("dp.sku_ids")
 	private String skuIds;
+
+	/**
+	 * 海报记录id
+	 */
+	@DbIgnore
+	private Long rid;
 }

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

@@ -19,7 +19,7 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "(select id,name,remark,code,created_time,goods_id from user_distribute_popularize where deleted is true :userId:) dp left join order_don od on od.cps_popularize_id = dp.id" +
-		" and od.status not in ('close','noPayment') and od.relation_id != 0 and is_fixed_distribute is true" +
+		" and od.status not in ('close','noPayment') and od.relation_id != 0 and is_fixed_distribute is true :time:" +
 		" left join distribute_waiting_send_points dsp on dsp.order_id = od.id and dsp.send_status in ('success','waiting')",
 		groupBy = "dp.id,dp.name,dp.code,dp.remark,dp.created_time,dp.goods_id")
 public class UserDistributePopularizeView {
@@ -36,9 +36,36 @@ public class UserDistributePopularizeView {
 	@DbField("dp.goods_id")
 	private Long goodsId;
 
+	@DbIgnore
+	private String title;
+
+	@DbIgnore
+	private String logo;
+
+	/**
+	 * 最低价格
+	 */
+	@DbIgnore
+	private BigDecimal price;
+
+	/**
+	 * 分销比例
+	 */
+	@DbIgnore
+	private Integer rate = 0;
+
+	@DbIgnore
+	private Integer clickNum = 0;
+
 	@DbIgnore
 	private String popularizeLink;
 
+	/**
+	 * 推广链接二维码
+	 */
+	@DbIgnore
+	private String urlCode;
+
 	@DbField("count(if(dsp.id is NULL,NULL,1))")
 	private Integer orders;
 
@@ -55,11 +82,14 @@ public class UserDistributePopularizeView {
 	private String remark;
 
 	@DbField("dp.created_time")
-	private Date createTime;
+	private Date createdTime;
 
 	/**
 	 * 优惠码
 	 */
 	@DbIgnore
 	private String couponCode;
+
+	@DbIgnore
+	private DistributePosterGoodsDetailView posterInfo;
 }

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

@@ -0,0 +1,38 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributePosterOrderDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/8/22 10:32
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select id from user_distribute_poster_record :condition:) dp left join order_don_poster_relate opr on opr.record_id = dp.id" +
+		" left join order_don od on od.id = opr.order_id and od.status not in ('close','noPayment') and od.relation_id != 0 and is_fixed_distribute is true :time:" +
+		" left join distribute_waiting_send_points dsp on dsp.order_id = od.id and dsp.send_status in ('success','waiting')",
+		groupBy = "dp.id")
+public class UserDistributePosterOrderDetailView {
+
+	@DbField("dp.id")
+	private Long id;
+
+	@DbField("count(if(dsp.id is NULL,NULL,1))")
+	private Integer orders;
+
+	@DbField("ifnull(cast(sum(if(dsp.id is NULL,0,money))/100 as decimal(11,2)),0)")
+	private BigDecimal ordersMoney;
+
+	@DbField("ifnull(cast(sum(if(dsp.send_status='waiting',dsp.points,0))/1000 as decimal(11,2)),0)")
+	private BigDecimal wMoney;
+
+	@DbField("ifnull(cast(sum(if(dsp.send_status='success',dsp.points,0))/1000 as decimal(11,2)),0)")
+	private BigDecimal gotMoney;
+}

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

@@ -16,7 +16,7 @@ import lombok.Setter;
 @SearchBean(tables = "goods_don g left join goods_don_category_relate gcr on gcr.goods_id = g.id" +
 		" left join goods_don_category gc on gc.id = gcr.category" +
 		" left join user_plat_distribute_rate upr on upr.goods_id = g.id :distribute_id:",
-		where = "g.type = 1 and g.deleted is true and g.status is true and g.is_distribute is true and upr.rate > 0")
+		where = "g.type = 1 and g.deleted is true and g.status is true and g.is_distribute is true")
 public class UserDistributeRateView {
 
 	@DbField("gcr.category")

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

@@ -23,4 +23,9 @@ public class UserInfoView {
 	 * 是否是设备分销
 	 */
 	private Boolean isEp;
+
+	/**
+	 * 是否展示海报信息
+	 */
+	private Boolean isPoster;
 }

+ 6 - 0
netflix-dao/src/main/resources/mapper/UserDistributePopularizeMapper.xml

@@ -15,5 +15,11 @@
                                od.is_fixed_distribute is true and od.cps_popularize_id = 0
                  inner join distribute_waiting_send_points dp on dp.order_id = od.id
             and dp.send_status in ('success', 'waiting')
+        <if test="start != null">
+            and dp.created_time >= #{start}
+        </if>
+        <if test="end != null">
+            and dp.created_time &lt; #{end}
+        </if>
     </select>
 </mapper>

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/click/UserClickRecordService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.click;
+
+import com.cyksj.model.request.DistributePopularizeClickReq;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserClickRecordService
+ * 创建者: JavaZou
+ * 创建时间:2024/8/14 18:53
+ */
+public interface UserClickRecordService {
+	void recordDistributePopularize(Long userId, DistributePopularizeClickReq clickReq);
+}

+ 59 - 0
netflix-service/src/main/java/com/cyksj/service/click/impl/UserClickRecordServiceImpl.java

@@ -0,0 +1,59 @@
+package com.cyksj.service.click.impl;
+
+import com.cyksj.dto.UserSharedDto;
+import com.cyksj.mapper.DistributePopularizeClickRecordMapper;
+import com.cyksj.mapper.UserDistributePosterRecordMapper;
+import com.cyksj.model.entity.DistributePopularizeClickRecord;
+import com.cyksj.model.entity.UserDistributePosterRecord;
+import com.cyksj.model.request.DistributePopularizeClickReq;
+import com.cyksj.service.click.UserClickRecordService;
+import com.cyksj.service.user.UserService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserClickRecordServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/8/14 18:53
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserClickRecordServiceImpl implements UserClickRecordService {
+
+	private final DistributePopularizeClickRecordMapper distributePopularizeClickRecordMapper;
+
+	private final UserService userService;
+
+	private final UserDistributePosterRecordMapper userDistributePosterRecordMapper;
+
+
+	@Override
+	public void recordDistributePopularize(Long userId, DistributePopularizeClickReq clickReq) {
+		String showId = clickReq.getDsCode();
+		log.info("点击用户分销链接:{} 进入官网", showId);
+		Long rid = clickReq.getRid();
+		DistributePopularizeClickRecord clickRecord = new DistributePopularizeClickRecord();
+		if (rid != null) {
+			log.info("点击用户推广海报:{}进入官网", rid);
+			UserDistributePosterRecord distributePosterRecord = userDistributePosterRecordMapper.selectById(rid);
+			if (distributePosterRecord != null) {
+				clickRecord.setSharedId(distributePosterRecord.getUserId());
+			}
+		}
+		//不存在推广海报
+		if (rid == null) {
+			UserSharedDto popularizeDto = userService.getUserShredDtoByDsCode(showId);
+			if (popularizeDto != null) {
+				clickRecord.setSharedId(popularizeDto.getSharedId());
+				clickRecord.setPopularizeId(popularizeDto.getDsPopularizeId());
+			}
+		}
+		clickRecord.setUserId(userId);
+		clickRecord.setShowId(showId);
+		clickRecord.setRid(rid);
+		distributePopularizeClickRecordMapper.insert(clickRecord);
+	}
+}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/cps/CpsPopularizeService.java

@@ -16,7 +16,7 @@ public interface CpsPopularizeService {
 
 	void deleteById(long cpsUserId, Long id);
 
-	UserDistributePopularizeView getDefaultPopularizeDetail(long cpsUserId);
+	UserDistributePopularizeView getDefaultPopularizeDetail(long cpsUserId, String start, String end);
 
 	String getServiceCodeUrl(long cpsUserId);
 }

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsPopularizeServiceImpl.java

@@ -94,8 +94,8 @@ public class CpsPopularizeServiceImpl implements CpsPopularizeService {
 	}
 
 	@Override
-	public UserDistributePopularizeView getDefaultPopularizeDetail(long cpsUserId) {
-		return popularizeMapper.getDefaultPopularizeDetail(cpsUserId);
+	public UserDistributePopularizeView getDefaultPopularizeDetail(long cpsUserId, String start, String end) {
+		return popularizeMapper.getDefaultPopularizeDetail(cpsUserId, start, end);
 	}
 
 	@Override

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -258,6 +258,11 @@ public class DistributeServiceImpl implements DistributeService {
 		//特殊平台 按规格分销比例
 		List<UserPlatSkuDistributeRate> skuRates = userDistributeReq.getSkuRates();
 		if (CollUtil.isNotEmpty(skuRates)) {
+			List<Long> skuIds = skuRates.stream().map(UserPlatSkuDistributeRate::getSkuId).collect(Collectors.toList());
+			userPlatSkuDistributeRateMapper.delete(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
+					.notIn(UserPlatSkuDistributeRate::getSkuId, skuIds)
+					.eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId()));
+
 			Map<Long, GoodsDon> map = new ConcurrentHashMap<>();
 			for (UserPlatSkuDistributeRate skuRate : skuRates) {
 				if (skuRate.getRate() == null) {
@@ -287,6 +292,9 @@ public class DistributeServiceImpl implements DistributeService {
 				} catch (DuplicateKeyException e) {
 				}
 			}
+		} else {
+			userPlatSkuDistributeRateMapper.delete(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
+					.eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId()));
 		}
 		handlerDistributeOtherFunc(userDistribute, userDistributeReq);
 	}

+ 32 - 5
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -322,6 +322,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonRenewRecordMapper orderDonRenewRecordMapper;
 
+	private final OrderDonPosterRelateMapper orderDonPosterRelateMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -646,13 +648,26 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			informationClickUserRecord.setOrderId(orderDon.getId());
 			informationClickUserRecordMapper.insert(informationClickUserRecord);
 		}
+
+		//统一处理订单记录操作
+		unifiedHandlerOrderRecordFunc(orderDon.getId(), payRequest);
+		return orderDon;
+	}
+
+	/**
+	 * 统一处理订单记录操作
+	 */
+	private void unifiedHandlerOrderRecordFunc(Long orderId, OrderPayRequest payRequest) {
+
 		//记录订单ip关联
-		recordOrderDonLocationRelate(orderDon.getId(), payRequest.getIp());
+		recordOrderDonLocationRelate(orderId, payRequest.getIp());
 		//记录补贴订单关联
-		recordOrderDonSubsidyRelate(orderDon.getId(), subsidyId);
+		recordOrderDonSubsidyRelate(orderId, payRequest.getSubsidyId());
 		//试用车票跳转记录
-		recordOrderTrialTicketJumpPay(payRequest.getIsTrial(),orderDon.getId());
-		return orderDon;
+		recordOrderTrialTicketJumpPay(orderId,payRequest.getIsTrial());
+		//记录用户推广海报下单记录
+		recordPosterUserOrder(orderId, payRequest.getRid());
+
 	}
 
 	private Boolean checkIsNeedGroupsRelation(GoodsDon goodsDon) {
@@ -3769,7 +3784,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	/**
 	 * 试用车票跳转购买正式车票订单记录
 	 */
-	public void recordOrderTrialTicketJumpPay(Boolean isTrial, Long orderId) {
+	public void recordOrderTrialTicketJumpPay(Long orderId,Boolean isTrial) {
 		if (isTrial != null && isTrial) {
 			UserTrialTicketJumpPayRecord userTrialTicketJumpPayRecord = new UserTrialTicketJumpPayRecord();
 			userTrialTicketJumpPayRecord.setOrderId(orderId);
@@ -3817,4 +3832,16 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	/**
+	 * 用户通过海报下单记录
+	 */
+	private void recordPosterUserOrder(Long orderId, Long rid) {
+		if (rid != null) {
+			OrderDonPosterRelate orderDonPosterRelate = new OrderDonPosterRelate();
+			orderDonPosterRelate.setOrderId(orderId);
+			orderDonPosterRelate.setRecordId(rid);
+			orderDonPosterRelateMapper.insert(orderDonPosterRelate);
+		}
+	}
 }

+ 24 - 1
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java

@@ -14,6 +14,7 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.CpsUserGuideRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.cps.CpsUserAdRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
@@ -69,6 +70,8 @@ public class CpsBackLoginController {
 
 	private final SysConfigMapper sysConfigMapper;
 
+	private final CpsUserGuideRecordMapper cpsUserGuideRecordMapper;
+
 	/**
 	 * 获取登录验证码
 	 */
@@ -195,7 +198,7 @@ public class CpsBackLoginController {
 		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		User user = userMapper.selectById(cpsUserId);
 		Assert.notNull(user, "用户不存在");
-		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).eq(UserDistribute::getDeleted, 1).select(UserDistribute::getId).last("limit 1"));
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).eq(UserDistribute::getDeleted, 1).select(UserDistribute::getId, UserDistribute::getIsPoster).last("limit 1"));
 		Assert.notNull(userDistribute, "只支持渠道分销用户登录");
 		UserInfoView userInfoView = new UserInfoView();
 		userInfoView.setImg(user.getHeadimgurl());
@@ -203,6 +206,26 @@ public class CpsBackLoginController {
 		Integer selectCount = userDistributeEquipmentMapper.selectCount(Wrappers.lambdaQuery(UserDistributeEquipment.class)
 				.eq(UserDistributeEquipment::getUserId, cpsUserId));
 		userInfoView.setIsEp(selectCount > 0 ? true : false);
+		userInfoView.setIsPoster(userDistribute.getIsPoster());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(userInfoView);
 	}
+
+	/**
+	 * 是否首次进入cps后台
+	 */
+	@GetMapping("/get/first")
+	public Result<Boolean> firstLogin() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+
+		Integer selectCount = cpsUserGuideRecordMapper.selectCount(Wrappers.lambdaQuery(CpsUserGuideRecord.class)
+				.eq(CpsUserGuideRecord::getUserId, cpsUserId));
+		Boolean flag = false;
+		if (selectCount == 0) {
+			CpsUserGuideRecord cpsUserGuideRecord = new CpsUserGuideRecord();
+			cpsUserGuideRecord.setUserId(cpsUserId);
+			cpsUserGuideRecordMapper.insert(cpsUserGuideRecord);
+			flag = true;
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(flag);
+	}
 }

+ 253 - 7
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsPopularizeController.java

@@ -1,15 +1,23 @@
 package com.cyksj.web.controller.cps;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.DistributePopularizeClickRecordMapper;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.UserDistributePosterRecordMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserDistributePopularize;
+import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.views.DistributePosterGoodsCpsView;
 import com.cyksj.model.views.UserDistributePopularizeView;
+import com.cyksj.model.views.UserDistributePosterOrderDetailView;
 import com.cyksj.service.cps.CpsPopularizeService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpCpsManageUser;
@@ -19,6 +27,7 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -48,17 +57,86 @@ public class CpsPopularizeController {
 
 	private final UserService userService;
 
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final DistributePopularizeClickRecordMapper distributePopularizeClickRecordMapper;
+
+	private final UserDistributeMapper userDistributeMapper;
+
+	private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
+
+	private final GoodsDonSkuMapper skuMapper;
+
+	private final UserPlatSkuDistributeRateMapper userPlatSkuDistributeRateMapper;
+
+	private final DistributeGeneralSkuRateMapper distributeGeneralSkuRateMapper;
+
+	private final UserDistributePosterRecordMapper userDistributePosterRecordMapper;
+
+	private final DistributePosterGoodsMapper distributePosterGoodsMapper;
+
 	/**
 	 * 渠道推广链接列表
 	 */
 	@GetMapping("/get")
-	public Result<SearchResult<UserDistributePopularizeView>> getList() {
+	public Result<SearchResult<UserDistributePopularizeView>> getList(String startTime, String endTime) {
 		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		builder.put("userId", String.format("and user_id = %s", cpsUserId));
+		String time = StrUtil.EMPTY;
+		if (startTime != null) {
+			time += String.format(" and od.created_time >= '%s'", startTime);
+		}
+		if (endTime != null) {
+			time += String.format(" and od.created_time < '%s'", endTime);
+		}
+		if (StrUtil.isNotBlank(time)) {
+			builder.put("time", time);
+		}
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getUserId, cpsUserId)
+				.eq(UserDistribute::getDeleted, 1)
+				.last("limit 1"));
 		SearchResult<UserDistributePopularizeView> search = beanSearcher.search(UserDistributePopularizeView.class, builder.build());
 		search.getDataList().forEach(data -> {
 			data.setPopularizeLink(String.format(envCommonService.DISTRIBUTE_DEFAULT_URL_PREFIX, data.getCode()));
+			Optional.ofNullable(goodsDonMapper.selectById(data.getGoodsId())).ifPresent(goods -> {
+				data.setTitle(goods.getTitle());
+				data.setLogo(goods.getLogo());
+				data.setPrice(goods.getMinPrice());
+				UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
+						.eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
+						.eq(UserPlatDistributeRate::getGoodsId, data.getGoodsId())
+						.last("limit 1"));
+				if (userPlatDistributeRate != null) {
+					data.setRate(userPlatDistributeRate.getRate());
+				}
+				if (goods.getIsSkuDistribute()) {
+					UserPlatSkuDistributeRate userPlatSkuDistributeRate = userPlatSkuDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
+							.eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId())
+							.eq(UserPlatSkuDistributeRate::getGoodsId, data.getGoodsId())
+							.ne(UserPlatSkuDistributeRate::getRate, 0)
+							//上架
+							.apply("exists (select 1 from goods_don_sku sku where sku.id = sku_id and sku.status is true limit 1)")
+							.orderByAsc(UserPlatSkuDistributeRate::getRate)
+							.last("limit 1"));
+					if (userPlatSkuDistributeRate != null) {
+						data.setRate(userPlatSkuDistributeRate.getRate());
+					}
+				}
+			});
+			data.setClickNum(distributePopularizeClickRecordMapper.selectCount(Wrappers.lambdaQuery(DistributePopularizeClickRecord.class)
+					.eq(DistributePopularizeClickRecord::getPopularizeId, data.getId())
+					.ge(startTime != null, DistributePopularizeClickRecord::getCreatedTime, startTime)
+					.lt(endTime != null, DistributePopularizeClickRecord::getCreatedTime, endTime)));
+			String link = data.getPopularizeLink();
+			if (data.getGoodsId() != null && data.getGoodsId() > 0) {
+				if (!envCommonService.isPrdEnv()) {
+					link += "/test/web";
+				}
+				link += "/?gid=" + data.getGoodsId();
+			}
+			data.setUrlCode(QrCodeUtil.generateAsBase64(link, QrConfig.create(), "png"));
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
@@ -67,10 +145,10 @@ public class CpsPopularizeController {
 	 * 默认链接详情
 	 */
 	@GetMapping("/get/default")
-	public Result<UserDistributePopularizeView> getDefaultDetail() {
+	public Result<UserDistributePopularizeView> getDefaultDetail(String startTime, String endTime) {
 		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		User user = userService.getById(cpsUserId);
-		UserDistributePopularizeView view = Optional.ofNullable(cpsPopularizeService.getDefaultPopularizeDetail(cpsUserId)).orElseGet(() -> {
+		UserDistributePopularizeView view = Optional.ofNullable(cpsPopularizeService.getDefaultPopularizeDetail(cpsUserId, startTime, endTime)).orElseGet(() -> {
 			UserDistributePopularizeView newPopularizeView = new UserDistributePopularizeView();
 			newPopularizeView.setOrders(0);
 			newPopularizeView.setOrdersMoney(BigDecimal.ZERO);
@@ -84,6 +162,8 @@ public class CpsPopularizeController {
 		view.setPopularizeLink(String.format(envCommonService.DISTRIBUTE_DEFAULT_URL_PREFIX, user.getShowId()));
 		//优惠码
 		view.setCouponCode(couponDistributePopularizeMapper.getCouponCodeByUid(cpsUserId));
+		view.setClickNum(distributePopularizeClickRecordMapper.selectCount(Wrappers.lambdaQuery(DistributePopularizeClickRecord.class).eq(DistributePopularizeClickRecord::getShowId, user.getShowId())));
+		view.setUrlCode(QrCodeUtil.generateAsBase64(view.getPopularizeLink(), QrConfig.create(), "png"));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(view);
 	}
 
@@ -126,7 +206,8 @@ public class CpsPopularizeController {
 	 * 获取所有平台列表
 	 */
 	@GetMapping("/get/all/goods")
-	public Result<List<GoodsDon>> getAllGoodsList(Boolean isNoBuyout) {
+	public Result<List<GoodsDon>> getAllGoodsList(Boolean isNoBuyout, Boolean isRate) {
+		Long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
 		//过滤买断制 平台
 		String conditionSql;
@@ -137,6 +218,13 @@ public class CpsPopularizeController {
 			conditionSql = "(special_type is null or special_type != 'giftCard')";
 		}
 		conditionSql += "  and exists (select id from goods_don_sku sku where sku.goods_id = g.id limit 1)";
+		if (isRate != null && isRate) {
+			UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+					.eq(UserDistribute::getUserId, cpsUserId)
+					.eq(UserDistribute::getDeleted, 1)
+					.last("limit 1"));
+			conditionSql += String.format("  and exists (select 1 from user_plat_distribute_rate upr where upr.distribute_id = %s and upr.goods_id = g.id and upr.rate > 0)", userDistribute.getId());
+		}
 		List<GoodsDon> goodsDons = beanSearcher.searchAll(GoodsDon.class, mapBuilder
 				.put("condition", conditionSql)
 				.field(GoodsDon::getType, 1)
@@ -155,4 +243,162 @@ public class CpsPopularizeController {
 		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		return GatewayResponse.SUCCESS.newBuilder().toResult(cpsPopularizeService.getServiceCodeUrl(cpsUserId));
 	}
+
+
+	/**
+	 * 推广平台海报列表
+	 */
+	@GetMapping("/get/ds/poster/goods")
+	public Result<List<DistributePosterGoodsCpsView>> getPosterGoods(String startTime, String endTime) {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getUserId, cpsUserId)
+				.eq(UserDistribute::getDeleted, 1)
+				.last("limit 1"));
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		StringBuilder time = new StringBuilder();
+		if (startTime != null) {
+			time.append(String.format(" and od.created_time >= '%s'", startTime));
+		}
+		if (endTime != null) {
+			time.append(String.format(" and od.created_time < '%s'", endTime));
+		}
+		List<DistributePosterGoodsCpsView> searchAll = beanSearcher.searchAll(DistributePosterGoodsCpsView.class, builder.build());
+		searchAll.forEach(e -> {
+			if (userDistribute != null) {
+				UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
+						.eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
+						.eq(UserPlatDistributeRate::getGoodsId, e.getGoodsId())
+						.last("limit 1"));
+				if (userPlatDistributeRate != null) {
+					e.setRate(userPlatDistributeRate.getRate());
+				}
+			}
+			if (e.getIsSkuRate()) {
+				GoodsDonSku sku = skuMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSku.class)
+						.eq(GoodsDonSku::getGoodsId, e.getGoodsId())
+						.eq(GoodsDonSku::getStatus, 1)
+						.orderByAsc(GoodsDonSku::getPrice)
+						.last("limit 1"));
+				//先获取价格最低的规格对应的 比例
+				//渠道
+				if (userDistribute != null) {
+					UserPlatSkuDistributeRate minPriceSkuRate = userPlatSkuDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
+							.eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId())
+							.eq(UserPlatSkuDistributeRate::getGoodsId, e.getGoodsId())
+							.eq(UserPlatSkuDistributeRate::getSkuId, sku.getId())
+							.last("limit 1"));
+					if (minPriceSkuRate != null && minPriceSkuRate.getRate() != 0) {
+						e.setRate(minPriceSkuRate.getRate());
+					} else {
+						UserPlatSkuDistributeRate userPlatSkuDistributeRate = userPlatSkuDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
+								.eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId())
+								.eq(UserPlatSkuDistributeRate::getGoodsId, e.getGoodsId())
+								.ne(UserPlatSkuDistributeRate::getRate, 0)
+								//上架
+								.apply("exists (select 1 from goods_don_sku sku where sku.id = sku_id and sku.status is true limit 1)")
+								.orderByAsc(UserPlatSkuDistributeRate::getRate)
+								.last("limit 1"));
+						if (userPlatSkuDistributeRate != null) {
+							e.setRate(userPlatSkuDistributeRate.getRate());
+							sku = skuMapper.selectById(userPlatSkuDistributeRate.getSkuId());
+							e.setPrice(sku.getPrice());
+						}
+					}
+				} else {
+					//普通
+					DistributeGeneralSkuRate minPriceRate = distributeGeneralSkuRateMapper.selectOne(Wrappers.lambdaQuery(DistributeGeneralSkuRate.class)
+							.eq(DistributeGeneralSkuRate::getGoodsId, e.getGoodsId())
+							.eq(DistributeGeneralSkuRate::getSkuId, sku.getId())
+							.last("limit 1"));
+					if (minPriceRate != null && minPriceRate.getRate() > 0) {
+						e.setRate(minPriceRate.getRate());
+					} else {
+						DistributeGeneralSkuRate distributeGeneralSkuRate = distributeGeneralSkuRateMapper.selectOne(Wrappers.lambdaQuery(DistributeGeneralSkuRate.class)
+								.eq(DistributeGeneralSkuRate::getGoodsId, e.getGoodsId())
+								.apply("exists (select 1 from goods_don_sku sku where sku.id = sku_id and sku.status is true limit 1)")
+								.ne(DistributeGeneralSkuRate::getRate, 0)
+								.orderByAsc(DistributeGeneralSkuRate::getRate)
+								.last("limit 1"));
+						if (distributeGeneralSkuRate != null) {
+							e.setRate(distributeGeneralSkuRate.getRate());
+							sku = skuMapper.selectById(distributeGeneralSkuRate.getSkuId());
+							e.setPrice(sku.getPrice());
+						}
+					}
+				}
+			}
+
+			//用户推广海报订单详情
+			MapBuilder posterOrderBuilder = MapUtils.flatBuilder(request.getParameterMap());
+			if (time.length() > 0) {
+				posterOrderBuilder.put("time", time.toString());
+			}
+			UserDistributePosterOrderDetailView distributePosterOrderDetailView = beanSearcher.searchFirst(UserDistributePosterOrderDetailView.class, posterOrderBuilder.put("condition", String.format(String.format(" where user_id = %s and poster_id = %s", cpsUserId, e.getId()))).build());
+			if (distributePosterOrderDetailView != null) {
+				e.setOrdersMoney(distributePosterOrderDetailView.getOrdersMoney());
+				e.setOrders(distributePosterOrderDetailView.getOrders());
+				e.setWMoney(distributePosterOrderDetailView.getWMoney());
+				e.setGotMoney(distributePosterOrderDetailView.getGotMoney());
+				e.setClickNum(distributePopularizeClickRecordMapper.selectCount(Wrappers.lambdaQuery(DistributePopularizeClickRecord.class)
+						.eq(DistributePopularizeClickRecord::getRid, distributePosterOrderDetailView.getId())
+						.ge(startTime != null, DistributePopularizeClickRecord::getCreatedTime, startTime)
+						.lt(endTime != null, DistributePopularizeClickRecord::getCreatedTime, endTime)));
+			}
+
+			UserDistributePosterRecord distributePosterRecord = userDistributePosterRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributePosterRecord.class)
+					.eq(UserDistributePosterRecord::getPosterId, e.getId())
+					.eq(UserDistributePosterRecord::getUserId, cpsUserId)
+					.last("limit 1"));
+			if (distributePosterRecord != null) {
+				e.setRid(distributePosterRecord.getId());
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(searchAll);
+	}
+
+
+	/**
+	 * 用户下载海报记录
+	 */
+	@PostMapping("/poster/record/{posterId}")
+	public Result<Long> posterRecord(@PathVariable Long posterId) {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		DistributePosterGoods distributePosterGoods = distributePosterGoodsMapper.selectById(posterId);
+		if (distributePosterGoods == null) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		UserDistributePosterRecord distributePosterRecord = new UserDistributePosterRecord();
+		distributePosterRecord.setPosterId(posterId);
+		distributePosterRecord.setUserId(cpsUserId);
+		try {
+			userDistributePosterRecordMapper.insert(distributePosterRecord);
+		} catch (DuplicateKeyException e) {
+			distributePosterRecord = userDistributePosterRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributePosterRecord.class)
+					.eq(UserDistributePosterRecord::getUserId, cpsUserId)
+					.eq(UserDistributePosterRecord::getPosterId, posterId)
+					.last("limit 1"));
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(distributePosterRecord.getId());
+	}
+
+	/**
+	 * 更新推荐海报状态
+	 */
+	@PutMapping("/update/recommend/status")
+	public Result<String> updateRecommendStatus() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getUserId, cpsUserId)
+				.eq(UserDistribute::getDeleted, 1)
+				.last("limit 1"));
+		if (userDistribute != null) {
+			Boolean isPoster = userDistribute.getIsPoster();
+			userDistributeMapper.update(null, Wrappers.lambdaUpdate(UserDistribute.class)
+					.set(UserDistribute::getIsPoster, !isPoster)
+					.eq(UserDistribute::getId, userDistribute.getId()));
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }

+ 35 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/UserClickRecordController.java

@@ -0,0 +1,35 @@
+package com.cyksj.web.controller.user;
+
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.request.DistributePopularizeClickReq;
+import com.cyksj.service.click.UserClickRecordService;
+import com.cyksj.web.util.StpUserUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserClickRecordController
+ * 创建者: JavaZou
+ * 创建时间:2024/8/14 18:50
+ */
+@RestController
+@RequestMapping("/applets/click")
+@RequiredArgsConstructor
+public class UserClickRecordController {
+	private final UserClickRecordService userClickRecordService;
+
+	/**
+	 * 渠道推广链接点击记录
+	 */
+	@PostMapping("/distribute/popularize/record")
+	public Result<String> recordDistributePopularize(@RequestBody DistributePopularizeClickReq clickReq) {
+		Long userIdAfterLogin = StpUserUtil.getUserIdAfterLogin();
+		userClickRecordService.recordDistributePopularize(userIdAfterLogin, clickReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 38 - 5
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -10,11 +10,9 @@ import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.UserDistributePosterRecordMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
-import com.cyksj.mapper.manage.distribute.DistributeGeneralSkuRateMapper;
-import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
-import com.cyksj.mapper.manage.distribute.UserPlatDistributeRateMapper;
-import com.cyksj.mapper.manage.distribute.UserPlatSkuDistributeRateMapper;
+import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.model.dto.UserWhoami;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
@@ -36,6 +34,7 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.util.Assert;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -88,6 +87,10 @@ public class UserController {
 
     private final UserDistributeMapper userDistributeMapper;
 
+    private final UserDistributePosterRecordMapper userDistributePosterRecordMapper;
+
+    private final DistributePosterGoodsMapper distributePosterGoodsMapper;
+
     @GetMapping(value = "/wx/whoami")
     public Result<UserWhoami> whoami() {
         long userId = StpUserUtil.getLoginIdAsLong();
@@ -517,7 +520,13 @@ public class UserController {
                     }
                 }
             }
-        });
+            UserDistributePosterRecord distributePosterRecord = userDistributePosterRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributePosterRecord.class)
+                    .eq(UserDistributePosterRecord::getPosterId, e.getId())
+                    .eq(UserDistributePosterRecord::getUserId, userId)
+                    .last("limit 1"));
+            if (distributePosterRecord != null) {
+                e.setRid(distributePosterRecord.getId());
+            }        });
         return GatewayResponse.SUCCESS.newBuilder().toResult(searchAll);
     }
 
@@ -531,4 +540,28 @@ public class UserController {
                 .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(distributePosterGoodsView);
     }
+
+    /**
+     * 用户下载海报记录
+     */
+    @PostMapping("/poster/record/{posterId}")
+    public Result<Long> posterRecord(@PathVariable Long posterId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        DistributePosterGoods distributePosterGoods = distributePosterGoodsMapper.selectById(posterId);
+        if (distributePosterGoods == null) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
+        UserDistributePosterRecord distributePosterRecord = new UserDistributePosterRecord();
+        distributePosterRecord.setPosterId(posterId);
+        distributePosterRecord.setUserId(userId);
+        try {
+            userDistributePosterRecordMapper.insert(distributePosterRecord);
+        } catch (DuplicateKeyException e) {
+            distributePosterRecord = userDistributePosterRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributePosterRecord.class)
+                    .eq(UserDistributePosterRecord::getUserId, userId)
+                    .eq(UserDistributePosterRecord::getPosterId, posterId)
+                    .last("limit 1"));
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(distributePosterRecord.getId());
+    }
 }