package com.tourguide.modules.finance.service; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.user.mapper.GuideUserMapper; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; /** 统一读取和原子变更导游可提现余额。 */ @Service public class GuideWithdrawableBalanceService { private final GuideUserMapper guideUserMapper; public GuideWithdrawableBalanceService(GuideUserMapper guideUserMapper) { this.guideUserMapper = guideUserMapper; } public BigDecimal getAvailableAmount(Long guideId) { return money(guideUserMapper.selectBalance(guideId)); } public boolean debit(Long guideId, BigDecimal amount) { BigDecimal value = money(amount); return value.signum() > 0 && guideUserMapper.decreaseBalance(guideId, value) == 1; } public void credit(Long guideId, BigDecimal amount) { BigDecimal value = money(amount); if (value.signum() == 0) return; if (value.signum() < 0 || guideUserMapper.increaseBalance(guideId, value) != 1) { throw new BusinessException(500, "导游余额更新失败"); } } private BigDecimal money(BigDecimal value) { return (value == null ? BigDecimal.ZERO : value).setScale(2, RoundingMode.HALF_UP); } }