Jelajahi Sumber

cps后台优化

zoujiajian 2 tahun lalu
induk
melakukan
150686cda5
23 mengubah file dengan 622 tambahan dan 17 penghapusan
  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. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributePosterRecord.java
  10. 25 0
      netflix-dao/src/main/java/com/cyksj/model/request/DistributePopularizeClickReq.java
  11. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  12. 64 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePosterGoodsCpsView.java
  13. 13 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributePopularizeView.java
  14. 42 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributePosterOrderDetailView.java
  15. 6 0
      netflix-dao/src/main/resources/mapper/UserDistributePopularizeMapper.xml
  16. 13 0
      netflix-service/src/main/java/com/cyksj/service/click/UserClickRecordService.java
  17. 51 0
      netflix-service/src/main/java/com/cyksj/service/click/impl/UserClickRecordServiceImpl.java
  18. 1 1
      netflix-service/src/main/java/com/cyksj/service/cps/CpsPopularizeService.java
  19. 2 2
      netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsPopularizeServiceImpl.java
  20. 30 5
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  21. 22 0
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java
  22. 178 7
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsPopularizeController.java
  23. 29 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserClickRecordController.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;
+}

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

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

@@ -0,0 +1,64 @@
+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 UserDistributePosterOrderDetailView userDistributePosterOrderDetailView;
+}

+ 13 - 1
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,6 +36,15 @@ public class UserDistributePopularizeView {
 	@DbField("dp.goods_id")
 	private Long goodsId;
 
+	@DbIgnore
+	private String title;
+
+	@DbIgnore
+	private String logo;
+
+	@DbIgnore
+	private Integer clickNum = 0;
+
 	@DbIgnore
 	private String popularizeLink;
 
@@ -62,4 +71,7 @@ public class UserDistributePopularizeView {
 	 */
 	@DbIgnore
 	private String couponCode;
+
+	@DbIgnore
+	private DistributePosterGoodsDetailView posterInfo;
 }

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

@@ -0,0 +1,42 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.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;
+
+	@DbIgnore
+	private Integer clickNum;
+
+	@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;
+}

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

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

@@ -0,0 +1,51 @@
+package com.cyksj.service.click.impl;
+
+import com.cyksj.dto.UserSharedDto;
+import com.cyksj.mapper.DistributePopularizeClickRecordMapper;
+import com.cyksj.model.entity.DistributePopularizeClickRecord;
+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;
+
+
+	@Override
+	public void recordDistributePopularize(Long userId, DistributePopularizeClickReq clickReq) {
+		String showId = clickReq.getDsCode();
+		log.info("点击用户分销链接:{} 进入官网", showId);
+		Long rid = clickReq.getRid();
+		if (rid != null) {
+			log.info("点击用户推广海报:{}进入官网", rid);
+		}
+		DistributePopularizeClickRecord clickRecord = new DistributePopularizeClickRecord();
+		//不存在推广海报
+		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

+ 30 - 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,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	/**
+	 * 用户通过海报下单记录
+	 */
+	private void recordPosterUserOrder(Long orderId, Long rid) {
+		OrderDonPosterRelate orderDonPosterRelate = new OrderDonPosterRelate();
+		orderDonPosterRelate.setOrderId(orderId);
+		orderDonPosterRelate.setRecordId(rid);
+		orderDonPosterRelateMapper.insert(orderDonPosterRelate);
+	}
 }

+ 22 - 0
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;
+
 	/**
 	 * 获取登录验证码
 	 */
@@ -205,4 +208,23 @@ public class CpsBackLoginController {
 		userInfoView.setIsEp(selectCount > 0 ? true : false);
 		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);
+	}
 }

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

@@ -1,15 +1,21 @@
 package com.cyksj.web.controller.cps;
 
 import cn.hutool.core.util.StrUtil;
+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 +25,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 +55,50 @@ 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 start, String end) {
 		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		builder.put("userId", String.format("and user_id = %s", cpsUserId));
+		String time = null;
+		if (start != null) {
+			time += String.format(" and od.created_time >= '%s'", start);
+		}
+		if (end != null) {
+			time += String.format(" and od.created_time < '%s'", end);
+		}
+		if (StrUtil.isNotBlank(time)) {
+			builder.put("time", time);
+		}
 		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.setClickNum(distributePopularizeClickRecordMapper.selectCount(Wrappers.lambdaQuery(DistributePopularizeClickRecord.class).eq(DistributePopularizeClickRecord::getPopularizeId, data.getId())));
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
@@ -67,10 +107,10 @@ public class CpsPopularizeController {
 	 * 默认链接详情
 	 */
 	@GetMapping("/get/default")
-	public Result<UserDistributePopularizeView> getDefaultDetail() {
+	public Result<UserDistributePopularizeView> getDefaultDetail(String start, String end) {
 		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
 		User user = userService.getById(cpsUserId);
-		UserDistributePopularizeView view = Optional.ofNullable(cpsPopularizeService.getDefaultPopularizeDetail(cpsUserId)).orElseGet(() -> {
+		UserDistributePopularizeView view = Optional.ofNullable(cpsPopularizeService.getDefaultPopularizeDetail(cpsUserId, start, end)).orElseGet(() -> {
 			UserDistributePopularizeView newPopularizeView = new UserDistributePopularizeView();
 			newPopularizeView.setOrders(0);
 			newPopularizeView.setOrdersMoney(BigDecimal.ZERO);
@@ -84,6 +124,7 @@ 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())));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(view);
 	}
 
@@ -136,7 +177,7 @@ public class CpsPopularizeController {
 		} else {
 			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)";
+		conditionSql += "  and exists (select id from goods_don_sku sku where sku.goods_id = g.id limit 1) and exist (select 1 from )";
 		List<GoodsDon> goodsDons = beanSearcher.searchAll(GoodsDon.class, mapBuilder
 				.put("condition", conditionSql)
 				.field(GoodsDon::getType, 1)
@@ -155,4 +196,134 @@ 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 start, String end) {
+		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 (start != null) {
+			time.append(String.format(" and od.created_time >= '%s'", start));
+		}
+		if (end != null) {
+			time.append(String.format(" and od.created_time < '%s'", end));
+		}
+		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) {
+				distributePosterOrderDetailView.setClickNum(distributePopularizeClickRecordMapper.selectCount(Wrappers.lambdaQuery(DistributePopularizeClickRecord.class)
+						.eq(DistributePopularizeClickRecord::getRid, distributePosterOrderDetailView.getId())));
+			}
+			e.setUserDistributePosterOrderDetailView(distributePosterOrderDetailView);
+
+			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<String> 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) {
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 }

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

@@ -0,0 +1,29 @@
+package com.cyksj.web.controller.user;
+
+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.*;
+
+/**
+ * 项目名: 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 void recordDistributePopularize(@RequestBody DistributePopularizeClickReq clickReq) {
+		Long userIdAfterLogin = StpUserUtil.getUserIdAfterLogin();
+		userClickRecordService.recordDistributePopularize(userIdAfterLogin, clickReq);
+	}
+}