package com.zsElectric.boot.business.service.impl; import com.zsElectric.boot.business.mapper.FirmAccountLogMapper; import com.zsElectric.boot.business.model.entity.FirmAccountLog; import com.zsElectric.boot.business.model.form.FirmBalanceChangeForm; import com.zsElectric.boot.core.exception.BusinessException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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.zsElectric.boot.business.mapper.FirmInfoMapper; import com.zsElectric.boot.business.service.FirmInfoService; import com.zsElectric.boot.business.model.entity.FirmInfo; import com.zsElectric.boot.business.model.form.FirmInfoForm; import com.zsElectric.boot.business.model.query.FirmInfoQuery; import com.zsElectric.boot.business.model.vo.FirmInfoVO; import com.zsElectric.boot.business.converter.FirmInfoConverter; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.UUID; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; /** * 企业信息服务实现类 * * @author zsElectric * @since 2025-12-11 10:10 */ @Slf4j @Service @RequiredArgsConstructor public class FirmInfoServiceImpl extends ServiceImpl implements FirmInfoService { private final FirmInfoConverter firmInfoConverter; private final FirmAccountLogMapper firmAccountLogMapper; /** * 获取企业信息分页列表 * * @param queryParams 查询参数 * @return {@link IPage} 企业信息分页列表 */ @Override public IPage getFirmInfoPage(FirmInfoQuery queryParams) { Page pageVO = this.baseMapper.getFirmInfoPage( new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), queryParams ); return pageVO; } /** * 获取企业信息表单数据 * * @param id 企业信息ID * @return 企业信息表单数据 */ @Override public FirmInfoForm getFirmInfoFormData(Long id) { FirmInfo entity = this.getById(id); return firmInfoConverter.toForm(entity); } /** * 新增企业信息 * * @param formData 企业信息表单对象 * @return 是否新增成功 */ @Override public boolean saveFirmInfo(FirmInfoForm formData) { FirmInfo entity = firmInfoConverter.toEntity(formData); return this.save(entity); } /** * 更新企业信息 * * @param id 企业信息ID * @param formData 企业信息表单对象 * @return 是否修改成功 */ @Override public boolean updateFirmInfo(Long id,FirmInfoForm formData) { FirmInfo entity = firmInfoConverter.toEntity(formData); return this.updateById(entity); } /** * 删除企业信息 * * @param ids 企业信息ID,多个以英文逗号(,)分割 * @return 是否删除成功 */ @Override public boolean deleteFirmInfos(String ids) { Assert.isTrue(StrUtil.isNotBlank(ids), "删除的企业信息数据为空"); // 逻辑删除 List idList = Arrays.stream(ids.split(",")) .map(Long::parseLong) .toList(); return this.removeByIds(idList); } /** * 上账(充值)- 增加企业余额 */ @Override @Transactional(rollbackFor = Exception.class) public boolean recharge(Long firmId, BigDecimal amount, String remark) { FirmBalanceChangeForm form = new FirmBalanceChangeForm(); form.setFirmId(firmId); form.setAmount(amount); form.setIncomeType(1); // 转入 form.setChangeType(1); // 充值 form.setRemark(remark); return changeBalance(form); } /** * 下账(扣款)- 减少企业余额 */ @Override @Transactional(rollbackFor = Exception.class) public boolean deduct(Long firmId, BigDecimal amount, String remark) { FirmBalanceChangeForm form = new FirmBalanceChangeForm(); form.setFirmId(firmId); form.setAmount(amount); form.setIncomeType(2); // 转出 form.setChangeType(2); // 提现/扣款 form.setRemark(remark); return changeBalance(form); } /** * 企业账户余额变更 */ @Override @Transactional(rollbackFor = Exception.class) public boolean changeBalance(FirmBalanceChangeForm form) { // 1. 查询企业信息 FirmInfo firmInfo = this.getById(form.getFirmId()); if (firmInfo == null) { throw new BusinessException("企业不存在"); } // 2. 计算变更前余额 BigDecimal beforeBalance = firmInfo.getBalance() != null ? firmInfo.getBalance() : BigDecimal.ZERO; BigDecimal changeAmount = form.getAmount(); BigDecimal afterBalance; // 3. 根据收支类型计算变更后余额 if (form.getIncomeType() == 1) { // 上账/转入 afterBalance = beforeBalance.add(changeAmount); // 更新累计充值 BigDecimal totalRecharge = firmInfo.getTotalRecharge() != null ? firmInfo.getTotalRecharge() : BigDecimal.ZERO; firmInfo.setTotalRecharge(totalRecharge.add(changeAmount)); } else { // 下账/转出 if (beforeBalance.compareTo(changeAmount) < 0) { throw new BusinessException("企业余额不足"); } afterBalance = beforeBalance.subtract(changeAmount); } // 4. 更新企业余额 firmInfo.setBalance(afterBalance); this.updateById(firmInfo); // 5. 记录资金流水 FirmAccountLog accountLog = new FirmAccountLog(); accountLog.setFirmId(form.getFirmId()); accountLog.setProjectName("企业账户"); accountLog.setName(form.getIncomeType() == 1 ? "上账" : "下账"); accountLog.setSerialNo(generateSerialNo()); accountLog.setIncomeType(form.getIncomeType()); accountLog.setBeforeChange(beforeBalance); accountLog.setAfterChange(afterBalance); accountLog.setMoneyChange(changeAmount); accountLog.setChangeType(form.getChangeType() != null ? form.getChangeType() : (form.getIncomeType() == 1 ? 1 : 2)); accountLog.setRemark(form.getRemark()); accountLog.setCreateTime(LocalDateTime.now()); firmAccountLogMapper.insert(accountLog); log.info("企业账户余额变更成功 - firmId: {}, incomeType: {}, amount: {}, before: {}, after: {}", form.getFirmId(), form.getIncomeType(), changeAmount, beforeBalance, afterBalance); return true; } /** * 生成流水号 */ private String generateSerialNo() { String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 8).toUpperCase(); return "FIRM" + timestamp + uuid; } }