This commit is contained in:
2026-08-11 19:59:06 +08:00
parent 7c24c96f88
commit 48bb752007
3 changed files with 25 additions and 11 deletions
@@ -3,7 +3,7 @@ package com.baiyue.finance.controller;
import com.baiyue.common.core.api.ApiResponse; import com.baiyue.common.core.api.ApiResponse;
import com.baiyue.common.security.AuthenticatedUser; import com.baiyue.common.security.AuthenticatedUser;
import com.baiyue.finance.dto.ReconciliationStatementDtos.CreateReconciliationRequest; import com.baiyue.finance.dto.ReconciliationStatementDtos.CreateReconciliationRequest;
import com.baiyue.finance.dto.ReconciliationStatementDtos.DocumentActionRequest; import com.baiyue.finance.dto.ReconciliationStatementDtos.ReconciliationActionRequest;
import com.baiyue.finance.dto.ReconciliationStatementDtos.ReconciliationDetail; import com.baiyue.finance.dto.ReconciliationStatementDtos.ReconciliationDetail;
import com.baiyue.finance.service.ReconciliationStatementService; import com.baiyue.finance.service.ReconciliationStatementService;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@@ -35,12 +35,16 @@ public class ReconciliationStatementController {
} }
@PostMapping("/reconciliation-statements/{statementId}/actions") @PostMapping("/reconciliation-statements/{statementId}/actions")
@PreAuthorize("hasAuthority('platform:finance:reconciliation:review')") @PreAuthorize("(#request.action != null && #request.action.equalsIgnoreCase('SUBMIT') && hasAuthority('platform:finance:reconciliation:create'))"
+ " || (#request.action != null && (#request.action.equalsIgnoreCase('APPROVE') || #request.action.equalsIgnoreCase('REJECT')) && hasAuthority('platform:finance:reconciliation:review'))"
+ " || (#request.action != null && #request.action.equalsIgnoreCase('ISSUE') && hasAuthority('platform:finance:reconciliation:issue'))"
+ " || (#request.action != null && #request.action.equalsIgnoreCase('ADJUST') && hasAuthority('platform:finance:reconciliation:adjust'))"
+ " || (#request.action != null && (#request.action.equalsIgnoreCase('VOID') || #request.action.equalsIgnoreCase('REOPEN')) && hasAuthority('platform:finance:reconciliation:void'))")
public ApiResponse<ReconciliationDetail> actionReconciliationStatement( public ApiResponse<ReconciliationDetail> actionReconciliationStatement(
@AuthenticationPrincipal AuthenticatedUser user, @AuthenticationPrincipal AuthenticatedUser user,
@PathVariable long statementId, @PathVariable long statementId,
@RequestHeader("Idempotency-Key") String idempotencyKey, @RequestHeader("Idempotency-Key") String idempotencyKey,
@Valid @RequestBody DocumentActionRequest request) { @Valid @RequestBody ReconciliationActionRequest request) {
return FinanceResponses.success(service.action(user.userId(), statementId, idempotencyKey, request)); return FinanceResponses.success(service.action(user.userId(), statementId, idempotencyKey, request));
} }
} }
@@ -8,11 +8,15 @@ import java.util.List;
public final class ReconciliationStatementDtos { public final class ReconciliationStatementDtos {
private ReconciliationStatementDtos() {} private ReconciliationStatementDtos() {}
public record CreateReconciliationRequest(long customerId, String generationMode, public record CreateReconciliationRequest(long customerId, String currency, String generationMode,
List<Long> feeSourceIds, LocalDate periodStart, List<Long> feeSourceIds, LocalDate periodStart,
LocalDate periodEnd, String remark) {} LocalDate periodEnd, String remark) {}
public record DocumentActionRequest(String action, String reason, int expectedVersion) {} public record ReconciliationActionRequest(String action, String reason, int expectedVersion,
List<StatementAdjustmentLineRequest> adjustmentLines) {}
public record StatementAdjustmentLineRequest(long statementLineId, BigDecimal adjustedAmount,
String reason) {}
public record ReconciliationDetail(long statementId, String statementNo, long customerId, public record ReconciliationDetail(long statementId, String statementNo, long customerId,
String customerName, LocalDate periodStart, LocalDate periodEnd, String customerName, LocalDate periodStart, LocalDate periodEnd,
@@ -20,16 +24,21 @@ public final class ReconciliationStatementDtos {
BigDecimal receivedAmount, BigDecimal outstandingAmount, BigDecimal receivedAmount, BigDecimal outstandingAmount,
boolean settled, String status, int version, boolean settled, String status, int version,
LocalDateTime createdAt, LocalDateTime updatedAt, String remark, LocalDateTime createdAt, LocalDateTime updatedAt, String remark,
List<FeeSourceLine> lines, List<PaymentHistory> paymentHistory) {} List<ReconciliationLine> lines, List<PaymentHistory> paymentHistory,
List<ReconciliationRevision> revisions) {}
public record FeeSourceLine(long feeSourceId, String sourceType, long sourceFeeId, public record ReconciliationLine(long statementLineId, long feeSourceId, int sourceVersion,
int sourceVersion, String direction, long customerId, String sourceHash, Long inboundId, Long containerId,
Long orderId, Long inboundId, Long containerId, String feeItemName, BigDecimal sourceAmount,
String feeItemCode, String feeItemName, BigDecimal amount, BigDecimal statementAmount, String currency,
String currency, String sourceStatus) {} String adjustmentReason) {}
public record PaymentHistory(long transactionId, String transactionType, public record PaymentHistory(long transactionId, String transactionType,
LocalDate transactionDate, BigDecimal amount, LocalDate transactionDate, BigDecimal amount,
String method, String referenceNo, long createdBy, String method, String referenceNo, long createdBy,
LocalDateTime createdAt, String remark) {} LocalDateTime createdAt, String remark) {}
public record ReconciliationRevision(int revisionNo, String action, BigDecimal beforeAmount,
BigDecimal afterAmount, String reason, long operatorId,
LocalDateTime occurredAt) {}
} }
@@ -127,6 +127,7 @@ CREATE TABLE IF NOT EXISTS fin_bill_line (
fee_item_code VARCHAR(64) NOT NULL COMMENT '出账时费用项目编码快照', fee_item_code VARCHAR(64) NOT NULL COMMENT '出账时费用项目编码快照',
fee_item_name VARCHAR(200) NOT NULL COMMENT '出账时费用项目名称快照', fee_item_name VARCHAR(200) NOT NULL COMMENT '出账时费用项目名称快照',
amount DECIMAL(20,6) NOT NULL COMMENT '账单明细金额,精度6位小数', amount DECIMAL(20,6) NOT NULL COMMENT '账单明细金额,精度6位小数',
adjustment_reason VARCHAR(500) NULL COMMENT '最近一次账单调整行原因;完整历史保存在修订与审计记录',
currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY', currency_code CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT 'ISO 4217三位币种代码,首期仅CNY',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '账单明细创建时间', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '账单明细创建时间',
PRIMARY KEY (id), PRIMARY KEY (id),