From 72b771b409a08ec270bd5027afeaf785c2c46e63 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Sun, 20 Sep 2026 17:14:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(issuance):=20=E6=A0=A1=E9=AA=8C=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E9=87=91=E9=A2=9D=E4=B8=8D=E8=B6=85=E8=BF=87=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE=E8=A1=A5=E5=85=85=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...mercialBankIssuanceApplicationService.java | 15 +++++++++ ...ialBankIssuanceApplicationServiceTest.java | 31 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationService.java b/src/main/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationService.java index 850fa83..3c23b78 100644 --- a/src/main/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationService.java +++ b/src/main/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationService.java @@ -91,6 +91,7 @@ public class CommercialBankIssuanceApplicationService { @Transactional public IssuanceRequestView create(CreateIssuanceRequestCommand command, IssuanceAuditActor auditActor) { try { + requireAmountWithinSuggestedSupplement(command.getTotalAmount()); UUID id = UUID.randomUUID(); IssuanceRequest request = IssuanceRequest.create(new IssuanceApplicationId(id), requestNo(id), command.getBankCode(), command.getOrganizationId(), command.getTotalAmount(), command.getCurrency(), @@ -110,6 +111,7 @@ public class CommercialBankIssuanceApplicationService { public IssuanceRequestView update(UUID id, UpdateIssuanceRequestCommand command, IssuanceAuditActor auditActor) { try { IssuanceRequest request = requireOwnedRequestForUpdate(id, auditActor); + requireAmountWithinSuggestedSupplement(command.getTotalAmount()); request.updateDraft(command.getTotalAmount(), command.getCurrency(), command.getDenominations()); repository.save(request, auditActor(auditActor)); return IssuanceRequestView.from(request); @@ -237,6 +239,19 @@ public class CommercialBankIssuanceApplicationService { inventory.getWarningThreshold(), inventory.getSuggestedSupplementAmount()); } + private void requireAmountWithinSuggestedSupplement(BigDecimal requestedAmount) { + if (requestedAmount == null) { + throw new BusinessException(ErrorCode.VALIDATION_ERROR, "申请发行金额不能为空"); + } + IssuanceBankInventory inventory = repository.findBuiltInInventory().orElseThrow(() -> + new BusinessException(ErrorCode.RESOURCE_NOT_FOUND, "发行库存配置不存在")); + if (requestedAmount.compareTo(inventory.getSuggestedSupplementAmount()) > 0) { + throw new BusinessException(ErrorCode.VALIDATION_ERROR, + "申请发行金额不得超过建议补充金额 " + + inventory.getSuggestedSupplementAmount().setScale(2).toPlainString() + " 元"); + } + } + private IssuanceRequest requireRequest(UUID id) { if (id == null) { throw new BusinessException(ErrorCode.VALIDATION_ERROR, "发行申请标识不能为空"); diff --git a/src/test/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationServiceTest.java b/src/test/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationServiceTest.java index a57c90e..a3b5c6d 100644 --- a/src/test/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationServiceTest.java +++ b/src/test/java/com/yau/digitalrmb/issuance/application/service/CommercialBankIssuanceApplicationServiceTest.java @@ -135,9 +135,33 @@ class CommercialBankIssuanceApplicationServiceTest { .isEqualTo(ErrorCode.UNAUTHORIZED); } + @Test + void acceptsAmountBelowSuggestedSupplementWhenDenominationsMatch() { + IssuanceRequestView created = service.create(createCommand(new BigDecimal("40000.00"), 300), "tzs001"); + + assertThat(created.getTotalAmount()).isEqualByComparingTo("40000.00"); + } + + @Test + void rejectsAmountAboveSuggestedSupplement() { + assertThatThrownBy(() -> service.create( + createCommand(new BigDecimal("50100.00"), 401), "tzs001")) + .isInstanceOf(BusinessException.class) + .satisfies(exception -> { + BusinessException businessException = (BusinessException) exception; + assertThat(businessException.getErrorCode()).isEqualTo(ErrorCode.VALIDATION_ERROR); + assertThat(businessException.getMessage()) + .isEqualTo("申请发行金额不得超过建议补充金额 50000.00 元"); + }); + } + private CreateIssuanceRequestCommand createCommand() { - return new CreateIssuanceRequestCommand("BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", new BigDecimal("50000.00"), - "DC", Arrays.asList(new DenominationItem(100, 400), new DenominationItem(50, 100), + return createCommand(new BigDecimal("50000.00"), 400); + } + + private CreateIssuanceRequestCommand createCommand(BigDecimal totalAmount, int hundredQuantity) { + return new CreateIssuanceRequestCommand("BKCHCNBJ00001", "ORG_3A4B5C6D7E8F", totalAmount, + "DC", Arrays.asList(new DenominationItem(100, hundredQuantity), new DenominationItem(50, 100), new DenominationItem(20, 200), new DenominationItem(10, 50), new DenominationItem(5, 80), new DenominationItem(1, 100), new DenominationItem(new BigDecimal("0.5"), 0), new DenominationItem(new BigDecimal("0.2"), 0), new DenominationItem(new BigDecimal("0.1"), 0), @@ -159,7 +183,8 @@ class CommercialBankIssuanceApplicationServiceTest { @Override public Optional findBuiltInInventory() { - return Optional.empty(); + return Optional.of(new IssuanceBankInventory("BKCHCNBJ00001", new BigDecimal("49960000.00"), + new BigDecimal("50000000.00"), new BigDecimal("50000.00"))); } }