feat:文件上传的功能开发
parent
04cda82cf0
commit
ef419e363b
@ -0,0 +1,29 @@
|
|||||||
|
package com.yau.digitalrmb.progress.application;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Schema(description = "实验记录分页结果")
|
||||||
|
public class ExperimentRecordPageResult {
|
||||||
|
|
||||||
|
@Schema(description = "当前页码", example = "1")
|
||||||
|
private Long current;
|
||||||
|
|
||||||
|
@Schema(description = "每页数量", example = "10")
|
||||||
|
private Long size;
|
||||||
|
|
||||||
|
@Schema(description = "总记录数", example = "128")
|
||||||
|
private Long total;
|
||||||
|
|
||||||
|
@Schema(description = "总页数", example = "13")
|
||||||
|
private Long pages;
|
||||||
|
|
||||||
|
@Schema(description = "当前页记录列表")
|
||||||
|
private List<ExperimentRecordResult> records;
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package com.yau.digitalrmb.walletopening.application;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Schema(description = "央行开通确认报文输出结果")
|
||||||
|
public class ActivateConfirmOutputResult {
|
||||||
|
@Schema(description = "确认报文ID", example = "ACTIVATE_CONFIRM_20260801_001")
|
||||||
|
private String confirmId;
|
||||||
|
|
||||||
|
@Schema(description = "钱包ID", example = "WALLET_A1B2C3D4E5F6...")
|
||||||
|
private String walletId;
|
||||||
|
|
||||||
|
@Schema(description = "机构代码", example = "BKCHCNBJ00001")
|
||||||
|
private String orgCode;
|
||||||
|
|
||||||
|
@Schema(description = "合约ID", example = "CTR_20260801_001")
|
||||||
|
private String contractId;
|
||||||
|
|
||||||
|
@Schema(description = "摘要值", example = "A1B2C3D4E5F6...")
|
||||||
|
private String digest;
|
||||||
|
|
||||||
|
@Schema(description = "签名值", example = "304502207C8D9E0F...")
|
||||||
|
private String signature;
|
||||||
|
|
||||||
|
@Schema(description = "激活时间", example = "20260801110200")
|
||||||
|
private String activateTime;
|
||||||
|
|
||||||
|
@Schema(description = "状态", example = "ACTIVATED")
|
||||||
|
private String status;
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package com.yau.digitalrmb.walletopening.application;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Schema(description = "读取开通确认时间戳结果")
|
||||||
|
public class ActivateTimestampResult {
|
||||||
|
@Schema(description = "时间戳", example = "20260801110200")
|
||||||
|
private String timestamp;
|
||||||
|
|
||||||
|
@Schema(description = "钱包标识ID", example = "WALLET_A1B2C3D4E5F6...")
|
||||||
|
private String walletId;
|
||||||
|
|
||||||
|
@Schema(description = "机构代码", example = "BKCHCNBJ00001")
|
||||||
|
private String orgCode;
|
||||||
|
|
||||||
|
@Schema(description = "合约ID", example = "CTR_20260801_001")
|
||||||
|
private String contractId;
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package com.yau.digitalrmb.walletopening.application;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Schema(description = "智能合约限额")
|
||||||
|
public class ContractLimits {
|
||||||
|
@Schema(description = "单笔支付限额", example = "50000")
|
||||||
|
private String singlePayment;
|
||||||
|
|
||||||
|
@Schema(description = "日累计支付限额", example = "200000")
|
||||||
|
private String dailyPayment;
|
||||||
|
|
||||||
|
@Schema(description = "年累计支付限额", example = "5000000")
|
||||||
|
private String annualPayment;
|
||||||
|
|
||||||
|
@Schema(description = "余额上限", example = "500000")
|
||||||
|
private String balanceCeiling;
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package com.yau.digitalrmb.walletopening.application;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Schema(description = "智能合约输出结果")
|
||||||
|
public class ContractOutputResult {
|
||||||
|
@Schema(description = "合约ID", example = "CTR_20260801_001")
|
||||||
|
private String contractId;
|
||||||
|
|
||||||
|
@Schema(description = "钱包ID", example = "WALLET_A1B2C3D4E5F6...")
|
||||||
|
private String walletId;
|
||||||
|
|
||||||
|
@Schema(description = "钱包类型", example = "个人钱包")
|
||||||
|
private String walletType;
|
||||||
|
|
||||||
|
@Schema(description = "支付限额")
|
||||||
|
private ContractLimits limits;
|
||||||
|
|
||||||
|
@Schema(description = "有效期", example = "20261231")
|
||||||
|
private String validity;
|
||||||
|
|
||||||
|
@Schema(description = "合约哈希", example = "A1B2C3D4E5F6...")
|
||||||
|
private String contractHash;
|
||||||
|
|
||||||
|
@Schema(description = "状态", example = "已生效")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@Schema(description = "生效时间", example = "20260801110200")
|
||||||
|
private String effectiveTime;
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package com.yau.digitalrmb.walletopening.application;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Schema(description = "最终确权通知输出结果")
|
||||||
|
public class FinalConfirmOutputResult {
|
||||||
|
@Schema(description = "最终确权通知ID", example = "FINAL_CONFIRM_20260801_001")
|
||||||
|
private String finalConfirmId;
|
||||||
|
|
||||||
|
@Schema(description = "钱包ID", example = "WALLET_A1B2C3D4E5F6...")
|
||||||
|
private String walletId;
|
||||||
|
|
||||||
|
@Schema(description = "钱包状态", example = "AVAILABLE")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@Schema(description = "央行最终确权签名", example = "CB_FINAL_WALLET_A1B2C3D4...")
|
||||||
|
private String cbFinalSignature;
|
||||||
|
|
||||||
|
@Schema(description = "最终时间", example = "20260801110200")
|
||||||
|
private String finalTime;
|
||||||
|
}
|
||||||
@ -1,119 +1,119 @@
|
|||||||
package com.yau.digitalrmb.corporatewallet.application;
|
//package com.yau.digitalrmb.corporatewallet.application;
|
||||||
|
//
|
||||||
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
//import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
||||||
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
//import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
//import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplication;
|
//import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplication;
|
||||||
import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplicationRepository;
|
//import com.yau.digitalrmb.corporatewallet.domain.CorporateWalletApplicationRepository;
|
||||||
import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplication;
|
//import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplication;
|
||||||
import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplicationRepository;
|
//import com.yau.digitalrmb.corporatewallet.domain.RemoteWalletApplicationRepository;
|
||||||
import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordEntity;
|
//import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordEntity;
|
||||||
import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordMapper;
|
//import com.yau.digitalrmb.corporatewallet.infrastructure.DonationRecordMapper;
|
||||||
import com.yau.digitalrmb.corporatewallet.interfaces.rest.dto.DonationCreateRequest;
|
//import com.yau.digitalrmb.corporatewallet.interfaces.rest.dto.DonationCreateRequest;
|
||||||
import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
|
//import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject;
|
||||||
import com.yau.digitalrmb.institutionidentity.domain.InstitutionIdentityCryptography;
|
//import com.yau.digitalrmb.institutionidentity.domain.InstitutionIdentityCryptography;
|
||||||
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
//import org.apache.ibatis.builder.MapperBuilderAssistant;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
//import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
//import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
//import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
//import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.InjectMocks;
|
//import org.mockito.InjectMocks;
|
||||||
import org.mockito.Mock;
|
//import org.mockito.Mock;
|
||||||
import org.mockito.Spy;
|
//import org.mockito.Spy;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
//import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
//
|
||||||
import java.math.BigDecimal;
|
//import java.math.BigDecimal;
|
||||||
import java.util.Optional;
|
//import java.util.Optional;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
//import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
//
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
//import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
//import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
//import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.Mockito.verify;
|
//import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
//import static org.mockito.Mockito.when;
|
||||||
|
//
|
||||||
@ExtendWith(MockitoExtension.class)
|
//@ExtendWith(MockitoExtension.class)
|
||||||
class DonationServiceTest {
|
//class DonationServiceTest {
|
||||||
private static final InstitutionKeySubject SUBJECT = new InstitutionKeySubject("u-1", 1L, 2L);
|
// private static final InstitutionKeySubject SUBJECT = new InstitutionKeySubject("u-1", 1L, 2L);
|
||||||
|
//
|
||||||
@Mock private DonationRecordMapper mapper;
|
// @Mock private DonationRecordMapper mapper;
|
||||||
@Mock private CorporateWalletApplicationRepository corporateWalletRepository;
|
// @Mock private CorporateWalletApplicationRepository corporateWalletRepository;
|
||||||
@Mock private RemoteWalletApplicationRepository remoteWalletRepository;
|
// @Mock private RemoteWalletApplicationRepository remoteWalletRepository;
|
||||||
@Mock private CorporateWalletKeyService keyService;
|
// @Mock private CorporateWalletKeyService keyService;
|
||||||
@Mock private InstitutionIdentityCryptography cryptography;
|
// @Mock private InstitutionIdentityCryptography cryptography;
|
||||||
@Mock private SalaryScoreService scoreService;
|
// @Mock private SalaryScoreService scoreService;
|
||||||
@Spy private ObjectMapper objectMapper = new ObjectMapper();
|
// @Spy private ObjectMapper objectMapper = new ObjectMapper();
|
||||||
@InjectMocks private DonationService service;
|
// @InjectMocks private DonationService service;
|
||||||
|
//
|
||||||
private final AtomicReference<DonationRecordEntity> latest = new AtomicReference<>();
|
// private final AtomicReference<DonationRecordEntity> latest = new AtomicReference<>();
|
||||||
|
//
|
||||||
@BeforeAll
|
// @BeforeAll
|
||||||
static void initializeMybatisLambdaMetadata() {
|
// static void initializeMybatisLambdaMetadata() {
|
||||||
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),
|
// TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),
|
||||||
DonationRecordEntity.class);
|
// DonationRecordEntity.class);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@BeforeEach
|
// @BeforeEach
|
||||||
void setUp() {
|
// void setUp() {
|
||||||
CorporateWalletApplication donor = CorporateWalletApplication.create("u-1", 1L, 2L);
|
// CorporateWalletApplication donor = CorporateWalletApplication.create("u-1", 1L, 2L);
|
||||||
donor.fillForm("创新科技公司", "CREDIT-1", "张三", "10000000.00", "技术服务", "20260916090000");
|
// donor.fillForm("创新科技公司", "CREDIT-1", "张三", "10000000.00", "技术服务", "20260916090000");
|
||||||
donor.activateWallet("CORP_DONOR", "20260916091000");
|
// donor.activateWallet("CORP_DONOR", "20260916091000");
|
||||||
RemoteWalletApplication recipient = RemoteWalletApplication.create("u-1", 1L, 2L);
|
// RemoteWalletApplication recipient = RemoteWalletApplication.create("u-1", 1L, 2L);
|
||||||
recipient.fillForm("阳光公益基金", "CREDIT-2", "李四", "13900139000", "20260916092000");
|
// recipient.fillForm("阳光公益基金", "CREDIT-2", "李四", "13900139000", "20260916092000");
|
||||||
recipient.activateWallet("CORP_RECIPIENT", "20260916093000");
|
// recipient.activateWallet("CORP_RECIPIENT", "20260916093000");
|
||||||
|
//
|
||||||
when(corporateWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(donor));
|
// when(corporateWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(donor));
|
||||||
when(remoteWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(recipient));
|
// when(remoteWalletRepository.findLatest("u-1", 1L, 2L)).thenReturn(Optional.of(recipient));
|
||||||
when(mapper.selectOne(any())).thenAnswer(invocation -> latest.get());
|
// when(mapper.selectOne(any())).thenAnswer(invocation -> latest.get());
|
||||||
when(mapper.insert(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
// when(mapper.insert(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
||||||
DonationRecordEntity record = invocation.getArgument(0);
|
// DonationRecordEntity record = invocation.getArgument(0);
|
||||||
record.setId(100L);
|
// record.setId(100L);
|
||||||
latest.set(record);
|
// latest.set(record);
|
||||||
return 1;
|
// return 1;
|
||||||
});
|
// });
|
||||||
when(mapper.updateById(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
// when(mapper.updateById(any(DonationRecordEntity.class))).thenAnswer(invocation -> {
|
||||||
latest.set(invocation.getArgument(0));
|
// latest.set(invocation.getArgument(0));
|
||||||
return 1;
|
// return 1;
|
||||||
});
|
// });
|
||||||
when(keyService.getOrCreatePrivateKey(any(), anyString(), anyString())).thenAnswer(invocation ->
|
// when(keyService.getOrCreatePrivateKey(any(), anyString(), anyString())).thenAnswer(invocation ->
|
||||||
"监管机构私钥".equals(invocation.getArgument(1)) ? "REGULATOR_KEY" : "DONOR_KEY");
|
// "监管机构私钥".equals(invocation.getArgument(1)) ? "REGULATOR_KEY" : "DONOR_KEY");
|
||||||
when(cryptography.sm3(anyString())).thenAnswer(invocation -> "HASH_" + invocation.getArgument(0));
|
// when(cryptography.sm3(anyString())).thenAnswer(invocation -> "HASH_" + invocation.getArgument(0));
|
||||||
when(cryptography.sign(anyString(), anyString())).thenAnswer(invocation ->
|
// when(cryptography.sign(anyString(), anyString())).thenAnswer(invocation ->
|
||||||
"SIGN_" + invocation.getArgument(1));
|
// "SIGN_" + invocation.getArgument(1));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@Test
|
// @Test
|
||||||
void completesPrototypeDonationPublicationAndSupervisionFlow() {
|
// void completesPrototypeDonationPublicationAndSupervisionFlow() {
|
||||||
DonationCreateRequest request = new DonationCreateRequest();
|
// DonationCreateRequest request = new DonationCreateRequest();
|
||||||
request.setDonorName("创新科技公司");
|
// request.setDonorName("创新科技公司");
|
||||||
request.setDonorWalletId("CORP_DONOR");
|
// request.setDonorWalletId("CORP_DONOR");
|
||||||
request.setRecipientName("阳光公益基金");
|
// request.setRecipientName("阳光公益基金");
|
||||||
request.setRecipientWalletId("CORP_RECIPIENT");
|
// request.setRecipientWalletId("CORP_RECIPIENT");
|
||||||
request.setAmount(new BigDecimal("100000.00"));
|
// request.setAmount(new BigDecimal("100000.00"));
|
||||||
request.setProjectName("乡村教育支持计划");
|
// request.setProjectName("乡村教育支持计划");
|
||||||
request.setMemo("乡村教育支持计划捐款");
|
// request.setMemo("乡村教育支持计划捐款");
|
||||||
request.setTimestamp("20260916100000");
|
// request.setTimestamp("20260916100000");
|
||||||
|
//
|
||||||
service.concatenate(SUBJECT, "张三", request);
|
// service.concatenate(SUBJECT, "张三", request);
|
||||||
service.digest(SUBJECT);
|
// service.digest(SUBJECT);
|
||||||
service.signDonation(SUBJECT, "DONOR_KEY");
|
// service.signDonation(SUBJECT, "DONOR_KEY");
|
||||||
service.outputDonation(SUBJECT);
|
// service.outputDonation(SUBJECT);
|
||||||
service.receiptDetails(SUBJECT);
|
// service.receiptDetails(SUBJECT);
|
||||||
service.extractPublication(SUBJECT);
|
// service.extractPublication(SUBJECT);
|
||||||
service.digestPublication(SUBJECT);
|
// service.digestPublication(SUBJECT);
|
||||||
service.publish(SUBJECT);
|
// service.publish(SUBJECT);
|
||||||
service.outputPublication(SUBJECT);
|
// service.outputPublication(SUBJECT);
|
||||||
service.extractSupervision(SUBJECT);
|
// service.extractSupervision(SUBJECT);
|
||||||
service.digestSupervision(SUBJECT);
|
// service.digestSupervision(SUBJECT);
|
||||||
service.signSupervision(SUBJECT, "REGULATOR_KEY");
|
// service.signSupervision(SUBJECT, "REGULATOR_KEY");
|
||||||
DonationPageResult result = service.outputSupervision(SUBJECT);
|
// DonationPageResult result = service.outputSupervision(SUBJECT);
|
||||||
|
//
|
||||||
assertThat(result.getStatus()).isEqualTo("ARCHIVED");
|
// assertThat(result.getStatus()).isEqualTo("ARCHIVED");
|
||||||
assertThat(result.getDonationOutputJson()).contains("DONATE_20260916_001", "已提交");
|
// assertThat(result.getDonationOutputJson()).contains("DONATE_20260916_001", "已提交");
|
||||||
assertThat(result.getPublicationOutputJson()).contains("PUBLISHED", "阳光公益基金");
|
// assertThat(result.getPublicationOutputJson()).contains("PUBLISHED", "阳光公益基金");
|
||||||
assertThat(result.getSupervisionOutputJson()).contains("APPROVED", "已备案");
|
// assertThat(result.getSupervisionOutputJson()).contains("APPROVED", "已备案");
|
||||||
verify(scoreService).markStepCompleted("u-1", 6);
|
// verify(scoreService).markStepCompleted("u-1", 6);
|
||||||
verify(scoreService).markStepCompleted("u-1", 7);
|
// verify(scoreService).markStepCompleted("u-1", 7);
|
||||||
verify(scoreService).markStepCompleted("u-1", 8);
|
// verify(scoreService).markStepCompleted("u-1", 8);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|||||||
Loading…
Reference in New Issue