From 5dda61bda61b19fbb64e2e8225ffedc72129f272 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Wed, 25 Jun 2025 18:22:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8A=A5=E5=B7=A5=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/controller/SysOaFinanceController.java | 33 ++++++++ .../oa/service/ISysOaFinanceService.java | 4 + .../service/impl/SysOaFinanceServiceImpl.java | 84 +++++++++++++++++++ 3 files changed, 121 insertions(+) diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFinanceController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFinanceController.java index d65e2e8..43bf17c 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFinanceController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaFinanceController.java @@ -262,4 +262,37 @@ public class SysOaFinanceController extends BaseController { public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] financeIds) { return toAjax(iSysOaFinanceService.deleteWithValidByIds(Arrays.asList(financeIds), true)); }*/ + /** + * 新增进出账管理带余额 + */ + @SaCheckPermission("oa:finance:add") + @Log(title = "进出账管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/addBalance") + public R addBalance(@Validated(AddGroup.class) @RequestBody SysOaFinanceBo bo) { + return toAjax(iSysOaFinanceService.insertByBoBalance(bo)); + } + + /** + * 修改进出账管理带余额 + */ + @SaCheckPermission("oa:finance:edit") + @Log(title = "进出账管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/editBalance") + public R editBalance(@Validated(EditGroup.class) @RequestBody SysOaFinanceBo bo) { + return toAjax(iSysOaFinanceService.updateByBoBalance(bo)); + } + + /** + * 删除进出账管理带余额 + * + * @param financeId 主键串 + */ + @SaCheckPermission("oa:finance:remove") + @Log(title = "进出账管理", businessType = BusinessType.DELETE) + @DeleteMapping("/removeDataBalance/{financeId}") + public Boolean removeDataBalance(@NotNull(message = "主键不能为空") @PathVariable Long financeId) { + return iSysOaFinanceService.deleteSysOaFinanceByIdBalance(financeId); + } } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFinanceService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFinanceService.java index d2d8812..250eb16 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFinanceService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaFinanceService.java @@ -74,11 +74,14 @@ public interface ISysOaFinanceService { * 新增进出账管理 */ Boolean insertByBo(SysOaFinanceBo bo); + Boolean insertByBoBalance(SysOaFinanceBo bo); + /** * 修改进出账管理 */ Boolean updateByBo(SysOaFinanceBo bo); + Boolean updateByBoBalance(SysOaFinanceBo bo); /** * 校验并批量删除进出账管理信息 @@ -91,6 +94,7 @@ public interface ISysOaFinanceService { * @return */ Boolean deleteSysOaFinanceById(Long financeId); + Boolean deleteSysOaFinanceByIdBalance(Long financeId); public List getByProgressId(Long progressId); diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFinanceServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFinanceServiceImpl.java index 98f29d2..ec1ab4c 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFinanceServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaFinanceServiceImpl.java @@ -13,10 +13,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.oa.config.ContextUtil; import com.ruoyi.oa.domain.SysOaDetail; +import com.ruoyi.oa.domain.SysOaReceiveAccount; import com.ruoyi.oa.domain.bo.SysOaDetailBo; import com.ruoyi.oa.domain.dto.BarDataDTO; import com.ruoyi.oa.domain.dto.FinanceDetailDTO; import com.ruoyi.oa.mapper.SysOaDetailMapper; +import com.ruoyi.oa.mapper.SysOaReceiveAccountMapper; import lombok.RequiredArgsConstructor; import org.apache.ibatis.javassist.runtime.Desc; import org.springframework.stereotype.Service; @@ -45,6 +47,7 @@ public class SysOaFinanceServiceImpl implements ISysOaFinanceService { private final SysOaDetailMapper sysOaDetailMapper; + private final SysOaReceiveAccountMapper receiveAccountMapper; /** @@ -215,6 +218,47 @@ public class SysOaFinanceServiceImpl implements ISysOaFinanceService { insertSysOaDetail(bo); return flag; } + /** + * 更新账户余额 + * @param accountId 账户ID + * @param amount 金额 + * @param isIncome 是否入账(true=入账,false=支出) + */ + private void updateAccountBalance(Long accountId, BigDecimal amount, boolean isIncome) { + if (accountId == null || amount == null) return; + SysOaReceiveAccount account = receiveAccountMapper.selectById(accountId); + if (account == null) return; + BigDecimal balance = account.getBalance() == null ? BigDecimal.ZERO : BigDecimal.valueOf(account.getBalance()); + if (isIncome) { + balance = balance.add(amount); + } else { + balance = balance.subtract(amount); + } + account.setBalance(balance.doubleValue()); + receiveAccountMapper.updateById(account); + } + private BigDecimal getDetailTotalAmount(List detailList) { + if (detailList == null || detailList.isEmpty()) return BigDecimal.ZERO; + return detailList.stream() + .map(SysOaDetail::getPrice) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + @Transactional + @Override + public Boolean insertByBoBalance(SysOaFinanceBo bo) { + SysOaFinance add = BeanUtil.toBean(bo, SysOaFinance.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setFinanceId(add.getFinanceId()); + insertSysOaDetail(bo); + // 余额处理 + BigDecimal total = getDetailTotalAmount(bo.getDetailList()); + updateAccountBalance(bo.getReceiveAccountId(), total, "1".equals(bo.getFinanceType())); + } + return flag; + } /** * 修改进出账管理 @@ -229,6 +273,31 @@ public class SysOaFinanceServiceImpl implements ISysOaFinanceService { insertSysOaDetail(bo); return baseMapper.updateById(update) > 0; } + @Transactional + @Override + public Boolean updateByBoBalance(SysOaFinanceBo bo) { + // 1. 查询旧数据 + SysOaFinanceVo old = baseMapper.selectVoById(bo.getFinanceId()); + if (old != null) { + List oldDetails = sysOaDetailMapper.selectList( + new LambdaQueryWrapper().eq(SysOaDetail::getFinanceId, bo.getFinanceId())); + BigDecimal oldTotal = getDetailTotalAmount(oldDetails); + // 先冲销旧余额 + updateAccountBalance(old.getReceiveAccountId(), oldTotal, !"1".equals(old.getFinanceType())); + } + SysOaFinance update = BeanUtil.toBean(bo, SysOaFinance.class); + validEntityBeforeSave(update); + //先删除原来数据 + sysOaDetailMapper.deleteSysOaDetailByfinanceId(bo.getFinanceId()); + //再插入修改后的数据 + insertSysOaDetail(bo); + boolean result = baseMapper.updateById(update) > 0; + if (result) { + BigDecimal newTotal = getDetailTotalAmount(bo.getDetailList()); + updateAccountBalance(bo.getReceiveAccountId(), newTotal, "1".equals(bo.getFinanceType())); + } + return result; + } /** @@ -270,6 +339,21 @@ public class SysOaFinanceServiceImpl implements ISysOaFinanceService { return baseMapper.deleteById(financeId) > 0; } + @Transactional + @Override + public Boolean deleteSysOaFinanceByIdBalance(Long financeId) { + SysOaFinanceVo old = baseMapper.selectVoById(financeId); + if (old != null) { + List oldDetails = sysOaDetailMapper.selectList( + new LambdaQueryWrapper().eq(SysOaDetail::getFinanceId, financeId)); + BigDecimal total = getDetailTotalAmount(oldDetails); + // 反向操作 + updateAccountBalance(old.getReceiveAccountId(), total, !"1".equals(old.getFinanceType())); + } + sysOaDetailMapper.deleteSysOaDetailByfinanceId(financeId); + return baseMapper.deleteById(financeId) > 0; + } + @Override public List getBarData(Long projectId, String financeType) { return baseMapper.getBarData(projectId, financeType);