diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java index 0598b7ba..25609c55 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/payBill/service/impl/PayBillConverterImpl.java @@ -142,7 +142,7 @@ public class PayBillConverterImpl implements PayBillConverter { PayBill po = new PayBill(); po.setBstType(PayBillBstType.RECHARGE_ORDER_DEPOSIT.getType()); po.setBstId(order.getBillId()); - po.setAmount(order.getSuitPrice()); + po.setAmount(order.getSuitDeposit()); po.setChannelId(channel.getChannelId()); po.setStatus(PayBillStatus.WAIT_PAY.getStatus()); po.setDescription("充值订单押金:" + order.getBillNo()); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java index b03eef4a..a2b84ab2 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java @@ -61,6 +61,7 @@ public class Suit extends BaseEntity @Excel(name = "押金", readConverterExp = "元=") @ApiModelProperty("押金") @Min(value = 0, message = "押金不允许小于0元") + @JsonView(DeviceView.SuitList.class) private BigDecimal deposit; /** 详细说明 */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/SuitBO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/SuitBO.java index 54145135..d9c1c031 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/SuitBO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/SuitBO.java @@ -37,6 +37,7 @@ public class SuitBO extends Suit { bo.setLowPower(getLowPower()); bo.setEnabledVoice(getEnabledVoice()); bo.setVoiceMinutes(getVoiceMinutes()); + bo.setDeposit(getDeposit()); return bo; } @@ -61,6 +62,7 @@ public class SuitBO extends Suit { bo.setLowPower(getLowPower()); bo.setEnabledVoice(getEnabledVoice()); bo.setVoiceMinutes(getVoiceMinutes()); + bo.setDeposit(getDeposit()); return bo; } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java index b3cb9621..da125f4e 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.ss.suit.service.impl; import com.ruoyi.common.core.domain.BaseValidator; import com.ruoyi.common.core.domain.ValidateResult; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.StringUtils; @@ -148,45 +149,6 @@ public class SuitValidatorImpl extends BaseValidator implements SuitValidator { } SuitService suitService = SpringUtils.getBean(SuitService.class); SuitVO old = suitService.selectSuitBySuitId(suit.getSuitId()); - boolean create = old == null; // 是否新建 - - // 创建或者修改其中一个时 - if (create || suit.getFeeType() != null || suit.getFeeMode() != null) { - - String feeMode = suit.getFeeMode() == null && old != null ? old.getFeeMode() : suit.getFeeMode(); - String feeType = suit.getFeeType() == null && old != null ? old.getFeeType() : suit.getFeeType(); - List<BigDecimal> gearAmount = suit.getGearAmount() == null && old != null ? old.getGearAmount() : suit.getGearAmount(); - List<Integer> gearTime = suit.getGearTime() == null && old != null ? old.getGearTime() : suit.getGearTime(); - Integer value = suit.getValue() == null && old != null ? old.getValue() : suit.getValue(); - String timeUnit = suit.getTimeUnit() == null && old != null ? old.getTimeUnit() : suit.getTimeUnit(); - - // 判断收费方式是否被允许 - if (SuitFeeMode.SINGLE.getMode().equals(feeMode) && !SuitFeeType.allowSingle().contains(feeType)) { - return error("该收费模式下,收费方式不被允许"); - } - - // 判断分时电价是否设置 - if (SuitFeeType.timingList().contains(feeType) && (CollectionUtils.isEmptyElement(gearAmount) || CollectionUtils.isEmptyElement(gearTime))) { - return error("需要配置分时电价"); - } - - // 判断单次购买时长/度是否设置 - if (SuitFeeType.singleList().contains(feeType) && value == null) { - return error("需要配置单次购买时长/度"); - } - - // 判断时长单位是否设置 - if (SuitFeeType.needConfigTimeUnit().contains(feeType) && timeUnit == null) { - return error("需要配置时长单位"); - } - } - - if (create || suit.getPrice() != null) { - BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE); - if (suit.getPrice().compareTo(minService) < 0) { - return error("价格/押金不允许低于" + minService + "元"); - } - } // 判断设备是否支持电量 if (SuitFeeType.rechargeCountList().contains(suit.getFeeType()) && CollectionUtils.isNotEmptyElement(suit.getDeviceIds())) { @@ -207,8 +169,64 @@ public class SuitValidatorImpl extends BaseValidator implements SuitValidator { @Override public void afterCheck(SuitVO vo, SuitVO old) { + if (vo == null){ + return; + } - ServiceUtil.assertion (vo.getEnabledLowPowerClose() != null && vo.getEnabledLowPowerClose() && vo.getLowPower() == null, "最低功率阈值不允许为空"); + String feeMode = vo.getFeeMode(); + String feeType = vo.getFeeType(); + List<BigDecimal> gearAmount = vo.getGearAmount(); + List<Integer> gearTime = vo.getGearTime(); + Integer value = vo.getValue() ; + String timeUnit = vo.getTimeUnit(); + // 判断收费方式是否被允许 + if (SuitFeeMode.SINGLE.getMode().equals(feeMode) && !SuitFeeType.allowSingle().contains(feeType)) { + throw new ServiceException("该收费模式下,收费方式不被允许"); + } + + // 判断分时电价是否设置 + if (SuitFeeType.timingList().contains(feeType) && (CollectionUtils.isEmptyElement(gearAmount) || CollectionUtils.isEmptyElement(gearTime))) { + throw new ServiceException("需要配置分时电价"); + } + + // 判断单次购买时长/度是否设置 + if (SuitFeeType.singleList().contains(feeType) && value == null) { + throw new ServiceException("需要配置单次购买时长/度"); + } + + // 判断时长单位是否设置 + if (SuitFeeType.needConfigTimeUnit().contains(feeType) && timeUnit == null) { + throw new ServiceException("需要配置时长单位"); + } + + // 若开启最低功率阈值,则需设置最低功率 + if (SuitFeeType.rechargeCountList().contains(feeType)) { + ServiceUtil.assertion (vo.getEnabledLowPowerClose() != null && vo.getEnabledLowPowerClose() && vo.getLowPower() == null, "最低功率阈值不允许为空"); + } + + // 若开启语音播报,则需要设置播报时机 + if (SuitFeeType.TIME.getType().equals(feeType)) { + ServiceUtil.assertion(vo.getEnabledVoice() != null && vo.getEnabledVoice() && vo.getVoiceMinutes() == null, "语音播报时机不允许为空"); + } + + // 一次性充值的套餐,价格不允许低于最低服务费 + if (SuitFeeType.singleList().contains(feeType)) { + ServiceUtil.assertion(vo.getPrice() == null, "价格不允许为空"); + BigDecimal minService = sysConfigService.getBigDecimal(ConfigKey.RECHARGE_MIN_SERVICE); + if (vo.getPrice().compareTo(minService) < 0) { + throw new ServiceException("价格不允许低于" + minService + "元"); + } + + // 若为智能计时、智能按量,则押金不允许低于价格,且必须为价格的整数倍 + if (SuitFeeMode.SMART.getMode().equals(feeMode)) { + ServiceUtil.assertion(vo.getDeposit() == null, "押金不允许为空"); + ServiceUtil.assertion(vo.getDeposit().compareTo(vo.getPrice()) < 0, "押金不允许低于价格"); + + // 取模,判断余数 + BigDecimal remainder = vo.getDeposit().remainder(vo.getPrice()); + ServiceUtil.assertion(remainder.compareTo(BigDecimal.ZERO) != 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 08b7549e..8ced9e96 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 @@ -306,6 +306,10 @@ public class TransactionBill extends BaseEntity implements Payable @ApiModelProperty("套餐语音播报设置结果描述") private String suitVoidMsg; + @Excel(name = "套餐押金", readConverterExp = "元=") + @ApiModelProperty("套餐押金") + private BigDecimal suitDeposit; + /** * 获取价格(分) */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/dto/RechargeDTO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/dto/RechargeDTO.java index 02af7045..c126c06f 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/dto/RechargeDTO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/dto/RechargeDTO.java @@ -55,11 +55,16 @@ public class RechargeDTO { @DictValid(type = DictTypeConstants.SUIT_FEE_TYPE, message = "非法的套餐收费类型") private String suitFeeType; - @ApiModelProperty("套餐金额/押金") - @NotNull(message = "套餐金额/押金不允许为空") - @Min(value = 0, message = "套餐金额/押金不允许小于0") + @ApiModelProperty("套餐金额") + @NotNull(message = "套餐金额不允许为空") + @Min(value = 0, message = "套餐金额不允许小于0") private BigDecimal suitPrice; + @ApiModelProperty("套餐押金") + @NotNull(message = "套餐押金不允许为空") + @Min(value = 0, message = "套餐押金不允许小于0") + private BigDecimal suitDeposit; + @ApiModelProperty("套餐档位金额列表") @AllowSize(sizes = {0, 4}, message = "套餐档位金额列表大小仅允许为0或者4") private List<BigDecimal> suitGearAmount; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/vo/TransactionBillVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/vo/TransactionBillVO.java index 57e520aa..0cad0723 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/vo/TransactionBillVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/vo/TransactionBillVO.java @@ -5,6 +5,8 @@ import com.ruoyi.common.core.domain.JsonViewProfile; import com.ruoyi.ss.bonus.domain.Bonus; import com.ruoyi.ss.bonus.domain.BonusVO; import com.ruoyi.iot.interfaces.IotDevice; +import com.ruoyi.ss.suit.domain.enums.SuitFeeMode; +import com.ruoyi.ss.suit.domain.enums.SuitFeeType; import com.ruoyi.ss.suit.domain.enums.SuitTimeUnit; import com.ruoyi.ss.transactionBill.domain.TransactionBill; import io.swagger.annotations.ApiModel; @@ -12,6 +14,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; /** @@ -72,7 +75,15 @@ public class TransactionBillVO extends TransactionBill implements IotDevice { unit = SuitTimeUnit.MINUTE; } long time = this.getSuitTime() == null ? 0 : this.getSuitTime(); - return time * unit.getConversion(); + + // 计算周期数 + int round = 1; + // 若为智能模式,则计算出押金最大支持多少次,向上取整 + if (SuitFeeMode.SMART.getMode().equals(this.getSuitFeeMode())) { + round = this.getSuitDeposit().divide(this.getSuitPrice(), 0, RoundingMode.UP).intValue(); + } + + return time * unit.getConversion() * round; } @Override 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 9a2a0c9c..5dac583c 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 @@ -76,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" stb.suit_void_minute, stb.suit_void_result, stb.suit_void_msg, + stb.suit_deposit, </sql> <sql id="selectSmTransactionBillVo"> @@ -480,6 +481,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="suitVoidMinute != null">suit_void_minute,</if> <if test="suitVoidResult != null">suit_void_result,</if> <if test="suitVoidMsg != null">suit_void_msg,</if> + <if test="suitDeposit != null">suit_deposit,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="billNo != null">#{billNo},</if> @@ -544,6 +546,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="suitVoidMinute != null">#{suitVoidMinute},</if> <if test="suitVoidResult != null">#{suitVoidResult},</if> <if test="suitVoidMsg != null">#{suitVoidMsg},</if> + <if test="suitDeposit != null">#{suitDeposit},</if> </trim> </insert> @@ -626,6 +629,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <if test="data.suitVoidMinute != null">stb.suit_void_minute = #{data.suitVoidMinute},</if> <if test="data.suitVoidResult != null">stb.suit_void_result = #{data.suitVoidResult},</if> <if test="data.suitVoidMsg != null">stb.suit_void_msg = #{data.suitVoidMsg},</if> + <if test="data.suitDeposit != null">suit_deposit = #{data.suitDeposit},</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 423f04ee..8eb8b583 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 @@ -192,6 +192,18 @@ public interface TransactionBillService */ int updateByQuery(TransactionBill data, TransactionBillQuery query); + /** + * 尝试充值设备 + * @param billId 订单ID + * @param tryCount 尝试次数 + */ + void tryRechargeDevice(Long billId, int tryCount); + + /** + * 尝试设置语音 + */ + void trySetVoice(TransactionBillVO bill, int tryCount); + /** * 刷新支付结果 */ @@ -249,11 +261,6 @@ public interface TransactionBillService */ int selectSimpleCount(TransactionBillQuery query); - /** - * 充值成功后处理 - */ - int rechargeSuccess(PaySuccessBO bo); - /** * 支付押金 */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java index b0f7d212..8c668432 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/RechargePayHandler.java @@ -2,6 +2,8 @@ package com.ruoyi.ss.transactionBill.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.ss.bonus.domain.BonusVO; +import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType; import com.ruoyi.ss.bonus.service.BonusService; import com.ruoyi.ss.payBill.domain.PayBillVO; import com.ruoyi.ss.payBill.domain.bo.RefundSuccessBO; @@ -14,6 +16,7 @@ import com.ruoyi.ss.transactionBill.domain.TransactionBill; import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery; import com.ruoyi.ss.transactionBill.domain.bo.PaySuccessBO; import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillStatus; +import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType; import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; import com.ruoyi.ss.transactionBill.service.TransactionAssembler; import com.ruoyi.ss.transactionBill.service.TransactionBillService; @@ -23,6 +26,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate; import java.math.BigDecimal; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * 充值成功处理类 @@ -43,7 +49,7 @@ public class RechargePayHandler implements AfterPay, AfterRefund { private TransactionTemplate transactionTemplate; @Autowired - private ISmUserService userService; + private ScheduledExecutorService scheduledExecutorService; @Autowired private BonusService bonusService; @@ -65,12 +71,66 @@ public class RechargePayHandler implements AfterPay, AfterRefund { transactionAssembler.assembleBonusList(bill); if (SuitFeeType.singleList().contains(bill.getSuitFeeType())) { - return transactionBillService.rechargeSuccess(bo); + return this.handleSinglePaySuccess(bo); } else { return this.handleTimingPaySuccess(bo); } } + /** + * 处理单次订单支付成功 + */ + private int handleSinglePaySuccess(PaySuccessBO bo) { + TransactionBillVO bill = bo.getOrder(); + PayBillVO pay = bo.getPayBill(); + ServiceUtil.assertion(bill == null || !TransactionBillType.RECHARGE.getType().equals(bill.getType()), "充值订单不存在"); + ServiceUtil.assertion(!TransactionBillStatus.UNPAID.getStatus().equals(bill.getStatus()), "当前订单状态非未支付"); + + List<BonusVO> bonusList = bill.getBonusList(); + + Integer result = transactionTemplate.execute(status -> { + // 处理分成,将金额分好 + bonusService.partBonus(bonusList, bill.getMoney()); + BonusVO platform = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null); + BonusVO mch = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.MCH.getType())).findFirst().orElse(null); + + // 修改订单信息 + TransactionBill data = new TransactionBill(); + data.setStatus(TransactionBillStatus.SUCCESS.getStatus()); + data.setPayTime(DateUtils.toDate(pay.getPayTime())); + data.setChannelId(pay.getChannelId()); + data.setChannelCost(pay.getChannelCost()); + data.setPayId(pay.getPayId()); + if (platform != null) { + data.setServiceCharge(platform.getAmount()); + } + if (mch != null) { + data.setArrivalAmount(mch.getAmount()); + } + TransactionBillQuery query = new TransactionBillQuery(); + query.setBillId(bill.getBillId()); + query.setStatus(TransactionBillStatus.UNPAID.getStatus()); + query.setType(TransactionBillType.RECHARGE.getType()); + int updateCount = transactionBillService.updateByQuery(data, query); + ServiceUtil.assertion(updateCount != 1, "订单状态已发生变化,请刷新后重试"); + + return updateCount; + }); + + // 操作成功 + if (result != null && result == 1) { + // 充值设备,尝试1次 + transactionBillService.tryRechargeDevice(bill.getBillId(), 1); + + // 设备设置语音播报 + scheduledExecutorService.schedule(() -> { + transactionBillService.trySetVoice(bill, 3); + }, 0, TimeUnit.SECONDS); + } + + return result == null ? 0 : result; + } + /** * 处理分时段订单支付成功 */ 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 e91ae9eb..4ab4355d 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 @@ -425,12 +425,20 @@ public class TransactionBillServiceImpl implements TransactionBillService, After order.setCloseResult("预计成功"); if (SuitFeeType.timingList().contains(suit.getFeeType())) { - // 当为分时段收费,则收取押金 - order.setSuitPrice(dto.getSuitPrice()); + // 当为分时段收费,状态为未支付押金 + order.setSuitPrice(dto.getSuitDeposit()); + order.setSuitDeposit(dto.getSuitDeposit()); order.setStatus(TransactionBillStatus.UNPAID_DEPOSIT.getStatus()); // 未支付押金 } else { - // 否则收取金额 - order.setMoney(dto.getMoney()); + // 否则为未支付 + if (SuitFeeMode.SMART.getMode().equals(suit.getFeeMode())) { + // 智能收费,收取押金 + order.setMoney(dto.getSuitDeposit()); + order.setSuitDeposit(dto.getSuitDeposit()); + } else { + // 单次收费,收取本金 + order.setMoney(dto.getMoney()); + } order.setStatus(TransactionBillStatus.UNPAID.getStatus()); // 状态:未支付 } @@ -930,64 +938,11 @@ public class TransactionBillServiceImpl implements TransactionBillService, After return transactionBillMapper.updateSmTransactionBill(data); } - @Override - public int rechargeSuccess(PaySuccessBO bo) { - TransactionBillVO bill = bo.getOrder(); - PayBillVO pay = bo.getPayBill(); - ServiceUtil.assertion(bill == null || !TransactionBillType.RECHARGE.getType().equals(bill.getType()), "充值订单不存在"); - ServiceUtil.assertion(!TransactionBillStatus.UNPAID.getStatus().equals(bill.getStatus()), "当前订单状态非未支付"); - - List<BonusVO> bonusList = bill.getBonusList(); - - Integer result = transactionTemplate.execute(status -> { - - // 处理分成,将金额分好 - bonusService.partBonus(bonusList, bill.getMoney()); - BonusVO platform = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null); - BonusVO mch = bonusList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.MCH.getType())).findFirst().orElse(null); - - // 修改订单信息 - TransactionBill data = new TransactionBill(); - data.setStatus(TransactionBillStatus.SUCCESS.getStatus()); - data.setPayTime(DateUtils.toDate(pay.getPayTime())); - data.setChannelId(pay.getChannelId()); - data.setChannelCost(pay.getChannelCost()); - data.setPayId(pay.getPayId()); - if (platform != null) { - data.setServiceCharge(platform.getAmount()); - } - if (mch != null) { - data.setArrivalAmount(mch.getAmount()); - } - TransactionBillQuery query = new TransactionBillQuery(); - query.setBillId(bill.getBillId()); - query.setStatus(TransactionBillStatus.UNPAID.getStatus()); - query.setType(TransactionBillType.RECHARGE.getType()); - int updateCount = this.updateByQuery(data, query); - ServiceUtil.assertion(updateCount != 1, "订单状态已发生变化,请刷新后重试"); - - return updateCount; - }); - - // 操作成功 - if (result != null && result == 1) { - // 充值设备,尝试1次 - this.tryRechargeDevice(bill.getBillId(), 1); - - // 设备设置语音播报 - scheduledExecutorService.schedule(() -> { - this.trySetVoice(bill, 3); - }, 0, TimeUnit.SECONDS); - } - - - return result == null ? 0 : result; - } - /** * 尝试设置语音播报 */ - private void trySetVoice(TransactionBillVO bill, int tryCount) { + @Override + public void trySetVoice(TransactionBillVO bill, int tryCount) { if (tryCount <= 0) { return; } @@ -1033,7 +988,8 @@ public class TransactionBillServiceImpl implements TransactionBillService, After * @param billId * @param tryCount */ - private void tryRechargeDevice(Long billId, int tryCount) { + @Override + public void tryRechargeDevice(Long billId, int tryCount) { if (tryCount <= 0) { return; } @@ -1374,12 +1330,15 @@ public class TransactionBillServiceImpl implements TransactionBillService, After BigDecimal startEle = order.getSuitStartEle(); BigDecimal usedEle = totalEle.subtract(startEle); // 已使用的电量 BigDecimal suitTotalEle = BigDecimal.valueOf(order.getSuitTime()); // 套餐总电量 - BigDecimal noUsedEle = suitTotalEle.subtract(usedEle); // 未使用的电量 - // 退款金额 = 订单金额 * 未使用的电量 / 套餐总电量 + // 计算总使用的周期数,不满足一个周期也算一个周期 + BigDecimal totalRound = usedEle.divide(suitTotalEle, 0, RoundingMode.UP); + + // 退款金额 = 订单金额 - 使用周期数 * 单价 return order.getMoney() - .multiply(noUsedEle) - .divide(suitTotalEle, 2, RoundingMode.HALF_UP); + .subtract( + totalRound.multiply(order.getSuitPrice()) + ); } // 计算智能时长收费需要退款的金额 @@ -1391,12 +1350,15 @@ public class TransactionBillServiceImpl implements TransactionBillService, After ServiceUtil.assertion(unit == null, "订单套餐单位无效"); long totalSeconds = unit.getConversion() * order.getSuitTime(); // 总时长 - long noUseSeconds = totalSeconds - between.getSeconds(); // 未使用的时长 - // 退款金额 = 订单金额 * 未使用的时长 / 总时长 + // 计算总使用的周期数,不满足一个周期也算一个周期 + long totalRound = totalSeconds / order.getSuitTime() + (totalSeconds % order.getSuitTime() != 0 ? 1 : 0); + + // 退款金额 = 订单金额 - 使用周期数 * 单价 return order.getMoney() - .multiply(BigDecimal.valueOf(noUseSeconds)) - .divide(BigDecimal.valueOf(totalSeconds), 2, RoundingMode.HALF_UP); + .subtract( + BigDecimal.valueOf(totalRound).multiply(order.getSuitPrice()) + ); } // 计算分时段计量金额 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillValidatorImpl.java index 56109aa4..55dd68fb 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillValidatorImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillValidatorImpl.java @@ -127,6 +127,9 @@ public class TransactionBillValidatorImpl extends BaseValidator implements Trans if (suit.getPrice().compareTo(dto.getSuitPrice()) != 0) { return error("当前套餐价格已发生变化,请重新下单"); } + if (suit.getDeposit().compareTo(dto.getSuitDeposit()) != 0) { + return error("当前套餐押金已发生变化,请重新下单"); + } if (!suit.getFeeMode().equals(dto.getSuitFeeMode())) { return error("当前套餐收费模式发生变化,请重新下单"); }