소스 검색

Merge branch 'sub_func'

# Conflicts:
#	netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
#	netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
#	netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
zoujiajian 2 년 전
부모
커밋
4e661b5537
46개의 변경된 파일1015개의 추가작업 그리고 128개의 파일을 삭제
  1. 9 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  3. 6 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cps/CpsUserAdRecordMapper.java
  5. 6 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/DistributeMoneyApplyMapper.java
  6. 14 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/sub/UserDistributeSubMapper.java
  7. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/sub/UserDistributeSubRewardsMapper.java
  8. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/sub/UserDistributeSubWaitingMapper.java
  9. 5 0
      netflix-dao/src/main/java/com/cyksj/model/dto/AuthRedirect.java
  10. 2 0
      netflix-dao/src/main/java/com/cyksj/model/dto/CpsAuthDto.java
  11. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CpsUserAdRecord.java
  12. 24 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributeMoneyApply.java
  13. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  14. 64 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSub.java
  15. 55 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSubRewards.java
  16. 63 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSubWaiting.java
  17. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/ApplyMoneyReq.java
  18. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java
  19. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/CpsApplyMoneyView.java
  20. 30 0
      netflix-dao/src/main/java/com/cyksj/model/views/CpsDistributeSubView.java
  21. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeMoneyApplyView.java
  22. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeView.java
  23. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRateDetailView.java
  24. 42 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeSubDetailView.java
  25. 21 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserInfoView.java
  26. 26 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserSubApplyMoneyDetailView.java
  27. 11 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  28. 14 0
      netflix-dao/src/main/resources/mapper/UserDistributeSubMapper.xml
  29. 5 0
      netflix-service/src/main/java/com/cyksj/config/wxlogin/BaseWxOpenPlatConfig.java
  30. 53 9
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  31. 46 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  32. 72 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  33. 2 0
      netflix-service/src/main/java/com/cyksj/service/pay/TransferFuncService.java
  34. 148 107
      netflix-service/src/main/java/com/cyksj/service/pay/impl/TransferFuncServiceImpl.java
  35. 5 0
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  36. 16 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  37. 53 1
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsApplyMoneyController.java
  38. 61 3
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java
  39. 7 0
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java
  40. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
  41. 29 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  42. 13 4
      netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java
  43. 21 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java
  44. 0 0
      netflix-web/src/main/resources/application-dev.yml
  45. 0 0
      netflix-web/src/main/resources/application-prd.yml
  46. 2 1
      netflix-web/src/main/resources/application-pre.yml

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

@@ -270,4 +270,13 @@ public interface Constant {
 	BigDecimal TWO_THOUSAND = BigDecimal.valueOf(200000);
 
 	Long CALUDE_GOODS_ID = 73l;
+
+	String APPLY_MONEY_DS = "分销提现";
+
+	String APPLY_MONEY_SUB = "邀请奖励金提现";
+
+	/**
+	 * cps后台用户弹窗key
+	 */
+	String CPS_AD_KEY = "cps_ad_key";
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -77,4 +77,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	String selectMaxRefundGoodsName(@Param("operator") String operator, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
 	OrderDonCustomerServiceRelate selectOrderRelate(Long orderId);
+
+	BigDecimal selectSubChannelOrderMoney(@Param("sharedId") Long sharedId, @Param("invitedTime") Date invitedTime, @Param("limitTime") Date limitTime);
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -67,4 +67,10 @@ public interface UserMapper extends BaseMapper<User> {
 	Integer selectUnBindUserNum();
 
     Integer getLargeNewConsumer(@Param("beginOfDay") DateTime beginOfDay, @Param("largeLimit") String largeLimit);
+
+    @Update("update user set sub_apply_money = sub_apply_money - #{needApplyMoney} where id = #{id} and sub_apply_money >= #{needApplyMoney} and sub_apply_money > 0")
+    Integer suUserSubApplyMoney(@Param("id") Long id, @Param("needApplyMoney") BigDecimal needApplyMoney);
+
+    @Update("update user set sub_apply_money = sub_apply_money + #{addApplyMoney} where id = #{id} and sub_apply_money = #{subApplyMoney}")
+    Integer addDistributeSubMoney(@Param("id") Long id, @Param("subApplyMoney") BigDecimal subApplyMoney, @Param("addApplyMoney") BigDecimal addApplyMoney);
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/cps/CpsUserAdRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.cps;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CpsUserAdRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CpsUserAdRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/4/2 16:04
+ */
+public interface CpsUserAdRecordMapper extends BaseMapper<CpsUserAdRecord> {
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/DistributeMoneyApplyMapper.java

@@ -2,6 +2,9 @@ package com.cyksj.mapper.manage.distribute;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.DistributeMoneyApply;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
 
 /*
  *项目名: netflix
@@ -10,4 +13,7 @@ import com.cyksj.model.entity.DistributeMoneyApply;
  *创建时间:2022/11/14 14:00
  */
 public interface DistributeMoneyApplyMapper extends BaseMapper<DistributeMoneyApply> {
+
+	@Select("select sum(money) from distribute_money_apply where user_id = #{cpsUserId} and verify_status = 'success' and m_type = 'sub'")
+	BigDecimal getSubGotAppyMoney(long cpsUserId);
 }

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/sub/UserDistributeSubMapper.java

@@ -0,0 +1,14 @@
+package com.cyksj.mapper.manage.distribute.sub;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserDistributeSub;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeSubMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/3/28 17:45
+ */
+public interface UserDistributeSubMapper extends BaseMapper<UserDistributeSub> {
+	UserDistributeSub getSubRelate(Long userId);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/sub/UserDistributeSubRewardsMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.sub;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserDistributeSubRewards;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeSubRewardsMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/3/28 18:06
+ */
+public interface UserDistributeSubRewardsMapper extends BaseMapper<UserDistributeSubRewards> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/sub/UserDistributeSubWaitingMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.sub;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserDistributeSubWaiting;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeSubWaitingMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/3/28 18:06
+ */
+public interface UserDistributeSubWaitingMapper extends BaseMapper<UserDistributeSubWaiting> {
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/AuthRedirect.java

@@ -72,4 +72,9 @@ public class AuthRedirect {
      * 店铺自定义id
      */
     private String cd;
+
+    /**
+     * 跳转url
+     */
+    private String url;
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/CpsAuthDto.java

@@ -21,4 +21,6 @@ public class CpsAuthDto {
 	 * 授权标识
 	 */
 	private String authState;
+
+	private String redirectUrl;
 }

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

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CpsUserAdRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/4/2 16:03
+ */
+@Getter
+@Setter
+public class CpsUserAdRecord extends BaseEntity {
+	private Long userId;
+
+	private String sysKey;
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/DistributeMoneyApply.java

@@ -27,6 +27,11 @@ public class DistributeMoneyApply extends BaseEntity {
 
 	private Status verifyStatus;
 
+	/**
+	 * 功能类型
+	 */
+	private MType mType;
+
 	private Type type;
 
 	private String account;
@@ -88,4 +93,23 @@ public class DistributeMoneyApply extends BaseEntity {
 			return Arrays.stream(Status.values()).filter(st -> st.name().equals(status)).findFirst().orElse(null);
 		}
 	}
+
+	@Getter
+	public enum MType {
+		ds("用户分销"),
+		sub("邀请奖励"),
+		;
+		String desc;
+
+		MType(String desc) {
+			this.desc = desc;
+		}
+
+		public MType getType(String value) {
+			if (StrUtil.isEmpty(value)) {
+				return null;
+			}
+			return Arrays.stream(MType.values()).filter(type -> type.name().equals(value)).findFirst().get();
+		}
+	}
 }

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

@@ -67,6 +67,11 @@ public class User extends BaseEntity implements Serializable{
      */
     private BigDecimal yhsMoney;
 
+    /**
+     * 用户下级渠道提成金额
+     */
+    private BigDecimal subApplyMoney;
+
     /**
      * 推广id
      */

+ 64 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSub.java

@@ -0,0 +1,64 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeSub
+ * 创建者: JavaZou
+ * 创建时间:2024/3/28 17:36
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute_sub us inner join user u on u.id = us.user_id")
+public class UserDistributeSub{
+	@TableId(value = "id",type = IdType.AUTO)
+	@DbField("us.id")
+	private Long id;
+
+	@DbField("us.distribute_id")
+	private Long distributeId;
+
+	@DbField("us.user_id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	@TableField(exist = false)
+	private String nickname;
+
+	/**
+	 *下级渠道用户id
+	 */
+	@DbField("us.sub_distribute_id")
+	private Long subDistributeId;
+
+
+	/**
+	 *下级渠道用户id
+	 */
+	@DbField("us.sub_user_id")
+	private Long subUserId;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@DbField("us.created_time")
+	private Date createdTime;
+
+	/**
+	 * 修改时间
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	@DbField("us.update_time")
+	private Date updateTime;
+}

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSubRewards.java

@@ -0,0 +1,55 @@
+package com.cyksj.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeSubRewards
+ * 创建者: JavaZou
+ * 创建时间:2024/3/28 17:46
+ */
+@Getter
+@Setter
+public class UserDistributeSubRewards {
+	private Integer level;
+
+	/**
+	 * 目标金额
+	 */
+	private BigDecimal targetAmount;
+
+	/**
+	 * 月时间限制
+	 */
+	private Integer months;
+
+	/**
+	 * 奖励金额
+	 */
+	private BigDecimal money;
+
+	/**
+	 * 流星级奖励:新渠道前三月累计销售额达到1,000元,您获得30元奖励。
+	 * 月球级奖励:当前三月销售额提升至5,000元,您将获得额外145元奖励,使总奖励达到175元。
+	 * 行星级奖励:当前三月销售额增至10,000元时,您再获得额外225元,总奖励累计为400元。
+	 * 恒星级奖励:当前三月销售额达到20,000元,您将获得额外500元,使总奖金达到900元。
+	 * 黑洞级奖励:当前三月销售额达到50,000元,您获得额外1,600元,总奖金累积为2,500元。
+	 * 银河级奖励:前6个月销售额达到100,000元,您将额外获得3,500元,总计奖金为6,000元。
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum RewardLevel {
+		meteor("流星级"),
+		moon("月球级"),
+		planet("行星级"),
+		stars("恒星级"),
+		blackHole("黑洞级"),
+		galaxy("银河级");
+		;
+		private String msg;
+	}
+}

+ 63 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSubWaiting.java

@@ -0,0 +1,63 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeSubWaiting
+ * 创建者: JavaZou
+ * 创建时间:2024/3/28 18:02
+ */
+@Getter
+@Setter
+public class UserDistributeSubWaiting extends BaseEntity {
+	/**
+	 * 待发人
+	 */
+	private Long userId;
+
+	/**
+	 * 分销订单产生人
+	 */
+	private Long subUserId;
+
+	/**
+	 * 奖励金额
+	 */
+	private BigDecimal money;
+
+	/**
+	 * 发送状态
+	 */
+	private Status sendStatus;
+
+	private Integer level;
+
+	/**
+	 * 锁标识
+	 */
+	private Integer version;
+
+	/**
+	 * 发送时间
+	 */
+	private Date sendTime;
+
+	@Getter
+	public enum Status {
+		close("目标额不达标"),
+		success("成功"),
+		waiting("待发"),
+		;
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+
+}

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

@@ -17,6 +17,11 @@ public class ApplyMoneyReq {
 
 	private DistributeMoneyApply.Type type;
 
+	/**
+	 * 功能类型
+	 */
+	private DistributeMoneyApply.MType mType;
+
 	private String realName;
 
 	/**

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

@@ -58,4 +58,9 @@ public class UserDistributeReq {
 	 * 设备分销
 	 */
 	private UserDistributeEquipment epRate;
+
+	/**
+	 * 上级渠道
+	 */
+	private UserDistributeSub userDistributeSub;
 }

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

@@ -43,6 +43,9 @@ public class CpsApplyMoneyView {
 	@DbField("dma.type")
 	private DistributeMoneyApply.Type type;
 
+	@DbField("dma.m_type")
+	private DistributeMoneyApply.MType mType;
+
 	@DbField("dma.account")
 	private String account;
 

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

@@ -0,0 +1,30 @@
+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;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CpsDistributeSubView
+ * 创建者: JavaZou
+ * 创建时间:2024/3/29 10:32
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute_sub",
+		where = ":uid:")
+public class CpsDistributeSubView {
+	@DbField("sub_user_id")
+	private Long subUserId;
+
+	@DbIgnore
+	private UserDistributeSubDetailView detailView;
+
+	@DbField("created_time")
+	private Date invitedTime;
+}

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

@@ -43,6 +43,9 @@ public class DistributeMoneyApplyView {
 	@DbField("dma.type")
 	private DistributeMoneyApply.Type type;
 
+	@DbField("dma.m_type")
+	private DistributeMoneyApply.MType mType;
+
 	@DbField("dma.account")
 	private String account;
 

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

@@ -30,6 +30,9 @@ public class DistributePopularizeView {
 	 */
 	private BigDecimal gotPoints;
 
+	/**
+	 * 可提现金额
+	 */
 	private BigDecimal gotMoney;
 
 	/**

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

@@ -1,6 +1,7 @@
 package com.cyksj.model.views;
 
 import com.cyksj.model.entity.UserDistributeEquipment;
+import com.cyksj.model.entity.UserDistributeSub;
 import com.cyksj.model.entity.UserDistributeTargetAlert;
 import lombok.Getter;
 import lombok.Setter;
@@ -35,4 +36,9 @@ public class UserDistributeRateDetailView {
 	 * 设备分销
 	 */
 	private UserDistributeEquipment epRate;
+
+	/**
+	 * 上级渠道
+	 */
+	private UserDistributeSub userDistributeSub;
 }

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

@@ -0,0 +1,42 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.UserDistributeSubRewards;
+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
+ * 文件名: UserDistributeSubDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/3/29 11:12
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute_sub_waiting uw",
+		where = "uw.send_status in ('waiting','success') and sub_user_id = :sid:")
+public class UserDistributeSubDetailView {
+
+	@DbField("sum(money)")
+	private BigDecimal totalMoney = BigDecimal.ZERO;
+
+	@DbField("select level from user_distribute_sub_rewards ur where sub_user_id = :sid: and ur.level > max(uw.level) limit 1")
+	private Integer nextLevel;
+
+	@DbIgnore
+	private String nextLevelDesc;
+
+	public String getNextLevelDesc() {
+		if (nextLevel != null) {
+			return UserDistributeSubRewards.RewardLevel.values()[nextLevel].getMsg();
+		}
+		if (totalMoney.compareTo(BigDecimal.ZERO) == 0) {
+			return UserDistributeSubRewards.RewardLevel.meteor.getMsg();
+		}
+		return null;
+	}
+}

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

@@ -0,0 +1,21 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserInfoView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/8 11:40
+ */
+@Getter
+@Setter
+public class UserInfoView {
+	/**
+	 * 头像
+	 */
+	private String img;
+
+	private String nickname;
+}

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

@@ -0,0 +1,26 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserSubApplyMoneyDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/3/29 11:40
+ */
+@Getter
+@Setter
+public class UserSubApplyMoneyDetailView {
+	/**
+	 * 已提现金额
+	 */
+	private BigDecimal gotMoney;
+
+	/**
+	 * 可提现金额
+	 */
+	private BigDecimal canApplyMoney;
+}

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

@@ -444,4 +444,15 @@
         from order_don_customer_service_relate odr
         where order_id = #{orderId} limit 1
     </select>
+
+    <select id="selectSubChannelOrderMoney" resultType="java.math.BigDecimal">
+        select sum(o.money) - sum(ifnull(o.refund_money, 0))
+        from distribute_waiting_send_points dp
+                 inner join order_don o on o.id = dp.order_id
+        where dp.shared_id = #{sharedId}
+          and o.goods_id != 15
+            and o.status not in ('close', 'noPayment')
+        and o.created_time > #{invitedTime}
+          and o.created_time &lt; #{limitTime}
+    </select>
 </mapper>

+ 14 - 0
netflix-dao/src/main/resources/mapper/UserDistributeSubMapper.xml

@@ -0,0 +1,14 @@
+<?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.manage.distribute.sub.UserDistributeSubMapper">
+
+
+    <select id="getSubRelate" resultType="com.cyksj.model.entity.UserDistributeSub">
+        select us.*
+        from (select shared_id
+              from user_distribute_shared
+              where user_id = #{userId} limit 1) s
+                 inner join user_distribute_sub us
+                            on s.shared_id = us.sub_user_id
+    </select>
+</mapper>

+ 5 - 0
netflix-service/src/main/java/com/cyksj/config/wxlogin/BaseWxOpenPlatConfig.java

@@ -34,6 +34,11 @@ public class BaseWxOpenPlatConfig {
 
 	private String yhShopLoginUrl;
 
+	/**
+	 * 用户官网跳转cps后台地址
+	 */
+	private String cpsWebRedirectUri;
+
 	/**
 	 * 绑定账号回调接口地址
 	 */

+ 53 - 9
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -15,6 +15,7 @@ import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.shop.YhShopMapper;
 import com.cyksj.mapper.shop.YhShopUserPlatDistributeRateMapper;
@@ -78,6 +79,8 @@ public class DistributeServiceImpl implements DistributeService {
 
 	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
 
+	private final UserDistributeSubMapper userDistributeSubMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertDistribute(UserDistributeReq userDistributeReq) {
@@ -147,15 +150,8 @@ public class DistributeServiceImpl implements DistributeService {
 				}
 			}
 		}
-		List<CouponDistributePopularize> couponRelates = userDistributeReq.getCouponRelates();
-		handlerDistributeCouponRelate(userDistribute.getId(), couponRelates);
-
-		//渠道目标额配置
-		List<UserDistributeTargetAlert> targets = userDistributeReq.getTargets();
-		handlerDistributeTargetAlert(userDistribute.getId(), targets);
-
-		//设备分销
-		handlerSpecialEquipmentRate(userDistributeReq.getEpRate(), userDistribute);
+		//渠道附加功能
+		handlerDistributeOtherFunc(userDistribute, userDistributeReq);
 	}
 
 	@Override
@@ -283,6 +279,13 @@ public class DistributeServiceImpl implements DistributeService {
 				}
 			}
 		}
+		handlerDistributeOtherFunc(userDistribute, userDistributeReq);
+	}
+
+	/**
+	 * 渠道附加功能
+	 */
+	public void handlerDistributeOtherFunc(UserDistribute userDistribute, UserDistributeReq userDistributeReq) {
 		//处理优惠券关联
 		handlerDistributeCouponRelate(userDistribute.getId(), userDistributeReq.getCouponRelates());
 
@@ -291,6 +294,9 @@ public class DistributeServiceImpl implements DistributeService {
 
 		//设备分销
 		handlerSpecialEquipmentRate(userDistributeReq.getEpRate(), userDistribute);
+
+		//下级渠道绑定
+		handlerDistributeSub(userDistributeReq.getUserDistributeSub(), userDistribute);
 	}
 
 	@Override
@@ -535,4 +541,42 @@ public class DistributeServiceImpl implements DistributeService {
 					.eq(UserDistributeEquipment::getDistributeId, distributeId));
 		}
 	}
+
+	/**
+	 * 下级渠道
+	 */
+	private void handlerDistributeSub(UserDistributeSub userDistributeSub, UserDistribute userDistribute) {
+		if (userDistributeSub != null) {
+			userDistributeSub.setSubUserId(userDistribute.getUserId());
+			if (userDistributeSub.getUserId() == null) {
+				throw BusinessRuntimeException.getInstance("请选择对应的上级渠道..");
+			}
+			if (userDistributeSub.getUserId().equals(userDistribute.getUserId())) {
+				throw BusinessRuntimeException.getInstance("不能选择自己作为上级渠道");
+			}
+			UserDistribute superUser = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+					.eq(UserDistribute::getUserId, userDistributeSub.getUserId())
+					.eq(UserDistribute::getDeleted, 1)
+					.last("limit 1"));
+			if (superUser == null) {
+				throw BusinessRuntimeException.getInstance("上级渠道不存在");
+			}
+			userDistributeSub.setDistributeId(superUser.getId());
+			userDistributeSub.setSubDistributeId(userDistribute.getId());
+			if (userDistributeSub.getId() == null) {
+				try {
+					userDistributeSubMapper.insert(userDistributeSub);
+				} catch (DuplicateKeyException e) {
+				}
+			} else {
+				userDistributeSubMapper.updateById(userDistributeSub);
+			}
+		}else {
+			if (userDistributeSubMapper.selectCount(Wrappers.lambdaQuery(UserDistributeSub.class)
+					.eq(UserDistributeSub::getSubUserId, userDistribute.getUserId()))>0) {
+				userDistributeSubMapper.delete(Wrappers.lambdaQuery(UserDistributeSub.class)
+						.eq(UserDistributeSub::getSubUserId, userDistribute.getUserId()));
+			}
+		}
+	}
 }

+ 46 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -32,6 +32,9 @@ import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserDistributeTransportBenefitsMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubRewardsMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubWaitingMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderMapper;
 import com.cyksj.mapper.shop.YhShopUserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper;
@@ -73,6 +76,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -167,6 +171,12 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final ChatgptUserMapper chatgptUserMapper;
 
+    private final UserDistributeSubMapper userDistributeSubMapper;
+
+    private final UserDistributeSubWaitingMapper subWaitingMapper;
+
+    private final UserDistributeSubRewardsMapper userDistributeSubRewardsMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -841,9 +851,45 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 chatgptUserMapper.delete(Wrappers.lambdaQuery(ChatgptUser.class)
                         .eq(ChatgptUser::getRelationId, orderDon.getRelationId()));
             }
+            //是否是分销订单
+            //处理下级渠道分销提成
+            handleSubRewards(orderDon);
         });
     }
 
+    //处理下级渠道分销提成
+    public void handleSubRewards(OrderDon orderDon) {
+        //是否是分销订单
+        //处理下级渠道分销提成
+        if (orderDon.getIsDistribute()) {
+            UserDistributeSub subRelate = userDistributeSubMapper.getSubRelate(orderDon.getUserId());
+            if (subRelate != null) {
+                List<UserDistributeSubWaiting> subWaitings = subWaitingMapper.selectList(Wrappers.lambdaQuery(UserDistributeSubWaiting.class)
+                        .eq(UserDistributeSubWaiting::getSubUserId, subRelate.getSubUserId())
+                        .eq(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.waiting));
+                if (CollUtil.isNotEmpty(subWaitings)) {
+                    List<UserDistributeSubRewards> userDistributeSubRewards = userDistributeSubRewardsMapper.selectList(null);
+                    Map<Integer, List<UserDistributeSubRewards>> rewardLevelMap = userDistributeSubRewards.stream().collect(Collectors.groupingBy(UserDistributeSubRewards::getLevel));
+                    subWaitings.forEach(wait -> {
+                        List<UserDistributeSubRewards> thisLevelList = rewardLevelMap.get(wait.getLevel());
+                        if (thisLevelList == null) {
+                            return;
+                        }
+                        UserDistributeSubRewards thisLevel = thisLevelList.get(0);
+                        Integer months = thisLevel.getMonths();
+                        BigDecimal subOrderMoney = orderDonMapper.selectSubChannelOrderMoney(wait.getSubUserId(), subRelate.getCreatedTime(), DateUtil.offsetMonth(subRelate.getCreatedTime(), months));
+                        if (subOrderMoney.compareTo(thisLevel.getTargetAmount()) < 0) {
+                            subWaitingMapper.update(null, Wrappers.lambdaUpdate(UserDistributeSubWaiting.class)
+                                    .set(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.close)
+                                    .eq(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.waiting)
+                                    .eq(UserDistributeSubWaiting::getId, wait.getId()));
+                        }
+                    });
+                }
+            }
+        }
+    }
+
     /**
      * 退款 分销提成积分扣除
      */

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

@@ -48,6 +48,9 @@ import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubRewardsMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubWaitingMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
@@ -105,6 +108,7 @@ import java.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -269,6 +273,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserCertRecordMapper userCertRecordMapper;
 
+	private final UserDistributeSubMapper userDistributeSubMapper;
+
+	private final UserDistributeSubRewardsMapper userDistributeSubRewardsMapper;
+
+	private final UserDistributeSubWaitingMapper userDistributeSubWaitingMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -2376,6 +2386,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						}
 					}
 				}
+				//下级渠道目标额达标 提成金额发放
+				sendSubDistributeRewards(orderDon);
 			} catch (Exception e) {
 				log.error("回调修改订单信息错误,orderId:{},error:{}", orderDon.getId(), StringUtil.getErrorText(e));
 			}
@@ -2628,7 +2640,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, userId).last("limit 1"));
 			if (userDistributeShared != null) {
 				orderDon.setIsDistribute(true);
-				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()));
+				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()).eq(UserDistribute::getDeleted, 1));
 				if (userDistribute != null) {
 					orderDon.setCpsPopularizeId(userDistributeShared.getDsPopularizeId());
 					//是否特殊渠道设备分销用户
@@ -2908,4 +2920,63 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		return takeMoney;
 	}
+
+	/**
+	 * 下级渠道奖励
+	 */
+	public void sendSubDistributeRewards(OrderDon orderDon) {
+		if (orderDon.getIsDistribute()) {
+			UserDistributeSub userDistributeSub = userDistributeSubMapper.getSubRelate(orderDon.getUserId());
+			if (userDistributeSub != null) {
+				//分销用户id
+				Long userId = userDistributeSub.getUserId();
+				//下级渠道用户id
+				Long subUserId = userDistributeSub.getSubUserId();
+
+				List<Integer> existLevels = userDistributeSubWaitingMapper.selectList(Wrappers.lambdaQuery(UserDistributeSubWaiting.class)
+						.eq(UserDistributeSubWaiting::getUserId, userId)
+						.eq(UserDistributeSubWaiting::getSubUserId, subUserId)
+						.in(UserDistributeSubWaiting::getSendStatus, List.of(UserDistributeSubWaiting.Status.waiting, UserDistributeSubWaiting.Status.success))
+						.select(UserDistributeSubWaiting::getLevel).last("limit 1")).stream().map(UserDistributeSubWaiting::getLevel).collect(Collectors.toList());
+				List<UserDistributeSubRewards> userDistributeSubRewards = userDistributeSubRewardsMapper.selectList(Wrappers.lambdaQuery(UserDistributeSubRewards.class)
+						.notIn(CollUtil.isNotEmpty(existLevels), UserDistributeSubRewards::getLevel, existLevels));
+					for (UserDistributeSubRewards userDistributeSubReward : userDistributeSubRewards) {
+						log.info("当前级别:{}对应的目标金额是{}", userDistributeSubReward.getLevel(), userDistributeSubReward.getTargetAmount().divide(BigDecimal.valueOf(100)));
+						Integer rewardLevel = userDistributeSubReward.getLevel();
+						Integer months = userDistributeSubReward.getMonths();
+						BigDecimal targetAmount = userDistributeSubReward.getTargetAmount();
+						//是否达到目标额
+						BigDecimal subOrderMoney = orderDonMapper.selectSubChannelOrderMoney(subUserId, userDistributeSub.getCreatedTime(), DateUtil.offsetMonth(userDistributeSub.getCreatedTime(), months));
+						if (subOrderMoney != null && subOrderMoney.compareTo(targetAmount) >= 0) {
+							try {
+								UserDistributeSubWaiting waiting = Optional.ofNullable(userDistributeSubWaitingMapper.selectOne(Wrappers.lambdaQuery(UserDistributeSubWaiting.class)
+										.eq(UserDistributeSubWaiting::getUserId, userId)
+										.eq(UserDistributeSubWaiting::getSubUserId, subUserId)
+										.eq(UserDistributeSubWaiting::getLevel, rewardLevel)
+										.last("limit 1"))).orElse(new UserDistributeSubWaiting());
+								if (waiting.getId() != null) {
+									if (waiting.getSendStatus() == UserDistributeSubWaiting.Status.close) {
+										userDistributeSubWaitingMapper.update(null, Wrappers.lambdaUpdate(UserDistributeSubWaiting.class)
+												.set(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.waiting)
+												.eq(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.close)
+												.eq(UserDistributeSubWaiting::getId, waiting.getId()));
+									}
+								} else {
+									waiting.setMoney(userDistributeSubReward.getMoney());
+									waiting.setUserId(userId);
+									waiting.setSubUserId(subUserId);
+									waiting.setSendStatus(UserDistributeSubWaiting.Status.waiting);
+									waiting.setSendTime(DateUtil.offsetDay(DateTime.now(), 3));
+									waiting.setLevel(rewardLevel);
+									userDistributeSubWaitingMapper.insert(waiting);
+								}
+								log.info("分销用户:{}下级渠道:{}达到:{}销售额,发送奖励成功", userId, subUserId, UserDistributeSubRewards.RewardLevel.values()[rewardLevel].getMsg());
+							} catch (DuplicateKeyException e) {
+							}
+						}
+					}
+			}
+
+		}
+	}
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/pay/TransferFuncService.java

@@ -29,4 +29,6 @@ public interface TransferFuncService {
 	 * 支付宝红包转账
 	 */
 	AlipayResponse transferAccounts(TransferAccountsReq transferAccountsReq) throws Exception;
+
+	Result<String> subApplyMoney(ApplyMoneyReq applyMoneyReq) throws Exception;
 }

+ 148 - 107
netflix-service/src/main/java/com/cyksj/service/pay/impl/TransferFuncServiceImpl.java

@@ -10,6 +10,7 @@ import com.alipay.api.AlipayResponse;
 import com.alipay.api.domain.AlipayFundTransUniTransferModel;
 import com.alipay.api.domain.Participant;
 import com.alipay.api.request.AlipayFundTransUniTransferRequest;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.Constant;
@@ -75,112 +76,8 @@ public class TransferFuncServiceImpl implements TransferFuncService {
 
 	@Override
 	public Result distributeApply(ApplyMoneyReq applyMoneyReq) throws Exception {
-		Long userId = applyMoneyReq.getUserId();
-		User user = userMapper.selectById(userId);
-		if (user == null) {
-			throw BusinessRuntimeException.getInstance("请先授权登录");
-		}
-		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
-		Boolean isTakeAll = applyMoneyReq.getIsTakeAll();
-		DistributeMoneyApply.Type type = applyMoneyReq.getType();
-		if (type == null) type = DistributeMoneyApply.Type.zfb;
-		if (type == DistributeMoneyApply.Type.zfb) {
-			if (ObjectUtil.hasEmpty(applyMoneyReq.getAccount(), applyMoneyReq.getRealName())) {
-				throw BusinessRuntimeException.getInstance("必填项不能为空");
-			}
-			if (applyMoneyReq.getAccount().length() > 255 || applyMoneyReq.getRealName().length() > 32) {
-				throw BusinessRuntimeException.getInstance("请输入正确的账户信息");
-			}
-		}
-		if (type == DistributeMoneyApply.Type.usdt) {
-			if (StrUtil.isEmpty(applyMoneyReq.getWalletAddr())) {
-				throw BusinessRuntimeException.getInstance("USDT提现钱包地址不能为空");
-			}
-			if (applyMoneyReq.getWalletAddr().length() > 1000) {
-				throw BusinessRuntimeException.getInstance("请输入正确的钱包地址");
-			}
-			if (StrUtil.isNotBlank(applyMoneyReq.getRemark()) && applyMoneyReq.getRemark().length() > 512) {
-				throw BusinessRuntimeException.getInstance("备注过多");
-			}
-			isTakeAll = true;
-
-		}
-		DistributeMoneyApply distributeMoneyApply = null;
-		if (type == DistributeMoneyApply.Type.pwdRed) {
-			distributeMoneyApply = userDistributeMapper.selectRelationBusiness(userId);
-			isTakeAll = true;
-		}
-		BigDecimal userPoints = user.getPoints();
-		DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1"));
-		BigDecimal minPoints = BigDecimal.valueOf(distributePointsExchangeMoney.getMinPoints());
-		BigDecimal ratePoints = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints());
-		BigDecimal minMoney = distributePointsExchangeMoney.getMoney();
-		if (userPoints.compareTo(minPoints) < 0) {
-			throw BusinessRuntimeException.getInstance("您当前积分未达到积分门槛,无法提现");
-		}
-//		//今日是否已提现
-//		DistributeMoneyApply apply = distributeMoneyApplyMapper.selectOne(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getUserId, userId).between(DistributeMoneyApply::getCreatedTime, DateUtil.beginOfDay(DateTime.now()), DateUtil.endOfDay(DateTime.now())).last("limit 1"));
-//		if (apply != null) {
-//			throw BusinessRuntimeException.getInstance("今日已提现,请明日再进行操作");
-//		}
-		BigDecimal num = userPoints.divide(ratePoints, 0, RoundingMode.DOWN);
-		BigDecimal needApplyMoney = num.multiply(minMoney);
-		BigDecimal needSubPoints = num.multiply(ratePoints);
-		BigDecimal fourHundred = BigDecimal.valueOf(4 * 100 * 100);
-		if (isTakeAll == null || !isTakeAll) {
-			if (needApplyMoney.compareTo(fourHundred) > 0) {
-				needApplyMoney = fourHundred;
-				needSubPoints = fourHundred.divide(minMoney).multiply(ratePoints);
-			}
-		}
-		Integer update = userMapper.subPoints(user.getId(), needSubPoints);
-		if (update == 1) {
-			distributeMoneyApply = Optional.ofNullable(distributeMoneyApply).orElse(new DistributeMoneyApply());
-			distributeMoneyApply.setUserId(userId);
-			distributeMoneyApply.setPoints(needSubPoints);
-			distributeMoneyApply.setMoney(needApplyMoney);
-			distributeMoneyApply.setAccount(applyMoneyReq.getAccount());
-			distributeMoneyApply.setRealName(applyMoneyReq.getRealName());
-			distributeMoneyApply.setWalletAddr(applyMoneyReq.getWalletAddr());
-			distributeMoneyApply.setRemark(applyMoneyReq.getRemark());
-			distributeMoneyApply.setType(applyMoneyReq.getType());
-			if (isTakeAll != null && isTakeAll) {
-				distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.verifying);
-			} else {
-				TransferAccountsReq req = new TransferAccountsReq();
-				req.setMoney(needApplyMoney);
-				req.setAccount(applyMoneyReq.getAccount());
-				req.setName(applyMoneyReq.getRealName());
-				req.setPoints(needSubPoints);
-				req.setUserId(userId);
-				req.setChannelType(1);
-				req.setRemark("分销提现");
-				AlipayResponse alipayResponse = transferAccounts(req);
-				if (alipayResponse.isSuccess()) {
-					distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.success);
-				} else {
-					distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.fail);
-					distributeMoneyApply.setReason(alipayResponse.getSubMsg());
-					userBenefitsService.addDistributePoints(userId, distributeMoneyApply.getPoints());
-					if (StrUtil.equals(alipayResponse.getSubCode(), "SECURITY_CHECK_FAILED")) {
-						return GatewayResponse.FAIL.newBuilder().setMsg("当前支付宝提现人数较多,请稍后再试").toResult();
-					}
-					return GatewayResponse.FAIL.newBuilder().setMsg(alipayResponse.getSubMsg()).toResult();
-				}
-			}
-			try {
-				distributeMoneyApplyMapper.insert(distributeMoneyApply);
-				//大额提现 超过400
-				if (envCommonService.isPrdEnv() && distributeMoneyApply.getVerifyStatus() == DistributeMoneyApply.Status.verifying && distributeMoneyApply.getMoney().compareTo(fourHundred) > 0) {
-					SmsUtil.sendLuoKey2Msg(Constant.ZK_MOBILE, "推广有大额提现申请【银河录像局】");
-				}
-			} catch (Exception e) {
-				userBenefitsService.addDistributePoints(userId, distributeMoneyApply.getPoints());
-				return GatewayResponse.FAIL.newBuilder().setMsg("网络错误,请重试").toResult();
-			}
-			return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply);
-		}
-		throw BusinessRuntimeException.getInstance("系统异常,请重新提交提现申请");
+		applyMoneyReq.setMType(DistributeMoneyApply.MType.ds);
+		return commonApplyMoney(applyMoneyReq);
 	}
 
 	@Override
@@ -309,7 +206,13 @@ public class TransferFuncServiceImpl implements TransferFuncService {
 		return response;
 	}
 
-	private AlipayRequest aliPayTransferAccountsRequest(String donNo, String account, String name, BigDecimal money,String remark) {
+	@Override
+	public Result<String> subApplyMoney(ApplyMoneyReq applyMoneyReq) throws Exception {
+		applyMoneyReq.setMType(DistributeMoneyApply.MType.sub);
+		return commonApplyMoney(applyMoneyReq);
+	}
+
+	private AlipayRequest aliPayTransferAccountsRequest(String donNo, String account, String name, BigDecimal money, String remark) {
 		//支付宝转账
 		AlipayFundTransUniTransferRequest transUniTransferRequest = new AlipayFundTransUniTransferRequest();
 		//转账参数
@@ -357,4 +260,142 @@ public class TransferFuncServiceImpl implements TransferFuncService {
 		Optional.ofNullable(transDate).ifPresent(transferTime -> record.setTransferTime(DateTime.of(transferTime, "yyyy-MM-dd HH:mm:ss")));
 		transferAccountsRecordMapper.insert(record);
 	}
+
+	public Result commonApplyMoney(ApplyMoneyReq applyMoneyReq) throws Exception {
+		Long userId = applyMoneyReq.getUserId();
+		User user = userMapper.selectById(userId);
+		if (user == null) {
+			throw BusinessRuntimeException.getInstance("请先授权登录");
+		}
+		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+		Boolean isTakeAll = applyMoneyReq.getIsTakeAll();
+		DistributeMoneyApply.Type type = applyMoneyReq.getType();
+		if (type == null) type = DistributeMoneyApply.Type.zfb;
+		if (type == DistributeMoneyApply.Type.zfb) {
+			if (ObjectUtil.hasEmpty(applyMoneyReq.getAccount(), applyMoneyReq.getRealName())) {
+				throw BusinessRuntimeException.getInstance("必填项不能为空");
+			}
+			if (applyMoneyReq.getAccount().length() > 255 || applyMoneyReq.getRealName().length() > 32) {
+				throw BusinessRuntimeException.getInstance("请输入正确的账户信息");
+			}
+		}
+		if (type == DistributeMoneyApply.Type.usdt) {
+			if (StrUtil.isEmpty(applyMoneyReq.getWalletAddr())) {
+				throw BusinessRuntimeException.getInstance("USDT提现钱包地址不能为空");
+			}
+			if (applyMoneyReq.getWalletAddr().length() > 1000) {
+				throw BusinessRuntimeException.getInstance("请输入正确的钱包地址");
+			}
+			if (StrUtil.isNotBlank(applyMoneyReq.getRemark()) && applyMoneyReq.getRemark().length() > 512) {
+				throw BusinessRuntimeException.getInstance("备注过多");
+			}
+			isTakeAll = true;
+
+		}
+		DistributeMoneyApply.MType mType = applyMoneyReq.getMType();
+		Assert.notNull(mType, "系统异常..");
+		DistributeMoneyApply distributeMoneyApply = null;
+		if (type == DistributeMoneyApply.Type.pwdRed) {
+			distributeMoneyApply = userDistributeMapper.selectRelationBusiness(userId);
+			isTakeAll = true;
+		}
+//		//今日是否已提现
+//		DistributeMoneyApply apply = distributeMoneyApplyMapper.selectOne(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getUserId, userId).between(DistributeMoneyApply::getCreatedTime, DateUtil.beginOfDay(DateTime.now()), DateUtil.endOfDay(DateTime.now())).last("limit 1"));
+//		if (apply != null) {
+//			throw BusinessRuntimeException.getInstance("今日已提现,请明日再进行操作");
+//		}
+		BigDecimal userPoints = null;
+		BigDecimal needSubPoints = null;
+		BigDecimal needApplyMoney = null;
+		BigDecimal fourHundred = null;
+		if (mType == DistributeMoneyApply.MType.ds) {
+			userPoints = user.getPoints();
+			DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1"));
+			BigDecimal minPoints = BigDecimal.valueOf(distributePointsExchangeMoney.getMinPoints());
+			BigDecimal ratePoints = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints());
+			BigDecimal minMoney = distributePointsExchangeMoney.getMoney();
+			if (userPoints.compareTo(minPoints) < 0) {
+				throw BusinessRuntimeException.getInstance("您当前积分未达到积分门槛,无法提现");
+			}
+			BigDecimal num = userPoints.divide(ratePoints, 0, RoundingMode.DOWN);
+			needApplyMoney = num.multiply(minMoney);
+			needSubPoints = num.multiply(ratePoints);
+			fourHundred = BigDecimal.valueOf(4 * 100 * 100);
+			if (isTakeAll == null || !isTakeAll) {
+				if (needApplyMoney.compareTo(fourHundred) > 0) {
+					needApplyMoney = fourHundred;
+					needSubPoints = fourHundred.divide(minMoney).multiply(ratePoints);
+				}
+			}
+		}
+		if (mType == DistributeMoneyApply.MType.sub) {
+			needApplyMoney = user.getSubApplyMoney();
+			if (needApplyMoney.compareTo(BigDecimal.ZERO) <= 0) {
+				throw BusinessRuntimeException.getInstance("您暂无可提现金额..");
+			}
+		}
+		Integer update = 0;
+		String zfbRemark = StrUtil.EMPTY;
+		if (mType == DistributeMoneyApply.MType.ds) {
+			update = userMapper.subPoints(user.getId(), needSubPoints);
+			zfbRemark = Constant.APPLY_MONEY_DS;
+		}
+		if (mType == DistributeMoneyApply.MType.sub) {
+			update = userMapper.suUserSubApplyMoney(user.getId(), needApplyMoney);
+			zfbRemark = Constant.APPLY_MONEY_SUB;
+		}
+		if (update == 1) {
+			distributeMoneyApply = Optional.ofNullable(distributeMoneyApply).orElse(new DistributeMoneyApply());
+			distributeMoneyApply.setUserId(userId);
+			distributeMoneyApply.setPoints(needSubPoints);
+			distributeMoneyApply.setMoney(needApplyMoney);
+			distributeMoneyApply.setAccount(applyMoneyReq.getAccount());
+			distributeMoneyApply.setRealName(applyMoneyReq.getRealName());
+			distributeMoneyApply.setWalletAddr(applyMoneyReq.getWalletAddr());
+			distributeMoneyApply.setRemark(applyMoneyReq.getRemark());
+			distributeMoneyApply.setType(applyMoneyReq.getType());
+			distributeMoneyApply.setMType(applyMoneyReq.getMType());
+			if (isTakeAll != null && isTakeAll) {
+				distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.verifying);
+			} else {
+				TransferAccountsReq req = new TransferAccountsReq();
+				req.setMoney(needApplyMoney);
+				req.setAccount(applyMoneyReq.getAccount());
+				req.setName(applyMoneyReq.getRealName());
+				req.setPoints(needSubPoints);
+				req.setUserId(userId);
+				req.setChannelType(1);
+				req.setRemark(zfbRemark);
+				AlipayResponse alipayResponse = transferAccounts(req);
+				if (alipayResponse.isSuccess()) {
+					distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.success);
+				} else {
+					distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.fail);
+					distributeMoneyApply.setReason(alipayResponse.getSubMsg());
+					if (mType == DistributeMoneyApply.MType.ds){
+						userBenefitsService.addDistributePoints(userId, distributeMoneyApply.getPoints());
+					}
+					if (mType == DistributeMoneyApply.MType.sub) {
+						userBenefitsService.addDistributeSubMoney(userId, needApplyMoney);
+					}
+					if (StrUtil.equals(alipayResponse.getSubCode(), "SECURITY_CHECK_FAILED")) {
+						return GatewayResponse.FAIL.newBuilder().setMsg("当前支付宝提现人数较多,请稍后再试").toResult();
+					}
+					return GatewayResponse.FAIL.newBuilder().setMsg(alipayResponse.getSubMsg()).toResult();
+				}
+			}
+			try {
+				distributeMoneyApplyMapper.insert(distributeMoneyApply);
+				//大额提现 超过400
+				if (envCommonService.isPrdEnv() && distributeMoneyApply.getVerifyStatus() == DistributeMoneyApply.Status.verifying && distributeMoneyApply.getMoney().compareTo(fourHundred) > 0) {
+					SmsUtil.sendLuoKey2Msg(Constant.ZK_MOBILE, "推广有大额提现申请【银河录像局】");
+				}
+			} catch (Exception e) {
+				userBenefitsService.addDistributePoints(userId, distributeMoneyApply.getPoints());
+				return GatewayResponse.FAIL.newBuilder().setMsg("网络错误,请重试").toResult();
+			}
+			return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply);
+		}
+		throw BusinessRuntimeException.getInstance("系统异常,请重新提交提现申请");
+	}
 }

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

@@ -44,4 +44,9 @@ public interface UserBenefitsService {
 	 * 扣除店铺主用户 提成金额
 	 */
 	void deductYhShopTakeMoney(Long orderId, Long shopUserId, BigDecimal deductMoney);
+
+	/**
+	 * 返回用户邀请奖励提成
+	 */
+	void addDistributeSubMoney(Long userId, BigDecimal needApplyMoney);
 }

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java

@@ -169,6 +169,22 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 		}
 	}
 
+	@Override
+	public void addDistributeSubMoney(Long userId, BigDecimal addApplyMoney) {
+		if (addApplyMoney.compareTo(BigDecimal.ZERO) <= 0) {
+			return;
+		}
+		while (true) {
+			User user = userMapper.selectById(userId);
+			if (user == null) break;
+			BigDecimal subApplyMoney = user.getSubApplyMoney();
+			Integer success = userMapper.addDistributeSubMoney(user.getId(), subApplyMoney, addApplyMoney);
+			if (success == 1) {
+				break;
+			}
+		}
+	}
+
 	private void deductYhsMoneyRecord(Long orderId, Long shopUserId, BigDecimal deductMoney) {
 		try {
 			YhShopDistributeOrdersDeductPointsRecord record = new YhShopDistributeOrdersDeductPointsRecord();

+ 53 - 1
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsApplyMoneyController.java

@@ -2,19 +2,28 @@ package com.cyksj.web.controller.cps;
 
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
+import com.cyksj.model.entity.User;
 import com.cyksj.model.request.ApplyMoneyReq;
 import com.cyksj.model.views.CpsApplyMoneyView;
+import com.cyksj.model.views.CpsDistributeSubView;
+import com.cyksj.model.views.UserDistributeSubDetailView;
+import com.cyksj.model.views.UserSubApplyMoneyDetailView;
 import com.cyksj.service.pay.TransferFuncService;
 import com.cyksj.web.util.StpCpsManageUser;
 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.math.BigDecimal;
 
-/** cps后台/提现中心
+/**
+ * cps后台/提现中心
  * 项目名: yhlxj
  * 文件名: CpsApplyMoneyController
  * 创建者: JavaZou
@@ -28,6 +37,10 @@ public class CpsApplyMoneyController {
 
 	private final BeanSearcher beanSearcher;
 
+	private final DistributeMoneyApplyMapper distributeMoneyApplyMapper;
+
+	private final UserMapper userMapper;
+
 	private final HttpServletRequest request;
 
 	/**
@@ -52,4 +65,43 @@ public class CpsApplyMoneyController {
 						.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+	/**
+	 * 渠道关于下级渠道提现详情
+	 */
+	@GetMapping("/get/sub/applyMoney/detail")
+	public Result<UserSubApplyMoneyDetailView> getSubApplyMoneyDetail() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		UserSubApplyMoneyDetailView userSubApplyMoneyDetailView = new UserSubApplyMoneyDetailView();
+		BigDecimal gotMoney = distributeMoneyApplyMapper.getSubGotAppyMoney(cpsUserId);
+		userSubApplyMoneyDetailView.setGotMoney(gotMoney);
+		User user = userMapper.selectById(cpsUserId);
+		userSubApplyMoneyDetailView.setCanApplyMoney(user.getSubApplyMoney());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userSubApplyMoneyDetailView);
+	}
+
+	/**
+	 * 下级渠道数据
+	 */
+	@GetMapping("/get/sub")
+	public Result<SearchResult<CpsDistributeSubView>> getSubDistributeData() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		builder.put("uid", String.format("user_id = %s", cpsUserId));
+		SearchResult<CpsDistributeSubView> search = beanSearcher.search(CpsDistributeSubView.class, builder.build());
+		search.getDataList().forEach(data -> {
+			data.setDetailView(beanSearcher.searchFirst(UserDistributeSubDetailView.class, MapUtils.builder().put("sid", data.getSubUserId()).build()));
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 下级渠道奖金提现
+	 */
+	@PostMapping("/sub")
+	public Result<String> subApplyMoney(@RequestBody ApplyMoneyReq applyMoneyReq) throws Exception {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		applyMoneyReq.setUserId(cpsUserId);
+		return transferFuncService.subApplyMoney(applyMoneyReq);
+	}
 }

+ 61 - 3
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java

@@ -3,8 +3,10 @@ package com.cyksj.web.controller.cps;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Codec;
@@ -13,14 +15,19 @@ import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.manage.cps.CpsUserAdRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.dto.AuthToken;
 import com.cyksj.model.dto.CpsAuthDto;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
+import com.cyksj.model.entity.CpsUserAdRecord;
+import com.cyksj.model.entity.SysConfig;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.UserDistribute;
 import com.cyksj.model.request.LoginReq;
+import com.cyksj.model.views.UserInfoView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.authorization.AuthorizationService;
 import com.cyksj.service.cps.CpsManageService;
@@ -58,6 +65,10 @@ public class CpsBackLoginController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final CpsUserAdRecordMapper cpsUserAdRecordMapper;
+
+	private final SysConfigMapper sysConfigMapper;
+
 	/**
 	 * 获取登录验证码
 	 */
@@ -88,7 +99,7 @@ public class CpsBackLoginController {
 	 * cps后台微信授权登录
 	 */
 	@GetMapping("/wx/authLogin")
-	public Result<CpsAuthDto> wxAuthorize() throws Exception {
+	public Result<CpsAuthDto> wxAuthorize(String redirectUrl) throws Exception {
 		Object authUrlObj = redisService.get(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()));
 		if (authUrlObj != null) {
 			CpsAuthDto cpsAuthDto = Jsons.parseObject(authUrlObj.toString(), CpsAuthDto.class);
@@ -99,6 +110,7 @@ public class CpsBackLoginController {
 		String authState = mappingId.toString();
 		redisService.set(authState, authState, 60 * 60 * 24L);
 		AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
+		redirect.setUrl(redirectUrl);
 		String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
 		String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getCpsRedirectUri());
 		cpsAuthDto.setAuthUrl(wxAuthUrl);
@@ -127,11 +139,16 @@ public class CpsBackLoginController {
 						.orderByAsc(User::getId)
 						.last("limit 1")));
 		if (user == null) throw BusinessRuntimeException.getInstance("用户信息不存在");
-		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).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).last("limit 1"));
 		if (userDistribute == null) throw BusinessRuntimeException.getInstance("只支持渠道分销用户登录");
-		JSONObject res = new JSONObject();
 		StpCpsManageUser.login(user.getId());
 		String cpsToken = StpCpsManageUser.getTokenValue();
+		String url = re.getUrl();
+		if (StrUtil.isNotBlank(url)) {
+			response.sendRedirect(url.contains("?") ? url + "&t=" + cpsToken : url + "?t=" + cpsToken);
+			return;
+		}
+		JSONObject res = new JSONObject();
 		res.putOpt("satoken-cpsUser", cpsToken);
 		res.putOpt("img", user.getHeadimgurl());
 		res.putOpt("nickname", user.getNickname());
@@ -150,4 +167,45 @@ public class CpsBackLoginController {
 		redisService.del(key);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(o.toString());
 	}
+
+	/**
+	 * 广告弹窗是否展示
+	 */
+	@GetMapping("/get/ad")
+	public Result<String> getAd() {
+		String key = Constant.CPS_AD_KEY;
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		CpsUserAdRecord cpsUserAdRecord = cpsUserAdRecordMapper.selectOne(Wrappers.lambdaQuery(CpsUserAdRecord.class)
+				.eq(CpsUserAdRecord::getUserId, cpsUserId)
+				.eq(CpsUserAdRecord::getSysKey, key)
+				.last("limit 1"));
+		if (cpsUserAdRecord == null) {
+			SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, key).last("limit 1"));
+			if (sysConfig != null){
+				cpsUserAdRecord = new CpsUserAdRecord();
+				cpsUserAdRecord.setUserId(cpsUserId);
+				cpsUserAdRecord.setSysKey(key);
+				cpsUserAdRecordMapper.insert(cpsUserAdRecord);
+				return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig.getSysValue());
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 获取cps用户基本信息
+	 */
+	@GetMapping("/get/redirect/userInfo")
+	public Result<UserInfoView> getUserInfoView() {
+		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"));
+		Assert.notNull(userDistribute, "只支持渠道分销用户登录");
+		UserInfoView userInfoView = new UserInfoView();
+		userInfoView.setImg(user.getHeadimgurl());
+		userInfoView.setNickname(user.getNickname());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userInfoView);
+	}
 }

+ 7 - 0
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.model.entity.DistributeMoneyApply;
 import com.cyksj.model.entity.DistributeWaitingSendPoints;
@@ -53,6 +55,10 @@ public class CpsDistribtueDataController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final UserMapper userMapper;
+
+	private final DistributeMoneyApplyMapper distributeMoneyApplyMapper;
+
 	/**
 	 * 个人分销平台数据详情
 	 */
@@ -66,6 +72,7 @@ public class CpsDistribtueDataController {
 		Number gotApplyMoney = beanSearcher.searchSum(DistributeMoneyApply.class, MapUtils.builder()
 				.field(DistributeMoneyApply::getUserId, cpsUserId)
 				.field(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success.name())
+				.field(DistributeMoneyApply::getMType, DistributeMoneyApply.MType.ds.name())
 				.build(), "money");
 		Number reMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.success.name()).build(), "points");
 		Number wMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting.name()).build(), "points");

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

@@ -428,7 +428,7 @@ public class CmsAccountController {
 		    }
 			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(account.getSkuId());
 			if (goodsDonSku.getIsMirror()) {
-				String gptRefreshToken = chatGptAccountService.addAccount(account);
+				String gptRefreshToken = chatGptAccountService. addAccount(account);
 				accountService.update(null, Wrappers.lambdaUpdate(Account.class).eq(Account::getId, account.getId()).set(Account::getGptRefreshToken,gptRefreshToken ));
 			}
 			groupsTrips.setAvailableParkingNum(availableParkingNum);

+ 29 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -22,6 +22,7 @@ import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
+import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.BusinessDistributeDefaultRateDetailReq;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
@@ -122,6 +123,8 @@ public class DistributeController {
 
 	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
 
+	private final UserDistributeSubMapper userDistributeSubMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -202,9 +205,35 @@ public class DistributeController {
 		rateDetailView.setTargets(targets);
 		rateDetailView.setEpRate(userDistributeEquipmentMapper.selectOne(Wrappers.lambdaQuery(UserDistributeEquipment.class)
 				.eq(UserDistributeEquipment::getDistributeId, id).last("limit 1")));
+
+		rateDetailView.setUserDistributeSub(beanSearcher.searchFirst(UserDistributeSub.class, MapUtils.builder()
+				.field(UserDistributeSub::getSubDistributeId, id)
+				.build()));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(rateDetailView);
 	}
 
+	/**
+	 * 下级渠道
+	 */
+	@GetMapping("/get/sub/{distributeId}")
+	public Result<SearchResult<UserDistributeSub>> getSub(@PathVariable Long distributeId) {
+		SearchResult<UserDistributeSub> search = beanSearcher.search(UserDistributeSub.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(UserDistributeSub::getDistributeId, distributeId)
+				.orderBy(UserDistributeSub::getCreatedTime).desc()
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 删除下级渠道
+	 */
+	@DeleteMapping("/delete/sub/{id}")
+	public Result<String> deleteSubById(@PathVariable Long id) {
+		userDistributeSubMapper.deleteById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功");
+
+	}
+
 	/**
 	 * 固定渠道平台分销详情 趋势图
 	 */

+ 13 - 4
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

@@ -14,14 +14,12 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.manage.cps.CpsUserAdRecordMapper;
 import com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper;
 import com.cyksj.mapper.manage.help.HelpQuestionMapper;
 import com.cyksj.model.dto.EquipmentConfigDto;
 import com.cyksj.model.dto.SysServiceChangeDto;
-import com.cyksj.model.entity.HelpQuestion;
-import com.cyksj.model.entity.HelpQuestionClassification;
-import com.cyksj.model.entity.SysConfig;
-import com.cyksj.model.entity.SysConfigChangeRecord;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.views.HelpQuestionClassificationView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.sys.SysConfigChangeRecordService;
@@ -66,6 +64,8 @@ public class SysConfigController {
 
 	private final SysConfigChangeRecordService sysConfigChangeRecordService;
 
+	private final CpsUserAdRecordMapper cpsUserAdRecordMapper;
+
 	@GetMapping("/get")
 	public Result<SysConfig> get(String key) {
 		SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, key).last(" limit 1"));
@@ -209,4 +209,13 @@ public class SysConfigController {
 		redisService.set(RedisService.key.EQUIPMENT_USER_SERVICE_RECORD.getEnvName() + time + userId, indx, RedisService.key.EQUIPMENT_USER_SERVICE_RECORD.getTimeout());
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+	/**
+	 * 清零用户获取广告记录
+	 */
+	@DeleteMapping("/delete/cps/ad")
+	public Result<String> deleteCpsAdRecord() {
+		cpsUserAdRecordMapper.delete(null);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }

+ 21 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -10,6 +10,7 @@ import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.ValidatorUtil;
+import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
@@ -28,6 +29,7 @@ import com.cyksj.model.views.*;
 import com.cyksj.service.distribute.DistributeService;
 import com.cyksj.service.pay.TransferFuncService;
 import com.cyksj.service.user.UserService;
+import com.cyksj.web.util.StpCpsManageUser;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -84,6 +86,8 @@ public class DistributePopularizeController {
 
 	private final CouponMapper couponMapper;
 
+	private final WxOpenPlatYHLXLoginConfig wxOpenPlatYHLXLoginConfig;
+
 	/**
 	 * 推广订单明细
 	 */
@@ -140,7 +144,7 @@ public class DistributePopularizeController {
 		distributePopularizeView.setGotPoints(user.getPoints());
 		Integer orders = userDistributeMapper.count(userId);
 		distributePopularizeView.setDistributeOrders(orders);
-		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userId).select(UserDistribute::getId).last("limit 1"));
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userId).eq(UserDistribute::getDeleted, 1).select(UserDistribute::getId).last("limit 1"));
 		if (userDistribute != null) {
 			//是否是固定推广者
 			UserDistributeView userDistributeView = beanSearcher.searchFirst(UserDistributeView.class, MapUtils.builder()
@@ -259,6 +263,7 @@ public class DistributePopularizeController {
 	public Result<Boolean> isGeneralDistribute() {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+				.eq(UserDistribute::getDeleted, 1)
 				.eq(UserDistribute::getUserId, userId));
 		if (userDistribute != null) {
 			return GatewayResponse.SUCCESS.newBuilder().toResult(false);
@@ -309,4 +314,19 @@ public class DistributePopularizeController {
 		distributeService.bindPopularizeCode(userId, code);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("设置成功");
 	}
+
+	/**
+	 * 固定推广登录信息
+	 */
+	@GetMapping("/get/ds/detail")
+	public Result<String> getDistributeDetail() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		User user = userMapper.selectById(userId);
+		if (user == null) throw BusinessRuntimeException.getInstance("用户信息不存在");
+		UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).eq(UserDistribute::getDeleted, 1).select(UserDistribute::getId).last("limit 1"));
+		if (userDistribute == null) throw BusinessRuntimeException.getInstance("只支持渠道分销用户登录");
+		StpCpsManageUser.login(user.getId());
+		String cpsToken = StpCpsManageUser.getTokenValue();
+		return GatewayResponse.SUCCESS.newBuilder().toResult(wxOpenPlatYHLXLoginConfig.getCpsWebRedirectUri() + "?t=" + cpsToken);
+	}
 }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 2 - 1
netflix-web/src/main/resources/application-pre.yml

@@ -138,7 +138,8 @@ wx-login:
   cpsLoginUrl: https://cps.nf.video/yinhe/cps/loginNexte
   yhShopRedirectUri: https://nf.video/8082/api/yhShop/manage/wx/authLogin/baseRedirect
   yhShopLoginUrl: https://shop.liuliangbang.vip/mall/admin/loginNexte
-  baRedirectUrl: https://nf.video/80821/api/applets/market/task/bind/wx/baseRedirect
+  baRedirectUrl: https://nf.video/8082/api/applets/market/task/bind/wx/baseRedirect
+  cpsWebRedirectUri: https://inside.liuliangbang.vip/yinhe/cps/homePage
   remark: 银河录像网页微信登录
 
 wx-shop-login:

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.