zoujiajian 1 vuosi sitten
vanhempi
sitoutus
3e11f1981f
36 muutettua tiedostoa jossa 466 lisäystä ja 136 poistoa
  1. 5 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/cps/UserDistributePopularizeMapper.java
  3. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributeWaitingSendPoints.java
  4. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
  5. 17 0
      netflix-dao/src/main/java/com/cyksj/model/entity/VipOrderDon.java
  6. 5 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSpuInsert.java
  7. 6 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/GoodsDonViewer.java
  8. 2 2
      netflix-dao/src/main/java/com/cyksj/model/response/VipUserPageResp.java
  9. 18 7
      netflix-dao/src/main/java/com/cyksj/model/views/CpsOrderView.java
  10. 5 4
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersDetailView.java
  11. 7 9
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersView.java
  12. 8 6
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePlatOrderDonBrokenLineView.java
  13. 9 9
      netflix-dao/src/main/java/com/cyksj/model/views/DistributePopularizeOrdersView.java
  14. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListCategoryView.java
  15. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  16. 10 8
      netflix-dao/src/main/java/com/cyksj/model/views/PersonDistributeBrokenLineView.java
  17. 7 11
      netflix-dao/src/main/java/com/cyksj/model/views/RegisterDistributeOrdersDetailView.java
  18. 11 10
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeOrdersDetailView.java
  19. 9 8
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeOrdersStatisticsView.java
  20. 12 11
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  21. 16 12
      netflix-dao/src/main/resources/mapper/UserDistributeMapper.xml
  22. 18 0
      netflix-dao/src/main/resources/mapper/UserDistributePopularizeMapper.xml
  23. 2 0
      netflix-service/src/main/java/com/cyksj/service/cps/CpsPopularizeService.java
  24. 6 0
      netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsPopularizeServiceImpl.java
  25. 1 1
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  26. 2 2
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  27. 100 8
      netflix-service/src/main/java/com/cyksj/service/mange/vip/impl/CmsVipOrderServiceImpl.java
  28. 128 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/VipOrderDonServiceImpl.java
  29. 1 1
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  30. 1 1
      netflix-service/src/main/java/com/cyksj/service/vip/VipFrontService.java
  31. 4 1
      netflix-service/src/main/java/com/cyksj/service/vip/impl/VipFrontServiceImpl.java
  32. 11 13
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java
  33. 18 1
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsPopularizeController.java
  34. 7 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  35. 5 3
      netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java
  36. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/vip/VipController.java

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

@@ -601,4 +601,9 @@ public interface Constant {
 	 * VIP title
 	 */
 	String VIP_TITLE = "银河超级AI会员";
+
+	/**
+	 * 会员关联订单
+	 */
+	Long VIP_RELATE_GOODS_ID = 98L;
 }

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

@@ -13,4 +13,6 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface UserDistributePopularizeMapper extends BaseMapper<UserDistributePopularize> {
 	UserDistributePopularizeView getDefaultPopularizeDetail(@Param("cpsUserId") long cpsUserId, @Param("start") String start, @Param("end") String end);
+
+	UserDistributePopularizeView getVipPopularizeDetail(@Param("cpsPopularizeId") Long cpsPopularizeId, @Param("start") String start, @Param("end") String end);
 }

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

@@ -82,6 +82,11 @@ public class DistributeWaitingSendPoints extends BaseEntity{
 	 */
 	private Boolean isSpecialEp;
 
+	/**
+	 * 是否是会员分销
+	 */
+	private Boolean isVip;
+
 	@Getter
 	public enum Status{
 		close("分销订单关闭,积分奖励不分发"),

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

@@ -59,6 +59,11 @@ public class GoodsDon extends BaseEntity {
      */
     private Boolean status;
 
+    /**
+     * 是否隐藏
+     */
+    private Boolean isHide;
+
     /**
      * true 存在 / false 删除
      */

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

@@ -21,6 +21,13 @@ import java.util.Date;
 @Setter
 public class VipOrderDon extends BaseEntity{
 
+	private Long goodsId;
+
+	/**
+	 * cps后台推广id
+	 */
+	private Long cpsPopularizeId;
+
 	/** 订单号 */
 	private String orderNo ;
 
@@ -85,6 +92,16 @@ public class VipOrderDon extends BaseEntity{
 	 */
 	private Integer orderType;
 
+	/**
+	 * 是否是分销订单
+	 */
+	private Boolean isDistribute;
+
+	/**
+	 * 是否是固定推广者分销
+	 */
+	private Boolean isFixedDistribute;
+
 	/**
 	 * 支付时间
 	 */

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

@@ -154,4 +154,9 @@ public class ReqGoodsSpuInsert {
     private Boolean isDistribute;
 
     private Boolean isSkuDistribute;
+
+    /**
+     * 是否隐藏
+     */
+    private Boolean isHide;
 }

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

@@ -67,6 +67,12 @@ public class GoodsDonViewer {
     @DbField("g.status")
     private Boolean status;
 
+    /**
+     * 是否隐藏
+     */
+    @DbField("g.is_hide")
+    private Boolean isHide;
+
     /**
      * true 存在 / false 删除
      */

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/model/response/VipUserPageResp.java

@@ -20,12 +20,12 @@ public class VipUserPageResp {
 	/**
 	 * 可抵扣金额
 	 */
-	private BigDecimal deductMoney;
+	private BigDecimal deductMoney = BigDecimal.ZERO;
 
 	/**
 	 * vip 费用
 	 */
-	private BigDecimal vipFee;
+	private BigDecimal vipFee = BigDecimal.ZERO;
 
 	/**
 	 * 关联skus

+ 18 - 7
netflix-dao/src/main/java/com/cyksj/model/views/CpsOrderView.java

@@ -15,26 +15,37 @@ import java.math.BigDecimal;
  */
 @Getter
 @Setter
-@SearchBean(tables = "(select o.id,o.goods_id,o.money,o.is_dp,o.ori_money,o.created_time from order_don o inner join (select user_id from user_distribute_shared where :sharedId:) us on us.user_id = o.user_id where o.is_fixed_distribute is true and o.status not in ('close','noPayment') :time:) od left join goods_don g on g.id = od.goods_id" +
-		" inner join distribute_waiting_send_points dp on dp.order_id = od.id",
-		groupBy = "od.goods_id,g.title,date_format(od.created_time,'%Y-%m-%d')")
+@SearchBean(tables = "distribute_waiting_send_points dw left join order_don od on od.id = dw.order_id and dw.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true" +
+		" left join goods_don g on g.id = ifnull(od.goods_id,vod.goods_id)"
+		, where = ":userId: and dw.send_status not in ('not_exist','close')"
+		, groupBy = "g.id,g.title,date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d')")
 public class CpsOrderView {
 
-	@DbField("od.goods_id")
+	@DbField("g.id")
 	private Long goodsId;
 
+	/**
+	 * 平台名称
+	 */
 	@DbField("g.title")
 	private String title;
 
-	@DbField("cast(sum(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100 as decimal(10,2))")
+	/**
+	 * 当前日期订单金额
+	 */
+	@DbField("cast(sum(if(od.id is null,vod.money,if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100) as decimal(10,2))")
 	private BigDecimal distributeOrderMoney;
 
-	@DbField("count(od.id)")
+	/**
+	 * 当前日期订单数
+	 */
+	@DbField("count(dw.order_id)")
 	private Integer orders;
 
 	/**
 	 * 日期
 	 */
-	@DbField("date_format(od.created_time,'%Y-%m-%d')")
+	@DbField("date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d')")
 	private String date;
 }

+ 5 - 4
netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersDetailView.java

@@ -18,9 +18,10 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "distribute_waiting_send_points dp inner join order_don od on od.id = dp.order_id" +
+@SearchBean(tables = "distribute_waiting_send_points dp left join order_don od on od.id = dp.order_id and dp.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dp.order_id and dp.is_vip = true" +
 		" inner join user u on u.id = dp.user_id" +
-		" left join goods_don gd on gd.id = od.goods_id")
+		" left join goods_don gd on gd.id = ifnull(od.goods_id,vod.goods_id)")
 public class DistributeOrdersDetailView {
 	@DbField("u.nickname")
 	private String nickname;
@@ -38,10 +39,10 @@ public class DistributeOrdersDetailView {
 	@DbField("gd.title")
 	private String platform;
 
-	@DbField("if(od.is_dp and od.ori_money != 0,od.ori_money,od.money)")
+	@DbField("if(od.id is null,vod.money,if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))")
 	private BigDecimal money;
 
-	@DbField("od.created_time")
+	@DbField("ifnull(od.created_time,vod.created_time)")
 	private Date orderTime;
 
 	@DbField("dp.points")

+ 7 - 9
netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersView.java

@@ -16,21 +16,19 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "order_don od inner 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','refund')")
+@SearchBean(tables = "distribute_waiting_send_points dp left join order_don od on dp.order_id = od.id and dp.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dp.order_id and dp.is_vip = true",
+		where = "ifnull(od.status,vod.status) not in ('close','noPayment','refund') :f:")
 public class DistributeOrdersView {
-	@DbField("od.id")
+	@DbField("dp.order_id")
 	private Long id;
 
-	@DbField("od.money")
+	@DbField("ifnull(od.money,vod.money)")
 	private BigDecimal money;
 
-	@DbField("od.status")
+	@DbField("ifnull(od.status,vod.status)")
 	private String status;
 
-	@DbField("od.is_fixed_distribute")
-	private Boolean isFixedDistribute;
-
-	@DbField("od.created_time")
+	@DbField("ifnull(od.created_time,vod.created_time)")
 	private Date createdTime;
 }

+ 8 - 6
netflix-dao/src/main/java/com/cyksj/model/views/DistributePlatOrderDonBrokenLineView.java

@@ -15,23 +15,25 @@ import java.math.BigDecimal;
  */
 @Getter
 @Setter
-@SearchBean(tables = "(select order_id from distribute_waiting_send_points dp :sid:) dp inner join order_don od on od.id = dp.order_id",
-		where = "od.status not in ('noPayment','close','refund')",
-		groupBy = "od.goods_id,:date:")
+@SearchBean(tables = "(select order_id,is_vip from distribute_waiting_send_points dp :sid:) dp left join order_don od on od.id = dp.order_id and dp.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dp.order_id and dp.is_vip = true" +
+		" left join goods_don g on g.id = ifnull(od.goods_id,vod.goods_id)",
+		where = "ifnull(od.status,vod.status) not in ('noPayment','close','refund')",
+		groupBy = "g.id,g.title,:date:")
 public class DistributePlatOrderDonBrokenLineView {
-	@DbField("od.goods_id")
+	@DbField("g.id")
 	private Long goodsId;
 
 	/**
 	 * 平台名称
 	 */
-	@DbField("select title from goods_don where id = od.goods_id")
+	@DbField("g.title")
 	private String goodsTitle;
 
 	/**
 	 * 当前日期订单金额
 	 */
-	@DbField("cast(sum(od.money)/100 as decimal(10,2))")
+	@DbField("cast(sum(ifnull(od.money,vod.money))/100 as decimal(10,2))")
 	private BigDecimal money;
 
 	/**

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

@@ -19,14 +19,14 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "distribute_waiting_send_points dw left join order_don od on od.id = dw.order_id" +
-		" left join user u on u.id = od.user_id ",
-		where = "od.is_distribute is true")
+@SearchBean(tables = "distribute_waiting_send_points dw left join order_don od on od.id = dw.order_id and dw.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true" +
+		" left join user u on u.id = od.user_id ")
 public class DistributePopularizeOrdersView {
-	@DbField("od.id")
+	@DbField("ifnull(od.id,dw.order_id)")
 	private Long orderId;
 
-	@DbField("od.goods_id")
+	@DbField("ifnull(od.goods_id,vod.goods_id)")
 	@JsonIgnore
 	private Long goodsId;
 
@@ -34,7 +34,7 @@ public class DistributePopularizeOrdersView {
 	@JsonIgnore
 	private Long skuId;
 
-	@DbField("if(od.is_dp and od.ori_money != 0,od.ori_money,od.money)")
+	@DbField("if(od.id is null,vod.money,if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))")
 	private BigDecimal money;
 
 	@DbField("dw.shared_id")
@@ -68,12 +68,12 @@ public class DistributePopularizeOrdersView {
 	@DbIgnore
 	private String goodsTitle;
 
-	@DbField("od.status")
+	@DbField("ifnull(od.status,vod.status)")
 	private OrderDon.Status orderStatus;
 
-	@DbField("od.pay_title")
+	@DbField("if(od.id is null,vod.pay_title,od.pay_title)")
 	private String specVal;
 
-	@DbField("od.created_time")
+	@DbField("ifnull(od.created_time,vod.created_time)")
 	private Date createdTime;
 }

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

@@ -21,7 +21,7 @@ import java.util.List;
 @Getter
 @Setter
 @SearchBean(tables = "goods_don g left join goods_don_category_relate gcr on gcr.goods_id = g.id",
-		where = "g.deleted is true and g.status is true :condition:",
+		where = "g.deleted is true and g.status is true and g.is_hide is false :condition:",
 		orderBy = "gcr.sorted asc, g.id")
 @JsonInclude(JsonInclude.Include.NON_NULL)
 public class GoodsFrontListCategoryView {

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

@@ -20,7 +20,7 @@ import java.util.List;
 @Getter
 @Setter
 @SearchBean(tables = "goods_don g",
-		where = "g.deleted is true and g.status is true :condition:",
+		where = "g.deleted is true and g.status is true and g.is_hide is false :condition:",
 		orderBy = "g.sort_by asc, g.id")
 @JsonInclude(JsonInclude.Include.NON_NULL)
 public class GoodsFrontListView {

+ 10 - 8
netflix-dao/src/main/java/com/cyksj/model/views/PersonDistributeBrokenLineView.java

@@ -15,34 +15,36 @@ import java.math.BigDecimal;
  */
 @Getter
 @Setter
-@SearchBean(tables = "distribute_waiting_send_points dw left join order_don od on od.id = dw.order_id"
-		, where = ":userId: and od.is_distribute is true and dw.send_status not in ('not_exist','close')"
-		, groupBy = "od.goods_id,date_format(od.created_time,'%Y-%m-%d')")
+@SearchBean(tables = "distribute_waiting_send_points dw left join order_don od on od.id = dw.order_id and dw.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true" +
+		" left join goods_don g on g.id = ifnull(od.goods_id,vod.goods_id)"
+		, where = ":userId: and dw.send_status not in ('not_exist','close')"
+		, groupBy = "g.id,g.title,ifnull(od.goods_id,vod.goods_id),date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d')")
 public class PersonDistributeBrokenLineView {
-	@DbField("od.goods_id")
+	@DbField("g.id")
 	private Long goodsId;
 
 	/**
 	 * 平台名称
 	 */
-	@DbField("select title from goods_don where id = od.goods_id")
+	@DbField("g.title")
 	private String goodsTitle;
 
 	/**
 	 * 当前日期订单数
 	 */
-	@DbField("count(od.id)")
+	@DbField("count(dw.order_id)")
 	private Integer orderNum;
 
 	/**
 	 * 当前日期订单金额
 	 */
-	@DbField("cast(sum(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100 as decimal(10,2))")
+	@DbField("cast(sum(if(od.id is null,vod.money,if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100) as decimal(10,2))")
 	private BigDecimal money;
 
 	/**
 	 * 日期
 	 */
-	@DbField("date_format(od.created_time,'%Y-%m-%d')")
+	@DbField("date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d')")
 	private String date;
 }

+ 7 - 11
netflix-dao/src/main/java/com/cyksj/model/views/RegisterDistributeOrdersDetailView.java

@@ -18,19 +18,21 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "order_don od left join goods_don gd on gd.id = od.goods_id")
+@SearchBean(tables = "distribute_waiting_send_points dw left join order_don od on od.id = dw.order_id and dw.is_vip = false" +
+		" left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true" +
+		" left join goods_don gd on gd.id = ifnull(od.goods_id,vod.goods_id)")
 public class RegisterDistributeOrdersDetailView {
 
-	@DbField("od.created_time")
+	@DbField("ifnull(od.created_time,vod.created_time)")
 	private Date createdTime;
 
-	@DbField("od.money")
+	@DbField("ifnull(od.money,vod.money)")
 	private BigDecimal money;
 
-	@DbField("od.status")
+	@DbField("ifnull(od.status,vod.status)")
 	private OrderDon.Status status;
 
-	@DbField("od.user_id")
+	@DbField("dw.user_id")
 	private Long userId;
 
 	@DbIgnore
@@ -47,10 +49,4 @@ public class RegisterDistributeOrdersDetailView {
 
 	@DbIgnore
 	private String specVal;
-
-	@DbField("od.is_distribute")
-	private Boolean isDistribute;
-
-	@DbField("od.is_fixed_distribute")
-	private Boolean isFixedDistribute;
 }

+ 11 - 10
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeOrdersDetailView.java

@@ -17,12 +17,13 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "(select o.id,o.user_id,o.goods_id,o.sku_id,o.money,o.refund_money,o.coupon_money,o.created_time,o.is_dp,o.ori_money from order_don o inner join (select user_id from user_distribute_shared where :sharedId:) us on us.user_id = o.user_id where o.is_fixed_distribute is true and o.status not in ('close','noPayment') :time:) od" +
-		" left join goods_don g on g.id = od.goods_id" +
-		" inner join distribute_waiting_send_points dp on dp.order_id = od.id")
+@SearchBean(tables = "(select * from distribute_waiting_send_points where :sharedId: :time:) dw left join order_don od on od.id = dw.order_id and dw.is_vip = false and od.status not in ('close','noPayment')" +
+		" left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true and vod.status not in ('close','noPayment')" +
+		" left join goods_don g on g.id = ifnull(od.goods_id,vod.goods_id)"
+)
 public class UserDistributeOrdersDetailView {
 
-	@DbField("select nickname from user where id = od.user_id limit 1")
+	@DbField("select nickname from user where id = dw.user_id limit 1")
 	private String nickname;
 
 	@JsonIgnore
@@ -35,27 +36,27 @@ public class UserDistributeOrdersDetailView {
 	@DbField("select spec_val from goods_don_sku where id = od.sku_id limit 1")
 	private String specVal;
 
-	@DbField("cast(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money)/100 as decimal(10,2))")
+	@DbField("cast(if(od.id is null,vod.money,if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100 as decimal(10,2))")
 	private BigDecimal money;
 
 	@DbField("od.coupon_money")
 	private BigDecimal couponMoney;
 
-	@DbField("TRUNCATE(dp.points/1000,2)")
+	@DbField("TRUNCATE(dw.points/1000,2)")
 	private BigDecimal reMoney = BigDecimal.ZERO;
 
-	@DbField("if(send_status = 'success',TRUNCATE(dp.refund_points/1000,2),0)")
+	@DbField("if(send_status = 'success',TRUNCATE(dw.refund_points/1000,2),0)")
 	private BigDecimal rdMoney;
 
 	/**
 	 * 是否参与渠道分销规则
 	 */
-	@DbField("dp.is_rule")
+	@DbField("dw.is_rule")
 	private Boolean isRule;
 
-	@DbField("dp.send_status")
+	@DbField("dw.send_status")
 	private String sendStatus;
 
-	@DbField("od.created_time")
+	@DbField("ifnull(od.created_time,vod.created_time)")
 	private Date createdTime;
 }

+ 9 - 8
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeOrdersStatisticsView.java

@@ -15,26 +15,27 @@ import java.math.BigDecimal;
  */
 @Getter
 @Setter
-@SearchBean(tables = "(select o.id,o.user_id,o.goods_id,o.money,o.refund_money,o.status,o.is_dp,o.ori_money from order_don o inner join (select user_id from user_distribute_shared where :sharedId:) us on us.user_id = o.user_id where o.is_fixed_distribute is true and o.status not in ('close','noPayment') :time:) od left join goods_don g on g.id = od.goods_id" +
-		" inner join distribute_waiting_send_points dp on dp.order_id = od.id",
-		groupBy = "od.goods_id,g.title")
+@SearchBean(tables = "(select * from distribute_waiting_send_points where :sharedId: :time:) dw left join order_don od on od.id = dw.order_id and dw.is_vip = false and od.status not in ('close','noPayment')" +
+		" left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true and vod.status not in ('close','noPayment')" +
+		" left join goods_don g on g.id = ifnull(od.goods_id,vod.goods_id)",
+		groupBy = "ifnull(od.goods_id,vod.goods_id),g.title")
 public class UserDistributeOrdersStatisticsView {
 
 	@DbField("g.title")
 	private String title;
 
-	@DbField("cast(sum(if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100 as decimal(10,2))")
+	@DbField("cast(sum(if(od.id is null,vod.money,if(od.is_dp and od.ori_money != 0,od.ori_money,od.money))/100) as decimal(10,2))")
 	private BigDecimal distributeOrderMoney;
 
-	@DbField("count(od.id)")
+	@DbField("count(dw.order_id)")
 	private Integer orders;
 
-	@DbField("TRUNCATE(sum(if(dp.send_status != 'close',dp.points,0))/1000,2)")
+	@DbField("TRUNCATE(sum(if(dw.send_status != 'close',dw.points,0))/1000,2)")
 	private BigDecimal takeMoney;
 
-	@DbField("count(if(od.status = 'refund',1,NULL))")
+	@DbField("count(if(ifnull(od.status,vod.status) = 'refund',1,NULL))")
 	private Integer refundOrders;
 
-	@DbField("cast(sum(ifnull(if(od.is_dp and od.ori_money != 0 and od.refund_money > od.ori_money,od.ori_money,od.refund_money),0))/100 as decimal(10,2))")
+	@DbField("cast(sum(if(od.id is null,vod.refund_money,ifnull(if(od.is_dp and od.ori_money != 0 and od.refund_money > od.ori_money,od.ori_money,od.refund_money),0)))/100 as decimal(10,2))")
 	private BigDecimal refundMoney;
 }

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

@@ -90,14 +90,14 @@
     <select id="selectPersonDistributeBrokenLine" resultType="com.cyksj.model.views.BrokenLineObjView">
         select min(curdate) as firstDate,
                max(curdate) as lastDate
-        from (select date_format(od.created_time,'%Y-%m-%d') curdate,
-                     count(od.id) curdateOrderCount
+        from (select date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d') curdate,
+                     count(dw.order_id) curdateOrderCount
         from distribute_waiting_send_points dw
-        left join order_don od on od.id = dw.order_id
+        left join order_don od on od.id = dw.order_id and dw.is_vip = false
+        left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true
         where dw.shared_id = #{userId}
-          and od.is_distribute is true
           and dw.send_status not in ('not_exist', 'close')
-        group by od.goods_id, date_format(od.created_time, '%Y-%m-%d'))s
+        group by ifnull(od.goods_id,vod.goods_id), date_format(ifnull(od.created_time,vod.created_time), '%Y-%m-%d'))s
         where 1 = 1
         <if test="first != null">
             and curdate >= #{first}
@@ -304,12 +304,13 @@
     <select id="selectDsPlatBrokenLineMoney" resultType="com.cyksj.model.views.BrokenLineObjView">
         select min(curdate) as firstDate,
         max(curdate) as lastDate
-        from (select cast(sum(od.money)/100 as decimal(10,2)) as curdateMoney,
-        date_format(od.created_time,'%Y-%m-%d') curdate from (select order_id from distribute_waiting_send_points where
-        shared_id = #{sharedId}) dp inner join order_don od
-        on od.id = dp.order_id
-        where od.status not in ('noPayment','close','refund')
-        group by od.goods_id,date_format(od.created_time,'%Y-%m-%d'))s
+        from (select cast(sum(if(od.id is null,vod.money,od.money))/100 as decimal(10,2)) as curdateMoney,
+        date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d') curdate from (select order_id,is_vip from
+        distribute_waiting_send_points where
+        shared_id = #{sharedId}) dp left join order_don od on od.id = dp.order_id and dp.is_vip = false
+        left join vip_order_don vod on vod.id = dp.order_id and dp.is_vip = true
+        where ifnull(od.status,vod.status) not in ('noPayment','close','refund')
+        group by ifnull(od.goods_id,vod.goods_id),date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d'))s
         where 1 = 1
         <if test="first != null">
             and curdate >= #{first}

+ 16 - 12
netflix-dao/src/main/resources/mapper/UserDistributeMapper.xml

@@ -4,8 +4,8 @@
 
     <select id="count" resultType="java.lang.Integer">
         select count(*)
-        from distribute_waiting_send_points dw left join order_don o on o.id = dw.order_id
-        where dw.shared_id = #{userId} and o.is_distribute is true
+        from distribute_waiting_send_points dw
+        where dw.shared_id = #{userId}
     </select>
 
     <select id="countUserNum" resultType="java.lang.Integer">
@@ -99,18 +99,22 @@
     </select>
 
     <select id="selectOrderBrokenLineMoney" resultType="com.cyksj.model.views.CpsOrderDataStatisticsView">
-        select min(curdate) as firstDate,max(curdate) as lastDate from (select date_format(od.created_time,'%Y-%m-%d') as curdate
-        from (select o.id,o.goods_id,o.created_time from order_don o inner join
-        (select user_id from user_distribute_shared where shared_id = #{cpsUserId}) us on us.user_id = o.user_id where
-        o.is_fixed_distribute is true and o.status not in ('close','noPayment')
+        select min(curdate) as firstDate,
+        max(curdate) as lastDate
+        from (select date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d') curdate,
+        count(dw.order_id) curdateOrderCount
+        from distribute_waiting_send_points dw
+        left join order_don od on od.id = dw.order_id and dw.is_vip = false
+        left join vip_order_don vod on vod.id = dw.order_id and dw.is_vip = true
+        where dw.shared_id = #{cpsUserId}
+        and dw.send_status not in ('not_exist', 'close')
+        group by ifnull(od.goods_id,vod.goods_id), date_format(ifnull(od.created_time,vod.created_time), '%Y-%m-%d'))s
+        where 1 = 1
         <if test="first != null">
-            and o.created_time >= #{first}
+            and curdate >= #{first}
         </if>
         <if test="end != null">
-            and o.created_time &lt; #{end}
-        </if>)od
-        left join goods_don g on g.id = od.goods_id
-        inner join distribute_waiting_send_points dp on dp.order_id = od.id
-        group by date_format(od.created_time,'%Y-%m-%d'))s
+            and curdate &lt; #{end}
+        </if>
     </select>
 </mapper>

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

@@ -22,4 +22,22 @@
             and dp.created_time &lt; #{end}
         </if>
     </select>
+
+    <select id="getVipPopularizeDetail" resultType="com.cyksj.model.views.UserDistributePopularizeView">
+        select count(vod.id) orders,
+        ifnull(cast(sum(money) / 100 as decimal(11, 2)), 0) ordersMoney,
+        ifnull(cast(sum(if(dp.send_status = 'waiting', dp.points, 0)) / 1000 as decimal(11, 2)), 0)
+        as wMoney,
+        ifnull(cast(sum(if(dp.send_status = 'success', dp.points, 0)) / 1000 as decimal(11, 2)), 0)
+        as gotMoney
+        from vip_order_don vod inner join distribute_waiting_send_points dp on dp.order_id = vod.id
+        where vod.cps_popularize_id = #{cpsPopularizeId}
+        and dp.send_status in ('success', 'waiting')
+        <if test="start != null">
+            and dp.created_time >= #{start}
+        </if>
+        <if test="end != null">
+            and dp.created_time &lt; #{end}
+        </if>
+    </select>
 </mapper>

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

@@ -19,4 +19,6 @@ public interface CpsPopularizeService {
 	UserDistributePopularizeView getDefaultPopularizeDetail(long cpsUserId, String start, String end);
 
 	String getServiceCodeUrl(long cpsUserId);
+
+	UserDistributePopularizeView getVipPopularizeDetail(Long cpsPopularizeId, String startTime, String endTime);
 }

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

@@ -114,4 +114,10 @@ public class CpsPopularizeServiceImpl implements CpsPopularizeService {
 		}
 		return sharedUrl;
 	}
+
+	@Override
+	public UserDistributePopularizeView getVipPopularizeDetail(Long cpsPopularizeId, String startTime, String endTime) {
+		return popularizeMapper.getVipPopularizeDetail(cpsPopularizeId, startTime, endTime);
+
+	}
 }

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

@@ -1204,7 +1204,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
      */
     public void deductDsPoints(OrderDon orderDon) {
         if (orderDon.getIsDistribute()) {
-            DistributeWaitingSendPoints distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId()).last("limit 1"));
+            DistributeWaitingSendPoints distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId()).eq(DistributeWaitingSendPoints::getIsVip,Boolean.FALSE).last("limit 1"));
             if (distributeWaitingSendPoints != null) {
                 BigDecimal money = orderDon.getMoney();
                 BigDecimal refundMoney = orderDon.getRefundMoney();

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

@@ -1084,13 +1084,13 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		backgroundDataView.setDistributeOrders(distributeOrders.size());
 		//固定推广者订单
 		List<DistributeOrdersView> distributePopularizeOrders = Optional.ofNullable(beanSearcher.searchAll(DistributeOrdersView.class, MapUtils.builder()
-				.field(DistributeOrdersView::getIsFixedDistribute, true).op(Operator.Equal)
+				.put("f", " and ifnull(od.is_fixed_distribute,vod.is_fixed_distribute) = 1")
 				.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::getIsFixedDistribute, false).op(Operator.Equal)
+				.put("f", " and ifnull(od.is_fixed_distribute,vod.is_fixed_distribute) = 0")
 				.field(DistributeOrdersView::getCreatedTime, startDate, endDate).op(Operator.Between)
 				.build())).orElse(new ArrayList<>());
 		backgroundDataView.setDistributeOriginalOrders(distributeOriginalOrders.size());

+ 100 - 8
netflix-service/src/main/java/com/cyksj/service/mange/vip/impl/CmsVipOrderServiceImpl.java

@@ -5,15 +5,14 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
-import com.cyksj.mapper.GoodsDonSkuMapper;
-import com.cyksj.mapper.GroupsMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.vip.RefundVipOrderDonMapper;
 import com.cyksj.mapper.vip.VipOrderDonMapper;
 import com.cyksj.mapper.vip.VipUserMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.OrderRefundReq;
-import com.cyksj.service.mange.MirrorUserCleatService;
 import com.cyksj.service.mange.vip.CmsVipOrderService;
 import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.relation.GroupRelationClearService;
@@ -23,6 +22,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -46,11 +46,7 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 
 	private final GroupsRelationMapper relationMapper;
 
-	private final GoodsDonSkuMapper skuMapper;
-
-	private final GroupsMapper groupsMapper;
-
-	private final MirrorUserCleatService mirrorUserCleatService;
+	private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper;
 
 	private final GroupRelationClearService groupRelationClearService;
 
@@ -58,6 +54,8 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 
 	private final UserBindRelationService userBindRelationService;
 
+	private final UserDistributeMapper userDistributeMapper;
+
 	@Override
 	public void refundOrders(OrderRefundReq refundReq) throws Exception {
 		VipOrderDon orderDon = vipOrderDonMapper.selectById(refundReq.getOrderId());
@@ -111,6 +109,75 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 			clearVipMirrorUser(vipUser.getUserId(), subExpiryTime);
 			vipUserMapper.updateById(vipUser);
 		}
+		if (StrUtil.isNotBlank(refundType) && !refundType.equals(VipOrderDon.Type.BALANCE.getType())) {
+			//分销提成积分扣除
+			deductVipDsPoints(orderDon);
+		}
+	}
+
+	private void deductVipDsPoints(VipOrderDon orderDon) {
+		if (orderDon.getIsDistribute()) {
+			DistributeWaitingSendPoints distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId()).eq(DistributeWaitingSendPoints::getIsVip, Boolean.TRUE).last("limit 1"));
+			if (distributeWaitingSendPoints != null) {
+				BigDecimal money = orderDon.getMoney();
+				BigDecimal refundMoney = orderDon.getRefundMoney();
+				//已发送 发送中 部分 全额退款
+				DistributeWaitingSendPoints.Status sendStatus = distributeWaitingSendPoints.getSendStatus();
+				BigDecimal points = distributeWaitingSendPoints.getPoints();
+				if (sendStatus == DistributeWaitingSendPoints.Status.waiting) {
+					Integer thisGoodsRate = distributeWaitingSendPoints.getRate();
+					if (thisGoodsRate == null || thisGoodsRate == 0) {
+						thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
+					}
+					if (refundMoney.compareTo(money) == 0) {
+						//待发送状态 全额退款
+						distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
+						distributeWaitingSendPoints.setRefundPoints(points);
+						distributeWaitingSendPoints.setPoints(BigDecimal.ZERO);
+						distributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+						return;
+					}
+					if (thisGoodsRate > 0) {
+						BigDecimal refundRate = refundMoney.divide(money, 2, RoundingMode.DOWN);
+						//退掉比例的提成
+						BigDecimal needSubPoints = points.multiply(refundRate);
+						distributeWaitingSendPoints.setRefundPoints(needSubPoints);
+						//剩余积分
+						BigDecimal remainPoints = points.subtract(needSubPoints);
+						distributeWaitingSendPoints.setPoints(remainPoints);
+						//原先获取积分也扣除
+						if (distributeWaitingSendPoints.getOriPoints().compareTo(BigDecimal.ZERO) > 0) {
+							BigDecimal oriNeedSubPoints = distributeWaitingSendPoints.getOriPoints().multiply(refundRate);
+							distributeWaitingSendPoints.setOriPoints(distributeWaitingSendPoints.getOriPoints().subtract(oriNeedSubPoints));
+						}
+						distributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+					}
+				} else if (sendStatus == DistributeWaitingSendPoints.Status.success) {
+					//已发送的提成 部分退款 全额退款 需要扣除用户积分
+					//扣除固定推广者积分
+					Integer thisGoodsRate = distributeWaitingSendPoints.getRate();
+					if (thisGoodsRate == null || thisGoodsRate == 0) {
+						thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
+					}
+					if (thisGoodsRate > 0) {
+						BigDecimal refundRate = refundMoney.divide(money, 2, RoundingMode.DOWN);
+						//退掉比例的提成
+						BigDecimal needSubPoints = points.multiply(refundRate);
+						userBenefitsService.deductDistributePoints(orderDon.getId(), distributeWaitingSendPoints.getSharedId(), needSubPoints);
+						//部分退款
+						distributeWaitingSendPoints.setRefundPoints(needSubPoints);
+						distributeWaitingSendPoints.setPoints(points.subtract(needSubPoints));
+						//原先获取积分也扣除
+						if (distributeWaitingSendPoints.getOriPoints().compareTo(BigDecimal.ZERO) > 0) {
+							BigDecimal oriNeedSubPoints = distributeWaitingSendPoints.getOriPoints().multiply(refundRate);
+							distributeWaitingSendPoints.setOriPoints(distributeWaitingSendPoints.getOriPoints().subtract(oriNeedSubPoints));
+						}
+						distributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+					}
+
+				}
+			}
+		}
 	}
 
 	private void recordRefundOrder(VipOrderDon orderDon, String outRefundNo, BigDecimal refundMoney, String operator, String chatImg, String refundType) {
@@ -147,6 +214,31 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 		if (vipUser == null) {
 			throw BusinessRuntimeException.getInstance("用户会员已过期,无法退款");
 		}
+		String refundType = refundReq.getRefundType();
+		BigDecimal refundMoney = refundReq.getRefundMoney();
+		BigDecimal money = orderDon.getMoney();
+		BigDecimal orderDonRefundMoney = Optional.ofNullable(orderDon.getRefundMoney()).orElse(BigDecimal.ZERO);
+		BigDecimal orderDonRefundBalance = Optional.ofNullable(orderDon.getRefundBalance()).orElse(BigDecimal.ZERO);
+		//余额退款
+		if (OrderDon.Type.BALANCE.getType().equals(refundType)) {
+			BigDecimal balance = orderDon.getBalance();
+			refundMoney = orderDonRefundBalance.add(refundMoney);
+			if (VipOrderDon.Type.BALANCE == orderDon.getType() && refundMoney.compareTo(balance) > 0) {
+				throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
+			}
+			if (VipOrderDon.Type.BALANCE != orderDon.getType() && refundMoney.compareTo(money) > 0) {
+				throw BusinessRuntimeException.getInstance("退款余额大于订单支付金额");
+			}
+			orderDon.setRefundBalance(refundMoney);
+			orderDon.setRefundMoney(BigDecimal.ZERO);
+		} else {
+			//退金额
+			refundMoney = orderDonRefundMoney.add(refundMoney);
+			if (refundMoney.compareTo(money) > 0) {
+				throw BusinessRuntimeException.getInstance("退款金额大于订单支付金额");
+			}
+			orderDon.setRefundMoney(refundMoney);
+		}
 	}
 
 	/**

+ 128 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/VipOrderDonServiceImpl.java

@@ -3,6 +3,7 @@ package com.cyksj.service.order.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
@@ -23,6 +24,7 @@ import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.mapper.vip.VipGoodsSkuMapper;
 import com.cyksj.mapper.vip.VipOrderDonDeductRelationMapper;
@@ -54,6 +56,7 @@ import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -116,6 +119,20 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 
 	private final ClaudeService claudeService;
 
+	private final UserDistributeMapper userDistributeMapper;
+
+	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
+	private final DistributePointsExchangeMoneyMapper distributePointsExchangeMoneyMapper;
+
+	private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
+
+	private final BusinessDistributeDefaultRateConfigMapper businessDistributeDefaultRateConfigMapper;
+
 	@Override
 	public VipOrderDon submit(VipOrderDonPayReq payRequest) {
 		Long userId = payRequest.getUserId();
@@ -147,6 +164,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		deductOrderMoney(orderDon, user, payRequest);
 		//设置订单支付商品信息
 		orderDon.setPayTitle(Constant.VIP_TITLE);
+		orderDon.setGoodsId(Constant.VIP_RELATE_GOODS_ID);
 		this.saveOrUpdate(orderDon);
 
 		Long orderId = orderDon.getId();
@@ -255,6 +273,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		deductOrderMoney(orderDon, user, payRequest);
 		//设置订单支付商品信息
 		orderDon.setPayTitle(Constant.VIP_TITLE);
+		orderDon.setGoodsId(Constant.VIP_RELATE_GOODS_ID);
 
 		this.saveOrUpdate(orderDon);
 
@@ -364,6 +383,11 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 			//续费订单
 			setTicketToVipExpiryTime(userIdList, vipUser.getUserId(), vipUser.getExpiryTime());
 		}
+		//金额大于0 是否是分销订单
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
+			handlerDistributeOrder(orderDon);
+			this.saveOrUpdate(orderDon);
+		}
 	}
 
 	private void sendVipTicketToUser(Long userId, Date vipExpiryTime, List<Long> userIds, Long orderId) {
@@ -578,4 +602,108 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 			}
 		}
 	}
+
+	/**
+	 * 处理会员分销
+	 */
+	private void handlerDistributeOrder(VipOrderDon orderDon) {
+		Long userId = orderDon.getUserId();
+		UserDistributeShared distributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class)
+				.eq(UserDistributeShared::getUserId, userId)
+				.last("limit 1"));
+		if (distributeShared == null && !distributeShared.getIsBind()) {
+			return;
+		}
+		if (!distributeShared.getIsBind()) {
+			return;
+		}
+		//分销订单
+		orderDon.setIsDistribute(Boolean.TRUE);
+		orderDon.setCpsPopularizeId(distributeShared.getDsPopularizeId());
+		Long sharedId = distributeShared.getSharedId();
+		Long goodsId = Constant.VIP_RELATE_GOODS_ID;
+		GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+		if (goodsDon == null) {
+			log.info("会员分销关联平台不存在,不分销");
+			return;
+		}
+		BigDecimal points = null;
+		BigDecimal returnMoney = null;
+		BigDecimal orderMoney = orderDon.getMoney();
+		DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1"));
+		if (distributePointsExchangeMoney == null) {
+			log.info("分销兑换积分比例未配置");
+		} else {
+			//渠道推广
+			UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
+					.eq(UserDistribute::getUserId, sharedId)
+					.eq(UserDistribute::getDeleted, Boolean.TRUE)
+					.last("limit 1"));
+			//分销比例
+			Integer rate = 0;
+			if (userDistribute == null) {
+				//普通分销者 是否享受过该用户的首单分销
+				DistributeWaitingSendPoints isReceived = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
+						.eq(DistributeWaitingSendPoints::getSharedId, sharedId)
+						.eq(DistributeWaitingSendPoints::getUserId, userId)
+						.in(DistributeWaitingSendPoints::getSendStatus, List.of(DistributeWaitingSendPoints.Status.waiting.name(), DistributeWaitingSendPoints.Status.success.name()))
+						.last("limit 1"));
+				if (isReceived != null) {
+					return;
+				}
+				rate = goodsDon.getRate();
+				//特定普通渠道 所有平台比例改成10%
+				if (ObjectUtil.equal(sharedId, Constant.SPECIAL_DISTRIBUTE_USER_ID) && rate > 0) {
+					rate = 10;
+				}
+				returnMoney = orderMoney.multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(100));
+			} else {
+				//渠道推广
+				orderDon.setIsFixedDistribute(Boolean.TRUE);
+				//固定推广分销 平台比例
+				UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
+						.eq(UserPlatDistributeRate::getGoodsId, goodsId)
+						.eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
+						.last("limit 1"));
+				//未配置平台分销比例 寻找默认比例
+				if (userPlatDistributeRate == null) {
+					BusinessDistributeDefaultRateConfig defaultRateConfig = businessDistributeDefaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(BusinessDistributeDefaultRateConfig.class)
+							.eq(BusinessDistributeDefaultRateConfig::getGoodsId, goodsId)
+							.last("limit 1"));
+					if (defaultRateConfig != null) {
+						userPlatDistributeRate = getUserPlatDistributeRate(defaultRateConfig.getRate(), defaultRateConfig.getSecondRate());
+					}
+				}
+				if (userPlatDistributeRate != null) {
+					rate = userPlatDistributeRate.getRate();
+					returnMoney = orderMoney.multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(100));
+				}
+			}
+			if (returnMoney != null) {
+				BigDecimal returnPoints = returnMoney.multiply(BigDecimal.valueOf(distributePointsExchangeMoney.getPoints())).divide(distributePointsExchangeMoney.getMoney(), 2, RoundingMode.HALF_DOWN);
+				points = returnPoints;
+			}
+
+			if (points != null && points.compareTo(BigDecimal.ZERO) > 0) {
+				log.info("用户{}邀请{},产生会员分销订单分发积分记录入库", sharedId, userId);
+				DistributeWaitingSendPoints distributeWaitingSendPoints = new DistributeWaitingSendPoints();
+				distributeWaitingSendPoints.setSharedId(sharedId);
+				distributeWaitingSendPoints.setUserId(userId);
+				distributeWaitingSendPoints.setIsVip(Boolean.TRUE);
+				distributeWaitingSendPoints.setOrderId(orderDon.getId());
+				distributeWaitingSendPoints.setPoints(points);
+				distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.waiting);
+				distributeWaitingSendPoints.setSendTime(DateUtil.offsetDay(orderDon.getPayTime(), 3));
+				distributeWaitingSendPoints.setRate(rate);
+				distributeWaitingSendPointsMapper.insert(distributeWaitingSendPoints);
+			}
+		}
+	}
+
+	public UserPlatDistributeRate getUserPlatDistributeRate(Integer rate, Integer secondRate) {
+		UserPlatDistributeRate userPlatDistributeRate = new UserPlatDistributeRate();
+		userPlatDistributeRate.setRate(rate);
+		userPlatDistributeRate.setSecondRate(secondRate);
+		return userPlatDistributeRate;
+	}
 }

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

@@ -85,7 +85,7 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 				if (isRecord) {
 					recordBalanceBySource(userId, addBalance, source, orderId, detail, null, null);
 				}
-				if (envCommonService.isPrdEnv() && isRecord && yhsId == 0) {
+				if (envCommonService.isPrdEnv() && isRecord && yhsId != null && yhsId == 0) {
 					try {
 						//短信到账提醒
 						String msg = String.format(Constant.BALANCE_NOTIFY_MSG, addBalance.divide(BigDecimal.valueOf(100)));

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/vip/VipFrontService.java

@@ -10,7 +10,7 @@ import com.cyksj.model.response.VipUserPageResp;
  * 创建时间:2025/5/15 15:59
  */
 public interface VipFrontService {
-	void fillVipInfo(long userId, VipUserPageResp vipUserPageResp);
+	void fillVipInfo(Long userId, VipUserPageResp vipUserPageResp);
 
 	VipDeductDto checkAndGetOrderDeductMoney(Long userId);
 }

+ 4 - 1
netflix-service/src/main/java/com/cyksj/service/vip/impl/VipFrontServiceImpl.java

@@ -56,11 +56,14 @@ public class VipFrontServiceImpl implements VipFrontService {
 	private final OrderDonMapper orderDonMapper;
 
 	@Override
-	public void fillVipInfo(long userId, VipUserPageResp vipUserPageResp) {
+	public void fillVipInfo(Long userId, VipUserPageResp vipUserPageResp) {
 		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.VIP_FEE_KEY).last("limit 1"));
 		if (sysConfig != null && StrUtil.isNotBlank(sysConfig.getSysValue())) {
 			vipUserPageResp.setVipFee(BigDecimal.valueOf(Integer.parseInt(sysConfig.getSysValue())));
 		}
+		if (userId == null) {
+			return;
+		}
 		//可抵扣价格
 		BigDecimal deductMoney = BigDecimal.ZERO;
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);

+ 11 - 13
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java

@@ -134,11 +134,11 @@ public class CpsDistribtueDataController {
 		String timeSql = StrUtil.EMPTY;
 		if (firstDate != null) {
 			first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd HH:mm:ss");
-			timeSql += String.format(" and o.created_time >= '%s'", first);
+			timeSql += String.format(" and created_time >= '%s'", first);
 		}
 		if (lastDate != null) {
 			end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd HH:mm:ss");
-			timeSql += String.format(" and o.created_time < '%s'", end);
+			timeSql += String.format(" and created_time < '%s'", end);
 		}
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		builder.put("sharedId", String.format("shared_id = %s", cpsUserId));
@@ -160,11 +160,11 @@ public class CpsDistribtueDataController {
 		String timeSql = StrUtil.EMPTY;
 		if (firstDate != null) {
 			first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd HH:mm:ss");
-			timeSql += String.format(" and o.created_time >= '%s'", first);
+			timeSql += String.format(" and created_time >= '%s'", first);
 		}
 		if (lastDate != null) {
 			end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd HH:mm:ss");
-			timeSql += String.format(" and o.created_time < '%s'", end);
+			timeSql += String.format(" and created_time < '%s'", end);
 		}
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		builder.put("sharedId", String.format("shared_id = %s", cpsUserId));
@@ -203,22 +203,20 @@ public class CpsDistribtueDataController {
 				.orElse(new CpsOrderDataStatisticsView());
 
 		if (brokenLineObjView != null) {
-			String timeSql = StrUtil.EMPTY;
+			MapBuilder builder = MapUtils.builder();
 			if (firstDate != null) {
 				first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd HH:mm:ss");
-				timeSql += String.format(" and o.created_time >= '%s'", first);
 			}
 			if (lastDate != null) {
 				end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd HH:mm:ss");
-				timeSql += String.format(" and o.created_time < '%s'", end);
 			}
-			MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-			builder.put("sharedId", String.format("shared_id = %s", cpsUserId));
-			if (StrUtil.isNotEmpty(timeSql)) {
-				builder.put("time", timeSql);
+			if (first != null && end != null) {
+				builder.field(CpsOrderView::getDate, first, end).op(Operator.Between);
 			}
-			builder.put("sharedId", String.format("shared_id = %s", cpsUserId));
-			List<CpsOrderView> views = beanSearcher.searchAll(CpsOrderView.class,builder.build());
+			List<CpsOrderView> views = beanSearcher.searchAll(CpsOrderView.class, builder
+					.put("userId", String.format("dw.shared_id = %s", cpsUserId))
+					.orderBy(CpsOrderView::getDate).asc()
+					.build());
 			Map<Long, List<CpsOrderView>> goodsMap = views.stream().collect(Collectors.groupingBy(CpsOrderView::getGoodsId));
 			brokenLineObjView.setGoodsData(goodsMap);
 		}

+ 18 - 1
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsPopularizeController.java

@@ -120,7 +120,16 @@ public class CpsPopularizeController {
 			Optional.ofNullable(goodsDonMapper.selectById(data.getGoodsId())).ifPresent(goods -> {
 				data.setTitle(goods.getTitle());
 				data.setLogo(goods.getLogo());
-				data.setPrice(goods.getMinPrice());
+				if (data.getGoodsId() != null && data.getGoodsId() == Constant.VIP_RELATE_GOODS_ID) {
+					SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+							.eq(SysConfig::getSysKey, Constant.VIP_FEE_KEY)
+							.last("limit 1"));
+					if (sysConfig != null && StrUtil.isNotEmpty(sysConfig.getSysValue())) {
+						data.setPrice(BigDecimal.valueOf(Integer.parseInt(sysConfig.getSysValue())));
+					}
+				} else {
+					data.setPrice(goods.getMinPrice());
+				}
 				UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
 						.eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
 						.eq(UserPlatDistributeRate::getGoodsId, data.getGoodsId())
@@ -171,6 +180,14 @@ public class CpsPopularizeController {
 				link += "/?gid=" + data.getGoodsId();
 			}
 			data.setUrlCode(QrCodeUtil.generateAsBase64(link, QrConfig.create(), "png"));
+			//会员订单数据
+			if (data.getGoodsId() != null && data.getGoodsId() == Constant.VIP_RELATE_GOODS_ID) {
+				UserDistributePopularizeView vipOrderView =cpsPopularizeService.getVipPopularizeDetail(data.getId(), startTime, endTime);
+				data.setOrders(data.getOrders() + vipOrderView.getOrders());
+				data.setOrdersMoney(data.getOrdersMoney().add(vipOrderView.getOrdersMoney()));
+				data.setWMoney(data.getWMoney().add(vipOrderView.getWMoney()));
+				data.setGotMoney(data.getGotMoney().add(vipOrderView.getGotMoney()));
+			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}

+ 7 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -271,11 +271,11 @@ public class DistributeController {
 		BrokenLineObjView brokenLineObjView = Optional.ofNullable(orderDonMapper.selectDsPlatBrokenLineMoney(sharedId, first, end))
 				.orElse(new BrokenLineObjView());
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-		String dateSqL = "date_format(od.created_time,'%Y-%m-%d')";
+		String dateSqL = "date_format(ifnull(od.created_time,vod.created_time),'%Y-%m-%d')";
 		if (chain == 2) {
-			dateSqL = "DATE_FORMAT(od.created_time - INTERVAL (DAYOFWEEK(od.created_time) + 5) % 7 DAY, '%Y.%m.%d')";
+			dateSqL = "DATE_FORMAT(ifnull(od.created_time,vod.created_time) - INTERVAL (DAYOFWEEK(ifnull(od.created_time,vod.created_time)) + 5) % 7 DAY, '%Y.%m.%d')";
 		} else if (chain == 3) {
-			dateSqL = "DATE_FORMAT(od.created_time, '%Y-%m')";
+			dateSqL = "DATE_FORMAT(ifnull(od.created_time,vod.created_time), '%Y-%m')";
 		}
 		if (brokenLineObjView != null) {
 			List<DistributePlatOrderDonBrokenLineView> views = beanSearcher.searchAll(DistributePlatOrderDonBrokenLineView.class, builder
@@ -437,9 +437,11 @@ public class DistributeController {
 		SearchResult<RegisterDistributeOrdersDetailView> search = beanSearcher.search(RegisterDistributeOrdersDetailView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
 			User user = userMapper.selectById(data.getUserId());
-			GoodsDonSku sku = goodsDonSkuMapper.selectById(data.getSkuId());
+			if (data.getSkuId() != null) {
+				GoodsDonSku sku = goodsDonSkuMapper.selectById(data.getSkuId());
+				data.setSpecVal(sku != null ? sku.getSpecVal() : "");
+			}
 			data.setNickname(user != null ? user.getNickname() : "");
-			data.setSpecVal(sku != null ? sku.getSpecVal() : "");
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}

+ 5 - 3
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -102,10 +102,12 @@ public class DistributePopularizeController {
 		BigDecimal oneHundred = BigDecimal.valueOf(100);
 		search.getDataList().forEach(data -> {
 			GoodsDon goodsDon = goodsDonMapper.selectById(data.getGoodsId());
-			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(data.getSkuId());
 			data.setGoodsTitle(goodsDon.getTitle());
-			if (goodsDonSku != null) {
-				data.setSpecVal(goodsDonSku.getSpecVal());
+			if (data.getSkuId() != null) {
+				GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(data.getSkuId());
+				if (goodsDonSku != null) {
+					data.setSpecVal(goodsDonSku.getSpecVal());
+				}
 			}
 			data.setWaitGetMoney(data.getPoints().divide(points).multiply(money).divide(oneHundred, 2, RoundingMode.DOWN));
 			//原先奖励

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/vip/VipController.java

@@ -41,7 +41,7 @@ public class VipController {
 	 */
 	@GetMapping("/get/info")
 	public Result<VipUserPageResp> getVipInfo() {
-		long userId = StpUserUtil.getLoginIdAsLong();
+		Long userId = StpUserUtil.getUserIdAfterLogin();
 		VipUserPageResp vipUserPageResp = new VipUserPageResp();
 		//填充会员信息
 		vipFrontService.fillVipInfo(userId, vipUserPageResp);