FirmInfoServiceImpl.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package com.zsElectric.boot.business.service.impl;
  2. import com.zsElectric.boot.business.mapper.FirmAccountLogMapper;
  3. import com.zsElectric.boot.business.model.entity.FirmAccountLog;
  4. import com.zsElectric.boot.business.model.form.FirmBalanceChangeForm;
  5. import com.zsElectric.boot.core.exception.BusinessException;
  6. import lombok.RequiredArgsConstructor;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.transaction.annotation.Transactional;
  10. import com.baomidou.mybatisplus.core.metadata.IPage;
  11. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  12. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  13. import com.zsElectric.boot.business.mapper.FirmInfoMapper;
  14. import com.zsElectric.boot.business.service.FirmInfoService;
  15. import com.zsElectric.boot.business.model.entity.FirmInfo;
  16. import com.zsElectric.boot.business.model.form.FirmInfoForm;
  17. import com.zsElectric.boot.business.model.query.FirmInfoQuery;
  18. import com.zsElectric.boot.business.model.vo.FirmInfoVO;
  19. import com.zsElectric.boot.business.converter.FirmInfoConverter;
  20. import java.math.BigDecimal;
  21. import java.time.LocalDateTime;
  22. import java.time.format.DateTimeFormatter;
  23. import java.util.Arrays;
  24. import java.util.List;
  25. import java.util.UUID;
  26. import cn.hutool.core.lang.Assert;
  27. import cn.hutool.core.util.StrUtil;
  28. /**
  29. * 企业信息服务实现类
  30. *
  31. * @author zsElectric
  32. * @since 2025-12-11 10:10
  33. */
  34. @Slf4j
  35. @Service
  36. @RequiredArgsConstructor
  37. public class FirmInfoServiceImpl extends ServiceImpl<FirmInfoMapper, FirmInfo> implements FirmInfoService {
  38. private final FirmInfoConverter firmInfoConverter;
  39. private final FirmAccountLogMapper firmAccountLogMapper;
  40. /**
  41. * 获取企业信息分页列表
  42. *
  43. * @param queryParams 查询参数
  44. * @return {@link IPage<FirmInfoVO>} 企业信息分页列表
  45. */
  46. @Override
  47. public IPage<FirmInfoVO> getFirmInfoPage(FirmInfoQuery queryParams) {
  48. Page<FirmInfoVO> pageVO = this.baseMapper.getFirmInfoPage(
  49. new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),
  50. queryParams
  51. );
  52. return pageVO;
  53. }
  54. /**
  55. * 获取企业信息表单数据
  56. *
  57. * @param id 企业信息ID
  58. * @return 企业信息表单数据
  59. */
  60. @Override
  61. public FirmInfoForm getFirmInfoFormData(Long id) {
  62. FirmInfo entity = this.getById(id);
  63. return firmInfoConverter.toForm(entity);
  64. }
  65. /**
  66. * 新增企业信息
  67. *
  68. * @param formData 企业信息表单对象
  69. * @return 是否新增成功
  70. */
  71. @Override
  72. public boolean saveFirmInfo(FirmInfoForm formData) {
  73. FirmInfo entity = firmInfoConverter.toEntity(formData);
  74. return this.save(entity);
  75. }
  76. /**
  77. * 更新企业信息
  78. *
  79. * @param id 企业信息ID
  80. * @param formData 企业信息表单对象
  81. * @return 是否修改成功
  82. */
  83. @Override
  84. public boolean updateFirmInfo(Long id,FirmInfoForm formData) {
  85. FirmInfo entity = firmInfoConverter.toEntity(formData);
  86. return this.updateById(entity);
  87. }
  88. /**
  89. * 删除企业信息
  90. *
  91. * @param ids 企业信息ID,多个以英文逗号(,)分割
  92. * @return 是否删除成功
  93. */
  94. @Override
  95. public boolean deleteFirmInfos(String ids) {
  96. Assert.isTrue(StrUtil.isNotBlank(ids), "删除的企业信息数据为空");
  97. // 逻辑删除
  98. List<Long> idList = Arrays.stream(ids.split(","))
  99. .map(Long::parseLong)
  100. .toList();
  101. return this.removeByIds(idList);
  102. }
  103. /**
  104. * 上账(充值)- 增加企业余额
  105. */
  106. @Override
  107. @Transactional(rollbackFor = Exception.class)
  108. public boolean recharge(Long firmId, BigDecimal amount, String remark) {
  109. FirmBalanceChangeForm form = new FirmBalanceChangeForm();
  110. form.setFirmId(firmId);
  111. form.setAmount(amount);
  112. form.setIncomeType(1); // 转入
  113. form.setChangeType(1); // 充值
  114. form.setRemark(remark);
  115. return changeBalance(form);
  116. }
  117. /**
  118. * 下账(扣款)- 减少企业余额
  119. */
  120. @Override
  121. @Transactional(rollbackFor = Exception.class)
  122. public boolean deduct(Long firmId, BigDecimal amount, String remark) {
  123. FirmBalanceChangeForm form = new FirmBalanceChangeForm();
  124. form.setFirmId(firmId);
  125. form.setAmount(amount);
  126. form.setIncomeType(2); // 转出
  127. form.setChangeType(2); // 提现/扣款
  128. form.setRemark(remark);
  129. return changeBalance(form);
  130. }
  131. /**
  132. * 企业账户余额变更
  133. */
  134. @Override
  135. @Transactional(rollbackFor = Exception.class)
  136. public boolean changeBalance(FirmBalanceChangeForm form) {
  137. // 1. 查询企业信息
  138. FirmInfo firmInfo = this.getById(form.getFirmId());
  139. if (firmInfo == null) {
  140. throw new BusinessException("企业不存在");
  141. }
  142. // 2. 计算变更前余额
  143. BigDecimal beforeBalance = firmInfo.getBalance() != null ? firmInfo.getBalance() : BigDecimal.ZERO;
  144. BigDecimal changeAmount = form.getAmount();
  145. BigDecimal afterBalance;
  146. // 3. 根据收支类型计算变更后余额
  147. if (form.getIncomeType() == 1) {
  148. // 上账/转入
  149. afterBalance = beforeBalance.add(changeAmount);
  150. // 更新累计充值
  151. BigDecimal totalRecharge = firmInfo.getTotalRecharge() != null ? firmInfo.getTotalRecharge() : BigDecimal.ZERO;
  152. firmInfo.setTotalRecharge(totalRecharge.add(changeAmount));
  153. } else {
  154. // 下账/转出
  155. if (beforeBalance.compareTo(changeAmount) < 0) {
  156. throw new BusinessException("企业余额不足");
  157. }
  158. afterBalance = beforeBalance.subtract(changeAmount);
  159. }
  160. // 4. 更新企业余额
  161. firmInfo.setBalance(afterBalance);
  162. this.updateById(firmInfo);
  163. // 5. 记录资金流水
  164. FirmAccountLog accountLog = new FirmAccountLog();
  165. accountLog.setFirmId(form.getFirmId());
  166. accountLog.setProjectName("企业账户");
  167. accountLog.setName(form.getIncomeType() == 1 ? "上账" : "下账");
  168. accountLog.setSerialNo(generateSerialNo());
  169. accountLog.setIncomeType(form.getIncomeType());
  170. accountLog.setBeforeChange(beforeBalance);
  171. accountLog.setAfterChange(afterBalance);
  172. accountLog.setMoneyChange(changeAmount);
  173. accountLog.setChangeType(form.getChangeType() != null ? form.getChangeType() : (form.getIncomeType() == 1 ? 1 : 2));
  174. accountLog.setRemark(form.getRemark());
  175. accountLog.setCreateTime(LocalDateTime.now());
  176. firmAccountLogMapper.insert(accountLog);
  177. log.info("企业账户余额变更成功 - firmId: {}, incomeType: {}, amount: {}, before: {}, after: {}",
  178. form.getFirmId(), form.getIncomeType(), changeAmount, beforeBalance, afterBalance);
  179. return true;
  180. }
  181. /**
  182. * 生成流水号
  183. */
  184. private String generateSerialNo() {
  185. String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
  186. String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 8).toUpperCase();
  187. return "FIRM" + timestamp + uuid;
  188. }
  189. }