You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digital-rmb-backend/src/main/java/com/yau/digitalrmb/institutionidentity/domain/CurrencyGenerationRequest.java

180 lines
8.8 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.yau.digitalrmb.institutionidentity.domain;
import java.math.BigDecimal;
public class CurrencyGenerationRequest {
public enum Status {
PREPARED, CONCATENATED, DIGESTED, SIGNED, PACKAGED, SENT, RECEIVED
}
private final Long id;
private long identifierApplicationId;
private String institutionIdentifier;
private String fullInstitutionIdentifier;
private BigDecimal amount;
private String deliveryNodeCode;
private String requestTimestamp;
private String requestOriginalText;
private String requestDigest;
private String bankSignature;
private String signingKeyId;
private String requestMessage;
private Status status;
private CurrencyGenerationRequest(Long id, long identifierApplicationId, String institutionIdentifier,
String fullInstitutionIdentifier, BigDecimal amount, String deliveryNodeCode,
String requestTimestamp, String requestOriginalText, String requestDigest,
String bankSignature, String signingKeyId, String requestMessage, Status status) {
this.id = id;
this.identifierApplicationId = identifierApplicationId;
this.institutionIdentifier = institutionIdentifier;
this.fullInstitutionIdentifier = fullInstitutionIdentifier;
this.amount = amount;
this.deliveryNodeCode = deliveryNodeCode;
this.requestTimestamp = requestTimestamp;
this.requestOriginalText = requestOriginalText;
this.requestDigest = requestDigest;
this.bankSignature = bankSignature;
this.signingKeyId = signingKeyId;
this.requestMessage = requestMessage;
this.status = status;
}
public static CurrencyGenerationRequest prepare(long identifierApplicationId, String institutionIdentifier,
String fullInstitutionIdentifier, BigDecimal amount,
String deliveryNodeCode, String requestTimestamp) {
if (identifierApplicationId <= 0) {
throw new IllegalArgumentException("机构标识申请编号必须大于0");
}
if (institutionIdentifier == null || !institutionIdentifier.matches("ORG_[0-9A-F]{12}")) {
throw new IllegalArgumentException("简洁机构标识格式不正确");
}
if (fullInstitutionIdentifier == null || !fullInstitutionIdentifier.matches("[0-9A-F]{64}")) {
throw new IllegalArgumentException("完整机构标识格式不正确");
}
if (amount == null || amount.compareTo(new BigDecimal("0.00")) <= 0
|| amount.compareTo(new BigDecimal("50000.00")) > 0) {
throw new IllegalArgumentException("申请金额必须大于0且不超过50000.00元");
}
if (!"SYS_DC_001".equals(deliveryNodeCode) && !"SYS_DC_002".equals(deliveryNodeCode)) {
throw new IllegalArgumentException("投放节点编号不在允许范围内");
}
if (requestTimestamp == null || !requestTimestamp.matches("\\d{14}")) {
throw new IllegalArgumentException("请求时间戳格式不正确");
}
BigDecimal normalizedAmount = amount.setScale(2);
String originalText = institutionIdentifier + "|" + normalizedAmount.toPlainString() + "|"
+ deliveryNodeCode + "|" + requestTimestamp;
return new CurrencyGenerationRequest(null, identifierApplicationId, institutionIdentifier,
fullInstitutionIdentifier, normalizedAmount, deliveryNodeCode, requestTimestamp,
originalText, null, null, null, null, Status.CONCATENATED);
}
public static CurrencyGenerationRequest restore(Long id, long identifierApplicationId,
String institutionIdentifier, String fullInstitutionIdentifier,
BigDecimal amount, String deliveryNodeCode, String requestTimestamp,
String requestOriginalText, String requestDigest,
String bankSignature, String signingKeyId,
String requestMessage, Status status) {
return new CurrencyGenerationRequest(id, identifierApplicationId, institutionIdentifier,
fullInstitutionIdentifier, amount, deliveryNodeCode, requestTimestamp, requestOriginalText,
requestDigest, bankSignature, signingKeyId, requestMessage, status);
}
public void concatenate() {
requireStatus(Status.PREPARED, "当前步骤不是请求原文拼接,不能操作");
requestOriginalText = institutionIdentifier + "|" + amount.toPlainString() + "|"
+ deliveryNodeCode + "|" + requestTimestamp;
status = Status.CONCATENATED;
}
public void replaceDigestInput(long identifierApplicationId, String institutionIdentifier,
String fullInstitutionIdentifier, BigDecimal amount,
String deliveryNodeCode, String requestTimestamp, String digest) {
CurrencyGenerationRequest replacement = prepare(identifierApplicationId, institutionIdentifier,
fullInstitutionIdentifier, amount, deliveryNodeCode, requestTimestamp);
if (digest == null || !digest.matches("[0-9A-F]{64}")) {
throw new IllegalArgumentException("SM3摘要格式不正确");
}
this.identifierApplicationId = replacement.identifierApplicationId;
this.institutionIdentifier = replacement.institutionIdentifier;
this.fullInstitutionIdentifier = replacement.fullInstitutionIdentifier;
this.amount = replacement.amount;
this.deliveryNodeCode = replacement.deliveryNodeCode;
this.requestTimestamp = replacement.requestTimestamp;
this.requestOriginalText = replacement.requestOriginalText;
this.requestDigest = digest;
this.bankSignature = null;
this.signingKeyId = null;
this.requestMessage = null;
this.status = Status.DIGESTED;
}
public void recordDigest(String digest) {
requireStatus(Status.CONCATENATED, "当前步骤不是SM3摘要计算不能操作");
if (digest == null || !digest.matches("[0-9A-F]{64}")) {
throw new IllegalArgumentException("SM3摘要格式不正确");
}
requestDigest = digest;
status = Status.DIGESTED;
}
public void recordSignature(String keyId, String signature) {
if (requestDigest == null) {
throw new IllegalStateException("请先完成SM3摘要计算");
}
if (keyId == null || signature == null || !signature.matches("[0-9A-F]+")) {
throw new IllegalArgumentException("SM2签名信息不正确");
}
signingKeyId = keyId;
bankSignature = signature;
requestMessage = null;
status = Status.SIGNED;
}
public void packageMessage(String message) {
if (bankSignature == null) {
throw new IllegalStateException("请先完成商业银行签名");
}
if (message == null || message.trim().isEmpty()) {
throw new IllegalArgumentException("请求报文不能为空");
}
requestMessage = message;
status = Status.PACKAGED;
}
public void send() {
if (requestMessage == null) {
throw new IllegalStateException("请先完成请求报文组装");
}
status = Status.SENT;
}
public void receive() {
if (requestMessage == null) {
throw new IllegalStateException("央行只能接收已发送的请求");
}
status = Status.RECEIVED;
}
private void requireStatus(Status expected, String message) {
if (status != expected) {
throw new IllegalStateException(message + ",当前状态:" + status.name());
}
}
public Long getId() { return id; }
public long getIdentifierApplicationId() { return identifierApplicationId; }
public String getInstitutionIdentifier() { return institutionIdentifier; }
public String getFullInstitutionIdentifier() { return fullInstitutionIdentifier; }
public BigDecimal getAmount() { return amount; }
public String getDeliveryNodeCode() { return deliveryNodeCode; }
public String getRequestTimestamp() { return requestTimestamp; }
public String getRequestOriginalText() { return requestOriginalText; }
public String getRequestDigest() { return requestDigest; }
public String getBankSignature() { return bankSignature; }
public String getSigningKeyId() { return signingKeyId; }
public String getRequestMessage() { return requestMessage; }
public Status getStatus() { return status; }
}