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.core.util.StrUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import com.alipay.api.AlipayResponse; 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.request.TransferAccountsReq; import com.cyksj.model.views.DistributeMoneyApplyView; import com.cyksj.model.views.DistributePopularizeOrdersView; import com.cyksj.model.views.DistributePopularizeView; import com.cyksj.model.views.UserDistributeView; import com.cyksj.service.order.OrderDonService; import com.cyksj.model.views.*; import com.cyksj.service.user.UserPointsService; 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; private final OrderDonService orderService; private final UserPointsService userPointsService; /** * 推广订单明细 */ @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 dsUrl = String.format(envCommonService.DISTRIBUTE_DEFAULT_URL_PREFIX, userId); // distributePopularizeView.setUrl(String.format("https://%s/8081/api/auth/weChat?url=https://%s/yinhe/web&sharedId=%s", domain, domain, userId)); distributePopularizeView.setUrl(dsUrl); 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).eq(GoodsDon::getDeleted, true).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 = Optional.ofNullable(orderDonMapper.selectPersonDistributeBrokenLine(userId, first, end)) .orElse(new BrokenLineObjView()); 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) throws Exception { 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("必填项不能为空"); } if (applyMoneyReq.getAccount().length() > 255 || applyMoneyReq.getRealName().length() > 32) { throw BusinessRuntimeException.getInstance("请输入正确的账户信息"); } Boolean isTakeAll = applyMoneyReq.getIsTakeAll(); BigDecimal userPoints = user.getPoints(); DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1")); BigDecimal minPoints = BigDecimal.valueOf(distributePointsExchangeMoney.getMinPoints()); BigDecimal ratePoints = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints()); BigDecimal minMoney = distributePointsExchangeMoney.getMoney(); if (userPoints.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 = userPoints.divide(ratePoints, 0, RoundingMode.DOWN); BigDecimal needApplyMoney = num.multiply(minMoney); BigDecimal needSubPoints = num.multiply(ratePoints); BigDecimal fourHundred = BigDecimal.valueOf(4 * 100 * 100); if (isTakeAll == null || !isTakeAll) { if (needApplyMoney.compareTo(fourHundred) > 0) { needApplyMoney = fourHundred; needSubPoints = fourHundred.divide(minMoney).multiply(ratePoints); } } Integer update = userMapper.subPoints(user.getId(), needSubPoints); if (update == 1) { DistributeMoneyApply distributeMoneyApply = new DistributeMoneyApply(); distributeMoneyApply.setUserId(userId); distributeMoneyApply.setPoints(needSubPoints); distributeMoneyApply.setMoney(needApplyMoney); distributeMoneyApply.setAccount(applyMoneyReq.getAccount()); distributeMoneyApply.setRealName(applyMoneyReq.getRealName()); if (isTakeAll != null && isTakeAll) { distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.verifying); } else { TransferAccountsReq req = new TransferAccountsReq(); req.setMoney(needApplyMoney); req.setAccount(applyMoneyReq.getAccount()); req.setName(applyMoneyReq.getRealName()); req.setPoints(needSubPoints); req.setUserId(userId); AlipayResponse alipayResponse = orderService.transferAccounts(req); if (alipayResponse.isSuccess()) { distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.success); } else { distributeMoneyApply.setVerifyStatus(DistributeMoneyApply.Status.fail); distributeMoneyApply.setReason(alipayResponse.getSubMsg()); userPointsService.addDistributePoints(userId, distributeMoneyApply.getPoints()); if (StrUtil.equals(alipayResponse.getSubCode(), "SECURITY_CHECK_FAILED")) { return GatewayResponse.FAIL.newBuilder().setMsg("当前支付宝提现人数较多,请稍后再试").toResult(); } return GatewayResponse.FAIL.newBuilder().setMsg(alipayResponse.getSubMsg()).toResult(); } } try { distributeMoneyApplyMapper.insert(distributeMoneyApply); } catch (Exception e) { userPointsService.addDistributePoints(userId, distributeMoneyApply.getPoints()); return GatewayResponse.FAIL.newBuilder().setMsg("网络错误,请重试").toResult(); } return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply); } 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); } /** * 是否是普通分销者 */ @GetMapping("/get/isGeneral/distribute") public Result isGeneralDistribute() { Long userId = StpUserUtil.getLoginIdAsLong(); UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class) .eq(UserDistribute::getUserId, userId)); if (userDistribute != null) { return GatewayResponse.SUCCESS.newBuilder().toResult(false); } return GatewayResponse.SUCCESS.newBuilder().toResult(true); } /** * 普通分销者弹窗 */ @GetMapping("/get/general/distribute/detail") public Result getGeneralDistributeDetail() { Long userId = StpUserUtil.getLoginIdAsLong(); List goodsDons = goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getDeleted, true).gt(GoodsDon::getRate, 0).orderByAsc(GoodsDon::getRate).select(GoodsDon::getRate, GoodsDon::getTitle)); if (goodsDons.isEmpty()) { return GatewayResponse.SUCCESS.newBuilder().toResult(); } DistributePopularizeView distributePopularizeView = new DistributePopularizeView(); GoodsDon highestRateGoods = goodsDons.get(goodsDons.size() - 1); distributePopularizeView.setHighestRate(highestRateGoods.getRate()); List generalDistributes = goodsDons.stream().filter(gd -> !gd.getRate().equals(highestRateGoods.getRate())).collect(Collectors.toList()); distributePopularizeView.setGeneralDistributes(generalDistributes); return GatewayResponse.SUCCESS.newBuilder().toResult(distributePopularizeView); } }