浏览代码

Merge branch 'ds_func_avg'

# Conflicts:
#	netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
zoujiajian 2 年之前
父节点
当前提交
b4074d28ad
共有 19 个文件被更改,包括 402 次插入8 次删除
  1. 14 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 6 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponDistributePopularizeMapper.java
  3. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponUserMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/UserDistributeRuleOrderRecordMapper.java
  5. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java
  6. 11 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributeWaitingSendPoints.java
  7. 25 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeRuleOrderRecord.java
  8. 7 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeShared.java
  9. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersDetailView.java
  10. 25 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeWaitingOrderPointsRuleView.java
  11. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeOrdersDetailView.java
  12. 34 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRuleOrderRecordView.java
  13. 6 0
      netflix-dao/src/main/resources/mapper/CouponUserMapper.xml
  14. 1 1
      netflix-dao/src/main/resources/mapper/UserDistributeMapper.xml
  15. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  16. 20 3
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  17. 104 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  18. 117 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  19. 1 3
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

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

@@ -177,4 +177,18 @@ public interface Constant {
 	String DY_CS_CODE_KEY = "抖音免费设备";
 
 	List<String> DY_CUS = List.of("QiuDaoYuBuGuoQi.", "YinHeLuXiangJuSheBeiShouQian");
+
+	/**
+	 * 渠道分销规则key
+	 */
+	String DISTRIBUTE_RULE_KEY = "distribute_rule_key";
+
+	String ZERO_STR = "0";
+
+	String ONE_STR = "1";
+
+	/**
+	 * 渠道规格过滤平台key
+	 */
+	String DISTRIBUTE_RULE_FILTER_GOODS_KEY = "distribute_rule_filter_goods_key";
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponDistributePopularizeMapper.java

@@ -1,7 +1,10 @@
 package com.cyksj.mapper.manage.coupon;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.Coupon;
 import com.cyksj.model.entity.CouponDistributePopularize;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
 /*
@@ -13,4 +16,7 @@ import org.apache.ibatis.annotations.Update;
 public interface CouponDistributePopularizeMapper extends BaseMapper<CouponDistributePopularize> {
 	@Update("update coupon_distribute_popularize set deleted = false where coupon_id = #{id}")
 	void deleteByCouponId(Long id);
+
+	@Select("select distinct c.* from (select * from coupon_distribute_popularize where distribute_id = #{distributeId} and deleted is true) cp inner join coupon c on c.id = cp.coupon_id and type = 'discount' inner join coupon_sku cs on cs.coupon_id = c.id and cs.sku_id = #{skuId} order by c.discount desc limit 1")
+	Coupon selectDiscountCouponByUserId(@Param("distributeId") Long distributeId, @Param("skuId") Long skuId);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponUserMapper.java

@@ -27,4 +27,6 @@ public interface CouponUserMapper extends BaseMapper<CouponUser> {
 	Page<CouponUserView> couponPersonalList(@Param("userId") Long userId, @Param("page") Page<CouponUserView> page, @Param("couponId") Long couponId);
 
 	CouponUserView getNewUserWelfareCouponsByUserId(@Param("userId") long userId, @Param("channel") CouponUser.Channel channel, @Param("now") DateTime now);
+
+	CouponUser getCouponByCouponUserId(Long couponUserId);
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserDistributeRuleOrderRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeRuleOrderRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/9/25 14:20
+ */
+public interface UserDistributeRuleOrderRecordMapper extends BaseMapper<UserDistributeRuleOrderRecord> {
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java

@@ -3,6 +3,7 @@ package com.cyksj.model.entity;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /*
@@ -41,6 +42,11 @@ public class CouponUser extends BaseEntity {
 	 */
 	private Channel channel;
 
+	/**
+	 * 折扣卷折扣 用于分销
+	 */
+	private BigDecimal discount;
+
 	/**
 	 * 优惠券使用状态
 	 */

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

@@ -46,6 +46,17 @@ public class DistributeWaitingSendPoints extends BaseEntity{
 	 */
 	private Boolean isDelivery;
 
+	/**
+	 * 分销提成平摊折扣金额
+	 * 是否参与渠道分销规则
+	 */
+	private Boolean isRule;
+
+	/**
+	 * 获取提成比例
+	 */
+	private Integer rate;
+
 	@Getter
 	public enum Status{
 		close("分销订单关闭,积分奖励不分发"),

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeRuleOrderRecord.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeRuleOrderRecord
+ * 创建者: JavaZou
+ * 创建时间:2023/9/25 14:19
+ */
+@Getter
+@Setter
+public class UserDistributeRuleOrderRecord extends BaseEntity{
+	private Date endTime;
+
+	private Date startTime;
+
+	/**
+	 * 时长
+	 */
+	private String duration;
+}

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeShared.java

@@ -31,4 +31,11 @@ public class UserDistributeShared extends BaseEntity{
 	 * cps后台自定义推广链接id
 	 */
 	private Long dsPopularizeId;
+
+	/**
+	 * 新渠道上下级规则:
+	 * 在原规则基础上加上用户需在在45天内下单成功之后才算真绑定,享受后续所有订单返利
+	 * 超过45天 未下单 不参与后续提成
+	 */
+	private Boolean isBind;
 }

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

@@ -45,6 +45,9 @@ public class DistributeOrdersDetailView {
 	@DbField("dp.points")
 	private BigDecimal points;
 
+	@DbField("dp.is_rule")
+	private Boolean isRule;
+
 	@DbField("dp.send_status")
 	private DistributeWaitingSendPoints.Status sendStatus;
 }

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/views/DistributeWaitingOrderPointsRuleView.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: DistributeWaitingOrderPointsRuleView
+ * 创建者: JavaZou
+ * 创建时间:2023/9/25 14:29
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from distribute_waiting_send_points :condition:) dp inner join order_don o on o.id = dp.order_id and o.status not in ('close','noPayment')")
+public class DistributeWaitingOrderPointsRuleView {
+	@DbField("count(dp.order_id)")
+	private Integer numOfOrder;
+
+	@DbField("sum(o.money) - sum(ifnull(o.refund_money,0))")
+	private BigDecimal orderAmount;
+}

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

@@ -47,6 +47,12 @@ public class UserDistributeOrdersDetailView {
 	@DbField("if(send_status = 'success',TRUNCATE(dp.refund_points/1000,2),0)")
 	private BigDecimal rdMoney;
 
+	/**
+	 * 是否参与渠道分销规则
+	 */
+	@DbField("dp.is_rule")
+	private Boolean isRule;
+
 	@DbField("dp.send_status")
 	private String sendStatus;
 

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRuleOrderRecordView.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserDistributeRuleOrderRecordView
+ * 创建者: JavaZou
+ * 创建时间:2023/9/25 14:20
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute_rule_order_record ur")
+public class UserDistributeRuleOrderRecordView {
+	private Long id;
+
+	private Date endTime;
+
+	private Date startTime;
+
+	private String duration;
+
+	@DbIgnore
+	private Integer numOfOrder;
+
+	@DbIgnore
+	private BigDecimal orderAmount;
+}

+ 6 - 0
netflix-dao/src/main/resources/mapper/CouponUserMapper.xml

@@ -204,4 +204,10 @@
                  and status = 'unused' limit 1) cu
                  inner join coupon c on c.id = cu.coupon_id
     </select>
+
+    <select id="getCouponByCouponUserId" resultType="com.cyksj.model.entity.CouponUser">
+        select *
+        from coupon_user
+        where id = #{couponUserId} limit 1
+    </select>
 </mapper>

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

@@ -90,7 +90,7 @@
     <select id="getDistributeGoodsRateByUidAndGid" resultType="java.lang.Integer">
         select udr.rate
         from (select shared_id from user_distribute_shared where user_id = #{userId} limit 1) us
-                 inner join user_distribute ud on ud.user_id = us.shared_id
+                 inner join user_distribute ud on ud.user_id = us.shared_id and ud.deleted is true
                  inner join user_plat_distribute_rate udr
                             on udr.distribute_id = ud.id
         where udr.goods_id = #{goodsId}

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -636,6 +636,7 @@ public class RedisService {
         CORP_GROUP_CHAT_LIST("corp_group_chat_list:%s", "企业微信客户群列表", 60 * 60 * 24),
         PLUS_GOODS_ADDRESS_KEY("plus_goods_address_key:", "优惠加购实物地址key", 10 * 60l),
         GROUPS_TRIPS_OUTSIDE_RELATION("groups_trips_outside_relation:key", "额外车位", 30l),
+        DISTRIBUTE_RULE_TIME_KEY("DISTRIBUTE_RULE_TIME_KEY", "渠道规格记录时间key", 5 * 60L),
         ;
 
         private String name;

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

@@ -812,12 +812,21 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         distributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
                         return;
                     }
-                    Integer thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
+                    Integer thisGoodsRate = distributeWaitingSendPoints.getRate();
+                    if (thisGoodsRate == null || thisGoodsRate == 0) {
+                        thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
+                    }
                     if (thisGoodsRate > 0) {
                         BigDecimal needSubPoints = refundMoney.multiply(BigDecimal.valueOf(thisGoodsRate).divide(BigDecimal.valueOf(100))).multiply(BigDecimal.valueOf(10));
+                        if (needSubPoints.compareTo(points) > 0) {
+                            //全扣除
+                            distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
+                            needSubPoints = points;
+                        }
                         distributeWaitingSendPoints.setRefundPoints(needSubPoints);
                         //剩余积分
-                        distributeWaitingSendPoints.setPoints(points.subtract(needSubPoints));
+                        BigDecimal remainPoints = points.subtract(needSubPoints);
+                        distributeWaitingSendPoints.setPoints(remainPoints);
                         distributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
                     }
                 } else if (sendStatus == DistributeWaitingSendPoints.Status.success) {
@@ -831,9 +840,17 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         distributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
                         return;
                     }
-                    Integer thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
+                    Integer thisGoodsRate = distributeWaitingSendPoints.getRate();
+                    if (thisGoodsRate == null || thisGoodsRate == 0) {
+                        thisGoodsRate = Optional.ofNullable(userDistributeMapper.getDistributeGoodsRateByUidAndGid(orderDon.getUserId(), orderDon.getGoodsId())).orElse(0);
+                    }
                     if (thisGoodsRate > 0) {
                         BigDecimal needSubPoints = refundMoney.multiply(BigDecimal.valueOf(thisGoodsRate).divide(BigDecimal.valueOf(100))).multiply(BigDecimal.valueOf(10));
+                        if (needSubPoints.compareTo(points) > 0) {
+                            //全扣除
+                            distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
+                            needSubPoints = points;
+                        }
                         userBenefitsService.deductDistributePoints(orderDon.getId(), distributeWaitingSendPoints.getSharedId(), needSubPoints);
                         //部分退款
                         distributeWaitingSendPoints.setRefundPoints(needSubPoints);

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

@@ -1393,6 +1393,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					BigDecimal returnPoints = returnMoney.multiply(BigDecimal.valueOf(distributePointsExchangeMoney.getPoints())).divide(distributePointsExchangeMoney.getMoney(), 2, RoundingMode.HALF_DOWN);
 					points = returnPoints;
 				}
+				if (userDistribute != null) {
+					//处理渠道规则分销
+					points = handlerDistributeRule(order, distributeWaitingSendPoints, userDistribute.getId(), distributePointsExchangeMoney, points);
+				}
+
 				distributeWaitingSendPoints.setPoints(points);
 				if (points != null && points.compareTo(BigDecimal.ZERO) > 0) {
 					log.info("用户{}邀请{},产生分销订单分发积分记录入库", userDistributeShared.getSharedId(), order.getUserId());
@@ -2062,6 +2067,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				BigDecimal discountMoney = orderDon.getMoney().multiply(coupon.getDiscount());
 				orderDon.setMoney(discountMoney);
 				couponMoney = orderDon.getRealMoney().subtract(discountMoney);
+				//记录折扣 用于分销
+				couponUser.setDiscount(coupon.getDiscount());
+				couponUserMapper.updateById(couponUser);
 			} else if (coupon.getType() == Coupon.Type.reduce) {
 				if (goodsType == 2) {
 					if (skuMoney.compareTo(coupon.getReduceCondition()) < 0) {
@@ -2328,7 +2336,40 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				orderDon.setIsDistribute(true);
 				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()));
 				if (userDistribute != null) {
-					orderDon.setIsFixedDistribute(true);
+					//直接去除
+					if (!userDistributeShared.getIsBind()) {
+						orderDon.setIsDistribute(false);
+					} else {
+						//45天内是否下单成功
+						Date createdTime = userDistributeShared.getCreatedTime();
+						DateTime forty_five = DateUtil.offsetDay(createdTime, 45);
+						//在45天内
+						Boolean is_fit = false;
+						boolean before = DateTime.now().isBefore(forty_five);
+						//超过45天还未下过单
+						//直接不参与后续的 提成
+						if (before) {
+							is_fit = true;
+						} else {
+							int count = this.count(Wrappers.lambdaQuery(OrderDon.class)
+									.eq(OrderDon::getUserId, userId)
+									.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+									.le(OrderDon::getCreatedTime, forty_five));
+							if (count > 0) {
+								is_fit = true;
+							} else {
+								userDistributeShared.setIsBind(false);
+								userDistributeSharedMapper.updateById(userDistributeShared);
+							}
+						}
+						//未达标
+						if (is_fit) {
+							orderDon.setIsFixedDistribute(true);
+						} else {
+							orderDon.setIsDistribute(false);
+							orderDon.setIsFixedDistribute(false);
+						}
+					}
 					orderDon.setCpsPopularizeId(userDistributeShared.getDsPopularizeId());
 				}
 			}
@@ -2426,4 +2467,66 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		transport.setAddress(address.getAddress());
 		orderDonTransportMapper.insert(transport);
 	}
+
+	private BigDecimal handlerDistributeRule(OrderDon order, DistributeWaitingSendPoints distributeWaitingSendPoints, Long distributeId, DistributePointsExchangeMoney distributePointsExchangeMoney, BigDecimal points) {
+		//是否使用优惠券 且优惠券折扣小于低于9折
+		if (order.getCouponUserId() != 0) {
+			//是否开启了渠道规则分销
+			SysConfig ruleConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.DISTRIBUTE_RULE_KEY).last("limit 1"));
+			if (ruleConfig != null && StrUtil.equals(Constant.ONE_STR, ruleConfig.getSysValue())) {
+				//是否是规则过滤平台
+				SysConfig ruleFilterGoods = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+						.eq(SysConfig::getSysKey, Constant.DISTRIBUTE_RULE_FILTER_GOODS_KEY).last("limit 1"));
+				List<Long> filterGoodsIds = null;
+				if (ruleFilterGoods != null && StrUtil.isNotBlank(ruleFilterGoods.getSysValue())) {
+					try {
+						filterGoodsIds = Jsons.parseList(ruleFilterGoods.getSysValue(), Long.class);
+					} catch (Exception e) {
+					}
+				}
+				if (filterGoodsIds == null || !filterGoodsIds.contains(order.getGoodsId())) {
+					//优惠券折扣是否小于低于9折
+					CouponUser couponUser = couponUserMapper.getCouponByCouponUserId(order.getCouponUserId());
+					BigDecimal plat_discount = couponUser.getDiscount();
+					BigDecimal nineDis = BigDecimal.valueOf(0.90);
+					if (plat_discount != null && plat_discount.compareTo(BigDecimal.ZERO) > 0 && plat_discount.compareTo(nineDis) <= 0) {
+						//是否参与渠道分销规则
+						//用户下单订单 是否使用 优惠券小于低于9折
+						//分销利润金额 减去(规格原价 * 目前使用的折扣 - 规格原价 * 渠道自身折扣 /2)
+						BigDecimal realMoney = order.getRealMoney();
+						//查询渠道对应的折扣
+						Coupon coupon = couponDistributePopularizeMapper.selectDiscountCouponByUserId(distributeId, order.getSkuId());
+						//未配置对应折扣
+						//按优惠多少对半平摊
+						if (coupon == null) {
+							BigDecimal splitDiscount = BigDecimal.valueOf(1).subtract(plat_discount);
+							BigDecimal avg = realMoney.multiply(splitDiscount).divide(BigDecimal.valueOf(2));
+							points = points.subtract(avg.multiply(BigDecimal.valueOf(distributePointsExchangeMoney.getPoints())).divide(distributePointsExchangeMoney.getMoney(), 2, RoundingMode.HALF_DOWN));
+							if (points.compareTo(BigDecimal.ZERO) < 0) {
+								points = BigDecimal.ZERO;
+							}
+							distributeWaitingSendPoints.setIsRule(true);
+						}
+						if (coupon != null) {
+							BigDecimal distribute_discount = coupon.getDiscount();
+
+							BigDecimal ds_money = realMoney.multiply(distribute_discount);
+							BigDecimal plat_ds_money = realMoney.multiply(plat_discount);
+							BigDecimal subtractMoney = ds_money.subtract(plat_ds_money);
+							if (subtractMoney.compareTo(BigDecimal.ZERO) > 0) {
+								BigDecimal avg = subtractMoney.divide(BigDecimal.valueOf(2));
+								points = points.subtract(avg.multiply(BigDecimal.valueOf(distributePointsExchangeMoney.getPoints())).divide(distributePointsExchangeMoney.getMoney(), 2, RoundingMode.HALF_DOWN));
+								if (points.compareTo(BigDecimal.ZERO) < 0) {
+									points = BigDecimal.ZERO;
+								}
+								distributeWaitingSendPoints.setIsRule(true);
+							}
+						}
+					}
+				}
+			}
+		}
+		return points;
+	}
 }

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

@@ -3,6 +3,7 @@ package com.cyksj.web.controller.manage.distribute;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.BetweenFormater;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -24,9 +25,11 @@ import com.cyksj.model.entity.*;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
 import com.cyksj.model.request.UserDistributeReq;
 import com.cyksj.model.views.*;
+import com.cyksj.redis.RedisService;
 import com.cyksj.service.distribute.DistributeService;
 import com.cyksj.service.mange.business.UserBusinessRateService;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
+import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -93,6 +96,12 @@ public class DistributeController {
 
 	private final CouponDistributePopularizeMapper couponDistributePopularizeMapper;
 
+	private final SysConfigService sysConfigService;
+
+	private final RedisService redisService;
+
+	private final UserDistributeRuleOrderRecordMapper userDistributeRuleOrderRecordMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -707,4 +716,112 @@ public class DistributeController {
 		UserDistributeViews userDistributeViews = userDistributeMapper.getApplyDetailByUserId(userId);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(userDistributeViews);
 	}
+
+	/**
+	 * 获取渠道分销规则开启 状态
+	 */
+	@GetMapping("/get/rule/status")
+	public Result<Boolean> getRuleStatus() {
+		String ruleKey = Constant.DISTRIBUTE_RULE_KEY;
+		SysConfig ruleConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, ruleKey).last("limit 1"));
+		if (ruleConfig == null) {
+			ruleConfig = new SysConfig();
+			ruleConfig.setSysKey(ruleKey);
+			ruleConfig.setRemark("渠道分销规则key");
+			//默认开启
+			ruleConfig.setSysValue(Constant.ONE_STR);
+			if (redisService.setNx(ruleKey, 1, 5l)) {
+				sysConfigService.save(ruleConfig);
+			}
+		}
+		if (StrUtil.equals(Constant.ONE_STR, ruleConfig.getSysValue())) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult(true);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(false);
+	}
+
+	/**
+	 * 开启/关闭 渠道分销规则 默认开启
+	 */
+	@PutMapping("/update/status/rule")
+	public Result<String> updateDsRuleStatus() {
+		String ruleKey = Constant.DISTRIBUTE_RULE_KEY;
+		SysConfig ruleConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, ruleKey).last("limit 1"));
+		if (ruleConfig == null) {
+			throw BusinessRuntimeException.getInstance("渠道分销规则配置不存在");
+		}
+		if (Constant.ZERO_STR.equals(ruleConfig.getSysValue())) {
+			ruleConfig.setSysValue(Constant.ONE_STR);
+		} else {
+			ruleConfig.setSysValue(Constant.ZERO_STR);
+		}
+		sysConfigService.saveOrUpdate(ruleConfig);
+		//记录关闭打开状态
+		//关闭 记录一次
+		//距离上一次时间
+		UserDistributeRuleOrderRecord userDistributeRuleOrderRecord = Optional.ofNullable(userDistributeRuleOrderRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributeRuleOrderRecord.class)
+				.orderByDesc(UserDistributeRuleOrderRecord::getId).last("limit 1"))).orElse(new UserDistributeRuleOrderRecord());
+		if (StrUtil.equals(Constant.ZERO_STR, ruleConfig.getSysValue())) {
+			//距离上次关闭时间少于10分钟 不记录关闭时间
+			if (userDistributeRuleOrderRecord.getId() == null) {
+				if (redisService.setNx(RedisService.key.DISTRIBUTE_RULE_TIME_KEY.getName(), 1, RedisService.key.DISTRIBUTE_RULE_TIME_KEY.getTimeout())) {
+					userDistributeRuleOrderRecord.setEndTime(DateTime.now());
+					userDistributeRuleOrderRecordMapper.insert(userDistributeRuleOrderRecord);
+				}
+			} else {
+				if (userDistributeRuleOrderRecord.getStartTime() != null) {
+					Date startTime = userDistributeRuleOrderRecord.getStartTime();
+					if (DateTime.now().isAfter(DateUtil.offsetMinute(startTime, 10))) {
+						if (redisService.setNx(RedisService.key.DISTRIBUTE_RULE_TIME_KEY.getName(), 1, RedisService.key.DISTRIBUTE_RULE_TIME_KEY.getTimeout())) {
+							UserDistributeRuleOrderRecord newRecord = new UserDistributeRuleOrderRecord();
+							newRecord.setEndTime(DateTime.now());
+							userDistributeRuleOrderRecordMapper.insert(newRecord);
+						}
+					}
+				}
+			}
+		} else {
+			if (userDistributeRuleOrderRecord.getId() != null && userDistributeRuleOrderRecord.getStartTime() == null) {
+				if (DateTime.now().isAfter(DateUtil.offsetMinute(userDistributeRuleOrderRecord.getEndTime(), 10))) {
+					userDistributeRuleOrderRecord.setStartTime(DateTime.now());
+					userDistributeRuleOrderRecord.setDuration(DateUtil.formatBetween(userDistributeRuleOrderRecord.getEndTime(), userDistributeRuleOrderRecord.getStartTime(), BetweenFormater.Level.SECOND));
+					userDistributeRuleOrderRecordMapper.updateById(userDistributeRuleOrderRecord);
+				}
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 渠道分销规则列表
+	 */
+	@GetMapping("/get/rule/list")
+	public Result<SearchResult<UserDistributeRuleOrderRecordView>> getDistributeRuleList() {
+		SearchResult<UserDistributeRuleOrderRecordView> search = beanSearcher.search(UserDistributeRuleOrderRecordView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		search.getDataList().forEach(data -> {
+			Date endTime = data.getEndTime();
+			Date startTime = data.getStartTime();
+			String time = StrUtil.EMPTY;
+			if (endTime != null) {
+				time = String.format("created_time >= '%s'", DateUtil.format(endTime, "yyyy-MM-dd HH:mm:ss"));
+			}
+			if (startTime != null) {
+				if (StrUtil.isNotBlank(time)) {
+					time += " and ";
+				}
+				time += String.format("created_time < '%s'", DateUtil.format(startTime, "yyyy-MM-dd HH:mm:ss"));
+			}
+			String condition = "where is_rule is true";
+			if (StrUtil.isNotBlank(time)) {
+				condition += String.format(" and %s", time);
+			}
+			DistributeWaitingOrderPointsRuleView ruleView = beanSearcher.searchFirst(DistributeWaitingOrderPointsRuleView.class, MapUtils.builder()
+					.put("condition", condition).build());
+			data.setNumOfOrder(ruleView.getNumOfOrder());
+			data.setOrderAmount(ruleView.getOrderAmount() == null ? BigDecimal.ZERO : ruleView.getOrderAmount());
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
 }

+ 1 - 3
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -58,6 +58,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.List;
@@ -113,9 +114,6 @@ public class OrderController {
     @Autowired
     private StripeService stripeService;
 
-    @Autowired
-    private UserBindRelationService userBindRelationService;
-
     /**
      * 支付
      * @author chan