فهرست منبع

实物设备分销

zoujiajian 2 سال پیش
والد
کامیت
71bd854c44

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.equipment;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserDistributeEquipment;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserDistributeEquipmentMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/3/18 16:30
+ */
+public interface UserDistributeEquipmentMapper extends BaseMapper<UserDistributeEquipment> {
+}

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

@@ -62,6 +62,11 @@ public class DistributeWaitingSendPoints extends BaseEntity{
 	 */
 	private Integer rate;
 
+	/**
+	 * 是否特殊设备分销订单
+	 */
+	private Boolean isSpecialEp;
+
 	@Getter
 	public enum Status{
 		close("分销订单关闭,积分奖励不分发"),

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

@@ -68,6 +68,9 @@ public class GoodsDon extends BaseEntity {
      */
     private String remark;
 
+    /**
+     * 1.虚拟,2.实物,3.潮玩,4.租赁
+     */
     private Integer type;
 
     /**

+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeEquipment.java

@@ -0,0 +1,33 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserDistributeEquipment
+ * 创建者: JavaZou
+ * 创建时间:2024/3/18 16:27
+ */
+@Getter
+@Setter
+public class UserDistributeEquipment extends BaseEntity{
+	private Long userId;
+
+	/**
+	 * 设备提成
+	 */
+	private BigDecimal ep;
+
+	/**
+	 * Apple TV 提成
+	 */
+	private BigDecimal acTv;
+
+	/**
+	 * 套餐提成
+	 */
+	private BigDecimal combo;
+}

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

@@ -49,6 +49,12 @@ public class YhShopDistributeWaitingSendPoints extends BaseEntity {
 
 	private Status sendStatus;
 
+	/**
+	 * 是否是特殊设备分销订单
+	 * false
+	 */
+	private Boolean isSpecialEp;
+
 	public enum Status{
 		close("店铺分销订单关闭,积分奖励不分发"),
 		success("积分发送成功"),

+ 6 - 4
netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java

@@ -1,9 +1,6 @@
 package com.cyksj.model.request;
 
-import com.cyksj.model.entity.CouponDistributePopularize;
-import com.cyksj.model.entity.UserDistributeTargetAlert;
-import com.cyksj.model.entity.UserPlatDistributeRate;
-import com.cyksj.model.entity.UserPlatSkuDistributeRate;
+import com.cyksj.model.entity.*;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -56,4 +53,9 @@ public class UserDistributeReq {
 	 * 渠道目标额
 	 */
 	private List<UserDistributeTargetAlert> targets;
+
+	/**
+	 * 设备分销
+	 */
+	private UserDistributeEquipment epRate;
 }

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

@@ -19,7 +19,7 @@ import java.util.Date;
 @Setter
 @SearchBean(tables = "user_distribute ud left join user_distribute_shared us on ud.user_id = us.shared_id" +
 		" left join order_don od on od.user_id = us.user_id and od.is_fixed_distribute = 1 and od.status not in ('noPayment', 'close') :time:",
-		where = "ud.deleted is true",
+		where = "ud.deleted is true :condition:",
 		groupBy = "ud.id,ud.user_id,ud.business_id,ud.remark,ud.created_time,ud.update_time,ud.business_bind_time,ud.type")
 public class UserDistributeViews {
 

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

@@ -14,6 +14,7 @@ import com.cyksj.mapper.UserDistributeSharedRelateUnbindMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.shop.YhShopMapper;
 import com.cyksj.mapper.shop.YhShopUserPlatDistributeRateMapper;
@@ -74,6 +75,9 @@ public class DistributeServiceImpl implements DistributeService {
 	private final UserDistributeTargetAlertMapper targetAlertMapper;
 
 	private final UserDistributeSharedRelateUnbindMapper userDistributeSharedRelateUnbindMapper;
+
+	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertDistribute(UserDistributeReq userDistributeReq) {
@@ -149,6 +153,9 @@ public class DistributeServiceImpl implements DistributeService {
 		//渠道目标额配置
 		List<UserDistributeTargetAlert> targets = userDistributeReq.getTargets();
 		handlerDistributeTargetAlert(userDistribute.getId(), targets);
+
+		//设备分销
+		handlerSpecialEquipmentRate(userDistributeReq.getEpRate(), userDistribute.getUserId());
 	}
 
 	@Override
@@ -281,6 +288,9 @@ public class DistributeServiceImpl implements DistributeService {
 
 		//渠道目标额配置
 		handlerDistributeTargetAlert(userDistribute.getId(), userDistributeReq.getTargets());
+
+		//设备分销
+		handlerSpecialEquipmentRate(userDistributeReq.getEpRate(), userDistribute.getUserId());
 	}
 
 	@Override
@@ -486,4 +496,37 @@ public class DistributeServiceImpl implements DistributeService {
 			targetAlertMapper.deleteBatchIds(delDbTargetAlert);
 		}
 	}
+
+	/**
+	 * 设备分销
+	 */
+	private void handlerSpecialEquipmentRate(UserDistributeEquipment epRate, Long userId) {
+		BigDecimal zero = BigDecimal.ZERO;
+		if (epRate != null) {
+			epRate.setUserId(userId);
+			BigDecimal ep = epRate.getEp();
+			BigDecimal acTv = epRate.getAcTv();
+			BigDecimal combo = epRate.getCombo();
+			if (ep == null || acTv == null || combo == null) {
+				throw BusinessRuntimeException.getInstance("请填写设备分销必填项..");
+			}
+			if (ep.compareTo(zero) <= 0 || acTv.compareTo(zero) <= 0 || combo.compareTo(zero) <= 0 || combo.compareTo(BigDecimal.valueOf(100)) >= 0) {
+				throw BusinessRuntimeException.getInstance("请输入正确的设备分销设置");
+			}
+			if (epRate.getId() != null) {
+				try {
+					userDistributeEquipmentMapper.insert(epRate);
+				} catch (DuplicateKeyException e) {
+				}
+			} else {
+				userDistributeEquipmentMapper.updateById(epRate);
+			}
+			return;
+		}
+		if (userDistributeEquipmentMapper.selectCount(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+				.eq(UserDistributeEquipment::getUserId, userId)) > 0) {
+			userDistributeEquipmentMapper.delete(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+					.eq(UserDistributeEquipment::getUserId, userId));
+		}
+	}
 }

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

@@ -847,7 +847,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 DistributeWaitingSendPoints.Status sendStatus = distributeWaitingSendPoints.getSendStatus();
                 BigDecimal points = distributeWaitingSendPoints.getPoints();
                 if (sendStatus == DistributeWaitingSendPoints.Status.waiting) {
-                    if (refundMoney.compareTo(money) == 0) {
+                    //实物设备退款就清0
+                    if (refundMoney.compareTo(money) == 0 || orderDon.getGoodsId() == 15) {
                         //待发送状态 全额退款
                         distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
                         distributeWaitingSendPoints.setRefundPoints(points);
@@ -875,7 +876,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 } else if (sendStatus == DistributeWaitingSendPoints.Status.success) {
                     //已发送的提成 部分退款 全额退款 需要扣除用户积分
                     //扣除固定推广者积分
-                    if (refundMoney.compareTo(money) == 0) {
+                    //实物设备退款就清0
+                    if (refundMoney.compareTo(money) == 0 || orderDon.getGoodsId() == 15) {
                         userBenefitsService.deductDistributePoints(orderDon.getId(), distributeWaitingSendPoints.getSharedId(), points);
                         distributeWaitingSendPoints.setRefundPoints(points);
                         distributeWaitingSendPoints.setPoints(BigDecimal.ZERO);

+ 74 - 5
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -47,6 +47,7 @@ import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
@@ -54,6 +55,7 @@ import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.dto.ChannelBaiDuDiscountDto;
 import com.cyksj.model.manage.dto.GiftCardDto;
+import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.*;
@@ -161,6 +163,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
+
 	private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
 
 	private final BusinessDistributeDefaultSkuRateConfigMapper businessDistributeDefaultSkuRateConfigMapper;
@@ -261,6 +265,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final EquipmentActivityReduceMapper equipmentActivityReduceMapper;
 
+	private final GoodsDonSpecMapper goodsDonSpecMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1444,6 +1450,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		Long businessId = null;
 		//普通分销
 		GoodsDon goodsDon = goodsDonMapper.selectById(order.getGoodsId());
+		GoodsDonSku goodsDonSku = null;
 		if (goodsDon == null || !goodsDon.getIsDistribute()) {
 			log.info("分销订单orderId:{}对应平台goodsId:{}不存在或已不参与分成比例", order.getId(), order.getGoodsId());
 			return;
@@ -1471,7 +1478,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					rate = goodsDon.getRate();
 					//实物分销比例
 					if (goodsDon.getType() == 2) {
-						GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
+						goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
 						if (goodsDonSku != null) {
 							//不包含套餐权益
 							if (!goodsDonSku.getIsBenefits()) {
@@ -1525,7 +1532,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						rate = userPlatDistributeRate.getRate();
 						secondRate = userPlatDistributeRate.getSecondRate();
 						if (goodsDon.getType() == 2) {
-							GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
+							goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
 							if (goodsDonSku != null) {
 								//不包含套餐权益
 								if (!goodsDonSku.getIsBenefits()) {
@@ -1542,8 +1549,20 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					points = returnPoints;
 				}
 				if (userDistribute != null) {
-					//处理渠道规则分销
-					points = handlerDistributeRule(order, distributeWaitingSendPoints, userDistribute.getId(), distributePointsExchangeMoney, points);
+					UserDistributeEquipment userDistributeEquipment = null;
+					if (goodsDon.getType() == 2) {
+						userDistributeEquipment = userDistributeEquipmentMapper.selectOne(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+								.eq(UserDistributeEquipment::getUserId, userDistribute.getUserId()).last("limit 1"));
+					}
+					//是否特殊渠道设备分销用户
+					if (userDistributeEquipment != null) {
+						BigDecimal takeMoney = handlerEquipmentDistribute(order, goodsDonSku, userDistributeEquipment);
+						points = takeMoney.multiply(BigDecimal.valueOf(distributePointsExchangeMoney.getPoints())).divide(distributePointsExchangeMoney.getMoney(), 2, RoundingMode.HALF_DOWN);
+						distributeWaitingSendPoints.setIsSpecialEp(true);
+					} else {
+						//处理渠道规则分销
+						points = handlerDistributeRule(order, distributeWaitingSendPoints, userDistribute.getId(), distributePointsExchangeMoney, points);
+					}
 				}
 
 				distributeWaitingSendPoints.setPoints(points);
@@ -2581,6 +2600,14 @@ 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.setCpsPopularizeId(userDistributeShared.getDsPopularizeId());
+					//是否特殊渠道设备分销用户
+					Integer selectCount = userDistributeEquipmentMapper.selectCount(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+							.eq(UserDistributeEquipment::getUserId, userDistribute.getUserId()));
+					if (selectCount > 0) {
+						orderDon.setIsFixedDistribute(true);
+						return;
+					}
 					//直接去除
 					if (!userDistributeShared.getIsBind()) {
 						UserDistributeSharedRelateUnbind userDistributeSharedRelateUnbind = userDistributeSharedRelateUnbindMapper.selectOne(Wrappers.lambdaQuery(UserDistributeSharedRelateUnbind.class)
@@ -2629,7 +2656,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 							orderDon.setIsFixedDistribute(false);
 						}
 					}
-					orderDon.setCpsPopularizeId(userDistributeShared.getDsPopularizeId());
 				}
 			}
 		}
@@ -2780,4 +2806,47 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			userBenefitsService.recordBalanceBySource(user.getId(), BigDecimal.valueOf(-subBalance.longValue()), UserBalanceSourceRecord.Source.payment);
 		}
 	}
+
+	/**
+	 * 特殊设备分销
+	 */
+	private BigDecimal handlerEquipmentDistribute(OrderDon orderDon, GoodsDonSku goodsDonSku, UserDistributeEquipment userDistributeEquipment) {
+		BigDecimal takeMoney = userDistributeEquipment.getEp();
+		try {
+			BigDecimal couponMoney = orderDon.getCouponMoney();
+			BigDecimal balance = orderDon.getBalance();
+			List<Integer> specIdsList = Jsons.parseList(goodsDonSku.getSpecIds(), Integer.class);
+			//包含Apple TV
+			if (goodsDonSku.getSpecJson().contains("TV")) {
+				takeMoney = takeMoney.add(userDistributeEquipment.getAcTv());
+			}
+			//包含套餐
+			if (goodsDonSku.getSpecJson().contains("套餐")) {
+				GoodsDonSpec goodsDonSpec = goodsDonSpecMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSpec.class)
+						.eq(GoodsDonSpec::getGoodsId, orderDon.getGoodsId()).last("limit 1"));
+				List<ReqGoodsSkuSpec> specs = Jsons.parseList(goodsDonSpec.getSpecsJson(), ReqGoodsSkuSpec.class);
+				for (ReqGoodsSkuSpec e : specs) {
+					if (e.getKey().contains("套餐")) {
+						List<ReqGoodsSkuSpec.Node> values = e.getValues();
+						for (ReqGoodsSkuSpec.Node node : values) {
+							if (specIdsList.contains(node.getId())) {
+								BigDecimal price = node.getPrice();
+								takeMoney = takeMoney.add(price.multiply(userDistributeEquipment.getCombo()).divide(BigDecimal.valueOf(100)));
+								break;
+							}
+						}
+					}
+				}
+			}
+			//使用优惠分摊一半
+			if (couponMoney != null) {
+				takeMoney = takeMoney.subtract(couponMoney.divide(BigDecimal.valueOf(2), 0, RoundingMode.DOWN));
+			}
+			if (balance != null) {
+				takeMoney = takeMoney.subtract(balance.divide(BigDecimal.valueOf(2), 0, RoundingMode.DOWN));
+			}
+		} catch (Exception e) {
+		}
+		return takeMoney;
+	}
 }

+ 2 - 135
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java

@@ -1,7 +1,5 @@
 package com.cyksj.web.controller.cps;
 
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -14,36 +12,25 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.dto.AuthToken;
 import com.cyksj.model.dto.CpsAuthDto;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
-import com.cyksj.model.entity.*;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserDistribute;
 import com.cyksj.model.request.LoginReq;
-import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.authorization.AuthorizationService;
 import com.cyksj.service.cps.CpsManageService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.web.util.StpCpsManageUser;
-import com.ejlchina.searcher.BeanSearcher;
-import com.ejlchina.searcher.SearchResult;
-import com.ejlchina.searcher.util.MapBuilder;
-import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-import java.util.Map;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /*
  *项目名: netflix
@@ -57,12 +44,6 @@ import java.util.stream.Collectors;
 public class CpsBackLoginController {
 	private final CpsManageService cpsManageService;
 
-	private final BeanSearcher beanSearcher;
-
-	private final HttpServletRequest request;
-
-	private final GoodsDonMapper goodsDonMapper;
-
 	private final RedisService redisService;
 
 	private final static Sequence SEQUENCE = new Sequence(0);
@@ -169,118 +150,4 @@ public class CpsBackLoginController {
 		redisService.del(key);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(o.toString());
 	}
-
-
-	/**
-	 * 个人分销平台数据详情
-	 */
-	@GetMapping("/get/distribute/detail")
-	public Result<CpsUserDistributeDetailView> getDistributeDetail() {
-		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
-		User user = beanSearcher.searchFirst(User.class, MapUtils.builder().field(User::getId, cpsUserId).onlySelect(User::getPoints).build());
-		BigDecimal thresholdPoints = BigDecimal.valueOf(1000);
-		BigDecimal wApplyMoney = user.getPoints().divide(thresholdPoints, 2, RoundingMode.DOWN);
-		//已提现
-		Number gotApplyMoney = beanSearcher.searchSum(DistributeMoneyApply.class, MapUtils.builder()
-				.field(DistributeMoneyApply::getUserId, cpsUserId)
-				.field(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success.name())
-				.build(), "money");
-		Number reMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.success.name()).build(), "points");
-		Number wMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting.name()).build(), "points");
-		List<UserDistributeRateView> rateViews = beanSearcher.searchAll(UserDistributeRateView.class, MapUtils.builder()
-				.put("distribute_id", String.format("and distribute_id = (select id from user_distribute where user_id = %s and deleted is true limit 1)", cpsUserId))
-				.orderBy(UserDistributeRateView::getRate).desc()
-				.build());
-		CpsUserDistributeDetailView detailView = new CpsUserDistributeDetailView();
-		Map<String, List<UserDistributeRateView>> collect = rateViews.stream().filter(ct -> StrUtil.isNotBlank(ct.getCategoryName())).collect(Collectors.groupingBy(UserDistributeRateView::getCategoryName));
-		detailView.setRateViews(collect);
-		detailView.setWMoney(BigDecimal.valueOf(wMoneyPoints.doubleValue()).divide(thresholdPoints, 2, RoundingMode.DOWN));
-		detailView.setReMoney(BigDecimal.valueOf(reMoneyPoints.doubleValue()).divide(thresholdPoints, 2, RoundingMode.DOWN));
-
-		detailView.setWApplyMoney(wApplyMoney);
-		detailView.setGotApplyMoney(BigDecimal.valueOf(gotApplyMoney.doubleValue()).divide(BigDecimal.valueOf(100)));
-		return GatewayResponse.SUCCESS.newBuilder().toResult(detailView);
-	}
-
-	/**
-	 * 待入账数据统计
-	 */
-	@GetMapping("/get/wMoney/statisticsData")
-	public Result<BrokenLineCpsUserWMoneyView> getWMoneyStatisticsDataView(Long firstDate, Long lastDate) {
-		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
-		DateTime first = null;
-		DateTime end = null;
-		if (firstDate != null) {
-			first = DateUtil.date(firstDate);
-		}
-		if (lastDate != null) {
-			end = DateUtil.date(lastDate);
-		}
-		BrokenLineCpsUserWMoneyView brokenLineCpsUserWMoneyView = Optional.ofNullable(cpsManageService.getWMoneyStatisticsDate(cpsUserId, first, end)).orElse(new BrokenLineCpsUserWMoneyView());
-		List<CpsUserWMoneyStatisticsDataView> dataView = cpsManageService.getWMoneyStatisticsDataView(cpsUserId, first, end);
-		brokenLineCpsUserWMoneyView.setDataView(dataView);
-		return GatewayResponse.SUCCESS.newBuilder().toResult(brokenLineCpsUserWMoneyView);
-	}
-
-	/**
-	 * 分销订单收入统计
-	 */
-	@GetMapping("/get/distribute/orders/statistics")
-	public Result<SearchResult<UserDistributeOrdersStatisticsView>> getUserDistributeOrdersStatisticsView(Long firstDate, Long lastDate) {
-		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
-		String first = null;
-		String end = null;
-		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);
-		}
-		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);
-		}
-		SearchResult<UserDistributeOrdersStatisticsView> search = beanSearcher.search(UserDistributeOrdersStatisticsView.class, builder.build());
-		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
-	}
-
-	/**
-	 * 分销订单收入详细
-	 */
-	@GetMapping("/get/distribute/orders/detail")
-	public Result<SearchResult<UserDistributeOrdersDetailView>> getUserDistributeOrdersDetailView(Long firstDate, Long lastDate) {
-		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
-		String first = null;
-		String end = null;
-		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);
-		}
-		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);
-		}
-		SearchResult<UserDistributeOrdersDetailView> search = beanSearcher.search(UserDistributeOrdersDetailView.class, builder.build());
-		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
-	}
-
-	/**
-	 * 分销商品列表
-	 */
-	@GetMapping("/get/goods")
-	public Result<List<GoodsDon>> getGoodsList() {
-		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
-		List<GoodsDon> goodsDons = goodsDonMapper.getDistributeGoodsDetail(cpsUserId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDons);
-	}
 }

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

@@ -0,0 +1,165 @@
+package com.cyksj.web.controller.cps;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.model.entity.DistributeMoneyApply;
+import com.cyksj.model.entity.DistributeWaitingSendPoints;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.views.*;
+import com.cyksj.service.cps.CpsManageService;
+import com.cyksj.web.util.StpCpsManageUser;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CpsDistribtueDataController
+ * 创建者: JavaZou
+ * 创建时间:2024/3/19 11:42
+ * 分销数据控制层
+ */
+@RestController
+@RequestMapping("/cps/manage")
+@RequiredArgsConstructor
+public class CpsDistribtueDataController {
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final CpsManageService cpsManageService;
+
+	/**
+	 * 个人分销平台数据详情
+	 */
+	@GetMapping("/get/distribute/detail")
+	public Result<CpsUserDistributeDetailView> getDistributeDetail() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		User user = beanSearcher.searchFirst(User.class, MapUtils.builder().field(User::getId, cpsUserId).onlySelect(User::getPoints).build());
+		BigDecimal thresholdPoints = BigDecimal.valueOf(1000);
+		BigDecimal wApplyMoney = user.getPoints().divide(thresholdPoints, 2, RoundingMode.DOWN);
+		//已提现
+		Number gotApplyMoney = beanSearcher.searchSum(DistributeMoneyApply.class, MapUtils.builder()
+				.field(DistributeMoneyApply::getUserId, cpsUserId)
+				.field(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success.name())
+				.build(), "money");
+		Number reMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.success.name()).build(), "points");
+		Number wMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting.name()).build(), "points");
+		List<UserDistributeRateView> rateViews = beanSearcher.searchAll(UserDistributeRateView.class, MapUtils.builder()
+				.put("distribute_id", String.format("and distribute_id = (select id from user_distribute where user_id = %s and deleted is true limit 1)", cpsUserId))
+				.orderBy(UserDistributeRateView::getRate).desc()
+				.build());
+		CpsUserDistributeDetailView detailView = new CpsUserDistributeDetailView();
+		Map<String, List<UserDistributeRateView>> collect = rateViews.stream().filter(ct -> StrUtil.isNotBlank(ct.getCategoryName())).collect(Collectors.groupingBy(UserDistributeRateView::getCategoryName));
+		detailView.setRateViews(collect);
+		detailView.setWMoney(BigDecimal.valueOf(wMoneyPoints.doubleValue()).divide(thresholdPoints, 2, RoundingMode.DOWN));
+		detailView.setReMoney(BigDecimal.valueOf(reMoneyPoints.doubleValue()).divide(thresholdPoints, 2, RoundingMode.DOWN));
+
+		detailView.setWApplyMoney(wApplyMoney);
+		detailView.setGotApplyMoney(BigDecimal.valueOf(gotApplyMoney.doubleValue()).divide(BigDecimal.valueOf(100)));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(detailView);
+	}
+
+	/**
+	 * 待入账数据统计
+	 */
+	@GetMapping("/get/wMoney/statisticsData")
+	public Result<BrokenLineCpsUserWMoneyView> getWMoneyStatisticsDataView(Long firstDate, Long lastDate) {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		DateTime first = null;
+		DateTime end = null;
+		if (firstDate != null) {
+			first = DateUtil.date(firstDate);
+		}
+		if (lastDate != null) {
+			end = DateUtil.date(lastDate);
+		}
+		BrokenLineCpsUserWMoneyView brokenLineCpsUserWMoneyView = Optional.ofNullable(cpsManageService.getWMoneyStatisticsDate(cpsUserId, first, end)).orElse(new BrokenLineCpsUserWMoneyView());
+		List<CpsUserWMoneyStatisticsDataView> dataView = cpsManageService.getWMoneyStatisticsDataView(cpsUserId, first, end);
+		brokenLineCpsUserWMoneyView.setDataView(dataView);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(brokenLineCpsUserWMoneyView);
+	}
+
+	/**
+	 * 分销订单收入统计
+	 */
+	@GetMapping("/get/distribute/orders/statistics")
+	public Result<SearchResult<UserDistributeOrdersStatisticsView>> getUserDistributeOrdersStatisticsView(Long firstDate, Long lastDate) {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		String first = null;
+		String end = null;
+		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);
+		}
+		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);
+		}
+		SearchResult<UserDistributeOrdersStatisticsView> search = beanSearcher.search(UserDistributeOrdersStatisticsView.class, builder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 分销订单收入详细
+	 */
+	@GetMapping("/get/distribute/orders/detail")
+	public Result<SearchResult<UserDistributeOrdersDetailView>> getUserDistributeOrdersDetailView(Long firstDate, Long lastDate) {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		String first = null;
+		String end = null;
+		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);
+		}
+		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);
+		}
+		SearchResult<UserDistributeOrdersDetailView> search = beanSearcher.search(UserDistributeOrdersDetailView.class, builder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 分销商品列表
+	 */
+	@GetMapping("/get/goods")
+	public Result<List<GoodsDon>> getGoodsList() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		List<GoodsDon> goodsDons = goodsDonMapper.getDistributeGoodsDetail(cpsUserId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDons);
+	}
+}

+ 6 - 14
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -230,7 +230,7 @@ public class DistributeController {
 	 * 固定推广者列表
 	 */
 	@GetMapping
-	public Result<SearchResult<UserDistributeViews>> distributeList(String nickname, String showId, String startTime, String endTime) {
+	public Result<SearchResult<UserDistributeViews>> distributeList(String nickname, String showId, String startTime, String endTime, Boolean isSpecialEp) {
 		long adminId = StpUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是否是商务人员
@@ -256,23 +256,15 @@ public class DistributeController {
 			//按时间筛选 固定推广人分销情况 倒序
 			builder.orderBy(UserDistributeViews::getDistributeOrdersMoney).desc();
 		}
+		if (isSpecialEp != null) {
+			//是否是特殊设备分销渠道商
+			String condition = String.format(" and %s (select 1 from user_distribute_equipment up where up.user_id = ud.user_id limit 1)", isSpecialEp ? "exists" : "not exists");
+			builder.put("condition", condition);
+		}
 		Map<Long, String> businessNameMap = new ConcurrentHashMap<>();
 		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class,
 				builder.build());
 		search.getDataList().forEach(view -> {
-//			Optional.ofNullable(cmsUserMapper.selectById(view.getBusinessId())).ifPresent(business -> view.setBusinessName(business.getNickname()));
-//			Optional.ofNullable(userMapper.selectById(view.getUserId())).ifPresent(user -> {
-//				view.setNickname(user.getNickname());
-//				view.setPoints(user.getPoints());
-//			});
-//			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 = view.getOrders();
-//			BigDecimal hasPayCount = userDistributeMapper.countHasPayBySharedId(view.getUserId(), Constant.noOrderAllStatus, startTime, endTime);
-//			view.setDistributeConsumerRate(orders == 0 ? BigDecimal.ZERO : hasPayCount.divide(BigDecimal.valueOf(view.getDistributeUserNum()), 2, RoundingMode.HALF_DOWN));
 			if (view.getDistributeOrdersMoney().compareTo(BigDecimal.ZERO) > 0) {
 				Optional.ofNullable(userDistributeMapper.selectSoldMaxGoods(view.getUserId())).ifPresent(title -> view.setGoodsTitle(title));
 			}