preserve payable partner in fee snapshots

This commit is contained in:
2026-08-12 15:33:32 +08:00
parent dca1455478
commit 645d20665c
8 changed files with 19 additions and 8 deletions
@@ -24,7 +24,8 @@ public interface FirstlegFeeSourceClient {
record Snapshot(long tenantId, String sourceType, long feeId, int feeVersion, record Snapshot(long tenantId, String sourceType, long feeId, int feeVersion,
Long inboundId, String inboundCode, Long orderId, Long containerId, Long inboundId, String inboundCode, Long orderId, Long containerId,
Long containerBookingId, String containerNo, long customerId, 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 feeItemName, String direction, LocalDate businessDate,
String currency, BigDecimal totalAmount, String reviewStatus, String currency, BigDecimal totalAmount, String reviewStatus,
String publicationStatus, boolean settlementIncluded, String publicationStatus, boolean settlementIncluded,
@@ -173,7 +173,7 @@ class FinanceFeeSourceEventServiceTest {
String publicationStatus, BigDecimal amount) { String publicationStatus, BigDecimal amount) {
return new FirstlegFeeSourceClient.Snapshot(customerId, sourceType, 31, version, inboundId, return new FirstlegFeeSourceClient.Snapshot(customerId, sourceType, 31, version, inboundId,
inboundId == null ? null : "IB-21", 51L, containerId, null, 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, "清关费", "RECEIVABLE", LocalDate.of(2026, 8, 11), "CNY", amount,
"APPROVED", publicationStatus, true, LocalDateTime.of(2026, 8, 11, 1, 0), "APPROVED", publicationStatus, true, LocalDateTime.of(2026, 8, 11, 1, 0),
BigDecimal.ONE, "SHIPMENT", BigDecimal.TEN, BigDecimal.ONE, "source-hash", version); BigDecimal.ONE, "SHIPMENT", BigDecimal.TEN, BigDecimal.ONE, "source-hash", version);
@@ -18,6 +18,8 @@ public record FinanceFeeSourceSnapshot(
String containerNo, String containerNo,
long customerId, long customerId,
String customerName, String customerName,
Long partnerId,
String partnerName,
Long feeItemId, Long feeItemId,
String feeItemCode, String feeItemCode,
String feeItemName, String feeItemName,
@@ -22,12 +22,14 @@ public final class InboundFeeDetailDtos {
@NotBlank @Pattern(regexp = "[A-Z]{3}") String currency, @NotBlank @Pattern(regexp = "[A-Z]{3}") String currency,
@NotNull @DecimalMin("0.00") BigDecimal amount, @NotNull @DecimalMin("0.00") BigDecimal amount,
@NotNull Boolean settlementIncluded, @NotNull Boolean settlementIncluded,
Long partnerId,
@Size(max = 200) String partnerName,
@Size(max = 500) String remark @Size(max = 500) String remark
) { ) {
public SaveRequest(Long feeItemId, String direction, LocalDate businessDate, public SaveRequest(Long feeItemId, String direction, LocalDate businessDate,
BigDecimal unitPrice, String currency, BigDecimal amount, BigDecimal unitPrice, String currency, BigDecimal amount,
String remark) { String remark) {
this(feeItemId, direction, businessDate, unitPrice, currency, amount, false, remark); this(feeItemId, direction, businessDate, unitPrice, currency, amount, false, null, null, remark);
} }
} }
@@ -27,6 +27,8 @@ public class InboundFeeDetailEntity extends BaseEntity {
private String sourceFeeNo; private String sourceFeeNo;
private String inboundCode; private String inboundCode;
private String direction; private String direction;
private Long partnerId;
private String partnerName;
private LocalDate businessDate; private LocalDate businessDate;
private Long customerId; private Long customerId;
private String customerName; private String customerName;
@@ -44,7 +44,7 @@ public class FinanceFeeSourceSnapshotService {
nullSafe(detail.getCurrency()), String.valueOf(detail.getSettlementIncluded())); nullSafe(detail.getCurrency()), String.valueOf(detail.getSettlementIncluded()));
return new FinanceFeeSourceSnapshot(detail.getTenantId(), "INBOUND_FEE", sourceFeeId, return new FinanceFeeSourceSnapshot(detail.getTenantId(), "INBOUND_FEE", sourceFeeId,
version, inboundId, inbound.getInboundCode(), inbound.getOrderId(), null, null, null, 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.getFeeTypeNameSnapshot(), detail.getDirection(), detail.getBusinessDate(),
detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(), detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(),
detail.getPublicationStatus(), Boolean.TRUE.equals(detail.getSettlementIncluded()), detail.getPublicationStatus(), Boolean.TRUE.equals(detail.getSettlementIncluded()),
@@ -65,7 +65,7 @@ public class FinanceFeeSourceSnapshotService {
String.valueOf(detail.getSettlementIncluded())); String.valueOf(detail.getSettlementIncluded()));
return new FinanceFeeSourceSnapshot(detail.getTenantId(), "CONTAINER_FEE", feeId, return new FinanceFeeSourceSnapshot(detail.getTenantId(), "CONTAINER_FEE", feeId,
version, null, null, null, containerId, detail.getContainerBookingId(), 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.getFeeItemCodeSnapshot(), detail.getFeeItemNameSnapshot(), detail.getDirection(),
detail.getBusinessDate(), detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(), detail.getBusinessDate(), detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(),
publicationStatus, Boolean.TRUE.equals(detail.getSettlementIncluded()), publicationStatus, Boolean.TRUE.equals(detail.getSettlementIncluded()),
@@ -310,6 +310,8 @@ public class InboundFeeDetailService {
value.setFeeItemId(item.getId()); value.setFeeItemId(item.getId());
value.setInboundCode(inbound.getInboundCode()); value.setInboundCode(inbound.getInboundCode());
value.setDirection(request.direction()); 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.setBusinessDate(request.businessDate());
value.setFeeCategorySnapshot(item.getCategory()); value.setFeeCategorySnapshot(item.getCategory());
value.setTradeScopeSnapshot(item.getTradeScope()); value.setTradeScopeSnapshot(item.getTradeScope());
@@ -108,12 +108,14 @@ async function loadFeeItem(context, direction) {
? item.warehouseReceivable === true : item.warehousePayable === true)) || null ? 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) 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 basePath = `/api/platform/v1/inbounds/${encodeURIComponent(resource.inboundId)}/fee-details`
const listPath = `${basePath}?accountId=${encodeURIComponent(resource.tenantId)}` const listPath = `${basePath}?accountId=${encodeURIComponent(resource.tenantId)}`
const body = { feeItemId: Number(feeItem.id), direction, businessDate, 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 response = await request(context, 'POST', listPath, body)
const detail = context.apiSuccess(MODULE, `${basis}人工费用明细`, response, `inboundId=${resource.inboundId}`, OPTIONS) const detail = context.apiSuccess(MODULE, `${basis}人工费用明细`, response, `inboundId=${resource.inboundId}`, OPTIONS)
const feeId = id(detail?.id) const feeId = id(detail?.id)
@@ -342,7 +344,7 @@ export async function run(context) {
if (feeItems.PAYABLE && supplier?.id) { if (feeItems.PAYABLE && supplier?.id) {
for (const [index, manualResource] of manualResources.entries()) { for (const [index, manualResource] of manualResources.entries()) {
const fee = await createManualFee(context, manualResource, feeItems.PAYABLE, 'PAYABLE', 80 + index * 10, 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 }) if (fee) fixtures.push({ ...fee, supplierId: id(supplier.id), partnerId: id(supplier.id), supplierName: supplier.partnerName || null })
} }
} }