package com.cyksj.web.controller.user; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cyksj.common.EnvCommonService; import com.cyksj.common.annotation.NoSubmit; import com.cyksj.common.exception.BusinessRuntimeException; import com.cyksj.dto.Result; 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.distribute.DistributeMoneyApplyMapper; import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper; import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper; import com.cyksj.mapper.manage.distribute.UserDistributeMapper; import com.cyksj.model.entity.*; import com.cyksj.model.request.ApplyMoneyReq; import com.cyksj.model.views.*; import com.cyksj.web.util.StpUserUtil; import com.ejlchina.searcher.BeanSearcher; import com.ejlchina.searcher.SearchResult; import com.ejlchina.searcher.param.Operator; import com.ejlchina.searcher.util.MapUtils; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; 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; /* *项目名: netflix *文件名: DistributePopularizeController *创建者: JavaZou *创建时间:2022/11/15 13:59 * 服务端-》我的分发推广controller */ @RestController @RequestMapping("/distribute/popularize") @RequiredArgsConstructor public class DistributePopularizeController { private final EnvCommonService envCommonService; private final UserMapper userMapper; private final BeanSearcher beanSearcher; private final GoodsDonMapper goodsDonMapper; private final GoodsDonSkuMapper goodsDonSkuMapper; private final DistributePointsExchangeMoneyMapper distributePointsExchangeMoneyMapper; private final DistributeMoneyApplyMapper distributeMoneyApplyMapper; private final UserDistributeMapper userDistributeMapper; private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper; private final OrderDonMapper orderDonMapper; /** * 推广订单明细 */ @GetMapping("/orders/detail") public Result> getOrdersView(HttpServletRequest request) { Long userId = StpUserUtil.getLoginIdAsLong(); SearchResult search = beanSearcher.search(DistributePopularizeOrdersView.class, MapUtils.flatBuilder(request.getParameterMap()) .field(DistributePopularizeOrdersView::getSharedId, userId) .build()); DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1")); BigDecimal points = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints()); BigDecimal money = distributePointsExchangeMoney.getMoney(); 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()); data.setSpecVal(goodsDonSku.getSpecVal()); data.setWaitGetMoney(data.getPoints().divide(points).multiply(money).divide(oneHundred)); }); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 提现明细 */ @GetMapping("/applyMoney/detail") public Result> getApplyMoneyView(HttpServletRequest request) { Long userId = StpUserUtil.getLoginIdAsLong(); SearchResult search = beanSearcher.search(DistributeMoneyApplyView.class, MapUtils.flatBuilder(request.getParameterMap()) .field(DistributeMoneyApplyView::getUserId, userId).op(Operator.Equal) .build()); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 个人推广详情 */ @GetMapping("/get/detail") public Result getDetail() { Long userId = StpUserUtil.getLoginIdAsLong(); DistributePopularizeView distributePopularizeView = new DistributePopularizeView(); String domain = envCommonService.getHost(); String domainSub = domain.substring(0, domain.indexOf("8081")); // distributePopularizeView.setUrl(String.format("https://%s/8081/api/auth/weChat?url=https://%s/yinhe/web&sharedId=%s", domain, domain, userId)); distributePopularizeView.setUrl(String.format("%syinhe/web?sharedId=%s", domainSub, userId)); distributePopularizeView.setUrlCode(QrCodeUtil.generateAsBase64(distributePopularizeView.getUrl(), QrConfig.create(), "png")); User user = userMapper.selectById(userId); distributePopularizeView.setGotPoints(user.getPoints()); Integer orders = userDistributeMapper.count(userId); distributePopularizeView.setDistributeOrders(orders); UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userId).select(UserDistribute::getId).last("limit 1")); if (userDistribute != null) { //是否是固定推广者 UserDistributeView userDistributeView = beanSearcher.searchFirst(UserDistributeView.class, MapUtils.builder() .field(UserDistributeView::getDistribute_id, userDistribute.getId()).op(Operator.Equal) .orderBy(UserDistributeView::getRate).desc() .build()); //最高平台比例 distributePopularizeView.setHighestRate(userDistributeView.getRate()); }else { GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).orderByDesc(GoodsDon::getRate).select(GoodsDon::getRate).last("limit 1")); distributePopularizeView.setHighestRate(goodsDon.getRate()); } List distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting).eq(DistributeWaitingSendPoints::getSharedId, userId).select(DistributeWaitingSendPoints::getPoints)); BigDecimal waitingPoints = BigDecimal.ZERO; if (!distributeWaitingSendPoints.isEmpty()) { Optional points = distributeWaitingSendPoints.stream().map(DistributeWaitingSendPoints::getPoints).reduce(BigDecimal::add); if (points.isPresent()) { waitingPoints = points.get(); } } distributePopularizeView.setWaitingSendPoints(waitingPoints); if (user.getPoints().compareTo(BigDecimal.ZERO) <= 0 && waitingPoints.compareTo(BigDecimal.ZERO) <= 0) { distributePopularizeView.setGotMoney(BigDecimal.ZERO); distributePopularizeView.setWaitingMoney(BigDecimal.ZERO); }else { DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1")); BigDecimal points = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints()); BigDecimal money = distributePointsExchangeMoney.getMoney(); BigDecimal oneHundred = BigDecimal.valueOf(100); if (user.getPoints().compareTo(BigDecimal.ZERO) >= 0) { distributePopularizeView.setGotMoney(user.getPoints().divide(points).multiply(money).divide(oneHundred)); } if (user.getPoints().compareTo(BigDecimal.ZERO) >= 0) { distributePopularizeView.setWaitingMoney(waitingPoints.divide(points).multiply(money).divide(oneHundred)); } } return GatewayResponse.SUCCESS.newBuilder().toResult(distributePopularizeView); } /** * 个人推广用户每日订单情况折线图 */ @GetMapping("/get/order/brokenLine") public Result getPersonDistributeBrokenLineView(Long firstDate, Long lastDate) { Long userId = StpUserUtil.getLoginIdAsLong(); String first = null; String end = null; if (firstDate != null) { first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd"); } if (lastDate != null) { end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd"); } BrokenLineObjView brokenLineObjView = orderDonMapper.selectPersonDistributeBrokenLine(userId, first, end); if (brokenLineObjView != null) { List views = beanSearcher.searchAll(PersonDistributeBrokenLineView.class, MapUtils.builder() .field(PersonDistributeBrokenLineView::getDate, first, end).op(Operator.Between) .put("userId", String.format("dw.shared_id = %s", userId)) .orderBy(PersonDistributeBrokenLineView::getDate).asc() .build()); Map> distributeMap = views.stream().collect(Collectors.groupingBy(PersonDistributeBrokenLineView::getGoodsId)); brokenLineObjView.setDistributeData(distributeMap); } return GatewayResponse.SUCCESS.newBuilder().toResult(brokenLineObjView); } /** * 提现 */ @NoSubmit @PostMapping("/post/applyMoney") @Transactional(rollbackFor = Throwable.class) public Result applyMoney(@RequestBody ApplyMoneyReq applyMoneyReq) { Long userId = StpUserUtil.getLoginIdAsLong(); User user = userMapper.selectById(userId); if (user == null) { throw BusinessRuntimeException.getInstance("请先授权登录"); } if (ObjectUtil.hasEmpty(applyMoneyReq.getAccount(), applyMoneyReq.getRealName())) { throw BusinessRuntimeException.getInstance("必填项不能为空"); } DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1")); BigDecimal minPoints = BigDecimal.valueOf(distributePointsExchangeMoney.getMinPoints()); BigDecimal min = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints()); if (user.getPoints().compareTo(minPoints) < 0) { throw BusinessRuntimeException.getInstance("您当前积分未达到积分门槛,无法提现"); } //今日是否已提现 DistributeMoneyApply apply = distributeMoneyApplyMapper.selectOne(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getUserId, userId).between(DistributeMoneyApply::getCreatedTime, DateUtil.beginOfDay(DateTime.now()), DateUtil.endOfDay(DateTime.now())).last("limit 1")); if (apply != null) { throw BusinessRuntimeException.getInstance("今日已提现,请明日再进行操作"); } BigDecimal num = user.getPoints().divide(min, RoundingMode.DOWN); BigDecimal points = min.multiply(num); Integer update = userMapper.subPoints(user.getId(), points); if (update == 1) { DistributeMoneyApply distributeMoneyApply = new DistributeMoneyApply(); distributeMoneyApply.setUserId(userId); distributeMoneyApply.setPoints(points); distributeMoneyApply.setMoney(num.multiply(distributePointsExchangeMoney.getMoney())); distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.verifying); distributeMoneyApply.setAccount(applyMoneyReq.getAccount()); distributeMoneyApply.setRealName(applyMoneyReq.getRealName()); distributeMoneyApplyMapper.insert(distributeMoneyApply); return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply.getMoney().intValue()); } throw BusinessRuntimeException.getInstance("系统异常,请重新提交提现申请"); } /** * 获取积分兑换门槛 */ @GetMapping("/applyMoney/threshold") public Result getThreshold() { return GatewayResponse.SUCCESS.newBuilder().toResult(distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).last("limit 1"))); } /** * 提现缓存数据 */ @GetMapping("/get/applyMoney/detail") public Result getLastApplyDetail() { Long userId = StpUserUtil.getLoginIdAsLong(); DistributeMoneyApply apply = distributeMoneyApplyMapper.selectOne(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getUserId, userId).orderByDesc(DistributeMoneyApply::getId).last("limit 1")); return GatewayResponse.SUCCESS.newBuilder().toResult(apply); } }