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.ControlSystemSignatureResult;
import com.yau.digitalrmb.institutionidentity.application.ControlSystemSignatureService; import com.yau.digitalrmb.institutionidentity.application.ControlSystemSignatureService;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; 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.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.ControlSystemDigestRequest; import com.yau.digitalrmb.institutionidentity.interfaces.dto.ControlSystemDigestRequest;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.ControlSystemSignRequest; import com.yau.digitalrmb.institutionidentity.interfaces.dto.ControlSystemSignRequest;
@ -49,25 +51,21 @@ public class ControlSystemSignatureController {
} }
@PostMapping("/steps/package") @PostMapping("/steps/package")
@Operation(summary = "打包控制系统签名反馈报文") @Operation(summary = "打包控制系统签名反馈报文", description = "成功响应的data仅返回message。")
public ApiResponse<ControlSystemSignatureResult> packageResponse() { public ApiResponse<OperationMessageResult> packageResponse() {
return execute((subject, operator) -> service.packageResponse(subject, operator)); JwtUser user = AuthContextHolder.get();
ControlSystemSignatureResult result = service.packageResponse(
InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getResponseMessage()), traceId());
} }
@PostMapping("/steps/send") @PostMapping("/steps/send")
@Operation(summary = "中央银行发送控制系统签名反馈") @Operation(summary = "中央银行发送控制系统签名反馈", description = "成功响应的data仅返回status。")
public ApiResponse<ControlSystemSignatureResult> send() { public ApiResponse<OperationStatusResult> send() {
return execute((subject, operator) -> service.send(subject, operator));
}
private ApiResponse<ControlSystemSignatureResult> execute(OperationExecutor executor) {
JwtUser user = AuthContextHolder.get(); 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 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.CurrencyGenerationRequestService;
import com.yau.digitalrmb.institutionidentity.application.CurrencyRequestResult; import com.yau.digitalrmb.institutionidentity.application.CurrencyRequestResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; 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.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.CurrencyRequestStepRequest; import com.yau.digitalrmb.institutionidentity.interfaces.dto.CurrencyRequestStepRequest;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.GenerateCurrencyDigestRequest; import com.yau.digitalrmb.institutionidentity.interfaces.dto.GenerateCurrencyDigestRequest;
@ -52,19 +54,21 @@ public class CurrencyGenerationRequestController {
} }
@PostMapping("/steps/package") @PostMapping("/steps/package")
@Operation(summary = "打包货币生成请求报文") @Operation(summary = "打包货币生成请求报文", description = "成功响应的data仅返回message。")
public ApiResponse<CurrencyRequestResult> packageRequest() { public ApiResponse<OperationMessageResult> packageRequest() {
JwtUser jwtUser = AuthContextHolder.get(); JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(currencyRequestService.packageRequest( CurrencyRequestResult result = currencyRequestService.packageRequest(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername()), traceId()); InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getRequestMessage()), traceId());
} }
@PostMapping("/steps/send") @PostMapping("/steps/send")
@Operation(summary = "发送请求至央行", description = "只允许发送已经完成打包的货币生成请求报文。") @Operation(summary = "发送请求至央行", description = "成功响应的data仅返回status,不重复返回请求报文和页面完整数据。")
public ApiResponse<CurrencyRequestResult> send() { public ApiResponse<OperationStatusResult> send() {
JwtUser jwtUser = AuthContextHolder.get(); JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(currencyRequestService.send( CurrencyRequestResult result = currencyRequestService.send(
InstitutionKeySubject.from(jwtUser), jwtUser.getUsername()), traceId()); InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), traceId());
} }
@GetMapping("/page") @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.CurrencyQuotaVerificationResult;
import com.yau.digitalrmb.institutionidentity.application.CurrencyGenerationVerificationService; import com.yau.digitalrmb.institutionidentity.application.CurrencyGenerationVerificationService;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; 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.application.SignatureResult;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.CalculateCurrencyDigestRequest; import com.yau.digitalrmb.institutionidentity.interfaces.dto.CalculateCurrencyDigestRequest;
import com.yau.digitalrmb.institutionidentity.interfaces.dto.ConfirmCurrencyRequest; import com.yau.digitalrmb.institutionidentity.interfaces.dto.ConfirmCurrencyRequest;
@ -33,20 +36,24 @@ public class CurrencyGenerationVerificationController {
@PostMapping("/steps/receive") @PostMapping("/steps/receive")
@Operation(summary = "接收步骤二请求报文", @Operation(summary = "接收步骤二请求报文",
description = "对应页面“接收步骤二请求报文”按钮。步骤二必须达到RECEIVED;重复点击时复用verificationId,并将步骤三恢复到RECEIVED,清空后续按钮产生的数据。") description = "对应页面“接收步骤二请求报文”按钮。步骤二必须达到RECEIVED;重复点击时复用verificationId,并将步骤三恢复到RECEIVED,清空后续按钮产生的数据。")
public ApiResponse<CurrencyGenerationVerificationResult> receive( public ApiResponse<OperationStatusResult> receive(
@Valid @RequestBody ReceiveCurrencyVerificationRequest request) { @Valid @RequestBody ReceiveCurrencyVerificationRequest request) {
JwtUser user = AuthContextHolder.get(); 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") @PostMapping("/steps/verify-signature")
@Operation(summary = "第二公钥SM2验证", @Operation(summary = "第二公钥SM2验证",
description = "对应页面“第二公钥SM2验证”按钮。前端传当前实训主体的商业银行第二公钥完整值,后端校验公钥归属,并使用该第二公钥执行SM2_Verify(摘要值, 签名值)。") description = "对应页面“第二公钥SM2验证”按钮。前端传当前实训主体的商业银行第二公钥完整值,后端校验公钥归属,并使用该第二公钥执行SM2_Verify(摘要值, 签名值)。")
public ApiResponse<CurrencyGenerationVerificationResult> verifySignature( public ApiResponse<OperationBooleanResult> verifySignature(
@Valid @RequestBody CurrencyVerificationStepRequest request) { @Valid @RequestBody CurrencyVerificationStepRequest request) {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
return ok(service.verifySignature(request.getVerificationId(), request.getPublicKey(), CurrencyGenerationVerificationResult result = service.verifySignature(request.getVerificationId(),
InstitutionKeySubject.from(user), user.getUsername())); 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") @PostMapping("/steps/calculate-digest")
@ -62,11 +69,13 @@ public class CurrencyGenerationVerificationController {
@PostMapping("/steps/match-digest") @PostMapping("/steps/match-digest")
@Operation(summary = "匹配摘要一和摘要二", description = "对应页面“匹配”按钮,比较重算摘要一与请求报文摘要二。") @Operation(summary = "匹配摘要一和摘要二", description = "对应页面“匹配”按钮,比较重算摘要一与请求报文摘要二。")
public ApiResponse<CurrencyGenerationVerificationResult> matchDigest( public ApiResponse<OperationBooleanResult> matchDigest(
@Valid @RequestBody CurrencyVerificationStepRequest request) { @Valid @RequestBody CurrencyVerificationStepRequest request) {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
return ok(service.matchDigest(request.getVerificationId(), CurrencyGenerationVerificationResult result = service.matchDigest(request.getVerificationId(),
InstitutionKeySubject.from(user), user.getUsername())); InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationBooleanResult(Boolean.TRUE.equals(result.getDigestMatches())),
MDC.get(TraceIdFilter.MDC_KEY));
} }
@PostMapping("/steps/verify-quota") @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.InstitutionKeyService;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
import com.yau.digitalrmb.institutionidentity.application.InstitutionSignatureResult; 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.SignatureResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionTrainingResetResult; import com.yau.digitalrmb.institutionidentity.application.InstitutionTrainingResetResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionTrainingResetService; import com.yau.digitalrmb.institutionidentity.application.InstitutionTrainingResetService;
@ -96,19 +98,21 @@ public class InstitutionIdentifierController {
@PostMapping("/steps/package") @PostMapping("/steps/package")
@Operation(summary = "打包机构标识申请", @Operation(summary = "打包机构标识申请",
description = "无请求体;仅SIGNED状态可操作。将机构代码、时间戳、SM3摘要和商业银行SM2签名组装成申请报文。") description = "无请求体;仅SIGNED状态可操作。将机构代码、时间戳、SM3摘要和商业银行SM2签名组装成申请报文。")
public ApiResponse<InstitutionApplicationPackageResult> packageApplication() { public ApiResponse<OperationMessageResult> packageApplication() {
JwtUser jwtUser = AuthContextHolder.get(); JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(stepService.packageApplication(InstitutionKeySubject.from(jwtUser), InstitutionApplicationPackageResult result = stepService.packageApplication(
jwtUser.getUsername()), traceId()); InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationMessageResult(result.getApplicationMessage()), traceId());
} }
@PostMapping("/steps/send") @PostMapping("/steps/send")
@Operation(summary = "发送机构标识申请", @Operation(summary = "发送机构标识申请",
description = "无请求体;仅PACKAGED状态可操作。将已打包报文发送至央行,返回SUBMITTED。") description = "无请求体;仅PACKAGED状态可操作。将已打包报文发送至央行,返回SUBMITTED。")
public ApiResponse<InstitutionApplicationPackageResult> sendApplication() { public ApiResponse<OperationStatusResult> sendApplication() {
JwtUser jwtUser = AuthContextHolder.get(); JwtUser jwtUser = AuthContextHolder.get();
return ApiResponse.success(stepService.sendApplication(InstitutionKeySubject.from(jwtUser), InstitutionApplicationPackageResult result = stepService.sendApplication(
jwtUser.getUsername()), traceId()); InstitutionKeySubject.from(jwtUser), jwtUser.getUsername());
return ApiResponse.success(new OperationStatusResult(result.getStatus()), traceId());
} }
@GetMapping("/applications/commercial-bank") @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.CentralBankSignatureSegmentResult;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; 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.QuotaControlBitResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaControlBitService; import com.yau.digitalrmb.institutionidentity.application.QuotaControlBitService;
import com.yau.digitalrmb.institutionidentity.application.QuotaControlDynamicSegmentResult; import com.yau.digitalrmb.institutionidentity.application.QuotaControlDynamicSegmentResult;
@ -70,8 +73,12 @@ public class QuotaControlBitController {
} }
@PostMapping("/steps/assemble") @PostMapping("/steps/assemble")
@Operation(summary = "拼接完整额度控制位") @Operation(summary = "拼接完整额度控制位", description = "成功响应的data仅返回value,值为完整额度控制位。")
public ApiResponse<QuotaControlBitResult> assemble() { return execute((s, o) -> service.assemble(s, o)); } 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") @PostMapping("/steps/sign")
@Operation(summary = "商业银行第二私钥签名确认", @Operation(summary = "商业银行第二私钥签名确认",
@ -84,12 +91,20 @@ public class QuotaControlBitController {
} }
@PostMapping("/steps/package") @PostMapping("/steps/package")
@Operation(summary = "打包额度控制位数据包报文") @Operation(summary = "打包额度控制位数据包报文", description = "成功响应的data仅返回message,值为本次打包的额度控制位请求报文。")
public ApiResponse<QuotaControlBitResult> packageRequest() { return execute((s, o) -> service.packageRequest(s, o)); } 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") @PostMapping("/steps/send")
@Operation(summary = "商业银行发送额度控制位数据包报文") @Operation(summary = "商业银行发送额度控制位数据包报文", description = "成功响应的data仅返回status,不重复返回已打包报文和完整业务数据。")
public ApiResponse<QuotaControlBitResult> send() { return execute((s, o) -> service.send(s, o)); } 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 @GetMapping
@Operation(summary = "查询步骤八商业银行端完整数据") @Operation(summary = "查询步骤八商业银行端完整数据")
@ -97,10 +112,5 @@ public class QuotaControlBitController {
return ApiResponse.success(service.detail(InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); 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 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; package com.yau.digitalrmb.institutionidentity.interfaces.rest;
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; 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.QuotaRequestDigestResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaRequestMessageResult; import com.yau.digitalrmb.institutionidentity.application.QuotaRequestMessageResult;
import com.yau.digitalrmb.institutionidentity.application.QuotaRequestSignatureResult; import com.yau.digitalrmb.institutionidentity.application.QuotaRequestSignatureResult;
@ -62,20 +64,21 @@ public class QuotaRequestController {
} }
@PostMapping("/steps/package") @PostMapping("/steps/package")
@Operation(summary = "打包额度请求报文") @Operation(summary = "打包额度请求报文", description = "成功响应的data仅返回message。")
public ApiResponse<QuotaRequestMessageResult> packageRequest() { public ApiResponse<OperationMessageResult> packageRequest() {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
return ApiResponse.success(service.packageQuotaRequest( QuotaRequestMessageResult result = service.packageQuotaRequest(
InstitutionKeySubject.from(user), user.getUsername()), traceId()); InstitutionKeySubject.from(user), user.getUsername());
return ApiResponse.success(new OperationMessageResult(toMessage(result)), traceId());
} }
@PostMapping("/steps/send") @PostMapping("/steps/send")
@Operation(summary = "商业银行发送额度请求报文", @Operation(summary = "商业银行发送额度请求报文",
description = "发送成功即视为央行已收到,央行查询状态由1(未发送)变为2(已发送)。") description = "发送成功即视为央行已收到;成功响应的data仅返回status。")
public ApiResponse<QuotaRequestMessageResult> send() { public ApiResponse<OperationStatusResult> send() {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
return ApiResponse.success(service.sendQuotaRequest( service.sendQuotaRequest(InstitutionKeySubject.from(user), user.getUsername());
InstitutionKeySubject.from(user), user.getUsername()), traceId()); return ApiResponse.success(new OperationStatusResult("SENT"), traceId());
} }
@GetMapping @GetMapping
@ -85,6 +88,15 @@ public class QuotaRequestController {
InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); 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() { private String traceId() {
return MDC.get(TraceIdFilter.MDC_KEY); return MDC.get(TraceIdFilter.MDC_KEY);
} }

Loading…
Cancel
Save