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>
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================================== |
| | | -- 仿¬¾å仿¬¾è´¦æ·æ¹ä¸ºæè¾ï¼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; |
| | |
| | | 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; |
| | |
| | | private ErpFinancePaymentService financePaymentService; |
| | | @Resource |
| | | private SrmSupplierApi srmSupplierApi; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | | private ErpPurchaseInvoiceService invoiceService; |
| | | |
| | |
| | | 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 -> |
| | |
| | | @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; |
| | |
| | | @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") |
| | |
| | | @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 = "伿 éé¢ä¸è½ä¸ºç©º") |
| | |
| | | */ |
| | | private Long invoiceId; |
| | | /** |
| | | * 仿¬¾è´¦æ·ç¼å· |
| | | * |
| | | * å
³è {@link ErpAccountDO#getId()} |
| | | * 仿¬¾è´¦æ· |
| | | */ |
| | | private Long accountId; |
| | | private String accountName; |
| | | |
| | | /** |
| | | * åè®¡ä»·æ ¼ï¼åä½ï¼å
|
| | |
| | | .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); |
| | |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | | private ErpPurchaseInvoiceService invoiceService; |
| | | |
| | | @Resource |
| | |
| | | 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); |
| | |
| | | } |
| | | // 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()); |