package com.cyksj.service.distribute.impl; import cn.hutool.core.date.DateTime; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cyksj.common.constant.Constant; import com.cyksj.common.constant.TaskTypeEnum; import com.cyksj.common.exception.BusinessRuntimeException; import com.cyksj.mapper.GoodsDonMapper; import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper; import com.cyksj.mapper.manage.coupon.CouponMapper; import com.cyksj.mapper.manage.distribute.UserBusinessDefaultRateConfigMapper; import com.cyksj.mapper.manage.distribute.UserDistributeMapper; import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper; import com.cyksj.mapper.manage.distribute.UserPlatDistributeRateMapper; import com.cyksj.mapper.market.task.TaskTypeMapper; import com.cyksj.model.entity.*; import com.cyksj.model.request.UserDistributeReq; import com.cyksj.redis.RedisService; import com.cyksj.service.distribute.DistributeService; import com.cyksj.service.market.task.TaskService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; /* *项目名: netflix *文件名: DistributeServiceImpl *创建者: JavaZou *创建时间:2022/11/14 12:21 */ @Service @RequiredArgsConstructor @Slf4j public class DistributeServiceImpl implements DistributeService { private final UserDistributeMapper userDistributeMapper; private final UserPlatDistributeRateMapper userPlatDistributeRateMapper; private final GoodsDonMapper goodsDonMapper; private final TaskService taskService; private final TaskTypeMapper taskTypeMapper; private final UserDistributeSharedMapper userDistributeSharedMapper; private final UserBusinessDefaultRateConfigMapper defaultRateConfigMapper; private final RedisService redisService; private final CouponMapper couponMapper; private final CouponDistributePopularizeMapper couponDistributePopularizeMapper; @Override @Transactional(rollbackFor = Throwable.class) public void insertDistribute(UserDistributeReq userDistributeReq) { if (!redisService.setNx(String.valueOf(userDistributeReq.getUserId()), userDistributeReq.getUserId(), 30l)) { throw BusinessRuntimeException.getInstance("请勿重复点击"); } UserDistribute exists = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeReq.getUserId()).eq(UserDistribute::getDeleted, true).last("limit 1")); if (exists != null) { throw BusinessRuntimeException.getInstance("该推广者已添加"); } Long businessId = userDistributeReq.getBusinessId(); UserDistribute userDistribute = new UserDistribute(); userDistribute.setUserId(userDistributeReq.getUserId()); userDistribute.setRemark(userDistributeReq.getRemark()); userDistribute.setBusinessId(businessId); if (businessId != null && businessId != 0) { userDistribute.setBusinessBindTime(DateTime.now()); } userDistributeMapper.insert(userDistribute); for (UserPlatDistributeRate rate : userDistributeReq.getRates()) { if (rate.getRate() < 0 || rate.getRate() > 100) { throw new BusinessRuntimeException("比例错误"); } GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId()); if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 3) { throw new BusinessRuntimeException("平台错误"); } //分销者虚物分销比例且配置商务 if (businessId != null && goodsDon.getType() == 1) { checkDistributorAndBusinessRate(rate.getRate(), goodsDon.getId(), goodsDon.getTitle()); } rate.setDistributeId(userDistribute.getId()); userPlatDistributeRateMapper.insert(rate); } redisService.del(String.valueOf(userDistributeReq.getUserId())); } @Override @Transactional(rollbackFor = Throwable.class) public void editDistribute(UserDistributeReq userDistributeReq) { if (userDistributeReq.getId() == null || userDistributeReq.getId() < 1) { throw BusinessRuntimeException.getInstance("id错误"); } UserDistribute userDistribute = new UserDistribute(); userDistribute.setId(userDistributeReq.getId()); userDistribute.setRemark(userDistributeReq.getRemark()); 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) { throw new BusinessRuntimeException("比例错误"); } GoodsDon goodsDon = goodsDonMapper.selectById(rate.getGoodsId()); if (rate.getId() != null && (goodsDon == null || !goodsDon.getDeleted())) { userPlatDistributeRateMapper.deleteById(rate.getId()); continue; } if (goodsDon == null || !goodsDon.getDeleted() || goodsDon.getType() == 3) { throw new BusinessRuntimeException("平台错误"); } //分销者虚物分销比例且配置商务 if (businessId != null && goodsDon.getType() == 1) { checkDistributorAndBusinessRate(rate.getRate(), goodsDon.getId(), goodsDon.getTitle()); } rate.setDistributeId(userDistribute.getId()); if (rate.getId() == null) { try { userPlatDistributeRateMapper.insert(rate); } catch (DuplicateKeyException e) { } } else { userPlatDistributeRateMapper.updateById(rate); } } } @Override public void saveDistributionInvitation(Long sharedId, Long userId, Long dsPopularizeId) { UserDistributeShared userDistributeShared = new UserDistributeShared(); userDistributeShared.setSharedId(sharedId); //存在分销 userDistributeShared.setUserId(userId); userDistributeShared.setDsPopularizeId(dsPopularizeId); try { userDistributeSharedMapper.insert(userDistributeShared); TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class) .eq(TaskType::getName, TaskTypeEnum.share.getDesc()).last("limit 1")); taskService.completeTask(taskType, sharedId); } catch (DuplicateKeyException e) { log.info("分销被邀请人重复插入"); } } @Override @Transactional(rollbackFor = Throwable.class) public void bindPopularizeCode(Long userId, String code) { Coupon coupon = couponMapper.getCouponById(Constant.GENERAL_POPULARIZE_COUPON_ID); if (!redisService.setNx(RedisService.key.GENERAL_POPULARIZE_CODE.getName() + code, userId, RedisService.key.GENERAL_POPULARIZE_CODE.getTimeout())) { throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置"); } CouponDistributePopularize is_exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class).eq(CouponDistributePopularize::getUserId, userId).last("limit 1")); if (is_exists != null) throw BusinessRuntimeException.getInstance("你已设置专属推广优惠码"); CouponDistributePopularize couponDistributePopularize = new CouponDistributePopularize(); couponDistributePopularize.setCouponId(coupon.getId()); couponDistributePopularize.setUserId(userId); couponDistributePopularize.setIsGeneral(true); CouponDistributePopularize exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class) .eq(CouponDistributePopularize::getExCode, code) .eq(CouponDistributePopularize::getDeleted, true) .ne(CouponDistributePopularize::getUserId, userId) .select(CouponDistributePopularize::getId) .last("limit 1")); if (exists != null) { throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置"); } else { Coupon existsCoupon = couponMapper.selectOne(Wrappers.lambdaQuery(Coupon.class) .eq(Coupon::getExCode, couponDistributePopularize.getExCode()) .eq(Coupon::getDeleted, true) .select(Coupon::getId) .last("limit 1")); if (existsCoupon != null) { throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置"); } } couponDistributePopularize.setExCode(code); couponDistributePopularizeMapper.insert(couponDistributePopularize); } public void checkDistributorAndBusinessRate(Integer distributeGoodsRate, Long goodsId, String goodsName) { UserBusinessDefaultRateConfig defaultGoodsRateConfig = defaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(UserBusinessDefaultRateConfig.class) .eq(UserBusinessDefaultRateConfig::getGoodsId, goodsId) .last("limit 1")); Optional.ofNullable(defaultGoodsRateConfig).ifPresent(config -> { if (distributeGoodsRate > config.getMaxRate()) { throw BusinessRuntimeException.getInstance(String.format("该%s平台最高可配置分销比例为%s", goodsName, config.getMaxRate())); } }); } }