package com.yau.digitalrmb.shared.wallet; import com.yau.digitalrmb.identity.domain.UserRole; import com.yau.digitalrmb.institutionidentity.application.InstitutionKeySubject; import com.yau.digitalrmb.security.context.AuthContextHolder; import com.yau.digitalrmb.security.context.JwtUser; import com.yau.digitalrmb.shared.api.ErrorCode; import com.yau.digitalrmb.shared.exception.BusinessException; 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/wallet-runtime") @Tag(name = "钱包运行数据-彻底重开", description = "清空兑换/支付历史并重建模块三投影(教师/管理员专用)") public class WalletRuntimeResetController { @Resource private WalletRuntimeResetService resetService; @PostMapping("/reset") @Operation(summary = "彻底重开兑换与支付实验", description = "删除当前用户的全部兑换/支付订单与流水(含已确权完成的),把涉及币串回退到商业银行库," + "并清空模块三投影出的共享钱包/银行账户/证书/合约/绑定与实验attempt," + "随后立即按最新模块三结果重新投影,模块四/五可直接重新开始。仅教师和管理员可调用。") public ApiResponse reset() { JwtUser jwtUser = AuthContextHolder.get(); Integer roleId = jwtUser.getRoleId(); if (roleId == null || (roleId != UserRole.ADMIN.getId() && roleId != UserRole.TEACHER.getId())) { throw new BusinessException(ErrorCode.FORBIDDEN, "仅教师或管理员可以彻底重开兑换与支付实验"); } return ApiResponse.success(resetService.reset(InstitutionKeySubject.from(jwtUser)), traceId()); } private String traceId() { return MDC.get(TraceIdFilter.MDC_KEY); } }