liu
昨天 cff970c90a81c307ace673ff0bb4c31c7c0cdad9
feat(erp): 付款单付款账户改为手输文本(accountId→accountName)

无财务模块,付款账户不再从 erp_account 主数据选择,改为普通手输文本:
- SaveReqVO/RespVO/PageReqVO/DO:accountId(Long) → accountName(String)
- 移除 accountService 账户存在性校验与账户名称解析
- 分页查询按 account_name 模糊匹配
- 新增 SQL 迁移脚本(回填旧数据并删除 account_id 列)

Co-Authored-By: Claude <noreply@anthropic.com>
已添加1个文件
已修改7个文件
99 ■■■■■ 文件已修改
sql/erp_finance_payment_account_name_migration.sql 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpFinancePaymentController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentPageReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentRespVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentSaveReqVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinancePaymentDO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/erp_finance_payment_account_name_migration.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
-- =====================================================================
-- ä»˜æ¬¾å•付款账户改为手输:erp_finance_payment.account_id -> account_name
-- =====================================================================
-- èƒŒæ™¯ï¼š
--   1. å…¬å¸æ²¡æœ‰è´¢åŠ¡æ¨¡å—ï¼Œä»˜æ¬¾è´¦æˆ·ä¸å†ä»Ž erp_account ä¸»æ•°æ®é€‰æ‹©ï¼Œæ”¹ä¸ºæ™®é€šæ‰‹è¾“文本
--   2. å‰ç«¯å·²æ”¹ä¸º Input æ‰‹è¾“,提交字段为 accountName(String)
--   3. åŽç«¯å·²æ”¹ä¸ºå­˜å‚¨ accountName(对应列 account_name),不再使用 account_id
-- æ–¹æ¡ˆï¼š
--   1. è‹¥è¡¨ç¼ºå°‘ account_name åˆ—则补充(幂等,已存在则跳过)
--   2. å°†å·²æœ‰ account_id å…³è”的账户名称回填到 account_name(仅回填空值,不覆盖手输内容)
--   3. åˆ é™¤æ—§çš„ account_id åˆ—(幂等,已删除则跳过)
-- é€‚用数据库:MySQL 8.x
-- æ³¨æ„ï¼šSQL è„šæœ¬ä¸­ä¸åŒ…å« tenant_id(项目未使用多租户)
-- =====================================================================
-- 1. ç¡®ä¿ account_name åˆ—存在(已存在则跳过,兼容部分迁移过的库)
SET @col_exists = (SELECT COUNT(*) FROM information_schema.columns
                   WHERE table_schema = DATABASE() AND table_name = 'erp_finance_payment' AND column_name = 'account_name');
SET @sql = IF(@col_exists = 0,
              'ALTER TABLE erp_finance_payment ADD COLUMN account_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ''付款账户'' AFTER account_id',
              'SELECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 2. è¿ç§»å·²æœ‰æ•°æ®ï¼šä»…当 account_name ä¸ºç©ºæ—¶ï¼Œç”¨ account_id å…³è”的账户名称回填(不覆盖已手输的值)
UPDATE erp_finance_payment p
LEFT JOIN erp_account a ON p.account_id = a.id
SET p.account_name = a.name
WHERE (p.account_name IS NULL OR p.account_name = '')
  AND p.deleted = 0;
-- 3. åˆ é™¤æ—§çš„ account_id åˆ—(已删除则跳过)
SET @col_exists = (SELECT COUNT(*) FROM information_schema.columns
                   WHERE table_schema = DATABASE() AND table_name = 'erp_finance_payment' AND column_name = 'account_id');
SET @sql = IF(@col_exists = 1,
              'ALTER TABLE erp_finance_payment DROP COLUMN account_id',
              'SELECT 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/ErpFinancePaymentController.java
@@ -13,13 +13,11 @@
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService;
import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceService;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
@@ -55,8 +53,6 @@
    private ErpFinancePaymentService financePaymentService;
    @Resource
    private SrmSupplierApi srmSupplierApi;
    @Resource
    private ErpAccountService accountService;
    @Resource
    private ErpPurchaseInvoiceService invoiceService;
@@ -167,20 +163,16 @@
        Map<Long, SrmSupplierRespDTO> supplierMap = srmSupplierApi.getSupplierList(
                convertSet(pageResult.getList(), ErpFinancePaymentDO::getSupplierId)).getCheckedData().stream()
                .collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, v -> v, (a, b) -> a));
        // 1.3 ç»“算账户信息
        Map<Long, ErpAccountDO> accountMap = accountService.getAccountMap(
                convertSet(pageResult.getList(), ErpFinancePaymentDO::getAccountId));
        // 1.4 ç®¡ç†å‘˜ä¿¡æ¯
        // 1.3 ç®¡ç†å‘˜ä¿¡æ¯
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(),
                contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getFinanceUserId())));
        // 1.5 æ¥ç¥¨ä¿¡æ¯
        // 1.4 æ¥ç¥¨ä¿¡æ¯
        Map<Long, ErpPurchaseInvoiceDO> invoiceMap = invoiceService.getPurchaseInvoiceMap(
                convertSet(pageResult.getList(), ErpFinancePaymentDO::getInvoiceId));
        // 2. å¼€å§‹æ‹¼æŽ¥
        return BeanUtils.toBean(pageResult, ErpFinancePaymentRespVO.class, payment -> {
            payment.setItems(BeanUtils.toBean(financePaymentItemMap.get(payment.getId()), ErpFinancePaymentRespVO.Item.class));
            MapUtils.findAndThen(supplierMap, payment.getSupplierId(), supplier -> payment.setSupplierName(supplier.getName()));
            MapUtils.findAndThen(accountMap, payment.getAccountId(), account -> payment.setAccountName(account.getName()));
            MapUtils.findAndThen(userMap, Long.parseLong(payment.getCreator()), user -> payment.setCreatorName(user.getNickname()));
            MapUtils.findAndThen(userMap, payment.getFinanceUserId(), user -> payment.setFinanceUserName(user.getNickname()));
            MapUtils.findAndThen(invoiceMap, payment.getInvoiceId(), invoice ->
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentPageReqVO.java
@@ -33,8 +33,8 @@
    @Schema(description = "财务人员编号", example = "888")
    private String financeUserId;
    @Schema(description = "结算账户编号", example = "31189")
    private Long accountId;
    @Schema(description = "付款账户", example = "农行")
    private String accountName;
    @Schema(description = "付款状态", example = "2")
    private Integer status;
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentRespVO.java
@@ -47,9 +47,7 @@
    @Schema(description = "关联的来票信息")
    private ErpPurchaseInvoiceRespVO invoice;
    @Schema(description = "付款账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28989")
    private Long accountId;
    @Schema(description = "付款账户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
    @Schema(description = "付款账户", requiredMode = Schema.RequiredMode.REQUIRED, example = "农行对公账户")
    private String accountName;
    @Schema(description = "合计价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "13832")
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/finance/vo/payment/ErpFinancePaymentSaveReqVO.java
@@ -32,9 +32,9 @@
    @NotNull(message = "关联来票编号不能为空")
    private Long invoiceId;
    @Schema(description = "付款账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28989")
    @NotNull(message = "付款账户编号不能为空")
    private Long accountId;
    @Schema(description = "付款账户", requiredMode = Schema.RequiredMode.REQUIRED, example = "农行对公账户")
    @NotEmpty(message = "付款账户不能为空")
    private String accountName;
    @Schema(description = "优惠金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "11600")
    @NotNull(message = "优惠金额不能为空")
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/finance/ErpFinancePaymentDO.java
@@ -70,11 +70,9 @@
     */
    private Long invoiceId;
    /**
     * ä»˜æ¬¾è´¦æˆ·ç¼–号
     *
     * å…³è” {@link ErpAccountDO#getId()}
     * ä»˜æ¬¾è´¦æˆ·
     */
    private Long accountId;
    private String accountName;
    /**
     * åˆè®¡ä»·æ ¼ï¼Œå•位:元
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/finance/ErpFinancePaymentMapper.java
@@ -36,7 +36,7 @@
                .eqIfPresent(ErpFinancePaymentDO::getSupplierId, reqVO.getSupplierId())
                .eqIfPresent(ErpFinancePaymentDO::getCreator, reqVO.getCreator())
                .eqIfPresent(ErpFinancePaymentDO::getFinanceUserId, reqVO.getFinanceUserId())
                .eqIfPresent(ErpFinancePaymentDO::getAccountId, reqVO.getAccountId())
                .likeIfPresent(ErpFinancePaymentDO::getAccountName, reqVO.getAccountName())
                .eqIfPresent(ErpFinancePaymentDO::getStatus, reqVO.getStatus())
                .likeIfPresent(ErpFinancePaymentDO::getRemark, reqVO.getRemark())
                .orderByDesc(ErpFinancePaymentDO::getId);
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
@@ -65,8 +65,6 @@
    @Resource
    private ErpSupplierService supplierService;
    @Resource
    private ErpAccountService accountService;
    @Resource
    private ErpPurchaseInvoiceService invoiceService;
    @Resource
@@ -90,17 +88,13 @@
                createReqVO.getSupplierId(), createReqVO.getItems());
        // 1.2 æ ¡éªŒä¾›åº”商
        supplierService.validateSupplier(createReqVO.getSupplierId());
        // 1.3 æ ¡éªŒç»“算账户
        if (createReqVO.getAccountId() != null) {
            accountService.validateAccount(createReqVO.getAccountId());
        }
        // 1.4 æ ¡éªŒè´¢åŠ¡äººå‘˜
        // 1.3 æ ¡éªŒè´¢åŠ¡äººå‘˜
        if (createReqVO.getFinanceUserId() != null) {
            adminUserApi.validateUser(createReqVO.getFinanceUserId());
        }
        // 1.5 æ ¡éªŒå…³è”来票
        // 1.4 æ ¡éªŒå…³è”来票
        validateInvoiceForPayment(createReqVO.getInvoiceId(), createReqVO.getSupplierId());
        // 1.6 æ ¡éªŒä»˜æ¬¾é‡‘额不超过该来票剩余可付金额
        // 1.5 æ ¡éªŒä»˜æ¬¾é‡‘额不超过该来票剩余可付金额
        validatePaymentPriceExceedsInvoiceRemaining(createReqVO.getInvoiceId(),
                getSumValue(paymentItems, ErpFinancePaymentItemDO::getPaymentPrice, BigDecimal::add, BigDecimal.ZERO)
                        .subtract(createReqVO.getDiscountPrice()), null);
@@ -141,20 +135,16 @@
        }
        // 1.2 æ ¡éªŒä¾›åº”商
        supplierService.validateSupplier(updateReqVO.getSupplierId());
        // 1.3 æ ¡éªŒç»“算账户
        if (updateReqVO.getAccountId() != null) {
            accountService.validateAccount(updateReqVO.getAccountId());
        }
        // 1.4 æ ¡éªŒè´¢åŠ¡äººå‘˜
        // 1.3 æ ¡éªŒè´¢åŠ¡äººå‘˜
        if (updateReqVO.getFinanceUserId() != null) {
            adminUserApi.validateUser(updateReqVO.getFinanceUserId());
        }
        // 1.5 æ ¡éªŒä»˜æ¬¾å•项的有效性
        // 1.4 æ ¡éªŒä»˜æ¬¾å•项的有效性
        List<ErpFinancePaymentItemDO> paymentItems = validateFinancePaymentItems(
                updateReqVO.getSupplierId(), updateReqVO.getItems());
        // 1.6 æ ¡éªŒå…³è”来票
        // 1.5 æ ¡éªŒå…³è”来票
        validateInvoiceForPayment(updateReqVO.getInvoiceId(), updateReqVO.getSupplierId());
        // 1.7 æ ¡éªŒä»˜æ¬¾é‡‘额不超过该来票剩余可付金额(排除该付款单自身当前已付金额)
        // 1.6 æ ¡éªŒä»˜æ¬¾é‡‘额不超过该来票剩余可付金额(排除该付款单自身当前已付金额)
        validatePaymentPriceExceedsInvoiceRemaining(updateReqVO.getInvoiceId(),
                getSumValue(paymentItems, ErpFinancePaymentItemDO::getPaymentPrice, BigDecimal::add, BigDecimal.ZERO)
                        .subtract(updateReqVO.getDiscountPrice()), payment.getPaymentPrice());