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

Merge branch 'distribute_back_info_detail'

zoujiajian 3 роки тому
батько
коміт
068ea9646f

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

@@ -2,6 +2,7 @@ package com.cyksj.mapper.manage.distribute;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.UserDistribute;
+import com.cyksj.model.views.UserDistributeViews;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
@@ -21,4 +22,8 @@ public interface UserDistributeMapper extends BaseMapper<UserDistribute> {
 	BigDecimal getHasPayOrdersBySharedId(@Param("userId") Long userId, @Param("noOrderStatus") List<String> noOrderStatus, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
 	BigDecimal countHasPayBySharedId(@Param("userId") Long userId, @Param("noOrderStatus") List<String> noOrderStatus, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	String selectSoldMaxGoods(Long userId);
+
+	UserDistributeViews getApplyDetailByUserId(Long userId);
 }

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

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
+
 /*
  *项目名: netflix
  *文件名: UserDistribute
@@ -25,6 +27,11 @@ public class UserDistribute extends BaseEntity{
 	 */
 	private Long businessId;
 
+	/**
+	 * 商务绑定渠道签约时间
+	 */
+	private Date businessBindTime;
+
 	@TableLogic(value = "1", delval = "0")
 	private Boolean deleted;
 }

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/views/BusinessDistributesDataView.java

@@ -0,0 +1,55 @@
+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;
+
+/*
+ *项目名: netflix
+ *文件名: BusinessDistributesDataView
+ *创建者: JavaZou
+ *创建时间:2023/4/27 16:19
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select distinct business_id from user_distribute_business_rate) ur left join user_distribute ud on ud.business_id = ur.business_id and ud.deleted is true :time1:" +
+		" left join user_distribute_shared us on us.shared_id = ud.user_id :time2:" +
+		" left join order_don od on od.user_id = us.user_id and od.status not in ('close','refund','noPayment') and od.is_fixed_distribute = 1 and od.relation_id != 0 :time3:",
+		groupBy = "ud.business_id")
+public class BusinessDistributesDataView {
+	@DbField("ud.business_id")
+	private Long businessId;
+
+	/**
+	 * 商务名
+	 */
+	@DbField("select nickname from cms_user where id = ud.business_id limit 1")
+	private String businessName;
+
+	/**
+	 * 渠道数量
+	 */
+	@DbField("count(distinct ud.id)")
+	private Integer numOfDistributor;
+
+	/**
+	 * 分销单数
+	 */
+	@DbField("count(od.id)")
+	private Integer numOfDistributeOrders;
+
+	/**
+	 * 分销金额
+	 */
+	@DbField("ifnull(sum(od.money),0)")
+	private BigDecimal distributeOrdersMoney;
+
+	/**
+	 * 拉新用户
+	 */
+	@DbField("count(distinct us.id)")
+	private Integer numOfNewUser;
+}

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

@@ -20,7 +20,7 @@ import java.util.Date;
 @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') and od.relation_id != 0 :time:",
 		where = "ud.deleted is true",
-		groupBy = "ud.id,ud.user_id,ud.business_id,ud.remark,ud.created_time,ud.update_time")
+		groupBy = "ud.id,ud.user_id,ud.business_id,ud.remark,ud.created_time,ud.update_time,ud.business_bind_time")
 public class UserDistributeViews {
 
 	@DbField("ud.id")
@@ -32,10 +32,10 @@ public class UserDistributeViews {
 	@DbField("ud.business_id")
 	private Long businessId;
 
-	@DbIgnore
+	@DbField("select nickname from cms_user where id = ud.business_id limit 1")
 	private String businessName;
 
-	@DbIgnore
+	@DbField("select nickname from user where id = ud.user_id limit 1")
 	private String nickname;
 
 	@DbField("ud.remark")
@@ -46,22 +46,38 @@ public class UserDistributeViews {
 
 	/**
 	 * 分销人数
+	 * 其中拉新用户购买一单又退款,且无后续下单动作的不算分销用户,不统计在此字段内
 	 */
-	@DbField("count(DISTINCT us.user_id)")
+	@DbField("count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END)")
 	private Integer distributeUserNum;
 
+	/**
+	 * 邀请人数
+	 */
+	@DbField("count(DISTINCT us.user_id)")
+	private Integer inviteNum;
+
+	@DbField("ud.business_bind_time")
+	private Date businessBindTime;
+
 	/**
 	 * 分销订单金额(无需产生积分)
 	 */
-	@DbField("ifnull(sum(od.money),0) - ifnull(sum(od.refund_money),0)")
+	@DbField("(ifnull(sum(od.money),0) - ifnull(sum(od.refund_money),0))")
 	private BigDecimal distributeOrdersMoney;
 
 	/**
 	 * 分销消费占比
 	 */
-	@DbIgnore
+	@DbField("ifnull(cast(count(DISTINCT CASE WHEN od.status != 'refund' THEN us.user_id ELSE null END)/count(DISTINCT us.user_id) as decimal(10,2)),0)")
 	private BigDecimal distributeConsumerRate;
 
+	/**
+	 * 销量最高的产品
+	 */
+	@DbIgnore
+	private String goodsTitle;
+
 	@DbIgnore
 	private BigDecimal availableMoney;
 
@@ -69,7 +85,7 @@ public class UserDistributeViews {
 	private BigDecimal gotMoney;
 
 	@DbIgnore
-	private BigDecimal points = BigDecimal.ZERO;
+	private BigDecimal points;
 
 	@DbField("ud.created_time")
 	private Date createdTime;

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

@@ -51,4 +51,24 @@
             and od.created_time &lt; #{endTime}
         </if>
     </select>
+
+    <select id="selectSoldMaxGoods" resultType="java.lang.String">
+        select title
+        from goods_don
+        where id = (select goods_id
+                    from (select user_id from user_distribute_shared where shared_id = #{userId}) s
+                             inner join order_don od
+                                        on od.user_id = s.user_id
+                    where od.status not in ('close', 'noPayment', 'refund')
+                      and is_fixed_distribute = 1
+                    group by goods_id
+                    order by max(money) desc limit 1) limit 1
+    </select>
+
+    <select id="getApplyDetailByUserId" resultType="com.cyksj.model.views.UserDistributeViews">
+        select ifnull(sum(da.money), 0) as gotMoney, cast(u.points / 10 as decimal(10, 2)) as availableMoney
+        from (select id, points from user where id = #{userId} limit 1) u
+                 left join distribute_money_apply da on da.user_id = u.id and verify_status = 'success'
+        group by u.id, u.points
+    </select>
 </mapper>

+ 4 - 0
netflix-dao/src/main/resources/mapper/UserDistributeSharedMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper">
+</mapper>

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

@@ -1,5 +1,6 @@
 package com.cyksj.service.distribute.impl;
 
+import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -49,12 +50,15 @@ public class DistributeServiceImpl implements DistributeService {
 		if (exists != null) {
 			throw BusinessRuntimeException.getInstance("该推广者已添加");
 		}
+		Long businessId = userDistributeReq.getBusinessId();
 		UserDistribute userDistribute = new UserDistribute();
 		userDistribute.setUserId(userDistributeReq.getUserId());
 		userDistribute.setRemark(userDistributeReq.getRemark());
-		userDistribute.setBusinessId(userDistributeReq.getBusinessId());
+		userDistribute.setBusinessId(businessId);
+		if (businessId != null && businessId != 0) {
+			userDistribute.setBusinessBindTime(DateTime.now());
+		}
 		userDistributeMapper.insert(userDistribute);
-		Long businessId = userDistributeReq.getBusinessId();
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
 			if (rate.getRate() < 0 || rate.getRate() > 100) {
 				throw new BusinessRuntimeException("比例错误");
@@ -81,10 +85,15 @@ public class DistributeServiceImpl implements DistributeService {
 		UserDistribute userDistribute = new UserDistribute();
 		userDistribute.setId(userDistributeReq.getId());
 		userDistribute.setRemark(userDistributeReq.getRemark());
-		if (userDistributeReq.getBusinessId() == null) {
-			userDistribute.setBusinessId(0l);
-		} else userDistribute.setBusinessId(userDistributeReq.getBusinessId());
 		Long businessId = userDistributeReq.getBusinessId();
+		if (businessId == null) {
+			userDistribute.setBusinessId(0l);
+		} else {
+			if (userDistribute.getBusinessId() != null && !userDistribute.getBusinessId().equals(businessId)) {
+				userDistribute.setBusinessBindTime(DateTime.now());
+			}
+			userDistribute.setBusinessId(businessId);
+		}
 		userDistributeMapper.updateById(userDistribute);
 		for (UserPlatDistributeRate rate : userDistributeReq.getRates()) {
 			if (rate.getRate() < 0 || rate.getRate() > 100) {

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/mange/business/impl/UserBusinessRateServiceImpl.java

@@ -2,6 +2,8 @@ package com.cyksj.service.mange.business.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.mapper.manage.distribute.UserDistributeBusinessRateMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.model.entity.UserDistribute;
 import com.cyksj.model.entity.UserDistributeBusinessRate;
 import com.cyksj.model.views.CmsUserVO;
 import com.cyksj.model.views.GoodsDonSkuView;
@@ -30,6 +32,8 @@ public class UserBusinessRateServiceImpl implements UserBusinessRateService {
 
 	private final BeanSearcher beanSearcher;
 
+	private final UserDistributeMapper userDistributeMapper;
+
 	@Override
 	public void saveBusinessRate(Long businessId) {
 		if (businessId != null) {
@@ -73,5 +77,9 @@ public class UserBusinessRateServiceImpl implements UserBusinessRateService {
 	public void deleteBusinessRateByUid(Long businessId) {
 		userDistributeBusinessRateMapper.delete(Wrappers.lambdaQuery(UserDistributeBusinessRate.class)
 				.eq(UserDistributeBusinessRate::getBusinessId, businessId));
+
+		userDistributeMapper.update(null, Wrappers.lambdaUpdate(UserDistribute.class)
+				.set(UserDistribute::getBusinessId, 0)
+				.eq(UserDistribute::getBusinessId, businessId));
 	}
 }

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/mange/cms/CmsUserManager.java

@@ -7,7 +7,7 @@ import com.cyksj.mapper.manage.cms.CmsMenuMapper;
 import com.cyksj.mapper.manage.cms.CmsRoleMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.cms.CmsUserRoleMapper;
-import com.cyksj.mapper.manage.distribute.UserDistributeBusinessRateMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.model.entity.CmsMenu;
 import com.cyksj.model.entity.CmsRole;
 import com.cyksj.model.entity.CmsUser;
@@ -44,7 +44,7 @@ public class CmsUserManager {
 
 	private final CmsUserRoleMapper cmsUserRoleMapper;
 
-	private final UserDistributeBusinessRateMapper userDistributeBusinessRateMapper;
+	private final UserDistributeMapper userDistributeMapper;
 
 	private final UserBusinessRateService userBusinessRateService;
 

+ 80 - 18
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -16,6 +16,7 @@ import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.distribute.*;
@@ -41,7 +42,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -88,6 +88,10 @@ public class DistributeController {
 
 	private final BusinessDistributeDefaultRateConfigMapper businessDefaultRateConfigMapper;
 
+	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -168,21 +172,23 @@ public class DistributeController {
 		}
 		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class,
 				builder.build());
-		DistributePointsExchangeMoney pointsMoneyRate = distributePointsExchangeMoneyMapper.selectOne(null);
 		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));
+//			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));
+			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
@@ -402,7 +408,7 @@ public class DistributeController {
 		}
 		builder.put("time", String.format("date_format(ubr.order_created_time,'%%Y-%%m') = '%s'", thisMonth));
 		SearchResult<DistributeBusinessView> search = beanSearcher.search(DistributeBusinessView.class, builder.build());
-		search.getDataList().forEach(data->{
+		search.getDataList().forEach(data -> {
 			Number numOfRelation = beanSearcher.searchCount(UserDistribute.class, MapUtils.builder().field(UserDistribute::getBusinessId, data.getBusinessId()).field(UserDistribute::getDeleted, true).build());
 			data.setNumOfRelation(numOfRelation.intValue());
 		});
@@ -501,7 +507,7 @@ public class DistributeController {
 	@PutMapping("/put/business/rate")
 	@Log(module = "分销管理/修改商务人员比例", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> updateBusinessRate(@RequestBody @Validated List<UserDistributeBusinessRate> rates) {
-		rates.forEach(userDistributeBusinessRate->{
+		rates.forEach(userDistributeBusinessRate -> {
 			Long rateId = userDistributeBusinessRate.getId();
 			UserDistributeBusinessRate businessRate = Optional.ofNullable(userDistributeBusinessRateMapper.selectById(rateId)).orElse(new UserDistributeBusinessRate());
 			BeanUtil.copyProperties(userDistributeBusinessRate, businessRate);
@@ -543,7 +549,7 @@ public class DistributeController {
 	 */
 	@PutMapping("/update/business/defaultRate")
 	public Result<String> updateBusinessDefaultRate(@RequestBody List<UserBusinessDefaultRateConfig> configs) {
-		configs.forEach(rateConfig->{
+		configs.forEach(rateConfig -> {
 			Long rateConfigId = rateConfig.getId();
 			UserBusinessDefaultRateConfig config = Optional.ofNullable(defaultRateConfigMapper.selectById(rateConfigId)).orElse(new UserBusinessDefaultRateConfig());
 			BeanUtil.copyProperties(rateConfig, config);
@@ -607,4 +613,60 @@ public class DistributeController {
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+	/**
+	 * 商务人员数据表
+	 */
+	@GetMapping("/get/business/data")
+	@SaCheckPermission("business:dataView")
+	public Result<SearchResult<BusinessDistributesDataView>> getBusinessDistributesData(String startTime, String endTime) {
+		long adminId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		String time1Sql = StrUtil.EMPTY;
+		String time2Sql = StrUtil.EMPTY;
+		String time3Sql = StrUtil.EMPTY;
+		if (StrUtil.isNotBlank(startTime)) {
+			time1Sql += String.format(" and ud.business_bind_time >= '%s'", startTime);
+			time2Sql += String.format(" and us.created_time >= '%s'", startTime);
+			time3Sql += String.format(" and od.created_time >= '%s'", startTime);
+		}
+		if (StrUtil.isNotBlank(endTime)) {
+			time1Sql += String.format(" and ud.business_bind_time < '%s'", endTime);
+			time2Sql += String.format(" and us.created_time < '%s'", endTime);
+			time3Sql += String.format(" and od.created_time < '%s'", endTime);
+		}
+		if (StrUtil.isNotBlank(time1Sql)) {
+			builder.put("time1", time1Sql);
+		}
+		if (StrUtil.isNotBlank(time2Sql)) {
+			builder.put("time2", time2Sql);
+		}
+		if (StrUtil.isNotBlank(time3Sql)) {
+			builder.put("time3", time3Sql);
+		}
+		//是否是商务人员
+		if (userBusinessRateService.isBusiness(adminId)) {
+			builder.field(BusinessDistributesDataView::getBusinessId, adminId);
+		}
+		SearchResult<BusinessDistributesDataView> search = beanSearcher.search(BusinessDistributesDataView.class, builder.build());
+//		search.getDataList().forEach(data -> {
+//			Map<String, Object> reMap = orderDonMapper.selectNumOfDistributeOrders(data.getBusinessId(), startTime, endTime, Constant.noOrderAllStatus);
+//			Object num = reMap.get("num");
+//			Object money = reMap.get("money");
+//			data.setNumOfDistributeOrders(Integer.parseInt(num.toString()));
+//			data.setDistributeOrdersMoney(BigDecimal.valueOf(Long.valueOf(money.toString())));
+//			Integer numOfNewUser = userDistributeSharedMapper.countByBusinessId(data.getBusinessId(), startTime, endTime);
+//			data.setNumOfNewUser(numOfNewUser);
+//		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 渠道积分提现详情
+	 */
+	@GetMapping("/get/apply/detail/{userId}")
+	public Result<UserDistributeViews> getApplyDetail(@PathVariable Long userId) {
+		UserDistributeViews userDistributeViews = userDistributeMapper.getApplyDetailByUserId(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userDistributeViews);
+	}
 }