package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.dto.AccountTransferDto; import com.ruoyi.account.mapper.AccountMapper; import com.ruoyi.account.pojo.Account; import com.ruoyi.account.service.AccountService; import com.ruoyi.common.exception.ServiceException; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; @AllArgsConstructor @Service public class AccountServiceImpl extends ServiceImpl implements AccountService { private AccountMapper accountMapper; @Override public IPage accountListPage(Page page, Account account) { return accountMapper.accountListPage(page, account); } /** * 流水类型 -> 收支方向 * 0收入 +1, 1支出 -1, 3存入 +1, 4取出 -1, 2转账由 transfer() 处理 */ private Integer resolveDirection(String flowType) { if (flowType == null) { return null; } switch (flowType) { case "0": case "3": return 1; case "1": case "4": return -1; default: return null; } } @Override public boolean saveFlow(Account account) { if (account.getAccountId() == null) { throw new ServiceException("资金账户不能为空"); } if (account.getAmount() == null || account.getAmount().signum() <= 0) { throw new ServiceException("流水金额必须大于0"); } if ("2".equals(account.getFlowType())) { throw new ServiceException("转账请使用转账接口,以确保生成成对流水"); } if (account.getDirection() == null) { account.setDirection(resolveDirection(account.getFlowType())); } if (account.getDirection() == null) { throw new ServiceException("请选择有效的流水类型"); } if (account.getAccountDate() == null) { account.setAccountDate(new Date()); } return this.save(account); } @Override public boolean updateFlow(Account account) { if (account.getId() == null) throw new ServiceException("流水ID不能为空"); Account existing = this.getById(account.getId()); if (existing == null) throw new ServiceException("资金流水不存在"); if ("2".equals(existing.getFlowType()) || "2".equals(account.getFlowType())) { throw new ServiceException("转账成对流水不可单独编辑"); } if (account.getAccountId() == null) throw new ServiceException("资金账户不能为空"); if (account.getAmount() == null || account.getAmount().signum() <= 0) throw new ServiceException("流水金额必须大于0"); Integer direction = resolveDirection(account.getFlowType()); if (direction == null) throw new ServiceException("请选择有效的流水类型"); account.setDirection(direction); return this.updateById(account); } @Override @Transactional(rollbackFor = Exception.class) public boolean transfer(AccountTransferDto dto) { if (dto.getFromAccountId() == null || dto.getToAccountId() == null) { throw new ServiceException("转出/转入账户不能为空"); } if (dto.getFromAccountId().equals(dto.getToAccountId())) { throw new ServiceException("转出与转入账户不能相同"); } if (dto.getAmount() == null || dto.getAmount().signum() <= 0) { throw new ServiceException("转账金额必须大于0"); } Date date = dto.getTransferDate() == null ? new Date() : dto.getTransferDate(); Account out = new Account(); out.setAccountDate(date); out.setAccountId(dto.getFromAccountId()); out.setFlowType("2"); out.setDirection(-1); out.setCounterAccountId(dto.getToAccountId()); out.setAmount(dto.getAmount()); out.setRemark(dto.getRemark()); Account in = new Account(); in.setAccountDate(date); in.setAccountId(dto.getToAccountId()); in.setFlowType("2"); in.setDirection(1); in.setCounterAccountId(dto.getFromAccountId()); in.setAmount(dto.getAmount()); in.setRemark(dto.getRemark()); this.save(out); this.save(in); return true; } }