From 43a9bb67b4e8ef5de4d844f2926115fcfcd8d287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E5=A4=A7=E5=8F=94?= <494979559@qq.com> Date: Fri, 27 Sep 2024 15:38:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4=EF=BC=8C?= =?UTF-8?q?=E5=81=9A=E5=88=B0=E4=BA=86=E6=81=A2=E5=A4=8D=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/ss/bonus/domain/BonusQuery.java | 18 +++++++ .../ruoyi/ss/bonus/mapper/BonusMapper.java | 16 ++++++ .../com/ruoyi/ss/bonus/mapper/BonusMapper.xml | 44 +++++++++++++++- .../ss/bonus/service/BonusConverter.java | 6 +++ .../ruoyi/ss/bonus/service/BonusService.java | 13 +++++ .../service/impl/BonusConverterImpl.java | 24 ++++++--- .../bonus/service/impl/BonusServiceImpl.java | 47 +++++++++++------ .../domain/TransactionBill.java | 4 ++ .../mapper/TransactionBillMapper.xml | 18 +++++-- .../service/TransactionBillService.java | 5 ++ .../impl/TransactionBillServiceImpl.java | 42 ++++++++++++--- .../user/service/impl/SmUserServiceImpl.java | 20 +++++++- .../java/com/ruoyi/task/bonus/BonusTask.java | 51 +++++++++++++++++++ .../ss/SmTransactionBillController.java | 10 ++++ 14 files changed, 280 insertions(+), 38 deletions(-) create mode 100644 smart-switch-service/src/main/java/com/ruoyi/task/bonus/BonusTask.java diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/BonusQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/BonusQuery.java index 6398fce2..60c9a46d 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/BonusQuery.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/BonusQuery.java @@ -5,6 +5,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; /** @@ -34,4 +35,21 @@ public class BonusQuery extends BonusVO { @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate payDateEnd; + @ApiModelProperty("实际支付时间(起始)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime payTimeStart; + + @ApiModelProperty("实际支付时间(结束)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime payTimeEnd; + + + @ApiModelProperty("预计支付时间(起始)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime prePayTimeStart; + + @ApiModelProperty("预计支付时间(结束)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime prePayTimeEnd; + } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java index dccf148d..f7a9fb6f 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.ss.bonus.mapper; import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import com.ruoyi.common.domain.vo.CommonCountVO; @@ -115,4 +116,19 @@ public interface BonusMapper * 按日查询 */ List<BonusDailyAmountVO> selectDailyAmount(@Param("query") BonusQuery query); + + /** + * 支付分成 + * @param id 分成ID + * @param amount 支付金额 + * @param payTime 支付时间 + */ + int pay(@Param("id") Long id, @Param("amount") BigDecimal amount, @Param("payTime") LocalDateTime payTime); + + /** + * 查询数量 + * @param query + * @return + */ + int selectCount(@Param("query") BonusQuery query); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.xml index ba481ebe..5d0f23bf 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/mapper/BonusMapper.xml @@ -45,6 +45,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="query.payTimeYear != null "> and year(sb.pay_time) = #{query.payTimeYear}</if> <if test="query.payDateStart != null "> and date(sb.pay_time) >= #{query.payDateStart}</if> <if test="query.payDateEnd != null "> and date(sb.pay_time) <= #{query.payDateEnd}</if> + <if test="query.payTimeStart != null "> and sb.pay_time >= #{query.payTimeStart}</if> + <if test="query.payTimeEnd != null "> and sb.pay_time <= #{query.payTimeEnd}</if> + <if test="query.prePayTimeStart != null "> and sb.pre_pay_time >= #{query.prePayTimeStart}</if> + <if test="query.prePayTimeEnd != null "> and sb.pre_pay_time <= #{query.prePayTimeEnd}</if> <if test="query.billIds != null and query.billIds.size() > 0 "> and sb.bill_id in <foreach collection="query.billIds" item="item" open="(" close=")" separator=","> @@ -163,6 +167,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by `key` </select> + <select id="selectCount" resultType="java.lang.Integer"> + select + count(sb.id) + from ss_bonus sb + <where> + <include refid="searchCondition"/> + </where> + </select> + <insert id="insertBonus" parameterType="Bonus" useGeneratedKeys="true" keyProperty="id"> insert into ss_bonus <trim prefix="(" suffix=")" suffixOverrides=","> @@ -255,18 +268,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </foreach> </insert> + <!--金额规则,无论金额如何变化,都需要遵循这个规则--> + <sql id="amountRule"> + amount >= refund_amount + wait_amount + payed_amount + </sql> + <update id="refundWhenWaitDivide"> update ss_bonus set refund_amount = refund_amount + #{amount}, wait_amount = wait_amount - #{amount} - where id = #{id} and wait_amount >= #{amount} and status = '2' and amount >= refund_amount + #{amount} + where id = #{id} and wait_amount >= #{amount} and status = '2' + and <include refid="amountRule"/> </update> <update id="refundWhenDividend"> update ss_bonus set refund_amount = refund_amount + #{amount}, payed_amount = payed_amount - #{amount} - where id = #{id} and payed_amount >= #{amount} and status = '3' and amount >= refund_amount + #{amount} + where id = #{id} and payed_amount >= #{amount} and status = '3' + and <include refid="amountRule"/> + </update> + + <update id="pay"> + update ss_bonus + set payed_amount = payed_amount + #{amount}, + wait_amount = wait_amount - #{amount}, + status = '3', + pay_time = #{payTime} + where id = #{id} and wait_amount >= #{amount} and status = '2' + and <include refid="amountRule"/> </update> <update id="updateBonus" parameterType="Bonus"> @@ -290,6 +320,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </otherwise> </choose> </foreach> + <foreach open="wait_amount = CASE id" collection="list" item="item" close="END,"> + <choose> + <when test="item.waitAmount != null"> + WHEN #{item.id} THEN #{item.waitAmount} + </when> + <otherwise> + WHEN #{item.id} THEN wait_amount + </otherwise> + </choose> + </foreach> <foreach open="status = CASE id" collection="list" item="item" close="END,"> <choose> <when test="item.status != null"> diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java index 69406d1e..ded9e5bc 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java @@ -6,6 +6,7 @@ import com.ruoyi.ss.channel.domain.ChannelVO; import com.ruoyi.ss.device.domain.vo.DeviceVO; import com.ruoyi.ss.transactionBill.domain.bo.RechargeBO; import com.ruoyi.ss.transactionBill.domain.dto.RechargePayBO; +import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; import com.ruoyi.ss.user.domain.SmUserVo; import java.util.List; @@ -38,4 +39,9 @@ public interface BonusConverter { */ List<Bonus> genBonusList(SmUserVo mch, SmUserVo agent, SysDept platform, DeviceVO device, ChannelVO channel); + /** + * 旧订单转为分成明细 + */ + List<Bonus> toPo(TransactionBillVO bill); + } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java index 6a5afa65..486ddf7e 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusService.java @@ -12,6 +12,7 @@ import com.ruoyi.ss.bonus.domain.BonusQuery; import com.ruoyi.ss.bonus.domain.vo.BonusDailyAmountVO; import com.ruoyi.ss.bonus.domain.vo.BonusMonthAmountVO; import com.ruoyi.ss.bonus.domain.vo.ProvideBonusVO; +import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; /** * 分成明细Service接口 @@ -82,6 +83,12 @@ public interface BonusService */ int payBonus(List<BonusVO> bonusList); + /** + * 支付分成 + * @param bonus + */ + int payBonus(BonusVO bonus); + /** * 处理分成,按照比例分出金额 * @param bonusList 分成列表 @@ -129,4 +136,10 @@ public interface BonusService */ List<BonusDailyAmountVO> selectDailyAmount(BonusQuery query); + /** + * 查询数量 + * @param query + * @return + */ + int selectCount(BonusQuery query); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java index 0f8ebab7..d06f4654 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java @@ -15,6 +15,7 @@ import com.ruoyi.ss.store.service.StoreService; import com.ruoyi.ss.transactionBill.domain.TransactionBill; import com.ruoyi.ss.transactionBill.domain.bo.RechargeBO; import com.ruoyi.ss.transactionBill.domain.dto.RechargePayBO; +import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; import com.ruoyi.ss.transactionBill.domain.vo.UserRechargeServiceVO; import com.ruoyi.ss.transactionBill.service.TransactionBillService; import com.ruoyi.ss.user.domain.SmUserVo; @@ -88,14 +89,7 @@ public class BonusConverterImpl implements BonusConverter { return Collections.emptyList(); } - List<Bonus> result = genBonusList(bo.getMch(), bo.getAgent(), bo.getPlatform(), bo.getDevice(), null); - - for (Bonus bonus : result) { - bonus.setBillId(bill.getBillId()); - bonus.setBillNo(bill.getBillNo()); - } - - return result; + return genBonusList(bo.getMch(), bo.getAgent(), bo.getPlatform(), bo.getDevice(), null); } @Override @@ -146,6 +140,20 @@ public class BonusConverterImpl implements BonusConverter { return result; } + @Override + public List<Bonus> toPo(TransactionBillVO bill) { + if (bill == null) { + return Collections.emptyList(); + } + + List<Bonus> result = new ArrayList<>(); + // TODO 平台 + + // TODO 商户 + + return result; + } + private Bonus toPo(SysDept dept, BigDecimal point) { if (dept == null) { return null; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java index 4285190f..85c87a48 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusServiceImpl.java @@ -164,27 +164,37 @@ public class BonusServiceImpl implements BonusService // 循环遍历,添加金额到账户上 for (BonusVO bonus : bonusList) { - Integer result = transactionTemplate.execute(status -> { - int add = 0; - // 根据类型,添加金额 - if (BonusArrivalType.userList().contains(bonus.getArrivalType())) { - add = userService.addBalance(bonus.getArrivalId(), bonus.getAmount(), String.format("订单分成:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId()); - } else if (BonusArrivalType.deptList().contains(bonus.getArrivalType())) { -// add = deptService.addBalance(bonus.getArrivalId(), bonus.getAmount(), String.format("订单分成:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId()); - } - ServiceUtil.assertion(add != 1, "增加账户金额失败"); - - // TODO 更新分成状态为已分成 - - return add; - }); - - total += (result == null ? 0 : 1); + int pay = this.payBonus(bonus); + total += pay; } return total; } + @Override + public int payBonus(BonusVO bonus) { + if (bonus == null) { + return 0; + } + Integer result = transactionTemplate.execute(status -> { + // 更新分成状态为已分成 + int pay = bonusMapper.pay(bonus.getId(), bonus.getWaitAmount(), LocalDateTime.now()); + ServiceUtil.assertion(pay != 1, "分成打款失败,待分金额不足或状态已改变"); + + // 根据类型,添加金额 + if (BonusArrivalType.userList().contains(bonus.getArrivalType())) { + int add = userService.addBalance(bonus.getArrivalId(), bonus.getWaitAmount(), String.format("订单分成:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId()); + ServiceUtil.assertion(add != 1, "增加账户金额失败"); + } else if (BonusArrivalType.deptList().contains(bonus.getArrivalType())) { +// add = deptService.addBalance(bonus.getArrivalId(), bonus.getAmount(), String.format("订单分成:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId()); + } + + return pay; + }); + + return result == null ? 0 : result; + } + @Override public int partBonus(List<BonusVO> bonusList, BigDecimal money) { if (CollectionUtils.isEmptyElement(bonusList)) { @@ -312,6 +322,11 @@ public class BonusServiceImpl implements BonusService return bonusMapper.selectDailyAmount(query); } + @Override + public int selectCount(BonusQuery query) { + return bonusMapper.selectCount(query); + } + private int batchUpdateAmount(List<BonusVO> list) { if (CollectionUtils.isEmptyElement(list)) { return 0; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java index 72a41fe9..402ae643 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java @@ -270,6 +270,10 @@ public class TransactionBill extends BaseEntity implements Payable @ApiModelProperty("订单低功率自动关闭值") private BigDecimal suitLowPower; + @Excel(name = "版本号") + @ApiModelProperty("版本号") + private Integer version; + /** * 获取价格(分) */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml index a215f01a..4331d4bc 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml @@ -67,6 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" stb.device_product_id, stb.device_product_id, stb.device_service_mode, + stb.version, </sql> <sql id="selectSmTransactionBillVo"> @@ -183,6 +184,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="query.createTimeEnd != null "> and stb.create_time <= #{query.createTimeEnd}</if> <if test="query.deviceProductId != null and query.deviceProductId != ''"> and stb.device_product_id = #{query.deviceProductId}</if> <if test="query.deviceServiceMode != null and query.deviceServiceMode != ''"> and stb.device_service_mode = #{query.deviceServiceMode}</if> + <if test="query.version != null "> and version = #{query.version}</if> <if test="query.isUsing != null"> <if test="query.isUsing"> and <include refid="isUsing"/> @@ -396,6 +398,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </select> <insert id="insertSmTransactionBill" parameterType="TransactionBill" useGeneratedKeys="true" keyProperty="billId"> + <selectKey resultType="Long" order="AFTER" keyProperty="billId"> + SELECT LAST_INSERT_ID(); + </selectKey> insert into sm_transaction_bill <trim prefix="(" suffix=")" suffixOverrides=","> <if test="billNo != null">bill_no,</if> @@ -451,6 +456,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="suitEnableLowPowerClose != null">suit_enable_low_power_close,</if> <if test="suitLowPower != null">suit_low_power,</if> <if test="deviceProductId != null">device_product_id,</if> + <if test="version != null">version,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="billNo != null">#{billNo},</if> @@ -506,6 +512,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="suitEnableLowPowerClose != null">#{suitEnableLowPowerClose},</if> <if test="suitLowPower != null">#{suitLowPower},</if> <if test="deviceProductId != null">#{deviceProductId},</if> + <if test="version != null">#{version},</if> </trim> </insert> @@ -574,11 +581,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="data.offlineImage != null">stb.offline_image = #{data.offlineImage},</if> <if test="data.depositPayId != null">stb.deposit_pay_id = #{data.depositPayId},</if> <if test="data.payId != null">stb.pay_id = #{data.payId},</if> - <if test="data.suitEnableLowPowerClose != null">suit_enable_low_power_close = #{data.suitEnableLowPowerClose},</if> - <if test="data.suitLowPower != null">suit_low_power = #{data.suitLowPower},</if> - <if test="data.deviceProductId != null">device_product_id = #{data.deviceProductId},</if> - <if test="data.deviceRechargeStatus != null">device_recharge_status = #{data.deviceRechargeStatus},</if> - <if test="data.deviceServiceMode != null">device_service_mode = #{data.deviceServiceMode},</if> + <if test="data.suitEnableLowPowerClose != null">stb.suit_enable_low_power_close = #{data.suitEnableLowPowerClose},</if> + <if test="data.suitLowPower != null">stb.suit_low_power = #{data.suitLowPower},</if> + <if test="data.deviceProductId != null">stb.device_product_id = #{data.deviceProductId},</if> + <if test="data.deviceRechargeStatus != null">stb.device_recharge_status = #{data.deviceRechargeStatus},</if> + <if test="data.deviceServiceMode != null">stb.device_service_mode = #{data.deviceServiceMode},</if> + <if test="data.version != null">stb.version = #{data.version},</if> </sql> <update id="updateByQuery"> diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java index 850f743f..8aae1913 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java @@ -313,4 +313,9 @@ public interface TransactionBillService * 获取商户的充值手续费 */ UserRechargeServiceVO getMchRechargeService(ChannelVO channel, SmUserVo mch, DeviceVO device); + + /** + * 修复订单数据 + */ + int fix(Long billId); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java index 6c97fcf6..dcd50209 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java @@ -12,6 +12,7 @@ import com.ruoyi.iot.domain.response.CommandResponse; import com.ruoyi.iot.service.IotService; import com.ruoyi.ss.account.domain.AccountVO; import com.ruoyi.ss.bonus.domain.Bonus; +import com.ruoyi.ss.bonus.domain.BonusQuery; import com.ruoyi.ss.bonus.domain.BonusVO; import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType; import com.ruoyi.ss.bonus.domain.enums.BonusStatus; @@ -264,12 +265,16 @@ public class TransactionBillServiceImpl implements TransactionBillService, After } transactionTemplate.execute(status -> { - // 插入数据库 + // 新增订单 int insert = this.insertSmTransactionBill(order); ServiceUtil.assertion(insert != 1, "下单失败"); // 代理商模式,插入分成列表 if (DeviceServiceMode.AGENT.getMode().equals(order.getDeviceServiceMode())) { + for (Bonus bonus : bo.getBonusList()) { + bonus.setBillId(order.getBillId()); + bonus.setBillNo(order.getBillNo()); + } int bonusInsert = bonusService.batchInsert(bo.getBonusList()); ServiceUtil.assertion(bonusInsert != bo.getBonusList().size(), "创建分成失败"); } @@ -361,6 +366,30 @@ public class TransactionBillServiceImpl implements TransactionBillService, After } } + @Override + public int fix(Long billId) { + TransactionBillVO bill = selectSmTransactionBillByBillId(billId); + return fix(bill); + } + + private int fix(TransactionBillVO bill) { + if (bill == null || bill.getBillId() == null) { + log.warn("修复订单数据失败:订单不存在或订单ID为空"); + return 0; + } + ServiceUtil.assertion(!TransactionBillStatus.payedOrder().contains(bill.getStatus()), "订单未支付,无法修复"); + + // 获取订单分成数据,判断是否已有分成数据 + BonusQuery query = new BonusQuery(); + query.setBillId(bill.getBillId()); + int bonusCount = bonusService.selectCount(query); + ServiceUtil.assertion(bonusCount > 0, "订单已存在分成数据,无法重复修复"); + + // TODO 根据订单生成新的分成数据 + bonusConverter.toPo(bill); + + } + // 转换为订单所需的数据 private TransactionBill parseToOrder(RechargeBO bo) { // 校验 @@ -1534,6 +1563,8 @@ public class TransactionBillServiceImpl implements TransactionBillService, After // 拼接分成列表 transactionAssembler.assembleBonusList(bill); + List<BonusVO> bonusList = bill.getBonusList(); + ServiceUtil.assertion(CollectionUtils.isEmptyElement(bonusList), "当前订单没有收益信息,无法退款"); Integer result = transactionTemplate.execute(status -> { // 修改订单状态 @@ -1548,13 +1579,12 @@ public class TransactionBillServiceImpl implements TransactionBillService, After // 分成方余额按照比例扣减 // 按比例计算退款金额 BigDecimal refundAmount = dto.getRefundAmount(); // 总退款金额 - if (CollectionUtils.isNotEmptyElement(bill.getBonusList())) { - int updateRefundBonus = this.updateRefundBonus(bill.getBonusList(), refundAmount); - ServiceUtil.assertion(updateRefundBonus != bill.getBonusList().size(), "商户余额更新失败"); - } + int updateRefundBonus = this.updateRefundBonus(bonusList, refundAmount); + ServiceUtil.assertion(updateRefundBonus != bonusList.size(), "商户余额更新失败"); // 修改原订单的退款金额和退款手续费 - int updateRefundAmount = this.addRefundAmount(bill.getBillId(), refundAmount, refundAmount, BigDecimal.ZERO); + Bonus platform = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null); + int updateRefundAmount = this.addRefundAmount(bill.getBillId(), refundAmount, BigDecimal.ZERO, BigDecimal.ZERO); ServiceUtil.assertion(updateRefundAmount != 1, "修改原订单的退款金额和退款手续费失败"); // 发起退款 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java index 5c44556f..fa06e84c 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java @@ -38,6 +38,7 @@ import com.ruoyi.ss.user.domain.dto.UserRealNameDTO; import com.ruoyi.ss.user.domain.vo.UserRealNameVO; import com.ruoyi.ss.user.mapper.SmUserMapper; import com.ruoyi.ss.user.service.ISmUserService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -60,6 +61,7 @@ import java.util.stream.Collectors; * @date 2024-01-24 */ @Service +@Slf4j public class SmUserServiceImpl implements ISmUserService { @Autowired @@ -161,7 +163,15 @@ public class SmUserServiceImpl implements ISmUserService @Override @Transactional public int addBalance(Long userId, BigDecimal amount, String reason, RecordBalanceBstType bstType, Long bstId) { - ServiceUtil.assertion(BigDecimal.ZERO.compareTo(amount) > 0, "增加的金额需要大于0"); + if (userId == null || amount == null) { + log.info("增加余额错误:userId 或 amount 为空"); + return 0; + } + ServiceUtil.assertion(BigDecimal.ZERO.compareTo(amount) > 0, "增加的金额不允许小于0"); + // 余额+0,则啥也不动 + if (BigDecimal.ZERO.compareTo(amount) == 0) { + return 1; + } // 查询用户 SmUserVo user = selectSmUserByUserId(userId); @@ -180,7 +190,15 @@ public class SmUserServiceImpl implements ISmUserService @Override @Transactional public int subtractBalance(Long userId, BigDecimal amount, boolean check, String reason, RecordBalanceBstType bstType, Long bstId) { + if (userId == null || amount == null) { + log.info("减少余额错误:userId 或 amount 为空"); + return 0; + } ServiceUtil.assertion(BigDecimal.ZERO.compareTo(amount) > 0, "减少的金额需要大于0"); + // 余额-0,则啥也不动 + if (BigDecimal.ZERO.compareTo(amount) == 0) { + return 1; + } // 查询用户 SmUserVo user = selectSmUserByUserId(userId); diff --git a/smart-switch-service/src/main/java/com/ruoyi/task/bonus/BonusTask.java b/smart-switch-service/src/main/java/com/ruoyi/task/bonus/BonusTask.java new file mode 100644 index 00000000..35901d5f --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/task/bonus/BonusTask.java @@ -0,0 +1,51 @@ +package com.ruoyi.task.bonus; + +import com.ruoyi.common.utils.collection.CollectionUtils; +import com.ruoyi.ss.bonus.domain.BonusQuery; +import com.ruoyi.ss.bonus.domain.BonusVO; +import com.ruoyi.ss.bonus.domain.enums.BonusStatus; +import com.ruoyi.ss.bonus.service.BonusService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author wjh + * 2024/9/27 + */ +@Component +@Slf4j +public class BonusTask { + + @Autowired + private BonusService bonusService; + + /** + * 分成打款 + */ + public void payBonus() { + // 查询预计分成时间当前时间之前,且为待分成的分成单 + BonusQuery query = new BonusQuery(); + query.setStatus(BonusStatus.WAIT_DIVIDE.getStatus()); + query.setPrePayTimeEnd(LocalDateTime.now()); + List<BonusVO> list = bonusService.selectBonusList(query); + + if (CollectionUtils.isEmptyElement(list)) { + log.info("暂无待分成的分成单"); + return; + } + + for (BonusVO bonus : list) { + try { + bonusService.payBonus(bonus); + } catch (Exception e) { + log.warn("分成打款失败:id={}, e={}", bonus.getId(), e.getMessage()); + } + } + + } + +} diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java index 5ad52785..9dc0dc8b 100644 --- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java +++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java @@ -191,4 +191,14 @@ public class SmTransactionBillController extends BaseController public AjaxResult close(@RequestBody @Validated EndUseDTO dto) { return success(transactionBillService.endUse(transactionBillConverter.toEndUseBO(dto), true)); } + + // 修复订单数据 + @PutMapping("/{billId}/fix") + @Log(title = "修复订单数据", businessType = BusinessType.UPDATE) + @PreAuthorize("@ss.hasPermi('system:bill:fix')") + public AjaxResult fix(@PathVariable Long billId) { + return toAjax(transactionBillService.fix(billId)); + } + + }