liu
2026-09-22 0837c3ff473499d8a267924125c776b34cc8b517
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
package com.ruoyi.system.controller;
 
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.CjClass;
import com.ruoyi.system.domain.CjCollege;
import com.ruoyi.system.domain.CjMajor;
import com.ruoyi.system.mapper.CjClassMapper;
import com.ruoyi.system.mapper.CjCollegeMapper;
import com.ruoyi.system.mapper.CjMajorMapper;
import com.ruoyi.system.mapper.CjStudentMapper;
import com.ruoyi.system.service.ICjClassService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
 
/**
 * 班级Controller
 *
 * @author ruoyi
 * @date 2026-09-03
 */
@RestController
@RequestMapping("/system/class")
public class CjClassController extends BaseController
{
    @Autowired
    private ICjClassService cjClassService;
    @Autowired
    private CjCollegeMapper cjCollegeMapper;
    @Autowired
    private CjMajorMapper cjMajorMapper;
    @Autowired
    private CjStudentMapper cjStudentMapper;
    @Autowired
    private CjClassMapper cjClassMapper;
 
    /**
     * 回填所属学院/专业名称(transient,供列表/导出展示)
     */
    private void fillNames(List<CjClass> classes)
    {
        if (classes == null || classes.isEmpty())
        {
            return;
        }
        Map<Long, String> collegeMap = new HashMap<>();
        List<CjCollege> colleges = cjCollegeMapper.selectCjCollegeList(new CjCollege());
        if (colleges != null)
        {
            for (CjCollege c : colleges)
            {
                collegeMap.put(c.getCollegeId(), c.getCollegeName());
            }
        }
        Map<Long, CjMajor> majorMap = new HashMap<>();
        List<CjMajor> majors = cjMajorMapper.selectCjMajorList(new CjMajor());
        if (majors != null)
        {
            for (CjMajor m : majors)
            {
                majorMap.put(m.getMajorId(), m);
            }
        }
        for (CjClass c : classes)
        {
            if (c.getMajorId() != null)
            {
                CjMajor m = majorMap.get(c.getMajorId());
                if (m != null)
                {
                    c.setMajorName(m.getMajorName());
                    if (m.getCollegeId() != null)
                    {
                        c.setCollegeName(collegeMap.get(m.getCollegeId()));
                    }
                }
            }
        }
    }
 
    /**
     * 查询班级列表
     */
    @PreAuthorize("@ss.hasPermi('system:class:list')")
    @GetMapping("/list")
    public TableDataInfo list(CjClass cjClass)
    {
        startPage();
        List<CjClass> list = cjClassService.selectCjClassList(cjClass);
        fillNames(list);
        return getDataTable(list);
    }
 
    /**
     * 导出班级列表
     */
    @PreAuthorize("@ss.hasPermi('system:class:export')")
    @Log(title = "班级", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, CjClass cjClass)
    {
        List<CjClass> list = cjClassService.selectCjClassList(cjClass);
        fillNames(list);
        ExcelUtil<CjClass> util = new ExcelUtil<CjClass>(CjClass.class);
        util.exportExcel(response, list, "班级数据");
    }
 
    /**
     * 获取班级详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:class:query')")
    @GetMapping(value = "/{classId}")
    public AjaxResult getInfo(@PathVariable("classId") Long classId)
    {
        return success(cjClassService.selectCjClassByClassId(classId));
    }
 
    /**
     * 新增班级
     */
    @PreAuthorize("@ss.hasPermi('system:class:add')")
    @Log(title = "班级", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody CjClass cjClass)
    {
        return toAjax(cjClassService.insertCjClass(cjClass));
    }
 
    /**
     * 修改班级
     */
    @PreAuthorize("@ss.hasPermi('system:class:edit')")
    @Log(title = "班级", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody CjClass cjClass)
    {
        return toAjax(cjClassService.updateCjClass(cjClass));
    }
 
    /**
     * 重置班级注册码(二维码外泄/换班期结束时使用,旧码立即失效)
     */
    @PreAuthorize("@ss.hasPermi('system:class:edit')")
    @Log(title = "班级", businessType = BusinessType.UPDATE)
    @PutMapping("/resetBindCode/{classId}")
    public AjaxResult resetBindCode(@PathVariable("classId") Long classId)
    {
        CjClass c = cjClassService.selectCjClassByClassId(classId);
        if (c == null)
        {
            return error("班级不存在");
        }
        CjClass upd = new CjClass();
        upd.setClassId(classId);
        upd.setBindCode(java.util.UUID.randomUUID().toString().replace("-", ""));
        upd.setUpdateBy(getUsername());
        cjClassService.updateCjClass(upd);
        return success("注册码已重置,旧二维码立即失效,请重新下载打印");
    }
 
    /**
     * 删除班级(引用保护:其下存在学生时禁止删除)
     */
    @PreAuthorize("@ss.hasPermi('system:class:remove')")
    @Log(title = "班级", businessType = BusinessType.DELETE)
    @DeleteMapping("/{classIds}")
    public AjaxResult remove(@PathVariable Long[] classIds)
    {
        if (classIds != null && classIds.length > 0
            && cjStudentMapper.countByClassIds(classIds) > 0)
        {
            return error("所选班级下存在学生,无法删除;请先将学生转出或停用班级");
        }
        return toAjax(cjClassService.deleteCjClassByClassIds(classIds));
    }
 
    /**
     * 班级停用/启用(0正常 1停用)
     */
    @PreAuthorize("@ss.hasPermi('system:class:status')")
    @Log(title = "班级", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody CjClass cjClass)
    {
        CjClass update = new CjClass();
        update.setClassId(cjClass.getClassId());
        update.setStatus(cjClass.getStatus());
        update.setUpdateBy(getUsername());
        return toAjax(cjClassService.updateCjClass(update));
    }
 
    /**
     * 导入班级(模板含“所属学院/所属专业”名称列,判重键=学院+专业+班级名称)
     */
    @PreAuthorize("@ss.hasPermi('system:class:import')")
    @Log(title = "班级", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
        ExcelUtil<CjClass> util = new ExcelUtil<CjClass>(CjClass.class);
        List<CjClass> classList = util.importExcel(file.getInputStream());
        String message;
        int insertCount = 0, updateCount = 0, failCount = 0;
        StringBuilder failMsg = new StringBuilder();
        String operName = getUsername();
 
        for (int i = 0; i < classList.size(); i++)
        {
            CjClass cl = classList.get(i);
            int rowNo = i + 1;
            try
            {
                if (cl.getCollegeName() == null || cl.getCollegeName().trim().isEmpty())
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 所属学院不能为空; ");
                    continue;
                }
                if (cl.getMajorName() == null || cl.getMajorName().trim().isEmpty())
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 所属专业不能为空; ");
                    continue;
                }
                if (cl.getClassName() == null || cl.getClassName().trim().isEmpty())
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 班级名称不能为空; ");
                    continue;
                }
                String collegeName = cl.getCollegeName().trim();
                String majorName = cl.getMajorName().trim();
                cl.setCollegeName(collegeName);
                cl.setMajorName(majorName);
                cl.setClassName(cl.getClassName().trim());
                // 父级两级必须为启用中
                List<CjCollege> colleges = cjCollegeMapper.selectEnabledByCollegeName(collegeName);
                if (colleges.isEmpty())
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 所属学院“" + collegeName + "”不存在或已停用; ");
                    continue;
                }
                if (colleges.size() > 1)
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 所属学院“" + collegeName + "”在系统中重复,请先清理; ");
                    continue;
                }
                Long collegeId = colleges.get(0).getCollegeId();
                List<CjMajor> majors = cjMajorMapper.selectEnabledByCollegeIdAndName(collegeId, majorName);
                if (majors.isEmpty())
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 所属专业“" + majorName + "”在学院“" + collegeName + "”下不存在或已停用; ");
                    continue;
                }
                if (majors.size() > 1)
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 专业“" + majorName + "”在该学院下重复,请先清理; ");
                    continue;
                }
                Long majorId = majors.get(0).getMajorId();
                List<CjClass> exists = cjClassMapper.selectByMajorIdAndName(majorId, cl.getClassName());
                if (exists.isEmpty())
                {
                    cl.setMajorId(majorId);
                    cl.setCreateBy(operName);
                    cjClassService.insertCjClass(cl);
                    insertCount++;
                }
                else if (exists.size() > 1)
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 班级“" + cl.getClassName() + "”在该专业下重复,无法确定更新对象; ");
                }
                else if (updateSupport)
                {
                    CjClass old = exists.get(0);
                    cl.setClassId(old.getClassId());
                    cl.setMajorId(majorId);
                    cl.setUpdateBy(operName);
                    cjClassService.updateCjClass(cl);
                    updateCount++;
                }
                else
                {
                    failCount++;
                    failMsg.append("第" + rowNo + "条: 班级“" + cl.getClassName() + "”在专业“" + majorName + "”下已存在; ");
                }
            }
            catch (Exception e)
            {
                failCount++;
                failMsg.append("第" + rowNo + "条: 导入失败(" + e.getMessage() + "); ");
            }
        }
 
        if (updateSupport)
            message = String.format("导入完成!新增 %d 条,更新 %d 条", insertCount, updateCount);
        else
            message = String.format("导入完成!新增 %d 条,由于数据重复导致导入失败 %d 条", insertCount, failCount);
 
        Map<String, Object> data = new HashMap<>();
        data.put("message", message);
        data.put("insertCount", insertCount);
        data.put("updateCount", updateCount);
        data.put("failCount", failCount);
        data.put("failMsg", failMsg.toString());
        return AjaxResult.success(data);
    }
 
    /**
     * 下载班级导入模板
     */
    @PreAuthorize("@ss.hasPermi('system:class:import')")
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response) throws Exception
    {
        ExcelUtil<CjClass> util = new ExcelUtil<CjClass>(CjClass.class);
        util.importTemplateExcel(response, "班级导入模板");
    }
}