diff --git a/src/main/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetResult.java b/src/main/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetResult.java new file mode 100644 index 0000000..45ca4bd --- /dev/null +++ b/src/main/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetResult.java @@ -0,0 +1,21 @@ +package com.yau.digitalrmb.corporatewallet.application; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +@Getter +@Schema(description = "模块六创新应用场景重新实训结果") +public class CorporateInnovationTrainingResetResult { + @Schema(description = "是否重置成功") + private final boolean reset; + @Schema(description = "逻辑删除的业务记录总数") + private final int deletedRecordCount; + @Schema(description = "处理说明") + private final String message; + + public CorporateInnovationTrainingResetResult(int deletedRecordCount) { + this.reset = true; + this.deletedRecordCount = deletedRecordCount; + this.message = "数字人民币创新应用场景步骤数据已逻辑删除,可从模块六第一步重新开始"; + } +} diff --git a/src/main/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetService.java b/src/main/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetService.java new file mode 100644 index 0000000..10e5bfa --- /dev/null +++ b/src/main/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetService.java @@ -0,0 +1,70 @@ +package com.yau.digitalrmb.corporatewallet.application; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.yau.digitalrmb.corporatewallet.infrastructure.CorporateWalletApplicationEntity; +import com.yau.digitalrmb.corporatewallet.infrastructure.CorporateWalletApplicationMapper; +import com.yau.digitalrmb.corporatewallet.infrastructure.RemoteWalletApplicationEntity; +import com.yau.digitalrmb.corporatewallet.infrastructure.RemoteWalletApplicationMapper; +import com.yau.digitalrmb.corporatewallet.infrastructure.SalaryBatchEntity; +import com.yau.digitalrmb.corporatewallet.infrastructure.SalaryBatchMapper; +import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; +import com.yau.digitalrmb.institutionidentity.infrastructure.StuModuleScoreDetailsEntity; +import com.yau.digitalrmb.institutionidentity.infrastructure.StuModuleScoreDetailsMapper; +import com.yau.digitalrmb.progress.application.UserStepProgressNewService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class CorporateInnovationTrainingResetService { + private static final String TRAINING_ID = "innovation-scene"; + + @Resource private CorporateWalletApplicationMapper corporateWalletMapper; + @Resource private RemoteWalletApplicationMapper remoteWalletMapper; + @Resource private SalaryBatchMapper salaryBatchMapper; + @Resource private StuModuleScoreDetailsMapper scoreDetailsMapper; + @Resource private UserStepProgressNewService stepProgressService; + + @Transactional + public CorporateInnovationTrainingResetResult reset(InstitutionKeySubject subject) { + int count = 0; + count += logicalDeleteCorporateWalletApplications(subject); + count += logicalDeleteRemoteWalletApplications(subject); + count += logicalDeleteSalaryBatches(subject); + count += logicalDeleteScore(subject.getUserId()); + stepProgressService.reset(subject.getUserId(), TRAINING_ID); + return new CorporateInnovationTrainingResetResult(count); + } + + private int logicalDeleteCorporateWalletApplications(InstitutionKeySubject subject) { + return corporateWalletMapper.update(null, new LambdaUpdateWrapper() + .eq(CorporateWalletApplicationEntity::getUserId, subject.getUserId()) + .eq(CorporateWalletApplicationEntity::getSchoolId, subject.getSchoolId()) + .eq(CorporateWalletApplicationEntity::getClassId, subject.getClassId()) + .set(CorporateWalletApplicationEntity::getDeleted, true)); + } + + private int logicalDeleteRemoteWalletApplications(InstitutionKeySubject subject) { + return remoteWalletMapper.update(null, new LambdaUpdateWrapper() + .eq(RemoteWalletApplicationEntity::getUserId, subject.getUserId()) + .eq(RemoteWalletApplicationEntity::getSchoolId, subject.getSchoolId()) + .eq(RemoteWalletApplicationEntity::getClassId, subject.getClassId()) + .set(RemoteWalletApplicationEntity::getDeleted, true)); + } + + private int logicalDeleteSalaryBatches(InstitutionKeySubject subject) { + return salaryBatchMapper.update(null, new LambdaUpdateWrapper() + .eq(SalaryBatchEntity::getUserId, subject.getUserId()) + .eq(SalaryBatchEntity::getSchoolId, subject.getSchoolId()) + .eq(SalaryBatchEntity::getClassId, subject.getClassId()) + .set(SalaryBatchEntity::getDeleted, true)); + } + + private int logicalDeleteScore(String userId) { + return scoreDetailsMapper.update(null, new LambdaUpdateWrapper() + .eq(StuModuleScoreDetailsEntity::getUserId, userId) + .eq(StuModuleScoreDetailsEntity::getMoudule, SalaryScoreService.MODULE_NAME) + .set(StuModuleScoreDetailsEntity::getDeleted, true)); + } +} diff --git a/src/main/java/com/yau/digitalrmb/corporatewallet/interfaces/rest/CorporateInnovationTrainingResetController.java b/src/main/java/com/yau/digitalrmb/corporatewallet/interfaces/rest/CorporateInnovationTrainingResetController.java new file mode 100644 index 0000000..d7c0eaa --- /dev/null +++ b/src/main/java/com/yau/digitalrmb/corporatewallet/interfaces/rest/CorporateInnovationTrainingResetController.java @@ -0,0 +1,35 @@ +package com.yau.digitalrmb.corporatewallet.interfaces.rest; + +import com.yau.digitalrmb.corporatewallet.application.CorporateInnovationTrainingResetResult; +import com.yau.digitalrmb.corporatewallet.application.CorporateInnovationTrainingResetService; +import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; +import com.yau.digitalrmb.security.context.AuthContextHolder; +import com.yau.digitalrmb.shared.api.ApiResponse; +import com.yau.digitalrmb.shared.web.TraceIdFilter; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.MDC; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/v1/corporate-wallet/training") +@Tag(name = "模块六:数字人民币创新应用场景实验管理") +public class CorporateInnovationTrainingResetController { + @Resource private CorporateInnovationTrainingResetService resetService; + + @PostMapping("/reset") + @Operation(summary = "重新开始数字人民币创新应用场景实验", + description = "逻辑删除当前主体的对公钱包申请、工资批次、模块六成绩和步骤进度;保留模块六密钥,可从模块六第一步重新开始。") + public ApiResponse reset() { + return ApiResponse.success(resetService.reset( + InstitutionKeySubject.from(AuthContextHolder.get())), traceId()); + } + + private String traceId() { + return MDC.get(TraceIdFilter.MDC_KEY); + } +} diff --git a/src/test/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetServiceTest.java b/src/test/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetServiceTest.java new file mode 100644 index 0000000..029dbda --- /dev/null +++ b/src/test/java/com/yau/digitalrmb/corporatewallet/application/CorporateInnovationTrainingResetServiceTest.java @@ -0,0 +1,62 @@ +package com.yau.digitalrmb.corporatewallet.application; + +import com.yau.digitalrmb.corporatewallet.infrastructure.CorporateWalletApplicationMapper; +import com.yau.digitalrmb.corporatewallet.infrastructure.CorporateWalletApplicationEntity; +import com.yau.digitalrmb.corporatewallet.infrastructure.RemoteWalletApplicationEntity; +import com.yau.digitalrmb.corporatewallet.infrastructure.RemoteWalletApplicationMapper; +import com.yau.digitalrmb.corporatewallet.infrastructure.SalaryBatchEntity; +import com.yau.digitalrmb.corporatewallet.infrastructure.SalaryBatchMapper; +import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; +import com.yau.digitalrmb.institutionidentity.infrastructure.StuModuleScoreDetailsMapper; +import com.yau.digitalrmb.institutionidentity.infrastructure.StuModuleScoreDetailsEntity; +import com.yau.digitalrmb.progress.application.UserStepProgressNewService; +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import org.apache.ibatis.builder.MapperBuilderAssistant; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class CorporateInnovationTrainingResetServiceTest { + private static final InstitutionKeySubject SUBJECT = + new InstitutionKeySubject("reset-user", 1001L, 2001L); + + @Mock private CorporateWalletApplicationMapper corporateWalletMapper; + @Mock private RemoteWalletApplicationMapper remoteWalletMapper; + @Mock private SalaryBatchMapper salaryBatchMapper; + @Mock private StuModuleScoreDetailsMapper scoreDetailsMapper; + @Mock private UserStepProgressNewService stepProgressService; + @InjectMocks private CorporateInnovationTrainingResetService service; + + @BeforeAll + static void initializeMybatisLambdaMetadata() { + MapperBuilderAssistant assistant = new MapperBuilderAssistant(new MybatisConfiguration(), ""); + TableInfoHelper.initTableInfo(assistant, CorporateWalletApplicationEntity.class); + TableInfoHelper.initTableInfo(assistant, RemoteWalletApplicationEntity.class); + TableInfoHelper.initTableInfo(assistant, SalaryBatchEntity.class); + TableInfoHelper.initTableInfo(assistant, StuModuleScoreDetailsEntity.class); + } + + @Test + void resetsModuleSixBusinessDataScoreAndNavigationProgress() { + when(corporateWalletMapper.update(any(), any())).thenReturn(2); + when(remoteWalletMapper.update(any(), any())).thenReturn(3); + when(salaryBatchMapper.update(any(), any())).thenReturn(4); + when(scoreDetailsMapper.update(any(), any())).thenReturn(1); + + CorporateInnovationTrainingResetResult result = service.reset(SUBJECT); + + assertThat(result.isReset()).isTrue(); + assertThat(result.getDeletedRecordCount()).isEqualTo(10); + verify(stepProgressService).reset("reset-user", "innovation-scene"); + } +}