diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/controller/XskhDisciplineRecordController.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/controller/XskhDisciplineRecordController.java new file mode 100644 index 00000000..73faed9a --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/controller/XskhDisciplineRecordController.java @@ -0,0 +1,113 @@ +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.XskhDisciplineRecordVo; +import org.dromara.xskh.domain.bo.XskhDisciplineRecordBo; +import org.dromara.xskh.domain.vo.XskhStudentOptionVo; +import org.dromara.xskh.service.IXskhDisciplineRecordService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 学生违纪处分记录 + * + * @author ruoyi + * @date 2025-01-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/disciplineRecord/disciplineRecord") +public class XskhDisciplineRecordController extends BaseController { + + private final IXskhDisciplineRecordService xskhDisciplineRecordService; + + /** + * 查询学生违纪处分记录列表 + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:list") + @GetMapping("/list") + public TableDataInfo list(XskhDisciplineRecordBo bo, PageQuery pageQuery) { + return xskhDisciplineRecordService.queryPageList(bo, pageQuery); + } + + /** + * 导出学生违纪处分记录列表 + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:export") + @Log(title = "学生违纪处分记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(XskhDisciplineRecordBo bo, HttpServletResponse response) { + List list = xskhDisciplineRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "学生违纪处分记录", XskhDisciplineRecordVo.class, response); + } + + /** + * 获取学生违纪处分记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(xskhDisciplineRecordService.queryById(id)); + } + + /** + * 新增学生违纪处分记录 + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:add") + @Log(title = "学生违纪处分记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody XskhDisciplineRecordBo bo) { + return toAjax(xskhDisciplineRecordService.insertByBo(bo)); + } + + /** + * 修改学生违纪处分记录 + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:edit") + @Log(title = "学生违纪处分记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody XskhDisciplineRecordBo bo) { + return toAjax(xskhDisciplineRecordService.updateByBo(bo)); + } + + /** + * 删除学生违纪处分记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:remove") + @Log(title = "学生违纪处分记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(xskhDisciplineRecordService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 查询学生选项列表(用于下拉框) + */ + @SaCheckPermission("disciplineRecord:disciplineRecord:query") + @GetMapping("/studentOptions") + public R> getStudentOptions(@RequestParam(required = false) String keyword) { + return R.ok(xskhDisciplineRecordService.getStudentOptions(keyword)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/XskhDisciplineRecord.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/XskhDisciplineRecord.java new file mode 100644 index 00000000..d2dc4f91 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/XskhDisciplineRecord.java @@ -0,0 +1,118 @@ +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.time.LocalDate; +import java.util.Date; + +/** + * 学生违纪处分记录对象 xskh_discipline_record + * + * @author ruoyi + * @date 2025-01-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("xskh_discipline_record") +public class XskhDisciplineRecord extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 学生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; + + /** + * 违纪处分类型ID + */ + private Long disciplineTypeId; + + /** + * 违纪处分类型名称 + */ + private String disciplineTypeName; + + /** + * 违纪处分日期 + */ + private LocalDate disciplineDate; + + /** + * 违纪处分原因 + */ + private String disciplineReason; + + /** + * 违纪处分内容 + */ + private String disciplineContent; + + /** + * 扣分分值 + */ + private BigDecimal scoreDeduction; + + /** + * 状态(1-生效 2-已撤销) + */ + private String status; + + /** + * 附件OSS ID列表,逗号分隔 + */ + private String attachmentOssIds; + +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/bo/XskhDisciplineRecordBo.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/bo/XskhDisciplineRecordBo.java new file mode 100644 index 00000000..0defcbfe --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/bo/XskhDisciplineRecordBo.java @@ -0,0 +1,136 @@ +package org.dromara.xskh.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +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.XskhDisciplineRecord; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Date; + +/** + * 学生违纪处分记录业务对象 xskh_discipline_record + * + * @author ruoyi + * @date 2025-01-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = XskhDisciplineRecord.class, reverseConvertGenerate = false) +public class XskhDisciplineRecordBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 学生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; + + /** + * 违纪处分类型ID + */ + @NotNull(message = "违纪处分类型ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long disciplineTypeId; + + /** + * 违纪处分类型名称 + */ + @NotBlank(message = "违纪处分类型名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String disciplineTypeName; + + /** + * 违纪处分日期 + */ + @NotNull(message = "违纪处分日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate disciplineDate; + + /** + * 违纪处分原因 + */ + @NotBlank(message = "违纪处分原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String disciplineReason; + + /** + * 违纪处分内容 + */ + private String disciplineContent; + + /** + * 扣分分值 + */ + @DecimalMin(value = "0.00", message = "扣分分值不能为负数", groups = { AddGroup.class, EditGroup.class }) + @Digits(integer = 3, fraction = 2, message = "扣分分值格式不正确,最多支持3位整数和2位小数", groups = { AddGroup.class, + EditGroup.class }) + private BigDecimal scoreDeduction; + + /** + * 状态(1-生效 2-已撤销) + */ + private String status; + + /** + * 附件OSS ID列表,逗号分隔 + */ + private String attachmentOssIds; + +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhDisciplineRecordVo.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhDisciplineRecordVo.java new file mode 100644 index 00000000..6020b84e --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhDisciplineRecordVo.java @@ -0,0 +1,163 @@ +package org.dromara.xskh.domain.vo; + +import org.dromara.xskh.domain.XskhDisciplineType; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.xskh.domain.XskhDisciplineRecord; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Date; + +/** + * 学生违纪处分记录视图对象 xskh_discipline_record + * + * @author ruoyi + * @date 2025-01-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = XskhDisciplineRecord.class) +public class XskhDisciplineRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 学生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; + + /** + * 违纪处分类型ID + */ + @ExcelProperty(value = "违纪处分类型ID") + private Long disciplineTypeId; + + /** + * 违纪处分类型名称 + */ + @ExcelProperty(value = "违纪处分类型名称") + private String disciplineTypeName; + + /** + * 违纪处分日期 + */ + @ExcelProperty(value = "违纪处分日期") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate disciplineDate; + + /** + * 违纪处分原因 + */ + @ExcelProperty(value = "违纪处分原因") + private String disciplineReason; + + /** + * 违纪处分内容 + */ + @ExcelProperty(value = "违纪处分内容") + private String disciplineContent; + + /** + * 扣分分值 + */ + @ExcelProperty(value = "扣分分值") + private BigDecimal scoreDeduction; + + /** + * 状态(1-生效 2-已撤销) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "student_discipline_status") + private String status; + /** + * 附件OSS ID列表,逗号分隔 + */ + private String attachmentOssIds; + + /** + * 创建者 + */ + 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; + +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhStudentOptionVo.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhStudentOptionVo.java new file mode 100644 index 00000000..ac60c7f2 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhStudentOptionVo.java @@ -0,0 +1,65 @@ +package org.dromara.xskh.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 学生考核-学生选项视图对象,用于下拉框选择 + * + * @author ruoyi + * @date 2025-01-03 + */ +@Data +public class XskhStudentOptionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 学生ID + */ + private Long id; + + /** + * 学号 + */ + private String studentNo; + + /** + * 学生姓名 + */ + private String name; + + /** + * 学院ID + */ + private Long collegeId; + + /** + * 学院名称 + */ + private String collegeName; + + /** + * 专业ID + */ + private Long majorId; + + /** + * 专业名称 + */ + private String majorName; + + /** + * 班级ID + */ + private Long classId; + + /** + * 班级名称 + */ + private String className; + +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/mapper/XskhDisciplineRecordMapper.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/mapper/XskhDisciplineRecordMapper.java new file mode 100644 index 00000000..76f93aed --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/mapper/XskhDisciplineRecordMapper.java @@ -0,0 +1,26 @@ +package org.dromara.xskh.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.xskh.domain.XskhDisciplineRecord; +import org.dromara.xskh.domain.vo.XskhDisciplineRecordVo; +import org.dromara.xskh.domain.vo.XskhStudentOptionVo; + +import java.util.List; + +/** + * 学生违纪处分记录Mapper接口 + * + * @author ruoyi + * @date 2025-01-03 + */ +public interface XskhDisciplineRecordMapper extends BaseMapperPlus { + + /** + * 查询学生选项列表(用于下拉框) + * + * @param keyword 搜索关键词(学号或姓名) + * @return 学生选项列表 + */ + List selectStudentOptions(String keyword); + +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/IXskhDisciplineRecordService.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/IXskhDisciplineRecordService.java new file mode 100644 index 00000000..41ee1a3c --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/IXskhDisciplineRecordService.java @@ -0,0 +1,54 @@ +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.XskhDisciplineRecordBo; +import org.dromara.xskh.domain.vo.XskhDisciplineRecordVo; +import org.dromara.xskh.domain.vo.XskhStudentOptionVo; + +import java.util.Collection; +import java.util.List; + +/** + * 学生违纪处分记录Service接口 + * + * @author ruoyi + * @date 2025-01-03 + */ +public interface IXskhDisciplineRecordService { + + /** + * 查询学生违纪处分记录 + */ + XskhDisciplineRecordVo queryById(Long id); + + /** + * 查询学生违纪处分记录列表 + */ + TableDataInfo queryPageList(XskhDisciplineRecordBo bo, PageQuery pageQuery); + + /** + * 查询学生违纪处分记录列表 + */ + List queryList(XskhDisciplineRecordBo bo); + + /** + * 新增学生违纪处分记录 + */ + Boolean insertByBo(XskhDisciplineRecordBo bo); + + /** + * 修改学生违纪处分记录 + */ + Boolean updateByBo(XskhDisciplineRecordBo bo); + + /** + * 校验并批量删除学生违纪处分记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询学生选项列表(用于下拉框) + */ + List getStudentOptions(String keyword); +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/impl/XskhDisciplineRecordServiceImpl.java b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/impl/XskhDisciplineRecordServiceImpl.java new file mode 100644 index 00000000..7d20bf76 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/impl/XskhDisciplineRecordServiceImpl.java @@ -0,0 +1,146 @@ +package org.dromara.xskh.service.impl; + +import cn.hutool.core.bean.BeanUtil; +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 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.xskh.domain.XskhDisciplineRecord; +import org.dromara.xskh.domain.bo.XskhDisciplineRecordBo; +import org.dromara.xskh.domain.vo.XskhDisciplineRecordVo; +import org.dromara.xskh.domain.vo.XskhStudentOptionVo; +import org.dromara.xskh.mapper.XskhDisciplineRecordMapper; +import org.dromara.xskh.service.IXskhDisciplineRecordService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 学生违纪处分记录Service业务层处理 + * + * @author ruoyi + * @date 2025-01-03 + */ +@RequiredArgsConstructor +@Service +public class XskhDisciplineRecordServiceImpl implements IXskhDisciplineRecordService { + + private final XskhDisciplineRecordMapper baseMapper; + + /** + * 查询学生违纪处分记录 + */ + @Override + public XskhDisciplineRecordVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 查询学生违纪处分记录列表 + */ + @Override + public TableDataInfo queryPageList(XskhDisciplineRecordBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询学生违纪处分记录列表 + */ + @Override + public List queryList(XskhDisciplineRecordBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XskhDisciplineRecordBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getStudentId() != null, XskhDisciplineRecord::getStudentId, bo.getStudentId()); + lqw.like(StringUtils.isNotBlank(bo.getStudentNo()), XskhDisciplineRecord::getStudentNo, bo.getStudentNo()); + lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XskhDisciplineRecord::getStudentName, + bo.getStudentName()); + lqw.eq(bo.getCollegeId() != null, XskhDisciplineRecord::getCollegeId, bo.getCollegeId()); + lqw.like(StringUtils.isNotBlank(bo.getCollegeName()), XskhDisciplineRecord::getCollegeName, + bo.getCollegeName()); + lqw.eq(bo.getMajorId() != null, XskhDisciplineRecord::getMajorId, bo.getMajorId()); + lqw.like(StringUtils.isNotBlank(bo.getMajorName()), XskhDisciplineRecord::getMajorName, bo.getMajorName()); + lqw.eq(bo.getClassId() != null, XskhDisciplineRecord::getClassId, bo.getClassId()); + lqw.like(StringUtils.isNotBlank(bo.getClassName()), XskhDisciplineRecord::getClassName, bo.getClassName()); + lqw.eq(bo.getDisciplineTypeId() != null, XskhDisciplineRecord::getDisciplineTypeId, bo.getDisciplineTypeId()); + lqw.like(StringUtils.isNotBlank(bo.getDisciplineTypeName()), XskhDisciplineRecord::getDisciplineTypeName, + bo.getDisciplineTypeName()); + lqw.eq(bo.getDisciplineDate() != null, XskhDisciplineRecord::getDisciplineDate, bo.getDisciplineDate()); + lqw.like(StringUtils.isNotBlank(bo.getDisciplineReason()), XskhDisciplineRecord::getDisciplineReason, + bo.getDisciplineReason()); + lqw.like(StringUtils.isNotBlank(bo.getDisciplineContent()), XskhDisciplineRecord::getDisciplineContent, + bo.getDisciplineContent()); + lqw.eq(bo.getScoreDeduction() != null, XskhDisciplineRecord::getScoreDeduction, bo.getScoreDeduction()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XskhDisciplineRecord::getStatus, bo.getStatus()); + lqw.orderByDesc(XskhDisciplineRecord::getCreateTime); + return lqw; + } + + /** + * 新增学生违纪处分记录 + */ + @Override + public Boolean insertByBo(XskhDisciplineRecordBo bo) { + XskhDisciplineRecord add = MapstructUtils.convert(bo, XskhDisciplineRecord.class); + validEntityBeforeSave(add); + + // 设置默认值 + if (StringUtils.isBlank(add.getStatus())) { + add.setStatus("1"); // 默认生效 + } + + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改学生违纪处分记录 + */ + @Override + public Boolean updateByBo(XskhDisciplineRecordBo bo) { + XskhDisciplineRecord update = MapstructUtils.convert(bo, XskhDisciplineRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(XskhDisciplineRecord entity) { + // TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除学生违纪处分记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 查询学生选项列表(用于下拉框) + */ + @Override + public List getStudentOptions(String keyword) { + return baseMapper.selectStudentOptions(keyword); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/XskhDisciplineRecordMapper.xml b/backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/XskhDisciplineRecordMapper.xml new file mode 100644 index 00000000..b555aec9 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/XskhDisciplineRecordMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + diff --git a/docs/设计文档/database/学生考核管理/学生考核管理数据库模型.sql b/docs/设计文档/database/学生考核管理/学生考核管理数据库模型.sql index 61c44751..f648e8ec 100644 --- a/docs/设计文档/database/学生考核管理/学生考核管理数据库模型.sql +++ b/docs/设计文档/database/学生考核管理/学生考核管理数据库模型.sql @@ -42,15 +42,12 @@ CREATE TABLE `xskh_discipline_record` ( `class_name` varchar(100) NOT NULL COMMENT '班级名称', `discipline_type_id` bigint(20) NOT NULL COMMENT '违纪处分类型ID', `discipline_type_name` varchar(100) NOT NULL COMMENT '违纪处分类型名称', - `discipline_date` date NOT NULL COMMENT '违纪处分日期', + `discipline_date` DATETIME NOT NULL COMMENT '违纪处分日期', `discipline_reason` varchar(500) NOT NULL COMMENT '违纪处分原因', `discipline_content` varchar(500) DEFAULT NULL COMMENT '违纪处分内容', `score_deduction` decimal(5,2) DEFAULT 0.00 COMMENT '扣分分值', `status` char(1) DEFAULT '1' COMMENT '状态(1-生效 2-已撤销)', - `approval_status` char(1) DEFAULT '1' COMMENT '审批状态(1-已审批 2-审批中)', - `approval_by` bigint(20) DEFAULT NULL COMMENT '审批人ID', - `approval_time` datetime DEFAULT NULL COMMENT '审批时间', - `approval_remark` varchar(500) DEFAULT NULL COMMENT '审批备注', + `attachment_oss_ids` varchar(1000) DEFAULT NULL COMMENT '附件OSS文件ID,多个用逗号分隔(申请材料、证明文件等)', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', diff --git a/web/src/api/xskh/disciplineRecord/disciplineRecord.ts b/web/src/api/xskh/disciplineRecord/disciplineRecord.ts new file mode 100644 index 00000000..6d5c2332 --- /dev/null +++ b/web/src/api/xskh/disciplineRecord/disciplineRecord.ts @@ -0,0 +1,75 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DisciplineRecordVO, DisciplineRecordForm, DisciplineRecordQuery, XskhStudentOptionVO } from './disciplineRecord/types'; + +/** + * 查询学生违纪处分记录列表 + * @param query + * @returns {*} + */ + +export const listDisciplineRecord = (query?: DisciplineRecordQuery): AxiosPromise => { + return request({ + url: '/disciplineRecord/disciplineRecord/list', + method: 'get', + params: query + }); +}; + +/** + * 查询学生违纪处分记录详细 + * @param id + */ +export const getDisciplineRecord = (id: string | number): AxiosPromise => { + return request({ + url: '/disciplineRecord/disciplineRecord/' + id, + method: 'get' + }); +}; + +/** + * 新增学生违纪处分记录 + * @param data + */ +export const addDisciplineRecord = (data: DisciplineRecordForm) => { + return request({ + url: '/disciplineRecord/disciplineRecord', + method: 'post', + data: data + }); +}; + +/** + * 修改学生违纪处分记录 + * @param data + */ +export const updateDisciplineRecord = (data: DisciplineRecordForm) => { + return request({ + url: '/disciplineRecord/disciplineRecord', + method: 'put', + data: data + }); +}; + +/** + * 删除学生违纪处分记录 + * @param id + */ +export const delDisciplineRecord = (id: string | number | Array) => { + return request({ + url: '/disciplineRecord/disciplineRecord/' + id, + method: 'delete' + }); +}; + +/** + * 查询学生选项列表(用于下拉框) + * @param keyword + */ +export const getStudentOptions = (keyword?: string): AxiosPromise => { + return request({ + url: '/disciplineRecord/disciplineRecord/studentOptions', + method: 'get', + params: { keyword } + }); +}; diff --git a/web/src/api/xskh/disciplineRecord/disciplineRecord/types.ts b/web/src/api/xskh/disciplineRecord/disciplineRecord/types.ts new file mode 100644 index 00000000..adbbb05f --- /dev/null +++ b/web/src/api/xskh/disciplineRecord/disciplineRecord/types.ts @@ -0,0 +1,403 @@ +import { PageQuery } from '@/types/base'; + +export interface DisciplineRecordVO { + /** + * 主键ID + */ + id: string | number; + + /** + * 学生ID + */ + studentId: string | number; + + /** + * 学号 + */ + studentNo: string; + + /** + * 学生姓名 + */ + studentName: string; + + /** + * 学院ID + */ + collegeId: string | number; + + /** + * 学院名称 + */ + collegeName: string; + + /** + * 专业ID + */ + majorId: string | number; + + /** + * 专业名称 + */ + majorName: string; + + /** + * 班级ID + */ + classId: string | number; + + /** + * 班级名称 + */ + className: string; + + /** + * 违纪处分类型ID + */ + disciplineTypeId: string | number; + + /** + * 违纪处分类型名称 + */ + disciplineTypeName: string; + + /** + * 违纪处分日期 + */ + disciplineDate: string; + + /** + * 违纪处分原因 + */ + disciplineReason: string; + + /** + * 违纪处分内容 + */ + disciplineContent: string; + + /** + * 扣分分值 + */ + scoreDeduction: number; + + /** + * 状态(1-生效 2-已撤销) + */ + status: string; + + /** + * 审批状态(1-已审批 2-审批中) + */ + approvalStatus: string; + + /** + * 审批人ID + */ + approvalBy: string | number; + + /** + * 审批时间 + */ + approvalTime: string; + + /** + * 审批备注 + */ + approvalRemark: string; + + /** + * 附件OSS ID列表,逗号分隔 + */ + attachmentOssIds: string; + + /** + * 创建者 + */ + createBy: string | number; + + /** + * 创建时间 + */ + createTime: string; + + /** + * 更新者 + */ + updateBy: string | number; + + /** + * 更新时间 + */ + updateTime: string; +} + +export interface DisciplineRecordForm { + /** + * 主键ID + */ + id?: string | number; + + /** + * 学生ID + */ + studentId?: string | number; + + /** + * 学号 + */ + studentNo?: string; + + /** + * 学生姓名 + */ + studentName?: string; + + /** + * 学院ID + */ + collegeId?: string | number; + + /** + * 学院名称 + */ + collegeName?: string; + + /** + * 专业ID + */ + majorId?: string | number; + + /** + * 专业名称 + */ + majorName?: string; + + /** + * 班级ID + */ + classId?: string | number; + + /** + * 班级名称 + */ + className?: string; + + /** + * 违纪处分类型ID + */ + disciplineTypeId?: string | number; + + /** + * 违纪处分类型名称 + */ + disciplineTypeName?: string; + + /** + * 违纪处分日期 + */ + disciplineDate?: string; + + /** + * 违纪处分原因 + */ + disciplineReason?: string; + + /** + * 违纪处分内容 + */ + disciplineContent?: string; + + /** + * 扣分分值 + */ + scoreDeduction?: number; + + /** + * 状态(1-生效 2-已撤销) + */ + status?: string; + + /** + * 审批状态(1-已审批 2-审批中) + */ + approvalStatus?: string; + + /** + * 审批人ID + */ + approvalBy?: string | number; + + /** + * 审批时间 + */ + approvalTime?: string; + + /** + * 审批备注 + */ + approvalRemark?: string; + + /** + * 附件OSS ID列表,逗号分隔 + */ + attachmentOssIds?: string; +} + +export interface DisciplineRecordQuery extends PageQuery { + + /** + * 学生ID + */ + studentId?: string | number; + + /** + * 学号 + */ + studentNo?: string; + + /** + * 学生姓名 + */ + studentName?: string; + + /** + * 学院ID + */ + collegeId?: string | number; + + /** + * 学院名称 + */ + collegeName?: string; + + /** + * 专业ID + */ + majorId?: string | number; + + /** + * 专业名称 + */ + majorName?: string; + + /** + * 班级ID + */ + classId?: string | number; + + /** + * 班级名称 + */ + className?: string; + + /** + * 违纪处分类型ID + */ + disciplineTypeId?: string | number; + + /** + * 违纪处分类型名称 + */ + disciplineTypeName?: string; + + /** + * 违纪处分日期 + */ + disciplineDate?: string; + + /** + * 违纪处分原因 + */ + disciplineReason?: string; + + /** + * 违纪处分内容 + */ + disciplineContent?: string; + + /** + * 扣分分值 + */ + scoreDeduction?: number; + + /** + * 状态(1-生效 2-已撤销) + */ + status?: string; + + /** + * 审批状态(1-已审批 2-审批中) + */ + approvalStatus?: string; + + /** + * 审批人ID + */ + approvalBy?: string | number; + + /** + * 审批时间 + */ + approvalTime?: string; + + /** + * 审批备注 + */ + approvalRemark?: string; + + /** + * 日期范围参数 + */ + params?: any; +} + +/** + * 学生考核-学生选项 + */ +export interface XskhStudentOptionVO { + /** + * 学生ID + */ + id: string | number; + + /** + * 学号 + */ + studentNo: string; + + /** + * 学生姓名 + */ + name: string; + + /** + * 学院ID + */ + collegeId: string | number; + + /** + * 学院名称 + */ + collegeName: string; + + /** + * 专业ID + */ + majorId: string | number; + + /** + * 专业名称 + */ + majorName: string; + + /** + * 班级ID + */ + classId: string | number; + + /** + * 班级名称 + */ + className: string; +} diff --git a/web/src/views/xskh/disciplineRecord/DisciplineRecordForm.vue b/web/src/views/xskh/disciplineRecord/DisciplineRecordForm.vue new file mode 100644 index 00000000..a5301830 --- /dev/null +++ b/web/src/views/xskh/disciplineRecord/DisciplineRecordForm.vue @@ -0,0 +1,988 @@ + + + + + diff --git a/web/src/views/xskh/disciplineRecord/index.vue b/web/src/views/xskh/disciplineRecord/index.vue new file mode 100644 index 00000000..50d07461 --- /dev/null +++ b/web/src/views/xskh/disciplineRecord/index.vue @@ -0,0 +1,321 @@ + + + + +