package jnpf.tmsController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jnpf.annotation.HandleLog; import jnpf.base.ActionResult; import jnpf.base.vo.PageListVO; import jnpf.base.vo.PaginationVO; import jnpf.exception.DataException; import jnpf.tmsEntity.question.TmsQuestionBankOption; import jnpf.tmsEntity.question.TmsQuestionExportForm; import jnpf.tmsEntity.question.TmsQuestionForm; import jnpf.tmsEntity.question.TmsQuestionImportResult; import jnpf.tmsEntity.question.TmsQuestionQuery; import jnpf.tmsService.TmsQuestionService; import jnpf.util.JsonUtil; import jnpf.util.StringUtil; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; /** * 试题 CRUD。网关 /api/tms/question/** (StripPrefix=2)→ /question/** */ @Tag(name = "TMS试题", description = "Question") @RestController @RequestMapping("/question") @RequiredArgsConstructor public class TmsQuestionController { private final TmsQuestionService questionService; @Operation(summary = "题库下拉") @GetMapping("/banks") public ActionResult> banks() { return ActionResult.success(questionService.listBanks()); } @Operation(summary = "管理员下拉") @GetMapping("/admins") public ActionResult>> admins() { return ActionResult.success(questionService.listAdmins()); } @Operation(summary = "试题分页列表") @GetMapping("/list") public ActionResult> list(TmsQuestionQuery query) { List list = questionService.getList(query); PageListVO vo = new PageListVO<>(); vo.setList(list); vo.setPagination(JsonUtil.getJsonToBean(query, PaginationVO.class)); return ActionResult.success(vo); } @Operation(summary = "下载试题导入模板") @GetMapping("/import/template") public void importTemplate(HttpServletResponse response) { questionService.downloadImportTemplate(response); } @HandleLog(moduleName = "试题管理", requestMethod = "导出") @Operation(summary = "导出试题(勾选或按筛选)") @PostMapping("/export") public void export(@RequestBody(required = false) TmsQuestionExportForm form, HttpServletResponse response) { questionService.exportExcel(form, response); } @HandleLog(moduleName = "试题管理", requestMethod = "导入") @Operation(summary = "批量导入试题") @PostMapping("/import") public ActionResult importExcel(@RequestParam("file") MultipartFile file) { if (file == null || file.isEmpty()) { throw new DataException("请上传导入文件"); } String name = file.getOriginalFilename(); if (StringUtil.isNotEmpty(name)) { String lower = name.toLowerCase(); if (!(lower.endsWith(".xls") || lower.endsWith(".xlsx") || lower.endsWith(".csv"))) { throw new DataException("仅支持 xls / xlsx / csv 文件"); } } try { return ActionResult.success(questionService.importExcel(file.getBytes(), name)); } catch (DataException e) { throw e; } catch (Exception e) { throw new DataException("读取导入文件失败"); } } @Operation(summary = "试题详情") @GetMapping("/{id}") public ActionResult info(@PathVariable("id") String id) { return ActionResult.success(questionService.getInfo(id)); } @HandleLog(moduleName = "试题管理", requestMethod = "新增") @Operation(summary = "新增试题") @PostMapping public ActionResult create(@RequestBody TmsQuestionForm form) { return ActionResult.success(questionService.create(form)); } @HandleLog(moduleName = "试题管理", requestMethod = "修改") @Operation(summary = "更新试题") @PutMapping("/{id}") public ActionResult update(@PathVariable("id") String id, @RequestBody TmsQuestionForm form) { questionService.update(id, form); return ActionResult.success("更新成功"); } @HandleLog(moduleName = "试题管理", requestMethod = "废弃") @Operation(summary = "废弃试题(逻辑删除)") @PutMapping("/{id}/invalidate") public ActionResult invalidate(@PathVariable("id") String id) { questionService.invalidate(id); return ActionResult.success("废弃成功"); } @HandleLog(moduleName = "试题管理", requestMethod = "状态变更") @Operation(summary = "启用/停用试题(开放/不开放)") @PutMapping("/{id}/status") public ActionResult status(@PathVariable("id") String id, @RequestBody Map body) { questionService.setBizStatus(id, body == null ? null : body.get("bizStatus")); return ActionResult.success("操作成功"); } @HandleLog(moduleName = "试题管理", requestMethod = "废弃") @Operation(summary = "废弃试题(逻辑删除)") @DeleteMapping("/{id}") public ActionResult delete(@PathVariable("id") String id) { questionService.invalidate(id); return ActionResult.success("废弃成功"); } }