优化
This commit is contained in:
@@ -7,6 +7,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.RecordComponent;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -39,6 +40,17 @@ class FeeManagementContractTest {
|
||||
assertPermission("delete", "firstleg:fee-item:delete");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("柜次费用新增和调整请求均携带往来单位快照")
|
||||
void containerFeeRequestsCarryCounterpartySnapshot() {
|
||||
for (Class<?> requestType : List.of(
|
||||
com.baiyue.firstleg.dto.ContainerFeeDetailDtos.SaveRequest.class,
|
||||
com.baiyue.firstleg.dto.ContainerFeeDetailDtos.AdjustRequest.class)) {
|
||||
assertThat(Arrays.stream(requestType.getRecordComponents()).map(RecordComponent::getName))
|
||||
.contains("partnerId", "partnerName");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("平台费用项目接口不接受客户作用域")
|
||||
void platformFeeItemEndpointsDoNotExposeAccountId() {
|
||||
|
||||
+2
-1
@@ -16,7 +16,8 @@ class FinanceFeeSourceMigrationContractTest {
|
||||
assertThat(sql).contains("information_schema.columns", "event_key", "payload_hash",
|
||||
"uk_inbound_outbox_event_key", "next_retry_at", "locked_at", "locked_by",
|
||||
"idx_inbound_outbox_finance_relay", "CREATE TABLE IF NOT EXISTS fl_container_fee_detail",
|
||||
"settlement_included", "source_version", "RECEIVABLE", "PAYABLE",
|
||||
"settlement_included", "source_version", "partner_id", "partner_name",
|
||||
"firstleg_finance_add_column('fl_container_fee_detail', 'partner_id'", "RECEIVABLE", "PAYABLE",
|
||||
"chk_container_fee_currency", "currency = 'CNY'", "firstleg_finance_assert_schema");
|
||||
}
|
||||
}
|
||||
|
||||
+34
-1
@@ -85,6 +85,38 @@ class ContainerFeeDetailServiceTest {
|
||||
verify(repository).adjust(captor.capture(), eq(1));
|
||||
assertThat(captor.getValue().getSourceVersion()).isEqualTo(2);
|
||||
assertThat(captor.getValue().getReviewStatus()).isEqualTo("PENDING");
|
||||
assertThat(captor.getValue().getPartnerId()).isEqualTo(71L);
|
||||
assertThat(captor.getValue().getPartnerName()).isEqualTo("现有往来单位");
|
||||
}
|
||||
|
||||
@Test
|
||||
void payableRequiresCounterpartySnapshot() {
|
||||
ownedPlan();
|
||||
when(feeItems.findItem(11L)).thenReturn(item());
|
||||
|
||||
var missingPartner = new ContainerFeeDetailDtos.SaveRequest(11L, "PAYABLE",
|
||||
LocalDate.of(2026, 8, 11), new BigDecimal("300.00"), "CNY",
|
||||
true, null, null, "整柜拖车费");
|
||||
|
||||
assertThatThrownBy(() -> service.create(10001L, 41L, 9L, missingPartner))
|
||||
.isInstanceOf(BizException.class).hasMessageContaining("必须选择有效往来单位");
|
||||
verify(repository, never()).insert(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
void receivableClearsCounterpartyFields() {
|
||||
ownedPlan();
|
||||
when(feeItems.findItem(11L)).thenReturn(item());
|
||||
|
||||
var request = new ContainerFeeDetailDtos.SaveRequest(11L, "RECEIVABLE",
|
||||
LocalDate.of(2026, 8, 11), new BigDecimal("300.00"), "CNY",
|
||||
true, 71L, "不应保留", "整柜操作费");
|
||||
service.create(10001L, 41L, 9L, request);
|
||||
|
||||
ArgumentCaptor<ContainerFeeDetailEntity> captor = ArgumentCaptor.forClass(ContainerFeeDetailEntity.class);
|
||||
verify(repository).insert(captor.capture());
|
||||
assertThat(captor.getValue().getPartnerId()).isNull();
|
||||
assertThat(captor.getValue().getPartnerName()).isNull();
|
||||
}
|
||||
|
||||
private void ownedPlan() {
|
||||
@@ -101,6 +133,7 @@ class ContainerFeeDetailServiceTest {
|
||||
value.setId(11L);
|
||||
value.setFeeCode("TRUCKING");
|
||||
value.setFeeTypeName("拖车费");
|
||||
value.setWarehouseReceivable(true);
|
||||
value.setWarehousePayable(true);
|
||||
value.setStatus("ACTIVE");
|
||||
return value;
|
||||
@@ -109,6 +142,6 @@ class ContainerFeeDetailServiceTest {
|
||||
private static ContainerFeeDetailDtos.SaveRequest request(boolean settlementIncluded) {
|
||||
return new ContainerFeeDetailDtos.SaveRequest(11L, "PAYABLE",
|
||||
LocalDate.of(2026, 8, 11), new BigDecimal("300.00"), "CNY",
|
||||
settlementIncluded, "整柜拖车费");
|
||||
settlementIncluded, 71L, " 现有往来单位 ", "整柜拖车费");
|
||||
}
|
||||
}
|
||||
|
||||
+31
@@ -3,6 +3,7 @@ package com.baiyue.firstleg.service;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.firstleg.dto.FinanceFeeSourceSnapshot;
|
||||
import com.baiyue.firstleg.entity.FeeItemEntity;
|
||||
import com.baiyue.firstleg.entity.ContainerFeeDetailEntity;
|
||||
import com.baiyue.firstleg.entity.InboundFeeDetailEntity;
|
||||
import com.baiyue.firstleg.entity.InboundOrderEntity;
|
||||
import com.baiyue.firstleg.repository.ContainerFeeDetailRepository;
|
||||
@@ -68,4 +69,34 @@ class FinanceFeeSourceSnapshotServiceTest {
|
||||
assertThatThrownBy(() -> service.inbound(21L, 31L))
|
||||
.isInstanceOf(BizException.class).hasMessageContaining("不存在");
|
||||
}
|
||||
|
||||
@Test
|
||||
void containerSnapshotPublishesPayableCounterpartyIdentity() {
|
||||
ContainerFeeDetailEntity detail = new ContainerFeeDetailEntity();
|
||||
detail.setId(51L);
|
||||
detail.setTenantId(10001L);
|
||||
detail.setLoadingPlanId(41L);
|
||||
detail.setContainerBookingId(61L);
|
||||
detail.setContainerNo("CONT-41");
|
||||
detail.setFeeItemId(11L);
|
||||
detail.setFeeItemCodeSnapshot("TRUCKING");
|
||||
detail.setFeeItemNameSnapshot("拖车费");
|
||||
detail.setDirection("PAYABLE");
|
||||
detail.setPartnerId(71L);
|
||||
detail.setPartnerName("现有往来单位");
|
||||
detail.setBusinessDate(java.time.LocalDate.of(2026, 8, 12));
|
||||
detail.setAmount(new BigDecimal("300.00"));
|
||||
detail.setCurrency("CNY");
|
||||
detail.setReviewStatus("APPROVED");
|
||||
detail.setSourceStatus("ACTIVE");
|
||||
detail.setSourceVersion(2);
|
||||
detail.setSettlementIncluded(true);
|
||||
when(containerFees.find(41L, 51L)).thenReturn(detail);
|
||||
|
||||
FinanceFeeSourceSnapshot snapshot = service.container(41L, 51L);
|
||||
|
||||
assertThat(snapshot.partnerId()).isEqualTo(71L);
|
||||
assertThat(snapshot.partnerName()).isEqualTo("现有往来单位");
|
||||
assertThat(snapshot.sourceHash()).matches("[0-9a-f]{64}");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user