This commit is contained in:
weizhong committed 2025-08-22 14:58:23 +08:00
commit 0c0bf72f46
208 files changed
+33841 -2031

No files matched your search

+8 -1
View File
@@ -169,4 +169,11 @@ script/*
stgl-api-test.js
update/*
本地临时文件目录/*
docs/变更管理/
docs/变更管理/
学生考核模块的提示词.md
学生考核模块的上下文信息临时存储.md
学生违纪记录界面-移动端.md
学生考核申请界面-移动端.md
移动端附件组件规范.md
移动端违纪记录模块开发规范.md
.playwright-mcp/
+1
View File
@@ -414,6 +414,7 @@
<version>${revision}</version>
</dependency>
<!-- 社团管理模块 -->
<!-- <dependency>
<groupId>org.dromara</groupId>
+1
View File
@@ -112,6 +112,7 @@
<groupId>org.dromara</groupId>
<artifactId>ruoyi-xg</artifactId>
</dependency>
<!-- 学工管理-学生信息管理模块 -->
<!-- <dependency>
<groupId>org.dromara</groupId>
@@ -324,7 +324,6 @@ public class JcbtWorkStudyApplicationController extends BaseController {
* 获取当前用户学生信息
*/
@Operation(summary = "获取当前用户学生信息")
@SaCheckPermission("jcbt:workStudyApplication:query")
@GetMapping("/currentStudentInfo")
public R<XgStudentMsgVo> getCurrentStudentInfo() {
try {
@@ -347,4 +346,17 @@ public class JcbtWorkStudyApplicationController extends BaseController {
}
}
/**
* 获取学生已申请岗位列表
*/
@Operation(summary = "获取学生已申请岗位列表")
@GetMapping("/student/applicationStatus")
@SaCheckPermission("jcbt:workStudyApplication:query")
public R<List<Map<String, Object>>> getStudentApplicationStatus() {
List<Map<String, Object>> statusList = workStudyApplicationService.getStudentApplicationStatus();
return R.ok(statusList);
}
}
@@ -416,10 +416,64 @@ public class JcbtWorkStudyPositionController extends BaseController {
/**
* 获取当前用户所在学院ID
* TODO: 实现获取当前用户学院ID的逻辑
* 通过查询学生信息或用户部门信息获取
*/
private Long getCurrentUserCollegeId() {
// 临时返回固定值,实际应该从用户信息中获取
return 1L;
try {
// 获取当前登录用户ID
Long userId = LoginHelper.getUserId();
if (userId == null) {
log.warn("用户未登录");
return null;
}
// 首先尝试通过学生信息获取学院ID
try {
XgStudentMsgVo studentInfo = xgStudentMsgService.queryByUserId(userId);
if (studentInfo != null && studentInfo.getCollegeId() != null) {
log.debug("通过学生信息获取学院ID: {}", studentInfo.getCollegeId());
return Long.parseLong(studentInfo.getCollegeId());
}
} catch (Exception e) {
log.debug("通过学生信息获取学院ID失败,可能用户不是学生: {}", e.getMessage());
}
// 如果不是学生用户,通过用户部门信息获取学院ID
try {
Long deptId = LoginHelper.getDeptId();
if (deptId != null) {
log.debug("通过部门信息获取学院ID: {}", deptId);
return deptId;
}
} catch (Exception e) {
log.debug("通过部门信息获取学院ID失败: {}", e.getMessage());
}
// 尝试通过部门类别获取学院信息
try {
String deptCategory = LoginHelper.getDeptCategory();
String deptName = LoginHelper.getDeptName();
log.debug("用户部门信息 - 部门名称: {}, 部门类别: {}", deptName, deptCategory);
// 如果部门类别是学院类型,则使用部门ID作为学院ID
if ("college".equals(deptCategory) || "学院".equals(deptCategory)) {
Long deptId = LoginHelper.getDeptId();
if (deptId != null) {
log.info("根据部门类别确认为学院用户,学院ID: {}", deptId);
return deptId;
}
}
} catch (Exception e) {
log.debug("通过部门类别获取学院ID失败: {}", e.getMessage());
}
log.warn("无法获取用户 {} 的学院信息,用户ID: {}, 部门ID: {}, 部门名称: {}",
userId, userId, LoginHelper.getDeptId(), LoginHelper.getDeptName());
return null;
} catch (Exception e) {
log.error("获取当前用户学院ID失败", e);
return null;
}
}
}
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.util.Date;
import java.util.List;
@@ -25,6 +27,7 @@ public class JcbtScholarshipBatch extends BaseEntity {
* 主键ID
*/
@TableId(value = "id")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
@@ -101,6 +104,7 @@ public class JcbtScholarshipBatch extends BaseEntity {
* 租户ID
*/
@TableField("tenant_id")
@JsonSerialize(using = ToStringSerializer.class)
private Long tenantId;
/**
@@ -48,12 +48,6 @@ public class JcbtWorkStudyPosition extends BaseEntity {
*/
private String workTime;
/**
* 工作地点
*/
@TableField(exist = false)
private String workLocation;
/**
* 岗位有效期开始
*/
@@ -8,6 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.util.Date;
import java.util.List;
@@ -27,6 +29,7 @@ public class JcbtScholarshipBatchBo extends BaseEntity {
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
@@ -121,6 +124,7 @@ public class JcbtScholarshipBatchBo extends BaseEntity {
/**
* 租户ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long tenantId;
}
@@ -56,13 +56,6 @@ public class JcbtWorkStudyPositionBo extends BaseEntity {
@Size(max = 200, message = "工作时间描述长度不能超过200个字符")
private String workTime;
/**
* 工作地点
*/
@NotBlank(message = "工作地点不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 200, message = "工作地点描述长度不能超过200个字符")
private String workLocation;
/**
* 岗位有效期开始
*/
@@ -8,6 +8,8 @@ import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.io.Serial;
import java.io.Serializable;
@@ -32,6 +34,7 @@ public class JcbtScholarshipBatchVo implements Serializable {
* 主键ID
*/
@ExcelProperty(value = "主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
@@ -130,6 +133,7 @@ public class JcbtScholarshipBatchVo implements Serializable {
/**
* 创建者
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long createBy;
/**
@@ -141,6 +145,7 @@ public class JcbtScholarshipBatchVo implements Serializable {
/**
* 更新者
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long updateBy;
/**
@@ -157,6 +162,7 @@ public class JcbtScholarshipBatchVo implements Serializable {
/**
* 租户ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long tenantId;
}
@@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.jcbt.domain.JcbtWorkStudyApplication;
import org.dromara.jcbt.domain.vo.JcbtWorkStudyApplicationVo;
import java.util.List;
import java.util.Map;
/**
@@ -24,4 +25,6 @@ public interface JcbtWorkStudyApplicationMapper extends BaseMapperPlus<JcbtWorkS
*/
Map<String, Object> selectApplicationStatus(@Param("positionId") Long positionId, @Param("userId") Long userId);
List<Map<String, Object>> selectApplicationStatusByStudentId(@Param("studentId") Long studentId);
}
@@ -164,4 +164,10 @@ public interface IJcbtWorkStudyApplicationService {
*/
Map<String, Object> getPositionApplicationStatistics(Long positionId);
/**
* 获取学生已申请岗位列表
*
* @return 学生已申请岗位状态列表 (包含岗位ID和申请状态)
*/
List<Map<String, Object>> getStudentApplicationStatus();
}
@@ -3,9 +3,11 @@ package org.dromara.jcbt.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
@@ -30,6 +32,7 @@ import java.util.List;
* @author ruoyi
* @date 2025-01-27
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class JcbtScholarshipBatchServiceImpl implements IJcbtScholarshipBatchService {
@@ -112,9 +115,52 @@ public class JcbtScholarshipBatchServiceImpl implements IJcbtScholarshipBatchSer
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(JcbtScholarshipBatchBo bo) {
// 添加调试日志 - 检查BO的ID
log.info("=== 修改操作调试 ===");
log.info("输入BO的ID: {}, 类型: {}", bo.getId(), bo.getId() != null ? bo.getId().getClass().getSimpleName() : "null");
log.info("输入BO的批次编码: {}", bo.getBatchCode());
JcbtScholarshipBatch update = MapstructUtils.convert(bo, JcbtScholarshipBatch.class);
// 添加调试日志 - 检查转换后实体的ID
log.info("转换后实体的ID: {}, 类型: {}", update.getId(), update.getId() != null ? update.getId().getClass().getSimpleName() : "null");
log.info("转换后实体的批次编码: {}", update.getBatchCode());
validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0;
// 添加详细调试 - 检查updateById前的状态
log.info("=== updateById执行前检查 ===");
log.info("实体ID是否为null: {}", update.getId() == null);
log.info("实体ID值: {}", update.getId());
log.info("实体批次编码: {}", update.getBatchCode());
// 先检查数据库中是否存在该记录
JcbtScholarshipBatch existingRecord = baseMapper.selectById(update.getId());
log.info("数据库中是否存在该记录: {}", existingRecord != null);
if (existingRecord != null) {
log.info("数据库中的记录: ID={}, 批次编码={}", existingRecord.getId(), existingRecord.getBatchCode());
}
log.info("=== 开始执行updateById ===");
// 使用更安全的更新策略,避免唯一键约束冲突
boolean flag;
try {
flag = baseMapper.updateById(update) > 0;
log.info("updateById执行成功: {}", flag);
} catch (Exception e) {
log.error("updateById执行失败,错误信息: {}", e.getMessage());
// 如果是唯一键冲突,尝试使用自定义更新SQL
if (e.getMessage().contains("Duplicate entry") || e.getMessage().contains("duplicate key")) {
log.info("检测到唯一键冲突,尝试使用自定义更新策略");
flag = updateByIdSafely(update);
log.info("自定义更新策略执行结果: {}", flag);
} else {
// 其他异常直接抛出
throw e;
}
}
if (flag) {
// 更新批次类型关联关系
@@ -129,8 +175,17 @@ public class JcbtScholarshipBatchServiceImpl implements IJcbtScholarshipBatchSer
* 保存前的数据校验
*/
private void validEntityBeforeSave(JcbtScholarshipBatch entity){
// 添加调试日志 - 检查校验时的ID
log.info("=== 数据校验调试 ===");
log.info("校验时实体的ID: {}, 类型: {}", entity.getId(), entity.getId() != null ? entity.getId().getClass().getSimpleName() : "null");
log.info("校验时实体的批次编码: {}", entity.getBatchCode());
// 批次编码重复性校验
if (!checkBatchCodeUnique(entity.getBatchCode(), entity.getId())) {
boolean isUnique = checkBatchCodeUnique(entity.getBatchCode(), entity.getId());
log.info("唯一性校验结果: {}", isUnique);
if (!isUnique) {
log.error("批次编码唯一性校验失败 - 编码: {}, ID: {}", entity.getBatchCode(), entity.getId());
throw new RuntimeException("批次编码已存在");
}
@@ -208,12 +263,125 @@ public class JcbtScholarshipBatchServiceImpl implements IJcbtScholarshipBatchSer
*/
@Override
public Boolean checkBatchCodeUnique(String batchCode, Long id) {
boolean exist = baseMapper.exists(Wrappers.<JcbtScholarshipBatch>lambdaQuery()
// 添加调试日志 - 检查唯一性校验逻辑
log.info("=== 唯一性校验调试 ===");
log.info("校验参数 - 批次编码: {}, ID: {}", batchCode, id);
log.info("ID是否非空: {}", ObjectUtil.isNotNull(id));
// 获取当前租户ID
String tenantId = LoginHelper.getTenantId();
log.info("当前租户ID: {}", tenantId);
LambdaQueryWrapper<JcbtScholarshipBatch> queryWrapper = Wrappers.<JcbtScholarshipBatch>lambdaQuery()
.eq(JcbtScholarshipBatch::getBatchCode, batchCode)
.ne(ObjectUtil.isNotNull(id), JcbtScholarshipBatch::getId, id));
.eq(JcbtScholarshipBatch::getDeleted, 0); // 关键修复:只检查未删除的记录
// 如果是修改操作(ID不为空),排除当前记录
if (ObjectUtil.isNotNull(id)) {
queryWrapper.ne(JcbtScholarshipBatch::getId, id);
log.info("修改操作 - 排除当前记录ID: {}", id);
} else {
log.info("新增操作 - 不排除任何记录");
}
// 查询数量而不是存在性,以便调试
long count = baseMapper.selectCount(queryWrapper);
boolean exist = count > 0;
log.info("数据库查询结果 - 相同编码的其他未删除记录数量: {}", count);
log.info("数据库查询结果 - 存在相同编码的其他未删除记录: {}", exist);
log.info("唯一性校验最终结果: {}", !exist);
// 详细分析重复记录情况
if (count > 0) {
log.error("=== 发现重复记录,详细查询 ===");
List<JcbtScholarshipBatch> duplicateRecords = baseMapper.selectList(queryWrapper);
for (JcbtScholarshipBatch record : duplicateRecords) {
log.error("重复记录详情 - ID: {}, 批次编码: {}, 是否删除: {}",
record.getId(), record.getBatchCode(), record.getDeleted());
}
// 检查是否为ID不匹配问题
if (ObjectUtil.isNotNull(id)) {
boolean foundExactMatch = duplicateRecords.stream()
.anyMatch(record -> record.getId().equals(id));
if (!foundExactMatch) {
log.error("=== ID不匹配问题 ===");
log.error("请求修改的ID: {}", id);
log.error("数据库中实际存在的ID: {}",
duplicateRecords.stream().map(JcbtScholarshipBatch::getId).toList());
throw new RuntimeException(String.format(
"记录ID不匹配!请求ID: %s,数据库实际ID: %s。请刷新页面重新获取最新数据。",
id, duplicateRecords.get(0).getId()));
}
}
}
return !exist;
}
/**
* 安全更新方法 - 避免唯一键约束冲突
* 使用指定字段更新,绕过可能的唯一键约束问题
*/
private Boolean updateByIdSafely(JcbtScholarshipBatch update) {
log.info("=== 执行安全更新策略 ===");
// 构建更新条件
LambdaUpdateWrapper<JcbtScholarshipBatch> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.eq(JcbtScholarshipBatch::getId, update.getId());
// 只更新非唯一键相关的字段,避免约束冲突
if (update.getBatchName() != null) {
updateWrapper.set(JcbtScholarshipBatch::getBatchName, update.getBatchName());
}
if (update.getAcademicYear() != null) {
updateWrapper.set(JcbtScholarshipBatch::getAcademicYear, update.getAcademicYear());
}
if (update.getSemester() != null) {
updateWrapper.set(JcbtScholarshipBatch::getSemester, update.getSemester());
}
if (update.getBatchType() != null) {
updateWrapper.set(JcbtScholarshipBatch::getBatchType, update.getBatchType());
}
if (update.getStartTime() != null) {
updateWrapper.set(JcbtScholarshipBatch::getStartTime, update.getStartTime());
}
if (update.getEndTime() != null) {
updateWrapper.set(JcbtScholarshipBatch::getEndTime, update.getEndTime());
}
if (update.getApplyStartTime() != null) {
updateWrapper.set(JcbtScholarshipBatch::getApplyStartTime, update.getApplyStartTime());
}
if (update.getApplyEndTime() != null) {
updateWrapper.set(JcbtScholarshipBatch::getApplyEndTime, update.getApplyEndTime());
}
if (update.getReviewStartTime() != null) {
updateWrapper.set(JcbtScholarshipBatch::getReviewStartTime, update.getReviewStartTime());
}
if (update.getReviewEndTime() != null) {
updateWrapper.set(JcbtScholarshipBatch::getReviewEndTime, update.getReviewEndTime());
}
if (update.getStatus() != null) {
updateWrapper.set(JcbtScholarshipBatch::getStatus, update.getStatus());
}
if (update.getDescription() != null) {
updateWrapper.set(JcbtScholarshipBatch::getDescription, update.getDescription());
}
if (update.getNoticeContent() != null) {
updateWrapper.set(JcbtScholarshipBatch::getNoticeContent, update.getNoticeContent());
}
// 更新基础字段
updateWrapper.set(JcbtScholarshipBatch::getUpdateBy, update.getUpdateBy());
updateWrapper.set(JcbtScholarshipBatch::getUpdateTime, update.getUpdateTime());
int result = baseMapper.update(null, updateWrapper);
log.info("安全更新策略影响行数: {}", result);
return result > 0;
}
/**
* 更改批次状态
*/
@@ -45,33 +45,63 @@ public class JcbtScholarshipBatchTypeServiceImpl implements IJcbtScholarshipBatc
return true; // 空列表视为成功
}
// 先删除原有关联关系
// 先逻辑删除原有关联关系
deleteByBatchId(batchId);
// 批量插入新的关联关系
List<JcbtScholarshipBatchType> batchTypes = new ArrayList<>();
// 智能插入新的关联关系(处理逻辑删除冲突)
int sortOrder = 1;
for (Long typeId : scholarshipTypeIds) {
insertOrRestoreBatchType(batchId, typeId, tenantId, sortOrder++);
}
return true;
}
/**
* 智能插入或恢复批次类型关联记录
* 如果存在已逻辑删除的记录,则恢复;否则插入新记录
*
* 核心逻辑:
* 1. 先查询是否存在已逻辑删除的记录(deleted=1)
* 2. 如果存在,则更新该记录为未删除状态(deleted=0),避免唯一键冲突
* 3. 如果不存在,则正常插入新记录
*/
private void insertOrRestoreBatchType(Long batchId, Long typeId, String tenantId, int sortOrder) {
// 查询是否存在已逻辑删除的记录(关键:包含deleted=1的记录)
LambdaQueryWrapper<JcbtScholarshipBatchType> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(JcbtScholarshipBatchType::getBatchId, batchId);
queryWrapper.eq(JcbtScholarshipBatchType::getScholarshipTypeId, typeId);
queryWrapper.eq(JcbtScholarshipBatchType::getTenantId, tenantId);
queryWrapper.eq(JcbtScholarshipBatchType::getDeleted, 1); // 仅查询已删除的记录
queryWrapper.last("LIMIT 1"); // 提升性能,只取一条记录
JcbtScholarshipBatchType deletedRecord = baseMapper.selectOne(queryWrapper);
if (deletedRecord != null) {
// 策略1:恢复已删除的记录,避免唯一键冲突
deletedRecord.setIsActive(1);
deletedRecord.setSortOrder(sortOrder);
deletedRecord.setUpdateBy(LoginHelper.getUserId());
deletedRecord.setUpdateTime(new Date());
deletedRecord.setDeleted(0); // 关键:恢复为未删除状态
baseMapper.updateById(deletedRecord);
} else {
// 策略2:不存在已删除记录,正常插入新记录
JcbtScholarshipBatchType batchType = new JcbtScholarshipBatchType();
batchType.setBatchId(batchId);
batchType.setScholarshipTypeId(typeId);
batchType.setIsActive(1);
batchType.setSortOrder(sortOrder++);
batchType.setSortOrder(sortOrder);
batchType.setTenantId(tenantId);
batchType.setCreateBy(LoginHelper.getUserId());
batchType.setCreateTime(new Date());
batchType.setUpdateBy(LoginHelper.getUserId());
batchType.setUpdateTime(new Date());
batchType.setDeleted(0);
batchTypes.add(batchType);
}
// 批量插入
for (JcbtScholarshipBatchType batchType : batchTypes) {
baseMapper.insert(batchType);
}
return true;
}
@Override
@@ -28,6 +28,9 @@ import org.dromara.xg.domain.vo.XgStudentMsgVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@@ -338,25 +341,35 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic
// 更新总状态 - 关键修改:确保状态正确更新
String oldStatus = application.getStatus();
if ("APPROVED".equals(reviewBo.getReviewResult())) {
// 标准化审核结果参数,兼容前端传递的小写值
String reviewResult = reviewBo.getReviewResult();
if (reviewResult != null) {
reviewResult = reviewResult.toUpperCase();
}
if ("APPROVED".equals(reviewResult)) {
application.setStatus(WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode());
log.info("🔍 [学院审核] 审核通过,状态更新: {} -> {}", oldStatus, WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode());
} else if ("REJECTED".equals(reviewBo.getReviewResult())) {
} else if ("REJECTED".equals(reviewResult)) {
application.setStatus(WorkStudyApplicationStatusEnum.COLLEGE_REJECTED.getCode());
log.info("🔍 [学院审核] 审核拒绝,状态更新: {} -> {}", oldStatus, WorkStudyApplicationStatusEnum.COLLEGE_REJECTED.getCode());
} else {
throw new ServiceException("审核结果参数错误,只支持approved或rejected");
}
// 使用updateById确保更新
boolean result = baseMapper.updateById(application) > 0;
log.info("🔍 [学院审核] 数据库更新结果: {}", result ? "成功" : "失败");
if (result) {
if (result) {
// 验证更新后的状态
JcbtWorkStudyApplication updatedApplication = baseMapper.selectById(reviewBo.getApplicationId());
log.info("🔍 [学院审核] 更新后验证状态: {}, 审核状态: {}", updatedApplication.getStatus(), updatedApplication.getCollegeReviewStatus());
// 确保状态更新成功
if ("APPROVED".equals(reviewBo.getReviewResult()) && !WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode().equals(updatedApplication.getStatus())) {
String normalizedResult = reviewBo.getReviewResult() != null ? reviewBo.getReviewResult().toUpperCase() : "";
if ("APPROVED".equals(normalizedResult) && !WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode().equals(updatedApplication.getStatus())) {
log.error("🔍 [学院审核] 状态更新失败!期望: {}, 实际: {}", WorkStudyApplicationStatusEnum.COLLEGE_APPROVED.getCode(), updatedApplication.getStatus());
throw new ServiceException("状态更新失败,请重试");
}
@@ -388,8 +401,13 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic
application.setFinalReviewerName(currentUserName);
application.setFinalReviewComment(reviewBo.getReviewComment());
// 更新总状态
if ("APPROVED".equals(reviewBo.getReviewResult())) {
// 更新总状态 - 标准化审核结果参数,兼容前端传递的小写值
String reviewResult = reviewBo.getReviewResult();
if (reviewResult != null) {
reviewResult = reviewResult.toUpperCase();
}
if ("APPROVED".equals(reviewResult)) {
application.setStatus(WorkStudyApplicationStatusEnum.FINAL_APPROVED.getCode());
// 更新岗位当前申请通过人数
@@ -402,8 +420,10 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic
}
positionMapper.updateById(position);
}
} else if ("REJECTED".equals(reviewBo.getReviewResult())) {
} else if ("REJECTED".equals(reviewResult)) {
application.setStatus(WorkStudyApplicationStatusEnum.FINAL_REJECTED.getCode());
} else {
throw new ServiceException("审核结果参数错误,只支持approved或rejected");
}
return baseMapper.updateById(application) > 0;
@@ -529,4 +549,47 @@ public class JcbtWorkStudyApplicationServiceImpl implements IJcbtWorkStudyApplic
return statistics;
}
/**
* 获取学生已申请岗位状态列表
*/
@Override
public List<Map<String, Object>> getStudentApplicationStatus() {
Long studentId = LoginHelper.getUserId();
List<Map<String, Object>> resultList = baseMapper.selectApplicationStatusByStudentId(studentId);
// 转换数据结构并进行状态值转换
List<Map<String, Object>> statusList = new ArrayList<>();
for (Map<String, Object> item : resultList) {
Map<String, Object> result = new HashMap<>();
result.put("positionId", item.get("position_id"));
result.put("status", convertStatusToFrontend((String) item.get("status")));
statusList.add(result);
}
return statusList;
}
/**
* 将后端状态转换为前端状态
*/
private String convertStatusToFrontend(String backendStatus) {
if (backendStatus == null) {
return "submitted";
}
switch (backendStatus) {
case "SUBMITTED":
return "submitted";
case "COLLEGE_APPROVED":
return "college_reviewing";
case "FINAL_APPROVED":
return "approved";
case "COLLEGE_REJECTED":
case "FINAL_REJECTED":
return "rejected";
case "CANCELLED":
return "cancelled";
default:
return "submitted";
}
}
}
@@ -133,4 +133,10 @@
AND deleted = 0
</select>
<select id="selectApplicationStatusByStudentId" resultType="java.util.Map">
SELECT position_id, status
FROM jcbt_work_study_application
WHERE student_id = #{studentId} AND deleted = 0
</select>
</mapper>
@@ -6,7 +6,6 @@ CREATE TABLE jcbt_work_study_position (
position_scope VARCHAR(20) DEFAULT 'COLLEGE' COMMENT '岗位发布范围(COLLEGE-本学院,UNIVERSITY-全校)',
required_count INT NOT NULL COMMENT '需求人数',
work_time VARCHAR(200) NOT NULL COMMENT '工作时间',
work_location VARCHAR(200) NOT NULL COMMENT '工作地点',
start_date DATETIME NOT NULL COMMENT '岗位有效期开始',
end_date DATETIME NOT NULL COMMENT '岗位有效期结束',
position_requirements TEXT COMMENT '岗位要求',
@@ -37,45 +36,44 @@ CREATE TABLE jcbt_work_study_position (
-- 插入测试数据
INSERT INTO jcbt_work_study_position (
position_name, position_scope, required_count, work_time, work_location,
position_name, position_scope, required_count, work_time,
start_date, end_date, position_requirements, salary_info,
contact_teacher, contact_phone, college_id, college_name, status, current_count
) VALUES
(
'图书馆助理', 'UNIVERSITY', 5, '周一至周五 14:00-17:00', '图书馆一楼服务台',
'图书馆助理', 'UNIVERSITY', 5, '周一至周五 14:00-17:00',
'2025-01-01 00:00:00', '2025-06-30 23:59:59',
'1. 熟悉图书馆基本业务流程;2. 责任心强,工作认真细致;3. 具备良好的沟通能力',
'15元/小时,按月发放',
'张老师', '13800138001', 1, '信息工程学院', 'PUBLISHED', 2
),
(
'实验室管理员', 'COLLEGE', 3, '周一、三、五 16:00-18:00', '信息楼A301实验室',
'实验室管理员', 'COLLEGE', 3, '周一、三、五 16:00-18:00',
'2025-01-01 00:00:00', '2025-06-30 23:59:59',
'1. 计算机相关专业优先;2. 熟悉实验室设备操作;3. 有相关工作经验者优先',
'18元/小时,按月发放',
'李老师', '13800138002', 1, '信息工程学院', 'RECRUITING', 1
),
(
'教学助理', 'UNIVERSITY', 8, '根据课程安排,灵活调整', '各教学楼教室',
'教学助理', 'UNIVERSITY', 8, '根据课程安排,灵活调整',
'2025-01-01 00:00:00', '2025-06-30 23:59:59',
'1. 学习成绩优良;2. 有较强的组织协调能力;3. 能够辅助教师完成教学任务',
'12元/小时,按月发放',
'王老师', '13800138003', 2, '经济管理学院', 'PUBLISHED', 5
),
(
'食堂服务员', 'UNIVERSITY', 10, '11:00-13:00, 17:00-19:00', '学生食堂各楼层',
'食堂服务员', 'UNIVERSITY', 10, '11:00-13:00, 17:00-19:00',
'2025-01-01 00:00:00', '2025-06-30 23:59:59',
'1. 身体健康,无传染性疾病;2. 工作积极主动;3. 能够承受一定的工作强度',
'14元/小时,按月发放',
'刘老师', '13800138004', 3, '后勤服务处', 'RECRUITING', 7
),
(
'宿舍管理助理', 'COLLEGE', 6, '18:00-22:00(工作日)', '学生宿舍各楼栋',
'宿舍管理助理', 'COLLEGE', 6, '18:00-22:00(工作日)',
'2025-01-01 00:00:00', '2025-06-30 23:59:59',
'1. 住校学生优先;2. 有责任心,能够处理突发情况;3. 沟通能力强',
'13元/小时,按月发放',
'陈老师', '13800138005', 4, '学生工作处', 'PUBLISHED', 3
);
-- 如果表已存在,添加工作地点字段的ALTER语句
-- ALTER TABLE jcbt_work_study_position ADD COLUMN work_location VARCHAR(200) NOT NULL COMMENT '工作地点' AFTER work_time;
-- 注意:工作地点字段已从表结构中移除,不再需要
@@ -0,0 +1,154 @@
package org.dromara.xskh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xskh.domain.vo.XskhAssessmentApplicationApprovalVo;
import org.dromara.xskh.domain.bo.XskhAssessmentApplicationApprovalBo;
import org.dromara.xskh.service.IXskhAssessmentApplicationApprovalService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 学生考核申请、班主任审核
*
* @author ruoyi
* @date 2025-01-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/assessment/application")
public class XskhAssessmentApplicationApprovalController extends BaseController {
private final IXskhAssessmentApplicationApprovalService xskhAssessmentApplicationApprovalService;
/**
* 查询学生考核申请、班主任审核列表
*/
@SaCheckPermission("assessment:application:list")
@GetMapping("/list")
public TableDataInfo<XskhAssessmentApplicationApprovalVo> list(XskhAssessmentApplicationApprovalBo bo,
PageQuery pageQuery) {
return xskhAssessmentApplicationApprovalService.queryPageList(bo, pageQuery);
}
/**
* 获取学生考核申请、班主任审核详细信息
*
* @param id 主键
*/
@SaCheckPermission("assessment:application:query")
@GetMapping("/{id}")
public R<XskhAssessmentApplicationApprovalVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xskhAssessmentApplicationApprovalService.queryById(id));
}
/**
* 新增学生考核申请、班主任审核
*/
@SaCheckPermission("assessment:application:add")
@Log(title = "学生考核申请、班主任审核", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated(AddGroup.class) @RequestBody XskhAssessmentApplicationApprovalBo bo) {
return R.ok(xskhAssessmentApplicationApprovalService.insertByBo(bo));
}
/**
* 修改学生考核申请、班主任审核
*/
@SaCheckPermission("assessment:application:edit")
@Log(title = "学生考核申请、班主任审核", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XskhAssessmentApplicationApprovalBo bo) {
return toAjax(xskhAssessmentApplicationApprovalService.updateByBo(bo));
}
/**
* 删除学生考核申请、班主任审核
*
* @param ids 主键串
*/
@SaCheckPermission("assessment:application:remove")
@Log(title = "学生考核申请、班主任审核", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xskhAssessmentApplicationApprovalService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 保存考核申请(草稿状态)
*/
@SaCheckPermission("assessment:application:save")
@Log(title = "保存考核申请", businessType = BusinessType.INSERT)
@PostMapping("/save")
public R<Void> saveApplication(@Validated @RequestBody XskhAssessmentApplicationApprovalBo bo) {
return toAjax(xskhAssessmentApplicationApprovalService.saveApplication(bo));
}
/**
* 提交考核申请
*/
@SaCheckPermission("assessment:application:submit")
@Log(title = "提交考核申请", businessType = BusinessType.UPDATE)
@PutMapping("/submit/{id}")
public R<Void> submitApplication(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return toAjax(xskhAssessmentApplicationApprovalService.submitApplication(id));
}
/**
* 删除考核申请
*/
@SaCheckPermission("assessment:application:delete")
@Log(title = "删除考核申请", businessType = BusinessType.DELETE)
@DeleteMapping("/delete/{id}")
public R<Void> deleteApplication(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return toAjax(xskhAssessmentApplicationApprovalService.deleteApplication(id));
}
/**
* 获取可申请的考核计划列表
*/
@SaCheckPermission("assessment:application:available")
@GetMapping("/available")
public R<List<XskhAssessmentApplicationApprovalVo>> getAvailableSchedules() {
return R.ok(xskhAssessmentApplicationApprovalService.getAvailableSchedules());
}
/**
* 根据学生ID和考核计划ID查询申请
*/
@SaCheckPermission("assessment:application:query")
@GetMapping("/student/{studentId}/schedule/{scheduleId}")
public R<XskhAssessmentApplicationApprovalVo> getByStudentAndSchedule(
@NotNull(message = "学生ID不能为空") @PathVariable Long studentId,
@NotNull(message = "考核计划ID不能为空") @PathVariable Long scheduleId) {
return R.ok(xskhAssessmentApplicationApprovalService.getByStudentAndSchedule(studentId, scheduleId));
}
/**
* 根据考核计划ID获取关联的指标数据
*/
@SaCheckPermission("assessment:application:query")
@GetMapping("/indicators/{scheduleId}")
public R<List<Object>> getIndicatorsByScheduleId(
@NotNull(message = "考核计划ID不能为空") @PathVariable Long scheduleId) {
return R.ok(xskhAssessmentApplicationApprovalService.getIndicatorsByScheduleId(scheduleId));
}
}
@@ -0,0 +1,136 @@
package org.dromara.xskh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xskh.domain.vo.XskhAssessmentApprovalVo;
import org.dromara.xskh.domain.bo.XskhAssessmentApprovalBo;
import org.dromara.xskh.service.IXskhAssessmentApprovalService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 学生考核审核
*
* @author ruoyi
* @date 2025-01-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/assessment/approval")
public class XskhAssessmentApprovalController extends BaseController {
private final IXskhAssessmentApprovalService xskhAssessmentApprovalService;
/**
* 查询学生考核审核列表
*/
@SaCheckPermission("assessment:approval:list")
@GetMapping("/list")
public TableDataInfo<XskhAssessmentApprovalVo> list(XskhAssessmentApprovalBo bo, PageQuery pageQuery) {
return xskhAssessmentApprovalService.queryPageList(bo, pageQuery);
}
/**
* 获取学生考核审核详细信息
*
* @param id 主键
*/
@SaCheckPermission("assessment:approval:query")
@GetMapping("/{id}")
public R<XskhAssessmentApprovalVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xskhAssessmentApprovalService.queryById(id));
}
/**
* 新增学生考核审核
*/
@SaCheckPermission("assessment:approval:add")
@Log(title = "学生考核审核", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XskhAssessmentApprovalBo bo) {
return toAjax(xskhAssessmentApprovalService.insertByBo(bo));
}
/**
* 修改学生考核审核
*/
@SaCheckPermission("assessment:approval:edit")
@Log(title = "学生考核审核", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XskhAssessmentApprovalBo bo) {
return toAjax(xskhAssessmentApprovalService.updateByBo(bo));
}
/**
* 删除学生考核审核
*
* @param ids 主键串
*/
@SaCheckPermission("assessment:approval:remove")
@Log(title = "学生考核审核", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xskhAssessmentApprovalService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 审核考核申请
*/
@SaCheckPermission("assessment:approval:approve")
@Log(title = "审核考核申请", businessType = BusinessType.UPDATE)
@PutMapping("/approve")
public R<Void> approveApplication(@Validated @RequestBody XskhAssessmentApprovalBo bo) {
return toAjax(xskhAssessmentApprovalService.approveApplication(bo));
}
/**
* 获取班主任班级下的考核申请列表
*
* @param scheduleId 考核计划ID(可选)
* @param studentNo 学号(可选,支持模糊查询)
* @param studentName 学生姓名(可选,支持模糊查询)
* @param status 申请状态(可选,2-已提交 3-班主任审核 6-已完成,不包含草稿状态)
* @param pageQuery 分页参数
* @return 班主任班级下的考核申请列表(仅包含已提交、班主任审核、已完成的申请)
*/
@SaCheckPermission("assessment:approval:teacherClass")
@GetMapping("/teacherClass")
public TableDataInfo<XskhAssessmentApprovalVo> getTeacherClassApplications(
@RequestParam(required = false) Long scheduleId,
@RequestParam(required = false) String studentNo,
@RequestParam(required = false) String studentName,
@RequestParam(required = false) String status,
PageQuery pageQuery) {
return xskhAssessmentApprovalService.getTeacherClassApplications(scheduleId, studentNo, studentName, status,
pageQuery);
}
/**
* 获取考核计划列表(进行中和已结束)
*
* @return 可用的考核计划列表,包含进行中和已结束的计划
*/
@SaCheckPermission("assessment:approval:available")
@GetMapping("/available")
public R<List<XskhAssessmentApprovalVo>> getAvailableSchedules() {
return R.ok(xskhAssessmentApprovalService.getAvailableSchedules());
}
}
@@ -0,0 +1,103 @@
package org.dromara.xskh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorVo;
import org.dromara.xskh.domain.bo.XskhAssessmentIndicatorBo;
import org.dromara.xskh.service.IXskhAssessmentIndicatorService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 学生考核指标体系
*
* @author ruoyi
* @date 2025-01-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/assessment/indicator")
public class XskhAssessmentIndicatorController extends BaseController {
private final IXskhAssessmentIndicatorService xskhAssessmentIndicatorService;
/**
* 查询学生考核指标体系列表
*/
@SaCheckPermission("assessment:indicator:list")
@GetMapping("/list")
public TableDataInfo<XskhAssessmentIndicatorVo> list(XskhAssessmentIndicatorBo bo, PageQuery pageQuery) {
return xskhAssessmentIndicatorService.queryPageList(bo, pageQuery);
}
/**
* 获取学生考核指标体系详细信息
*
* @param id 主键
*/
@SaCheckPermission("assessment:indicator:query")
@GetMapping("/{id}")
public R<XskhAssessmentIndicatorVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xskhAssessmentIndicatorService.getIndicatorWithRelations(id));
}
/**
* 新增学生考核指标体系
*/
@SaCheckPermission("assessment:indicator:add")
@Log(title = "学生考核指标体系", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XskhAssessmentIndicatorBo bo) {
return toAjax(xskhAssessmentIndicatorService.insertByBo(bo));
}
/**
* 修改学生考核指标体系
*/
@SaCheckPermission("assessment:indicator:edit")
@Log(title = "学生考核指标体系", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XskhAssessmentIndicatorBo bo) {
return toAjax(xskhAssessmentIndicatorService.updateByBo(bo));
}
/**
* 删除学生考核指标体系
*
* @param ids 主键串
*/
@SaCheckPermission("assessment:indicator:remove")
@Log(title = "学生考核指标体系", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xskhAssessmentIndicatorService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 获取启用的指标列表(用于下拉选择)
*/
@SaCheckPermission("assessment:indicator:list")
@GetMapping("/enabled")
public R<List<XskhAssessmentIndicatorVo>> getEnabledList() {
XskhAssessmentIndicatorBo bo = new XskhAssessmentIndicatorBo();
bo.setStatus("0"); // 只查询启用的
return R.ok(xskhAssessmentIndicatorService.queryList(bo));
}
}
@@ -0,0 +1,103 @@
package org.dromara.xskh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorTypeVo;
import org.dromara.xskh.domain.bo.XskhAssessmentIndicatorTypeBo;
import org.dromara.xskh.service.IXskhAssessmentIndicatorTypeService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 学生考核指标体系类型
*
* @author ruoyi
* @date 2025-01-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/assessment/indicatorType")
public class XskhAssessmentIndicatorTypeController extends BaseController {
private final IXskhAssessmentIndicatorTypeService xskhAssessmentIndicatorTypeService;
/**
* 查询学生考核指标体系类型列表
*/
@SaCheckPermission("assessment:indicatorType:list")
@GetMapping("/list")
public TableDataInfo<XskhAssessmentIndicatorTypeVo> list(XskhAssessmentIndicatorTypeBo bo, PageQuery pageQuery) {
return xskhAssessmentIndicatorTypeService.queryPageList(bo, pageQuery);
}
/**
* 获取学生考核指标体系类型详细信息
*
* @param id 主键
*/
@SaCheckPermission("assessment:indicatorType:query")
@GetMapping("/{id}")
public R<XskhAssessmentIndicatorTypeVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xskhAssessmentIndicatorTypeService.queryById(id));
}
/**
* 新增学生考核指标体系类型
*/
@SaCheckPermission("assessment:indicatorType:add")
@Log(title = "学生考核指标体系类型", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XskhAssessmentIndicatorTypeBo bo) {
return toAjax(xskhAssessmentIndicatorTypeService.insertByBo(bo));
}
/**
* 修改学生考核指标体系类型
*/
@SaCheckPermission("assessment:indicatorType:edit")
@Log(title = "学生考核指标体系类型", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XskhAssessmentIndicatorTypeBo bo) {
return toAjax(xskhAssessmentIndicatorTypeService.updateByBo(bo));
}
/**
* 删除学生考核指标体系类型
*
* @param ids 主键串
*/
@SaCheckPermission("assessment:indicatorType:remove")
@Log(title = "学生考核指标体系类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xskhAssessmentIndicatorTypeService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 获取启用的指标类型列表(用于下拉选择)
*/
@SaCheckPermission("assessment:indicatorType:list")
@GetMapping("/enabled")
public R<List<XskhAssessmentIndicatorTypeVo>> getEnabledList() {
XskhAssessmentIndicatorTypeBo bo = new XskhAssessmentIndicatorTypeBo();
bo.setStatus("0"); // 只查询启用的
return R.ok(xskhAssessmentIndicatorTypeService.queryList(bo));
}
}
@@ -0,0 +1,103 @@
package org.dromara.xskh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanVo;
import org.dromara.xskh.domain.bo.XskhAssessmentPlanBo;
import org.dromara.xskh.service.IXskhAssessmentPlanService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 学生考核方案
*
* @author ruoyi
* @date 2025-01-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/assessment/plan")
public class XskhAssessmentPlanController extends BaseController {
private final IXskhAssessmentPlanService xskhAssessmentPlanService;
/**
* 查询学生考核方案列表
*/
@SaCheckPermission("assessment:plan:list")
@GetMapping("/list")
public TableDataInfo<XskhAssessmentPlanVo> list(XskhAssessmentPlanBo bo, PageQuery pageQuery) {
return xskhAssessmentPlanService.queryPageList(bo, pageQuery);
}
/**
* 获取学生考核方案详细信息
*
* @param id 主键
*/
@SaCheckPermission("assessment:plan:query")
@GetMapping("/{id}")
public R<XskhAssessmentPlanVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xskhAssessmentPlanService.getPlanWithRelations(id));
}
/**
* 新增学生考核方案
*/
@SaCheckPermission("assessment:plan:add")
@Log(title = "学生考核方案", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XskhAssessmentPlanBo bo) {
return toAjax(xskhAssessmentPlanService.insertByBo(bo));
}
/**
* 修改学生考核方案
*/
@SaCheckPermission("assessment:plan:edit")
@Log(title = "学生考核方案", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XskhAssessmentPlanBo bo) {
return toAjax(xskhAssessmentPlanService.updateByBo(bo));
}
/**
* 删除学生考核方案
*
* @param ids 主键串
*/
@SaCheckPermission("assessment:plan:remove")
@Log(title = "学生考核方案", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xskhAssessmentPlanService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 获取启用的方案列表(用于下拉选择)
*/
@SaCheckPermission("assessment:plan:list")
@GetMapping("/enabled")
public R<List<XskhAssessmentPlanVo>> getEnabledList() {
XskhAssessmentPlanBo bo = new XskhAssessmentPlanBo();
bo.setStatus("0"); // 只查询启用的
return R.ok(xskhAssessmentPlanService.queryList(bo));
}
}
@@ -0,0 +1,132 @@
package org.dromara.xskh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.xskh.domain.vo.XskhAssessmentScheduleVo;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleBo;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleQueryBo;
import org.dromara.xskh.service.IXskhAssessmentScheduleService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 学生考核计划
*
* @author ruoyi
* @date 2025-01-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/assessment/schedule")
public class XskhAssessmentScheduleController extends BaseController {
private final IXskhAssessmentScheduleService xskhAssessmentScheduleService;
/**
* 查询学生考核计划列表
*/
@SaCheckPermission("assessment:schedule:list")
@GetMapping("/list")
public TableDataInfo<XskhAssessmentScheduleVo> list(XskhAssessmentScheduleBo bo, PageQuery pageQuery) {
return xskhAssessmentScheduleService.queryPageList(bo, pageQuery);
}
/**
* 根据状态列表查询学生考核计划列表
*/
@SaCheckPermission("assessment:schedule:list")
@GetMapping("/listByStatus")
public TableDataInfo<XskhAssessmentScheduleVo> listByStatus(XskhAssessmentScheduleQueryBo bo, PageQuery pageQuery) {
return xskhAssessmentScheduleService.queryPageListByStatusList(bo, pageQuery);
}
/**
* 获取学生考核计划详细信息
*
* @param id 主键
*/
@SaCheckPermission("assessment:schedule:query")
@GetMapping("/{id}")
public R<XskhAssessmentScheduleVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(xskhAssessmentScheduleService.queryById(id));
}
/**
* 新增学生考核计划
*/
@SaCheckPermission("assessment:schedule:add")
@Log(title = "学生考核计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody XskhAssessmentScheduleBo bo) {
return toAjax(xskhAssessmentScheduleService.insertByBo(bo));
}
/**
* 修改学生考核计划
*/
@SaCheckPermission("assessment:schedule:edit")
@Log(title = "学生考核计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody XskhAssessmentScheduleBo bo) {
return toAjax(xskhAssessmentScheduleService.updateByBo(bo));
}
/**
* 删除学生考核计划
*
* @param ids 主键串
*/
@SaCheckPermission("assessment:schedule:remove")
@Log(title = "学生考核计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(xskhAssessmentScheduleService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 上线考核计划
*/
@SaCheckPermission("assessment:schedule:online")
@Log(title = "上线考核计划", businessType = BusinessType.UPDATE)
@PutMapping("/online/{id}")
public R<Void> online(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return toAjax(xskhAssessmentScheduleService.onlineSchedule(id));
}
/**
* 下线考核计划
*/
@SaCheckPermission("assessment:schedule:offline")
@Log(title = "下线考核计划", businessType = BusinessType.UPDATE)
@PutMapping("/offline/{id}")
public R<Void> offline(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return toAjax(xskhAssessmentScheduleService.offlineSchedule(id));
}
/**
* 完成考核计划
*/
@SaCheckPermission("assessment:schedule:complete")
@Log(title = "完成考核计划", businessType = BusinessType.UPDATE)
@PutMapping("/complete/{id}")
public R<Void> complete(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return toAjax(xskhAssessmentScheduleService.completeSchedule(id));
}
}
@@ -1,6 +1,7 @@
package org.dromara.xskh.controller;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
@@ -130,4 +131,26 @@ public class XskhDisciplineRecordController extends BaseController {
PageQuery pageQuery) {
return xskhDisciplineRecordService.queryClassTeacherPageList(bo, pageQuery);
}
/**
* 获取指标关联的违纪处分类型和奖励类型
*/
@SaCheckPermission("disciplineRecord:disciplineRecord:query")
@GetMapping("/getIndicatorTypes/{indicatorId}")
public R<Map<String, String>> getIndicatorTypes(@NotNull(message = "指标ID不能为空") @PathVariable Long indicatorId) {
return R.ok(xskhDisciplineRecordService.getIndicatorTypes(indicatorId));
}
/**
* 获取学生在指定时间范围内的违纪处分记录
*/
@SaCheckPermission("disciplineRecord:disciplineRecord:query")
@GetMapping("/getStudentDisciplineRecords")
public R<List<XskhDisciplineRecordVo>> getStudentDisciplineRecords(
@RequestParam Long studentId,
@RequestParam String disciplineTypeIds,
@RequestParam String startTime,
@RequestParam String endTime) {
return R.ok(xskhDisciplineRecordService.getStudentDisciplineRecords(studentId, disciplineTypeIds, startTime, endTime));
}
}
@@ -130,4 +130,17 @@ public class XskhRewardRecordController extends BaseController {
PageQuery pageQuery) {
return xskhRewardRecordService.queryClassTeacherPageList(bo, pageQuery);
}
/**
* 获取学生在指定时间范围内的奖励记录
*/
@SaCheckPermission("rewardRecord:rewardRecord:query")
@GetMapping("/getStudentRewardRecords")
public R<List<XskhRewardRecordVo>> getStudentRewardRecords(
@RequestParam Long studentId,
@RequestParam String rewardTypeIds,
@RequestParam String startTime,
@RequestParam String endTime) {
return R.ok(xskhRewardRecordService.getStudentRewardRecords(studentId, rewardTypeIds, startTime, endTime));
}
}
@@ -0,0 +1,134 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.Date;
/**
* 学生考核申请、班主任审核对象 xskh_assessment_application_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_application_approval")
public class XskhAssessmentApplicationApproval extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 考核计划ID
*/
private Long scheduleId;
/**
* 学生ID
*/
private Long studentId;
/**
* 学号
*/
private String studentNo;
/**
* 学生姓名
*/
private String studentName;
/**
* 学院ID
*/
private Long collegeId;
/**
* 学院名称
*/
private String collegeName;
/**
* 专业ID
*/
private Long majorId;
/**
* 专业名称
*/
private String majorName;
/**
* 班级ID
*/
private Long classId;
/**
* 班级名称
*/
private String className;
/**
* 总得分
*/
private BigDecimal totalScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 自评备注
*/
private String selfRemark;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 状态(1-草稿 2-已提交 3-班主任审核 6-已完成)
*/
private String status;
/**
* 提交时间
*/
private Date submitTime;
/**
* 班主任审核人ID
*/
private Long teacherApprovalBy;
/**
* 班主任审核时间
*/
private Date teacherApprovalTime;
/**
* 班主任审核备注
*/
private String teacherApprovalRemark;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,88 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.Date;
/**
* 学生附加分申请、班主任审核得分对象 xskh_assessment_bonus_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_bonus_approval")
public class XskhAssessmentBonusApproval extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 考核申请ID
*/
private Long applicationId;
/**
* 附加分项目名称
*/
private String bonusName;
/**
* 附加分内容
*/
private String bonusContent;
/**
* 附加分值
*/
private BigDecimal bonusScore;
/**
* 证明材料文件,ossIds,逗号分隔
*/
private String evidenceFile;
/**
* 状态(1-待审核 2-审核通过 3-审核拒绝)
*/
private String status;
/**
* 审核得分
*/
private BigDecimal approvalScore;
/**
* 审核人ID
*/
private Long approvalBy;
/**
* 审核时间
*/
private Date approvalTime;
/**
* 审核备注
*/
private String approvalRemark;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,83 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.Date;
/**
* 学生考核指标体系对象 xskh_assessment_indicator
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_indicator")
public class XskhAssessmentIndicator extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 指标编码
*/
private String indicatorCode;
/**
* 指标名称
*/
private String indicatorName;
/**
* 指标类型ID
*/
private Long indicatorTypeId;
/**
* 指标类型名称
*/
private String indicatorTypeName;
/**
* 指标说明
*/
private String description;
/**
* 最高分值
*/
private BigDecimal maxScore;
/**
* 权重
*/
private BigDecimal weight;
/**
* 状态(0-启用 1-禁用)
*/
private String status;
/**
* 排序号
*/
private Integer sortOrder;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,52 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.Date;
/**
* 考核指标关联违纪处分类型和奖励类型对象 xskh_assessment_indicator_discipline_type
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_indicator_discipline_type")
public class XskhAssessmentIndicatorDisciplineType extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 指标ID
*/
private Long indicatorId;
/**
* 违纪处分类型ID,逗号分隔
*/
private String disciplineTypeIds;
/**
* 奖励类型ID,逗号分隔
*/
private String rewardTypeIds;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,62 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.Date;
/**
* 学生考核指标体系类型对象 xskh_assessment_indicator_type
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_indicator_type")
public class XskhAssessmentIndicatorType extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 类型编码
*/
private String typeCode;
/**
* 类型名称
*/
private String typeName;
/**
* 类型说明
*/
private String description;
/**
* 状态(0-启用 1-禁用)
*/
private String status;
/**
* 排序号
*/
private Integer sortOrder;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,57 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.io.Serializable;
/**
* 学生考核方案对象 xskh_assessment_plan
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_plan")
public class XskhAssessmentPlan extends TenantEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 方案编号
*/
private String planCode;
/**
* 方案名称
*/
private String planName;
/**
* 方案说明
*/
private String description;
/**
* 状态(0-启用 1-禁用)
*/
private String status;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,63 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 考核方案关联指标体系对象 xskh_assessment_plan_indicator
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_plan_indicator")
public class XskhAssessmentPlanIndicator extends TenantEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 考核方案ID
*/
private Long planId;
/**
* 指标体系ID
*/
private Long indicatorId;
/**
* 最高分值
*/
private BigDecimal maxScore;
/**
* 权重
*/
private BigDecimal weight;
/**
* 排序号
*/
private Integer sortOrder;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -0,0 +1,97 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.Date;
/**
* 学生考核计划对象 xskh_assessment_schedule
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_schedule")
public class XskhAssessmentSchedule extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 考核计划名称
*/
private String scheduleName;
/**
* 考核方案ID
*/
private Long planId;
/**
* 考核方案名称
*/
private String planName;
/**
* 学年
*/
private String academicYear;
/**
* 学期(1-第一学期 2-第二学期)
*/
private String semester;
/**
* 考核开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 考核结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
* 数据统计开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataStartTime;
/**
* 数据统计结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataEndTime;
/**
* 状态(1-未开始 2-进行中 3-已结束)
*/
private String status;
/**
* 考核说明
*/
private String description;
/**
* 删除标志(0-未删除 1-已删除)
*/
@TableLogic(value = "0", delval = "1")
private Long deleted;
}
@@ -0,0 +1,82 @@
package org.dromara.xskh.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 学生考核自评、班主任评分对象 xskh_assessment_self_score
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("xskh_assessment_self_score")
public class XskhAssessmentSelfScore extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 考核申请ID
*/
private Long applicationId;
/**
* 指标ID
*/
private Long indicatorId;
/**
* 指标名称
*/
private String indicatorName;
/**
* 指标类型
*/
private String indicatorType;
/**
* 最高分值
*/
private BigDecimal maxScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 自评备注
*/
private String selfRemark;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 班主任备注
*/
private String teacherRemark;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
}
@@ -58,5 +58,4 @@ public class XskhRewardType extends TenantEntity {
@TableLogic(value = "0", delval = "1")
private Long deleted;
}
@@ -0,0 +1,148 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 学生考核申请、班主任审核业务对象 xskh_assessment_application_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhAssessmentApplicationApproval.class)
public class XskhAssessmentApplicationApprovalBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 考核计划ID
*/
@NotNull(message = "考核计划ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long scheduleId;
/**
* 学生ID
*/
@NotNull(message = "学生ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long studentId;
/**
* 学号
*/
@NotBlank(message = "学号不能为空", groups = { AddGroup.class, EditGroup.class })
private String studentNo;
/**
* 学生姓名
*/
@NotBlank(message = "学生姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String studentName;
/**
* 学院ID
*/
@NotNull(message = "学院ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long collegeId;
/**
* 学院名称
*/
@NotBlank(message = "学院名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String collegeName;
/**
* 专业ID
*/
@NotNull(message = "专业ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long majorId;
/**
* 专业名称
*/
@NotBlank(message = "专业名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String majorName;
/**
* 班级ID
*/
@NotNull(message = "班级ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long classId;
/**
* 班级名称
*/
@NotBlank(message = "班级名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String className;
/**
* 总得分
*/
private BigDecimal totalScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 自评备注
*/
private String selfRemark;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 状态(1-草稿 2-已提交 3-班主任审核 6-已完成)
*/
private String status;
/**
* 提交时间
*/
private Date submitTime;
/**
* 班主任审核人ID
*/
private Long teacherApprovalBy;
/**
* 班主任审核时间
*/
private Date teacherApprovalTime;
/**
* 班主任审核备注
*/
private String teacherApprovalRemark;
/**
* 自评得分列表
*/
private List<XskhAssessmentSelfScoreBo> selfScoreList;
/**
* 附加分申请列表
*/
private List<XskhAssessmentBonusApprovalBo> bonusApprovalList;
}
@@ -0,0 +1,144 @@
package org.dromara.xskh.domain.bo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import io.github.linpeilie.annotations.AutoMapper;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 学生考核审核业务对象 xskh_assessment_application_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class XskhAssessmentApprovalBo extends BaseEntity {
/**
* 主键
*/
private Long id;
/**
* 考核计划ID
*/
private Long scheduleId;
/**
* 学生ID
*/
private Long studentId;
/**
* 学号
*/
private String studentNo;
/**
* 学生姓名
*/
private String studentName;
/**
* 学院ID
*/
private Long collegeId;
/**
* 学院名称
*/
private String collegeName;
/**
* 专业ID
*/
private Long majorId;
/**
* 专业名称
*/
private String majorName;
/**
* 班级ID
*/
private Long classId;
/**
* 班级名称
*/
private String className;
/**
* 总得分
*/
private BigDecimal totalScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 状态(1-草稿 2-已提交 3-班主任审核 6-已完成)
*/
private String status;
/**
* 提交时间
*/
private Date submitTime;
/**
* 班主任审核人
*/
private Long teacherApprovalBy;
/**
* 班主任审核时间
*/
private Date teacherApprovalTime;
/**
* 班主任审核备注
*/
private String teacherApprovalRemark;
/**
* 自评得分列表
*/
private List<XskhAssessmentSelfScoreBo> selfScoreList;
/**
* 附加分申请列表
*/
private List<XskhAssessmentBonusApprovalBo> bonusList;
/**
* 附加分审核列表(前端传递的字段名)
*/
private List<XskhAssessmentBonusApprovalBo> bonusApprovalList;
/**
* 删除标志(0-未删除 1-已删除)
*/
private String deleted;
/**
* 租户编号
*/
private String tenantId;
}
@@ -0,0 +1,86 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentBonusApproval;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* 学生附加分申请、班主任审核得分业务对象 xskh_assessment_bonus_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = false)
@AutoMapper(target = XskhAssessmentBonusApproval.class)
public class XskhAssessmentBonusApprovalBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 考核申请ID
*/
@NotNull(message = "考核申请ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long applicationId;
/**
* 附加分项目名称
*/
@NotBlank(message = "附加分项目名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String bonusName;
/**
* 附加分内容
*/
@NotBlank(message = "附加分内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String bonusContent;
/**
* 附加分值
*/
@NotNull(message = "附加分值不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal bonusScore;
/**
* 证明材料文件,ossIds,逗号分隔
*/
private String evidenceFile;
/**
* 状态(1-待审核 2-审核通过 3-审核拒绝)
*/
private String status;
/**
* 审核得分
*/
private BigDecimal approvalScore;
/**
* 审核人ID
*/
private Long approvalBy;
/**
* 审核时间
*/
private Date approvalTime;
/**
* 审核备注
*/
private String approvalRemark;
}
@@ -0,0 +1,103 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.core.validate.QueryGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentIndicator;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.List;
/**
* 学生考核指标体系业务对象 xskh_assessment_indicator
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhAssessmentIndicator.class)
public class XskhAssessmentIndicatorBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 指标编码
*/
@NotBlank(message = "指标编码不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 50, message = "指标编码长度不能超过50个字符")
private String indicatorCode;
/**
* 指标名称
*/
@NotBlank(message = "指标名称不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 100, message = "指标名称长度不能超过100个字符")
private String indicatorName;
/**
* 指标类型ID
*/
@NotNull(message = "指标类型不能为空", groups = { AddGroup.class, EditGroup.class })
private Long indicatorTypeId;
/**
* 指标类型名称
*/
private String indicatorTypeName;
/**
* 指标说明
*/
@Size(max = 500, message = "指标说明长度不能超过500个字符")
private String description;
/**
* 最高分值
*/
@NotNull(message = "最高分值不能为空", groups = { AddGroup.class, EditGroup.class })
@DecimalMin(value = "0.01", message = "最高分值必须大于0", groups = { AddGroup.class, EditGroup.class })
@DecimalMax(value = "100.00", message = "最高分值不能超过100", groups = { AddGroup.class, EditGroup.class })
private BigDecimal maxScore;
/**
* 权重
*/
@DecimalMin(value = "0.01", message = "权重必须大于0", groups = { AddGroup.class, EditGroup.class })
@DecimalMax(value = "10.00", message = "权重不能超过10", groups = { AddGroup.class, EditGroup.class })
private BigDecimal weight;
/**
* 状态(0-启用 1-禁用)
*/
@NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
@Pattern(regexp = "^[01]$", message = "状态只能是0或1")
private String status;
/**
* 排序号
*/
@Min(value = 0, message = "排序号不能小于0")
@Max(value = 9999, message = "排序号不能大于9999")
private Integer sortOrder;
/**
* 关联的违纪处分类型ID列表
*/
private List<Long> disciplineTypeIds;
/**
* 关联的奖励类型ID列表
*/
private List<Long> rewardTypeIds;
}
@@ -0,0 +1,91 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.core.validate.QueryGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentIndicatorType;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
/**
* 学生考核指标体系类型业务对象 xskh_assessment_indicator_type
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhAssessmentIndicatorType.class)
public class XskhAssessmentIndicatorTypeBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 类型编码
*/
@NotBlank(message = "类型编码不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 50, message = "类型编码长度不能超过50个字符")
private String typeCode;
/**
* 类型名称
*/
@NotBlank(message = "类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 100, message = "类型名称长度不能超过100个字符")
private String typeName;
/**
* 类型说明
*/
@Size(max = 500, message = "类型说明长度不能超过500个字符")
private String description;
/**
* 状态(0-启用 1-禁用)
*/
@NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
@Pattern(regexp = "^[01]$", message = "状态只能是0或1")
private String status;
/**
* 排序号
*/
@Min(value = 0, message = "排序号不能小于0")
@Max(value = 9999, message = "排序号不能大于9999")
private Integer sortOrder;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
private Date updateTime;
}
@@ -0,0 +1,64 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentPlan;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanIndicatorVo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.List;
/**
* 学生考核方案业务对象 xskh_assessment_plan
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhAssessmentPlan.class)
public class XskhAssessmentPlanBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 方案编号
*/
@NotBlank(message = "方案编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String planCode;
/**
* 方案名称
*/
@NotBlank(message = "方案名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String planName;
/**
* 方案说明
*/
private String description;
/**
* 状态(0-启用 1-禁用)
*/
private String status;
/**
* 关联的指标ID列表
*/
private List<Long> indicatorIds;
/**
* 关联的指标列表(前端传递的完整数据)
*/
private List<XskhAssessmentPlanIndicatorVo> indicatorList;
}
@@ -0,0 +1,94 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentSchedule;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
/**
* 学生考核计划业务对象 xskh_assessment_schedule
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhAssessmentSchedule.class)
public class XskhAssessmentScheduleBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 考核计划名称
*/
@NotBlank(message = "考核计划名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String scheduleName;
/**
* 考核方案ID
*/
@NotNull(message = "考核方案ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long planId;
/**
* 考核方案名称
*/
private String planName;
/**
* 学年
*/
@NotBlank(message = "学年不能为空", groups = { AddGroup.class, EditGroup.class })
private String academicYear;
/**
* 学期(1-第一学期 2-第二学期)
*/
@NotBlank(message = "学期不能为空", groups = { AddGroup.class, EditGroup.class })
private String semester;
/**
* 考核开始时间
*/
@NotNull(message = "考核开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date startTime;
/**
* 考核结束时间
*/
@NotNull(message = "考核结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date endTime;
/**
* 数据统计开始时间
*/
@NotNull(message = "数据统计开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date dataStartTime;
/**
* 数据统计结束时间
*/
@NotNull(message = "数据统计结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date dataEndTime;
/**
* 状态(1-未开始 2-进行中 3-已结束)
*/
private String status;
/**
* 考核说明
*/
private String description;
}
@@ -0,0 +1,54 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 学生考核计划查询业务对象
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class XskhAssessmentScheduleQueryBo extends BaseEntity {
/**
* 考核计划名称
*/
private String scheduleName;
/**
* 考核方案ID
*/
private Long planId;
/**
* 考核方案名称
*/
private String planName;
/**
* 学年
*/
private String academicYear;
/**
* 学期(1-第一学期 2-第二学期)
*/
private String semester;
/**
* 状态列表(1-未开始 2-进行中 3-已结束)
*/
private List<String> statusList;
/**
* 考核说明
*/
private String description;
}
@@ -0,0 +1,81 @@
package org.dromara.xskh.domain.bo;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.xskh.domain.XskhAssessmentSelfScore;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 学生考核自评、班主任评分业务对象 xskh_assessment_self_score
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhAssessmentSelfScore.class)
public class XskhAssessmentSelfScoreBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 考核申请ID
*/
@NotNull(message = "考核申请ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long applicationId;
/**
* 指标ID
*/
@NotNull(message = "指标ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long indicatorId;
/**
* 指标名称
*/
@NotBlank(message = "指标名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String indicatorName;
/**
* 指标类型
*/
@NotBlank(message = "指标类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String indicatorType;
/**
* 最高分值
*/
@NotNull(message = "最高分值不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal maxScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 自评备注
*/
private String selfRemark;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 班主任备注
*/
private String teacherRemark;
}
@@ -22,7 +22,7 @@ import java.util.Date;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhDisciplineRecord.class, reverseConvertGenerate = false)
@AutoMapper(target = XskhDisciplineRecord.class)
public class XskhDisciplineRecordBo extends BaseEntity {
/**
@@ -20,7 +20,7 @@ import java.util.Date;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhDisciplineRevoke.class, reverseConvertGenerate = false)
@AutoMapper(target = XskhDisciplineRevoke.class)
public class XskhDisciplineRevokeBo extends BaseEntity {
/**
@@ -17,7 +17,7 @@ import jakarta.validation.constraints.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhDisciplineType.class, reverseConvertGenerate = false)
@AutoMapper(target = XskhDisciplineType.class)
public class XskhDisciplineTypeBo extends BaseEntity {
/**
@@ -21,7 +21,7 @@ import java.util.Date;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhRewardRecord.class, reverseConvertGenerate = false)
@AutoMapper(target = XskhRewardRecord.class)
public class XskhRewardRecordBo extends BaseEntity {
/**
@@ -17,7 +17,7 @@ import jakarta.validation.constraints.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = XskhRewardType.class, reverseConvertGenerate = false)
@AutoMapper(target = XskhRewardType.class)
public class XskhRewardTypeBo extends BaseEntity {
/**
@@ -58,5 +58,4 @@ public class XskhRewardTypeBo extends BaseEntity {
*/
private Long deleted;
}
@@ -0,0 +1,200 @@
package org.dromara.xskh.domain.vo;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 学生考核申请、班主任审核视图对象 xskh_assessment_application_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@AutoMapper(target = XskhAssessmentApplicationApproval.class)
public class XskhAssessmentApplicationApprovalVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* 考核计划ID
*/
private Long scheduleId;
/**
* 考核计划名称
*/
private String scheduleName;
/**
* 考核开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 考核结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
* 数据统计开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataStartTime;
/**
* 数据统计结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataEndTime;
/**
* 学生ID
*/
private Long studentId;
/**
* 学号
*/
private String studentNo;
/**
* 学生姓名
*/
private String studentName;
/**
* 学院ID
*/
private Long collegeId;
/**
* 学院名称
*/
private String collegeName;
/**
* 专业ID
*/
private Long majorId;
/**
* 专业名称
*/
private String majorName;
/**
* 班级ID
*/
private Long classId;
/**
* 班级名称
*/
private String className;
/**
* 总得分
*/
private BigDecimal totalScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 自评备注
*/
private String selfRemark;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 状态(1-草稿 2-已提交 3-班主任审核 6-已完成)
*/
private String status;
/**
* 状态名称
*/
private String statusName;
/**
* 提交时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date submitTime;
/**
* 班主任审核人ID
*/
private Long teacherApprovalBy;
/**
* 班主任审核人姓名
*/
private String teacherApprovalByName;
/**
* 班主任审核时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date teacherApprovalTime;
/**
* 班主任审核备注
*/
private String teacherApprovalRemark;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 自评得分列表
*/
private List<XskhAssessmentSelfScoreVo> selfScoreList;
/**
* 附加分申请列表
*/
private List<XskhAssessmentBonusApprovalVo> bonusApprovalList;
}
@@ -0,0 +1,235 @@
package org.dromara.xskh.domain.vo;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import io.github.linpeilie.annotations.AutoMapper;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 学生考核审核视图对象 xskh_assessment_application_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XskhAssessmentApplicationApproval.class)
public class XskhAssessmentApprovalVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 考核计划ID
*/
@ExcelProperty(value = "考核计划ID")
private Long scheduleId;
/**
* 考核计划名称
*/
@ExcelProperty(value = "考核计划名称")
private String scheduleName;
/**
* 考核计划开始时间
*/
@ExcelProperty(value = "考核计划开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 考核计划结束时间
*/
@ExcelProperty(value = "考核计划结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
* 数据统计开始时间
*/
@ExcelProperty(value = "数据统计开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataStartTime;
/**
* 数据统计结束时间
*/
@ExcelProperty(value = "数据统计结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataEndTime;
/**
* 学生ID
*/
@ExcelProperty(value = "学生ID")
private Long studentId;
/**
* 学号
*/
@ExcelProperty(value = "学号")
private String studentNo;
/**
* 学生姓名
*/
@ExcelProperty(value = "学生姓名")
private String studentName;
/**
* 学院ID
*/
@ExcelProperty(value = "学院ID")
private Long collegeId;
/**
* 学院名称
*/
@ExcelProperty(value = "学院名称")
private String collegeName;
/**
* 专业ID
*/
@ExcelProperty(value = "专业ID")
private Long majorId;
/**
* 专业名称
*/
@ExcelProperty(value = "专业名称")
private String majorName;
/**
* 班级ID
*/
@ExcelProperty(value = "班级ID")
private Long classId;
/**
* 班级名称
*/
@ExcelProperty(value = "班级名称")
private String className;
/**
* 总得分
*/
@ExcelProperty(value = "总得分")
private BigDecimal totalScore;
/**
* 自评得分
*/
@ExcelProperty(value = "自评得分")
private BigDecimal selfScore;
/**
* 班主任评分
*/
@ExcelProperty(value = "班主任评分")
private BigDecimal teacherScore;
/**
* 状态(1-草稿 2-已提交 3-班主任审核 6-已完成)
*/
@ExcelProperty(value = "状态")
private String status;
/**
* 状态名称
*/
@ExcelProperty(value = "状态名称")
private String statusName;
/**
* 提交时间
*/
@ExcelProperty(value = "提交时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date submitTime;
/**
* 班主任审核人
*/
@ExcelProperty(value = "班主任审核人")
private Long teacherApprovalBy;
/**
* 班主任审核人姓名
*/
@ExcelProperty(value = "班主任审核人姓名")
private String teacherApprovalByName;
/**
* 班主任审核时间
*/
@ExcelProperty(value = "班主任审核时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date teacherApprovalTime;
/**
* 班主任审核备注
*/
@ExcelProperty(value = "班主任审核备注")
private String teacherApprovalRemark;
/**
* 自评备注
*/
@ExcelProperty(value = "自评备注")
private String selfRemark;
/**
* 自评得分列表
*/
private List<XskhAssessmentSelfScoreVo> selfScoreList;
/**
* 附加分申请列表
*/
private List<XskhAssessmentBonusApprovalVo> bonusList;
/**
* 附加分审核列表(兼容前端字段名)
*/
private List<XskhAssessmentBonusApprovalVo> bonusApprovalList;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,114 @@
package org.dromara.xskh.domain.vo;
import org.dromara.xskh.domain.XskhAssessmentBonusApproval;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 学生考核申请、班主任审核视图对象 xskh_assessment_bonus_approval
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@AutoMapper(target = XskhAssessmentBonusApproval.class)
public class XskhAssessmentBonusApprovalVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* 考核申请ID
*/
private Long applicationId;
/**
* 附加分项目名称
*/
private String bonusName;
/**
* 附加分内容
*/
private String bonusContent;
/**
* 附加分值
*/
private BigDecimal bonusScore;
/**
* 证明材料文件,ossIds,逗号分隔
*/
private String evidenceFile;
/**
* 状态(1-待审核 2-审核通过 3-审核拒绝)
*/
private String status;
/**
* 状态名称
*/
private String statusName;
/**
* 审核得分
*/
private BigDecimal approvalScore;
/**
* 审核人ID
*/
private Long approvalBy;
/**
* 审核人姓名
*/
private String approvalByName;
/**
* 审核时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date approvalTime;
/**
* 审核备注
*/
private String approvalRemark;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,74 @@
package org.dromara.xskh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xskh.domain.XskhAssessmentIndicatorDisciplineType;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 考核指标关联违纪处分类型和奖励类型视图对象 xskh_assessment_indicator_discipline_type
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XskhAssessmentIndicatorDisciplineType.class)
public class XskhAssessmentIndicatorDisciplineTypeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 指标ID
*/
@ExcelProperty(value = "指标ID")
private Long indicatorId;
/**
* 违纪处分类型ID,逗号分隔
*/
@ExcelProperty(value = "违纪处分类型ID")
private String disciplineTypeIds;
/**
* 奖励类型ID,逗号分隔
*/
@ExcelProperty(value = "奖励类型ID")
private String rewardTypeIds;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,91 @@
package org.dromara.xskh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xskh.domain.XskhAssessmentIndicatorType;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 学生考核指标体系类型视图对象 xskh_assessment_indicator_type
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XskhAssessmentIndicatorType.class)
public class XskhAssessmentIndicatorTypeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 类型编码
*/
@ExcelProperty(value = "类型编码")
private String typeCode;
/**
* 类型名称
*/
@ExcelProperty(value = "类型名称")
private String typeName;
/**
* 类型说明
*/
@ExcelProperty(value = "类型说明")
private String description;
/**
* 状态(0-启用 1-禁用)
*/
@ExcelProperty(value = "状态")
private String status;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Integer sortOrder;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,124 @@
package org.dromara.xskh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xskh.domain.XskhAssessmentIndicator;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 学生考核指标体系视图对象 xskh_assessment_indicator
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XskhAssessmentIndicator.class)
public class XskhAssessmentIndicatorVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 指标编码
*/
@ExcelProperty(value = "指标编码")
private String indicatorCode;
/**
* 指标名称
*/
@ExcelProperty(value = "指标名称")
private String indicatorName;
/**
* 指标类型ID
*/
@ExcelProperty(value = "指标类型ID")
private Long indicatorTypeId;
/**
* 指标类型名称
*/
@ExcelProperty(value = "指标类型名称")
private String indicatorTypeName;
/**
* 指标说明
*/
@ExcelProperty(value = "指标说明")
private String description;
/**
* 最高分值
*/
@ExcelProperty(value = "最高分值")
private BigDecimal maxScore;
/**
* 权重
*/
@ExcelProperty(value = "权重")
private BigDecimal weight;
/**
* 状态(0-启用 1-禁用)
*/
@ExcelProperty(value = "状态")
private String status;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Integer sortOrder;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 关联的违纪处分类型ID列表
*/
private List<Long> disciplineTypeIds;
/**
* 关联的奖励类型ID列表
*/
private List<Long> rewardTypeIds;
}
@@ -0,0 +1,111 @@
package org.dromara.xskh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xskh.domain.XskhAssessmentPlanIndicator;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 考核方案关联指标体系视图对象 xskh_assessment_plan_indicator
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XskhAssessmentPlanIndicator.class)
public class XskhAssessmentPlanIndicatorVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 考核方案ID
*/
@ExcelProperty(value = "考核方案ID")
private Long planId;
/**
* 指标体系ID
*/
@ExcelProperty(value = "指标体系ID")
private Long indicatorId;
/**
* 最高分值
*/
@ExcelProperty(value = "最高分值")
private BigDecimal maxScore;
/**
* 权重
*/
@ExcelProperty(value = "权重")
private BigDecimal weight;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Integer sortOrder;
/**
* 指标名称
*/
@ExcelProperty(value = "指标名称")
private String indicatorName;
/**
* 指标编码
*/
@ExcelProperty(value = "指标编码")
private String indicatorCode;
/**
* 指标说明
*/
@ExcelProperty(value = "指标说明")
private String description;
/**
* 指标最高分值
*/
@ExcelProperty(value = "指标最高分值")
private BigDecimal indicatorMaxScore;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,86 @@
package org.dromara.xskh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.xskh.domain.XskhAssessmentPlan;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 学生考核方案视图对象 xskh_assessment_plan
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = XskhAssessmentPlan.class)
public class XskhAssessmentPlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 方案编号
*/
@ExcelProperty(value = "方案编号")
private String planCode;
/**
* 方案名称
*/
@ExcelProperty(value = "方案名称")
private String planName;
/**
* 方案说明
*/
@ExcelProperty(value = "方案说明")
private String description;
/**
* 状态(0-启用 1-禁用)
*/
@ExcelProperty(value = "状态")
private String status;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 关联的指标列表
*/
private List<XskhAssessmentPlanIndicatorVo> indicatorList;
}
@@ -0,0 +1,121 @@
package org.dromara.xskh.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.xskh.domain.XskhAssessmentSchedule;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 学生考核计划视图对象 xskh_assessment_schedule
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@AutoMapper(target = XskhAssessmentSchedule.class)
public class XskhAssessmentScheduleVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* 考核计划名称
*/
private String scheduleName;
/**
* 考核方案ID
*/
private Long planId;
/**
* 考核方案名称
*/
private String planName;
/**
* 学年
*/
private String academicYear;
/**
* 学期(1-第一学期 2-第二学期)
*/
private String semester;
/**
* 学期名称
*/
private String semesterName;
/**
* 考核开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 考核结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
/**
* 数据统计开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataStartTime;
/**
* 数据统计结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataEndTime;
/**
* 状态(1-未开始 2-进行中 3-已结束)
*/
private String status;
/**
* 状态名称
*/
private String statusName;
/**
* 考核说明
*/
private String description;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,108 @@
package org.dromara.xskh.domain.vo;
import org.dromara.xskh.domain.XskhAssessmentSelfScore;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 学生考核自评、班主任评分视图对象 xskh_assessment_self_score
*
* @author ruoyi
* @date 2025-01-03
*/
@Data
@AutoMapper(target = XskhAssessmentSelfScore.class)
public class XskhAssessmentSelfScoreVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* 考核申请ID
*/
private Long applicationId;
/**
* 指标ID
*/
private Long indicatorId;
/**
* 指标名称
*/
private String indicatorName;
/**
* 指标编码
*/
private String indicatorCode;
/**
* 指标说明
*/
private String description;
/**
* 指标类型
*/
private String indicatorType;
/**
* 最高分值
*/
private BigDecimal maxScore;
/**
* 自评得分
*/
private BigDecimal selfScore;
/**
* 自评备注
*/
private String selfRemark;
/**
* 班主任评分
*/
private BigDecimal teacherScore;
/**
* 班主任备注
*/
private String teacherRemark;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,29 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import org.dromara.xskh.domain.vo.XskhAssessmentApplicationApprovalVo;
import java.util.List;
/**
* 学生考核申请、班主任审核Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentApplicationApprovalMapper
extends BaseMapperPlus<XskhAssessmentApplicationApproval, XskhAssessmentApplicationApprovalVo> {
/**
* 根据考核方案ID查询关联的指标数据
*/
List<Object> selectIndicatorsByPlanId(Long planId);
/**
* 根据申请ID查询完整的自评得分信息(包含指标表关联数据)
*/
List<org.dromara.xskh.domain.vo.XskhAssessmentSelfScoreVo> selectSelfScoresWithIndicatorInfo(
Long applicationId);
}
@@ -0,0 +1,43 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import org.dromara.xskh.domain.vo.XskhAssessmentApprovalVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 学生考核审核Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentApprovalMapper
extends BaseMapperPlus<XskhAssessmentApplicationApproval, XskhAssessmentApprovalVo> {
/**
* 查询班主任班级下的考核申请列表
*
* @param teacherId 班主任ID
* @param scheduleId 考核计划ID
* @param studentNo 学号
* @param studentName 学生姓名
* @param status 状态
* @return 考核申请列表
*/
List<XskhAssessmentApprovalVo> selectTeacherClassApplications(@Param("teacherId") Long teacherId,
@Param("scheduleId") Long scheduleId,
@Param("studentNo") String studentNo,
@Param("studentName") String studentName,
@Param("status") String status);
/**
* 根据ID查询考核申请详细信息(包含考核计划信息)
*
* @param id 考核申请ID
* @return 考核申请详细信息
*/
XskhAssessmentApprovalVo selectApprovalDetailById(@Param("id") Long id);
}
@@ -0,0 +1,15 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentBonusApproval;
import org.dromara.xskh.domain.vo.XskhAssessmentBonusApprovalVo;
/**
* 学生附加分申请、班主任审核得分Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentBonusApprovalMapper extends BaseMapperPlus<XskhAssessmentBonusApproval, XskhAssessmentBonusApprovalVo> {
}
@@ -0,0 +1,16 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentIndicatorDisciplineType;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorDisciplineTypeVo;
/**
* 考核指标关联违纪处分类型和奖励类型Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentIndicatorDisciplineTypeMapper
extends BaseMapperPlus<XskhAssessmentIndicatorDisciplineType, XskhAssessmentIndicatorDisciplineTypeVo> {
}
@@ -0,0 +1,16 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentIndicator;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorVo;
/**
* 学生考核指标体系Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentIndicatorMapper
extends BaseMapperPlus<XskhAssessmentIndicator, XskhAssessmentIndicatorVo> {
}
@@ -0,0 +1,16 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentIndicatorType;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorTypeVo;
/**
* 学生考核指标体系类型Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentIndicatorTypeMapper
extends BaseMapperPlus<XskhAssessmentIndicatorType, XskhAssessmentIndicatorTypeVo> {
}
@@ -0,0 +1,16 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentPlanIndicator;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanIndicatorVo;
/**
* 考核方案关联指标体系Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentPlanIndicatorMapper
extends BaseMapperPlus<XskhAssessmentPlanIndicator, XskhAssessmentPlanIndicatorVo> {
}
@@ -0,0 +1,26 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentPlan;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanVo;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanIndicatorVo;
import java.util.List;
/**
* 学生考核方案Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentPlanMapper extends BaseMapperPlus<XskhAssessmentPlan, XskhAssessmentPlanVo> {
/**
* 查询方案关联的指标详细信息
*
* @param planId 方案ID
* @return 指标详细信息列表
*/
List<XskhAssessmentPlanIndicatorVo> selectPlanIndicatorsWithDetail(Long planId);
}
@@ -0,0 +1,15 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentSchedule;
import org.dromara.xskh.domain.vo.XskhAssessmentScheduleVo;
/**
* 学生考核计划Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentScheduleMapper extends BaseMapperPlus<XskhAssessmentSchedule, XskhAssessmentScheduleVo> {
}
@@ -0,0 +1,27 @@
package org.dromara.xskh.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.xskh.domain.XskhAssessmentSelfScore;
import org.dromara.xskh.domain.vo.XskhAssessmentSelfScoreVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 学生考核自评、班主任评分Mapper接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface XskhAssessmentSelfScoreMapper
extends BaseMapperPlus<XskhAssessmentSelfScore, XskhAssessmentSelfScoreVo> {
/**
* 查询自评得分列表(包含指标详细信息)
*
* @param applicationId 考核申请ID
* @return 自评得分列表
*/
List<XskhAssessmentSelfScoreVo> selectSelfScoreWithIndicatorDetail(@Param("applicationId") Long applicationId);
}
@@ -9,6 +9,7 @@ import org.dromara.xskh.domain.vo.XskhDisciplineRecordVo;
import org.dromara.xskh.domain.vo.XskhStudentOptionVo;
import java.util.List;
import java.util.Map;
/**
* 学生违纪处分记录Mapper接口
@@ -38,4 +39,26 @@ public interface XskhDisciplineRecordMapper extends BaseMapperPlus<XskhDisciplin
@Param("bo") XskhDisciplineRecordBo bo,
@Param("classTeacherId") Long classTeacherId);
/**
* 获取指标关联的违纪处分类型和奖励类型
*
* @param indicatorId 指标ID
* @return 包含disciplineTypeIds和rewardTypeIds的Map
*/
Map<String, String> selectIndicatorTypes(@Param("indicatorId") Long indicatorId);
/**
* 获取学生在指定时间范围内的违纪处分记录
*
* @param studentId 学生ID
* @param disciplineTypeIds 违纪处分类型ID列表
* @param startTime 开始时间
* @param endTime 结束时间
* @return 违纪处分记录列表
*/
List<XskhDisciplineRecordVo> selectStudentDisciplineRecords(@Param("studentId") Long studentId,
@Param("disciplineTypeIds") List<Long> disciplineTypeIds,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
}
@@ -37,4 +37,18 @@ public interface XskhRewardRecordMapper extends BaseMapperPlus<XskhRewardRecord,
Page<XskhRewardRecordVo> selectClassTeacherVoPage(@Param("page") Page<XskhRewardRecordVo> page,
@Param("bo") XskhRewardRecordBo bo,
@Param("classTeacherId") Long classTeacherId);
/**
* 获取学生在指定时间范围内的奖励记录
*
* @param studentId 学生ID
* @param rewardTypeIds 奖励类型ID列表
* @param startTime 开始时间
* @param endTime 结束时间
* @return 奖励记录列表
*/
List<XskhRewardRecordVo> selectStudentRewardRecords(@Param("studentId") Long studentId,
@Param("rewardTypeIds") List<Long> rewardTypeIds,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
}
@@ -0,0 +1,80 @@
package org.dromara.xskh.service;
import org.dromara.xskh.domain.bo.XskhAssessmentApplicationApprovalBo;
import org.dromara.xskh.domain.vo.XskhAssessmentApplicationApprovalVo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 学生考核申请、班主任审核Service接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface IXskhAssessmentApplicationApprovalService {
/**
* 查询学生考核申请、班主任审核
*/
XskhAssessmentApplicationApprovalVo queryById(Long id);
/**
* 查询学生考核申请、班主任审核列表
*/
TableDataInfo<XskhAssessmentApplicationApprovalVo> queryPageList(XskhAssessmentApplicationApprovalBo bo,
PageQuery pageQuery);
/**
* 查询学生考核申请、班主任审核列表
*/
List<XskhAssessmentApplicationApprovalVo> queryList(XskhAssessmentApplicationApprovalBo bo);
/**
* 新增学生考核申请、班主任审核
*/
Long insertByBo(XskhAssessmentApplicationApprovalBo bo);
/**
* 修改学生考核申请、班主任审核
*/
Boolean updateByBo(XskhAssessmentApplicationApprovalBo bo);
/**
* 校验并批量删除学生考核申请、班主任审核信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 保存考核申请(草稿状态)
*/
Boolean saveApplication(XskhAssessmentApplicationApprovalBo bo);
/**
* 提交考核申请
*/
Boolean submitApplication(Long id);
/**
* 删除考核申请
*/
Boolean deleteApplication(Long id);
/**
* 获取可申请的考核计划列表
*/
List<XskhAssessmentApplicationApprovalVo> getAvailableSchedules();
/**
* 根据学生ID和考核计划ID查询申请
*/
XskhAssessmentApplicationApprovalVo getByStudentAndSchedule(Long studentId, Long scheduleId);
/**
* 根据考核计划ID获取关联的指标数据
*/
List<Object> getIndicatorsByScheduleId(Long scheduleId);
}
@@ -0,0 +1,65 @@
package org.dromara.xskh.service;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.xskh.domain.bo.XskhAssessmentApprovalBo;
import org.dromara.xskh.domain.vo.XskhAssessmentApprovalVo;
import java.util.Collection;
import java.util.List;
/**
* 学生考核审核Service接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface IXskhAssessmentApprovalService {
/**
* 查询学生考核审核
*/
XskhAssessmentApprovalVo queryById(Long id);
/**
* 查询学生考核审核列表
*/
TableDataInfo<XskhAssessmentApprovalVo> queryPageList(XskhAssessmentApprovalBo bo, PageQuery pageQuery);
/**
* 查询学生考核审核列表
*/
List<XskhAssessmentApprovalVo> queryList(XskhAssessmentApprovalBo bo);
/**
* 新增学生考核审核
*/
Boolean insertByBo(XskhAssessmentApprovalBo bo);
/**
* 修改学生考核审核
*/
Boolean updateByBo(XskhAssessmentApprovalBo bo);
/**
* 校验并批量删除学生考核审核信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 审核考核申请
*/
Boolean approveApplication(XskhAssessmentApprovalBo bo);
/**
* 获取班主任班级下的考核申请列表
*/
TableDataInfo<XskhAssessmentApprovalVo> getTeacherClassApplications(Long scheduleId, String studentNo,
String studentName, String status, PageQuery pageQuery);
/**
* 获取考核计划列表(进行中和已结束)
*/
List<XskhAssessmentApprovalVo> getAvailableSchedules();
}
@@ -0,0 +1,63 @@
package org.dromara.xskh.service;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorVo;
import org.dromara.xskh.domain.bo.XskhAssessmentIndicatorBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 学生考核指标体系Service接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface IXskhAssessmentIndicatorService {
/**
* 查询学生考核指标体系
*/
XskhAssessmentIndicatorVo queryById(Long id);
/**
* 查询学生考核指标体系列表
*/
TableDataInfo<XskhAssessmentIndicatorVo> queryPageList(XskhAssessmentIndicatorBo bo, PageQuery pageQuery);
/**
* 查询学生考核指标体系列表
*/
List<XskhAssessmentIndicatorVo> queryList(XskhAssessmentIndicatorBo bo);
/**
* 新增学生考核指标体系
*/
Boolean insertByBo(XskhAssessmentIndicatorBo bo);
/**
* 修改学生考核指标体系
*/
Boolean updateByBo(XskhAssessmentIndicatorBo bo);
/**
* 校验并批量删除学生考核指标体系信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 检查指标是否被考核方案使用
*/
Boolean checkUsedByPlan(Long indicatorId);
/**
* 保存指标关联的违纪处分类型和奖励类型
*/
Boolean saveIndicatorRelations(Long indicatorId, List<Long> disciplineTypeIds, List<Long> rewardTypeIds);
/**
* 获取指标关联的违纪处分类型和奖励类型
*/
XskhAssessmentIndicatorVo getIndicatorWithRelations(Long indicatorId);
}
@@ -0,0 +1,53 @@
package org.dromara.xskh.service;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorTypeVo;
import org.dromara.xskh.domain.bo.XskhAssessmentIndicatorTypeBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 学生考核指标体系类型Service接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface IXskhAssessmentIndicatorTypeService {
/**
* 查询学生考核指标体系类型
*/
XskhAssessmentIndicatorTypeVo queryById(Long id);
/**
* 查询学生考核指标体系类型列表
*/
TableDataInfo<XskhAssessmentIndicatorTypeVo> queryPageList(XskhAssessmentIndicatorTypeBo bo, PageQuery pageQuery);
/**
* 查询学生考核指标体系类型列表
*/
List<XskhAssessmentIndicatorTypeVo> queryList(XskhAssessmentIndicatorTypeBo bo);
/**
* 新增学生考核指标体系类型
*/
Boolean insertByBo(XskhAssessmentIndicatorTypeBo bo);
/**
* 修改学生考核指标体系类型
*/
Boolean updateByBo(XskhAssessmentIndicatorTypeBo bo);
/**
* 校验并批量删除学生考核指标体系类型信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 检查指标类型是否被指标体系使用
*/
Boolean checkUsedByIndicator(Long typeId);
}
@@ -0,0 +1,53 @@
package org.dromara.xskh.service;
import org.dromara.xskh.domain.bo.XskhAssessmentPlanBo;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanVo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 学生考核方案Service接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface IXskhAssessmentPlanService {
/**
* 查询学生考核方案
*/
XskhAssessmentPlanVo queryById(Long id);
/**
* 查询学生考核方案列表
*/
TableDataInfo<XskhAssessmentPlanVo> queryPageList(XskhAssessmentPlanBo bo, PageQuery pageQuery);
/**
* 查询学生考核方案列表
*/
List<XskhAssessmentPlanVo> queryList(XskhAssessmentPlanBo bo);
/**
* 新增学生考核方案
*/
Boolean insertByBo(XskhAssessmentPlanBo bo);
/**
* 修改学生考核方案
*/
Boolean updateByBo(XskhAssessmentPlanBo bo);
/**
* 校验并批量删除学生考核方案信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取方案详情(包含关联的指标信息)
*/
XskhAssessmentPlanVo getPlanWithRelations(Long id);
}
@@ -0,0 +1,71 @@
package org.dromara.xskh.service;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleBo;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleQueryBo;
import org.dromara.xskh.domain.vo.XskhAssessmentScheduleVo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 学生考核计划Service接口
*
* @author ruoyi
* @date 2025-01-03
*/
public interface IXskhAssessmentScheduleService {
/**
* 查询学生考核计划
*/
XskhAssessmentScheduleVo queryById(Long id);
/**
* 查询学生考核计划列表
*/
TableDataInfo<XskhAssessmentScheduleVo> queryPageList(XskhAssessmentScheduleBo bo, PageQuery pageQuery);
/**
* 根据状态列表查询学生考核计划列表
*/
TableDataInfo<XskhAssessmentScheduleVo> queryPageListByStatusList(XskhAssessmentScheduleQueryBo bo,
PageQuery pageQuery);
/**
* 查询学生考核计划列表
*/
List<XskhAssessmentScheduleVo> queryList(XskhAssessmentScheduleBo bo);
/**
* 新增学生考核计划
*/
Boolean insertByBo(XskhAssessmentScheduleBo bo);
/**
* 修改学生考核计划
*/
Boolean updateByBo(XskhAssessmentScheduleBo bo);
/**
* 校验并批量删除学生考核计划信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 上线考核计划
*/
Boolean onlineSchedule(Long id);
/**
* 下线考核计划
*/
Boolean offlineSchedule(Long id);
/**
* 完成考核计划
*/
Boolean completeSchedule(Long id);
}
@@ -8,6 +8,7 @@ import org.dromara.xskh.domain.vo.XskhStudentOptionVo;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 学生违纪处分记录Service接口
@@ -70,4 +71,24 @@ public interface IXskhDisciplineRecordService {
* @return 更新结果
*/
Boolean updateDisciplineRecordStatus(Long id, String status);
/**
* 获取指标关联的违纪处分类型和奖励类型
*
* @param indicatorId 指标ID
* @return 包含disciplineTypeIds和rewardTypeIds的Map
*/
Map<String, String> getIndicatorTypes(Long indicatorId);
/**
* 获取学生在指定时间范围内的违纪处分记录
*
* @param studentId 学生ID
* @param disciplineTypeIds 违纪处分类型ID,逗号分隔
* @param startTime 开始时间
* @param endTime 结束时间
* @return 违纪处分记录列表
*/
List<XskhDisciplineRecordVo> getStudentDisciplineRecords(Long studentId, String disciplineTypeIds, String startTime,
String endTime);
}
@@ -78,7 +78,7 @@ public interface IXskhRewardRecordService {
/**
* 查询当前登录学生的奖励记录列表
*
* @param bo 查询条件
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 分页结果
*/
@@ -87,9 +87,21 @@ public interface IXskhRewardRecordService {
/**
* 查询班主任班级的奖励记录列表(班主任专用)
*
* @param bo 查询条件
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 分页结果
*/
TableDataInfo<XskhRewardRecordVo> queryClassTeacherPageList(XskhRewardRecordBo bo, PageQuery pageQuery);
/**
* 获取学生在指定时间范围内的奖励记录
*
* @param studentId 学生ID
* @param rewardTypeIds 奖励类型ID,逗号分隔
* @param startTime 开始时间
* @param endTime 结束时间
* @return 奖励记录列表
*/
List<XskhRewardRecordVo> getStudentRewardRecords(Long studentId, String rewardTypeIds, String startTime,
String endTime);
}
@@ -0,0 +1,387 @@
package org.dromara.xskh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.xskh.domain.bo.XskhAssessmentApplicationApprovalBo;
import org.dromara.xskh.domain.bo.XskhAssessmentSelfScoreBo;
import org.dromara.xskh.domain.bo.XskhAssessmentBonusApprovalBo;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleBo;
import org.dromara.xskh.domain.vo.XskhAssessmentApplicationApprovalVo;
import org.dromara.xskh.domain.vo.XskhAssessmentSelfScoreVo;
import org.dromara.xskh.domain.vo.XskhAssessmentBonusApprovalVo;
import org.dromara.xskh.domain.vo.XskhAssessmentScheduleVo;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import org.dromara.xskh.domain.XskhAssessmentSelfScore;
import org.dromara.xskh.domain.XskhAssessmentBonusApproval;
import org.dromara.xskh.mapper.XskhAssessmentApplicationApprovalMapper;
import org.dromara.xskh.mapper.XskhAssessmentSelfScoreMapper;
import org.dromara.xskh.mapper.XskhAssessmentBonusApprovalMapper;
import org.dromara.xskh.service.IXskhAssessmentApplicationApprovalService;
import org.dromara.xskh.service.IXskhAssessmentScheduleService;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 学生考核申请、班主任审核Service业务层处理
*
* @author ruoyi
* @date 2025-01-03
*/
@RequiredArgsConstructor
@Service
public class XskhAssessmentApplicationApprovalServiceImpl implements IXskhAssessmentApplicationApprovalService {
private final XskhAssessmentApplicationApprovalMapper baseMapper;
private final XskhAssessmentSelfScoreMapper selfScoreMapper;
private final XskhAssessmentBonusApprovalMapper bonusApprovalMapper;
private final IXskhAssessmentScheduleService assessmentScheduleService;
/**
* 查询学生考核申请、班主任审核
*/
@Override
public XskhAssessmentApplicationApprovalVo queryById(Long id) {
XskhAssessmentApplicationApprovalVo vo = baseMapper.selectVoById(id);
if (vo != null) {
// 查询完整的自评得分列表(包含指标表关联数据)
List<XskhAssessmentSelfScoreVo> selfScoreVos = baseMapper.selectSelfScoresWithIndicatorInfo(id);
vo.setSelfScoreList(selfScoreVos);
// 查询附加分申请列表
LambdaQueryWrapper<XskhAssessmentBonusApproval> bonusWrapper = Wrappers.lambdaQuery();
bonusWrapper.eq(XskhAssessmentBonusApproval::getApplicationId, id);
List<XskhAssessmentBonusApproval> bonusApprovals = bonusApprovalMapper.selectList(bonusWrapper);
vo.setBonusApprovalList(MapstructUtils.convert(bonusApprovals, XskhAssessmentBonusApprovalVo.class));
}
return vo;
}
/**
* 查询学生考核申请、班主任审核列表
*/
@Override
public TableDataInfo<XskhAssessmentApplicationApprovalVo> queryPageList(XskhAssessmentApplicationApprovalBo bo,
PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentApplicationApproval> lqw = buildQueryWrapper(bo);
Page<XskhAssessmentApplicationApprovalVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询学生考核申请、班主任审核列表
*/
@Override
public List<XskhAssessmentApplicationApprovalVo> queryList(XskhAssessmentApplicationApprovalBo bo) {
LambdaQueryWrapper<XskhAssessmentApplicationApproval> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XskhAssessmentApplicationApproval> buildQueryWrapper(
XskhAssessmentApplicationApprovalBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XskhAssessmentApplicationApproval> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getScheduleId() != null, XskhAssessmentApplicationApproval::getScheduleId, bo.getScheduleId());
lqw.eq(bo.getStudentId() != null, XskhAssessmentApplicationApproval::getStudentId, bo.getStudentId());
lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XskhAssessmentApplicationApproval::getStudentName,
bo.getStudentName());
lqw.like(StringUtils.isNotBlank(bo.getStudentNo()), XskhAssessmentApplicationApproval::getStudentNo,
bo.getStudentNo());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhAssessmentApplicationApproval::getStatus, bo.getStatus());
return lqw;
}
/**
* 新增学生考核申请、班主任审核
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Long insertByBo(XskhAssessmentApplicationApprovalBo bo) {
XskhAssessmentApplicationApproval add = MapstructUtils.convert(bo, XskhAssessmentApplicationApproval.class);
validEntityBeforeSave(add);
// 新增时默认状态为草稿
add.setStatus("1");
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
// 保存自评得分数据
saveSelfScores(add.getId(), bo.getSelfScoreList());
// 保存附加分申请数据
saveBonusApprovals(add.getId(), bo.getBonusApprovalList());
return add.getId();
}
return null;
}
/**
* 修改学生考核申请、班主任审核
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(XskhAssessmentApplicationApprovalBo bo) {
XskhAssessmentApplicationApproval update = MapstructUtils.convert(bo, XskhAssessmentApplicationApproval.class);
validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0;
if (flag) {
// 更新自评得分数据
updateSelfScores(update.getId(), bo.getSelfScoreList());
// 更新附加分申请数据
updateBonusApprovals(update.getId(), bo.getBonusApprovalList());
}
return flag;
}
/**
* 保存前校验数据
*/
private void validEntityBeforeSave(XskhAssessmentApplicationApproval entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除学生考核申请、班主任审核
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// 校验是否可以删除:只有草稿状态的申请可以删除
for (Long id : ids) {
XskhAssessmentApplicationApproval application = baseMapper.selectById(id);
if (application != null && !"1".equals(application.getStatus())) {
throw new RuntimeException("只有草稿状态的考核申请可以删除");
}
}
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 保存考核申请(草稿状态)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveApplication(XskhAssessmentApplicationApprovalBo bo) {
if (bo.getId() == null) {
// 新增
return insertByBo(bo) != null;
} else {
// 修改
XskhAssessmentApplicationApproval existing = baseMapper.selectById(bo.getId());
if (existing == null) {
throw new RuntimeException("考核申请不存在");
}
if (!"1".equals(existing.getStatus()) && !"2".equals(existing.getStatus())
&& !"3".equals(existing.getStatus())) {
throw new RuntimeException("只有草稿、已提交、班主任审核状态的考核申请可以保存");
}
// 保存时状态改为草稿
bo.setStatus("1");
return updateByBo(bo);
}
}
/**
* 提交考核申请
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean submitApplication(Long id) {
XskhAssessmentApplicationApproval application = baseMapper.selectById(id);
if (application == null) {
throw new RuntimeException("考核申请不存在");
}
if (!"1".equals(application.getStatus()) && !"2".equals(application.getStatus())
&& !"3".equals(application.getStatus())) {
throw new RuntimeException("只有草稿、已提交、班主任审核状态的考核申请可以提交");
}
application.setStatus("2"); // 设置为已提交
application.setSubmitTime(new Date());
return baseMapper.updateById(application) > 0;
}
/**
* 删除考核申请
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteApplication(Long id) {
XskhAssessmentApplicationApproval application = baseMapper.selectById(id);
if (application == null) {
throw new RuntimeException("考核申请不存在");
}
if (!"1".equals(application.getStatus())) {
throw new RuntimeException("只有草稿状态的考核申请可以删除");
}
// 删除自评得分数据
LambdaQueryWrapper<XskhAssessmentSelfScore> selfScoreWrapper = Wrappers.lambdaQuery();
selfScoreWrapper.eq(XskhAssessmentSelfScore::getApplicationId, id);
selfScoreMapper.delete(selfScoreWrapper);
// 删除附加分申请数据
LambdaQueryWrapper<XskhAssessmentBonusApproval> bonusWrapper = Wrappers.lambdaQuery();
bonusWrapper.eq(XskhAssessmentBonusApproval::getApplicationId, id);
bonusApprovalMapper.delete(bonusWrapper);
// 删除主表数据
return baseMapper.deleteById(id) > 0;
}
/**
* 获取可申请的考核计划列表
*/
@Override
public List<XskhAssessmentApplicationApprovalVo> getAvailableSchedules() {
// 查询状态为2(进行中)和3(已结束)的考核计划
XskhAssessmentScheduleBo bo = new XskhAssessmentScheduleBo();
List<XskhAssessmentScheduleVo> scheduleList = assessmentScheduleService.queryList(bo);
// 过滤出状态为2和3的计划
List<XskhAssessmentScheduleVo> availableSchedules = scheduleList.stream()
.filter(schedule -> "2".equals(schedule.getStatus()) || "3".equals(schedule.getStatus()))
.toList();
// 转换为申请VO对象,包含考核计划的详细信息
List<XskhAssessmentApplicationApprovalVo> result = new ArrayList<>();
for (XskhAssessmentScheduleVo schedule : availableSchedules) {
XskhAssessmentApplicationApprovalVo vo = new XskhAssessmentApplicationApprovalVo();
vo.setScheduleId(schedule.getId());
vo.setScheduleName(schedule.getScheduleName());
// 设置考核计划的状态信息
vo.setStatus(schedule.getStatus());
// 设置考核计划的时间信息
vo.setStartTime(schedule.getStartTime());
vo.setEndTime(schedule.getEndTime());
// 设置数据统计时间范围(用于指标数据查询)
vo.setDataStartTime(schedule.getDataStartTime());
vo.setDataEndTime(schedule.getDataEndTime());
result.add(vo);
}
return result;
}
/**
* 根据学生ID和考核计划ID查询申请
*/
@Override
public XskhAssessmentApplicationApprovalVo getByStudentAndSchedule(Long studentId, Long scheduleId) {
LambdaQueryWrapper<XskhAssessmentApplicationApproval> wrapper = Wrappers.lambdaQuery();
wrapper.eq(XskhAssessmentApplicationApproval::getStudentId, studentId);
wrapper.eq(XskhAssessmentApplicationApproval::getScheduleId, scheduleId);
XskhAssessmentApplicationApproval application = baseMapper.selectOne(wrapper);
if (application != null) {
return queryById(application.getId());
}
return null;
}
/**
* 保存自评得分数据
*/
private void saveSelfScores(Long applicationId, List<XskhAssessmentSelfScoreBo> selfScoreList) {
if (selfScoreList != null && !selfScoreList.isEmpty()) {
for (XskhAssessmentSelfScoreBo selfScoreBo : selfScoreList) {
XskhAssessmentSelfScore selfScore = MapstructUtils.convert(selfScoreBo, XskhAssessmentSelfScore.class);
selfScore.setApplicationId(applicationId);
selfScoreMapper.insert(selfScore);
}
}
}
/**
* 更新自评得分数据
*/
private void updateSelfScores(Long applicationId, List<XskhAssessmentSelfScoreBo> selfScoreList) {
if (selfScoreList != null && !selfScoreList.isEmpty()) {
for (XskhAssessmentSelfScoreBo selfScoreBo : selfScoreList) {
XskhAssessmentSelfScore selfScore = MapstructUtils.convert(selfScoreBo, XskhAssessmentSelfScore.class);
selfScore.setApplicationId(applicationId);
// 如果ID存在,则更新;否则新增
if (selfScore.getId() != null) {
// 更新现有记录
selfScoreMapper.updateById(selfScore);
} else {
// 新增记录
selfScoreMapper.insert(selfScore);
}
}
}
}
/**
* 保存附加分申请数据
*/
private void saveBonusApprovals(Long applicationId, List<XskhAssessmentBonusApprovalBo> bonusApprovalList) {
if (bonusApprovalList != null && !bonusApprovalList.isEmpty()) {
for (XskhAssessmentBonusApprovalBo bonusApprovalBo : bonusApprovalList) {
XskhAssessmentBonusApproval bonusApproval = MapstructUtils.convert(bonusApprovalBo,
XskhAssessmentBonusApproval.class);
bonusApproval.setApplicationId(applicationId);
bonusApproval.setStatus("1"); // 默认待审核状态
bonusApprovalMapper.insert(bonusApproval);
}
}
}
/**
* 更新附加分申请数据
*/
private void updateBonusApprovals(Long applicationId, List<XskhAssessmentBonusApprovalBo> bonusApprovalList) {
if (bonusApprovalList != null && !bonusApprovalList.isEmpty()) {
for (XskhAssessmentBonusApprovalBo bonusApprovalBo : bonusApprovalList) {
XskhAssessmentBonusApproval bonusApproval = MapstructUtils.convert(bonusApprovalBo,
XskhAssessmentBonusApproval.class);
bonusApproval.setApplicationId(applicationId);
// 如果ID存在,则更新;否则新增
if (bonusApproval.getId() != null) {
// 更新现有记录
bonusApprovalMapper.updateById(bonusApproval);
} else {
// 新增记录,设置默认状态
bonusApproval.setStatus("1"); // 默认待审核状态
bonusApprovalMapper.insert(bonusApproval);
}
}
}
}
/**
* 根据考核计划ID获取关联的指标数据
*/
@Override
public List<Object> getIndicatorsByScheduleId(Long scheduleId) {
// 1. 根据考核计划ID获取考核方案ID
XskhAssessmentScheduleVo schedule = assessmentScheduleService.queryById(scheduleId);
if (schedule == null) {
return new ArrayList<>();
}
Long planId = schedule.getPlanId();
if (planId == null) {
return new ArrayList<>();
}
// 2. 根据考核方案ID查询关联的指标数据
// 这里需要调用考核方案指标关联的Mapper
// 由于没有直接的Mapper注入,我们需要通过SQL查询
List<Object> indicators = baseMapper.selectIndicatorsByPlanId(planId);
return indicators;
}
}
@@ -0,0 +1,341 @@
package org.dromara.xskh.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.xskh.domain.XskhAssessmentApplicationApproval;
import org.dromara.xskh.domain.XskhAssessmentBonusApproval;
import org.dromara.xskh.domain.XskhAssessmentSelfScore;
import org.dromara.xskh.domain.bo.XskhAssessmentApprovalBo;
import org.dromara.xskh.domain.bo.XskhAssessmentSelfScoreBo;
import org.dromara.xskh.domain.bo.XskhAssessmentBonusApprovalBo;
import org.dromara.xskh.domain.vo.XskhAssessmentApprovalVo;
import org.dromara.xskh.domain.vo.XskhAssessmentSelfScoreVo;
import org.dromara.xskh.domain.vo.XskhAssessmentBonusApprovalVo;
import org.dromara.xskh.mapper.XskhAssessmentApprovalMapper;
import org.dromara.xskh.mapper.XskhAssessmentBonusApprovalMapper;
import org.dromara.xskh.mapper.XskhAssessmentSelfScoreMapper;
import org.dromara.xskh.service.IXskhAssessmentApprovalService;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* 学生考核审核Service业务层处理
*
* @author ruoyi
* @date 2025-01-03
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XskhAssessmentApprovalServiceImpl implements IXskhAssessmentApprovalService {
private final XskhAssessmentApprovalMapper baseMapper;
private final XskhAssessmentSelfScoreMapper selfScoreMapper;
private final XskhAssessmentBonusApprovalMapper bonusApprovalMapper;
private final JdbcTemplate jdbcTemplate;
/**
* 查询学生考核审核
*/
@Override
public XskhAssessmentApprovalVo queryById(Long id) {
// 使用自定义SQL查询获取完整的考核申请信息
XskhAssessmentApprovalVo vo = baseMapper.selectApprovalDetailById(id);
if (vo != null) {
// 查询自评得分列表(包含指标详细信息)
List<XskhAssessmentSelfScoreVo> selfScoreList = selfScoreMapper.selectSelfScoreWithIndicatorDetail(id);
vo.setSelfScoreList(selfScoreList);
// 查询附加分申请列表
LambdaQueryWrapper<XskhAssessmentBonusApproval> bonusWrapper = Wrappers.lambdaQuery();
bonusWrapper.eq(XskhAssessmentBonusApproval::getApplicationId, id);
List<XskhAssessmentBonusApproval> bonusList = bonusApprovalMapper.selectList(bonusWrapper);
List<XskhAssessmentBonusApprovalVo> bonusVoList = MapstructUtils.convert(bonusList,
XskhAssessmentBonusApprovalVo.class);
// 设置附加分列表(前端期望的字段名)
vo.setBonusList(bonusVoList);
// 同时设置bonusApprovalList字段以兼容前端
vo.setBonusApprovalList(bonusVoList);
}
return vo;
}
/**
* 查询学生考核审核列表
*/
@Override
public TableDataInfo<XskhAssessmentApprovalVo> queryPageList(XskhAssessmentApprovalBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentApplicationApproval> lqw = buildQueryWrapper(bo);
Page<XskhAssessmentApprovalVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询学生考核审核列表
*/
@Override
public List<XskhAssessmentApprovalVo> queryList(XskhAssessmentApprovalBo bo) {
LambdaQueryWrapper<XskhAssessmentApplicationApproval> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XskhAssessmentApplicationApproval> buildQueryWrapper(XskhAssessmentApprovalBo bo) {
LambdaQueryWrapper<XskhAssessmentApplicationApproval> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getScheduleId() != null, XskhAssessmentApplicationApproval::getScheduleId, bo.getScheduleId());
lqw.eq(StringUtils.isNotBlank(bo.getStudentNo()), XskhAssessmentApplicationApproval::getStudentNo,
bo.getStudentNo());
lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XskhAssessmentApplicationApproval::getStudentName,
bo.getStudentName());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhAssessmentApplicationApproval::getStatus, bo.getStatus());
lqw.orderByDesc(XskhAssessmentApplicationApproval::getCreateTime);
return lqw;
}
/**
* 新增学生考核审核
*/
@Override
public Boolean insertByBo(XskhAssessmentApprovalBo bo) {
XskhAssessmentApplicationApproval add = MapstructUtils.convert(bo, XskhAssessmentApplicationApproval.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改学生考核审核
*/
@Override
public Boolean updateByBo(XskhAssessmentApprovalBo bo) {
XskhAssessmentApplicationApproval update = MapstructUtils.convert(bo, XskhAssessmentApplicationApproval.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XskhAssessmentApplicationApproval entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除学生考核审核
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 审核考核申请
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean approveApplication(XskhAssessmentApprovalBo bo) {
// 1. 更新考核申请主表
XskhAssessmentApplicationApproval application = baseMapper.selectById(bo.getId());
if (application == null) {
throw new RuntimeException("考核申请不存在");
}
// 校验状态
if (!"2".equals(application.getStatus()) && !"3".equals(application.getStatus())) {
throw new RuntimeException("只有已提交或班主任审核状态的申请可以审核");
}
// 更新申请状态为已完成
application.setStatus("6");
application.setTeacherApprovalBy(LoginHelper.getUserId());
application.setTeacherApprovalTime(new Date());
application.setTeacherApprovalRemark(bo.getTeacherApprovalRemark());
application.setUpdateBy(LoginHelper.getUserId());
application.setUpdateTime(new Date());
// 2. 更新自评得分表中的班主任评分
if (bo.getSelfScoreList() != null && !bo.getSelfScoreList().isEmpty()) {
for (XskhAssessmentSelfScoreBo selfScoreBo : bo.getSelfScoreList()) {
XskhAssessmentSelfScore selfScore = selfScoreMapper.selectById(selfScoreBo.getId());
if (selfScore != null) {
selfScore.setTeacherScore(selfScoreBo.getTeacherScore());
selfScore.setTeacherRemark(selfScoreBo.getTeacherRemark());
selfScore.setUpdateBy(LoginHelper.getUserId());
selfScore.setUpdateTime(new Date());
selfScoreMapper.updateById(selfScore);
}
}
}
// 3. 更新附加分申请表中的审核得分
// 优先使用bonusApprovalList,如果没有则使用bonusList
List<XskhAssessmentBonusApprovalBo> bonusApprovalList = bo.getBonusApprovalList();
if (bonusApprovalList == null || bonusApprovalList.isEmpty()) {
bonusApprovalList = bo.getBonusList();
}
log.info("审核附加分数据 - bonusApprovalList: {}, bonusList: {}",
bo.getBonusApprovalList() != null ? bo.getBonusApprovalList().size() : 0,
bo.getBonusList() != null ? bo.getBonusList().size() : 0);
if (bonusApprovalList != null && !bonusApprovalList.isEmpty()) {
log.info("开始处理 {} 个附加分项目", bonusApprovalList.size());
for (XskhAssessmentBonusApprovalBo bonusBo : bonusApprovalList) {
log.info("处理附加分项目 - ID: {}, 审核得分: {}, 审核备注: {}",
bonusBo.getId(), bonusBo.getApprovalScore(), bonusBo.getApprovalRemark());
XskhAssessmentBonusApproval bonus = bonusApprovalMapper.selectById(bonusBo.getId());
if (bonus != null) {
bonus.setApprovalScore(bonusBo.getApprovalScore());
bonus.setApprovalBy(LoginHelper.getUserId());
bonus.setApprovalTime(new Date());
bonus.setApprovalRemark(bonusBo.getApprovalRemark());
// 根据审核得分判断状态:大于0为审核通过,否则为审核拒绝
if (bonusBo.getApprovalScore() != null
&& bonusBo.getApprovalScore().compareTo(BigDecimal.ZERO) > 0) {
bonus.setStatus("2"); // 审核通过
log.info("附加分项目 {} 审核通过", bonusBo.getId());
} else {
bonus.setStatus("3"); // 审核拒绝
log.info("附加分项目 {} 审核拒绝", bonusBo.getId());
}
bonus.setUpdateBy(LoginHelper.getUserId());
bonus.setUpdateTime(new Date());
int updateResult = bonusApprovalMapper.updateById(bonus);
log.info("更新附加分项目 {} 结果: {}", bonusBo.getId(), updateResult);
} else {
log.warn("未找到附加分项目,ID: {}", bonusBo.getId());
}
}
} else {
log.info("没有附加分数据需要处理");
}
// 4. 计算总得分
BigDecimal totalTeacherScore = BigDecimal.ZERO;
// 计算自评得分中的班主任评分总和
LambdaQueryWrapper<XskhAssessmentSelfScore> selfScoreWrapper = Wrappers.lambdaQuery();
selfScoreWrapper.eq(XskhAssessmentSelfScore::getApplicationId, bo.getId());
List<XskhAssessmentSelfScore> selfScoreList = selfScoreMapper.selectList(selfScoreWrapper);
for (XskhAssessmentSelfScore selfScore : selfScoreList) {
if (selfScore.getTeacherScore() != null) {
totalTeacherScore = totalTeacherScore.add(selfScore.getTeacherScore());
}
}
// 计算附加分申请中的审核得分总和
LambdaQueryWrapper<XskhAssessmentBonusApproval> bonusWrapper = Wrappers.lambdaQuery();
bonusWrapper.eq(XskhAssessmentBonusApproval::getApplicationId, bo.getId());
List<XskhAssessmentBonusApproval> bonusList = bonusApprovalMapper.selectList(bonusWrapper);
for (XskhAssessmentBonusApproval bonus : bonusList) {
if (bonus.getApprovalScore() != null) {
totalTeacherScore = totalTeacherScore.add(bonus.getApprovalScore());
}
}
// 更新总得分
application.setTeacherScore(totalTeacherScore);
application.setTotalScore(totalTeacherScore);
return baseMapper.updateById(application) > 0;
}
/**
* 获取班主任班级下的考核申请列表
* 注意:班主任只能查看已提交、班主任审核、已完成状态的申请,不包含草稿状态
*/
@Override
public TableDataInfo<XskhAssessmentApprovalVo> getTeacherClassApplications(Long scheduleId, String studentNo,
String studentName, String status, PageQuery pageQuery) {
// 获取当前登录用户的ID
Long currentUserId = LoginHelper.getUserId();
// 查询班主任班级下的考核申请列表
List<XskhAssessmentApprovalVo> list = baseMapper.selectTeacherClassApplications(
currentUserId, scheduleId, studentNo, studentName, status);
// 手动分页处理
Page<XskhAssessmentApprovalVo> page = pageQuery.build();
int total = list.size();
int start = (int) ((page.getCurrent() - 1) * page.getSize());
int end = Math.min(start + (int) page.getSize(), total);
List<XskhAssessmentApprovalVo> pageList = list.subList(start, end);
page.setRecords(pageList);
page.setTotal(total);
return TableDataInfo.build(page);
}
/**
* 获取考核计划列表(进行中和已结束)
*/
@Override
public List<XskhAssessmentApprovalVo> getAvailableSchedules() {
// 查询考核计划表,获取状态为进行中和已结束的计划
String sql = """
SELECT
id as schedule_id,
schedule_name,
academic_year,
semester,
start_time,
end_time,
status,
CASE status
WHEN '1' THEN '未开始'
WHEN '2' THEN '进行中'
WHEN '3' THEN '已结束'
ELSE '未知'
END as status_name
FROM xskh_assessment_schedule
WHERE deleted = 0
AND status IN ('2', '3')
ORDER BY start_time DESC
""";
try {
// 使用JdbcTemplate执行查询
return jdbcTemplate.query(sql, (rs, rowNum) -> {
XskhAssessmentApprovalVo vo = new XskhAssessmentApprovalVo();
vo.setScheduleId(rs.getLong("schedule_id"));
vo.setScheduleName(rs.getString("schedule_name"));
vo.setStatus(rs.getString("status"));
vo.setStatusName(rs.getString("status_name"));
return vo;
});
} catch (Exception e) {
log.error("查询考核计划列表失败", e);
return new ArrayList<>();
}
}
}
@@ -0,0 +1,228 @@
package org.dromara.xskh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import cn.hutool.core.convert.Convert;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.xskh.domain.bo.XskhAssessmentIndicatorBo;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorVo;
import org.dromara.xskh.domain.XskhAssessmentIndicator;
import org.dromara.xskh.domain.XskhAssessmentIndicatorDisciplineType;
import org.dromara.xskh.domain.XskhAssessmentIndicatorType;
import org.dromara.xskh.mapper.XskhAssessmentIndicatorMapper;
import org.dromara.xskh.mapper.XskhAssessmentIndicatorDisciplineTypeMapper;
import org.dromara.xskh.mapper.XskhAssessmentIndicatorTypeMapper;
import org.dromara.xskh.service.IXskhAssessmentIndicatorService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 学生考核指标体系Service业务层处理
*
* @author ruoyi
* @date 2025-01-03
*/
@RequiredArgsConstructor
@Service
public class XskhAssessmentIndicatorServiceImpl implements IXskhAssessmentIndicatorService {
private final XskhAssessmentIndicatorMapper baseMapper;
private final XskhAssessmentIndicatorDisciplineTypeMapper relationMapper;
private final XskhAssessmentIndicatorTypeMapper indicatorTypeMapper;
/**
* 查询学生考核指标体系
*/
@Override
public XskhAssessmentIndicatorVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询学生考核指标体系列表
*/
@Override
public TableDataInfo<XskhAssessmentIndicatorVo> queryPageList(XskhAssessmentIndicatorBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentIndicator> lqw = buildQueryWrapper(bo);
Page<XskhAssessmentIndicatorVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询学生考核指标体系列表
*/
@Override
public List<XskhAssessmentIndicatorVo> queryList(XskhAssessmentIndicatorBo bo) {
LambdaQueryWrapper<XskhAssessmentIndicator> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XskhAssessmentIndicator> buildQueryWrapper(XskhAssessmentIndicatorBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XskhAssessmentIndicator> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getIndicatorCode()), XskhAssessmentIndicator::getIndicatorCode,
bo.getIndicatorCode());
lqw.like(StringUtils.isNotBlank(bo.getIndicatorName()), XskhAssessmentIndicator::getIndicatorName,
bo.getIndicatorName());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhAssessmentIndicator::getStatus, bo.getStatus());
lqw.eq(bo.getIndicatorTypeId() != null, XskhAssessmentIndicator::getIndicatorTypeId, bo.getIndicatorTypeId());
lqw.orderByDesc(XskhAssessmentIndicator::getCreateTime);
return lqw;
}
/**
* 新增学生考核指标体系
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(XskhAssessmentIndicatorBo bo) {
XskhAssessmentIndicator add = MapstructUtils.convert(bo, XskhAssessmentIndicator.class);
// 根据指标类型ID设置指标类型名称
if (add.getIndicatorTypeId() != null) {
XskhAssessmentIndicatorType indicatorType = indicatorTypeMapper.selectById(add.getIndicatorTypeId());
if (indicatorType != null) {
add.setIndicatorTypeName(indicatorType.getTypeName());
}
}
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
// 保存关联关系
saveIndicatorRelations(add.getId(), bo.getDisciplineTypeIds(), bo.getRewardTypeIds());
}
return flag;
}
/**
* 修改学生考核指标体系
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(XskhAssessmentIndicatorBo bo) {
XskhAssessmentIndicator update = MapstructUtils.convert(bo, XskhAssessmentIndicator.class);
// 根据指标类型ID设置指标类型名称
if (update.getIndicatorTypeId() != null) {
XskhAssessmentIndicatorType indicatorType = indicatorTypeMapper.selectById(update.getIndicatorTypeId());
if (indicatorType != null) {
update.setIndicatorTypeName(indicatorType.getTypeName());
}
}
validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0;
if (flag) {
// 更新关联关系
saveIndicatorRelations(update.getId(), bo.getDisciplineTypeIds(), bo.getRewardTypeIds());
}
return flag;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XskhAssessmentIndicator entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除学生考核指标体系
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 检查指标是否被考核方案使用
*/
@Override
public Boolean checkUsedByPlan(Long indicatorId) {
// 这里需要查询考核方案表,检查是否有使用该指标
// 由于考核方案表还未创建,暂时返回false
// TODO: 当考核方案表创建后,需要实现此逻辑
return false;
}
/**
* 保存指标关联的违纪处分类型和奖励类型
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveIndicatorRelations(Long indicatorId, List<Long> disciplineTypeIds, List<Long> rewardTypeIds) {
// 先删除原有关联关系
LambdaQueryWrapper<XskhAssessmentIndicatorDisciplineType> deleteWrapper = Wrappers.lambdaQuery();
deleteWrapper.eq(XskhAssessmentIndicatorDisciplineType::getIndicatorId, indicatorId);
relationMapper.delete(deleteWrapper);
// 如果有新的关联关系,则插入
if ((disciplineTypeIds != null && !disciplineTypeIds.isEmpty()) ||
(rewardTypeIds != null && !rewardTypeIds.isEmpty())) {
XskhAssessmentIndicatorDisciplineType relation = new XskhAssessmentIndicatorDisciplineType();
relation.setIndicatorId(indicatorId);
if (disciplineTypeIds != null && !disciplineTypeIds.isEmpty()) {
relation.setDisciplineTypeIds(
String.join(",", disciplineTypeIds.stream().map(String::valueOf).collect(Collectors.toList())));
} else {
relation.setDisciplineTypeIds("");
}
if (rewardTypeIds != null && !rewardTypeIds.isEmpty()) {
relation.setRewardTypeIds(
String.join(",", rewardTypeIds.stream().map(String::valueOf).collect(Collectors.toList())));
} else {
relation.setRewardTypeIds("");
}
return relationMapper.insert(relation) > 0;
}
return true;
}
/**
* 获取指标关联的违纪处分类型和奖励类型
*/
@Override
public XskhAssessmentIndicatorVo getIndicatorWithRelations(Long indicatorId) {
XskhAssessmentIndicatorVo vo = baseMapper.selectVoById(indicatorId);
if (vo != null) {
// 查询关联关系
LambdaQueryWrapper<XskhAssessmentIndicatorDisciplineType> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(XskhAssessmentIndicatorDisciplineType::getIndicatorId, indicatorId);
XskhAssessmentIndicatorDisciplineType relation = relationMapper.selectOne(queryWrapper);
if (relation != null) {
// 解析违纪处分类型ID列表
if (StringUtils.isNotBlank(relation.getDisciplineTypeIds())) {
List<Long> disciplineTypeIds = StringUtils.splitTo(relation.getDisciplineTypeIds(),
Convert::toLong);
vo.setDisciplineTypeIds(disciplineTypeIds);
}
// 解析奖励类型ID列表
if (StringUtils.isNotBlank(relation.getRewardTypeIds())) {
List<Long> rewardTypeIds = StringUtils.splitTo(relation.getRewardTypeIds(), Convert::toLong);
vo.setRewardTypeIds(rewardTypeIds);
}
}
}
return vo;
}
}
@@ -0,0 +1,146 @@
package org.dromara.xskh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.xskh.domain.bo.XskhAssessmentIndicatorTypeBo;
import org.dromara.xskh.domain.vo.XskhAssessmentIndicatorTypeVo;
import org.dromara.xskh.domain.XskhAssessmentIndicatorType;
import org.dromara.xskh.mapper.XskhAssessmentIndicatorTypeMapper;
import org.dromara.xskh.service.IXskhAssessmentIndicatorTypeService;
import org.dromara.common.satoken.utils.LoginHelper;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 学生考核指标体系类型Service业务层处理
*
* @author ruoyi
* @date 2025-01-03
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class XskhAssessmentIndicatorTypeServiceImpl implements IXskhAssessmentIndicatorTypeService {
private final XskhAssessmentIndicatorTypeMapper baseMapper;
/**
* 查询学生考核指标体系类型
*/
@Override
public XskhAssessmentIndicatorTypeVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询学生考核指标体系类型列表
*/
@Override
public TableDataInfo<XskhAssessmentIndicatorTypeVo> queryPageList(XskhAssessmentIndicatorTypeBo bo,
PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentIndicatorType> lqw = buildQueryWrapper(bo);
Page<XskhAssessmentIndicatorTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询学生考核指标体系类型列表
*/
@Override
public List<XskhAssessmentIndicatorTypeVo> queryList(XskhAssessmentIndicatorTypeBo bo) {
LambdaQueryWrapper<XskhAssessmentIndicatorType> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XskhAssessmentIndicatorType> buildQueryWrapper(XskhAssessmentIndicatorTypeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XskhAssessmentIndicatorType> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getTypeCode()), XskhAssessmentIndicatorType::getTypeCode, bo.getTypeCode());
lqw.like(StringUtils.isNotBlank(bo.getTypeName()), XskhAssessmentIndicatorType::getTypeName, bo.getTypeName());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhAssessmentIndicatorType::getStatus, bo.getStatus());
lqw.orderByDesc(XskhAssessmentIndicatorType::getCreateTime);
return lqw;
}
/**
* 新增学生考核指标体系类型
*/
@Override
public Boolean insertByBo(XskhAssessmentIndicatorTypeBo bo) {
XskhAssessmentIndicatorType add = MapstructUtils.convert(bo, XskhAssessmentIndicatorType.class);
// 调试日志:检查当前登录用户信息
// try {
// Long userId = LoginHelper.getUserId();
// Long deptId = LoginHelper.getDeptId();
// log.info("🔍 调试信息 - 当前登录用户ID: {}, 部门ID: {}", userId, deptId);
// // 手动设置createDept字段,确保有值
// if (add.getCreateDept() == null && deptId != null) {
// add.setCreateDept(deptId);
// log.info("✅ 手动设置createDept字段: {}", deptId);
// } else {
// log.info("⚠️ createDept字段状态: {}", add.getCreateDept());
// }
// } catch (Exception e) {
// log.warn("⚠️ 获取登录用户信息失败: {}", e.getMessage());
// }
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
log.info("✅ 新增成功,ID: {}, createDept: {}", add.getId(), add.getCreateDept());
}
return flag;
}
/**
* 修改学生考核指标体系类型
*/
@Override
public Boolean updateByBo(XskhAssessmentIndicatorTypeBo bo) {
XskhAssessmentIndicatorType update = MapstructUtils.convert(bo, XskhAssessmentIndicatorType.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(XskhAssessmentIndicatorType entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除学生考核指标体系类型
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 检查指标类型是否被指标体系使用
*/
@Override
public Boolean checkUsedByIndicator(Long typeId) {
// 这里需要查询指标体系表,检查是否有使用该类型
// 由于指标体系表还未创建,暂时返回false
// TODO: 当指标体系表创建后,需要实现此逻辑
return false;
}
}
@@ -0,0 +1,181 @@
package org.dromara.xskh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.xskh.domain.bo.XskhAssessmentPlanBo;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanVo;
import org.dromara.xskh.domain.XskhAssessmentPlan;
import org.dromara.xskh.domain.XskhAssessmentPlanIndicator;
import org.dromara.xskh.mapper.XskhAssessmentPlanMapper;
import org.dromara.xskh.mapper.XskhAssessmentPlanIndicatorMapper;
import org.dromara.xskh.service.IXskhAssessmentPlanService;
import org.dromara.xskh.domain.vo.XskhAssessmentPlanIndicatorVo;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.math.BigDecimal;
/**
* 学生考核方案Service业务层处理
*
* @author ruoyi
* @date 2025-01-03
*/
@RequiredArgsConstructor
@Service
public class XskhAssessmentPlanServiceImpl implements IXskhAssessmentPlanService {
private final XskhAssessmentPlanMapper baseMapper;
private final XskhAssessmentPlanIndicatorMapper planIndicatorMapper;
/**
* 查询学生考核方案
*/
@Override
public XskhAssessmentPlanVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询学生考核方案列表
*/
@Override
public TableDataInfo<XskhAssessmentPlanVo> queryPageList(XskhAssessmentPlanBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentPlan> lqw = buildQueryWrapper(bo);
Page<XskhAssessmentPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询学生考核方案列表
*/
@Override
public List<XskhAssessmentPlanVo> queryList(XskhAssessmentPlanBo bo) {
LambdaQueryWrapper<XskhAssessmentPlan> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XskhAssessmentPlan> buildQueryWrapper(XskhAssessmentPlanBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XskhAssessmentPlan> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getPlanCode()), XskhAssessmentPlan::getPlanCode, bo.getPlanCode());
lqw.like(StringUtils.isNotBlank(bo.getPlanName()), XskhAssessmentPlan::getPlanName, bo.getPlanName());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhAssessmentPlan::getStatus, bo.getStatus());
return lqw;
}
/**
* 新增学生考核方案
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(XskhAssessmentPlanBo bo) {
XskhAssessmentPlan add = MapstructUtils.convert(bo, XskhAssessmentPlan.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
// 保存关联的指标信息
savePlanIndicators(bo);
}
return flag;
}
/**
* 修改学生考核方案
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(XskhAssessmentPlanBo bo) {
XskhAssessmentPlan update = MapstructUtils.convert(bo, XskhAssessmentPlan.class);
validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0;
if (flag) {
// 更新关联的指标信息(先删除再插入)
updatePlanIndicators(bo);
}
return flag;
}
/**
* 保存前校验数据
*/
private void validEntityBeforeSave(XskhAssessmentPlan entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除学生考核方案
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 获取方案详情(包含关联的指标信息)
*/
@Override
public XskhAssessmentPlanVo getPlanWithRelations(Long id) {
XskhAssessmentPlanVo planVo = baseMapper.selectVoById(id);
if (planVo != null) {
// 查询关联的指标详细信息
List<XskhAssessmentPlanIndicatorVo> indicatorList = baseMapper.selectPlanIndicatorsWithDetail(id);
planVo.setIndicatorList(indicatorList);
}
return planVo;
}
/**
* 保存方案关联的指标信息
*/
private void savePlanIndicators(XskhAssessmentPlanBo bo) {
// 优先使用indicatorList,如果没有则使用indicatorIds
if (bo.getIndicatorList() != null && !bo.getIndicatorList().isEmpty()) {
for (XskhAssessmentPlanIndicatorVo indicatorVo : bo.getIndicatorList()) {
XskhAssessmentPlanIndicator planIndicator = new XskhAssessmentPlanIndicator();
planIndicator.setPlanId(bo.getId());
planIndicator.setIndicatorId(indicatorVo.getIndicatorId());
planIndicator
.setMaxScore(indicatorVo.getMaxScore() != null ? indicatorVo.getMaxScore() : BigDecimal.ZERO);
planIndicator.setSortOrder(indicatorVo.getSortOrder() != null ? indicatorVo.getSortOrder() : 1);
planIndicatorMapper.insert(planIndicator);
}
} else if (bo.getIndicatorIds() != null && !bo.getIndicatorIds().isEmpty()) {
// 兼容原有的indicatorIds方式
for (int i = 0; i < bo.getIndicatorIds().size(); i++) {
Long indicatorId = bo.getIndicatorIds().get(i);
XskhAssessmentPlanIndicator planIndicator = new XskhAssessmentPlanIndicator();
planIndicator.setPlanId(bo.getId());
planIndicator.setIndicatorId(indicatorId);
planIndicator.setSortOrder(i + 1);
planIndicatorMapper.insert(planIndicator);
}
}
}
/**
* 更新方案关联的指标信息
*/
private void updatePlanIndicators(XskhAssessmentPlanBo bo) {
// 先删除原有的关联关系
LambdaQueryWrapper<XskhAssessmentPlanIndicator> lqw = Wrappers.lambdaQuery();
lqw.eq(XskhAssessmentPlanIndicator::getPlanId, bo.getId());
planIndicatorMapper.delete(lqw);
// 重新插入新的关联关系
savePlanIndicators(bo);
}
}
@@ -0,0 +1,225 @@
package org.dromara.xskh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleBo;
import org.dromara.xskh.domain.bo.XskhAssessmentScheduleQueryBo;
import org.dromara.xskh.domain.vo.XskhAssessmentScheduleVo;
import org.dromara.xskh.domain.XskhAssessmentSchedule;
import org.dromara.xskh.mapper.XskhAssessmentScheduleMapper;
import org.dromara.xskh.service.IXskhAssessmentScheduleService;
import org.dromara.xskh.domain.XskhAssessmentPlan;
import org.dromara.xskh.mapper.XskhAssessmentPlanMapper;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 学生考核计划Service业务层处理
*
* @author ruoyi
* @date 2025-01-03
*/
@RequiredArgsConstructor
@Service
public class XskhAssessmentScheduleServiceImpl implements IXskhAssessmentScheduleService {
private final XskhAssessmentScheduleMapper baseMapper;
private final XskhAssessmentPlanMapper assessmentPlanMapper;
/**
* 查询学生考核计划
*/
@Override
public XskhAssessmentScheduleVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询学生考核计划列表
*/
@Override
public TableDataInfo<XskhAssessmentScheduleVo> queryPageList(XskhAssessmentScheduleBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentSchedule> lqw = buildQueryWrapper(bo);
Page<XskhAssessmentScheduleVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 根据状态列表查询学生考核计划列表
*/
@Override
public TableDataInfo<XskhAssessmentScheduleVo> queryPageListByStatusList(XskhAssessmentScheduleQueryBo bo,
PageQuery pageQuery) {
LambdaQueryWrapper<XskhAssessmentSchedule> lqw = buildQueryWrapperByStatusList(bo);
Page<XskhAssessmentScheduleVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询学生考核计划列表
*/
@Override
public List<XskhAssessmentScheduleVo> queryList(XskhAssessmentScheduleBo bo) {
LambdaQueryWrapper<XskhAssessmentSchedule> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<XskhAssessmentSchedule> buildQueryWrapper(XskhAssessmentScheduleBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XskhAssessmentSchedule> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getScheduleName()), XskhAssessmentSchedule::getScheduleName,
bo.getScheduleName());
lqw.like(StringUtils.isNotBlank(bo.getAcademicYear()), XskhAssessmentSchedule::getAcademicYear,
bo.getAcademicYear());
lqw.eq(StringUtils.isNotBlank(bo.getSemester()), XskhAssessmentSchedule::getSemester, bo.getSemester());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhAssessmentSchedule::getStatus, bo.getStatus());
return lqw;
}
private LambdaQueryWrapper<XskhAssessmentSchedule> buildQueryWrapperByStatusList(XskhAssessmentScheduleQueryBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<XskhAssessmentSchedule> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getScheduleName()), XskhAssessmentSchedule::getScheduleName,
bo.getScheduleName());
lqw.like(StringUtils.isNotBlank(bo.getAcademicYear()), XskhAssessmentSchedule::getAcademicYear,
bo.getAcademicYear());
lqw.eq(StringUtils.isNotBlank(bo.getSemester()), XskhAssessmentSchedule::getSemester, bo.getSemester());
// 支持状态列表查询
if (bo.getStatusList() != null && !bo.getStatusList().isEmpty()) {
lqw.in(XskhAssessmentSchedule::getStatus, bo.getStatusList());
}
return lqw;
}
/**
* 新增学生考核计划
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(XskhAssessmentScheduleBo bo) {
XskhAssessmentSchedule add = MapstructUtils.convert(bo, XskhAssessmentSchedule.class);
validEntityBeforeSave(add);
// 如果planName为空,根据planId自动查询并填充
if (StringUtils.isBlank(add.getPlanName()) && add.getPlanId() != null) {
XskhAssessmentPlan plan = assessmentPlanMapper.selectById(add.getPlanId());
if (plan != null) {
add.setPlanName(plan.getPlanName());
}
}
// 新增时默认状态为未开始
add.setStatus("1");
boolean flag = baseMapper.insert(add) > 0;
return flag;
}
/**
* 修改学生考核计划
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(XskhAssessmentScheduleBo bo) {
XskhAssessmentSchedule update = MapstructUtils.convert(bo, XskhAssessmentSchedule.class);
validEntityBeforeSave(update);
// 如果planName为空,根据planId自动查询并填充
if (StringUtils.isBlank(update.getPlanName()) && update.getPlanId() != null) {
XskhAssessmentPlan plan = assessmentPlanMapper.selectById(update.getPlanId());
if (plan != null) {
update.setPlanName(plan.getPlanName());
}
}
boolean flag = baseMapper.updateById(update) > 0;
return flag;
}
/**
* 保存前校验数据
*/
private void validEntityBeforeSave(XskhAssessmentSchedule entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除学生考核计划
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// 校验是否可以删除:只有未开始状态的计划可以删除
for (Long id : ids) {
XskhAssessmentSchedule schedule = baseMapper.selectById(id);
if (schedule != null && !"1".equals(schedule.getStatus())) {
throw new RuntimeException("只有未开始状态的考核计划可以删除");
}
}
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 上线考核计划
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean onlineSchedule(Long id) {
XskhAssessmentSchedule schedule = baseMapper.selectById(id);
if (schedule == null) {
throw new RuntimeException("考核计划不存在");
}
if (!"1".equals(schedule.getStatus())) {
throw new RuntimeException("只有未开始状态的考核计划可以上线");
}
schedule.setStatus("2"); // 设置为进行中
return baseMapper.updateById(schedule) > 0;
}
/**
* 下线考核计划
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean offlineSchedule(Long id) {
XskhAssessmentSchedule schedule = baseMapper.selectById(id);
if (schedule == null) {
throw new RuntimeException("考核计划不存在");
}
if (!"2".equals(schedule.getStatus())) {
throw new RuntimeException("只有进行中状态的考核计划可以下线");
}
schedule.setStatus("1"); // 设置为未开始
return baseMapper.updateById(schedule) > 0;
}
/**
* 完成考核计划
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean completeSchedule(Long id) {
XskhAssessmentSchedule schedule = baseMapper.selectById(id);
if (schedule == null) {
throw new RuntimeException("考核计划不存在");
}
if ("3".equals(schedule.getStatus())) {
throw new RuntimeException("考核计划已经是已结束状态");
}
schedule.setStatus("3"); // 设置为已结束
return baseMapper.updateById(schedule) > 0;
}
}
@@ -21,6 +21,8 @@ import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* 学生违纪处分记录Service业务层处理
@@ -212,4 +214,36 @@ public class XskhDisciplineRecordServiceImpl implements IXskhDisciplineRecordSer
record.setStatus(status);
return baseMapper.updateById(record) > 0;
}
/**
* 获取指标关联的违纪处分类型和奖励类型
*/
@Override
public Map<String, String> getIndicatorTypes(Long indicatorId) {
return baseMapper.selectIndicatorTypes(indicatorId);
}
/**
* 获取学生在指定时间范围内的违纪处分记录
*/
@Override
public List<XskhDisciplineRecordVo> getStudentDisciplineRecords(Long studentId, String disciplineTypeIds,
String startTime, String endTime) {
if (StringUtils.isBlank(disciplineTypeIds)) {
return List.of();
}
// 将逗号分隔的字符串转换为List<Long>
List<Long> typeIds = Arrays.stream(disciplineTypeIds.split(","))
.map(String::trim)
.filter(StringUtils::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
if (typeIds.isEmpty()) {
return List.of();
}
return baseMapper.selectStudentDisciplineRecords(studentId, typeIds, startTime, endTime);
}
}
@@ -21,6 +21,8 @@ import org.dromara.xskh.service.IXskhRewardRecordService;
import java.util.Collection;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.Map;
/**
@@ -223,4 +225,28 @@ public class XskhRewardRecordServiceImpl implements IXskhRewardRecordService {
Page<XskhRewardRecordVo> result = baseMapper.selectClassTeacherVoPage(pageQuery.build(), bo, currentUserId);
return TableDataInfo.build(result);
}
/**
* 获取学生在指定时间范围内的奖励记录
*/
@Override
public List<XskhRewardRecordVo> getStudentRewardRecords(Long studentId, String rewardTypeIds, String startTime,
String endTime) {
if (StringUtils.isBlank(rewardTypeIds)) {
return List.of();
}
// 将逗号分隔的字符串转换为List<Long>
List<Long> typeIds = Arrays.stream(rewardTypeIds.split(","))
.map(String::trim)
.filter(StringUtils::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
if (typeIds.isEmpty()) {
return List.of();
}
return baseMapper.selectStudentRewardRecords(studentId, typeIds, startTime, endTime);
}
}
@@ -22,10 +22,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="disciplineContent" column="discipline_content" />
<result property="scoreDeduction" column="score_deduction" />
<result property="status" column="status" />
<result property="approvalStatus" column="approval_status" />
<result property="approvalBy" column="approval_by" />
<result property="approvalTime" column="approval_time" />
<result property="approvalRemark" column="approval_remark" />
<result property="attachmentOssIds" column="attachment_oss_ids" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
@@ -49,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectXskhDisciplineRecordVo">
select id, student_id, student_no, student_name, college_id, college_name, major_id, major_name, class_id, class_name, discipline_type_id, discipline_type_name, discipline_date, discipline_reason, discipline_content, score_deduction, status, approval_status, approval_by, approval_time, approval_remark, attachment_oss_ids, create_by, create_time, create_dept, update_by, update_time, deleted, tenant_id from xskh_discipline_record
select id, student_id, student_no, student_name, college_id, college_name, major_id, major_name, class_id, class_name, discipline_type_id, discipline_type_name, discipline_date, discipline_reason, discipline_content, score_deduction, status, attachment_oss_ids, create_by, create_time, create_dept, update_by, update_time, deleted, tenant_id from xskh_discipline_record
</sql>
<select id="selectStudentOptions" parameterType="String" resultMap="StudentOptionResult">
@@ -71,8 +67,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select dr.id, dr.student_id, dr.student_no, dr.student_name, dr.college_id, dr.college_name,
dr.major_id, dr.major_name, dr.class_id, dr.class_name, dr.discipline_type_id,
dr.discipline_type_name, dr.discipline_date, dr.discipline_reason, dr.discipline_content,
dr.score_deduction, dr.status, dr.approval_status, dr.approval_by, dr.approval_time,
dr.approval_remark, dr.attachment_oss_ids, dr.create_by, dr.create_time, dr.create_dept,
dr.score_deduction, dr.status, dr.attachment_oss_ids, dr.create_by, dr.create_time, dr.create_dept,
dr.update_by, dr.update_time, dr.deleted, dr.tenant_id
from xskh_discipline_record dr
where dr.deleted = 0
@@ -98,4 +93,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
order by dr.create_time desc
</select>
<!-- 获取指标关联的违纪处分类型和奖励类型 -->
<select id="selectIndicatorTypes" parameterType="Long" resultType="java.util.Map">
select
discipline_type_ids,
reward_type_ids
from xskh_assessment_indicator_discipline_type
where indicator_id = #{indicatorId}
and deleted = 0
limit 1
</select>
<!-- 获取学生在指定时间范围内的违纪处分记录 -->
<select id="selectStudentDisciplineRecords" resultType="XskhDisciplineRecordVo">
select
id, student_id, student_no, student_name, college_id, college_name,
major_id, major_name, class_id, class_name, discipline_type_id,
discipline_type_name, discipline_date, discipline_reason, discipline_content,
score_deduction, status, attachment_oss_ids, create_by, create_time, create_dept,
update_by, update_time, deleted, tenant_id
from xskh_discipline_record
where deleted = 0
and status = '1'
and student_id = #{studentId}
and discipline_type_id in
<foreach collection="disciplineTypeIds" item="typeId" open="(" separator="," close=")">
#{typeId}
</foreach>
and discipline_date between #{startTime} and #{endTime}
order by create_time desc
</select>
</mapper>
@@ -0,0 +1,132 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentApplicationApprovalMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentApplicationApproval" id="XskhAssessmentApplicationApprovalResult">
<result property="id" column="id"/>
<result property="scheduleId" column="schedule_id"/>
<result property="studentId" column="student_id"/>
<result property="studentNo" column="student_no"/>
<result property="studentName" column="student_name"/>
<result property="collegeId" column="college_id"/>
<result property="collegeName" column="college_name"/>
<result property="majorId" column="major_id"/>
<result property="majorName" column="major_name"/>
<result property="classId" column="class_id"/>
<result property="className" column="class_name"/>
<result property="totalScore" column="total_score"/>
<result property="selfScore" column="self_score"/>
<result property="selfRemark" column="self_remark"/>
<result property="teacherScore" column="teacher_score"/>
<result property="status" column="status"/>
<result property="submitTime" column="submit_time"/>
<result property="teacherApprovalBy" column="teacher_approval_by"/>
<result property="teacherApprovalTime" column="teacher_approval_time"/>
<result property="teacherApprovalRemark" column="teacher_approval_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentApplicationApprovalVo" id="XskhAssessmentApplicationApprovalResultVo">
<result property="id" column="id"/>
<result property="scheduleId" column="schedule_id"/>
<result property="scheduleName" column="schedule_name"/>
<result property="studentId" column="student_id"/>
<result property="studentNo" column="student_no"/>
<result property="studentName" column="student_name"/>
<result property="collegeId" column="college_id"/>
<result property="collegeName" column="college_name"/>
<result property="majorId" column="major_id"/>
<result property="majorName" column="major_name"/>
<result property="classId" column="class_id"/>
<result property="className" column="class_name"/>
<result property="totalScore" column="total_score"/>
<result property="selfScore" column="self_score"/>
<result property="selfRemark" column="self_remark"/>
<result property="teacherScore" column="teacher_score"/>
<result property="status" column="status"/>
<result property="statusName" column="status_name"/>
<result property="submitTime" column="submit_time"/>
<result property="teacherApprovalBy" column="teacher_approval_by"/>
<result property="teacherApprovalByName" column="teacher_approval_by_name"/>
<result property="teacherApprovalTime" column="teacher_approval_time"/>
<result property="teacherApprovalRemark" column="teacher_approval_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<!-- 根据考核方案ID查询关联的指标数据 -->
<select id="selectIndicatorsByPlanId" parameterType="Long" resultType="java.util.Map">
SELECT
i.id as indicatorId,
i.indicator_code as indicatorCode,
i.indicator_name as indicatorName,
i.description,
i.indicator_type_name as indicatorTypeName,
'1' as indicatorType,
pi.max_score as maxScore,
pi.weight,
pi.sort_order as sortOrder
FROM xskh_assessment_plan_indicator pi
INNER JOIN xskh_assessment_indicator i ON pi.indicator_id = i.id
WHERE pi.plan_id = #{planId}
AND pi.deleted = 0
AND i.deleted = 0
ORDER BY pi.sort_order ASC, i.sort_order ASC
</select>
<!-- 根据申请ID查询完整的自评得分信息(包含指标表关联数据) -->
<select id="selectSelfScoresWithIndicatorInfo" parameterType="Long" resultMap="XskhAssessmentSelfScoreWithIndicatorResult">
SELECT
ss.id,
ss.application_id as applicationId,
ss.indicator_id as indicatorId,
ss.indicator_name as indicatorName,
i.indicator_code as indicatorCode,
i.description,
ss.indicator_type as indicatorType,
ss.max_score as maxScore,
ss.self_score as selfScore,
ss.self_remark as selfRemark,
ss.teacher_score as teacherScore,
ss.teacher_remark as teacherRemark,
ss.create_by as createBy,
ss.create_time as createTime,
ss.update_by as updateBy,
ss.update_time as updateTime
FROM xskh_assessment_self_score ss
LEFT JOIN xskh_assessment_indicator i ON ss.indicator_id = i.id
WHERE ss.application_id = #{applicationId}
AND ss.deleted = 0
ORDER BY ss.id ASC
</select>
<!-- 自评得分与指标信息关联的ResultMap -->
<resultMap id="XskhAssessmentSelfScoreWithIndicatorResult" type="org.dromara.xskh.domain.vo.XskhAssessmentSelfScoreVo">
<result property="id" column="id"/>
<result property="applicationId" column="applicationId"/>
<result property="indicatorId" column="indicatorId"/>
<result property="indicatorName" column="indicatorName"/>
<result property="indicatorCode" column="indicatorCode"/>
<result property="description" column="description"/>
<result property="indicatorType" column="indicatorType"/>
<result property="maxScore" column="maxScore"/>
<result property="selfScore" column="selfScore"/>
<result property="selfRemark" column="selfRemark"/>
<result property="teacherScore" column="teacherScore"/>
<result property="teacherRemark" column="teacherRemark"/>
<result property="createBy" column="createBy"/>
<result property="createTime" column="createTime"/>
<result property="updateBy" column="updateBy"/>
<result property="updateTime" column="updateTime"/>
</resultMap>
</mapper>
@@ -0,0 +1,183 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentApprovalMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentApplicationApproval" id="XskhAssessmentApplicationApprovalResult">
<result property="id" column="id"/>
<result property="scheduleId" column="schedule_id"/>
<result property="studentId" column="student_id"/>
<result property="studentNo" column="student_no"/>
<result property="studentName" column="student_name"/>
<result property="collegeId" column="college_id"/>
<result property="collegeName" column="college_name"/>
<result property="majorId" column="major_id"/>
<result property="majorName" column="major_name"/>
<result property="classId" column="class_id"/>
<result property="className" column="class_name"/>
<result property="totalScore" column="total_score"/>
<result property="selfScore" column="self_score"/>
<result property="teacherScore" column="teacher_score"/>
<result property="status" column="status"/>
<result property="submitTime" column="submit_time"/>
<result property="teacherApprovalBy" column="teacher_approval_by"/>
<result property="teacherApprovalTime" column="teacher_approval_time"/>
<result property="teacherApprovalRemark" column="teacher_approval_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentApprovalVo" id="XskhAssessmentApprovalResultVo">
<result property="id" column="id"/>
<result property="scheduleId" column="schedule_id"/>
<result property="scheduleName" column="schedule_name"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="dataStartTime" column="data_start_time"/>
<result property="dataEndTime" column="data_end_time"/>
<result property="studentId" column="student_id"/>
<result property="studentNo" column="student_no"/>
<result property="studentName" column="student_name"/>
<result property="collegeId" column="college_id"/>
<result property="collegeName" column="college_name"/>
<result property="majorId" column="major_id"/>
<result property="majorName" column="major_name"/>
<result property="classId" column="class_id"/>
<result property="className" column="class_name"/>
<result property="totalScore" column="total_score"/>
<result property="selfScore" column="self_score"/>
<result property="teacherScore" column="teacher_score"/>
<result property="status" column="status"/>
<result property="statusName" column="status_name"/>
<result property="submitTime" column="submit_time"/>
<result property="teacherApprovalBy" column="teacher_approval_by"/>
<result property="teacherApprovalByName" column="teacher_approval_by_name"/>
<result property="teacherApprovalTime" column="teacher_approval_time"/>
<result property="teacherApprovalRemark" column="teacher_approval_remark"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<!-- 查询班主任班级下的考核申请列表 -->
<select id="selectTeacherClassApplications" resultMap="XskhAssessmentApprovalResultVo">
SELECT
a.id,
a.schedule_id,
s.schedule_name,
s.start_time,
s.end_time,
s.data_start_time,
s.data_end_time,
a.student_id,
a.student_no,
a.student_name,
a.college_id,
a.college_name,
a.major_id,
a.major_name,
a.class_id,
a.class_name,
a.total_score,
a.self_score,
a.teacher_score,
a.status,
CASE a.status
WHEN '1' THEN '草稿'
WHEN '2' THEN '已提交'
WHEN '3' THEN '班主任审核'
WHEN '6' THEN '已完成'
ELSE '未知'
END as status_name,
a.submit_time,
a.teacher_approval_by,
u.nick_name as teacher_approval_by_name,
a.teacher_approval_time,
a.teacher_approval_remark,
a.create_by,
a.create_time,
a.update_by,
a.update_time
FROM xskh_assessment_application_approval a
LEFT JOIN xskh_assessment_schedule s ON a.schedule_id = s.id
LEFT JOIN sys_user u ON a.teacher_approval_by = u.user_id
WHERE a.deleted = 0
AND a.class_id IN (
SELECT id
FROM xg_class_msg
WHERE class_teacher_id = #{teacherId}
AND deleted = 0
AND class_status = '1'
)
<if test="scheduleId != null">
AND a.schedule_id = #{scheduleId}
</if>
<if test="studentNo != null and studentNo != ''">
AND a.student_no LIKE CONCAT('%', #{studentNo}, '%')
</if>
<if test="studentName != null and studentName != ''">
AND a.student_name LIKE CONCAT('%', #{studentName}, '%')
</if>
<if test="status != null and status != ''">
AND a.status = #{status}
</if>
AND a.status IN ('2', '3', '6')
ORDER BY a.create_time DESC
</select>
<!-- 根据ID查询考核申请详细信息(包含考核计划信息) -->
<select id="selectApprovalDetailById" resultMap="XskhAssessmentApprovalResultVo">
SELECT
a.id,
a.schedule_id,
s.schedule_name,
s.start_time,
s.end_time,
s.data_start_time,
s.data_end_time,
a.student_id,
a.student_no,
a.student_name,
a.college_id,
a.college_name,
a.major_id,
a.major_name,
a.class_id,
a.class_name,
a.total_score,
a.self_score,
a.teacher_score,
a.status,
CASE a.status
WHEN '1' THEN '草稿'
WHEN '2' THEN '已提交'
WHEN '3' THEN '班主任审核'
WHEN '6' THEN '已完成'
ELSE '未知'
END as status_name,
a.submit_time,
a.teacher_approval_by,
u.nick_name as teacher_approval_by_name,
a.teacher_approval_time,
a.teacher_approval_remark,
a.self_remark as selfRemark,
a.create_by,
a.create_time,
a.update_by,
a.update_time
FROM xskh_assessment_application_approval a
LEFT JOIN xskh_assessment_schedule s ON a.schedule_id = s.id AND s.tenant_id = '000000'
LEFT JOIN sys_user u ON a.teacher_approval_by = u.user_id AND u.tenant_id = '000000'
WHERE a.id = #{id}
AND a.deleted = 0
AND a.tenant_id = '000000'
</select>
</mapper>
@@ -0,0 +1,47 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentBonusApprovalMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentBonusApproval" id="XskhAssessmentBonusApprovalResult">
<result property="id" column="id"/>
<result property="applicationId" column="application_id"/>
<result property="bonusName" column="bonus_name"/>
<result property="bonusContent" column="bonus_content"/>
<result property="bonusScore" column="bonus_score"/>
<result property="evidenceFile" column="evidence_file"/>
<result property="status" column="status"/>
<result property="approvalScore" column="approval_score"/>
<result property="approvalBy" column="approval_by"/>
<result property="approvalTime" column="approval_time"/>
<result property="approvalRemark" column="approval_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentBonusApprovalVo" id="XskhAssessmentBonusApprovalResultVo">
<result property="id" column="id"/>
<result property="applicationId" column="application_id"/>
<result property="bonusName" column="bonus_name"/>
<result property="bonusContent" column="bonus_content"/>
<result property="bonusScore" column="bonus_score"/>
<result property="evidenceFile" column="evidence_file"/>
<result property="status" column="status"/>
<result property="statusName" column="status_name"/>
<result property="approvalScore" column="approval_score"/>
<result property="approvalBy" column="approval_by"/>
<result property="approvalByName" column="approval_by_name"/>
<result property="approvalTime" column="approval_time"/>
<result property="approvalRemark" column="approval_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
@@ -0,0 +1,31 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentIndicatorDisciplineTypeMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentIndicatorDisciplineType" id="XskhAssessmentIndicatorDisciplineTypeResult">
<result property="id" column="id"/>
<result property="indicatorId" column="indicator_id"/>
<result property="disciplineTypeIds" column="discipline_type_ids"/>
<result property="rewardTypeIds" column="reward_type_ids"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentIndicatorDisciplineTypeVo" id="XskhAssessmentIndicatorDisciplineTypeResultVo">
<result property="id" column="id"/>
<result property="indicatorId" column="indicator_id"/>
<result property="disciplineTypeIds" column="discipline_type_ids"/>
<result property="rewardTypeIds" column="reward_type_ids"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
@@ -0,0 +1,45 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentIndicatorMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentIndicator" id="XskhAssessmentIndicatorResult">
<result property="id" column="id"/>
<result property="indicatorCode" column="indicator_code"/>
<result property="indicatorName" column="indicator_name"/>
<result property="indicatorTypeId" column="indicator_type_id"/>
<result property="indicatorTypeName" column="indicator_type_name"/>
<result property="description" column="description"/>
<result property="maxScore" column="max_score"/>
<result property="weight" column="weight"/>
<result property="status" column="status"/>
<result property="sortOrder" column="sort_order"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<!-- <result property="createDept" column="create_dept"/> -->
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentIndicatorVo" id="XskhAssessmentIndicatorResultVo">
<result property="id" column="id"/>
<result property="indicatorCode" column="indicator_code"/>
<result property="indicatorName" column="indicator_name"/>
<result property="indicatorTypeId" column="indicator_type_id"/>
<result property="indicatorTypeName" column="indicator_type_name"/>
<result property="description" column="description"/>
<result property="maxScore" column="max_score"/>
<result property="weight" column="weight"/>
<result property="status" column="status"/>
<result property="sortOrder" column="sort_order"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<!-- <result property="createDept" column="create_dept"/> -->
</resultMap>
</mapper>
@@ -0,0 +1,37 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentIndicatorTypeMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentIndicatorType" id="XskhAssessmentIndicatorTypeResult">
<result property="id" column="id"/>
<result property="typeCode" column="type_code"/>
<result property="typeName" column="type_name"/>
<result property="description" column="description"/>
<result property="status" column="status"/>
<result property="sortOrder" column="sort_order"/>
<result property="createDept" column="create_dept"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentIndicatorTypeVo" id="XskhAssessmentIndicatorTypeResultVo">
<result property="id" column="id"/>
<result property="typeCode" column="type_code"/>
<result property="typeName" column="type_name"/>
<result property="description" column="description"/>
<result property="status" column="status"/>
<result property="sortOrder" column="sort_order"/>
<result property="createDept" column="create_dept"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
@@ -0,0 +1,35 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentPlanIndicatorMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentPlanIndicator" id="XskhAssessmentPlanIndicatorResult">
<result property="id" column="id"/>
<result property="planId" column="plan_id"/>
<result property="indicatorId" column="indicator_id"/>
<result property="maxScore" column="max_score"/>
<result property="weight" column="weight"/>
<result property="sortOrder" column="sort_order"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentPlanIndicatorVo" id="XskhAssessmentPlanIndicatorResultVo">
<result property="id" column="id"/>
<result property="planId" column="plan_id"/>
<result property="indicatorId" column="indicator_id"/>
<result property="maxScore" column="max_score"/>
<result property="weight" column="weight"/>
<result property="sortOrder" column="sort_order"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
@@ -0,0 +1,57 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentPlanMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentPlan" id="XskhAssessmentPlanResult">
<result property="id" column="id"/>
<result property="planCode" column="plan_code"/>
<result property="planName" column="plan_name"/>
<result property="description" column="description"/>
<result property="status" column="status"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentPlanVo" id="XskhAssessmentPlanResultVo">
<result property="id" column="id"/>
<result property="planCode" column="plan_code"/>
<result property="planName" column="plan_name"/>
<result property="description" column="description"/>
<result property="status" column="status"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<!-- 查询方案关联的指标详细信息 -->
<select id="selectPlanIndicatorsWithDetail" parameterType="Long" resultType="org.dromara.xskh.domain.vo.XskhAssessmentPlanIndicatorVo">
SELECT
pi.id,
pi.plan_id as planId,
pi.indicator_id as indicatorId,
pi.max_score as maxScore,
pi.weight,
pi.sort_order as sortOrder,
pi.create_by as createBy,
pi.create_time as createTime,
pi.update_by as updateBy,
pi.update_time as updateTime,
i.indicator_name as indicatorName,
i.indicator_code as indicatorCode,
i.description as description,
i.max_score as indicatorMaxScore
FROM xskh_assessment_plan_indicator pi
LEFT JOIN xskh_assessment_indicator i ON pi.indicator_id = i.id
WHERE pi.plan_id = #{planId}
AND pi.deleted = 0
ORDER BY pi.sort_order ASC
</select>
</mapper>
@@ -0,0 +1,49 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentScheduleMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentSchedule" id="XskhAssessmentScheduleResult">
<result property="id" column="id"/>
<result property="scheduleName" column="schedule_name"/>
<result property="planId" column="plan_id"/>
<result property="planName" column="plan_name"/>
<result property="academicYear" column="academic_year"/>
<result property="semester" column="semester"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="dataStartTime" column="data_start_time"/>
<result property="dataEndTime" column="data_end_time"/>
<result property="status" column="status"/>
<result property="description" column="description"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentScheduleVo" id="XskhAssessmentScheduleResultVo">
<result property="id" column="id"/>
<result property="scheduleName" column="schedule_name"/>
<result property="planId" column="plan_id"/>
<result property="planName" column="plan_name"/>
<result property="academicYear" column="academic_year"/>
<result property="semester" column="semester"/>
<result property="semesterName" column="semester_name"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="dataStartTime" column="data_start_time"/>
<result property="dataEndTime" column="data_end_time"/>
<result property="status" column="status"/>
<result property="statusName" column="status_name"/>
<result property="description" column="description"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
@@ -0,0 +1,72 @@
<?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="org.dromara.xskh.mapper.XskhAssessmentSelfScoreMapper">
<resultMap type="org.dromara.xskh.domain.XskhAssessmentSelfScore" id="XskhAssessmentSelfScoreResult">
<result property="id" column="id"/>
<result property="applicationId" column="application_id"/>
<result property="indicatorId" column="indicator_id"/>
<result property="indicatorName" column="indicator_name"/>
<result property="indicatorType" column="indicator_type"/>
<result property="maxScore" column="max_score"/>
<result property="selfScore" column="self_score"/>
<result property="selfRemark" column="self_remark"/>
<result property="teacherScore" column="teacher_score"/>
<result property="teacherRemark" column="teacher_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<resultMap type="org.dromara.xskh.domain.vo.XskhAssessmentSelfScoreVo" id="XskhAssessmentSelfScoreResultVo">
<result property="id" column="id"/>
<result property="applicationId" column="application_id"/>
<result property="indicatorId" column="indicator_id"/>
<result property="indicatorName" column="indicator_name"/>
<result property="indicatorCode" column="indicator_code"/>
<result property="description" column="description"/>
<result property="indicatorType" column="indicator_type"/>
<result property="maxScore" column="max_score"/>
<result property="selfScore" column="self_score"/>
<result property="selfRemark" column="self_remark"/>
<result property="teacherScore" column="teacher_score"/>
<result property="teacherRemark" column="teacher_remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<!-- 查询自评得分列表(包含指标详细信息) -->
<select id="selectSelfScoreWithIndicatorDetail" resultMap="XskhAssessmentSelfScoreResultVo">
SELECT
s.id,
s.application_id,
s.indicator_id,
s.indicator_name,
i.indicator_code,
i.description,
s.indicator_type,
s.max_score,
s.self_score,
s.self_remark,
s.teacher_score,
s.teacher_remark,
s.create_by,
s.create_time,
s.update_by,
s.update_time
FROM xskh_assessment_self_score s
LEFT JOIN xskh_assessment_indicator i ON s.indicator_id = i.id AND i.tenant_id = '000000'
WHERE s.application_id = #{applicationId}
AND s.deleted = 0
AND s.tenant_id = '000000'
ORDER BY s.create_time ASC
</select>
</mapper>
@@ -131,4 +131,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
order by rr.create_time desc
</select>
<!-- 获取学生在指定时间范围内的奖励记录 -->
<select id="selectStudentRewardRecords" resultType="XskhRewardRecordVo">
select
id, student_id, student_no, student_name, college_id, college_name,
major_id, major_name, class_id, class_name, reward_type_id,
reward_type_name, reward_date, reward_content, score_addition,
attachment_oss_ids, status, create_by, create_time, create_dept,
update_by, update_time, deleted, tenant_id
from xskh_reward_record
where deleted = 0
and status = '1'
and student_id = #{studentId}
and reward_type_id in
<foreach collection="rewardTypeIds" item="typeId" open="(" separator="," close=")">
#{typeId}
</foreach>
and reward_date between #{startTime} and #{endTime}
order by create_time desc
</select>
</mapper>
@@ -144,16 +144,19 @@ public class ZsjyGraduateInfoBo extends BaseEntity {
/**
* 邮箱地址
*/
@Size(max = 100, message = "邮箱地址长度不能超过100个字符", groups = { AddGroup.class, EditGroup.class })
private String email;
/**
* QQ号码
*/
@Size(max = 20, message = "QQ号码长度不能超过20个字符", groups = { AddGroup.class, EditGroup.class })
private String qqNumber;
/**
* 微信号码
*/
@Size(max = 30, message = "微信号码长度不能超过30个字符", groups = { AddGroup.class, EditGroup.class })
private String wechatNumber;
/**
@@ -174,11 +177,14 @@ public class ZsjyGraduateInfoBo extends BaseEntity {
/**
* 详细地址
*/
@Size(max = 200, message = "详细地址长度不能超过200个字符", groups = { AddGroup.class, EditGroup.class })
private String detailAddress;
/**
* 邮政编码
*/
@Size(max = 10, message = "邮政编码长度不能超过10个字符", groups = { AddGroup.class, EditGroup.class })
@Pattern(regexp = "^\\d{6}$", message = "邮政编码格式不正确,应为6位数字", groups = { AddGroup.class, EditGroup.class })
private String postalCode;
/**
@@ -190,6 +196,7 @@ public class ZsjyGraduateInfoBo extends BaseEntity {
/**
* 就业单位名称
*/
@Size(max = 100, message = "就业单位名称长度不能超过100个字符", groups = { AddGroup.class, EditGroup.class })
private String employmentCompany;
/**
@@ -200,6 +207,7 @@ public class ZsjyGraduateInfoBo extends BaseEntity {
/**
* 工作职位
*/
@Size(max = 50, message = "工作职位长度不能超过50个字符", groups = { AddGroup.class, EditGroup.class })
private String jobPosition;
/**
@@ -220,11 +228,13 @@ public class ZsjyGraduateInfoBo extends BaseEntity {
/**
* 升学院校
*/
@Size(max = 100, message = "升学院校长度不能超过100个字符", groups = { AddGroup.class, EditGroup.class })
private String furtherSchool;
/**
* 升学专业
*/
@Size(max = 50, message = "升学专业长度不能超过50个字符", groups = { AddGroup.class, EditGroup.class })
private String furtherMajor;
/**
Loaded 100 of 208 files, more files were not shown because too many files have changed in this diff. Show more