diff --git a/finance/src/main/java/com/baiyue/finance/client/FirstlegFeeSourceClient.java b/finance/src/main/java/com/baiyue/finance/client/FirstlegFeeSourceClient.java index 3178f4b7e..074c74b17 100644 --- a/finance/src/main/java/com/baiyue/finance/client/FirstlegFeeSourceClient.java +++ b/finance/src/main/java/com/baiyue/finance/client/FirstlegFeeSourceClient.java @@ -24,7 +24,8 @@ public interface FirstlegFeeSourceClient { record Snapshot(long tenantId, String sourceType, long feeId, int feeVersion, Long inboundId, String inboundCode, Long orderId, Long containerId, Long containerBookingId, String containerNo, long customerId, - String customerName, Long feeItemId, String feeItemCode, + String customerName, Long partnerId, String partnerName, + Long feeItemId, String feeItemCode, String feeItemName, String direction, LocalDate businessDate, String currency, BigDecimal totalAmount, String reviewStatus, String publicationStatus, boolean settlementIncluded, diff --git a/finance/src/test/java/com/baiyue/finance/FinanceFeeSourceEventServiceTest.java b/finance/src/test/java/com/baiyue/finance/FinanceFeeSourceEventServiceTest.java index 507a948ef..44f4a14cd 100644 --- a/finance/src/test/java/com/baiyue/finance/FinanceFeeSourceEventServiceTest.java +++ b/finance/src/test/java/com/baiyue/finance/FinanceFeeSourceEventServiceTest.java @@ -173,7 +173,7 @@ class FinanceFeeSourceEventServiceTest { String publicationStatus, BigDecimal amount) { return new FirstlegFeeSourceClient.Snapshot(customerId, sourceType, 31, version, inboundId, inboundId == null ? null : "IB-21", 51L, containerId, null, - containerId == null ? null : "C-41", customerId, "客户", 61L, "CUSTOMS", + containerId == null ? null : "C-41", customerId, "客户", null, null, 61L, "CUSTOMS", "清关费", "RECEIVABLE", LocalDate.of(2026, 8, 11), "CNY", amount, "APPROVED", publicationStatus, true, LocalDateTime.of(2026, 8, 11, 1, 0), BigDecimal.ONE, "SHIPMENT", BigDecimal.TEN, BigDecimal.ONE, "source-hash", version); diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/FinanceFeeSourceSnapshot.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/FinanceFeeSourceSnapshot.java index 0772af2cb..18ffe81a5 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/dto/FinanceFeeSourceSnapshot.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/FinanceFeeSourceSnapshot.java @@ -18,6 +18,8 @@ public record FinanceFeeSourceSnapshot( String containerNo, long customerId, String customerName, + Long partnerId, + String partnerName, Long feeItemId, String feeItemCode, String feeItemName, diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundFeeDetailDtos.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundFeeDetailDtos.java index 87e935baa..4cbf5d28b 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundFeeDetailDtos.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundFeeDetailDtos.java @@ -22,12 +22,14 @@ public final class InboundFeeDetailDtos { @NotBlank @Pattern(regexp = "[A-Z]{3}") String currency, @NotNull @DecimalMin("0.00") BigDecimal amount, @NotNull Boolean settlementIncluded, + Long partnerId, + @Size(max = 200) String partnerName, @Size(max = 500) String remark ) { public SaveRequest(Long feeItemId, String direction, LocalDate businessDate, BigDecimal unitPrice, String currency, BigDecimal amount, String remark) { - this(feeItemId, direction, businessDate, unitPrice, currency, amount, false, remark); + this(feeItemId, direction, businessDate, unitPrice, currency, amount, false, null, null, remark); } } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/entity/InboundFeeDetailEntity.java b/firstleg/src/main/java/com/baiyue/firstleg/entity/InboundFeeDetailEntity.java index b7251fd90..f54a2cc98 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/entity/InboundFeeDetailEntity.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/entity/InboundFeeDetailEntity.java @@ -27,6 +27,8 @@ public class InboundFeeDetailEntity extends BaseEntity { private String sourceFeeNo; private String inboundCode; private String direction; + private Long partnerId; + private String partnerName; private LocalDate businessDate; private Long customerId; private String customerName; diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/FinanceFeeSourceSnapshotService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/FinanceFeeSourceSnapshotService.java index a4d9c3032..4de08f7b8 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/FinanceFeeSourceSnapshotService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/FinanceFeeSourceSnapshotService.java @@ -44,7 +44,7 @@ public class FinanceFeeSourceSnapshotService { nullSafe(detail.getCurrency()), String.valueOf(detail.getSettlementIncluded())); return new FinanceFeeSourceSnapshot(detail.getTenantId(), "INBOUND_FEE", sourceFeeId, version, inboundId, inbound.getInboundCode(), inbound.getOrderId(), null, null, null, - detail.getTenantId(), inbound.getCustomerName(), item.getId(), item.getFeeCode(), + detail.getTenantId(), inbound.getCustomerName(), detail.getPartnerId(), detail.getPartnerName(), item.getId(), item.getFeeCode(), detail.getFeeTypeNameSnapshot(), detail.getDirection(), detail.getBusinessDate(), detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(), detail.getPublicationStatus(), Boolean.TRUE.equals(detail.getSettlementIncluded()), @@ -65,7 +65,7 @@ public class FinanceFeeSourceSnapshotService { String.valueOf(detail.getSettlementIncluded())); return new FinanceFeeSourceSnapshot(detail.getTenantId(), "CONTAINER_FEE", feeId, version, null, null, null, containerId, detail.getContainerBookingId(), - detail.getContainerNo(), detail.getTenantId(), null, detail.getFeeItemId(), + detail.getContainerNo(), detail.getTenantId(), null, null, null, detail.getFeeItemId(), detail.getFeeItemCodeSnapshot(), detail.getFeeItemNameSnapshot(), detail.getDirection(), detail.getBusinessDate(), detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(), publicationStatus, Boolean.TRUE.equals(detail.getSettlementIncluded()), diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/InboundFeeDetailService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/InboundFeeDetailService.java index 368751f34..de30e5117 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/InboundFeeDetailService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/InboundFeeDetailService.java @@ -310,6 +310,8 @@ public class InboundFeeDetailService { value.setFeeItemId(item.getId()); value.setInboundCode(inbound.getInboundCode()); value.setDirection(request.direction()); + value.setPartnerId("PAYABLE".equals(request.direction()) ? request.partnerId() : null); + value.setPartnerName("PAYABLE".equals(request.direction()) ? request.partnerName() : null); value.setBusinessDate(request.businessDate()); value.setFeeCategorySnapshot(item.getCategory()); value.setTradeScopeSnapshot(item.getTradeScope()); diff --git a/scripts/admin-test-env-modules/finance-full-fixtures.mjs b/scripts/admin-test-env-modules/finance-full-fixtures.mjs index 4a12b88ae..b468ac062 100644 --- a/scripts/admin-test-env-modules/finance-full-fixtures.mjs +++ b/scripts/admin-test-env-modules/finance-full-fixtures.mjs @@ -108,12 +108,14 @@ async function loadFeeItem(context, direction) { ? item.warehouseReceivable === true : item.warehousePayable === true)) || null } -async function createManualFee(context, resource, feeItem, direction, amount, basis, businessDate) { +async function createManualFee(context, resource, feeItem, direction, amount, basis, businessDate, partner = null) { if (context.financeFixtureHooks?.createManualFee) return context.financeFixtureHooks.createManualFee(context, resource, feeItem, direction, amount, basis, businessDate) const basePath = `/api/platform/v1/inbounds/${encodeURIComponent(resource.inboundId)}/fee-details` const listPath = `${basePath}?accountId=${encodeURIComponent(resource.tenantId)}` const body = { feeItemId: Number(feeItem.id), direction, businessDate, - unitPrice: amount, currency: 'CNY', amount, settlementIncluded: true, remark: `${context.marker}-${basis}` } + unitPrice: amount, currency: 'CNY', amount, settlementIncluded: true, + partnerId: partner?.id ? String(partner.id) : null, partnerName: partner?.partnerName || null, + remark: `${context.marker}-${basis}` } const response = await request(context, 'POST', listPath, body) const detail = context.apiSuccess(MODULE, `${basis}人工费用明细`, response, `inboundId=${resource.inboundId}`, OPTIONS) const feeId = id(detail?.id) @@ -342,7 +344,7 @@ export async function run(context) { if (feeItems.PAYABLE && supplier?.id) { for (const [index, manualResource] of manualResources.entries()) { const fee = await createManualFee(context, manualResource, feeItems.PAYABLE, 'PAYABLE', 80 + index * 10, - 'MANUAL_ORDER_FEE', dateOffset(-3 - index)) + 'MANUAL_ORDER_FEE', dateOffset(-3 - index), supplier) if (fee) fixtures.push({ ...fee, supplierId: id(supplier.id), partnerId: id(supplier.id), supplierName: supplier.partnerName || null }) } }