feat(procurement): implement sample fulfillment and settled fee workflow

This commit is contained in:
2026-10-10 02:19:38 +08:00
parent 040f3bbd93
commit a973be2103
104 changed files with 9823 additions and 714 deletions
@@ -0,0 +1,48 @@
package com.baiyue.lastleg.financefee.service;
import com.baiyue.common.event.WalletSettlementReference;
import com.baiyue.lastleg.financefee.dto.OverseasFeeSourceDtos.SaveRequest;
import com.baiyue.lastleg.financefee.entity.OverseasFeeSource;
import com.baiyue.lastleg.financefee.mapper.OverseasFeeCommandMapper;
import com.baiyue.lastleg.financefee.mapper.OverseasFeeSourceMapper;
import com.baiyue.lastleg.financefee.state.OverseasFeeCancellation;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
class ProcurementSettledFeeSourceTest {
@Test
void publishesActualFeeUsingConfirmedFxAndConsumptionReference() {
var mapper = mock(OverseasFeeSourceMapper.class);
var outbox = mock(OverseasFeeOutboxService.class);
var converter = mock(OverseasFeeCurrencyConverter.class);
var service = new OverseasFeeSourceService(mapper, mock(OverseasFeeCommandMapper.class),
mock(OverseasFeeBusinessGuard.class), outbox, converter, new ObjectMapper().findAndRegisterModules(),
mock(OverseasFeeCancellation.class));
SaveRequest fee = new SaveRequest("9", "customer", "OVERSEAS_PROCUREMENT_FEE", "PROCUREMENT_FEE", 11L,
"PF-1", 12L, null, null, null, null, null, null, "SAMPLE_PAYMENT", "样品货款", "RECEIVABLE",
null, null, null, null, null, null, null, List.of(), LocalDate.of(2026, 10, 9), "USD",
new BigDecimal("10.00"), BigDecimal.ONE, "ITEM", new BigDecimal("10.00"), null, null);
assertThatThrownBy(() -> service.create("7", "manual-source", fee)).hasMessageContaining("采购费用必须通过");
assertThatThrownBy(() -> service.publishApproved("7", "manual-approved", fee)).hasMessageContaining("采购费用必须通过");
verifyNoInteractions(mapper,outbox,converter);
var conversion = new OverseasFeeCurrencyConverter.Conversion("USD", new BigDecimal("10.00"),
new BigDecimal("7.200000"), "2026-10", new BigDecimal("72.00"));
var reference = new WalletSettlementReference("command-1", "1", "2");
OverseasFeeSource result = service.publishSettled("7", "source-1", fee, conversion, reference);
assertThat(result.getAmount()).isEqualByComparingTo("72");
assertThat(result.getWalletSettlement()).isEqualTo(reference);
assertThat(result.getReviewStatus()).isEqualTo("APPROVED");
assertThat(result.getPublicationStatus()).isEqualTo("PUBLISHED");
verify(outbox).publish(result, "PUBLISHED");
verify(mapper).insert(result);
verifyNoInteractions(converter);
assertThatThrownBy(() -> service.publishSettled("7", "source-2", fee, conversion, null))
.hasMessageContaining("快照不完整");
}
}