小程序拼团业务,并发支付导致重复给用户返利bug

news/2024/6/14 14:09:11 标签: 小程序, bug

今天遇到了一个线上的重大bug小程序拼团业务,例如当一个团金额达到10000元时,这个团就表示拼团成功,但是在金额马上到达10000元瞬间,多个用户同时下单,支付完成微信后台调取callback接口,因为当成团的那一刻,给当前团的用户发送奖励,线程1正在发送奖励,还没有完成时,线程2又过来了,线程三,线程四同时过来,就会循环执行发送奖励代码,造成线上多个给用户返利,解决方案:
把跟用户的交互不能交给用户来完成,要交给系统处理,写一个定时方法,定时查看哪个团拼成功了,然后给已拼成功但是还未发奖励的用户发送奖励,完美解决
在这里插入代码片
//已成团
if (group.equals(1)) {

        //发放奖励
        List<ActivityGroupRechargeOrder> list = activityGroupRechargeOrderDaoService.query()
                                                                                    .eq("activity_group_recharge_team_id", team.getId())
                                                                                    .eq("status", 1)
                                                                                    .eq("send", 0)
                                                                                    .list();

        Map<String, Person> personMap = personDaoService.getMapByIds(list.stream().map(ActivityGroupRechargeOrder::getPersonId).collect(Collectors.toList()));

        for (ActivityGroupRechargeOrder vo : list) {

            //占比
            Double percent = NumberUtil.round(vo.getAmount().doubleValue() / team.getRecharge().doubleValue(), 5, RoundingMode.HALF_DOWN).doubleValue();
            //应到金额
            Double amount = NumberUtil.round(team.getReceipt() * percent, 0, RoundingMode.HALF_DOWN).doubleValue();

            //修改用户余额
            personDaoService.update()
                            .setSql(" balance = balance + " + amount)
                            .eq("id", vo.getPersonId())
                            .update();

            PersonBalanceLog log = new PersonBalanceLog();
            log.setId(IdUtil.objectId());
            log.setPersonId(vo.getPersonId());
            log.setOpera("+");
            log.setType(1);
            log.setAmount(amount);
            log.setTitle("拼团成功,团编号" + team.getOrderNo() + ",到账金额:" + log.getAmount() + "元");
            log.setSurplus(0.0);
            personBalanceLogDaoService.save(log);

            //已发放奖励
            activityGroupRechargeOrderDaoService.update()
                                                .set("send", 1)
                                                .eq("id", vo.getId())
                                                .update();

            if (personMap.containsKey(vo.getPersonId())) {

                Person person = personMap.get(vo.getPersonId());

                WeChat.Message.mini("user")
                              .openid(person.getOpenId())
                              .template("X1UaO1H_iR3QVoB_Bar1C63nhWpEFtTv_VkWI9FmEP8")
                              .option("thing3", "成功")
                              .option("thing4", "拼团金额已到账~")
                              .send();
            }

        }
    }


http://www.niftyadmin.cn/n/5127881.html

相关文章

Rust 模块系统

文章目录 模块系统crate包cargo 创建库库的使用 模块系统 Rust的{模块系统|the module system}&#xff0c;包括&#xff1a; * 包&#xff08;Packages&#xff09;&#xff1a; Cargo 的一个功能&#xff0c;它允许你构建、测试和分享 crate。 * Crates &#xff1a;一个模…

基于单片机的空气质量检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、主要内容二、系统方案设计2.1 系统方案设计2.2 主控制器模块选择 三、 系统软件设计4.1 程序结构分析4.2系统程序…

QCI利用量子计算为飞行汽车提供优化飞行路径和改进设计的功能

​&#xff08;图片来源&#xff1a;网络&#xff09; 长期以来&#xff0c;飞行汽车和量子计算机一直是“未来技术”的简写&#xff0c;它们将彻底改变交通世界。预计到2032年&#xff0c;量子计算的市场价值将达到1700亿美元&#xff0c;当前有很多实际用例已经证明了它的价…

【递归】Pow(x , n)(Java版)

目录 1.题目解析 2.讲解算法原理 2.1.如何来解决Pow问题&#xff1f; 2.2.为什么这道题可以用递归来做&#xff1f; 2.2.1 什么是递归 2.2.2 为什么会用到递归 3.如何编写递归代码&#xff1f; 4.递归的细节展开图 1.题目解析 50.Pow(x , n) 实现 pow(x, n) &#xf…

macOS Sonoma 14.1正式版(23B74)发布(可下载黑白苹果镜像)

系统介绍 黑果魏叔苹果今天为 macOS Sonoma 推出了 14.1 版本更新&#xff0c;魏叔发现&#xff0c;本更新主要改善了 Apple Music 界面&#xff0c;设置中新增保修状态&#xff0c;并修复了多项错误内容。 根据苹果的新说明&#xff0c;这次的 Mac 更新不仅提供了一系列的改善…

记录一次时序数据库的实战测试

0x1.前言 本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果&#xff0c;作者不承担任何法律责任&#xff0c;请严格遵循中华人民共和国相关法律法规&#xff0c;禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台。 0x2.背景 在某次Edus…

软考系统架构师知识点集锦四:信息安全技术基础知识

一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高&#xff0c;但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…

腾讯云新用户优惠券领取方法及使用教程

腾讯云作为国内领先的云计算服务提供商&#xff0c;为了吸引更多的新用户&#xff0c;经常会推出各种优惠活动。其中&#xff0c;最吸引新用户的还是腾讯云优惠券&#xff0c;本文将详细介绍腾讯云新用户优惠券的领取方法及使用教程&#xff0c;助力大家轻松上云&#xff01; 一…