feat:发行货币的功能开发

chore/issuance-comments-zh
jiazheng.zhao 2 months ago
parent 85cb148180
commit 56edda8b97

@ -4,6 +4,8 @@ import com.yau.digitalrmb.institutionidentity.application.ControlSystemDigestRes
import com.yau.digitalrmb.institutionidentity.application.ControlSystemSignatureResult;
import com.yau.digitalrmb.institutionidentity.application.ControlSystemSignatureService;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.OperationMessageResult;
import com.yau.digitalrmb.institutionidentity.application.OperationStatusResult;
import com.yau.digitalrmb.institutionidentity.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.ControlSystemDigestRequest;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.ControlSystemSignRequest;
@ -49,25 +51,21 @@ public class ControlSystemSignatureController {
}
@PostMapping("/steps/package")
@Operation(summary = "打包控制系统签名反馈报文")
public ApiResponse<ControlSystemSignatureResult> packageResponse() {
return execute((subject, operator) -> service.packageResponse(subject, operator));
@Operation(summary = "打包控制系统签名反馈报文", description = "成功响应的data仅返回message。")
public ApiResponse<OperationMessageResult> packageResponse() {
JwtUser user = AuthContextHolder.get();
ControlSystemSignatureResult result = service.packageResponse(
InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getResponseMessage()), traceId());
}
@PostMapping("/steps/send")
@Operation(summary = "中央银行发送控制系统签名反馈")
public ApiResponse<ControlSystemSignatureResult> send() {
return execute((subject, operator) -> service.send(subject, operator));
}
private ApiResponse<ControlSystemSignatureResult> execute(OperationExecutor executor) {
@Operation(summary = "中央银行发送控制系统签名反馈", description = "成功响应的data仅返回status。")
public ApiResponse<OperationStatusResult> send() {
JwtUser user = AuthContextHolder.get();
return ApiResponse.success(executor.execute(InstitutionKeySubject.from(user), user.getUsername()), traceId());
ControlSystemSignatureResult result = service.send(InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), traceId());
}
private String traceId() { return MDC.get(TraceIdFilter.MDC_KEY); }
private interface OperationExecutor {
ControlSystemSignatureResult execute(InstitutionKeySubject subject, String operator);
}
}

@ -4,6 +4,8 @@ import com.yau.digitalrmb.institutionidentity.application.CurrencyDigestResult;
import com.yau.digitalrmb.institutionidentity.application.CurrencyGenerationRequestService;
import com.yau.digitalrmb.institutionidentity.application.CurrencyRequestResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.OperationMessageResult;
import com.yau.digitalrmb.institutionidentity.application.OperationStatusResult;
import com.yau.digitalrmb.institutionidentity.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.CurrencyRequestStepRequest;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.GenerateCurrencyDigestRequest;
@ -52,19 +54,21 @@ public class CurrencyGenerationRequestController {
}
@PostMapping("/steps/package")
@Operation(summary = "打包货币生成请求报文")
public ApiResponse<CurrencyRequestResult> packageRequest() {
@Operation(summary = "打包货币生成请求报文", description = "成功响应的data仅返回message。")
public ApiResponse<OperationMessageResult> packageRequest() {
JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(currencyRequestService.packageRequest(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername()), traceId());
CurrencyRequestResult result = currencyRequestService.packageRequest(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getRequestMessage()), traceId());
}
@PostMapping("/steps/send")
@Operation(summary = "发送请求至央行", description = "只允许发送已经完成打包的货币生成请求报文。")
public ApiResponse<CurrencyRequestResult> send() {
@Operation(summary = "发送请求至央行", description = "成功响应的data仅返回status,不重复返回请求报文和页面完整数据。")
public ApiResponse<OperationStatusResult> send() {
JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(currencyRequestService.send(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername()), traceId());
CurrencyRequestResult result = currencyRequestService.send(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), traceId());
}
@GetMapping("/page")

@ -7,6 +7,9 @@ import com.yau.digitalrmb.institutionidentity.application.CurrencyGenerationVeri
import com.yau.digitalrmb.institutionidentity.application.CurrencyQuotaVerificationResult;
import com.yau.digitalrmb.institutionidentity.application.CurrencyGenerationVerificationService;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.OperationBooleanResult;
import com.yau.digitalrmb.institutionidentity.application.OperationMessageResult;
import com.yau.digitalrmb.institutionidentity.application.OperationStatusResult;
import com.yau.digitalrmb.institutionidentity.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.CalculateCurrencyDigestRequest;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.ConfirmCurrencyRequest;
@ -33,20 +36,24 @@ public class CurrencyGenerationVerificationController {
@PostMapping("/steps/receive")
@Operation(summary = "接收步骤二请求报文",
description = "对应页面“接收步骤二请求报文”按钮。步骤二必须达到RECEIVED;重复点击时复用verificationId,并将步骤三恢复到RECEIVED,清空后续按钮产生的数据。")
public ApiResponse<CurrencyGenerationVerificationResult> receive(
public ApiResponse<OperationStatusResult> receive(
@Valid @RequestBody ReceiveCurrencyVerificationRequest request) {
JwtUser user = AuthContextHolder.get();
return ok(service.receive(request.getRequestId(), InstitutionKeySubject.from(user), user.getUsername()));
CurrencyGenerationVerificationResult result = service.receive(request.getRequestId(),
InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), MDC.get(TraceIdFilter.MDC_KEY));
}
@PostMapping("/steps/verify-signature")
@Operation(summary = "第二公钥SM2验证",
description = "对应页面“第二公钥SM2验证”按钮。前端传当前实训主体的商业银行第二公钥完整值,后端校验公钥归属,并使用该第二公钥执行SM2_Verify(摘要值, 签名值)。")
public ApiResponse<CurrencyGenerationVerificationResult> verifySignature(
public ApiResponse<OperationBooleanResult> verifySignature(
@Valid @RequestBody CurrencyVerificationStepRequest request) {
JwtUser user = AuthContextHolder.get();
return ok(service.verifySignature(request.getVerificationId(), request.getPublicKey(),
InstitutionKeySubject.from(user), user.getUsername()));
CurrencyGenerationVerificationResult result = service.verifySignature(request.getVerificationId(),
request.getPublicKey(), InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationBooleanResult(Boolean.TRUE.equals(result.getSignatureValid())),
MDC.get(TraceIdFilter.MDC_KEY));
}
@PostMapping("/steps/calculate-digest")
@ -62,11 +69,13 @@ public class CurrencyGenerationVerificationController {
@PostMapping("/steps/match-digest")
@Operation(summary = "匹配摘要一和摘要二", description = "对应页面“匹配”按钮,比较重算摘要一与请求报文摘要二。")
public ApiResponse<CurrencyGenerationVerificationResult> matchDigest(
public ApiResponse<OperationBooleanResult> matchDigest(
@Valid @RequestBody CurrencyVerificationStepRequest request) {
JwtUser user = AuthContextHolder.get();
return ok(service.matchDigest(request.getVerificationId(),
InstitutionKeySubject.from(user), user.getUsername()));
CurrencyGenerationVerificationResult result = service.matchDigest(request.getVerificationId(),
InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationBooleanResult(Boolean.TRUE.equals(result.getDigestMatches())),
MDC.get(TraceIdFilter.MDC_KEY));
}
@PostMapping("/steps/verify-quota")

@ -11,6 +11,8 @@ import com.yau.digitalrmb.institutionidentity.application.InstitutionKeyPairResu
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeyService;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.InstitutionSignatureResult;
import com.yau.digitalrmb.institutionidentity.application.OperationMessageResult;
import com.yau.digitalrmb.institutionidentity.application.OperationStatusResult;
import com.yau.digitalrmb.institutionidentity.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionTrainingResetResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionTrainingResetService;
@ -96,19 +98,21 @@ public class InstitutionIdentifierController {
@PostMapping("/steps/package")
@Operation(summary = "打包机构标识申请",
description = "无请求体;仅SIGNED状态可操作。将机构代码、时间戳、SM3摘要和商业银行SM2签名组装成申请报文。")
public ApiResponse<InstitutionApplicationPackageResult> packageApplication() {
public ApiResponse<OperationMessageResult> packageApplication() {
JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(stepService.packageApplication(InstitutionKeySubject.from(jwtUser),
jwtUser.getUsername()), traceId());
InstitutionApplicationPackageResult result = stepService.packageApplication(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getApplicationMessage()), traceId());
}
@PostMapping("/steps/send")
@Operation(summary = "发送机构标识申请",
description = "无请求体;仅PACKAGED状态可操作。将已打包报文发送至央行,返回SUBMITTED。")
public ApiResponse<InstitutionApplicationPackageResult> sendApplication() {
public ApiResponse<OperationStatusResult> sendApplication() {
JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(stepService.sendApplication(InstitutionKeySubject.from(jwtUser),
jwtUser.getUsername()), traceId());
InstitutionApplicationPackageResult result = stepService.sendApplication(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), traceId());
}
@GetMapping("/applications/commercial-bank")

@ -2,6 +2,9 @@ package com.yau.digitalrmb.institutionidentity.interfaces.rest;
import com.yau.digitalrmb.institutionidentity.application.CentralBankSignatureSegmentResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.OperationMessageResult;
import com.yau.digitalrmb.institutionidentity.application.OperationStatusResult;
import com.yau.digitalrmb.institutionidentity.application.OperationValueResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaControlBitResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaControlBitService;
import com.yau.digitalrmb.institutionidentity.application.QuotaControlDynamicSegmentResult;
@ -70,8 +73,12 @@ public class QuotaControlBitController {
}
@PostMapping("/steps/assemble")
@Operation(summary = "拼接完整额度控制位")
public ApiResponse<QuotaControlBitResult> assemble() { return execute((s, o) -> service.assemble(s, o)); }
@Operation(summary = "拼接完整额度控制位", description = "成功响应的data仅返回value,值为完整额度控制位。")
public ApiResponse<OperationValueResult> assemble() {
JwtUser user = AuthContextHolder.get();
QuotaControlBitResult result = service.assemble(InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationValueResult(result.getCompleteControlBit()), traceId());
}
@PostMapping("/steps/sign")
@Operation(summary = "商业银行第二私钥签名确认",
@ -84,12 +91,20 @@ public class QuotaControlBitController {
}
@PostMapping("/steps/package")
@Operation(summary = "打包额度控制位数据包报文")
public ApiResponse<QuotaControlBitResult> packageRequest() { return execute((s, o) -> service.packageRequest(s, o)); }
@Operation(summary = "打包额度控制位数据包报文", description = "成功响应的data仅返回message,值为本次打包的额度控制位请求报文。")
public ApiResponse<OperationMessageResult> packageRequest() {
JwtUser user = AuthContextHolder.get();
QuotaControlBitResult result = service.packageRequest(InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getRequestMessage()), traceId());
}
@PostMapping("/steps/send")
@Operation(summary = "商业银行发送额度控制位数据包报文")
public ApiResponse<QuotaControlBitResult> send() { return execute((s, o) -> service.send(s, o)); }
@Operation(summary = "商业银行发送额度控制位数据包报文", description = "成功响应的data仅返回status,不重复返回已打包报文和完整业务数据。")
public ApiResponse<OperationStatusResult> send() {
JwtUser user = AuthContextHolder.get();
QuotaControlBitResult result = service.send(InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), traceId());
}
@GetMapping
@Operation(summary = "查询步骤八商业银行端完整数据")
@ -97,10 +112,5 @@ public class QuotaControlBitController {
return ApiResponse.success(service.detail(InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
}
private ApiResponse<QuotaControlBitResult> execute(Executor executor) {
JwtUser user = AuthContextHolder.get();
return ApiResponse.success(executor.execute(InstitutionKeySubject.from(user), user.getUsername()), traceId());
}
private String traceId() { return MDC.get(TraceIdFilter.MDC_KEY); }
private interface Executor { QuotaControlBitResult execute(InstitutionKeySubject subject, String operator); }
}

@ -1,6 +1,8 @@
package com.yau.digitalrmb.institutionidentity.interfaces.rest;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.OperationMessageResult;
import com.yau.digitalrmb.institutionidentity.application.OperationStatusResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaRequestDigestResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaRequestMessageResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaRequestSignatureResult;
@ -62,20 +64,21 @@ public class QuotaRequestController {
}
@PostMapping("/steps/package")
@Operation(summary = "打包额度请求报文")
public ApiResponse<QuotaRequestMessageResult> packageRequest() {
@Operation(summary = "打包额度请求报文", description = "成功响应的data仅返回message。")
public ApiResponse<OperationMessageResult> packageRequest() {
JwtUser user = AuthContextHolder.get();
return ApiResponse.success(service.packageQuotaRequest(
InstitutionKeySubject.from(user), user.getUsername()), traceId());
QuotaRequestMessageResult result = service.packageQuotaRequest(
InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationMessageResult(toMessage(result)), traceId());
}
@PostMapping("/steps/send")
@Operation(summary = "商业银行发送额度请求报文",
description = "发送成功即视为央行已收到,央行查询状态由1(未发送)变为2(已发送)。")
public ApiResponse<QuotaRequestMessageResult> send() {
description = "发送成功即视为央行已收到;成功响应的data仅返回status。")
public ApiResponse<OperationStatusResult> send() {
JwtUser user = AuthContextHolder.get();
return ApiResponse.success(service.sendQuotaRequest(
InstitutionKeySubject.from(user), user.getUsername()), traceId());
service.sendQuotaRequest(InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationStatusResult("SENT"), traceId());
}
@GetMapping
@ -85,6 +88,15 @@ public class QuotaRequestController {
InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
}
private String toMessage(QuotaRequestMessageResult result) {
return "{\"quotaRequestId\":\"" + result.getQuotaRequestId()
+ "\",\"amount\":" + result.getAmount()
+ ",\"orgId\":\"" + result.getOrgId()
+ "\",\"txnId\":\"" + result.getTxnId()
+ "\",\"digest\":\"" + result.getDigest()
+ "\",\"signature\":\"" + result.getSignature() + "\"}";
}
private String traceId() {
return MDC.get(TraceIdFilter.MDC_KEY);
}

Loading…
Cancel
Save