24282 há 11 meses atrás
pai
commit
8005c7c11b
17 ficheiros alterados com 1009 adições e 8 exclusões
  1. 76 0
      jy-business/src/main/java/com/jy/business/capital/controller/CapitalTransactionsController.java
  2. 19 2
      jy-business/src/main/java/com/jy/business/capital/dao/CapitalAccountDao.java
  3. 67 0
      jy-business/src/main/java/com/jy/business/capital/dao/CapitalTransactionsDao.java
  4. 16 0
      jy-business/src/main/java/com/jy/business/capital/mapper/CapitalTransactionsMapper.java
  5. 5 0
      jy-business/src/main/java/com/jy/business/capital/mapper/xml/CapitalTransactionsMapper.xml
  6. 17 0
      jy-business/src/main/java/com/jy/business/capital/model/dto/CapitalTransactionsDto.java
  7. 47 0
      jy-business/src/main/java/com/jy/business/capital/model/dto/CapitalTransactionsSelectDto.java
  8. 111 0
      jy-business/src/main/java/com/jy/business/capital/model/entity/CapitalTransactions.java
  9. 99 0
      jy-business/src/main/java/com/jy/business/capital/model/table/CapitalTransactionsTable.java
  10. 27 0
      jy-business/src/main/java/com/jy/business/capital/model/vo/CapitalTransactionsVo.java
  11. 45 0
      jy-business/src/main/java/com/jy/business/capital/service/CapitalTransactionsService.java
  12. 11 0
      jy-business/src/main/java/com/jy/business/capital/service/impl/CapitalAccountServiceImpl.java
  13. 98 0
      jy-business/src/main/java/com/jy/business/capital/service/impl/CapitalTransactionsServiceImpl.java
  14. 4 2
      jy-business/src/main/java/com/jy/business/corporation/service/impl/CorporationServiceImpl.java
  15. 27 0
      jy-ui/src/api/business/capital/transactions.ts
  16. 4 4
      jy-ui/src/views/business/capital/account/index.vue
  17. 336 0
      jy-ui/src/views/business/capital/transactions/index.vue

+ 76 - 0
jy-business/src/main/java/com/jy/business/capital/controller/CapitalTransactionsController.java

@@ -0,0 +1,76 @@
+package com.jy.business.capital.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jy.business.capital.model.dto.CapitalTransactionsDto;
+import com.jy.business.capital.model.dto.CapitalTransactionsSelectDto;
+import com.jy.business.capital.model.vo.CapitalTransactionsVo;
+import com.jy.business.capital.service.CapitalTransactionsService;
+import com.jy.framework.model.base.BaseSelectDto;
+import com.jy.framework.model.validation.AddGroup;
+import com.jy.framework.model.validation.BatchDeleteGroup;
+import com.jy.framework.model.validation.DetailGroup;
+import com.jy.framework.model.validation.EditGroup;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 资金流水 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-10-16
+ */
+@RestController
+@RequestMapping("/capitalTransactions")
+public class CapitalTransactionsController {
+
+    @Resource
+    private CapitalTransactionsService capitalTransactionsService;
+
+    /**
+     * 资金流水分页
+     */
+    @GetMapping("/getPage")
+    public Page<CapitalTransactionsVo> getPage(CapitalTransactionsSelectDto dto) {
+        return capitalTransactionsService.getPage(dto);
+    }
+
+    /**
+     * 资金流水明细
+     */
+    @GetMapping("/getDetail")
+    public CapitalTransactionsVo getDetail(@Validated(DetailGroup.class) BaseSelectDto dto) {
+        return capitalTransactionsService.getDetail(dto.getId());
+    }
+
+    /**
+     * 资金流水新增
+     */
+    @PostMapping("/add")
+    public void add(@Validated(AddGroup.class) @RequestBody CapitalTransactionsDto dto) {
+        capitalTransactionsService.add(dto);
+    }
+
+    /**
+     * 资金流水编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@Validated(EditGroup.class) @RequestBody CapitalTransactionsDto dto) {
+        capitalTransactionsService.edit(dto);
+    }
+
+    /**
+     * 资金流水删除
+     */
+    @PostMapping("/delete")
+    public void delete(@Validated(BatchDeleteGroup.class) @RequestBody BaseSelectDto dto) {
+        capitalTransactionsService.delete(dto.getIdList());
+    }
+
+}

+ 19 - 2
jy-business/src/main/java/com/jy/business/capital/dao/CapitalAccountDao.java

@@ -12,6 +12,7 @@ import com.jy.system.service.AuthService;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Service
@@ -69,8 +70,24 @@ public class CapitalAccountDao extends BaseDao<CapitalAccountMapper, CapitalAcco
     /**
      * 公司是否存在资金账户
      */
-    public boolean corporationExists(List<Long> idList) {
-        return lambdaQuery().in(CapitalAccount::getCorporationId, idList).exists();
+    public boolean corporationExists(Long id) {
+        return lambdaQuery().eq(CapitalAccount::getCorporationId, id).exists();
+    }
+
+    /**
+     * 资金账户余额变更
+     * @param capitalAccountId 资金账号id
+     * @param type 类型 1收入 0支出
+     * @param amount 变更金额
+     * @return true/false
+     */
+    public boolean updateAmount(Long capitalAccountId, Integer type, BigDecimal amount) {
+        return lambdaUpdate()
+                .eq(CapitalAccount::getId, capitalAccountId)
+                .ge(type == 0, CapitalAccount::getAmount, amount)
+                .setIncrBy(type == 1, CapitalAccount::getAmount, amount)
+                .setDecrBy(type == 0, CapitalAccount::getAmount, amount)
+                .update();
     }
 
 }

+ 67 - 0
jy-business/src/main/java/com/jy/business/capital/dao/CapitalTransactionsDao.java

@@ -0,0 +1,67 @@
+package com.jy.business.capital.dao;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jy.business.capital.mapper.CapitalTransactionsMapper;
+import com.jy.business.capital.model.dto.CapitalTransactionsSelectDto;
+import com.jy.business.capital.model.entity.CapitalTransactions;
+import com.jy.business.capital.model.table.CapitalAccountTable;
+import com.jy.business.capital.model.table.CapitalTransactionsTable;
+import com.jy.business.capital.model.vo.CapitalTransactionsVo;
+import com.jy.business.corporation.model.table.CorporationTable;
+import com.jy.framework.model.base.BaseDao;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CapitalTransactionsDao extends BaseDao<CapitalTransactionsMapper, CapitalTransactions> {
+
+    /**
+     * 资金流水分页
+     */
+    public Page<CapitalTransactionsVo> getPage(CapitalTransactionsSelectDto dto) {
+        CapitalTransactionsTable ct = CapitalTransactionsTable.ct;
+        CapitalAccountTable ca = CapitalAccountTable.ca;
+        CorporationTable c = CorporationTable.c;
+
+        return sql(CapitalTransactionsVo.class)
+                .select(
+                        ct.all,
+                        ca.accountAlias.as(CapitalTransactionsVo::getAccountAlias),
+                        c.name.as(CapitalTransactionsVo::getCorporationName)
+                )
+                .from(ct)
+                .leftJoin(ca).on(ct.capitalAccountId.eq(ca.id))
+                .leftJoin(c).on(ca.corporationId.eq(c.id))
+                .where(
+                        ca.corporationId.eq(dto.getCorporationId()),
+                        ct.capitalAccountId.eq(dto.getCapitalAccountId()),
+                        ct.tradingTime.between(dto.getTradingTime()),
+                        ct.type.eq(dto.getType()),
+                        ct.targetType.eq(dto.getTargetType())
+                )
+                .orderBy(
+                        ct.id.desc()
+                )
+                .page(dto.getPage());
+    }
+
+    /**
+     * 资金流水明细
+     */
+    public CapitalTransactionsVo getDetail(Long id) {
+        CapitalTransactionsTable ct = CapitalTransactionsTable.ct;
+
+        return sql(CapitalTransactionsVo.class)
+                .select(
+                        ct.all
+                )
+                .from(ct)
+                .where(
+                        ct.id.eq(id)
+                )
+                .one();
+    }
+
+    public boolean capitalAccountExists(Long id) {
+        return lambdaQuery().eq(CapitalTransactions::getCapitalAccountId, id).exists();
+    }
+}

+ 16 - 0
jy-business/src/main/java/com/jy/business/capital/mapper/CapitalTransactionsMapper.java

@@ -0,0 +1,16 @@
+package com.jy.business.capital.mapper;
+
+import com.jy.business.capital.model.entity.CapitalTransactions;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 资金流水 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-16
+ */
+public interface CapitalTransactionsMapper extends BaseMapper<CapitalTransactions> {
+
+}

+ 5 - 0
jy-business/src/main/java/com/jy/business/capital/mapper/xml/CapitalTransactionsMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jy.business.capital.mapper.CapitalTransactionsMapper">
+
+</mapper>

+ 17 - 0
jy-business/src/main/java/com/jy/business/capital/model/dto/CapitalTransactionsDto.java

@@ -0,0 +1,17 @@
+package com.jy.business.capital.model.dto;
+
+import com.jy.business.capital.model.entity.CapitalTransactions;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 资金流水新增编辑入参实体
+ *
+ * @author 
+ * @since 2024-10-16
+ */
+@Getter
+@Setter
+public class CapitalTransactionsDto extends CapitalTransactions {
+
+}

+ 47 - 0
jy-business/src/main/java/com/jy/business/capital/model/dto/CapitalTransactionsSelectDto.java

@@ -0,0 +1,47 @@
+package com.jy.business.capital.model.dto;
+
+import cn.hutool.core.date.DatePattern;
+import com.jy.framework.model.base.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 资金流水列表查询入参实体
+ *
+ * @author
+ * @since 2024-10-16
+ */
+@Getter
+@Setter
+public class CapitalTransactionsSelectDto extends BaseSelectDto {
+
+    /**
+     * 公司id
+     */
+    private Long corporationId;
+
+    /**
+     * 资金账号id
+     */
+    private Long capitalAccountId;
+
+    /**
+     * 交易时间
+     */
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    private Date[] tradingTime;
+
+    /**
+     * 交易类型 1收入 0支出
+     */
+    private Integer type;
+
+    /**
+     * 对方类型
+     */
+    private Integer targetType;
+
+}

+ 111 - 0
jy-business/src/main/java/com/jy/business/capital/model/entity/CapitalTransactions.java

@@ -0,0 +1,111 @@
+package com.jy.business.capital.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jy.framework.model.base.BaseIdPo;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.jy.framework.model.validation.AddGroup;
+import com.jy.framework.model.validation.EditGroup;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 资金流水
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-16
+ */
+@Getter
+@Setter
+@TableName("capital_transactions")
+public class CapitalTransactions extends BaseIdPo {
+
+    /**
+     * 资金账号id
+     */
+    @NotNull(groups = {AddGroup.class, EditGroup.class})
+    private Long capitalAccountId;
+
+    /**
+     * 交易时间
+     */
+    @NotNull(groups = {AddGroup.class, EditGroup.class})
+    private Date tradingTime;
+
+    /**
+     * 交易类型 1收入 0支出
+     */
+    @NotNull(groups = {AddGroup.class, EditGroup.class})
+    private Integer type;
+
+    /**
+     * 交易金额
+     */
+    @NotNull(groups = {AddGroup.class, EditGroup.class})
+    private BigDecimal amount;
+
+    /**
+     * 对方类型
+     */
+    @NotNull(groups = {AddGroup.class, EditGroup.class})
+    private Integer targetType;
+
+    /**
+     * 对方账户名
+     */
+    private String targetAccountName;
+
+    /**
+     * 对方开户银行
+     */
+    private String targetDepositBank;
+
+    /**
+     * 对方账号
+     */
+    private String targetAccount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建人
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    /**
+     * 逻辑删除标记
+     */
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Long delFlag;
+
+}

+ 99 - 0
jy-business/src/main/java/com/jy/business/capital/model/table/CapitalTransactionsTable.java

@@ -0,0 +1,99 @@
+package com.jy.business.capital.model.table;
+
+import com.jy.business.capital.model.entity.CapitalTransactions;
+import com.jy.framework.mybatis.join.QueryColumn;
+import com.jy.framework.mybatis.join.Table;
+
+public class CapitalTransactionsTable extends Table<CapitalTransactions> {
+
+    public static CapitalTransactionsTable capital_transactions = new CapitalTransactionsTable();
+    public static CapitalTransactionsTable ct = capital_transactions.as("ct");
+
+    /**
+     * 资金流水id
+     */
+    public QueryColumn id = this.field(CapitalTransactions::getId);
+
+    /**
+     * 资金账号id
+     */
+    public QueryColumn capitalAccountId = this.field(CapitalTransactions::getCapitalAccountId);
+
+    /**
+     * 交易时间
+     */
+    public QueryColumn tradingTime = this.field(CapitalTransactions::getTradingTime);
+
+    /**
+     * 交易类型 1收入 0支出
+     */
+    public QueryColumn type = this.field(CapitalTransactions::getType);
+
+    /**
+     * 交易金额
+     */
+    public QueryColumn amount = this.field(CapitalTransactions::getAmount);
+
+    /**
+     * 对方类型
+     */
+    public QueryColumn targetType = this.field(CapitalTransactions::getTargetType);
+
+    /**
+     * 对方账户名
+     */
+    public QueryColumn targetAccountName = this.field(CapitalTransactions::getTargetAccountName);
+
+    /**
+     * 对方开户银行
+     */
+    public QueryColumn targetDepositBank = this.field(CapitalTransactions::getTargetDepositBank);
+
+    /**
+     * 对方账号
+     */
+    public QueryColumn targetAccount = this.field(CapitalTransactions::getTargetAccount);
+
+    /**
+     * 备注
+     */
+    public QueryColumn remark = this.field(CapitalTransactions::getRemark);
+
+    /**
+     * 创建人
+     */
+    public QueryColumn createUser = this.field(CapitalTransactions::getCreateUser);
+
+    /**
+     * 创建时间
+     */
+    public QueryColumn createTime = this.field(CapitalTransactions::getCreateTime);
+
+    /**
+     * 更新人
+     */
+    public QueryColumn updateUser = this.field(CapitalTransactions::getUpdateUser);
+
+    /**
+     * 更新时间
+     */
+    public QueryColumn updateTime = this.field(CapitalTransactions::getUpdateTime);
+
+    /**
+     * 逻辑删除标记
+     */
+    public QueryColumn delFlag = this.field(CapitalTransactions::getDelFlag);
+
+    private CapitalTransactionsTable() {
+        super(CapitalTransactions.class);
+    }
+
+    private CapitalTransactionsTable(String alias) {
+        super(CapitalTransactions.class, alias);
+    }
+
+    public CapitalTransactionsTable as(String alias) {
+        return new CapitalTransactionsTable(alias);
+    }
+
+}

+ 27 - 0
jy-business/src/main/java/com/jy/business/capital/model/vo/CapitalTransactionsVo.java

@@ -0,0 +1,27 @@
+package com.jy.business.capital.model.vo;
+
+import com.jy.business.capital.model.entity.CapitalTransactions;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 资金流水列表查询返回值实体
+ *
+ * @author 
+ * @since 2024-10-16
+ */
+@Getter
+@Setter
+public class CapitalTransactionsVo extends CapitalTransactions {
+
+    /**
+     * 账户别名
+     */
+    private String accountAlias;
+
+    /**
+     * 公司名称
+     */
+    private String corporationName;
+
+}

+ 45 - 0
jy-business/src/main/java/com/jy/business/capital/service/CapitalTransactionsService.java

@@ -0,0 +1,45 @@
+package com.jy.business.capital.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jy.business.capital.model.dto.CapitalTransactionsDto;
+import com.jy.business.capital.model.dto.CapitalTransactionsSelectDto;
+import com.jy.business.capital.model.vo.CapitalTransactionsVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 资金流水 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-16
+ */
+public interface CapitalTransactionsService {
+
+    /**
+     * 资金流水分页
+     */
+    Page<CapitalTransactionsVo> getPage(CapitalTransactionsSelectDto dto);
+
+    /**
+     * 资金流水明细
+     */
+    CapitalTransactionsVo getDetail(Long id);
+
+    /**
+     * 资金流水新增
+     */
+    void add(CapitalTransactionsDto dto);
+
+    /**
+     * 资金流水编辑
+     */
+    void edit(CapitalTransactionsDto dto);
+
+    /**
+     * 资金流水删除
+     */
+    void delete(List<Long> idList);
+
+}

+ 11 - 0
jy-business/src/main/java/com/jy/business/capital/service/impl/CapitalAccountServiceImpl.java

@@ -2,6 +2,7 @@ package com.jy.business.capital.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jy.business.capital.dao.CapitalAccountDao;
+import com.jy.business.capital.dao.CapitalTransactionsDao;
 import com.jy.business.capital.model.dto.CapitalAccountDto;
 import com.jy.business.capital.model.dto.CapitalAccountSelectDto;
 import com.jy.business.capital.model.vo.CapitalAccountVo;
@@ -28,6 +29,9 @@ public class CapitalAccountServiceImpl implements CapitalAccountService {
     @Resource
     private CapitalAccountDao capitalAccountDao;
 
+    @Resource
+    private CapitalTransactionsDao capitalTransactionsDao;
+
     @Override
     public Page<CapitalAccountVo> getPage(CapitalAccountSelectDto dto) {
         return capitalAccountDao.getPage(dto);
@@ -55,6 +59,13 @@ public class CapitalAccountServiceImpl implements CapitalAccountService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(List<Long> idList) {
+        // 校验资金账户是否存在资金流水
+        capitalAccountDao.listByIds(idList).forEach((item) -> {
+            boolean capitalAccountExists = capitalTransactionsDao.capitalAccountExists(item.getId());
+            AssertUtil.eqFalse(capitalAccountExists, "资金账户【{}】存在资金流水,无法删除", item.getAccountAlias());
+        });
+
+        // 删除资金账户
         capitalAccountDao.removeBatchByIds(idList);
     }
 

+ 98 - 0
jy-business/src/main/java/com/jy/business/capital/service/impl/CapitalTransactionsServiceImpl.java

@@ -0,0 +1,98 @@
+package com.jy.business.capital.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jy.business.capital.dao.CapitalAccountDao;
+import com.jy.business.capital.dao.CapitalTransactionsDao;
+import com.jy.business.capital.model.dto.CapitalTransactionsDto;
+import com.jy.business.capital.model.dto.CapitalTransactionsSelectDto;
+import com.jy.business.capital.model.entity.CapitalTransactions;
+import com.jy.business.capital.model.vo.CapitalTransactionsVo;
+import com.jy.business.capital.service.CapitalTransactionsService;
+import com.jy.framework.utils.AssertUtil;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * <p>
+ * 资金流水 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-10-16
+ */
+@Service
+public class CapitalTransactionsServiceImpl implements CapitalTransactionsService {
+
+    @Resource
+    private CapitalTransactionsDao capitalTransactionsDao;
+
+    @Resource
+    private CapitalAccountDao capitalAccountDao;
+
+    @Override
+    public Page<CapitalTransactionsVo> getPage(CapitalTransactionsSelectDto dto) {
+        return capitalTransactionsDao.getPage(dto);
+    }
+
+    @Override
+    public CapitalTransactionsVo getDetail(Long id) {
+        CapitalTransactionsVo vo = capitalTransactionsDao.getDetail(id);
+        AssertUtil.notNull(vo, "未知数据");
+        return vo;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(CapitalTransactionsDto dto) {
+        boolean updateAmount = capitalAccountDao.updateAmount(dto.getCapitalAccountId(), dto.getType(), dto.getAmount());
+        AssertUtil.eqTrue(updateAmount, "账户余额不足");
+
+        capitalTransactionsDao.save(dto);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(CapitalTransactionsDto dto) {
+        CapitalTransactions oldCapitalTransactions = capitalTransactionsDao.getById(dto.getId());
+        AssertUtil.notNull(oldCapitalTransactions, "未知资金流水");
+
+        BigDecimal amount;
+        Integer type = dto.getType();
+        if (ObjectUtil.equal(type, oldCapitalTransactions.getType())) {
+            amount = dto.getAmount().subtract(oldCapitalTransactions.getAmount());
+        } else {
+            amount = dto.getAmount().add(oldCapitalTransactions.getAmount());
+        }
+
+        if (type == 1 && amount.compareTo(BigDecimal.ZERO) < 0) {
+            amount = amount.abs();
+            type = 0;
+        }
+
+        boolean updateAmount = capitalAccountDao.updateAmount(dto.getCapitalAccountId(), type, amount);
+        AssertUtil.eqTrue(updateAmount, "账户余额不足");
+
+        capitalTransactionsDao.updateById(dto);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<Long> idList) {
+        capitalTransactionsDao.listByIds(idList).forEach(capitalTransactions -> {
+            boolean updateAmount = capitalAccountDao.updateAmount(
+                    capitalTransactions.getCapitalAccountId(),
+                    capitalTransactions.getType() == 0 ? 1 : 0,
+                    capitalTransactions.getAmount());
+
+            AssertUtil.eqTrue(updateAmount, "账户余额不足");
+        });
+
+        capitalTransactionsDao.removeBatchByIds(idList);
+    }
+
+}

+ 4 - 2
jy-business/src/main/java/com/jy/business/corporation/service/impl/CorporationServiceImpl.java

@@ -57,8 +57,10 @@ public class CorporationServiceImpl implements CorporationService {
     @Override
     public void delete(List<Long> idList) {
         // 公司是否存在资金账户
-        boolean corporationExists = capitalAccountDao.corporationExists(idList);
-        AssertUtil.eqFalse(corporationExists, "存在资金账户,无法删除");
+        corporationDao.listByIds(idList).forEach(item -> {
+            boolean corporationExists = capitalAccountDao.corporationExists(item.getId());
+            AssertUtil.eqFalse(corporationExists, "【{}】存在资金账户,无法删除", item.getName());
+        });
 
         // 删除公司
         corporationDao.removeBatchByIds(idList);

+ 27 - 0
jy-ui/src/api/business/capital/transactions.ts

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+import { PageType, StrAnyObj } from '@/typings'
+
+// 资金流水分页
+export function getPageApi(params: StrAnyObj): Promise<PageType<StrAnyObj>> {
+  return request.get('/capitalTransactions/getPage', params)
+}
+
+// 资金流水明细
+export function getDetailApi(params: StrAnyObj): Promise<StrAnyObj> {
+  return request.get('/capitalTransactions/getDetail', params)
+}
+
+// 资金流水新增
+export function addApi(data: StrAnyObj): Promise<void> {
+  return request.post('/capitalTransactions/add', data)
+}
+
+// 资金流水编辑
+export function editApi(data: StrAnyObj): Promise<void> {
+  return request.post('/capitalTransactions/edit', data)
+}
+
+// 资金流水删除
+export function deleteApi(data: StrAnyObj): Promise<void> {
+  return request.post('/capitalTransactions/delete', data)
+}

+ 4 - 4
jy-ui/src/views/business/capital/account/index.vue

@@ -27,12 +27,12 @@ const queryConfig: FormConfigType[] = [
     type: 'select',
     prop: 'corporationId',
     label: '归属公司',
+    keyName: 'id',
+    labelName: 'name',
     async option() {
       const data = await getCorporationPageApi({searchAll: true})
       return data.records
-    },
-    keyName: 'id',
-    labelName: 'name'
+    }
   },
   {
     type: 'input',
@@ -157,7 +157,7 @@ const formConfig: FormConfigType[] = [
     },
     keyName: 'id',
     labelName: 'name',
-    rule: [{ required: true, message: '公司id不能为空', trigger: 'blur' }]
+    rule: [{ required: true, message: '归属公司不能为空', trigger: 'blur' }]
   },
   {
     type: 'input',

+ 336 - 0
jy-ui/src/views/business/capital/transactions/index.vue

@@ -0,0 +1,336 @@
+<script setup lang="ts">
+import AForm from '@/components/AForm/index.vue'
+import { FormConfigType } from '@/components/AForm/type'
+import { ToolbarConfigType } from '@/components/AToolbar/type'
+import { ColumnConfigType } from '@/components/ATable/type'
+import { StrAnyObj, StrAnyObjArr } from '@/typings'
+import { useHandleData } from '@/utils/useHandleData'
+import { getPageApi, getDetailApi, addApi, editApi, deleteApi } from '@/api/business/capital/transactions'
+import { getPageApi as getCapitalAccountPageApi } from '@/api/business/capital/account'
+import { getPageApi as getCorporationPageApi } from '@/api/business/corporation/corporation'
+
+const queryRef = ref<InstanceType<typeof AForm>>()
+const formRef = ref<InstanceType<typeof AForm>>()
+
+const showQuery = ref<boolean>(true)
+const selectKeys = ref<string[]>([])
+const pageTotal = ref<number>(0)
+
+const queryData = ref<StrAnyObj>({ pageNum: 1, pageSize: 10 })
+const tableData = ref<StrAnyObjArr>([])
+const formData = ref<StrAnyObj>({ type: 1 })
+
+const dialogTitle = ref<string>('')
+const dialogVisible = ref<boolean>(false)
+
+const queryConfig: FormConfigType[] = [
+  {
+    type: 'select',
+    prop: 'corporationId',
+    label: '归属公司',
+    keyName: 'id',
+    labelName: 'name',
+    async option() {
+      const data = await getCorporationPageApi({searchAll: true})
+      return data.records
+    }
+  },
+  {
+    type: 'select',
+    prop: 'capitalAccountId',
+    label: '资金账号',
+    keyName: 'id',
+    labelName: 'accountAlias',
+    async option() {
+      const data = await getCapitalAccountPageApi({ searchAll: true })
+      return data.records
+    }
+  },
+  {
+    type: 'datePicker',
+    prop: 'tradingTime',
+    label: '交易时间',
+    datePickerType: 'daterange',
+    defaultTime: [new Date(0, 0, 0, 0, 0, 0), new Date(0, 0, 0, 23, 59, 59)]
+  },
+  {
+    type: 'select',
+    prop: 'type',
+    label: '交易类型',
+    option: [
+      {
+        key: 1,
+        label: '收入'
+      },
+      {
+        key: 0,
+        label: '支出'
+      },
+    ],
+  },
+  {
+    type: 'select',
+    prop: 'targetType',
+    label: '对方类型',
+    dict: 'target_type'
+  }
+]
+
+const toolbarConfig: ToolbarConfigType[] = [
+  {
+    common: 'search',
+    click() {
+      queryData.value.pageNum = 1
+      getPage()
+    }
+  },
+  {
+    common: 'reset',
+    click() {
+      queryRef.value?.resetFields()
+      getPage()
+    }
+  },
+  {
+    common: 'add',
+    click() {
+      dialogVisible.value = true
+      dialogTitle.value = '新增'
+    }
+  },
+  {
+    common: 'delete',
+    disabled() {
+      return selectKeys.value.length == 0
+    },
+    click() {
+      handleRemove(selectKeys.value)
+    }
+  }
+]
+
+const columnConfig: ColumnConfigType[] = [
+  {
+    prop: 'corporationName',
+    label: '归属公司'
+  },
+  {
+    prop: 'accountAlias',
+    label: '资金账号'
+  },
+  {
+    prop: 'tradingTime',
+    label: '交易时间'
+  },
+  {
+    prop: 'targetType',
+    label: '交易类型',
+    formatter(row) {
+      return row.type == 1 ? '收入' : '支出'
+    }
+  },
+  {
+    prop: 'amount',
+    label: '交易金额'
+  },
+  {
+    prop: 'targetType',
+    label: '对方类型',
+    dict: 'target_type'
+  },
+  {
+    prop: 'targetAccountName',
+    label: '对方账户名'
+  },
+  {
+    prop: 'targetDepositBank',
+    label: '对方开户银行'
+  },
+  {
+    prop: 'targetAccount',
+    label: '对方账号'
+  },
+  {
+    prop: 'remark',
+    label: '摘要',
+    showOverflowTooltip: true
+  },
+  {
+    width: 250,
+    handleConfig: [
+      {
+        common: 'update',
+        click(row) {
+          dialogVisible.value = true
+          dialogTitle.value = '编辑'
+          getDetailApi({ id: row.id }).then((resp: StrAnyObj) => {
+            formData.value = resp
+          })
+        }
+      },
+      {
+        common: 'delete',
+        click(row) {
+          handleRemove([row.id])
+        }
+      }
+    ]
+  }
+]
+
+const formConfig: FormConfigType[] = [
+  {
+    type: 'select',
+    prop: 'capitalAccountId',
+    label: '资金账号',
+    keyName: 'id',
+    labelName: 'accountAlias',
+    async option() {
+      const data = await getCapitalAccountPageApi({ searchAll: true })
+      return data.records
+    },
+    rule: [{ required: true, message: '资金账号不能为空', trigger: 'blur' }]
+  },
+  {
+    type: 'datePicker',
+    prop: 'tradingTime',
+    label: '交易时间',
+    datePickerType: 'datetime',
+    format: "YYYY-MM-DD hh:mm:ss",
+    valueFormat: "YYYY-MM-DD hh:mm:ss",
+    defaultTime: new Date(),
+    rule: [{ required: true, message: '交易时间不能为空', trigger: 'blur' }]
+  },
+  {
+    type: 'radio',
+    prop: 'type',
+    label: '交易类型',
+    option: [
+      {
+        key: 1,
+        label: '收入'
+      },
+      {
+        key: 0,
+        label: '支出'
+      },
+    ],
+    rule: [{ required: true, message: '交易类型不能为空', trigger: 'blur' }]
+  },
+  {
+    type: 'inputNumber',
+    prop: 'amount',
+    label: '交易金额',
+    min: 0.01,
+    precision: 2,
+    rule: [{ required: true, message: '交易金额不能为空', trigger: 'blur' }]
+  },
+  {
+    type: 'select',
+    prop: 'targetType',
+    label: '对方类型',
+    dict: 'target_type',
+    rule: [{ required: true, message: '对方类型不能为空', trigger: 'blur' }]
+  },
+  {
+    type: 'input',
+    prop: 'targetAccountName',
+    label: '对方账户名',
+  },
+  {
+    type: 'input',
+    prop: 'targetDepositBank',
+    label: '对方开户银行',
+  },
+  {
+    type: 'input',
+    prop: 'targetAccount',
+    label: '对方账号',
+  },
+  {
+    type: 'input',
+    prop: 'remark',
+    itemType: 'textarea',
+    rows: 5,
+    label: '摘要',
+  },
+]
+
+onMounted(() => {
+  getPage()
+})
+
+function getPage() {
+  getPageApi(queryData.value).then((resp) => {
+    tableData.value = resp.records
+    pageTotal.value = resp.total
+  })
+}
+
+function tableSelectionChange(item: StrAnyObjArr) {
+  selectKeys.value = item.map((item) => item.id)
+}
+
+function formSubmit() {
+  formRef.value?.validate(() => {
+    if (formData.value.id) {
+      editApi(formData.value).then(() => {
+        dialogVisible.value = false
+        ElMessage.success('修改成功')
+        getPage()
+      })
+    } else {
+      addApi(formData.value).then(() => {
+        dialogVisible.value = false
+        ElMessage.success('新增成功')
+        getPage()
+      })
+    }
+  })
+}
+
+function formClosed() {
+  formRef.value?.resetFields()
+}
+
+function handleRemove(idList: string[]) {
+  useHandleData('是否确认删除?', () => {
+    deleteApi({ idList }).then(() => {
+      ElMessage.success('删除成功')
+      getPage()
+    })
+  })
+}
+</script>
+
+<template>
+  <div>
+    <el-card v-if="showQuery">
+      <a-form ref="queryRef" v-model="queryData" :config="queryConfig" :span="6"> </a-form>
+    </el-card>
+
+    <a-table
+      selection
+      :data="tableData"
+      :page-total="pageTotal"
+      :toolbar-config="toolbarConfig"
+      :column-config="columnConfig"
+      v-model:showQuery="showQuery"
+      v-model:page-num="queryData.pageNum"
+      v-model:page-size="queryData.pageSize"
+      @page-num-change="getPage"
+      @page-size-change="getPage"
+      @selection-change="tableSelectionChange"
+    >
+    </a-table>
+
+    <a-dialog
+      v-model="dialogVisible"
+      :title="dialogTitle"
+      @submit="formSubmit"
+      @closed="formClosed"
+    >
+      <a-form ref="formRef" v-model="formData" :config="formConfig" :span="24"> </a-form>
+    </a-dialog>
+  </div>
+</template>