Просмотр исходного кода

开发考试列表的增删改查接口,补全关联

zhaosongshan 7 месяцев назад
Родитель
Сommit
101ed74463

+ 130 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/TExamController.java

@@ -0,0 +1,130 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.controller.admin;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.exam.domain.TExam;
+import vip.xiaonuo.exam.domain.exam.TExamAddParam;
+import vip.xiaonuo.exam.domain.exam.TExamEditParam;
+import vip.xiaonuo.exam.domain.exam.TExamIdParam;
+import vip.xiaonuo.exam.domain.exam.TExamPageParam;
+import vip.xiaonuo.exam.service.TExamService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * 考试表控制器
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ */
+@Api(tags = "考试表控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+@RequestMapping(value = "/api/admin/t_exam")
+public class TExamController {
+
+    @Resource
+    private TExamService tExamService;
+
+    /**
+     * 获取考试表分页
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取考试表分页")
+    @SaCheckPermission("/page")
+    @GetMapping("/page")
+    public CommonResult<Page<TExam>> page(TExamPageParam tExamPageParam) {
+        return CommonResult.data(tExamService.page(tExamPageParam));
+    }
+
+    /**
+     * 添加考试表
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("添加考试表")
+    @CommonLog("添加考试表")
+    @SaCheckPermission("/add")
+    @PostMapping("/add")
+    public CommonResult<String> add(@RequestBody @Valid TExamAddParam tExamAddParam) {
+        tExamService.add(tExamAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑考试表
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑考试表")
+    @CommonLog("编辑考试表")
+    @SaCheckPermission("/edit")
+    @PostMapping("/edit")
+    public CommonResult<String> edit(@RequestBody @Valid TExamEditParam tExamEditParam) {
+        tExamService.edit(tExamEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除考试表
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除考试表")
+    @CommonLog("删除考试表")
+    @SaCheckPermission("/delete")
+    @PostMapping("/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<TExamIdParam> tExamIdParamList) {
+        tExamService.delete(tExamIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取考试表详情
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取考试表详情")
+    @SaCheckPermission("/detail")
+    @GetMapping("/detail")
+    public CommonResult<TExam> detail(@Valid TExamIdParam tExamIdParam) {
+        return CommonResult.data(tExamService.detail(tExamIdParam));
+    }
+
+}

+ 84 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/domain/TExam.java

@@ -0,0 +1,84 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 考试表实体
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+@Getter
+@Setter
+@TableName("T_EXAM")
+public class TExam {
+
+    /** 主键 */
+    @TableId
+    @ApiModelProperty(value = "主键", position = 1)
+    private Integer id;
+
+    /** 考试标题 */
+    @ApiModelProperty(value = "考试标题", position = 2)
+    private String examName;
+
+    /** 参与考试的学生ID集合 */
+    @ApiModelProperty(value = "参与考试的学生ID集合", position = 3)
+    private String studentIds;
+
+    /** 考试状态 0 未开始 1已开始 2已结束 */
+    @ApiModelProperty(value = "考试状态 0 未开始 1已开始 2已结束", position = 4)
+    private Integer examStatus;
+
+    /** 创建时间 */
+    @ApiModelProperty(value = "创建时间", position = 5)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 创建人ID */
+    @ApiModelProperty(value = "创建人ID", position = 6)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 更新时间 */
+    @ApiModelProperty(value = "更新时间", position = 7)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 章节ID ,有此则为章节测试 */
+    @ApiModelProperty(value = "章节ID ,有此则为章节测试", position = 8)
+    private String chapterId;
+
+    /** 开始时间 */
+    @ApiModelProperty(value = "开始时间", position = 9)
+    private Date startTime;
+
+    /** 结束时间 */
+    @ApiModelProperty(value = "结束时间", position = 10)
+    private Date endTime;
+
+    /** 试卷ID */
+    @ApiModelProperty(value = "试卷ID", position = 11)
+    private String paperId;
+
+    /** 软删除 */
+    @ApiModelProperty(value = "软删除", position = 12)
+    private Integer deleted;
+}

+ 66 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/domain/exam/TExamAddParam.java

@@ -0,0 +1,66 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.domain.exam;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 考试表添加参数
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+@Getter
+@Setter
+public class TExamAddParam {
+
+    /** 考试标题 */
+    @ApiModelProperty(value = "考试标题", position = 2)
+    private String examName;
+
+    /** 参与考试的学生ID集合 */
+    @ApiModelProperty(value = "参与考试的学生ID集合", position = 3)
+    private String studentIds;
+
+    /** 考试状态 0 未开始 1已开始 2已结束 */
+    @ApiModelProperty(value = "考试状态 0 未开始 1已开始 2已结束", position = 4)
+    private Integer examStatus;
+
+    /** 章节ID ,有此则为章节测试 */
+    @ApiModelProperty(value = "章节ID ,有此则为章节测试", position = 8)
+    private String chapterId;
+
+    /** 开始时间 */
+    @ApiModelProperty(value = "开始时间", position = 9)
+    private Date startTime;
+
+    /** 结束时间 */
+    @ApiModelProperty(value = "结束时间", position = 10)
+    private Date endTime;
+
+    /** 试卷ID */
+    @ApiModelProperty(value = "试卷ID", position = 11)
+    private String paperId;
+
+    /** 软删除 */
+    @ApiModelProperty(value = "软删除", position = 12)
+    private Integer deleted;
+
+}

+ 71 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/domain/exam/TExamEditParam.java

@@ -0,0 +1,71 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.domain.exam;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 考试表编辑参数
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+@Getter
+@Setter
+public class TExamEditParam {
+
+    /** 主键 */
+    @ApiModelProperty(value = "主键", required = true, position = 1)
+    @NotNull(message = "id不能为空")
+    private Integer id;
+
+    /** 考试标题 */
+    @ApiModelProperty(value = "考试标题", position = 2)
+    private String examName;
+
+    /** 参与考试的学生ID集合 */
+    @ApiModelProperty(value = "参与考试的学生ID集合", position = 3)
+    private String studentIds;
+
+    /** 考试状态 0 未开始 1已开始 2已结束 */
+    @ApiModelProperty(value = "考试状态 0 未开始 1已开始 2已结束", position = 4)
+    private Integer examStatus;
+
+    /** 章节ID ,有此则为章节测试 */
+    @ApiModelProperty(value = "章节ID ,有此则为章节测试", position = 8)
+    private String chapterId;
+
+    /** 开始时间 */
+    @ApiModelProperty(value = "开始时间", position = 9)
+    private Date startTime;
+
+    /** 结束时间 */
+    @ApiModelProperty(value = "结束时间", position = 10)
+    private Date endTime;
+
+    /** 试卷ID */
+    @ApiModelProperty(value = "试卷ID", position = 11)
+    private String paperId;
+
+    /** 软删除 */
+    @ApiModelProperty(value = "软删除", position = 12)
+    private Integer deleted;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/domain/exam/TExamIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.domain.exam;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 考试表Id参数
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+@Getter
+@Setter
+public class TExamIdParam {
+
+    /** 主键 */
+    @ApiModelProperty(value = "主键", required = true)
+    @NotBlank(message = "id不能为空")
+    private Integer id;
+}

+ 79 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/domain/exam/TExamPageParam.java

@@ -0,0 +1,79 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.domain.exam;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 考试表查询参数
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+@Getter
+@Setter
+public class TExamPageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @ApiModelProperty(value = "关键词")
+    private String searchKey;
+
+    /** 考试标题 */
+    @ApiModelProperty(value = "考试标题")
+    private String examName;
+
+    /** 考试状态 0 未开始 1已开始 2已结束 */
+    @ApiModelProperty(value = "考试状态 0 未开始 1已开始 2已结束")
+    private Integer examStatus;
+
+    /** 开始时间开始 */
+    @ApiModelProperty(value = "开始时间开始")
+    private String startStartTime;
+
+    /** 开始时间结束 */
+    @ApiModelProperty(value = "开始时间结束")
+    private String endStartTime;
+
+    /** 结束时间开始 */
+    @ApiModelProperty(value = "结束时间开始")
+    private String startEndTime;
+
+    /** 结束时间结束 */
+    @ApiModelProperty(value = "结束时间结束")
+    private String endEndTime;
+
+    /** 试卷ID */
+    @ApiModelProperty(value = "试卷ID")
+    private String paperId;
+
+}

+ 25 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/mapper/TExamMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.exam.domain.TExam;
+
+/**
+ * 考试表Mapper接口
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+public interface TExamMapper extends BaseMapper<TExam> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/mapper/mapping/TExamMapper.xml

@@ -0,0 +1,5 @@
+<?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="vip.xiaonuo.exam.modular.exam.mapper.TExamMapper">
+
+</mapper>

+ 82 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/service/TExamService.java

@@ -0,0 +1,82 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.exam.domain.TExam;
+import vip.xiaonuo.exam.domain.exam.TExamAddParam;
+import vip.xiaonuo.exam.domain.exam.TExamEditParam;
+import vip.xiaonuo.exam.domain.exam.TExamIdParam;
+import vip.xiaonuo.exam.domain.exam.TExamPageParam;
+
+
+import java.util.List;
+
+/**
+ * 考试表Service接口
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+public interface TExamService extends IService<TExam> {
+
+    /**
+     * 获取考试表分页
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    Page<TExam> page(TExamPageParam tExamPageParam);
+
+    /**
+     * 添加考试表
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    void add(TExamAddParam tExamAddParam);
+
+    /**
+     * 编辑考试表
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    void edit(TExamEditParam tExamEditParam);
+
+    /**
+     * 删除考试表
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    void delete(List<TExamIdParam> tExamIdParamList);
+
+    /**
+     * 获取考试表详情
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     */
+    TExam detail(TExamIdParam tExamIdParam);
+
+    /**
+     * 获取考试表详情
+     *
+     * @author ZSS
+     * @date  2025/07/22 10:51
+     **/
+    TExam queryEntity(String id);
+
+}

+ 151 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/service/impl/TExamServiceImpl.java

@@ -0,0 +1,151 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.exam.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.exam.domain.CourseChapterPaper;
+import vip.xiaonuo.exam.domain.ExamPaper;
+import vip.xiaonuo.exam.domain.TExam;
+import vip.xiaonuo.exam.domain.enums.ExamPaperTypeEnum;
+import vip.xiaonuo.exam.domain.exam.TExamAddParam;
+import vip.xiaonuo.exam.domain.exam.TExamEditParam;
+import vip.xiaonuo.exam.domain.exam.TExamIdParam;
+import vip.xiaonuo.exam.domain.exam.TExamPageParam;
+import vip.xiaonuo.exam.mapper.CourseChapterPaperMapper;
+import vip.xiaonuo.exam.mapper.TExamMapper;
+import vip.xiaonuo.exam.service.ExamPaperService;
+import vip.xiaonuo.exam.service.TExamService;
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * 考试表Service接口实现类
+ *
+ * @author ZSS
+ * @date  2025/07/22 10:51
+ **/
+@Service
+public class TExamServiceImpl extends ServiceImpl<TExamMapper, TExam> implements TExamService {
+
+    @Resource
+    private ExamPaperService examPaperService;
+
+    @Resource
+    private CourseChapterPaperMapper courseChapterPaperMapper;
+
+    @Override
+    public Page<TExam> page(TExamPageParam tExamPageParam) {
+        QueryWrapper<TExam> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(tExamPageParam.getExamName())) {
+            queryWrapper.lambda().like(TExam::getExamName, tExamPageParam.getExamName());
+        }
+        if(ObjectUtil.isNotEmpty(tExamPageParam.getExamStatus())) {
+            queryWrapper.lambda().eq(TExam::getExamStatus, tExamPageParam.getExamStatus());
+        }
+        if(ObjectUtil.isNotEmpty(tExamPageParam.getStartStartTime()) && ObjectUtil.isNotEmpty(tExamPageParam.getEndStartTime())) {
+            queryWrapper.lambda().between(TExam::getStartTime, tExamPageParam.getStartStartTime(), tExamPageParam.getEndStartTime());
+        }
+        if(ObjectUtil.isNotEmpty(tExamPageParam.getStartEndTime()) && ObjectUtil.isNotEmpty(tExamPageParam.getEndEndTime())) {
+            queryWrapper.lambda().between(TExam::getEndTime, tExamPageParam.getStartEndTime(), tExamPageParam.getEndEndTime());
+        }
+        if(ObjectUtil.isNotEmpty(tExamPageParam.getPaperId())) {
+            queryWrapper.lambda().eq(TExam::getPaperId, tExamPageParam.getPaperId());
+        }
+        if(ObjectUtil.isAllNotEmpty(tExamPageParam.getSortField(), tExamPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(tExamPageParam.getSortOrder());
+            queryWrapper.orderBy(true, tExamPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(tExamPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(TExam::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(TExamAddParam tExamAddParam) {
+        ExamPaper examPaper = examPaperService.selectById(Integer.parseInt(tExamAddParam.getPaperId()));
+        if(ExamPaperTypeEnum.TimeLimit.getCode() == examPaper.getPaperType()){
+            tExamAddParam.setStartTime(examPaper.getLimitStartTime());
+            tExamAddParam.setEndTime(examPaper.getLimitEndTime());
+        }
+        TExam tExam = BeanUtil.toBean(tExamAddParam, TExam.class);
+        this.save(tExam);
+        if(tExamAddParam.getChapterId() != null && !tExamAddParam.getChapterId().isEmpty()){
+            CourseChapterPaper cp = new CourseChapterPaper();
+            cp.setChapterId(tExamAddParam.getChapterId());
+            cp.setPaperId(tExamAddParam.getPaperId());
+            cp.setType("0"); // 章节测验
+            courseChapterPaperMapper.add(cp);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(TExamEditParam tExamEditParam) {
+        TExam tExam = this.queryEntity(tExamEditParam.getId().toString());
+        if(tExamEditParam.getChapterId() != null && !tExamEditParam.getChapterId().isEmpty()){
+            CourseChapterPaper cp = new CourseChapterPaper();
+            cp.setChapterId(tExam.getChapterId());
+            cp.setPaperId(tExam.getPaperId());
+            cp.setType("0"); // 章节测验
+            courseChapterPaperMapper.delete(cp);
+            cp.setChapterId(tExamEditParam.getChapterId());
+            cp.setPaperId(tExamEditParam.getPaperId());
+            courseChapterPaperMapper.add(cp);
+        }
+        BeanUtil.copyProperties(tExamEditParam, tExam);
+        if(tExamEditParam.getPaperId() != null && !tExamEditParam.getPaperId().isEmpty()){
+            ExamPaper examPaper = examPaperService.selectById(Integer.parseInt(tExamEditParam.getPaperId()));
+            if(ExamPaperTypeEnum.TimeLimit.getCode() == examPaper.getPaperType()){
+                tExamEditParam.setStartTime(examPaper.getLimitStartTime());
+                tExamEditParam.setEndTime(examPaper.getLimitEndTime());
+            }
+        }
+        this.updateById(tExam);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<TExamIdParam> tExamIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(tExamIdParamList, TExamIdParam::getId));
+    }
+
+    @Override
+    public TExam detail(TExamIdParam tExamIdParam) {
+        return this.queryEntity(tExamIdParam.getId().toString());
+    }
+
+    @Override
+    public TExam queryEntity(String id) {
+        TExam tExam = this.getById(id);
+        if(ObjectUtil.isEmpty(tExam)) {
+            throw new CommonException("考试表不存在,id值为:{}", id);
+        }
+        return tExam;
+    }
+
+}