需求:会员佣金到账,应该增加会员的可提成奖金、累计奖金,扣除对应的预计到账奖金

原先错误的写法会导致脏读:

 //更新师傅的可提现金额
            DistributionDO dist = this.distributionClient.getDistributorByMemberId(engineerId);
            if (oConvertUtils.isNotEmpty(dist)) {
                //提成佣金
                dist.setCanRebate(CurrencyUtil.add(dist.getCanRebate(), actualEngineerBonus));
                //累计佣金
                dist.setRebateTotal(CurrencyUtil.add(dist.getRebateTotal(), actualEngineerBonus));
                //扣除预计到账金额(冻结金额)
                //需要注意防止脏读,不可以直接把字段set,应该在sql里写
                double sub = CurrencyUtil.sub(dist.getCommissionFrozen(), parentBonus);
                if (sub > 0) {
                    dist.setCommissionFrozen(sub);
                } else {
                    dist.setCommissionFrozen(0.0);
                }

                this.distributionClient.edit(dist);

参考组长的写法:

组长说这样写法自带乐观锁

private void addEstimate(DistributionDO distributionDO, double estimateRebate) {
        UpdateWrapper<DistributionDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql("commission_frozen = commission_frozen + " + estimateRebate);
        updateWrapper.eq("member_id", distributionDO.getMemberId());
        distributionMapper.update(null, updateWrapper);
    }

照虎画猫之后:

 /**
     * 佣金到账完成后的佣金变化方法
     *
     * @param memberId    归属会员ID
     * @param actualBonus 实际到账佣金
     * @param dueBonus    应到账奖金
     */
    @Override
    @Transactional(value = "memberTransactionManager", rollbackFor = Exception.class)
    public void bonusIntoAccount(Long memberId, Double actualBonus, Double dueBonus) {

        UpdateWrapper<DistributionDO> updateWrapper = new UpdateWrapper<>();
        //扣除预计到账金额(冻结金额)
        /* updateWrapper.setSql("commission_frozen = commission_frozen - " + dueBonus + ",can_rebate = commission_frozen + " + actualBonus + ",rebate_total = commission_frozen + " + actualBonus);*/
        updateWrapper.setSql("commission_frozen = commission_frozen - " + dueBonus);
        //提成佣金
        updateWrapper.setSql("can_rebate = can_rebate + " + actualBonus);
        //累计佣金
        updateWrapper.setSql("rebate_total = rebate_total + " + actualBonus);
        updateWrapper.eq("member_id", memberId);
        distributionMapper.update(null, updateWrapper);

    }

这里3个setSql是会拼接在一起。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐