xiangpei
2024-05-11 ccca8c65b3c76a9021a471a3667d61d965a4f2cb
Merge remote-tracking branch 'origin/master'
22个文件已修改
10个文件已添加
8个文件已删除
738 ■■■■■ 已修改文件
src/main/java/com/mindskip/xzs/controller/admin/DepartmentController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/admin/ExamMissController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/admin/ExamPaperController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/admin/FeedBackController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/admin/QuestionAnswerController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/student/ExamPaperAnswerController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/student/FeedBackController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/student/QuestionAndAnswerController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/ExamMiss.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/ExamPaperAnswer.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/Feedback.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/QuestionAnswer.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/enums/AnswerInvalidEnum.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/enums/QuestionAnswerStatusEnum.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/enums/UserConditionEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/vo/ExamMissVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/vo/FeedbackVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/domain/vo/QuestionAnswerVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/queue/ExamPaperTimeTask.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/repository/ExamMissMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/repository/ExamPaperAnswerMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/repository/ExamPaperMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/repository/QuestionAnswerMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/repository/UserMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/ExamMissService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/ExamPaperService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/QuestionAnswerService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/UserService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/ExamMissServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/ExamPaperServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/QuestionAnswerServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/TagServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/viewmodel/admin/exam/ExamPaperEditRequestVM.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ExamMissMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ExamPaperAnswerMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ExamPaperMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/FeedbackMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/QuestionAnswerMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/UserMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/controller/admin/DepartmentController.java
@@ -4,6 +4,7 @@
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.Department;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.domain.UserDepartment;
import com.mindskip.xzs.domain.vo.BaseSelect;
@@ -93,7 +94,7 @@
    }
    @RequestMapping(value = "/getDepartmentUser", method = RequestMethod.POST)
    public RestResponse<List<DepartmentVO>> getUserDepartment(){
    public RestResponse<List<DepartmentVO>> getUserDepartment(Integer examPaperId){
        User currentUser = webContext.getCurrentUser();
        Integer deptId = null;
        if (Objects.nonNull(currentUser)) {
@@ -108,7 +109,16 @@
                    List<UserDepartment> userDepartments = userDepartmentMapper.selectByDepartmentId(e.getId());
                    List<User> list = new ArrayList<>();
                    for (UserDepartment userDepartment : userDepartments) {
                        User user = userService.getUserById(userDepartment.getUserId());
                        User user;
                        // 选择补考用户时查询符合补考条件的用户
                        if (examPaperId != null) {
                            ExamPaper examPaper = new ExamPaper();
                            examPaper.setCreateUser(userDepartment.getUserId());
                            examPaper.setId(examPaperId);
                            user = userService.getUserByExam(examPaper);
                        } else {
                            user = userService.getUserById(userDepartment.getUserId());
                        }
                        if (ObjectUtils.isNotEmpty(user)) {
                            list.add(user);
                        }
src/main/java/com/mindskip/xzs/controller/admin/ExamMissController.java
File was deleted
src/main/java/com/mindskip/xzs/controller/admin/ExamPaperController.java
@@ -87,13 +87,20 @@
        ExamPaper examPaper = examPaperService.savePaperFromVM(model, getCurrentUser());
        ExamPaperEditRequestVO newVM = examPaperService.examPaperToVM(examPaper.getId());
        // 加入延时队列,定时试卷结束时记录缺考学生
        if (examPaper.getPaperType() == 4) {
            examPaperService.addTimeTask(examPaper);
        }
        return RestResponse.ok(newVM);
    }
    /**
     * 补考
     * @param model 数据
     * @return 操作结果
     */
    @RequestMapping(value = "/missExam", method = RequestMethod.POST)
    public RestResponse<String> missExam(@RequestBody ExamPaperEditRequestVM model) {
        examPaperService.missExam(model);
        return RestResponse.ok("操作成功");
    }
    @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
    public RestResponse<ExamPaperEditRequestVO> select(@PathVariable Integer id) {
        ExamPaperEditRequestVO vm = examPaperService.examPaperToVM(id);
src/main/java/com/mindskip/xzs/controller/admin/FeedBackController.java
@@ -15,7 +15,7 @@
 */
@RequiredArgsConstructor
@RestController("adminFeedBackController")
@RestController("AdminFeedBackController")
@RequestMapping("/api/admin/feedback")
public class FeedBackController extends BaseApiController {
src/main/java/com/mindskip/xzs/controller/admin/QuestionAnswerController.java
New file
@@ -0,0 +1,76 @@
package com.mindskip.xzs.controller.admin;
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.QuestionAnswer;
import com.mindskip.xzs.domain.vo.QuestionAnswerVO;
import com.mindskip.xzs.service.QuestionAnswerService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
 * @author gonghl
 * @since 2024/5/11 下午 3:57
 */
@RequiredArgsConstructor
@RestController("AdminQuestionAnswerController")
@RequestMapping("/api/admin/questionAnswer")
public class QuestionAnswerController extends BaseApiController {
    private final QuestionAnswerService questionAnswerService;
    /**
     * 保存、修改问答
     */
    @PostMapping("save")
    public RestResponse<String> saveQuestionAnswer(@RequestBody QuestionAnswer questionAnswer) {
        questionAnswerService.saveOrUpdate(questionAnswer);
        return RestResponse.ok("操作成功");
    }
    /**
     * 分页查询
     */
    @PostMapping("page")
    public RestResponse<PageInfo<QuestionAnswerVO>> page(@RequestBody QuestionAnswerVO questionAnswer) {
        return RestResponse.ok(questionAnswerService.questionAnswerPage(questionAnswer));
    }
    /**
     * 删除问答
     */
    @PostMapping("delete/{id}")
    public RestResponse<String> delete(@PathVariable Integer id) {
        questionAnswerService.removeById(id);
        return RestResponse.ok("操作成功");
    }
    /**
     * 查询问答
     */
    @PostMapping("query/{id}")
    public RestResponse<QuestionAnswer> query(@PathVariable Integer id) {
        return RestResponse.ok(questionAnswerService.getById(id));
    }
    /**
     * 修改问答
     */
    @PostMapping("update")
    public RestResponse<String> update(@RequestBody QuestionAnswer questionAnswer) {
        questionAnswerService.updateById(questionAnswer);
        return RestResponse.ok("操作成功");
    }
    /**
     * 修改问答状态
     */
    @PostMapping("updateStatus/{id}")
    public RestResponse<String> updateStatus(@PathVariable Integer id) {
        questionAnswerService.updateStatus(id);
        return RestResponse.ok("操作成功");
    }
}
src/main/java/com/mindskip/xzs/controller/student/ExamPaperAnswerController.java
@@ -34,17 +34,15 @@
    private final ApplicationEventPublisher eventPublisher;
    private final ExamPaperSubjectService examPaperSubjectService;
    private final ExamTemplatesUserCountService examTemplatesUserCountService;
    private final ExamMissService examMissService;
    @Autowired
    public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, ExamPaperService examPaperService, SubjectService subjectService, ApplicationEventPublisher eventPublisher, ExamPaperSubjectService examPaperSubjectService, ExamTemplatesUserCountService examTemplatesUserCountService, ExamMissService examMissService) {
    public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, ExamPaperService examPaperService, SubjectService subjectService, ApplicationEventPublisher eventPublisher, ExamPaperSubjectService examPaperSubjectService, ExamTemplatesUserCountService examTemplatesUserCountService) {
        this.examPaperAnswerService = examPaperAnswerService;
        this.examPaperService = examPaperService;
        this.subjectService = subjectService;
        this.eventPublisher = eventPublisher;
        this.examPaperSubjectService = examPaperSubjectService;
        this.examTemplatesUserCountService = examTemplatesUserCountService;
        this.examMissService = examMissService;
    }
@@ -100,13 +98,6 @@
            examTemplatesUserCountService.add(examTemplatesUserCount);
        }
        // 自动提交定义为缺考
        if (examPaperSubmitVM.isAutoCommit()) {
            ExamMiss examMiss = new ExamMiss();
            examMiss.setExamId(examPaperSubmitVM.getId());
            examMiss.setUserId(user.getId());
            examMissService.save(examMiss);
        }
        return RestResponse.ok(scoreVm);
    }
src/main/java/com/mindskip/xzs/controller/student/FeedBackController.java
@@ -16,7 +16,7 @@
 */
@RequiredArgsConstructor
@RestController("studentFeedBackController")
@RestController("StudentFeedBackController")
@RequestMapping("/api/student/feedback")
public class FeedBackController extends BaseApiController {
src/main/java/com/mindskip/xzs/controller/student/QuestionAndAnswerController.java
New file
@@ -0,0 +1,34 @@
package com.mindskip.xzs.controller.student;
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.QuestionAnswer;
import com.mindskip.xzs.service.QuestionAnswerService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author gonghl
 * @since 2024/5/11 下午 3:57
 */
@RequiredArgsConstructor
@RestController("StudentQuestionAndAnswerController")
@RequestMapping("/api/student/questionAnswer")
public class QuestionAndAnswerController extends BaseApiController {
    private final QuestionAnswerService questionAnswerService;
    /**
     * 查询
     */
    @PostMapping("list")
    public RestResponse<List<QuestionAnswer>> page() {
        return RestResponse.ok(questionAnswerService.list());
    }
}
src/main/java/com/mindskip/xzs/domain/ExamMiss.java
File was deleted
src/main/java/com/mindskip/xzs/domain/ExamPaperAnswer.java
@@ -1,5 +1,7 @@
package com.mindskip.xzs.domain;
import com.mindskip.xzs.domain.enums.AnswerInvalidEnum;
import java.io.Serializable;
import java.util.Date;
@@ -83,8 +85,19 @@
    private String userName;
    /**
     * 是否作废:1/0 是/否(作废代表需要补考)
     */
    private AnswerInvalidEnum invalid;
    public AnswerInvalidEnum getInvalid() {
        return invalid;
    }
    public void setInvalid(AnswerInvalidEnum invalid) {
        this.invalid = invalid;
    }
    public Integer getId() {
        return id;
src/main/java/com/mindskip/xzs/domain/Feedback.java
@@ -1,14 +1,10 @@
package com.mindskip.xzs.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author gonghl
@@ -34,5 +30,8 @@
    private LocalDateTime fixTime;
    @TableLogic
    private Boolean deleted;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/mindskip/xzs/domain/QuestionAnswer.java
New file
@@ -0,0 +1,33 @@
package com.mindskip.xzs.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mindskip.xzs.domain.enums.QuestionAnswerStatusEnum;
import lombok.Data;
import java.io.Serializable;
/**
 * @author gonghl
 * @TableName t_question_answer
 */
@TableName(value = "t_question_answer")
@Data
public class QuestionAnswer implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String question;
    private String answer;
    private QuestionAnswerStatusEnum status;
    @TableLogic
    private Boolean deleted;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/mindskip/xzs/domain/enums/AnswerInvalidEnum.java
New file
@@ -0,0 +1,31 @@
package com.mindskip.xzs.domain.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
/**
 * 考试作废
 *
 * @author gonghl
 */
@Getter
public enum AnswerInvalidEnum {
    VALID("0", "有效"),
    INVALID("1", "无效"),
    ;
    @EnumValue // 标明该字段存入数据库
    private final String code;
    @JsonValue // 标明在转JSON时使用该字段,即响应时
    private final String desc;
    AnswerInvalidEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}
src/main/java/com/mindskip/xzs/domain/enums/QuestionAnswerStatusEnum.java
New file
@@ -0,0 +1,31 @@
package com.mindskip.xzs.domain.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
/**
 * 问答状态
 *
 * @author gonghl
 */
@Getter
public enum QuestionAnswerStatusEnum {
    ENABLE("1", "启用"),
    DISABLE("2", "禁用"),
    ;
    @EnumValue // 标明该字段存入数据库
    private final String code;
    @JsonValue // 标明在转JSON时使用该字段,即响应时
    private final String desc;
    QuestionAnswerStatusEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}
src/main/java/com/mindskip/xzs/domain/enums/UserConditionEnum.java
@@ -12,6 +12,7 @@
@Getter
public enum UserConditionEnum {
    NORMAL("0", "正常"),
    SICK("1", "病假"),
    BUSINESS_TRIP("2", "出差"),
    OTHER("3", "其他"),
src/main/java/com/mindskip/xzs/domain/vo/ExamMissVO.java
File was deleted
src/main/java/com/mindskip/xzs/domain/vo/FeedbackVO.java
@@ -31,6 +31,8 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime fixTime;
    private Boolean deleted;
    private Integer pageIndex;
    private Integer pageSize;
src/main/java/com/mindskip/xzs/domain/vo/QuestionAnswerVO.java
New file
@@ -0,0 +1,30 @@
package com.mindskip.xzs.domain.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
 * @author gonghl
 * @TableName t_question_answer
 */
@Data
public class QuestionAnswerVO implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String question;
    private String answer;
    private Boolean deleted;
    private static final long serialVersionUID = 1L;
    private Integer pageIndex;
    private Integer pageSize;
}
src/main/java/com/mindskip/xzs/queue/ExamPaperTimeTask.java
File was deleted
src/main/java/com/mindskip/xzs/repository/ExamMissMapper.java
File was deleted
src/main/java/com/mindskip/xzs/repository/ExamPaperAnswerMapper.java
@@ -1,11 +1,14 @@
package com.mindskip.xzs.repository;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.domain.ExamPaperAnswer;
import com.mindskip.xzs.domain.ExamTemplatesUserCount;
import com.mindskip.xzs.domain.ScoreTemplatesUserCount;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.vo.ScoreTemplatesCountVO;
import com.mindskip.xzs.domain.vo.TeamplatesUserExcelVO;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVO;
import com.mindskip.xzs.viewmodel.admin.paper.ExamPaperGradePageRequestVM;
import com.mindskip.xzs.viewmodel.admin.paper.ExamPaperGradeQuery;
import com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM;
@@ -46,7 +49,8 @@
    List<TeamplatesUserExcelVO> getByTimeOne();
    void setMissExam(ExamPaperEditRequestVM model);
    void insertDefault(ExamPaperEditRequestVM model);
}
src/main/java/com/mindskip/xzs/repository/ExamPaperMapper.java
@@ -1,6 +1,5 @@
package com.mindskip.xzs.repository;
import com.mindskip.xzs.domain.ExamMiss;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.vo.PaperExcelVO;
@@ -39,7 +38,4 @@
    List<PaperExcelVO> getPaperExcelById(@Param("id") Integer id);
    void saveMissExamUser(long examPaperId);
    List<ExamPaper> selectTimeTaskPaper(Date time);
}
src/main/java/com/mindskip/xzs/repository/QuestionAnswerMapper.java
New file
@@ -0,0 +1,20 @@
package com.mindskip.xzs.repository;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mindskip.xzs.domain.QuestionAnswer;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author gonghl
 * @description 针对表【t_question_answer(问答)】的数据库操作Mapper
 * @createDate 2024-05-11 11:53:55
 * @Entity com.mindskip.xzs.questionAnswer.QuestionAnswer
 */
@Mapper
public interface QuestionAnswerMapper extends BaseMapper<QuestionAnswer> {
}
src/main/java/com/mindskip/xzs/repository/UserMapper.java
@@ -1,5 +1,6 @@
package com.mindskip.xzs.repository;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.domain.ExamPaperAnswer;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.User;
@@ -158,4 +159,6 @@
     * @param deptId
     */
    void clearDeptAdmin(List<Integer> userIds, @Param("deptId") Integer deptId);
    User getUserByExam(ExamPaper examPaper);
}
src/main/java/com/mindskip/xzs/service/ExamMissService.java
File was deleted
src/main/java/com/mindskip/xzs/service/ExamPaperService.java
@@ -38,7 +38,5 @@
    List<PaperExcelVO> getPaperExcelById(Integer id);
    void addTimeTask(ExamPaper examPaper);
    void saveMissExamUser(long examPaperId);
    void missExam(ExamPaperEditRequestVM model);
}
src/main/java/com/mindskip/xzs/service/QuestionAnswerService.java
New file
@@ -0,0 +1,19 @@
package com.mindskip.xzs.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.domain.QuestionAnswer;
import com.mindskip.xzs.domain.vo.QuestionAnswerVO;
/**
 * @author gonghl
 * @description 针对表【t_question_answer(问答)】的数据库操作Service
 * @createDate 2024-05-11 11:53:55
 */
public interface QuestionAnswerService extends IService<QuestionAnswer> {
    PageInfo<QuestionAnswerVO> questionAnswerPage(QuestionAnswerVO questionAnswer);
    void updateStatus(Integer id);
}
src/main/java/com/mindskip/xzs/service/UserService.java
@@ -1,5 +1,6 @@
package com.mindskip.xzs.service;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.domain.vo.UserVO;
@@ -135,4 +136,6 @@
    User getUserByRealName(String realName);
    void setStatus(UserVO user);
    User getUserByExam(ExamPaper examPaper);
}
src/main/java/com/mindskip/xzs/service/impl/ExamMissServiceImpl.java
File was deleted
src/main/java/com/mindskip/xzs/service/impl/ExamPaperServiceImpl.java
@@ -10,7 +10,7 @@
import com.mindskip.xzs.domain.exam.ExamPaperTitleItemObject;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.vo.PaperExcelVO;
import com.mindskip.xzs.queue.ExamPaperTimeTask;
import com.mindskip.xzs.repository.ExamPaperAnswerMapper;
import com.mindskip.xzs.repository.ExamPaperMapper;
import com.mindskip.xzs.repository.QuestionMapper;
import com.mindskip.xzs.repository.UserDepartmentMapper;
@@ -20,22 +20,21 @@
import com.mindskip.xzs.utility.ExamUtil;
import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.utility.ModelMapperSingle;
import com.mindskip.xzs.utility.minio.DateUtils;
import com.mindskip.xzs.viewmodel.admin.exam.*;
import com.mindskip.xzs.viewmodel.admin.question.ExamQuestionVO;
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
import com.mindskip.xzs.viewmodel.student.dashboard.PaperFilter;
import com.mindskip.xzs.viewmodel.student.dashboard.PaperInfo;
import com.mindskip.xzs.viewmodel.student.exam.ExamPaperPageVM;
import org.apache.commons.lang3.ObjectUtils;
import org.modelmapper.ModelMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@@ -44,6 +43,7 @@
    protected final static ModelMapper modelMapper = ModelMapperSingle.Instance();
    private final ExamPaperMapper examPaperMapper;
    private final ExamPaperAnswerMapper examPaperAnswerMapper;
    private final QuestionMapper questionMapper;
    private final TextContentService textContentService;
    private final QuestionService questionService;
@@ -55,29 +55,14 @@
    private final UserService userService;
    private final UserDepartmentMapper userDepartmentMapper;
    private final DepartmentService departmentService;
    private final DelayQueue<ExamPaperTimeTask> QUEUE = new DelayQueue<>();
    /**
     * 将进行中的定时试卷加入到队列中,并启动一个线程来轮询队列
     */
    @PostConstruct
    public void pollQueue() {
        examPaperMapper.selectTimeTaskPaper(DateUtils.getNowDate()).forEach(this::addTimeTask);
        new Thread(() -> {
            try {
                ExamPaperTimeTask task = QUEUE.take();
                saveMissExamUser(task.getExamPaperId());
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
    @Autowired
    public ExamPaperServiceImpl(ExamPaperMapper examPaperMapper, QuestionMapper questionMapper, TextContentService textContentService, QuestionService questionService, SubjectService subjectService, ExamPaperDepartmentService examPaperDepartmentService, ExamPaperSubjectService examPaperSubjectService, QuestionSubjectService questionSubjectService, ExamPaperUserService examPaperUserService, UserService userService, UserDepartmentMapper userDepartmentMapper, DepartmentService departmentService) {
    public ExamPaperServiceImpl(ExamPaperMapper examPaperMapper, ExamPaperAnswerMapper examPaperAnswerMapper, QuestionMapper questionMapper, TextContentService textContentService, QuestionService questionService, SubjectService subjectService, ExamPaperDepartmentService examPaperDepartmentService, ExamPaperSubjectService examPaperSubjectService, QuestionSubjectService questionSubjectService, ExamPaperUserService examPaperUserService, UserService userService, UserDepartmentMapper userDepartmentMapper, DepartmentService departmentService) {
        super(examPaperMapper);
        this.examPaperMapper = examPaperMapper;
        this.examPaperAnswerMapper = examPaperAnswerMapper;
        this.questionMapper = questionMapper;
        this.textContentService = textContentService;
        this.questionService = questionService;
@@ -220,8 +205,11 @@
        List<ExamPaperUser> examPaperUsers = examPaperUserService.getByExamPaperId(examPaper.getId());
        Integer[][] userIds = new Integer[examPaperUsers.size()][2];
        for (int i = 0; i < examPaperUsers.size(); i++) {
            Integer[] userId = {userService.getUserById(examPaperUsers.get(i).getUserId()).getUserLevel(), examPaperUsers.get(i).getUserId()};
            userIds[i] = userId;
            User user = userService.getUserById(examPaperUsers.get(i).getUserId());
            if (ObjectUtils.isNotEmpty(user)) {
                Integer[] userId = {user.getUserLevel(), examPaperUsers.get(i).getUserId()};
                userIds[i] = userId;
            }
        }
        vm.setUserId(userIds);
        return vm;
@@ -617,15 +605,20 @@
    }
    @Override
    public void addTimeTask(ExamPaper examPaper) {
        ExamPaperTimeTask examPaperTimeTask = new ExamPaperTimeTask();
        examPaperTimeTask.setExamPaperId(examPaper.getId());
        examPaperTimeTask.setExpiry(examPaper.getLimitEndTime().getTime());
        QUEUE.add(examPaperTimeTask);
    }
    @Transactional
    public void missExam(ExamPaperEditRequestVM model) {
        // 修改原来的试卷时间
        if (ObjectUtils.isNotEmpty(model.getLimitDateTime())) {
            ExamPaper examPaper = new ExamPaper();
            examPaper.setId(model.getExamPaperId());
            examPaper.setLimitStartTime(DateTimeUtil.parse(model.getLimitDateTime().get(0), DateTimeUtil.STANDER_FORMAT));
            examPaper.setLimitEndTime(DateTimeUtil.parse(model.getLimitDateTime().get(1), DateTimeUtil.STANDER_FORMAT));
            examPaperMapper.updateByPrimaryKeySelective(examPaper);
        }
        // 根据考试id将选择的补考考生的考试成绩设置为无效
        examPaperAnswerMapper.setMissExam(model);
    @Override
    public void saveMissExamUser(long examPaperId) {
        examPaperMapper.saveMissExamUser(examPaperId);
        // 补考时将没有选择的并且没有参加过考试的考生增加一条零分考试记录,否则没有参加过考试的即使不被选择也可以参加补考
        examPaperAnswerMapper.insertDefault(model);
    }
}
src/main/java/com/mindskip/xzs/service/impl/QuestionAnswerServiceImpl.java
New file
@@ -0,0 +1,58 @@
package com.mindskip.xzs.service.impl;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.domain.QuestionAnswer;
import com.mindskip.xzs.domain.enums.QuestionAnswerStatusEnum;
import com.mindskip.xzs.domain.vo.QuestionAnswerVO;
import com.mindskip.xzs.repository.QuestionAnswerMapper;
import com.mindskip.xzs.service.QuestionAnswerService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
/**
 * @author gonghl
 * @description 针对表【t_question_answer(问答)】的数据库操作Service实现
 * @createDate 2024-05-11 11:53:55
 */
@Service
@RequiredArgsConstructor
public class QuestionAnswerServiceImpl extends ServiceImpl<QuestionAnswerMapper, QuestionAnswer> implements QuestionAnswerService {
    private final QuestionAnswerMapper questionAnswerMapper;
    @Override
    public void updateStatus(Integer id) {
        new LambdaUpdateChainWrapper<>(questionAnswerMapper)
                .eq(QuestionAnswer::getId, id)
                .set(QuestionAnswer::getStatus, "1".equals(getById(id).getStatus().getCode()) ? QuestionAnswerStatusEnum.DISABLE : QuestionAnswerStatusEnum.ENABLE)
                .update();
    }
    @Override
    public PageInfo<QuestionAnswerVO> questionAnswerPage(QuestionAnswerVO questionAnswerVO) {
        return PageHelper.startPage(questionAnswerVO.getPageIndex(), questionAnswerVO.getPageSize()).doSelectPageInfo(() ->
                new LambdaQueryChainWrapper<>(questionAnswerMapper)
                        .like(StringUtils.hasText(questionAnswerVO.getQuestion()), QuestionAnswer::getQuestion, questionAnswerVO.getQuestion())
                        .or(StringUtils.hasText(questionAnswerVO.getQuestion()), wrapper -> wrapper.like(QuestionAnswer::getAnswer, questionAnswerVO.getQuestion()))
                        .orderByDesc(QuestionAnswer::getId)
                        .list());
    }
    @Override
    public List<QuestionAnswer> list() {
        return new LambdaQueryChainWrapper<>(questionAnswerMapper)
                .eq(QuestionAnswer::getStatus, QuestionAnswerStatusEnum.ENABLE.getCode())
                .list();
    }
}
src/main/java/com/mindskip/xzs/service/impl/TagServiceImpl.java
@@ -28,7 +28,6 @@
        return PageHelper.startPage(tag.getPageIndex(), tag.getPageSize(), "id desc").doSelectPageInfo(() ->
                new LambdaQueryChainWrapper<>(baseMapper)
                        .like(StringUtils.hasText(tag.getName()), Tag::getName, tag.getName())
                        .eq(Tag::getDeleted, false)
                        .list()
        );
    }
src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java
@@ -1,5 +1,6 @@
package com.mindskip.xzs.service.impl;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.vo.UserVO;
import com.mindskip.xzs.exception.BusinessException;
@@ -178,4 +179,8 @@
        userMapper.setStatus(user);
    }
    @Override
    public User getUserByExam(ExamPaper examPaper) {
        return userMapper.getUserByExam(examPaper);
    }
}
src/main/java/com/mindskip/xzs/viewmodel/admin/exam/ExamPaperEditRequestVM.java
@@ -54,5 +54,6 @@
    private String type;
    private String status;
    private String menuIds;
    private Integer examPaperId;
}
src/main/resources/mapper/ExamMissMapper.xml
File was deleted
src/main/resources/mapper/ExamPaperAnswerMapper.xml
@@ -231,11 +231,19 @@
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="setMissExam">
    update t_exam_paper_answer
    set invalid = 1
    where exam_paper_id = #{examPaperId}
    and create_user in (
    <foreach collection="userIds" item="item" index="index" separator=",">
      #{item}
    </foreach>
    )
  </update>
  <select id="studentPage" resultMap="BaseResultMap" parameterType="com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM">
    <select id="studentPage" resultMap="BaseResultMap" parameterType="com.mindskip.xzs.viewmodel.student.exampaper.ExamPaperAnswerPageVM">
    SELECT
    <include refid="Base_Column_List"/>
    FROM t_exam_paper_answer
@@ -321,6 +329,7 @@
                  (#{item.examPaperId},#{item.userId})
        </foreach>
      </if>
    and (invalid = 0 or invalid is null)
  </select>
  <select id="adminPageByGrade" resultMap="BaseResultMap" parameterType="com.mindskip.xzs.viewmodel.admin.paper.ExamPaperGradePageRequestVM">
    select
@@ -386,4 +395,20 @@
    where a.create_time
  </select>
  <insert id="insertDefault">
    INSERT INTO t_exam_paper_answer(exam_paper_id, paper_name, paper_type, system_score, user_score, paper_score, question_correct, question_count, do_time, status,
    create_user, create_time, invalid)
    SELECT
    a.id, a.name, a.paper_type, 0, 0, a.score, 0,  a.question_count, 0, 2, b.user_id, NOW(), 0
    FROM t_exam_paper a
    left join t_exam_paper_user b on a.id = b.exam_paper_id and b.deleted = 0
    left join t_exam_paper_answer c on a.id = c.exam_paper_id and c.create_user = b.user_id
    WHERE a.id = #{examPaperId}
    and c.id is null
    and b.user_id not in
    <foreach collection="userIds" item="item" open="(" close=")" separator=",">
      #{item}
    </foreach>
  </insert>
</mapper>
src/main/resources/mapper/ExamPaperMapper.xml
@@ -423,19 +423,4 @@
    where a.exam_paper_id = #{id}
  </select>
    <select id="saveMissExamUser" resultType="com.mindskip.xzs.domain.ExamMiss">
      INSERT INTO t_exam_miss(exam_id, user_id)
      SELECT a.id,
             b.user_id
      FROM t_exam_paper a
             left join t_exam_paper_user b on a.id = b.exam_paper_id
             left join t_exam_paper_answer c on a.id = c.exam_paper_id and c.create_user = b.user_id
      WHERE a.id = #{examPaperId}
        and c.id is null
    </select>
  <select id="selectTimeTaskPaper" resultType="com.mindskip.xzs.domain.ExamPaper">
    select id, limit_end_time from t_exam_paper where paper_type = 4 and limit_end_time >= #{time} and deleted = 0
  </select>
</mapper>
src/main/resources/mapper/FeedbackMapper.xml
@@ -26,7 +26,8 @@
               c.real_name as userName
        from t_feedback a
                 left join t_text_content b on a.content_id = b.id
                 left join t_user c on a.user_id = c.id and deleted = 0
                 left join t_user c on a.user_id = c.id and c.deleted = 0
        where a.deleted = 0
        order by id desc
    </select>
</mapper>
src/main/resources/mapper/QuestionAnswerMapper.xml
New file
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mindskip.xzs.repository.QuestionAnswerMapper">
    <resultMap id="BaseResultMap" type="com.mindskip.xzs.domain.QuestionAnswer">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="question" column="question" jdbcType="VARCHAR"/>
        <result property="answer" column="answer" jdbcType="VARCHAR"/>
        <result property="deleted" column="deleted" jdbcType="BIT"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,question,answer,
        deleted
    </sql>
</mapper>
src/main/resources/mapper/UserMapper.xml
@@ -268,7 +268,7 @@
    select
    <include refid="Base_Column_List"/>
    from t_user
    where id=#{value} and status = 1 and deleted = 0
    where id=#{value} and status = 1 and deleted = 0 and (`condition` = 0 or `condition` is null)
  </select>
    <select id="getUserByUserName" resultMap="BaseResultMap">
@@ -494,4 +494,18 @@
        tu.id desc
    </select>
    <select id="getUserByExam" resultType="com.mindskip.xzs.domain.User">
        <![CDATA[
        SELECT
        d.*
        FROM t_exam_paper a
        left join t_exam_paper_user b on a.id = b.exam_paper_id and b.deleted = 0
        left join t_exam_paper_answer c on a.id = c.exam_paper_id and c.create_user = b.user_id
        left join t_user d on b.user_id = d.id
        WHERE a.id = #{id}
        and (c.id is null or (user_score / paper_score) < 0.6)
        and b.user_id = #{createUser}
        ]]>
    </select>
</mapper>