docs: clarify swagger workflow step modules

agent/payment-training-progress
chenyuan 2 weeks ago
parent 73fe422495
commit bdc2bed8a6

@ -37,29 +37,29 @@ public class ExchangeController {
} }
@GetMapping("/context") @GetMapping("/context")
@Operation(summary = "步骤一:确认银行卡、钱包和商业银行库存") @Operation(summary = "货币兑换的步骤一:确认银行卡、钱包和商业银行库存")
public ApiResponse<ExchangeContext> context() { return ok(service.context(actor())); } public ApiResponse<ExchangeContext> context() { return ok(service.context(actor())); }
@PostMapping @PostMapping
@Operation(summary = "步骤二:输入金额并生成取币请求报文") @Operation(summary = "货币兑换的步骤二:输入金额并生成取币请求报文")
public ApiResponse<ExchangeOrderView> create(@Valid @RequestBody CreateExchangeRequest request) { public ApiResponse<ExchangeOrderView> create(@Valid @RequestBody CreateExchangeRequest request) {
return ok(service.create(new CreateExchangeCommand(request.getWalletId(), request.getBankAccountId(), request.getAmount()), actor())); return ok(service.create(new CreateExchangeCommand(request.getWalletId(), request.getBankAccountId(), request.getAmount()), actor()));
} }
@PostMapping("/{id}/sign") @PostMapping("/{id}/sign")
@Operation(summary = "步骤三使用钱包私钥生成SM2签名") @Operation(summary = "货币兑换的步骤三使用钱包私钥生成SM2签名")
public ApiResponse<ExchangeOrderView> sign(@PathVariable UUID id) { return ok(service.sign(id, actor())); } public ApiResponse<ExchangeOrderView> sign(@PathVariable UUID id) { return ok(service.sign(id, actor())); }
@PostMapping("/{id}/bank-process") @PostMapping("/{id}/bank-process")
@Operation(summary = "步骤四:商业银行验签、校验余额与限额并扣款") @Operation(summary = "货币兑换的步骤四:商业银行验签、校验余额与限额并扣款")
public ApiResponse<ExchangeOrderView> bankProcess(@PathVariable UUID id) { return ok(service.bankProcess(id, actor())); } public ApiResponse<ExchangeOrderView> bankProcess(@PathVariable UUID id) { return ok(service.bankProcess(id, actor())); }
@PostMapping("/{id}/reserve-coins") @PostMapping("/{id}/reserve-coins")
@Operation(summary = "步骤五之一:从商业银行库锁定等额币串") @Operation(summary = "货币兑换的步骤五之一:从商业银行库锁定等额币串")
public ApiResponse<ExchangeOrderView> reserveCoins(@PathVariable UUID id) { return ok(service.reserveCoins(id, actor())); } public ApiResponse<ExchangeOrderView> reserveCoins(@PathVariable UUID id) { return ok(service.reserveCoins(id, actor())); }
@PostMapping("/{id}/confirm-ownership") @PostMapping("/{id}/confirm-ownership")
@Operation(summary = "步骤五之二:央行登记中心校验并变更币串权属") @Operation(summary = "货币兑换的步骤五之二:央行登记中心校验并变更币串权属")
public ApiResponse<ExchangeOrderView> confirmOwnership(@PathVariable UUID id) { return ok(service.confirmOwnership(id, actor())); } public ApiResponse<ExchangeOrderView> confirmOwnership(@PathVariable UUID id) { return ok(service.confirmOwnership(id, actor())); }
@GetMapping("/{id}") @GetMapping("/{id}")

@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
@ApiModel(description = "央行控制系统签名段读取结果") @ApiModel(description = "央行控制系统签名段读取结果")
@Schema(description = "央行控制系统签名段读取结果") @Schema(description = "央行控制系统签名段读取结果")
public class CentralBankSignatureSegmentResult { public class CentralBankSignatureSegmentResult {
@Schema(description = "步骤七央行控制系统签名段", example = "CB_CTRL_30450220...") @Schema(description = "货币生成的步骤七央行控制系统签名段", example = "CB_CTRL_30450220...")
private final String centralBankSignatureSegment; private final String centralBankSignatureSegment;
public CentralBankSignatureSegmentResult(String centralBankSignatureSegment) { public CentralBankSignatureSegmentResult(String centralBankSignatureSegment) {

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤七控制系统签名SM3摘要结果") @Schema(description = "货币生成的步骤七控制系统签名SM3摘要结果")
public class ControlSystemDigestResult { public class ControlSystemDigestResult {
@Schema(description = "拼接请求原文的SM3摘要") @Schema(description = "拼接请求原文的SM3摘要")
private final String digest; private final String digest;

@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.math.BigDecimal; import java.math.BigDecimal;
@Schema(description = "步骤七控制系统签名结果") @Schema(description = "货币生成的步骤七控制系统签名结果")
public class ControlSystemSignatureResult { public class ControlSystemSignatureResult {
private final Long id; private final Long id;
private final String controlId; private final String controlId;

@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
public class CurrencyConfirmationMessageResult { public class CurrencyConfirmationMessageResult {
@Schema(description = "报文确认状态", example = "已确认", allowableValues = {"待确认", "已确认"}) @Schema(description = "报文确认状态", example = "已确认", allowableValues = {"待确认", "已确认"})
private final String confirmationStatus; private final String confirmationStatus;
@Schema(description = "步骤二货币生成请求展示编号", example = "REQ_20260730_001") @Schema(description = "货币生成的步骤二货币生成请求展示编号", example = "REQ_20260730_001")
private final String requestId; private final String requestId;
@Schema(description = "确认报文业务状态;待确认时为空", example = "CONFIRMED") @Schema(description = "确认报文业务状态;待确认时为空", example = "CONFIRMED")
private final String status; private final String status;

@ -6,8 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.math.BigDecimal; import java.math.BigDecimal;
@ApiModel(description = "步骤三额度验证结果") @ApiModel(description = "货币生成的步骤三额度验证结果")
@Schema(description = "步骤三额度验证结果") @Schema(description = "货币生成的步骤三额度验证结果")
public class CurrencyQuotaVerificationResult { public class CurrencyQuotaVerificationResult {
@Schema(description = "整个系统一次实训可申请的总额度", example = "50000.00") @Schema(description = "整个系统一次实训可申请的总额度", example = "50000.00")
private final BigDecimal totalQuota; private final BigDecimal totalQuota;
@ -15,7 +15,7 @@ public class CurrencyQuotaVerificationResult {
private final BigDecimal usedQuota; private final BigDecimal usedQuota;
@Schema(description = "本次申请计入后整个系统剩余额度,即总额度减已用额度", example = "6410.15") @Schema(description = "本次申请计入后整个系统剩余额度,即总额度减已用额度", example = "6410.15")
private final BigDecimal remainingQuota; private final BigDecimal remainingQuota;
@Schema(description = "当前步骤二请求的本次申请金额", example = "1589.85") @Schema(description = "当前货币生成的步骤二请求的本次申请金额", example = "1589.85")
private final BigDecimal currentAmount; private final BigDecimal currentAmount;
@Schema(description = "剩余额度是否满足本次申请", example = "true") @Schema(description = "剩余额度是否满足本次申请", example = "true")
private final Boolean quotaSufficient; private final Boolean quotaSufficient;

@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ApiModel(description = "步骤二当前货币生成请求编号") @ApiModel(description = "货币生成的步骤二当前货币生成请求编号")
@Schema(description = "步骤二当前货币生成请求编号") @Schema(description = "货币生成的步骤二当前货币生成请求编号")
public class CurrencyRequestIdResult { public class CurrencyRequestIdResult {
@ApiModelProperty(value = "当前实训主体最新一笔未删除的货币生成请求编号", @ApiModelProperty(value = "当前实训主体最新一笔未删除的货币生成请求编号",
example = "1900000000000000002") example = "1900000000000000002")

@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.math.BigDecimal; import java.math.BigDecimal;
@Schema(description = "步骤八额度控制位结果") @Schema(description = "货币生成的步骤八额度控制位结果")
public class QuotaControlBitResult { public class QuotaControlBitResult {
private final Long id; private final Long id;
private final Long controlSignatureId; private final Long controlSignatureId;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤八动态段生成结果") @Schema(description = "货币生成的步骤八动态段生成结果")
public class QuotaControlDynamicSegmentResult { public class QuotaControlDynamicSegmentResult {
@Schema(description = "由后端随机数和当前时间戳生成的动态段", example = "DYN_7G8H9I0J_20260730153600") @Schema(description = "由后端随机数和当前时间戳生成的动态段", example = "DYN_7G8H9I0J_20260730153600")
private final String dynamicSegment; private final String dynamicSegment;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤八静态段生成结果") @Schema(description = "货币生成的步骤八静态段生成结果")
public class QuotaControlStaticSegmentResult { public class QuotaControlStaticSegmentResult {
@Schema(description = "由后端前序金额、机构标识和交易信息标识计算的SM3静态段") @Schema(description = "由后端前序金额、机构标识和交易信息标识计算的SM3静态段")
private final String staticSegment; private final String staticSegment;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤五额度请求摘要结果") @Schema(description = "货币生成的步骤五额度请求摘要结果")
public class QuotaRequestDigestResult { public class QuotaRequestDigestResult {
@Schema(description = "额度请求原文的SM3摘要") @Schema(description = "额度请求原文的SM3摘要")
private final String digest; private final String digest;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤五额度请求签名结果") @Schema(description = "货币生成的步骤五额度请求签名结果")
public class QuotaRequestSignatureResult { public class QuotaRequestSignatureResult {
@Schema(description = "商业银行第二私钥生成的SM2签名值") @Schema(description = "商业银行第二私钥生成的SM2签名值")
private final String signature; private final String signature;

@ -5,13 +5,13 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.math.BigDecimal; import java.math.BigDecimal;
@Schema(description = "步骤五交易信息标识存在性判断结果") @Schema(description = "货币生成的步骤五交易信息标识存在性判断结果")
public class QuotaRequestSourceDataResult { public class QuotaRequestSourceDataResult {
@Schema(description = "步骤二生成并经步骤三确认的货币金额", example = "1589.85") @Schema(description = "货币生成的步骤二生成并经货币生成的步骤三确认的货币金额", example = "1589.85")
private final BigDecimal amount; private final BigDecimal amount;
@Schema(description = "步骤一生成的机构标识", example = "ORG_3A4B5C6D7E8F") @Schema(description = "货币生成的步骤一生成的机构标识", example = "ORG_3A4B5C6D7E8F")
private final String institutionIdentifier; private final String institutionIdentifier;
@Schema(description = "步骤四生成的交易信息标识", example = "TXN_8B9C0D1E2F3A4B5C6D7E8F9A0B1C2D3E4F5A6B7C8D9E0F1A2B3C4D5E6F7") @Schema(description = "货币生成的步骤四生成的交易信息标识", example = "TXN_8B9C0D1E2F3A4B5C6D7E8F9A0B1C2D3E4F5A6B7C8D9E0F1A2B3C4D5E6F7")
private final String transactionIdentifier; private final String transactionIdentifier;
public QuotaRequestSourceDataResult(TransactionInformationIdentifier value) { public QuotaRequestSourceDataResult(TransactionInformationIdentifier value) {
this.amount = value.getAmount(); this.amount = value.getAmount();

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤六H1与H2比对结果") @Schema(description = "货币生成的步骤六H1与H2比对结果")
public class QuotaVerificationComparisonResult { public class QuotaVerificationComparisonResult {
@Schema(description = "H1与H2是否一致") @Schema(description = "H1与H2是否一致")
private final boolean h1EqualsH2; private final boolean h1EqualsH2;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤六SM3哈希运算结果") @Schema(description = "货币生成的步骤六SM3哈希运算结果")
public class QuotaVerificationHashResult { public class QuotaVerificationHashResult {
@Schema(description = "对额度请求拼接原文进行SM3运算得到的H1") @Schema(description = "对额度请求拼接原文进行SM3运算得到的H1")
private final String h1; private final String h1;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤六额度请求拼接原文") @Schema(description = "货币生成的步骤六额度请求拼接原文")
public class QuotaVerificationOriginalTextResult { public class QuotaVerificationOriginalTextResult {
@Schema(description = "待哈希原文,格式:金额|机构标识|交易信息标识") @Schema(description = "待哈希原文,格式:金额|机构标识|交易信息标识")
private final String originalText; private final String originalText;

@ -3,7 +3,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import com.yau.digitalrmb.institutionidentity.domain.TransactionInformationIdentifier; import com.yau.digitalrmb.institutionidentity.domain.TransactionInformationIdentifier;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤六额度请求验签与摘要比对结果") @Schema(description = "货币生成的步骤六额度请求验签与摘要比对结果")
public class QuotaVerificationResult { public class QuotaVerificationResult {
private final String quotaRequestId; private final String quotaRequestId;
private final String requestMessage; private final String requestMessage;

@ -2,7 +2,7 @@ package com.yau.digitalrmb.institutionidentity.application;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "步骤六第二公钥验签获取摘要结果") @Schema(description = "货币生成的步骤六第二公钥验签获取摘要结果")
public class QuotaVerificationSignatureDigestResult { public class QuotaVerificationSignatureDigestResult {
@Schema(description = "商业银行第二公钥验签成功后由签名确认的摘要H2") @Schema(description = "商业银行第二公钥验签成功后由签名确认的摘要H2")
private final String h2; private final String h2;

@ -8,11 +8,11 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive; import javax.validation.constraints.Positive;
@ApiModel(description = "步骤三运算摘要参数") @ApiModel(description = "货币生成的步骤三运算摘要参数")
@Schema(description = "步骤三运算摘要参数") @Schema(description = "货币生成的步骤三运算摘要参数")
public class CalculateCurrencyDigestRequest { public class CalculateCurrencyDigestRequest {
@ApiModelProperty(value = "步骤三验证记录编号", required = true, example = "1900000000000000003") @ApiModelProperty(value = "货币生成的步骤三验证记录编号", required = true, example = "1900000000000000003")
@Schema(description = "步骤三验证记录编号", required = true, example = "1900000000000000003") @Schema(description = "货币生成的步骤三验证记录编号", required = true, example = "1900000000000000003")
@NotNull(message = "步骤三验证编号不能为空") @NotNull(message = "步骤三验证编号不能为空")
@Positive(message = "步骤三验证编号必须大于0") @Positive(message = "步骤三验证编号必须大于0")
private Long verificationId; private Long verificationId;

@ -8,18 +8,18 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive; import javax.validation.constraints.Positive;
@ApiModel(description = "步骤三签名确权参数") @ApiModel(description = "货币生成的步骤三签名确权参数")
@Schema(description = "步骤三签名确权参数") @Schema(description = "货币生成的步骤三签名确权参数")
public class ConfirmCurrencyRequest { public class ConfirmCurrencyRequest {
@ApiModelProperty(value = "步骤三验证记录编号", required = true, example = "1900000000000000003") @ApiModelProperty(value = "货币生成的步骤三验证记录编号", required = true, example = "1900000000000000003")
@Schema(description = "步骤三验证记录编号", required = true, example = "1900000000000000003") @Schema(description = "货币生成的步骤三验证记录编号", required = true, example = "1900000000000000003")
@NotNull(message = "步骤三验证编号不能为空") @NotNull(message = "步骤三验证编号不能为空")
@Positive(message = "步骤三验证编号必须大于0") @Positive(message = "步骤三验证编号必须大于0")
private Long verificationId; private Long verificationId;
@ApiModelProperty(value = "用户输入的步骤二请求摘要", required = true, @ApiModelProperty(value = "用户输入的货币生成的步骤二请求摘要", required = true,
example = "5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E5F6A") example = "5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E5F6A")
@Schema(description = "用户输入的步骤二请求摘要,必须与请求报文携带的摘要一致", required = true, @Schema(description = "用户输入的货币生成的步骤二请求摘要,必须与请求报文携带的摘要一致", required = true,
example = "5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E5F6A") example = "5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E5F6A")
@NotBlank(message = "请求摘要不能为空") @NotBlank(message = "请求摘要不能为空")
private String requestDigest; private String requestDigest;

@ -5,8 +5,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = "步骤一央行签名确权请求") @ApiModel(description = "货币生成的步骤一央行签名确权请求")
@Schema(description = "步骤一央行签名确权请求") @Schema(description = "货币生成的步骤一央行签名确权请求")
public class ConfirmInstitutionIdentifierRequest { public class ConfirmInstitutionIdentifierRequest {
@Schema(description = "央行第一私钥完整值;当前接口允许不传,不传时由后端读取备案私钥") @Schema(description = "央行第一私钥完整值;当前接口允许不传,不传时由后端读取备案私钥")
private String privateKey; private String privateKey;

@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤七控制系统签名哈希运算参数") @Schema(description = "货币生成的步骤七控制系统签名哈希运算参数")
public class ControlSystemDigestRequest { public class ControlSystemDigestRequest {
@NotBlank(message = "拼接请求原文不能为空") @NotBlank(message = "拼接请求原文不能为空")
@Schema(description = "页面拼接请求原文,格式:金额|机构标识|交易信息标识", required = true, @Schema(description = "页面拼接请求原文,格式:金额|机构标识|交易信息标识", required = true,

@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤七中央银行控制系统签名请求") @Schema(description = "货币生成的步骤七中央银行控制系统签名请求")
public class ControlSystemSignRequest { public class ControlSystemSignRequest {
@NotBlank(message = "中央银行第一私钥不能为空") @NotBlank(message = "中央银行第一私钥不能为空")
@Schema(description = "当前实训主体的中央银行第一私钥", required = true) @Schema(description = "当前实训主体的中央银行第一私钥", required = true)

@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ApiModel(description = "步骤二货币生成请求签名参数") @ApiModel(description = "货币生成的步骤二货币生成请求签名参数")
@Schema(description = "步骤二货币生成请求签名参数请求记录由JWT主体和步骤一机构标识自动定位") @Schema(description = "货币生成的步骤二货币生成请求签名参数请求记录由JWT主体和货币生成的步骤一机构标识自动定位")
public class CurrencyRequestStepRequest { public class CurrencyRequestStepRequest {
@ApiModelProperty(value = "商业银行第二SM2私钥完整值", required = true, @ApiModelProperty(value = "商业银行第二SM2私钥完整值", required = true,
example = "8A7B9C2D4F1E3A5B7C9D2E4F6A8B1C3D2E5F7A8B9C0D1E2F3A4B5C6D7E8F9A0B") example = "8A7B9C2D4F1E3A5B7C9D2E4F6A8B1C3D2E5F7A8B9C0D1E2F3A4B5C6D7E8F9A0B")

@ -7,11 +7,11 @@ import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive; import javax.validation.constraints.Positive;
@ApiModel(description = "步骤三货币生成请求验证分步操作参数") @ApiModel(description = "货币生成的步骤三货币生成请求验证分步操作参数")
@Schema(description = "步骤三货币生成请求验证分步操作参数") @Schema(description = "货币生成的步骤三货币生成请求验证分步操作参数")
public class CurrencyVerificationStepRequest { public class CurrencyVerificationStepRequest {
@ApiModelProperty(value = "步骤三验证记录编号", required = true, example = "1900000000000000003") @ApiModelProperty(value = "货币生成的步骤三验证记录编号", required = true, example = "1900000000000000003")
@Schema(description = "步骤三验证记录编号", required = true, example = "1900000000000000003") @Schema(description = "货币生成的步骤三验证记录编号", required = true, example = "1900000000000000003")
@NotNull(message = "步骤三验证编号不能为空") @NotNull(message = "步骤三验证编号不能为空")
@Positive(message = "步骤三验证编号必须大于0") @Positive(message = "步骤三验证编号必须大于0")
private Long verificationId; private Long verificationId;

@ -12,8 +12,8 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
import java.math.BigDecimal; import java.math.BigDecimal;
@ApiModel(description = "步骤二生成货币请求摘要") @ApiModel(description = "货币生成的步骤二生成货币请求摘要")
@Schema(description = "步骤二生成货币请求摘要;前端提交页面中的金额、投放节点、步骤一机构标识和当前时间戳,后端校验后拼接原文并持久化") @Schema(description = "货币生成的步骤二生成货币请求摘要;前端提交页面中的金额、投放节点、货币生成的步骤一机构标识和当前时间戳,后端校验后拼接原文并持久化")
public class GenerateCurrencyDigestRequest { public class GenerateCurrencyDigestRequest {
@ApiModelProperty(value = "申请生成的数字人民币金额范围0.01至50000.00元", required = true, @ApiModelProperty(value = "申请生成的数字人民币金额范围0.01至50000.00元", required = true,
example = "1589.85") example = "1589.85")
@ -33,9 +33,9 @@ public class GenerateCurrencyDigestRequest {
@Pattern(regexp = "SYS_DC_001|SYS_DC_002", message = "投放节点编号不在允许范围内") @Pattern(regexp = "SYS_DC_001|SYS_DC_002", message = "投放节点编号不在允许范围内")
private String deliveryNodeCode; private String deliveryNodeCode;
@ApiModelProperty(value = "步骤一反馈得到的简洁机构标识", required = true, @ApiModelProperty(value = "货币生成的步骤一反馈得到的简洁机构标识", required = true,
example = "ORG_3A4B5C6D7E8F") example = "ORG_3A4B5C6D7E8F")
@Schema(description = "步骤一反馈得到的简洁机构标识;后端会校验是否属于当前实训主体", @Schema(description = "货币生成的步骤一反馈得到的简洁机构标识;后端会校验是否属于当前实训主体",
required = true, example = "ORG_3A4B5C6D7E8F") required = true, example = "ORG_3A4B5C6D7E8F")
@NotBlank(message = "机构标识不能为空") @NotBlank(message = "机构标识不能为空")
@Pattern(regexp = "ORG_[0-9A-F]{12}", message = "机构标识格式不正确") @Pattern(regexp = "ORG_[0-9A-F]{12}", message = "机构标识格式不正确")

@ -7,8 +7,8 @@ import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
@ApiModel(description = "步骤一生成机构标识摘要请求") @ApiModel(description = "货币生成的步骤一生成机构标识摘要请求")
@Schema(description = "步骤一生成机构标识摘要请求") @Schema(description = "货币生成的步骤一生成机构标识摘要请求")
public class GenerateInstitutionIdentifierRequest { public class GenerateInstitutionIdentifierRequest {
@Schema(description = "完整申请原文,格式为银行代码|14位时间戳", required = true, example = "BKCHCNBJ00001|20260730143218") @Schema(description = "完整申请原文,格式为银行代码|14位时间戳", required = true, example = "BKCHCNBJ00001|20260730143218")
private String bankCode; private String bankCode;

@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ApiModel(description = "步骤四生成交易信息摘要参数") @ApiModel(description = "货币生成的步骤四生成交易信息摘要参数")
@Schema(description = "步骤四生成交易信息摘要参数") @Schema(description = "货币生成的步骤四生成交易信息摘要参数")
public class GenerateTransactionDigestRequest { public class GenerateTransactionDigestRequest {
@ApiModelProperty(value = "页面拼接请求原文,格式:金额|机构标识|14位时间戳", required = true, @ApiModelProperty(value = "页面拼接请求原文,格式:金额|机构标识|14位时间戳", required = true,
example = "1589.85|ORG_3A4B5C6D7E8F|20260730153330") example = "1589.85|ORG_3A4B5C6D7E8F|20260730153330")

@ -5,8 +5,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = "步骤一商业银行签名请求") @ApiModel(description = "货币生成的步骤一商业银行签名请求")
@Schema(description = "步骤一商业银行签名请求") @Schema(description = "货币生成的步骤一商业银行签名请求")
public class InstitutionIdentifierStepRequest { public class InstitutionIdentifierStepRequest {
@ApiModelProperty(value = "商业银行第二私钥完整值", required = true, @ApiModelProperty(value = "商业银行第二私钥完整值", required = true,
example = "8A7B9C2D4F1E3A5B7C9D2E4F6A8B1C3D2E5F7A8B9C0D1E2F3A4B5C6D7E8F9A0B") example = "8A7B9C2D4F1E3A5B7C9D2E4F6A8B1C3D2E5F7A8B9C0D1E2F3A4B5C6D7E8F9A0B")

@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
@Schema(description = "步骤八生成动态段的用户输入") @Schema(description = "货币生成的步骤八生成动态段的用户输入")
public class QuotaControlDynamicRequest { public class QuotaControlDynamicRequest {
@NotBlank(message = "随机数不能为空") @NotBlank(message = "随机数不能为空")
@Pattern(regexp = "[A-Za-z0-9]{8}", message = "随机数必须为8位字母或数字") @Pattern(regexp = "[A-Za-z0-9]{8}", message = "随机数必须为8位字母或数字")

@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤八商业银行签名确认参数") @Schema(description = "货币生成的步骤八商业银行签名确认参数")
public class QuotaControlSignRequest { public class QuotaControlSignRequest {
@NotBlank(message = "商业银行第二私钥不能为空") @NotBlank(message = "商业银行第二私钥不能为空")
private String privateKey; private String privateKey;

@ -7,7 +7,7 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal; import java.math.BigDecimal;
@Schema(description = "步骤八生成静态段的用户输入") @Schema(description = "货币生成的步骤八生成静态段的用户输入")
public class QuotaControlStaticRequest { public class QuotaControlStaticRequest {
@NotNull(message = "货币金额不能为空") @NotNull(message = "货币金额不能为空")
@DecimalMin(value = "0.01", message = "货币金额必须大于0") @DecimalMin(value = "0.01", message = "货币金额必须大于0")

@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤五生成额度请求摘要参数") @Schema(description = "货币生成的步骤五生成额度请求摘要参数")
public class QuotaRequestDigestRequest { public class QuotaRequestDigestRequest {
@NotBlank(message = "额度请求原文不能为空") @NotBlank(message = "额度请求原文不能为空")
@Schema(description = "前端拼接的额度请求原文,格式:金额|机构标识|交易信息标识", required = true, @Schema(description = "前端拼接的额度请求原文,格式:金额|机构标识|交易信息标识", required = true,

@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤五额度请求签名参数") @Schema(description = "货币生成的步骤五额度请求签名参数")
public class QuotaRequestSignRequest { public class QuotaRequestSignRequest {
@NotBlank(message = "商业银行第二私钥不能为空") @NotBlank(message = "商业银行第二私钥不能为空")
@Schema(description = "当前实训主体的商业银行第二SM2私钥完整值", required = true) @Schema(description = "当前实训主体的商业银行第二SM2私钥完整值", required = true)

@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤六SM3哈希运算参数") @Schema(description = "货币生成的步骤六SM3哈希运算参数")
public class QuotaVerificationHashRequest { public class QuotaVerificationHashRequest {
@NotBlank(message = "待哈希原文不能为空") @NotBlank(message = "待哈希原文不能为空")
@Schema(description = "前端从额度请求报文提取并拼接的原文,格式:金额|机构标识|交易信息标识", required = true, @Schema(description = "前端从额度请求报文提取并拼接的原文,格式:金额|机构标识|交易信息标识", required = true,

@ -4,10 +4,10 @@ import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@Schema(description = "步骤六额度验签参数") @Schema(description = "货币生成的步骤六额度验签参数")
public class QuotaVerificationRequest { public class QuotaVerificationRequest {
@NotBlank(message = "商业银行第二公钥不能为空") @NotBlank(message = "商业银行第二公钥不能为空")
@Schema(description = "步骤一生成并备案的商业银行第二SM2公钥", required = true) @Schema(description = "货币生成的步骤一生成并备案的商业银行第二SM2公钥", required = true)
private String publicKey; private String publicKey;
public String getPublicKey() { public String getPublicKey() {

@ -7,12 +7,12 @@ import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive; import javax.validation.constraints.Positive;
@ApiModel(description = "步骤三接收步骤二货币生成请求") @ApiModel(description = "货币生成的步骤三接收货币生成的步骤二货币生成请求")
@Schema(description = "步骤三接收步骤二货币生成请求") @Schema(description = "货币生成的步骤三接收货币生成的步骤二货币生成请求")
public class ReceiveCurrencyVerificationRequest { public class ReceiveCurrencyVerificationRequest {
@ApiModelProperty(value = "步骤二已经发送并由央行接收的货币生成请求编号", required = true, @ApiModelProperty(value = "货币生成的步骤二已经发送并由央行接收的货币生成请求编号", required = true,
example = "1900000000000000002") example = "1900000000000000002")
@Schema(description = "步骤二已经发送并由央行接收的货币生成请求编号", required = true, example = "1900000000000000002") @Schema(description = "货币生成的步骤二已经发送并由央行接收的货币生成请求编号", required = true, example = "1900000000000000002")
@NotNull(message = "步骤二货币生成请求编号不能为空") @NotNull(message = "步骤二货币生成请求编号不能为空")
@Positive(message = "步骤二货币生成请求编号必须大于0") @Positive(message = "步骤二货币生成请求编号必须大于0")
private Long requestId; private Long requestId;

@ -6,8 +6,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@ApiModel(description = "步骤一央行解密验证请求") @ApiModel(description = "货币生成的步骤一央行解密验证请求")
@Schema(description = "步骤一央行解密验证请求") @Schema(description = "货币生成的步骤一央行解密验证请求")
public class VerifyInstitutionApplicationRequest { public class VerifyInstitutionApplicationRequest {
@ApiModelProperty(value = "当前主体备案的商业银行第二公钥完整值", required = true, @ApiModelProperty(value = "当前主体备案的商业银行第二公钥完整值", required = true,
example = "04B8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8") example = "04B8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C7D8")

@ -33,7 +33,7 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers") @RequestMapping("/api/v1/institution-identifiers")
@Tag(name = "步骤一:中央银行投放机构标识") @Tag(name = "货币生成的步骤一:中央银行投放机构标识")
public class CentralBankInstitutionIdentifierController { public class CentralBankInstitutionIdentifierController {
@Resource @Resource
private InstitutionKeyService keyService; private InstitutionKeyService keyService;

@ -15,7 +15,7 @@ import javax.annotation.Resource;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/central-bank/quota-control-bits") @RequestMapping("/api/v1/institution-identifiers/central-bank/quota-control-bits")
@Tag(name = "步骤八:中央银行接收额度控制位") @Tag(name = "货币生成的步骤八:中央银行接收额度控制位")
public class CentralBankQuotaControlBitController { public class CentralBankQuotaControlBitController {
@Resource private QuotaControlBitService service; @Resource private QuotaControlBitService service;

@ -17,7 +17,7 @@ import javax.annotation.Resource;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/central-bank/quota-requests") @RequestMapping("/api/v1/institution-identifiers/central-bank/quota-requests")
@Tag(name = "步骤五:中央银行接收额度请求") @Tag(name = "货币生成的步骤五:中央银行接收额度请求")
public class CentralBankQuotaRequestController { public class CentralBankQuotaRequestController {
@Resource @Resource
private TransactionInformationIdentifierService service; private TransactionInformationIdentifierService service;

@ -17,7 +17,7 @@ import javax.annotation.Resource;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/commercial-bank/control-system-signatures") @RequestMapping("/api/v1/institution-identifiers/commercial-bank/control-system-signatures")
@Tag(name = "步骤七:商业银行接收控制系统签名报文") @Tag(name = "货币生成的步骤七:商业银行接收控制系统签名报文")
public class CommercialBankControlSystemSignatureController { public class CommercialBankControlSystemSignatureController {
@Resource private ControlSystemSignatureService service; @Resource private ControlSystemSignatureService service;

@ -26,7 +26,7 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/control-system-signatures") @RequestMapping("/api/v1/institution-identifiers/control-system-signatures")
@Tag(name = "步骤七:中央银行控制系统签名") @Tag(name = "货币生成的步骤七:中央银行控制系统签名")
public class ControlSystemSignatureController { public class ControlSystemSignatureController {
@Resource private ControlSystemSignatureService service; @Resource private ControlSystemSignatureService service;

@ -27,14 +27,14 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/currency-requests") @RequestMapping("/api/v1/institution-identifiers/currency-requests")
@Tag(name = "步骤二:发起请求") @Tag(name = "货币生成的步骤二:发起请求")
public class CurrencyGenerationRequestController { public class CurrencyGenerationRequestController {
@Resource @Resource
private CurrencyGenerationRequestService currencyRequestService; private CurrencyGenerationRequestService currencyRequestService;
@PostMapping("/steps/digest") @PostMapping("/steps/digest")
@Operation(summary = "生成请求SM3摘要", @Operation(summary = "生成请求SM3摘要",
description = "步骤二首个操作。前端提交金额、投放节点、步骤一反馈的ORG机构标识和页面当前时间戳后端校验机构标识归属按机构标识|金额|投放节点|时间戳拼接原文并全部持久化。同一ORG重复提交时更新同一条记录。") description = "货币生成的步骤二首个操作。前端提交金额、投放节点、货币生成的步骤一反馈的ORG机构标识和页面当前时间戳后端校验机构标识归属按机构标识|金额|投放节点|时间戳拼接原文并全部持久化。同一ORG重复提交时更新同一条记录。")
public ApiResponse<CurrencyDigestResult> digest( public ApiResponse<CurrencyDigestResult> digest(
@Valid @RequestBody GenerateCurrencyDigestRequest request) { @Valid @RequestBody GenerateCurrencyDigestRequest request) {
JwtUser jwtUser = AuthContextHolder.get(); JwtUser jwtUser = AuthContextHolder.get();
@ -72,7 +72,7 @@ public class CurrencyGenerationRequestController {
} }
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "查询步骤二当前页面全部数据", @Operation(summary = "查询货币生成的步骤二当前页面全部数据",
description = "一次返回金额、投放节点、机构标识、时间戳、拼接原文、SM3摘要、SM2签名、打包报文和央行接收状态。") description = "一次返回金额、投放节点、机构标识、时间戳、拼接原文、SM3摘要、SM2签名、打包报文和央行接收状态。")
public ApiResponse<CurrencyRequestResult> page() { public ApiResponse<CurrencyRequestResult> page() {
return ApiResponse.success(currencyRequestService.page( return ApiResponse.success(currencyRequestService.page(

@ -31,13 +31,13 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/currency-request-verifications") @RequestMapping("/api/v1/institution-identifiers/currency-request-verifications")
@Tag(name = "步骤三:验证货币生成请求") @Tag(name = "货币生成的步骤三:验证货币生成请求")
public class CurrencyGenerationVerificationController { public class CurrencyGenerationVerificationController {
@Resource private CurrencyGenerationVerificationService service; @Resource private CurrencyGenerationVerificationService service;
@PostMapping("/steps/receive") @PostMapping("/steps/receive")
@Operation(summary = "接收步骤二请求报文", @Operation(summary = "接收货币生成的步骤二请求报文",
description = "对应页面“接收步骤二请求报文”按钮。步骤二必须达到RECEIVED重复点击时复用verificationId并将步骤三恢复到RECEIVED清空后续按钮产生的数据。") description = "对应页面“接收货币生成的步骤二请求报文”按钮。货币生成的步骤二必须达到RECEIVED重复点击时复用verificationId并将货币生成的步骤三恢复到RECEIVED清空后续按钮产生的数据。")
public ApiResponse<OperationIdStatusResult> receive( public ApiResponse<OperationIdStatusResult> receive(
@Valid @RequestBody ReceiveCurrencyVerificationRequest request) { @Valid @RequestBody ReceiveCurrencyVerificationRequest request) {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
@ -93,7 +93,7 @@ public class CurrencyGenerationVerificationController {
@PostMapping("/steps/confirm") @PostMapping("/steps/confirm")
@Operation(summary = "央行第一私钥签名确权", @Operation(summary = "央行第一私钥签名确权",
description = "对应页面“签名确权”按钮。用户输入请求摘要和央行第一私钥;后端校验摘要与步骤二请求摘要一致后使用该私钥对输入摘要执行SM2签名。只生成央行签名和确权时间不打包报文。") description = "对应页面“签名确权”按钮。用户输入请求摘要和央行第一私钥;后端校验摘要与货币生成的步骤二请求摘要一致后使用该私钥对输入摘要执行SM2签名。只生成央行签名和确权时间不打包报文。")
public ApiResponse<SignatureResult> confirm( public ApiResponse<SignatureResult> confirm(
@Valid @RequestBody ConfirmCurrencyRequest request) { @Valid @RequestBody ConfirmCurrencyRequest request) {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
@ -136,14 +136,14 @@ public class CurrencyGenerationVerificationController {
} }
@GetMapping("/current") @GetMapping("/current")
@Operation(summary = "查询当前步骤三验证记录", @Operation(summary = "查询当前货币生成的步骤三验证记录",
description = "不传任何业务参数。根据当前Token中的用户、学校和班级查询未逻辑删除的最新步骤三记录返回verificationId及页面完整数据。") description = "不传任何业务参数。根据当前Token中的用户、学校和班级查询未逻辑删除的最新货币生成的步骤三记录返回verificationId及页面完整数据。")
public ApiResponse<CurrencyGenerationVerificationResult> current() { public ApiResponse<CurrencyGenerationVerificationResult> current() {
return ok(service.current(InstitutionKeySubject.from(AuthContextHolder.get()))); return ok(service.current(InstitutionKeySubject.from(AuthContextHolder.get())));
} }
@GetMapping @GetMapping
@Operation(summary = "按编号查询步骤三验证状态和页面完整数据", @Operation(summary = "按编号查询货币生成的步骤三验证状态和页面完整数据",
description = "页面刷新接口;未点击对应按钮的阶段字段返回空值。") description = "页面刷新接口;未点击对应按钮的阶段字段返回空值。")
public ApiResponse<CurrencyGenerationVerificationResult> detail(@RequestParam long verificationId) { public ApiResponse<CurrencyGenerationVerificationResult> detail(@RequestParam long verificationId) {
return ok(service.detail(verificationId, InstitutionKeySubject.from(AuthContextHolder.get()))); return ok(service.detail(verificationId, InstitutionKeySubject.from(AuthContextHolder.get())));

@ -36,7 +36,7 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers") @RequestMapping("/api/v1/institution-identifiers")
@Tag(name = "步骤一:商业银行投放机构标识") @Tag(name = "货币生成的步骤一:商业银行投放机构标识")
public class InstitutionIdentifierController { public class InstitutionIdentifierController {
@Resource @Resource
private InstitutionIdentifierStepService stepService; private InstitutionIdentifierStepService stepService;
@ -51,7 +51,7 @@ public class InstitutionIdentifierController {
@PostMapping("/training/reset") @PostMapping("/training/reset")
@Operation(summary = "重新实现中国人民银行生成数字货币实验", @Operation(summary = "重新实现中国人民银行生成数字货币实验",
description = "按Token中的userId、schoolId、classId逻辑删除当前主体在本实验下的全部步骤业务数据、操作日志、错误记录和成绩进度保留商业银行及央行SM2密钥和密钥审计数据。重置后可从步骤一重新开始。") description = "按Token中的userId、schoolId、classId逻辑删除当前主体在本实验下的全部步骤业务数据、操作日志、错误记录和成绩进度保留商业银行及央行SM2密钥和密钥审计数据。重置后可从货币生成的步骤一重新开始。")
public ApiResponse<InstitutionTrainingResetResult> resetTraining() { public ApiResponse<InstitutionTrainingResetResult> resetTraining() {
return ApiResponse.success(trainingResetService.reset( return ApiResponse.success(trainingResetService.reset(
InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); InstitutionKeySubject.from(AuthContextHolder.get())), traceId());

@ -25,13 +25,13 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/quota-control-bits") @RequestMapping("/api/v1/institution-identifiers/quota-control-bits")
@Tag(name = "步骤八:商业银行生成额度控制位") @Tag(name = "货币生成的步骤八:商业银行生成额度控制位")
public class QuotaControlBitController { public class QuotaControlBitController {
@Resource private QuotaControlBitService service; @Resource private QuotaControlBitService service;
@PostMapping("/steps/static-segment") @PostMapping("/steps/static-segment")
@Operation(summary = "生成静态段", @Operation(summary = "生成静态段",
description = "无需请求体。后端按当前JWT主体读取步骤七金额、机构标识和交易信息标识计算SM3并仅返回staticSegment。") description = "无需请求体。后端按当前JWT主体读取货币生成的步骤七金额、机构标识和交易信息标识计算SM3并仅返回staticSegment。")
public ApiResponse<QuotaControlStaticSegmentResult> staticSegment() { public ApiResponse<QuotaControlStaticSegmentResult> staticSegment() {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
return ApiResponse.success(service.staticSegment( return ApiResponse.success(service.staticSegment(
@ -49,7 +49,7 @@ public class QuotaControlBitController {
@GetMapping("/segments/static") @GetMapping("/segments/static")
@Operation(summary = "查询静态段", @Operation(summary = "查询静态段",
description = "按当前JWT实训主体查询已生成的步骤八静态段仅返回staticSegment不重新计算且不推进状态。") description = "按当前JWT实训主体查询已生成的货币生成的步骤八静态段仅返回staticSegment不重新计算且不推进状态。")
public ApiResponse<QuotaControlStaticSegmentResult> queryStaticSegment() { public ApiResponse<QuotaControlStaticSegmentResult> queryStaticSegment() {
return ApiResponse.success(service.queryStaticSegment( return ApiResponse.success(service.queryStaticSegment(
InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
@ -57,14 +57,14 @@ public class QuotaControlBitController {
@GetMapping("/segments/dynamic") @GetMapping("/segments/dynamic")
@Operation(summary = "查询动态段", @Operation(summary = "查询动态段",
description = "按当前JWT实训主体查询已生成的步骤八动态段仅返回dynamicSegment不重新生成且不推进状态。") description = "按当前JWT实训主体查询已生成的货币生成的步骤八动态段仅返回dynamicSegment不重新生成且不推进状态。")
public ApiResponse<QuotaControlDynamicSegmentResult> queryDynamicSegment() { public ApiResponse<QuotaControlDynamicSegmentResult> queryDynamicSegment() {
return ApiResponse.success(service.queryDynamicSegment( return ApiResponse.success(service.queryDynamicSegment(
InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
} }
@PostMapping("/steps/read-central-bank-signature") @PostMapping("/steps/read-central-bank-signature")
@Operation(summary = "读取步骤七央行控制系统签名段", @Operation(summary = "读取货币生成的步骤七央行控制系统签名段",
description = "成功响应的data仅返回centralBankSignatureSegment。") description = "成功响应的data仅返回centralBankSignatureSegment。")
public ApiResponse<CentralBankSignatureSegmentResult> readCentralBankSignature() { public ApiResponse<CentralBankSignatureSegmentResult> readCentralBankSignature() {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
@ -107,7 +107,7 @@ public class QuotaControlBitController {
} }
@GetMapping @GetMapping
@Operation(summary = "查询步骤八商业银行端完整数据") @Operation(summary = "查询货币生成的步骤八商业银行端完整数据")
public ApiResponse<QuotaControlBitResult> detail() { public ApiResponse<QuotaControlBitResult> detail() {
return ApiResponse.success(service.detail(InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); return ApiResponse.success(service.detail(InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
} }

@ -29,14 +29,14 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/quota-requests") @RequestMapping("/api/v1/institution-identifiers/quota-requests")
@Tag(name = "步骤五:商业银行生成额度请求") @Tag(name = "货币生成的步骤五:商业银行生成额度请求")
public class QuotaRequestController { public class QuotaRequestController {
@Resource @Resource
private TransactionInformationIdentifierService service; private TransactionInformationIdentifierService service;
@GetMapping("/source-data") @GetMapping("/source-data")
@Operation(summary = "查询额度请求前序参数", @Operation(summary = "查询额度请求前序参数",
description = "读取步骤四生成的金额、机构标识和交易信息标识,不推进业务状态。") description = "读取货币生成的步骤四生成的金额、机构标识和交易信息标识,不推进业务状态。")
public ApiResponse<QuotaRequestSourceDataResult> sourceData() { public ApiResponse<QuotaRequestSourceDataResult> sourceData() {
return ApiResponse.success(service.quotaRequestSourceData( return ApiResponse.success(service.quotaRequestSourceData(
InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
@ -44,7 +44,7 @@ public class QuotaRequestController {
@PostMapping("/steps/digest") @PostMapping("/steps/digest")
@Operation(summary = "生成额度请求SM3摘要", @Operation(summary = "生成额度请求SM3摘要",
description = "前端按金额|机构标识|交易信息标识拼接完整原文后提交;后端只校验原文与步骤四数据一致并计算SM3不提供原文拼接接口。") description = "前端按金额|机构标识|交易信息标识拼接完整原文后提交;后端只校验原文与货币生成的步骤四数据一致并计算SM3不提供原文拼接接口。")
public ApiResponse<QuotaRequestDigestResult> digest( public ApiResponse<QuotaRequestDigestResult> digest(
@Valid @RequestBody QuotaRequestDigestRequest request) { @Valid @RequestBody QuotaRequestDigestRequest request) {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();

@ -27,14 +27,14 @@ import javax.validation.Valid;
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/quota-verifications") @RequestMapping("/api/v1/institution-identifiers/quota-verifications")
@Tag(name = "步骤六:验证额度") @Tag(name = "货币生成的步骤六:验证额度")
public class QuotaVerificationController { public class QuotaVerificationController {
@Resource @Resource
private TransactionInformationIdentifierService service; private TransactionInformationIdentifierService service;
@PostMapping("/steps/concatenate-original-text") @PostMapping("/steps/concatenate-original-text")
@Operation(summary = "提取并拼接额度请求原文", @Operation(summary = "提取并拼接额度请求原文",
description = "从央行已接收的步骤五额度请求报文提取amount、orgId、txnId并返回金额|机构标识|交易信息标识;接口只读,不计算哈希、不推进状态。") description = "从央行已接收的货币生成的步骤五额度请求报文提取amount、orgId、txnId并返回金额|机构标识|交易信息标识;接口只读,不计算哈希、不推进状态。")
public ApiResponse<QuotaVerificationOriginalTextResult> originalText() { public ApiResponse<QuotaVerificationOriginalTextResult> originalText() {
return ApiResponse.success(service.quotaVerificationOriginalText( return ApiResponse.success(service.quotaVerificationOriginalText(
InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
@ -42,7 +42,7 @@ public class QuotaVerificationController {
@PostMapping("/steps/hash") @PostMapping("/steps/hash")
@Operation(summary = "对前端拼接原文进行SM3哈希运算", @Operation(summary = "对前端拼接原文进行SM3哈希运算",
description = "前端从步骤五报文提取amount、orgId、txnId并按金额|机构标识|交易信息标识拼接后提交后端校验原文与已接收报文一致计算并持久化H1。") description = "前端从货币生成的步骤五报文提取amount、orgId、txnId并按金额|机构标识|交易信息标识拼接后提交后端校验原文与已接收报文一致计算并持久化H1。")
public ApiResponse<QuotaVerificationHashResult> hash( public ApiResponse<QuotaVerificationHashResult> hash(
@Valid @RequestBody QuotaVerificationHashRequest request) { @Valid @RequestBody QuotaVerificationHashRequest request) {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
@ -62,7 +62,7 @@ public class QuotaVerificationController {
@PostMapping("/steps/compare-digests") @PostMapping("/steps/compare-digests")
@Operation(summary = "比对H1与H2", @Operation(summary = "比对H1与H2",
description = "H1和H2一致且第二公钥验签有效时完成步骤六。") description = "H1和H2一致且第二公钥验签有效时完成货币生成的步骤六。")
public ApiResponse<QuotaVerificationComparisonResult> compareDigests() { public ApiResponse<QuotaVerificationComparisonResult> compareDigests() {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
return ApiResponse.success(service.compareQuotaDigests( return ApiResponse.success(service.compareQuotaDigests(
@ -70,7 +70,7 @@ public class QuotaVerificationController {
} }
@GetMapping @GetMapping
@Operation(summary = "查询步骤六额度验签结果") @Operation(summary = "查询货币生成的步骤六额度验签结果")
public ApiResponse<QuotaVerificationResult> detail() { public ApiResponse<QuotaVerificationResult> detail() {
return ok(service.quotaVerificationDetail(InstitutionKeySubject.from(AuthContextHolder.get()))); return ok(service.quotaVerificationDetail(InstitutionKeySubject.from(AuthContextHolder.get())));
} }

@ -28,13 +28,13 @@ import java.util.List;
@Validated @Validated
@RestController @RestController
@RequestMapping("/api/v1/institution-identifiers/standard-currencies") @RequestMapping("/api/v1/institution-identifiers/standard-currencies")
@Tag(name = "步骤九-生成标准面额币串") @Tag(name = "货币生成的步骤九-生成标准面额币串")
public class StandardCurrencyController { public class StandardCurrencyController {
@Resource private StandardCurrencyService service; @Resource private StandardCurrencyService service;
@PostMapping("/steps/decompose") @PostMapping("/steps/decompose")
@Operation(summary = "执行面额拆解", @Operation(summary = "执行面额拆解",
description = "无需请求体。后端按当前JWT主体查询步骤八已确认额度控制位金额并按100、50、20、10、5、1、0.5、0.2、0.1、0.05、0.01从大到小拆解。") description = "无需请求体。后端按当前JWT主体查询货币生成的步骤八已确认额度控制位金额并按100、50、20、10、5、1、0.5、0.2、0.1、0.05、0.01从大到小拆解。")
public ApiResponse<DenominationDecompositionResult> decompose() { public ApiResponse<DenominationDecompositionResult> decompose() {
JwtUser user = AuthContextHolder.get(); JwtUser user = AuthContextHolder.get();
StandardCurrencyBatchResult result = service.decompose( StandardCurrencyBatchResult result = service.decompose(
@ -70,7 +70,7 @@ public class StandardCurrencyController {
} }
@GetMapping @GetMapping
@Operation(summary = "查询步骤九当前结果") @Operation(summary = "查询货币生成的步骤九当前结果")
public ApiResponse<StandardCurrencyBatchResult> detail() { public ApiResponse<StandardCurrencyBatchResult> detail() {
return ApiResponse.success(service.detail(InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); return ApiResponse.success(service.detail(InstitutionKeySubject.from(AuthContextHolder.get())), traceId());
} }

@ -31,7 +31,7 @@ public class TransactionInformationIdentifierController {
@PostMapping("/steps/digest") @PostMapping("/steps/digest")
@Operation(summary = "使用SM3生成交易信息摘要", @Operation(summary = "使用SM3生成交易信息摘要",
description = "仅要求步骤三已完成确认报文返回。首次正确提交创建步骤四记录;后续正确提交更新同一记录," description = "仅要求货币生成的步骤三已完成确认报文返回。首次正确提交创建货币生成的步骤四记录;后续正确提交更新同一记录,"
+ "不新增数据且允许在组装后重新计算。格式或内容错误时累计一次实训错误并返回“数据拼接错误”。") + "不新增数据且允许在组装后重新计算。格式或内容错误时累计一次实训错误并返回“数据拼接错误”。")
public ApiResponse<TransactionDigestResult> digest( public ApiResponse<TransactionDigestResult> digest(
@Valid @RequestBody GenerateTransactionDigestRequest request) { @Valid @RequestBody GenerateTransactionDigestRequest request) {

Loading…
Cancel
Save