刘光辉
5 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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<List<TmsQuestionBankOption>> banks() {
        return ActionResult.success(questionService.listBanks());
    }
 
    @Operation(summary = "管理员下拉")
    @GetMapping("/admins")
    public ActionResult<List<Map<String, String>>> admins() {
        return ActionResult.success(questionService.listAdmins());
    }
 
    @Operation(summary = "试题分页列表")
    @GetMapping("/list")
    public ActionResult<PageListVO<TmsQuestionForm>> list(TmsQuestionQuery query) {
        List<TmsQuestionForm> list = questionService.getList(query);
        PageListVO<TmsQuestionForm> 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<TmsQuestionImportResult> 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<TmsQuestionForm> info(@PathVariable("id") String id) {
        return ActionResult.success(questionService.getInfo(id));
    }
 
    @HandleLog(moduleName = "试题管理", requestMethod = "新增")
    @Operation(summary = "新增试题")
    @PostMapping
    public ActionResult<String> create(@RequestBody TmsQuestionForm form) {
        return ActionResult.success(questionService.create(form));
    }
 
    @HandleLog(moduleName = "试题管理", requestMethod = "修改")
    @Operation(summary = "更新试题")
    @PutMapping("/{id}")
    public ActionResult<String> 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<String> invalidate(@PathVariable("id") String id) {
        questionService.invalidate(id);
        return ActionResult.success("废弃成功");
    }
 
    @HandleLog(moduleName = "试题管理", requestMethod = "状态变更")
    @Operation(summary = "启用/停用试题(开放/不开放)")
    @PutMapping("/{id}/status")
    public ActionResult<String> status(@PathVariable("id") String id, @RequestBody Map<String, String> body) {
        questionService.setBizStatus(id, body == null ? null : body.get("bizStatus"));
        return ActionResult.success("操作成功");
    }
 
    @HandleLog(moduleName = "试题管理", requestMethod = "废弃")
    @Operation(summary = "废弃试题(逻辑删除)")
    @DeleteMapping("/{id}")
    public ActionResult<String> delete(@PathVariable("id") String id) {
        questionService.invalidate(id);
        return ActionResult.success("废弃成功");
    }
}