Переглянути джерело

fix 修改分销功能

fix 分销订单退款,分发积分记录状态修改

fix

fix

fix 返回结构

fix 提现输入手机号和姓名

fix id

fix 忽略去掉

fix

fix 返回值变量

fix 积分门槛

fix 推广个人详情

fix 跳转参数

fix

fix 判断

fix 空指针

fix 分销订单

fix

fix 积分待发人

fix 分销统计

fix 漏字段

fix 用户列表

fix

fix 统计分销字段

fix 空指针

fix pc端分销

fix 校验平台不存在

fix 平台分销去掉不存在平台

fix 最高分销比例

fix

fix

fix 分销订单数据

fix

fix 分销统计数据

fix

fix

fix

fix

fix 逻辑删除

fix 固定推广者订单标识

fix 审核失败原因入库

fix 审核失败归还积分

fix 手机号校验去掉

fix 提现账号

fix 审核成功,打款截图

fix
zoujiajian 3 роки тому
батько
коміт
e41ffa5422
31 змінених файлів з 420 додано та 113 видалено
  1. 4 4
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  2. 5 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/DistributeWaitingSendPointsMapper.java
  3. 1 1
      netflix-dao/src/main/java/com/cyksj/model/entity/AbstractBackData.java
  4. 24 4
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributeMoneyApply.java
  5. 8 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributePointsExchangeMoney.java
  6. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  7. 3 3
      netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java
  8. 21 0
      netflix-dao/src/main/java/com/cyksj/model/request/ApplyMoneyReq.java
  9. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/DistributeApplyMoneyReq.java
  10. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/LoginPhoneReq.java
  11. 13 1
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeMoneyApplyView.java
  12. 5 6
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersView.java
  13. 4 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeOrdersView.java
  14. 6 1
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeView.java
  15. 2 2
      netflix-dao/src/main/java/com/cyksj/model/views/MoneyApplyView.java
  16. 35 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeView.java
  17. 3 2
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeViews.java
  18. 3 1
      netflix-dao/src/main/resources/mapper/AppleOneDataMapper.xml
  19. 1 1
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  20. 3 1
      netflix-dao/src/main/resources/mapper/StreamingAccountDataMapper.xml
  21. 5 3
      netflix-dao/src/main/resources/mapper/UserDistributeMapper.xml
  22. 3 3
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  23. 9 12
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  24. 25 2
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  25. 19 11
      netflix-service/src/main/java/com/cyksj/task/Scheduler.java
  26. 1 3
      netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java
  27. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  28. 88 23
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  29. 22 3
      netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java
  30. 89 23
      netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java
  31. 1 1
      netflix-web/src/main/resources/application.yml

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

@@ -19,9 +19,9 @@ public interface UserMapper extends BaseMapper<User> {
     @Update("update user set lottery_time = lottery_time + 1 where id = #{id}")
     void incrLotteryTime(@Param("id") Long userId);
 
-    @Update("update user set points = points - #{points} where id = #{id} and points >= #{points} and points >0")
-    Integer subPoints(@Param("id") Long id, @Param("points") int points);
+    @Update("update user set points = points - #{points} where id = #{id} and points >= #{points} and points > 0")
+    Integer subPoints(@Param("id") Long id, @Param("points") BigDecimal points);
 
-    @Update("update user set points = points + #{points} where id = #{id} and points >=0")
-    Integer addPoints(@Param("id") Long id, @Param("points") BigDecimal points);
+    @Update("update user set points = points + #{addPoints} where id = #{id} and points = #{originalPoints} and points >=0")
+    Integer updatePoints(@Param("id") Long id, @Param("originalPoints") BigDecimal originalPoints, @Param("addPoints") BigDecimal addPoints);
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/DistributeWaitingSendPointsMapper.java

@@ -2,6 +2,8 @@ package com.cyksj.mapper.manage.distribute;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.DistributeWaitingSendPoints;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
 
 /*
  *项目名: netflix
@@ -10,4 +12,7 @@ import com.cyksj.model.entity.DistributeWaitingSendPoints;
  *创建时间:2022/11/15 12:10
  */
 public interface DistributeWaitingSendPointsMapper extends BaseMapper<DistributeWaitingSendPoints> {
+
+	@Update("update distribute_waiting_send_points set send_status = #{status} where order_id = #{orderId}")
+	void updateOrderStatus(@Param("orderId") Long orderId, @Param("status") DistributeWaitingSendPoints.Status status);
 }

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

@@ -58,7 +58,7 @@ public abstract class AbstractBackData {
 	private Integer numOfDistributeOrder;
 
 	/**
-	 * 分销单数
+	 * 分销金额
 	 */
 	private BigDecimal distributeOrderMoney;
 

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

@@ -22,15 +22,35 @@ public class DistributeMoneyApply extends BaseEntity {
 
 	private String reason;
 
-	private Integer points;
+	private BigDecimal points;
 
 	private Status verifyStatus;
 
+	private Type type;
+
+	private String account;
+
+	private String realName;
+
+	private String img;
+
+	@Getter
+	public enum Type {
+		zfb("支付宝"),
+		wechat("微信"),
+		;
+		String desc;
+
+		Type(String desc) {
+			this.desc = desc;
+		}
+	}
+
 	@Getter
 	public enum Status {
-		Success("审核成功"),
-		Fail("审核失败"),
-		Verifying("审核中"),
+		success("审核成功"),
+		fail("审核失败"),
+		verifying("审核中"),
 		;
 		String desc;
 

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/DistributePointsExchangeMoney.java

@@ -14,6 +14,14 @@ import java.math.BigDecimal;
 @Getter
 @Setter
 public class DistributePointsExchangeMoney extends BaseEntity{
+	/**
+	 * 积分门槛
+	 */
+	private Integer minPoints;
+
+	/**
+	 * 多少积分兑换金额
+	 */
 	private Integer points;
 
 	private BigDecimal money;

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

@@ -81,6 +81,11 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private Boolean isDistribute;
 
+    /**
+     * 是否是固定推广者分销
+     */
+    private Boolean isFixedDistribute;
+
     public enum Status {
         /**
          * 订单状态

+ 3 - 3
netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java

@@ -12,7 +12,7 @@ import lombok.Setter;
  */
 @Getter
 @Setter
-@SearchBean(tables = "user u left join user_distribute_shared usd on usd.shared_id = u.id")
+@SearchBean(tables = "user u left join user_distribute_shared usd on usd.user_id = u.id")
 public class UserView {
 
     /**
@@ -67,11 +67,11 @@ public class UserView {
      * 邀请人名称
      */
     @DbIgnore
-    private String sharNickName;
+    private String sharedNickName;
 
     /**
      * 邀请人头像
      */
     @DbIgnore
-    private String sharHeadimgurl;
+    private String sharedHeadimgurl;
 }

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

@@ -0,0 +1,21 @@
+package com.cyksj.model.request;
+
+import com.cyksj.model.entity.DistributeMoneyApply;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ApplyMoneyReq
+ *创建者: JavaZou
+ *创建时间:2022/11/16 9:58
+ */
+@Getter
+@Setter
+public class ApplyMoneyReq {
+	private String account;
+
+	private DistributeMoneyApply.Type type;
+
+	private String realName;
+}

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

@@ -24,4 +24,9 @@ public class DistributeApplyMoneyReq {
 	private String verifyStatus;
 
 	private String reason;
+
+	/**
+	 * 成功打款图片
+	 */
+	private String img;
 }

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

@@ -18,4 +18,9 @@ public class LoginPhoneReq {
 	 * 验证码
 	 */
 	private String code;
+
+	/**
+	 * 分销人用户id
+	 */
+	private Long sharedId;
 }

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

@@ -35,11 +35,23 @@ public class DistributeMoneyApplyView {
 	private String reason;
 
 	@DbField("dma.points")
-	private Integer points;
+	private BigDecimal points;
+
+	@DbField("dma.real_name")
+	private String realName;
+
+	@DbField("dma.type")
+	private DistributeMoneyApply.Type type;
+
+	@DbField("dma.account")
+	private String account;
 
 	@DbField("dma.verify_status")
 	private DistributeMoneyApply.Status verifyStatus;
 
+	@DbField("dma.img")
+	private String img;
+
 	@DbField("dma.created_time")
 	private Date createdTime;
 }

+ 5 - 6
netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersView.java

@@ -16,9 +16,8 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "order_don od left join user_distribute_shared uds on uds.user_id = od.user_id" +
-		" left join user_distribute ud on ud.user_id = uds.shared_id",
-where = "od.is_distribute is true")
+@SearchBean(tables = "order_don od left join distribute_waiting_send_points dp on dp.order_id = od.id",
+		where = "od.is_distribute is true and od.status not in ('close','noPayment')")
 public class DistributeOrdersView {
 	@DbField("od.id")
 	private Long id;
@@ -26,12 +25,12 @@ public class DistributeOrdersView {
 	@DbField("od.money")
 	private BigDecimal money;
 
-	@DbField("ud.user_id")
-	private Long userId;
-
 	@DbField("od.status")
 	private String status;
 
+	@DbField("od.is_fixed_distribute")
+	private Boolean isFixedDistribute;
+
 	@DbField("od.created_time")
 	private Date createdTime;
 }

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeOrdersView.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.views;
 
+import com.cyksj.model.entity.OrderDon;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
@@ -52,6 +53,9 @@ public class DistributePopularizeOrdersView {
 	@DbIgnore
 	private String goodsTitle;
 
+	@DbField("od.status")
+	private OrderDon.Status orderStatus;
+
 	@DbIgnore
 	private String specVal;
 

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

@@ -32,10 +32,15 @@ public class DistributePopularizeView {
 	/**
 	 * 带入账积分
 	 */
-	private Integer waitingSendPoints;
+	private BigDecimal waitingSendPoints;
 
 	/**
 	 * 分销单数
 	 */
 	private Integer distributeOrders;
+
+	/**
+	 * 最高返现比例
+	 */
+	private Integer highestRate;
 }

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

@@ -1,10 +1,10 @@
 package com.cyksj.model.views;
 
+import com.cyksj.model.entity.DistributePointsExchangeMoney;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
-import java.util.List;
 
 /*
  *项目名: netflix
@@ -17,5 +17,5 @@ import java.util.List;
 public class MoneyApplyView {
 	private BigDecimal gotMoney;
 
-	List<DistributeMoneyApplyView> details;
+	private DistributePointsExchangeMoney threshold;
 }

+ 35 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeView.java

@@ -0,0 +1,35 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: UserDistributeView
+ *创建者: JavaZou
+ *创建时间:2022/11/15 16:27
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_plat_distribute_rate up left join goods_don gd on gd.id = up.goods_id")
+public class UserDistributeView {
+	@DbField("up.id")
+	private Long id;
+
+	@DbField("up.distribute_id")
+	@JsonIgnore
+	private Long distribute_id;
+
+	@DbField("gd.id")
+	private Long goodsId;
+
+	@DbField("gd.title")
+	private String title;
+
+	@DbField("up.rate")
+	private Integer rate;
+
+}

+ 3 - 2
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeViews.java

@@ -18,7 +18,8 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "user_distribute ud left join user u on u.id = ud.user_id")
+@SearchBean(tables = "user_distribute ud left join user u on u.id = ud.user_id",
+where = "ud.deleted is true")
 public class UserDistributeViews {
 
 	@DbField("ud.id")
@@ -46,7 +47,7 @@ public class UserDistributeViews {
 	private BigDecimal gotMoney;
 
 	@DbField("u.points")
-	private Integer points;
+	private BigDecimal points;
 
 	@DbField("ud.created_time")
 	private Date createdTime;

+ 3 - 1
netflix-dao/src/main/resources/mapper/AppleOneDataMapper.xml

@@ -11,7 +11,9 @@
         sum(num_of_month_order) as num_of_month_order,
         sum(num_of_season_order) as num_of_season_order,
         sum(num_of_year_order) as num_of_year_order,
-        sum(num_of_code_order) as num_of_code_order
+        sum(num_of_code_order) as num_of_code_order,
+        sum(num_of_distribute_order) as numOfDistributeOrder,
+        sum(distribute_order_money) as distributeOrderMoney
         from `apple_one_data`
         <where>
             <if test="startDate != null">

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

@@ -19,7 +19,7 @@
     </select>
 
     <select id="getAppleOneOrderDons" resultType="com.cyksj.model.entity.OrderDon">
-        select distinct s.* from (select id,sku_id,user_id,money from `order_don`
+        select distinct s.* from (select id,sku_id,user_id,money,is_distribute from `order_don`
         where sku_id in
         <foreach collection="skuIds" item="item" open="(" separator="," close=")">
             #{item}

+ 3 - 1
netflix-dao/src/main/resources/mapper/StreamingAccountDataMapper.xml

@@ -12,7 +12,9 @@
                sum(num_of_month_order) as num_of_month_order,
                sum(num_of_season_order) as num_of_season_order,
                sum(num_of_year_order) as num_of_year_order,
-               sum(num_of_code_order) as num_of_code_order
+               sum(num_of_code_order) as num_of_code_order,
+               sum(num_of_distribute_order) as numOfDistributeOrder,
+               sum(distribute_order_money) as distributeOrderMoney
         from `streaming_account_data`
         <where>
             <if test="startDate != null">

+ 5 - 3
netflix-dao/src/main/resources/mapper/UserDistributeMapper.xml

@@ -6,8 +6,10 @@
         select count(*)
         from `user_distribute_shared` us
                  inner join `order_don` od
-                            on od.user_id = us.shared_id
-        where us.shar_id = #{userId}
-          and od.status not in ('close', 'noPayment', 'refund')
+                            on od.user_id = us.user_id
+                 inner join `distribute_waiting_send_points` dp
+                            on dp.order_id = od.id
+        where us.shared_id = #{userId}
+          and od.status not in ('close', 'noPayment')
     </select>
 </mapper>

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

@@ -32,7 +32,7 @@ public class DistributeServiceImpl implements DistributeService {
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertDistribute(UserDistributeReq userDistributeReq) {
-		UserDistribute exists = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeReq.getUserId()).last("limit 1"));
+		UserDistribute exists = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeReq.getUserId()).eq(UserDistribute::getDeleted, true).last("limit 1"));
 		if (exists != null) {
 			throw BusinessRuntimeException.getInstance("该推广者已添加");
 		}
@@ -46,7 +46,7 @@ public class DistributeServiceImpl implements DistributeService {
 				throw new BusinessRuntimeException("比例错误");
 			}
 			GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId());
-			if (goodsDon == null || goodsDon.getType() == 2) {
+			if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 2) {
 				throw new BusinessRuntimeException("平台错误");
 			}
 			rate.setDistributeId(userDistribute.getId());
@@ -68,7 +68,7 @@ public class DistributeServiceImpl implements DistributeService {
 				throw new BusinessRuntimeException("比例错误");
 			}
 			GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId());
-			if (goodsDon == null || goodsDon.getType() == 2) {
+			if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 2) {
 				throw new BusinessRuntimeException("平台错误");
 			}
 			rate.setDistributeId(userDistribute.getId());

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

@@ -181,22 +181,19 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 	 * @param backgroundDataView
 	 */
 	public void distribute(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
-		List<OrderDon> distributeOrders = Optional.ofNullable(orderDonService.list(Wrappers.lambdaQuery(OrderDon.class)
-				.eq(OrderDon::getIsDistribute, true)
-				.ge(ObjectUtil.isNotNull(startDate), OrderDon::getCreatedTime, startDate).le(ObjectUtil.isNotNull(endDate), OrderDon::getCreatedTime, endDate)
-				.select(OrderDon::getId, OrderDon::getMoney))).orElse(new ArrayList<>());
+		List<DistributeOrdersView> distributeOrders = Optional.ofNullable(beanSearcher.searchAll(DistributeOrdersView.class, MapUtils.builder()
+				.field(DistributeOrdersView::getCreatedTime, startDate, endDate).op(Operator.Between)
+				.build())).orElse(new ArrayList<>());
 		backgroundDataView.setDistributeOrders(distributeOrders.size());
 		//固定推广者订单
 		List<DistributeOrdersView> distributePopularizeOrders = Optional.ofNullable(beanSearcher.searchAll(DistributeOrdersView.class, MapUtils.builder()
-				.field(DistributeOrdersView::getStatus, StatisticsDataScheduler.noOrderStatus).op(Operator.NotIn)
-				.field(DistributeOrdersView::getUserId).op(Operator.NotNull)
+				.field(DistributeOrdersView::getIsFixedDistribute,true).op(Operator.Equal)
 				.field(DistributeOrdersView::getCreatedTime, startDate, endDate).op(Operator.Between)
 				.build())).orElse(new ArrayList<>());
 		backgroundDataView.setDistributePopularizeOrders(distributePopularizeOrders.size());
 		//普通分销单数
 		List<DistributeOrdersView> distributeOriginalOrders = Optional.ofNullable(beanSearcher.searchAll(DistributeOrdersView.class, MapUtils.builder()
-				.field(DistributeOrdersView::getStatus, StatisticsDataScheduler.noOrderStatus).op(Operator.NotIn)
-				.field(DistributeOrdersView::getUserId).op(Operator.IsNull)
+				.field(DistributeOrdersView::getIsFixedDistribute,false).op(Operator.Equal)
 				.field(DistributeOrdersView::getCreatedTime, startDate, endDate).op(Operator.Between)
 				.build())).orElse(new ArrayList<>());
 		backgroundDataView.setDistributeOriginalOrders(distributeOriginalOrders.size());
@@ -205,20 +202,20 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		//普通分销订单金额
 		Optional<BigDecimal> originalMoney = distributeOriginalOrders.stream().map(DistributeOrdersView::getMoney).reduce(BigDecimal::add);
 		backgroundDataView.setDistributePopularizeMoney(popularizeMoney.isPresent() ? popularizeMoney.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
-		backgroundDataView.setDistributeOriginalMoney(originalMoney.isPresent() ? popularizeMoney.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
+		backgroundDataView.setDistributeOriginalMoney(originalMoney.isPresent() ? originalMoney.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
 
 		List<DistributeMoneyApply> distributeMoneyApplies = Optional.ofNullable(beanSearcher.searchAll(DistributeMoneyApply.class, MapUtils.builder().field(DistributeMoneyApply::getCreatedTime, startDate, endDate).op(Operator.Between).build())).orElse(new ArrayList<>());
 		Map<DistributeMoneyApply.Status, List<DistributeMoneyApply>> collect = distributeMoneyApplies.stream().collect(Collectors.groupingBy(DistributeMoneyApply::getVerifyStatus));
 		collect.forEach((k, v) -> {
-			if (DistributeMoneyApply.Status.Fail.name().equals(k)) {
+			if (DistributeMoneyApply.Status.fail == k) {
 				return;
 			}
 			Optional<BigDecimal> reduce = v.stream().map(DistributeMoneyApply::getMoney).reduce(BigDecimal::add);
 			BigDecimal money = reduce.isPresent() ? reduce.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO;
-			if (DistributeMoneyApply.Status.Success.name().equals(k)) {
+			if (DistributeMoneyApply.Status.success == k) {
 				backgroundDataView.setDistributeGotMoney(money);
 			}
-			if (DistributeMoneyApply.Status.Verifying.name().equals(k)) {
+			if (DistributeMoneyApply.Status.verifying == k) {
 				backgroundDataView.setDistributeVerifyingMoney(money);
 			}
 		});

+ 25 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -226,6 +226,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, user.getId()).last("limit 1"));
 			if (userDistributeShared != null) {
 				orderDon.setIsDistribute(true);
+				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()));
+				if (userDistribute != null) {
+					orderDon.setIsFixedDistribute(true);
+				}
 			}
 		}
 		this.saveOrUpdate(orderDon);
@@ -490,6 +494,13 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setStatus(OrderDon.Status.noPayment);
 		orderDon.setUserId(user.getId());
 		orderDon.setGoodsId(goodsDon.getId());
+		//虚拟商品订单,是否是分销订单
+		if (goodsDon.getType() == 1) {
+			UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, user.getId()).last("limit 1"));
+			if (userDistributeShared != null) {
+				orderDon.setIsDistribute(true);
+			}
+		}
 		this.saveOrUpdate(orderDon);
 
 		jobManager.addJob(EXPIRY_TIME, () -> {
@@ -602,6 +613,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//修改订单状态
 		orderDon.setStatus(OrderDon.Status.refund);
 		orderDon.setRefundMoney(wxOrderRefundReq.getRefundMoney());
+		if (orderDon.getIsDistribute()) {
+			distributeWaitingSendPointsMapper.updateOrderStatus(orderDon.getId(), DistributeWaitingSendPoints.Status.close);
+		}
 		orderDonMapper.updateById(orderDon);
 		//记录退款信息
 		final String outNo = outRefundNo;
@@ -667,6 +681,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				AliPayRefundRep.AlipayTradeRefundResponse res = aliPayRefundRep.getResponse();
 				orderDon.setRefundMoney(res.getRefundFee().multiply(BigDecimal.valueOf(100)));
 			} else orderDon.setRefundMoney(BigDecimal.ZERO);
+			if (orderDon.getIsDistribute()) {
+				distributeWaitingSendPointsMapper.updateOrderStatus(orderDon.getId(), DistributeWaitingSendPoints.Status.close);
+			}
 			orderDonMapper.updateById(orderDon);
 			//记录退款信息
 			THREAD_POOL_TASK_EXECUTOR.execute(()->{
@@ -789,6 +806,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setRefundMoney(refundMoney);
 			orderDonMapper.updateById(orderDon);
 		}
+		if (orderDon.getIsDistribute()) {
+			DistributeWaitingSendPoints distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId()).last("limit 1"));
+			if (distributeWaitingSendPoints != null && distributeWaitingSendPoints.getSendStatus() != DistributeWaitingSendPoints.Status.close) {
+				distributeWaitingSendPointsMapper.updateOrderStatus(orderDon.getId(), DistributeWaitingSendPoints.Status.close);
+			}
+		}
 		log.info("微信退款: 退款单号[{}] 退款成功.", outRefundNo);
 	}
 
@@ -979,7 +1002,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				log.info("分销兑换积分比例未配置");
 			} else {
 				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()).eq(UserDistribute::getDeleted, true).last("limit 1"));
-				if (userDistributeShared == null) {
+				if (userDistribute == null) {
 					//普通分销
 					GoodsDon goodsDon = goodsDonMapper.selectById(order.getGoodsId());
 					if (goodsDon != null) {
@@ -1001,7 +1024,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 				distributeWaitingSendPoints.setPoints(points);
 				if (points != null && points.compareTo(BigDecimal.ZERO) > 0) {
-					log.info("用户{}邀请{},产生分销订单分发积分记录入库", userDistribute.getUserId(), order.getUserId());
+					log.info("用户{}邀请{},产生分销订单分发积分记录入库", userDistributeShared.getUserId(), order.getUserId());
 					distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.waiting);
 					distributeWaitingSendPoints.setSendTime(DateUtil.offsetDay(order.getPayTime(), 7));
 					distributeWaitingSendPointsMapper.insert(distributeWaitingSendPoints);

+ 19 - 11
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -66,7 +66,7 @@ public class Scheduler {
     /**
      * 每5分钟清理过期账号
      */
-//    @Scheduled(cron = "0 0/5 * * * ?")
+    @Scheduled(cron = "0 0/5 * * * ?")
     @Transactional(rollbackFor = Throwable.class)
     public void clearExpiry() {
         DateTime now = new DateTime();
@@ -157,7 +157,7 @@ public class Scheduler {
     /**
      * 定时关闭订单
      */
-//    @Scheduled(cron = "0 0/5 * * * ?")
+    @Scheduled(cron = "0 0/5 * * * ?")
     public void closeOrder() {
         //获取为支付订单
         DateTime now = new DateTime();
@@ -204,27 +204,35 @@ public class Scheduler {
     public void distributeOrdersSendPoints() {
         List<DistributeWaitingSendPoints> waitingSendPoints = Optional.ofNullable(distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
                 .eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting)
-                .gt(DistributeWaitingSendPoints::getSendTime, DateTime.now())
+                .lt(DistributeWaitingSendPoints::getSendTime, DateTime.now())
                 .select(DistributeWaitingSendPoints::getId,
                         DistributeWaitingSendPoints::getOrderId,
                         DistributeWaitingSendPoints::getPoints,
                         DistributeWaitingSendPoints::getUserId,
                         DistributeWaitingSendPoints::getSendTime))).orElse(new ArrayList<>());
         log.info("查询分销订单积分分发记录开始,条数:{}=======》", waitingSendPoints.size());
-        waitingSendPoints.forEach(wait->{
-            Long userId = wait.getUserId();
-            User user = userMapper.selectById(userId);
+        waitingSendPoints.forEach(wait -> {
+            //积分待发人
+            Long sharedId = wait.getSharedId();
+            User user = userMapper.selectById(sharedId);
             if (user == null) {
                 wait.setSendStatus(DistributeWaitingSendPoints.Status.not_exist);
                 log.info("分销订单,发送积分用户不存在");
                 distributeWaitingSendPointsMapper.updateById(wait);
-            }else {
+            } else {
                 wait.setSendStatus(DistributeWaitingSendPoints.Status.success);
                 log.info("更新用户积分开始=====>");
-                Integer update = userMapper.addPoints(user.getId(), wait.getPoints());
-                if (update == 1) {
-                    distributeWaitingSendPointsMapper.updateById(wait);
-                    log.info("分销积分表订单id:{}发放积分success", wait.getOrderId());
+                while (true) {
+                    user = userMapper.selectById(sharedId);
+                    if (user == null) {
+                        break;
+                    }
+                    Integer update = userMapper.updatePoints(user.getId(), wait.getPoints(), user.getPoints());
+                    if (update == 1) {
+                        distributeWaitingSendPointsMapper.updateById(wait);
+                        log.info("分销积分表订单id:{}发放积分success", wait.getOrderId());
+                        break;
+                    }
                 }
             }
         });

+ 1 - 3
netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java

@@ -50,9 +50,7 @@ public class StatisticsDataScheduler {
 	public static List<String> noOrderStatus = List.of("close", "noPayment");
 
 	public static List<String> payType = List.of("月", "季", "年");
-
-	private final static List<String> APPLE_ONE_AREA = List.of("美区", "马来西亚区");
-
+	
 	private static Long DAY_MILLS = 86400000l;
 
 	private final GoodsDonMapper goodsDonMapper;

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

@@ -46,8 +46,8 @@ public class CmsUserController{
             if (userView.getSharedId() != null) {
                 User user = userMapper.selectById(userView.getSharedId());
                 if (user != null) {
-                    userView.setSharNickName(user.getNickname());
-                    userView.setSharHeadimgurl(user.getHeadimgurl());
+                    userView.setSharedNickName(user.getNickname());
+                    userView.setSharedHeadimgurl(user.getHeadimgurl());
                 }
             }
         });

+ 88 - 23
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -7,28 +7,31 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
 import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
-import com.cyksj.model.entity.DistributeMoneyApply;
-import com.cyksj.model.entity.DistributePointsExchangeMoney;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.UserPlatDistributeRate;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
 import com.cyksj.model.request.UserDistributeReq;
 import com.cyksj.model.views.DistributeMoneyApplyView;
 import com.cyksj.model.views.MoneyApplyView;
+import com.cyksj.model.views.UserDistributeView;
 import com.cyksj.model.views.UserDistributeViews;
 import com.cyksj.service.distribute.DistributeService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
 import java.util.Optional;
 
@@ -41,6 +44,7 @@ import java.util.Optional;
 @RestController
 @RequestMapping("/manage/distribute")
 @RequiredArgsConstructor
+@Slf4j
 public class DistributeController {
 
 	private final DistributeService distributeService;
@@ -57,6 +61,8 @@ public class DistributeController {
 
 	private final GoodsDonMapper goodsDonMapper;
 
+	private final UserMapper userMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -87,23 +93,34 @@ public class DistributeController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
 	}
 
+	/**
+	 * 固定推广者详情
+	 */
+	@GetMapping("/get/detail/{id}")
+	public Result<List<UserDistributeView>> getDetailById(@PathVariable Long id) {
+		return GatewayResponse.SUCCESS.newBuilder().toResult(beanSearcher.searchAll(UserDistributeView.class, MapUtils.builder()
+				.field(UserDistributeView::getDistribute_id, id).op(Operator.Equal)
+				.orderBy(UserDistributeView::getGoodsId).asc()
+				.build()));
+	}
+
 	/**
 	 * 固定推广者列表
 	 */
 	@GetMapping
-	public SearchResult<UserDistributeViews> distributeList(HttpServletRequest request) {
+	public Result<SearchResult<UserDistributeViews>> distributeList(HttpServletRequest request) {
 		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		DistributePointsExchangeMoney pointsMoneyRate = distributePointsExchangeMoneyMapper.selectOne(null);
-		Optional.ofNullable(search.getDataList()).ifPresent(list->list.forEach(view->{
-			Integer num = view.getPoints() / pointsMoneyRate.getPoints();
-			view.setAvailableMoney(pointsMoneyRate.getMoney().multiply(new BigDecimal(num)));
-			List<DistributeMoneyApply> moneyApplies = distributeMoneyApplyMapper.selectList(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.Success).eq(DistributeMoneyApply::getUserId, view.getUserId()).select(DistributeMoneyApply::getMoney));
+		Optional.ofNullable(search.getDataList()).ifPresent(list -> list.forEach(view -> {
+			BigDecimal num = view.getPoints().divide(BigDecimal.valueOf(pointsMoneyRate.getPoints()), RoundingMode.DOWN);
+			view.setAvailableMoney(pointsMoneyRate.getMoney().multiply(num));
+			List<DistributeMoneyApply> moneyApplies = distributeMoneyApplyMapper.selectList(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success).eq(DistributeMoneyApply::getUserId, view.getUserId()).select(DistributeMoneyApply::getMoney));
 			Optional<BigDecimal> money = moneyApplies.stream().map(apply -> apply.getMoney()).reduce(BigDecimal::add);
 			view.setGotMoney(money.isPresent() ? money.get() : BigDecimal.ZERO);
 			Integer orders = userDistributeMapper.count(view.getUserId());
 			view.setOrders(orders);
 		}));
-		return search;
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
 	/**
@@ -111,7 +128,7 @@ public class DistributeController {
 	 */
 	@GetMapping("/get/plat")
 	public Result<List<GoodsDon>> getGoodsDistributeRate() {
-		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getType, 1).select(GoodsDon::getId, GoodsDon::getTitle, GoodsDon::getRate)));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getType, 1).eq(GoodsDon::getDeleted, true).orderByAsc(GoodsDon::getId).select(GoodsDon::getId, GoodsDon::getTitle, GoodsDon::getRate)));
 	}
 
 	/**
@@ -120,7 +137,7 @@ public class DistributeController {
 	@PutMapping("/put/goods/rate")
 	public Result<String> editGoodsDistributeRate(@RequestBody UserDistributeReq userDistributeReq) {
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
-			if (rate.getRate() <0 || rate.getRate() > 100) {
+			if (rate.getRate() < 0 || rate.getRate() > 100) {
 				throw new BusinessRuntimeException("比例错误");
 			}
 			GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId());
@@ -134,40 +151,88 @@ public class DistributeController {
 	}
 
 	/**
-	 * 提现列表
+	 * 提现title
 	 */
-	@GetMapping("/get/applyMoney/list")
-	public Result<MoneyApplyView> applyMoneyList(HttpServletRequest request) {
+	@GetMapping("/get/applyMoney/title")
+	public Result<MoneyApplyView> applyMoneyTitle() {
 		MoneyApplyView moneyApplyView = new MoneyApplyView();
-		SearchResult<DistributeMoneyApplyView> search = beanSearcher.search(DistributeMoneyApplyView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		moneyApplyView.setDetails(search.getDataList());
-		List<DistributeMoneyApply> distributeMoneyApplies = distributeMoneyApplyMapper.selectList(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.Success).select(DistributeMoneyApply::getMoney));
+		moneyApplyView.setThreshold(distributePointsExchangeMoneyMapper.selectOne(null));
+		List<DistributeMoneyApply> distributeMoneyApplies = distributeMoneyApplyMapper.selectList(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success).select(DistributeMoneyApply::getMoney));
 		Optional<BigDecimal> reduce = distributeMoneyApplies.stream().map(DistributeMoneyApply::getMoney).reduce(BigDecimal::add);
 		moneyApplyView.setGotMoney(reduce.isPresent() ? reduce.get() : BigDecimal.ZERO);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(moneyApplyView);
 	}
 
+	/**
+	 * 提现列表
+	 */
+	@GetMapping("/get/applyMoney/list")
+	public Result<SearchResult<DistributeMoneyApplyView>> applyMoneyList(HttpServletRequest request) {
+		SearchResult<DistributeMoneyApplyView> search = beanSearcher.search(DistributeMoneyApplyView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
 	/**
 	 * 提现审核
 	 */
 	@PutMapping("/verify/applyMoney")
-	public Result<String> verifyApplyMoney(@RequestBody @NotNull DistributeApplyMoneyReq distributeApplyMoneyReq) {
+	public Result<String> verifyApplyMoney(@RequestBody @Validated DistributeApplyMoneyReq distributeApplyMoneyReq) {
 		DistributeMoneyApply.Status status = DistributeMoneyApply.Status.checkStatus(distributeApplyMoneyReq.getVerifyStatus());
-		if (status == null) {
+		if (status == null || status == DistributeMoneyApply.Status.verifying) {
 			throw BusinessRuntimeException.getInstance("审核状态错误");
 		}
 		DistributeMoneyApply distributeMoneyApply = distributeMoneyApplyMapper.selectById(distributeApplyMoneyReq.getId());
 		if (distributeMoneyApply == null) {
 			throw BusinessRuntimeException.getInstance("提现记录不存在");
 		}
-		if (distributeMoneyApply.getVerifyStatus() != DistributeMoneyApply.Status.Verifying) {
+		if (distributeMoneyApply.getVerifyStatus() != DistributeMoneyApply.Status.verifying) {
 			throw BusinessRuntimeException.getInstance("该提现记录已处理,无法再进行审核");
 		}
 		distributeMoneyApply.setVerifyStatus(status);
-		if (DistributeMoneyApply.Status.Fail.name().equals(distributeApplyMoneyReq.getVerifyStatus()) && StrUtil.isEmpty(distributeApplyMoneyReq.getReason())) {
+		if (DistributeMoneyApply.Status.fail.name().equals(distributeApplyMoneyReq.getVerifyStatus()) && StrUtil.isEmpty(distributeApplyMoneyReq.getReason())) {
 			throw BusinessRuntimeException.getInstance("拒绝原因为空");
 		}
+		if (DistributeMoneyApply.Status.fail.name().equals(distributeApplyMoneyReq.getVerifyStatus())) {
+			distributeMoneyApply.setReason(distributeApplyMoneyReq.getReason());
+			while (true) {
+				User user = userMapper.selectById(distributeMoneyApply.getUserId());
+				if (user == null) {
+					break;
+				}
+				BigDecimal points = user.getPoints();
+				Integer update = userMapper.updatePoints(user.getId(), points, distributeMoneyApply.getPoints());
+				if (update == 1) {
+					log.info("归还积分:{}至用户{}结束", distributeMoneyApply.getPoints(), user.getId());
+					break;
+				}
+			}
+		}
+		if (DistributeMoneyApply.Status.success.name().equals(distributeApplyMoneyReq.getVerifyStatus())) {
+			if (StrUtil.isBlank(distributeApplyMoneyReq.getImg())) {
+				throw BusinessRuntimeException.getInstance("审核成功时,打款图片不存在");
+			}
+			distributeMoneyApply.setImg(distributeApplyMoneyReq.getImg());
+		}
 		distributeMoneyApplyMapper.updateById(distributeMoneyApply);
 		return GatewayResponse.SUCCESS.newBuilder().toResult("审核操作成功");
 	}
-}
+
+	/**
+	 * 审核成功,编辑打款截图
+	 */
+	@PutMapping("/verify/applyMoney/img")
+	public Result<String> putApplyMoneyImg(@RequestBody @Validated DistributeApplyMoneyReq distributeApplyMoneyReq) {
+		DistributeMoneyApply entity = distributeMoneyApplyMapper.selectById(distributeApplyMoneyReq.getId());
+		if (entity == null || entity.getVerifyStatus() != DistributeMoneyApply.Status.success) {
+			throw BusinessRuntimeException.getInstance("审核记录错误");
+		}
+		if (StrUtil.isBlank(distributeApplyMoneyReq.getImg())) {
+			throw BusinessRuntimeException.getInstance("打款截图为空");
+		}
+		DistributeMoneyApply apply = new DistributeMoneyApply();
+		apply.setImg(distributeApplyMoneyReq.getImg());
+		apply.setId(distributeApplyMoneyReq.getId());
+		distributeMoneyApplyMapper.updateById(apply);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
+	}
+}

+ 22 - 3
netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

@@ -19,12 +19,14 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.mapper.WxAppMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.dto.AuthToken;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.JsSdkTicket;
 import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserDistributeShared;
 import com.cyksj.model.request.LoginPhoneReq;
 import com.cyksj.model.response.LoginPhoneRep;
 import com.cyksj.redis.RedisService;
@@ -36,6 +38,7 @@ import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
@@ -83,10 +86,10 @@ public class AuthorizationController {
 
     private final PhoneCodeMapper phoneCodeMapper;
 
-
+    private final UserDistributeSharedMapper userDistributeSharedMapper;
 
     @GetMapping(value = "/weChat")
-    public void base(String url,Long shared, String authType, HttpServletResponse response) throws Exception {
+    public void base(String url,Long sharedId, String authType, HttpServletResponse response) throws Exception {
 
         log.info("微信授权转跳. url: {},authType:{}",url,authType);
 
@@ -96,7 +99,7 @@ public class AuthorizationController {
 
         Long mappingId = SEQUENCE.nextId();
         redisService.set(mappingId.toString(),url,60*60*24L);
-        AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId).setSharedId(shared);
+        AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId).setSharedId(sharedId);
         String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
 
         response.sendRedirect(authorizationService.createUrl(state,authType));
@@ -309,6 +312,8 @@ public class AuthorizationController {
         }
         //保存用户信息
         User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getLoginPhone, loginPhoneReq.getPhone()).last("limit 1"));
+        UserDistributeShared userDistributeShared = null;
+        Long sharedId = loginPhoneReq.getSharedId();
         if (user == null) {
             user = new User();
             user.setLoginPhone(loginPhoneReq.getPhone());
@@ -316,10 +321,24 @@ public class AuthorizationController {
             //默认头像
             user.setHeadimgurl("https://cdn.sxfoundation.com/picture/f6ee11101c4f5f0bc48d88aca7a5dbfd-1666945673391.png");
             userService.save(user);
+            //新用户分销
+            if (sharedId != null) {
+                userDistributeShared = new UserDistributeShared();
+                userDistributeShared.setSharedId(loginPhoneReq.getSharedId());
+            }
         }
         //写回登陆信息
         StpUserUtil.login(user.getId());
         LoginPhoneRep loginPhoneRep = new LoginPhoneRep(StpUserUtil.getTokenValue(), user.getId(), user.getNickname(), user.getHeadimgurl());
+        //存在分销
+        if (userDistributeShared != null) {
+            userDistributeShared.setUserId(user.getId());
+            try {
+                userDistributeSharedMapper.insert(userDistributeShared);
+            } catch (DuplicateKeyException e) {
+                log.info("分销被邀请人重复插入");
+            }
+        }
         return GatewayResponse.SUCCESS.newBuilder().toResult(loginPhoneRep);
     }
 }

+ 89 - 23
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -1,5 +1,8 @@
 package com.cyksj.web.controller.user;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.qrcode.QrCodeUtil;
 import cn.hutool.extra.qrcode.QrConfig;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -13,12 +16,14 @@ import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
 import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper;
+import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ApplyMoneyReq;
 import com.cyksj.model.views.DistributeMoneyApplyView;
-import com.cyksj.model.views.DistributeOrdersView;
 import com.cyksj.model.views.DistributePopularizeOrdersView;
 import com.cyksj.model.views.DistributePopularizeView;
-import com.cyksj.redis.RedisService;
+import com.cyksj.model.views.UserDistributeView;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -26,13 +31,13 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.List;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -59,31 +64,40 @@ public class DistributePopularizeController {
 
 	private final DistributeMoneyApplyMapper distributeMoneyApplyMapper;
 
-	private final RedisService redisService;
+	private final UserDistributeMapper userDistributeMapper;
+
+	private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper;
 
 	/**
 	 * 推广订单明细
 	 */
 	@GetMapping("/orders/detail")
-	public SearchResult<DistributePopularizeOrdersView> getOrdersView() {
+	public Result<SearchResult<DistributePopularizeOrdersView>> getOrdersView(HttpServletRequest request) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		SearchResult<DistributePopularizeOrdersView> search = beanSearcher.search(DistributePopularizeOrdersView.class,
-				MapUtils.builder().field(DistributePopularizeOrdersView::getSharedId, userId).build());
+				MapUtils.flatBuilder(request.getParameterMap())
+						.field(DistributePopularizeOrdersView::getSharedId, userId)
+						.build());
 		search.getDataList().forEach(data -> {
 			GoodsDon goodsDon = goodsDonMapper.selectById(data.getGoodsId());
 			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(data.getSkuId());
 			data.setGoodsTitle(goodsDon.getTitle());
 			data.setSpecVal(goodsDonSku.getSpecVal());
 		});
-		return search;
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
 	/**
 	 * 提现明细
 	 */
 	@GetMapping("/applyMoney/detail")
-	public SearchResult<DistributeMoneyApplyView> getApplyMoneyView() {
-		return beanSearcher.search(DistributeMoneyApplyView.class, null);
+	public Result<SearchResult<DistributeMoneyApplyView>> getApplyMoneyView(HttpServletRequest request) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		SearchResult<DistributeMoneyApplyView> search = beanSearcher.search(DistributeMoneyApplyView.class,
+				MapUtils.flatBuilder(request.getParameterMap())
+						.field(DistributeMoneyApplyView::getUserId, userId).op(Operator.Equal)
+						.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
 	/**
@@ -94,12 +108,35 @@ public class DistributePopularizeController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		DistributePopularizeView distributePopularizeView = new DistributePopularizeView();
 		String domain = envCommonService.getHost();
-		distributePopularizeView.setUrl(String.format("https://%s/8081/api/auth/weChat?url=https://%s/yinhe/web?sharedId=%s", domain, domain, userId));
+//		distributePopularizeView.setUrl(String.format("https://%s/8081/api/auth/weChat?url=https://%s/yinhe/web&sharedId=%s", domain, domain, userId));
+		distributePopularizeView.setUrl(String.format("https://%s/yinhe/web?sharedId=%s", domain, userId));
 		distributePopularizeView.setUrlCode(QrCodeUtil.generateAsBase64(distributePopularizeView.getUrl(), QrConfig.create(), "png"));
 		User user = userMapper.selectById(userId);
 		distributePopularizeView.setGotPoints(user.getPoints());
-		Number number = beanSearcher.searchCount(DistributeOrdersView.class, MapUtils.builder().field(DistributeOrdersView::getUserId, userId).op(Operator.Equal).build());
-		distributePopularizeView.setDistributeOrders(number.intValue());
+		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"));
+		if (userDistribute != null) {
+			//是否是固定推广者
+			UserDistributeView userDistributeView = beanSearcher.searchFirst(UserDistributeView.class, MapUtils.builder()
+					.field(UserDistributeView::getDistribute_id, userDistribute.getId()).op(Operator.Equal)
+					.orderBy(UserDistributeView::getRate).desc()
+					.build());
+			//最高平台比例
+			distributePopularizeView.setHighestRate(userDistributeView.getRate());
+		}else {
+			GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).orderByDesc(GoodsDon::getRate).select(GoodsDon::getRate).last("limit 1"));
+			distributePopularizeView.setHighestRate(goodsDon.getRate());
+		}
+		List<DistributeWaitingSendPoints> distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting).eq(DistributeWaitingSendPoints::getSharedId, userId).select(DistributeWaitingSendPoints::getPoints));
+		BigDecimal waitingPoints = BigDecimal.ZERO;
+		if (!distributeWaitingSendPoints.isEmpty()) {
+			Optional<BigDecimal> points = distributeWaitingSendPoints.stream().map(DistributeWaitingSendPoints::getPoints).reduce(BigDecimal::add);
+			if (points.isPresent()) {
+				waitingPoints = points.get();
+			}
+		}
+		distributePopularizeView.setWaitingSendPoints(waitingPoints);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(distributePopularizeView);
 	}
 
@@ -109,29 +146,58 @@ public class DistributePopularizeController {
 	@NoSubmit
 	@PostMapping("/post/applyMoney")
 	@Transactional(rollbackFor = Throwable.class)
-	public Result<String> applyMoney() {
+	public Result<Integer> applyMoney(@RequestBody ApplyMoneyReq applyMoneyReq) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		User user = userMapper.selectById(userId);
 		if (user == null) {
 			throw BusinessRuntimeException.getInstance("请先授权登录");
 		}
+		if (ObjectUtil.hasEmpty(applyMoneyReq.getAccount(), applyMoneyReq.getRealName())) {
+			throw BusinessRuntimeException.getInstance("必填项不能为空");
+		}
 		DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1"));
+		BigDecimal minPoints = BigDecimal.valueOf(distributePointsExchangeMoney.getMinPoints());
 		BigDecimal min = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints());
-		if (user.getPoints().compareTo(min) < 0) {
-			throw BusinessRuntimeException.getInstance("您当前积分不够,无法提现");
+		if (user.getPoints().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 = user.getPoints().divide(min, RoundingMode.DOWN);
-		int points = min.multiply(num).intValue();
+		BigDecimal points = min.multiply(num);
 		Integer update = userMapper.subPoints(user.getId(), points);
 		if (update == 1) {
 			DistributeMoneyApply distributeMoneyApply = new DistributeMoneyApply();
 			distributeMoneyApply.setUserId(userId);
 			distributeMoneyApply.setPoints(points);
 			distributeMoneyApply.setMoney(num.multiply(distributePointsExchangeMoney.getMoney()));
-			distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.Verifying);
+			distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.verifying);
+			distributeMoneyApply.setAccount(applyMoneyReq.getAccount());
+			distributeMoneyApply.setRealName(applyMoneyReq.getRealName());
 			distributeMoneyApplyMapper.insert(distributeMoneyApply);
-			return GatewayResponse.SUCCESS.newBuilder().toResult("申请提现成功,待客服审核打款");
+			return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply.getMoney().intValue());
 		}
-		return GatewayResponse.SUCCESS.newBuilder().toResult("系统异常,请重新提交提现申请");
+		throw BusinessRuntimeException.getInstance("系统异常,请重新提交提现申请");
+	}
+
+	/**
+	 * 获取积分兑换门槛
+	 */
+	@GetMapping("/applyMoney/threshold")
+	public Result<DistributePointsExchangeMoney> getThreshold() {
+		return GatewayResponse.SUCCESS.newBuilder().toResult(distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).last("limit 1")));
+	}
+
+	/**
+	 * 提现缓存数据
+	 */
+	@GetMapping("/get/applyMoney/detail")
+	public Result<DistributeMoneyApply> getLastApplyDetail() {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		DistributeMoneyApply apply = distributeMoneyApplyMapper.selectOne(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getUserId, userId).orderByDesc(DistributeMoneyApply::getId).last("limit 1"));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(apply);
 	}
-}
+}

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

@@ -1 +1 @@
-spring:
  profiles:
    active: dev
    
+spring:
  profiles:
    active:
      - ${activeProfile}