【修改】监控管理,【新增】学生端试卷接口

This commit is contained in:
YOHO\20373
2025-05-05 21:19:14 +08:00
47 changed files with 722 additions and 45 deletions

View File

@@ -27,7 +27,8 @@ import static pc.exam.pp.framework.apilog.core.enums.OperateTypeEnum.*;
import pc.exam.pp.module.exam.controller.admin.monitor.vo.*;
import pc.exam.pp.module.exam.dal.dataobject.monitor.MonitorDO;
import pc.exam.pp.module.exam.service.monitor.MonitorService;
import static pc.exam.pp.module.infra.enums.ErrorCodeConstants.DEMO03_MONITOR_SESSION_EXISTS;
import static pc.exam.pp.module.infra.enums.ErrorCodeConstants.DEMO03_MONITOR_TIME_EXISTS;
@Tag(name = "管理后台 - 监控管理")
@RestController
@@ -92,13 +93,18 @@ public void exportMonitorExcel(@Valid MonitorPageReqVO pageReqVO, HttpServletRes
{
return success("进入考试成功");
}
return error(100_200_300,"不在考试时间范围内!");
return error(DEMO03_MONITOR_TIME_EXISTS);
}
@PostMapping("/stuMonitorQu")
@Operation(summary = "学生端考试过程传试题")
public void updateStuMonitor(@Valid @RequestBody StuMonitorQuVo stuMonitorQuVo) {
monitorService.updateStuMonitor(stuMonitorQuVo);
public CommonResult<String> updateStuMonitor(@Valid @RequestBody StuMonitorQuVo stuMonitorQuVo) {
Boolean stuMonitor= monitorService.updateStuMonitor(stuMonitorQuVo);
if (!stuMonitor)
{
return error(DEMO03_MONITOR_SESSION_EXISTS);
}
return success("传值成功");
}
@PostMapping("/endMonitor")
@Operation(summary = "学生端结束考试返回值")
@@ -106,4 +112,19 @@ public void exportMonitorExcel(@Valid MonitorPageReqVO pageReqVO, HttpServletRes
monitorService.endStuMonitor(stuMonitorPaperEndVo);
}
@GetMapping("/getPaperTaskList")
@Operation(summary = "根据种类获得试卷任务")
@Parameter(name = "id", description = "试卷种类", required = true, example = "1024")
public CommonResult getPaperTaskList(@RequestParam("id") String id) {
return success(monitorService.getPaperTaskList(id));
}
@PostMapping("/updateMonitorStatus")
@Operation(summary = "改变考生状态")
public CommonResult updateMonitorStatus(@Valid @RequestBody StuMonitorStatusVo stuMonitorStatusVo) {
return success(monitorService.updateMonitorStatus(stuMonitorStatusVo));
}
}

View File

@@ -1,6 +1,7 @@
package pc.exam.pp.module.exam.controller.admin.monitor.vo;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -15,6 +16,7 @@ import static pc.exam.pp.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MonitorPageReqVO extends PageParam {
private String [] monitorId;
@Schema(description = "用户账号", example = "芋艿")
private String username;
@@ -37,6 +39,8 @@ private String paperNum;
@Schema(description = "场次", example = "赵六")
private String taskName;
private String taskType;
@Schema(description = "机器ip")
private String ip;

View File

@@ -39,10 +39,14 @@ private String score;
@ExcelProperty("试卷编号")
private String paperNum;
@Schema(description = "场次", example = "赵六")
@ExcelProperty("场次")
@Schema(description = "任务名称")
@ExcelProperty("任务名称")
private String taskName;
@Schema(description = "任务类别")
@ExcelProperty("任务类别")
private String taskType;
@Schema(description = "机器ip")
@ExcelProperty("机器ip")
private String ip;

View File

@@ -0,0 +1,12 @@
package pc.exam.pp.module.exam.controller.admin.monitor.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 监控管理 改变学生考试状态 Request VO")
@Data
public class StuMonitorStatusVo {
private List<String> monitorIds;
private String status;
}

View File

@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.*;
import pc.exam.pp.framework.common.pojo.CommonResult;
import pc.exam.pp.framework.common.pojo.PageResult;
import pc.exam.pp.framework.common.util.object.BeanUtils;
import pc.exam.pp.module.exam.controller.admin.paper.dto.EducationPaperStuDto;
import pc.exam.pp.module.exam.controller.admin.paper.dto.PaperQueryRequest;
import pc.exam.pp.module.exam.controller.admin.paper.dto.StatusDto;
import pc.exam.pp.module.exam.controller.admin.paper.vo.PaperPageVo;
@@ -19,6 +20,7 @@ import pc.exam.pp.module.exam.service.paper.IEducationPaperService;
import java.util.List;
import static pc.exam.pp.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
import static pc.exam.pp.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 试卷Controller
@@ -152,8 +154,6 @@ public class EducationPaperController
@PostMapping(value = "/getPaperByTaskIdByType")
public CommonResult getPaperByTaskIdByType(@RequestBody PaperQueryRequest requestData)
{
return CommonResult.success(educationPaperService.getPaperByTaskIdByType(requestData.getTaskId(), requestData.getRows()));
}
@@ -165,4 +165,14 @@ public class EducationPaperController
);
}
@GetMapping("/stulist")
public CommonResult<PageResult<EducationPaperStuDto>> stulist(PaperPageVo paperPageVo)
{
PageResult<EducationPaperStuDto> pageResult = educationPaperService.selectStuEducationPaperList(paperPageVo);
return CommonResult.success(pageResult);
}
}

View File

@@ -0,0 +1,39 @@
package pc.exam.pp.module.exam.controller.admin.paper.dto;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaperParam;
@Data
public class EducationPaperStuDto {
private static final long serialVersionUID = 1L;
/** 主键ID */
@TableId
private String paperId;
/** 试卷任务ID */
// @Excel(name = "试卷任务ID")
private String taskId;
private String num;
/** 使用次数 */
// @Excel(name = "使用次数")
private String counts;
/** 抽卷方式(0固定1AB2随机) */
//@Excel(name = "抽卷方式(0固定1AB2随机)")
private String rollUp;
/** 0A1B */
//Excel(name = "0A1B")
private String isAb;
EducationPaperParam educationPaperParam;
}

View File

@@ -5,6 +5,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import pc.exam.pp.framework.common.pojo.PageParam;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaperParam;
@Schema(description = "试卷vo")
@Data
@EqualsAndHashCode(callSuper = true)

View File

@@ -48,6 +48,5 @@ public class EducationPaper extends TenantBaseDO
// @Excel(name = "0启用1不启")
private String status;
}

View File

@@ -27,6 +27,12 @@ public class EducationPaperParam
/** 试卷任务ID */
// @Excel(name = "试卷任务ID")
private String taskId;
//是否显示试卷编号
private String isNumber;
//是否显示试卷内容
private String isContent;
//是否显示答案id
private String isAnswerId;
/** 是否使用监考密码验证0是1否 */
// @Excel(name = "是否使用监考密码验证", readConverterExp = "0=是1否")

View File

@@ -1,5 +1,6 @@
package pc.exam.pp.module.exam.dal.dataobject;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -24,6 +25,7 @@ public class EducationPaperSession
private static final long serialVersionUID = 1L;
/** 主键ID */
@TableId
private String sessionId;
/** 试卷任务ID */

View File

@@ -1,6 +1,8 @@
package pc.exam.pp.module.exam.dal.dataobject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -39,6 +41,8 @@ public class EducationPaperTask extends TenantBaseDO
//@Excel(name = "试卷任务模式")
private String taskType;
private String isOne;
/** 是否为模板 */
//@Excel(name = "是否为模板")
private String isTemplate;
@@ -47,8 +51,8 @@ public class EducationPaperTask extends TenantBaseDO
//@Excel(name = "是否启用", readConverterExp = "0=:启用1:停用")
private String status;
@TableField(exist = false)
private String count;
}

View File

@@ -27,6 +27,8 @@ public class MonitorDO extends BaseDO {
*/
@TableId(type = IdType.INPUT)
private String monitorId;
private String stuId;
/**
* 用户账号
*/
@@ -51,10 +53,11 @@ private String score;
* 试卷编号
*/
private String paperNum;
/**
* 场次
*/
private String taskId;
private String taskName;
private String taskType;
/**
* 机器ip
*/

View File

@@ -0,0 +1,38 @@
package pc.exam.pp.module.exam.dal.dataobject.student;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import pc.exam.pp.framework.tenant.core.db.TenantBaseDO;
/**
* 学生-试卷-文件表 DO
*
* @author rwb
*/
@TableName("exam_stu_paper_fileurl")
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StuPaperFileDO extends TenantBaseDO {
/**
* Id
*/
@TableId
private Long id;
/**
* 学生号
*/
private Long stuId;
/**
* 试卷ID
*/
private String paperId;
/**
* 学生文件URL
*/
private String url;
}

View File

@@ -8,6 +8,9 @@ import org.apache.ibatis.annotations.Mapper;
import pc.exam.pp.module.exam.controller.admin.monitor.vo.MonitorPageReqVO;
import pc.exam.pp.module.exam.dal.dataobject.monitor.MonitorDO;
import java.util.Arrays;
import java.util.Optional;
/**
* 监控管理 Mapper
*
@@ -18,10 +21,12 @@ import pc.exam.pp.module.exam.dal.dataobject.monitor.MonitorDO;
default PageResult<MonitorDO> selectPage(MonitorPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<MonitorDO>()
.inIfPresent(MonitorDO::getMonitorId, Optional.ofNullable(reqVO.getMonitorId()).map(Arrays::asList).orElse(null))
.likeIfPresent(MonitorDO::getUsername, reqVO.getUsername())
.likeIfPresent(MonitorDO::getNickname, reqVO.getNickname())
.likeIfPresent(MonitorDO::getClassName, reqVO.getClassName())
.eqIfPresent(MonitorDO::getExamStatus, reqVO.getExamStatus())
.eqIfPresent(MonitorDO::getTaskType, reqVO.getTaskType())
.eqIfPresent(MonitorDO::getScore, reqVO.getScore())
.eqIfPresent(MonitorDO::getPaperNum, reqVO.getPaperNum())
.likeIfPresent(MonitorDO::getTaskName, reqVO.getTaskName())

View File

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
import pc.exam.pp.framework.common.pojo.PageResult;
import pc.exam.pp.framework.mybatis.core.mapper.BaseMapperX;
import pc.exam.pp.framework.mybatis.core.query.LambdaQueryWrapperX;
import pc.exam.pp.module.exam.controller.admin.paper.dto.EducationPaperStuDto;
import pc.exam.pp.module.exam.controller.admin.paper.vo.PaperPageVo;
import pc.exam.pp.module.exam.controller.admin.paper.vo.PaperTaskPageVo;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaper;
@@ -121,5 +122,12 @@ public interface EducationPaperMapper extends BaseMapperX<EducationPaper>
int selectCountPaperList();
default PageResult<EducationPaper> selectStuEducationPaperList(PaperPageVo paperPageVo) {
return selectPage(paperPageVo, new LambdaQueryWrapperX<EducationPaper>()
.likeIfPresent(EducationPaper::getTaskId, paperPageVo.getTaskId())
.isNotNull(EducationPaper::getRollUp) // 改为数据库字段不为 null
.eq(EducationPaper::getStatus, 0)
);
}
}

View File

@@ -107,4 +107,5 @@ public interface EducationPaperPersonMapper
List<PersonRepDto> selectEducationPaperPersonBySessionIdNotIn(SessionStuPageReqVO sessionStuPageReqVO);
List<String> selectStuIdByTaskId(String taskId);
}

View File

@@ -109,4 +109,5 @@ public interface EducationPaperTaskMapper extends BaseMapperX<EducationPaperTask
String selectStuClassNameByClassId(Long classId);
List<EducationPaperTask> selectEducationPaperTaskByTaskType(String id);
}

View File

@@ -0,0 +1,18 @@
package pc.exam.pp.module.exam.dal.mysql.student;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import pc.exam.pp.framework.mybatis.core.mapper.BaseMapperX;
import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperFileDO;
/**
* 学生-试卷-文件 Mapper
*
* @author rwb
*/
@Mapper
public interface StuPaperFileMapper extends BaseMapperX<StuPaperFileDO> {
StuPaperFileDO findByStuIdAndPaperId(@Param("stuId") Long stuId, @Param("paperId") String paperId);
}

View File

@@ -3,8 +3,11 @@ package pc.exam.pp.module.exam.service.monitor;
import jakarta.validation.*;
import pc.exam.pp.framework.common.pojo.PageResult;
import pc.exam.pp.module.exam.controller.admin.monitor.vo.*;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaperTask;
import pc.exam.pp.module.exam.dal.dataobject.monitor.MonitorDO;
import java.util.List;
/**
* 监控管理 Service 接口
*
@@ -52,8 +55,11 @@ import pc.exam.pp.module.exam.dal.dataobject.monitor.MonitorDO;
Boolean getStuMonitor(StuMonitorPaperVo stuMonitorPaperVo);
void updateStuMonitor(StuMonitorQuVo stuMonitorQuVo);
Boolean updateStuMonitor(StuMonitorQuVo stuMonitorQuVo);
void endStuMonitor(StuMonitorPaperEndVo stuMonitorPaperEndVo);
List<EducationPaperTask> getPaperTaskList(String id);
Boolean updateMonitorStatus(StuMonitorStatusVo stuMonitorStatusVo);
}

View File

@@ -108,6 +108,18 @@ public class MonitorServiceImpl implements MonitorService {
MonitorDO info = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(key),MonitorDO.class);
if (StringUtils.isNotBlank(stuMonitorPaperVo.getPaperId())){
EducationPaper educationPaper = educationPaperMapper.selectEducationPaperByPaperId(stuMonitorPaperVo.getPaperId());
String counts = educationPaper.getCounts();
int count = 0;
try {
count = Integer.parseInt(counts);
} catch (NumberFormatException | NullPointerException e) {
count = 0; // 默认从 0 开始
}
count += 1;
educationPaper.setCounts(String.valueOf(count));
educationPaperMapper.updateById(educationPaper);
info.setPaperNum(educationPaper.getNum());
}
@@ -153,6 +165,9 @@ public class MonitorServiceImpl implements MonitorService {
long remainingSeconds = ChronoUnit.SECONDS.between(LocalDateTime.now(),
DateUtil.toLocalDateTime(endTime));
info.setRemainingTime(remainingSeconds > 0 ? remainingSeconds : 0);
//todo 考虑加点时间,或判分后删除
stringRedisTemplate.opsForValue().set("userCache:"+stuMonitorPaperVo.getTaskId()+":"+stuMonitorPaperVo.getStuId(), JsonUtils.toJsonString(info), remainingSeconds, TimeUnit.SECONDS);
monitorMapper.updateById(info);
return true;
@@ -164,10 +179,13 @@ public class MonitorServiceImpl implements MonitorService {
}
@Override
public void updateStuMonitor(StuMonitorQuVo stuMonitorQuVo) {
public Boolean updateStuMonitor(StuMonitorQuVo stuMonitorQuVo) {
String key = "userCache:"+stuMonitorQuVo.getTaskId()+":" + stuMonitorQuVo.getStuId();
MonitorDO info = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(key),MonitorDO.class);
if (info != null) {
if (!("1".equals(info.getExamStatus()))){
return false;
}
AtomicInteger totalScore = new AtomicInteger(); // 用于累加总分
// 记录答题结果
List<StuMonitorQuVo.EducationPaperSchemeMap> paperSchemeMaps = stuMonitorQuVo.getPaperSchemeMaps();
@@ -193,6 +211,7 @@ public class MonitorServiceImpl implements MonitorService {
redisTemplate.opsForValue().set(key, info);
// monitorMapper.updateById(info);
}
return true;
}
@@ -216,11 +235,57 @@ public class MonitorServiceImpl implements MonitorService {
info.setExamStatus("0");
}else {
info.setExamStatus("2");
redisTemplate.delete(key);
}
redisTemplate.delete(key);
monitorMapper.updateById(info);
}
@Override
public List<EducationPaperTask> getPaperTaskList(String id) {
return educationPaperTaskMapper.selectEducationPaperTaskByTaskType(id);
}
@Override
public Boolean updateMonitorStatus(StuMonitorStatusVo stuMonitorStatusVo) {
String status = stuMonitorStatusVo.getStatus();
List<String> monitorIds = stuMonitorStatusVo.getMonitorIds();
if ("1".equals(status)||"0".equals(status)){
//新增或更新
for (String monitorId : monitorIds) {
MonitorDO monitorDO = monitorMapper.selectById(monitorId);
String taskId = monitorDO.getTaskId();
String stuId = monitorDO.getStuId();
String key = "userCache:" + taskId+":" +stuId;
monitorDO.setExamStatus(status);
monitorMapper.updateById(monitorDO);
MonitorDO info = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(key),MonitorDO.class);
info.setExamStatus(status);
stringRedisTemplate.opsForValue().set(key, JsonUtils.toJsonString(info));
}
}
if ("2".equals(status)){
//删除
for (String monitorId : monitorIds) {
MonitorDO monitorDO = monitorMapper.selectById(monitorId);
String taskId = monitorDO.getTaskId();
String stuId = monitorDO.getStuId();
String key = "userCache:" + taskId+":" +stuId;
monitorDO.setExamStatus(status);
monitorMapper.updateById(monitorDO);
redisTemplate.delete(key);
}
}
return true;
}
}

View File

@@ -196,7 +196,7 @@ public class EducationPaperPersonServiceImpl implements IEducationPaperPersonSer
} else if (existing == null) {
EducationPaperTask educationPaperTask = educationPaperTaskMapper.selectEducationPaperTaskByTaskId(taskId);
String name= educationPaperTaskMapper.selectEducationPaperTaskNameByid(taskId);
@@ -206,6 +206,8 @@ public class EducationPaperPersonServiceImpl implements IEducationPaperPersonSer
String uuid = IdUtils.simpleUUID();
MonitorDO info = new MonitorDO();
info.setMonitorId(uuid);
info.setTaskId(taskId);
info.setStuId(studentId);
info.setUsername(personRepDto.getUsername());
info.setNickname(personRepDto.getNickname());
//设置学生班级
@@ -217,6 +219,7 @@ public class EducationPaperPersonServiceImpl implements IEducationPaperPersonSer
info.setScore("0");
info.setPaperNum("");
info.setTaskName(name);
info.setTaskType(educationPaperTask.getTaskType());
stringRedisTemplate.opsForValue().set(key, JsonUtils.toJsonString(info));
monitorMapper.insert(info);

View File

@@ -1,24 +1,22 @@
package pc.exam.pp.module.exam.service.paper;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pc.exam.pp.framework.common.pojo.PageResult;
import pc.exam.pp.framework.tenant.core.aop.TenantIgnore;
import pc.exam.pp.framework.tenant.core.context.TenantContextHolder;
import pc.exam.pp.module.exam.controller.admin.paper.dto.EducationPaperStuDto;
import pc.exam.pp.module.exam.controller.admin.paper.vo.PaperPageVo;
import pc.exam.pp.module.exam.dal.dataobject.PaperListResponseVo;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaper;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaperQu;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaperScheme;
import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperMapper;
import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperQuMapper;
import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperSchemeMapper;
import pc.exam.pp.module.exam.dal.mysql.paper.EducationPaperTaskMapper;
import pc.exam.pp.module.exam.dal.dataobject.*;
import pc.exam.pp.module.exam.dal.mysql.paper.*;
import pc.exam.pp.module.exam.utils.uuid.IdUtils;
import java.util.*;
import static pc.exam.pp.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 试卷Service业务层处理
*
@@ -31,12 +29,17 @@ public class EducationPaperServiceImpl implements IEducationPaperService
@Autowired
private EducationPaperMapper educationPaperMapper;
@Autowired
private EducationPaperParamMapper educationPaperParamMapper;
@Autowired
private EducationPaperSchemeMapper educationPaperSchemeMapper;
@Autowired
private EducationPaperTaskMapper educationPaperTaskMapper;
@Autowired
private EducationPaperQuMapper educationPaperQuMapper;
@Autowired
private EducationPaperPersonMapper educationPaperPersonMapper;
/**
* 查询试卷
*
@@ -257,6 +260,46 @@ public class EducationPaperServiceImpl implements IEducationPaperService
return educationPaperMapper.changeStatus(paperId,status);
}
@Override
public PageResult<EducationPaperStuDto> selectStuEducationPaperList(PaperPageVo paperPageVo) {
String taskId = paperPageVo.getTaskId();
List<String> stuIds=educationPaperPersonMapper.selectStuIdByTaskId(taskId);
Long loginUserId = getLoginUserId();
// 判断试卷任务是否包含此学生
if (stuIds.contains(String.valueOf(loginUserId))) {
//
List<EducationPaperStuDto> educationPaperStuDtos=new ArrayList<>();
PageResult<EducationPaper> educationPaperPageResult = educationPaperMapper.selectStuEducationPaperList(paperPageVo);
List<EducationPaper> list = educationPaperPageResult.getList();
if (list!=null&&list.size()>0){
for (EducationPaper educationPaper : list) {
EducationPaperStuDto educationPaperStuDto=new EducationPaperStuDto();
EducationPaperParam educationPaperParam = educationPaperParamMapper.selectEducationPaperParamByTaskId(educationPaper.getTaskId());
educationPaperStuDto.setPaperId(educationPaper.getPaperId());
educationPaperStuDto.setNum(educationPaper.getNum());
educationPaperStuDto.setTaskId(educationPaper.getTaskId());
educationPaperStuDto.setCounts(educationPaper.getCounts());
educationPaperStuDto.setRollUp(educationPaper.getRollUp());
educationPaperStuDto.setIsAb(educationPaper.getIsAb());
educationPaperStuDto.setEducationPaperParam(educationPaperParam);
educationPaperStuDtos.add(educationPaperStuDto);
}
}
PageResult<EducationPaperStuDto> educationPaperStuDtoPageResult=new PageResult<>();
educationPaperStuDtoPageResult.setList(educationPaperStuDtos);
educationPaperStuDtoPageResult.setTotal(educationPaperPageResult.getTotal());
return educationPaperStuDtoPageResult;
} else {
// 不包含
PageResult<EducationPaperStuDto> educationPaperStuDtoPageResult=new PageResult<>();
return educationPaperStuDtoPageResult;
}
}
}

View File

@@ -68,6 +68,27 @@ public class EducationPaperTaskServiceImpl implements IEducationPaperTaskService
@Override
public PageResult<EducationPaperTask> selectEducationPaperTaskList(PaperTaskPageVo educationPaperTask) {
PageResult<EducationPaperTask> educationPaperTasks = educationPaperTaskMapper.selectEducationPaperTaskList(educationPaperTask);
List<EducationPaperTask> list = educationPaperTasks.getList();
if (list!=null&&list.size()>0){
for (EducationPaperTask paperTask : list) {
int count=0;
List<EducationPaper> educationPapers = educationPaperMapper.selectPaperListByTaskId(paperTask.getTaskId());
if (educationPapers!=null&&educationPapers.size()>0){
for (EducationPaper educationPaper : educationPapers) {
try {
count += Integer.parseInt(educationPaper.getCounts());
} catch (NumberFormatException e) {
// 可选:记录异常或忽略非法数字
System.err.println("无效的 counts 值: " + educationPaper.getCounts());
}
}
}
paperTask.setCount(String.valueOf(count));
}
}
return educationPaperTasks ;
}
@@ -89,6 +110,11 @@ public class EducationPaperTaskServiceImpl implements IEducationPaperTaskService
educationPaperParam.setUsb("0");
educationPaperParam.setSaveGrades("0");
educationPaperParam.setDriver("C");
educationPaperParam.setIsNumber("1");
educationPaperParam.setIsConnect("0");
educationPaperParam.setIsAnswerId("1");
educationPaperParam.setDirectory("KSWJ");
educationPaperParam.setUploadTime("5");
educationPaperParam.setIsDel("0");

View File

@@ -2,6 +2,7 @@ package pc.exam.pp.module.exam.service.paper;
import pc.exam.pp.framework.common.pojo.PageResult;
import pc.exam.pp.module.exam.controller.admin.paper.dto.EducationPaperStuDto;
import pc.exam.pp.module.exam.controller.admin.paper.vo.PaperPageVo;
import pc.exam.pp.module.exam.dal.dataobject.PaperListResponseVo;
import pc.exam.pp.module.exam.dal.dataobject.EducationPaper;
@@ -87,5 +88,7 @@ public interface IEducationPaperService
int changeStatus(String paperId, String status);
PageResult<EducationPaperStuDto> selectStuEducationPaperList(PaperPageVo paperPageVo);
}

View File

@@ -0,0 +1,24 @@
package pc.exam.pp.module.exam.service.stu_paper_file;
import jakarta.validation.Valid;
import pc.exam.pp.framework.common.pojo.PageResult;
import pc.exam.pp.module.exam.controller.admin.student.vo.StudentPageReqVO;
import pc.exam.pp.module.exam.controller.admin.student.vo.StudentSaveReqVO;
import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperFileDO;
import pc.exam.pp.module.exam.dal.dataobject.student.StudentDO;
import java.util.List;
/**
* 学生-试卷-文件 Service 接口
*
* @author rwb
*/
public interface StuPaperFileService {
StuPaperFileDO findByStuIDAndPaperId(Long stuID, String paperID);
void insertStuPaperFile(StuPaperFileDO stuPaperFileDO);
void updateStuPaperFile(StuPaperFileDO stuPaperFileDO);
}

View File

@@ -0,0 +1,35 @@
package pc.exam.pp.module.exam.service.stu_paper_file;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import pc.exam.pp.module.exam.dal.dataobject.student.StuPaperFileDO;
import pc.exam.pp.module.exam.dal.mysql.student.StuPaperFileMapper;
/**
* 学生-试卷-文件 Service 实现类
*
* @author rwb
*/
@Service
@Validated
public class StuPaperFileServiceImpl implements StuPaperFileService {
@Resource
private StuPaperFileMapper stuPaperFileMapper;
@Override
public StuPaperFileDO findByStuIDAndPaperId(Long stuID, String paperID) {
return stuPaperFileMapper.findByStuIdAndPaperId(stuID, paperID);
}
@Override
public void insertStuPaperFile(StuPaperFileDO stuPaperFileDO) {
stuPaperFileMapper.insert(stuPaperFileDO);
}
@Override
public void updateStuPaperFile(StuPaperFileDO stuPaperFileDO) {
stuPaperFileMapper.updateById(stuPaperFileDO);
}
}

View File

@@ -7,6 +7,9 @@
<resultMap type="EducationPaperParam" id="EducationPaperParamResult">
<result property="paramId" column="param_id" />
<result property="taskId" column="task_id" />
<result property="isNumber" column="is_number" />
<result property="isContent" column="is_content" />
<result property="isAnswerId" column="is_answer_id" />
<result property="isExamPassword" column="is_exam_password" />
<result property="examPassword" column="exam_password" />
<result property="usb" column="usb" />
@@ -23,7 +26,7 @@
</resultMap>
<sql id="selectEducationPaperParamVo">
select param_id, task_id, is_exam_password, exam_password, usb, save_grades, driver, directory, upload_time, is_del,is_repeat ,is_answer,is_look,is_connect,is_session from education_paper_param
select param_id, task_id, is_number,is_content,is_answer_id,is_exam_password, exam_password, usb, save_grades, driver, directory, upload_time, is_del,is_repeat ,is_answer,is_look,is_connect,is_session from education_paper_param
</sql>
<select id="selectEducationPaperParamList" parameterType="EducationPaperParam" resultMap="EducationPaperParamResult">
@@ -55,6 +58,9 @@
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="paramId != null">param_id,</if>
<if test="taskId != null">task_id,</if>
<if test="isNumber != null">is_number,</if>
<if test="isContent != null">is_content,</if>
<if test="isAnswerId != null">is_answer_id,</if>
<if test="isExamPassword != null">is_exam_password,</if>
<if test="examPassword != null">exam_password,</if>
<if test="usb != null">usb,</if>
@@ -73,6 +79,9 @@
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="paramId != null">#{paramId},</if>
<if test="taskId != null">#{taskId},</if>
<if test="isNumber != null">#{isNumber},</if>
<if test="isContent != null">#{isContent},</if>
<if test="isAnswerId != null">#{isAnswerId},</if>
<if test="isExamPassword != null">#{isExamPassword},</if>
<if test="examPassword != null">#{examPassword},</if>
<if test="usb != null">#{usb},</if>
@@ -94,6 +103,9 @@
update education_paper_param
<trim prefix="SET" suffixOverrides=",">
<if test="taskId != null">task_id = #{taskId},</if>
<if test="isNumber != null">is_number = #{isNumber},</if>
<if test="isContent != null">is_content = #{isContent},</if>
<if test="isAnswerId != null">is_answer_id = #{isAnswerId},</if>
<if test="isExamPassword != null">is_exam_password = #{isExamPassword},</if>
<if test="examPassword != null">exam_password = #{examPassword},</if>
<if test="usb != null">usb = #{usb},</if>

View File

@@ -107,6 +107,10 @@
ORDER BY s.id DESC
</select>
<select id="selectStuIdByTaskId" resultType="java.lang.String">
select person_id from education_paper_person where task_id=#{taskId}
</select>
<insert id="insertEducationPaperPerson" parameterType="EducationPaperPerson">

View File

@@ -113,6 +113,12 @@
<select id="selectStuClassNameByClassId" resultType="java.lang.String">
select name from exam_class where id=#{classId}
</select>
<select id="selectEducationPaperTaskByTaskType"
resultMap="EducationPaperTaskResult">
<include refid="selectEducationPaperTaskVo"/>
where task_type = #{id}
and deleted='0'
</select>
<insert id="insertEducationPaperTask" parameterType="EducationPaperTask">

View File

@@ -38,7 +38,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<where>
<if test="quId != null "> and qu_id = #{quId}</if>
</where>
and (file_type = '0' or file_type ='1')
</select>
<insert id="insertSysFile" parameterType="SysFileUpload">

View File

@@ -0,0 +1,15 @@
<?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="pc.exam.pp.module.exam.dal.mysql.student.StuPaperFileMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="findByStuIdAndPaperId" resultType="pc.exam.pp.module.exam.dal.dataobject.student.StuPaperFileDO">
SELECT * FROM exam_stu_paper_fileurl WHERE stu_id = #{stuId} AND paper_id = #{paperId}
</select>
</mapper>