فهرست منبع

Merge branch 'sub_func' into dev

zoujiajian 2 سال پیش
والد
کامیت
f371f512b5
37فایلهای تغییر یافته به همراه874 افزوده شده و 145 حذف شده
  1. 9 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 3 1
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  3. 3 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. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CpsUserAdRecord.java
  10. 24 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributeMoneyApply.java
  11. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  12. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  13. 64 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSub.java
  14. 55 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSubRewards.java
  15. 68 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeSubWaiting.java
  16. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/ApplyMoneyReq.java
  17. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java
  18. 30 0
      netflix-dao/src/main/java/com/cyksj/model/views/CpsDistributeSubView.java
  19. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRateDetailView.java
  20. 42 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeSubDetailView.java
  21. 26 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserSubApplyMoneyDetailView.java
  22. 21 7
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  23. 14 0
      netflix-dao/src/main/resources/mapper/UserDistributeSubMapper.xml
  24. 53 9
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  25. 24 1
      netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java
  26. 1 1
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/StatisticsDataService.java
  27. 7 7
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  28. 61 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  29. 2 0
      netflix-service/src/main/java/com/cyksj/service/pay/TransferFuncService.java
  30. 131 107
      netflix-service/src/main/java/com/cyksj/service/pay/impl/TransferFuncServiceImpl.java
  31. 5 5
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  32. 53 1
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsApplyMoneyController.java
  33. 28 0
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java
  34. 6 0
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java
  35. 29 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  36. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
  37. 13 4
      netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

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

@@ -270,4 +270,13 @@ public interface Constant {
 	String ACCOUNT_SET_SYS_MSG_NOTIFY = "您购买的%s账号,账号已配置";
 
 	Long CALUDE_GOODS_ID = 73l;
+
+	String APPLY_MONEY_DS = "分销提现";
+
+	String APPLY_MONEY_SUB = "邀请奖励金提现";
+
+	/**
+	 * cps后台用户弹窗key
+	 */
+	String CPS_AD_KEY = "cps_ad_key";
 }

+ 3 - 1
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -71,5 +71,7 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 
 	Page<CorpTagUserOrderDataView> getTagUserTimeOrderData(@Param("page") Page<Object> objectPage, @Param("tagIdStr") String tagIdStr, @Param("toDate") String toDate, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
-	List<RealGoodsSourceData> getRealGoodsSourceData(@Param("startDate") String startDate, @Param("endDate") String endDate);
+	List<RealGoodsSourceData> getRealGoodsSourceData(@Param("isGeneral") Boolean isGeneral, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+	BigDecimal selectSubChannelOrderMoney(@Param("sharedId") Long sharedId, @Param("limitTime") Date limitTime);
 }

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

@@ -67,4 +67,7 @@ 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);
 }

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

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

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

@@ -358,6 +358,8 @@ public class OrderDon extends BaseEntity implements Serializable {
         bz("B站"),
         py("朋友"),
         yh("银河官网"),
+        bd("百度"),
+        whf("无回复"),
         ;
         String desc;
 

+ 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 extends BaseEntity{
+	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;
+	}
+}

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

@@ -0,0 +1,68 @@
+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 months;
+
+	/**
+	 * 锁标识
+	 */
+	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;
 }

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

+ 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) {
+			this.nextLevelDesc = UserDistributeSubRewards.RewardLevel.values()[nextLevel].getMsg();
+		}
+		if (totalMoney.compareTo(BigDecimal.ZERO) == 0) {
+			return UserDistributeSubRewards.RewardLevel.meteor.getMsg();
+		}
+		return null;
+	}
+}

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

+ 21 - 7
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -404,18 +404,32 @@
 
     <select id="getRealGoodsSourceData" resultType="com.cyksj.model.views.RealGoodsSourceData">
         select label_source,
-               count(*) as orders,
-               sum(money) as orderMoney
-        from order_don
+        count(*) as orders,
+        sum(money) as orderMoney
+        from order_don o
+        left join user_distribute_shared us on us.user_id = o.user_id
         where goods_id = 15
         and status not in ('close', 'noPayment', 'refund')
         <if test="startDate != null">
-            and created_time >= #{startDate}
+            and o.created_time >= #{startDate}
         </if>
         <if test="endDate != null">
-            and created_time &lt; #{endDate}
+            and o.created_time &lt; #{endDate}
+        </if>
+        <if test="isGeneral != null and isGeneral">
+            and us.id is null
         </if>
-        and label_source != ''
-        group by label_source
+        and o.label_source != ''
+        group by o.label_source
+    </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 &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>

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

+ 24 - 1
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -340,8 +340,31 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 										sb.append(part[i + 1]);
 										i++;
 									}
+									if (part[i].contains("菜")) {
+										sb.append("一道菜");
+										sb.append(Constant.ONE_EMPTY);
+										sb.append(part[i + 1]);
+										i++;
+									}
+									if (part[i].contains("书")) {
+										sb.append("一本书");
+										sb.append(Constant.ONE_EMPTY);
+										sb.append(part[i + 1]);
+										i++;
+									}
+									if (part[i].contains("专辑")) {
+										sb.append("一张专辑");
+										sb.append(Constant.ONE_EMPTY);
+										sb.append(part[i + 1]);
+										i++;
+									}
+								}
+								String string = sb.toString();
+								if (string.contains("菜")) {
+									StringBuilder builder = new StringBuilder();
+									string = builder.append("生日").append(Constant.ONE_EMPTY).append(part[2]).append(Constant.ONE_EMPTY).append(string).toString();
 								}
-								insert.setSecret(sb.toString());
+								insert.setSecret(string);
 							} else {
 								insert.setSecret(Constant.AMERICA_APPID_SECRET);
 							}

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

@@ -47,5 +47,5 @@ public interface StatisticsDataService {
 
 	void yhShopDistribute(BackgroundDataView backgroundDataView, Date startDate, Date endDate);
 
-	GroupsDataStatisticsView getGroupsData(Long startTime, Long endTime, Integer type) throws Exception;
+	GroupsDataStatisticsView getGroupsData(Long startTime, Long endTime, Integer type, Boolean isDistribute) throws Exception;
 }

+ 7 - 7
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -404,7 +404,7 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 	}
 
 	@Override
-	public GroupsDataStatisticsView getGroupsData(Long startTime, Long endTime, Integer type) throws Exception {
+	public GroupsDataStatisticsView getGroupsData(Long startTime, Long endTime, Integer type, Boolean isGeneral) throws Exception {
 		GroupsDataStatisticsView groupsDataStatisticsView = new GroupsDataStatisticsView();
 		String startDate = null;
 		String endDate = null;
@@ -434,10 +434,10 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 				getUnbindChannelOrderData(groupsDataStatisticsView, startDate, endDate);
 				break;
 			case 6:
-				getRealGoodsSourceData(groupsDataStatisticsView, startDate, endDate);
+				getRealGoodsSourceData(groupsDataStatisticsView, isGeneral, startDate, endDate);
 				break;
 			default:
-				getSynthesisData(groupsDataStatisticsView, startDate, endDate);
+				getSynthesisData(groupsDataStatisticsView, isGeneral, startDate, endDate);
 		}
 		return groupsDataStatisticsView;
 	}
@@ -517,7 +517,7 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		groupsDataStatisticsView.setNewBuyOrderMoney(totalMoney.subtract(groupsDataStatisticsView.getRenewOrderMoney()));
 	}
 
-	public void getSynthesisData(GroupsDataStatisticsView groupsDataStatisticsView, String startDate, String endDate) throws Exception {
+	public void getSynthesisData(GroupsDataStatisticsView groupsDataStatisticsView, Boolean isGeneral, String startDate, String endDate) throws Exception {
 		CountDownLatch latch = new CountDownLatch(2);
 		TASK_POOL.execute(() -> {
 			try {
@@ -532,7 +532,7 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 				getGroupsOrderCategoryData(groupsDataStatisticsView, startDate, endDate);
 				getRenewOrderData(groupsDataStatisticsView, startDate, endDate);
 				getUnbindChannelOrderData(groupsDataStatisticsView, startDate, endDate);
-				getRealGoodsSourceData(groupsDataStatisticsView, startDate, endDate);
+				getRealGoodsSourceData(groupsDataStatisticsView, isGeneral, startDate, endDate);
 			} finally {
 				latch.countDown();
 			}
@@ -540,8 +540,8 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		latch.await();
 	}
 
-	private void getRealGoodsSourceData(GroupsDataStatisticsView groupsDataStatisticsView, String startDate, String endDate) {
-		List<RealGoodsSourceData> realGoodsSourceDataList = orderDonMapper.getRealGoodsSourceData(startDate, endDate);
+	private void getRealGoodsSourceData(GroupsDataStatisticsView groupsDataStatisticsView, Boolean isGeneral, String startDate, String endDate) {
+		List<RealGoodsSourceData> realGoodsSourceDataList = orderDonMapper.getRealGoodsSourceData(isGeneral, startDate, endDate);
 		Map<String, List<RealGoodsSourceData>> collect = realGoodsSourceDataList.stream().collect(Collectors.groupingBy(RealGoodsSourceData::getLabelSource));
 		OrderDon.LabelSource[] values = OrderDon.LabelSource.values();
 		BigDecimal zero = BigDecimal.ZERO;

+ 61 - 0
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;
@@ -269,6 +272,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)
@@ -2372,6 +2381,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						}
 					}
 				}
+				//下级渠道目标额达标 提成金额发放
+				sendSubDistributeRewards(orderDon);
 			} catch (Exception e) {
 				log.error("回调修改订单信息错误,orderId:{},error:{}", orderDon.getId(), StringUtil.getErrorText(e));
 			}
@@ -2904,4 +2915,54 @@ 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();
+
+				UserDistributeSubWaiting userDistributeSubWaiting = userDistributeSubWaitingMapper.selectOne(Wrappers.lambdaQuery(UserDistributeSubWaiting.class)
+						.eq(UserDistributeSubWaiting::getUserId, userId)
+						.orderByDesc(UserDistributeSubWaiting::getLevel).last("limit 1"));
+				//小于最大奖励级别
+				if (userDistributeSubWaiting == null || userDistributeSubWaiting.getLevel() < UserDistributeSubRewards.RewardLevel.values().length) {
+					List<UserDistributeSubRewards> userDistributeSubRewards = userDistributeSubRewardsMapper.selectList(Wrappers.lambdaQuery(UserDistributeSubRewards.class)
+							.gt(userDistributeSubWaiting != null, UserDistributeSubRewards::getLevel, userDistributeSubWaiting.getLevel())
+							.orderByAsc(UserDistributeSubRewards::getLevel));
+					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, DateUtil.offsetMonth(userDistributeSub.getCreatedTime(), months));
+						if (subOrderMoney != null && subOrderMoney.compareTo(targetAmount) >= 0) {
+							try {
+								//达标 发放提成
+								UserDistributeSubWaiting newSubWaiting = new UserDistributeSubWaiting();
+								newSubWaiting.setMoney(userDistributeSubReward.getMoney());
+								newSubWaiting.setUserId(userId);
+								newSubWaiting.setSubUserId(subUserId);
+								newSubWaiting.setSendStatus(UserDistributeSubWaiting.Status.waiting);
+								newSubWaiting.setSendTime(DateUtil.offsetDay(DateTime.now(), 3));
+								newSubWaiting.setMonths(months);
+								newSubWaiting.setLevel(rewardLevel);
+								userDistributeSubWaitingMapper.insert(newSubWaiting);
+								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;
 }

+ 131 - 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,125 @@ 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;
+		}
+		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 = 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());
+					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("系统异常,请重新提交提现申请");
+	}
 }

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

@@ -364,7 +364,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			//23-12-06 MidJourney 不硬塞
 			if (sku.getNum() > 1 && Constant.AI_goodsIds.get(0) == sku.getGoodsId()) {
 				Integer extraNum = 5;
-				if (sku.getId() == 178l) {
+				if (sku.getId() == 178l || sku.getId() == 423l) {
 					extraNum = 2;
 				}
 				maxNum += extraNum;
@@ -591,15 +591,15 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		UserFuncProperty userFuncProperty = userFuncPropertyMapper.selectOne(Wrappers.lambdaQuery(UserFuncProperty.class).eq(UserFuncProperty::getUserId, userId).last("limit 1"));
 		//默认0次
 		int num = 0;
+		//有安全码 不可查看验证码
+		if (isHasVerifyCode) {
+			return num;
+		}
 		//查看双重验证码次数
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(skuId);
 		if (sku.getCodeNum() > 0) {
 			num = sku.getCodeNum();
 		}
-		//有安全码并客服未设置对应用户可查看次数 置为0
-		if (isHasVerifyCode && userFuncProperty == null) {
-			num = 0;
-		}
 		if (userFuncProperty != null) num = userFuncProperty.getVerifyCheckNum();
 		return num;
 	}

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

+ 28 - 0
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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,11 +14,15 @@ 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;
@@ -58,6 +63,10 @@ public class CpsBackLoginController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final CpsUserAdRecordMapper cpsUserAdRecordMapper;
+
+	private final SysConfigMapper sysConfigMapper;
+
 	/**
 	 * 获取登录验证码
 	 */
@@ -150,4 +159,23 @@ 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) return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig.getSysValue());
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }

+ 6 - 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;
+
 	/**
 	 * 个人分销平台数据详情
 	 */

+ 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("删除成功");
+
+	}
+
 	/**
 	 * 固定渠道平台分销详情 趋势图
 	 */

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

@@ -137,8 +137,8 @@ public class StatisticsDataController {
 	 * type 1销售数据 2自然渠道分类数据 3 渠道商+个人 分类数据 4 续费/非续费数据
 	 */
 	@GetMapping("/get/groupsData")
-	public Result<GroupsDataStatisticsView> getGroupsData(Long startTime, Long endTime, @RequestParam(defaultValue = "0") Integer type) throws Exception {
-		GroupsDataStatisticsView groupsDataStatisticsView = statisticsDataService.getGroupsData(startTime, endTime, type);
+	public Result<GroupsDataStatisticsView> getGroupsData(Long startTime, Long endTime, @RequestParam(defaultValue = "0") Integer type, Boolean isGeneral) throws Exception {
+		GroupsDataStatisticsView groupsDataStatisticsView = statisticsDataService.getGroupsData(startTime, endTime, type, isGeneral);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(groupsDataStatisticsView);
 	}
 

+ 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("/delte/cps/ad")
+	public Result<String> deleteCpsAdRecord() {
+		cpsUserAdRecordMapper.delete(null);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }