diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormViolationController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormViolationController.java new file mode 100644 index 00000000..c2d72c69 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormViolationController.java @@ -0,0 +1,105 @@ +package org.dromara.xg.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.xg.domain.vo.XgDormViolationVo; +import org.dromara.xg.domain.bo.XgDormViolationBo; +import org.dromara.xg.service.IXgDormViolationService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 宿舍违纪记录 + * + * @author zlwu + * @date 2025-08-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dormViolation/dormViolation") +public class XgDormViolationController extends BaseController { + + private final IXgDormViolationService xgDormViolationService; + + /** + * 查询宿舍违纪记录列表 + */ + @SaCheckPermission("dormViolation:dormViolation:list") + @GetMapping("/list") + public TableDataInfo list(XgDormViolationBo bo, PageQuery pageQuery) { + return xgDormViolationService.queryPageList(bo, pageQuery); + } + + /** + * 导出宿舍违纪记录列表 + */ + @SaCheckPermission("dormViolation:dormViolation:export") + @Log(title = "宿舍违纪记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(XgDormViolationBo bo, HttpServletResponse response) { + List list = xgDormViolationService.queryList(bo); + ExcelUtil.exportExcel(list, "宿舍违纪记录", XgDormViolationVo.class, response); + } + + /** + * 获取宿舍违纪记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("dormViolation:dormViolation:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(xgDormViolationService.queryById(id)); + } + + /** + * 新增宿舍违纪记录 + */ + @SaCheckPermission("dormViolation:dormViolation:add") + @Log(title = "宿舍违纪记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody XgDormViolationBo bo) { + return toAjax(xgDormViolationService.insertByBo(bo)); + } + + /** + * 修改宿舍违纪记录 + */ + @SaCheckPermission("dormViolation:dormViolation:edit") + @Log(title = "宿舍违纪记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody XgDormViolationBo bo) { + return toAjax(xgDormViolationService.updateByBo(bo)); + } + + /** + * 删除宿舍违纪记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("dormViolation:dormViolation:remove") + @Log(title = "宿舍违纪记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(xgDormViolationService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormViolation.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormViolation.java new file mode 100644 index 00000000..b67b5814 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormViolation.java @@ -0,0 +1,168 @@ +package org.dromara.xg.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 宿舍违纪记录对象 xg_dorm_violation + * + * @author zlwu + * @date 2025-08-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("xg_dorm_violation") +public class XgDormViolation extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 违纪记录ID(主键) + */ + @TableId(value = "id") + private Long id; + + /** + * 学生ID + */ + private Long studentId; + + /** + * 学生姓名 + */ + private String studentName; + + /** + * 学号 + */ + private String studentNo; + + /** + * 学院ID + */ + private Long collegeId; + + /** + * 学院名称 + */ + private String collegeName; + + /** + * 专业ID + */ + private Long majorId; + + /** + * 专业名称 + */ + private String majorName; + + /** + * 班级ID + */ + private Long classId; + + /** + * 班级名称 + */ + private String className; + + /** + * 校区ID + */ + private Long campusId; + + /** + * 校区名称 + */ + private String campusName; + + /** + * 宿舍区域ID + */ + private Long areaId; + + /** + * 宿舍区域名称 + */ + private String areaName; + + /** + * 宿舍楼ID + */ + private Long buildingId; + + /** + * 宿舍楼名称 + */ + private String buildingName; + + /** + * 宿舍房间ID + */ + private Long roomId; + + /** + * 房间名称 + */ + private String roomName; + + /** + * 床位ID + */ + private Long bedId; + + /** + * 床位名称 + */ + private String bedName; + + /** + * 违纪类型 + */ + private String violationType; + + /** + * 违纪等级:1轻微 2一般 3严重 4特别严重 + */ + private String violationLevel; + + /** + * 违纪发生时间 + */ + private Date violationTime; + + /** + * 违纪行为描述 + */ + private String violationDescription; + + /** + * 涉及其他学生id(逗号分隔) + */ + private String involvedStudents; + + /** + * 附件OSS ID列表(逗号分隔) + */ + private String attachmentOssIds; + + /** + * 删除标志(0代表存在 1代表删除) + */ + private String deleted; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormViolationBo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormViolationBo.java new file mode 100644 index 00000000..e09ac546 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormViolationBo.java @@ -0,0 +1,178 @@ +package org.dromara.xg.domain.bo; + +import org.dromara.xg.domain.XgDormViolation; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 宿舍违纪记录业务对象 xg_dorm_violation + * + * @author zlwu + * @date 2025-08-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = XgDormViolation.class, reverseConvertGenerate = false) +public class XgDormViolationBo 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 studentName; + + /** + * 学号 + */ + @NotBlank(message = "学号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String studentNo; + + /** + * 学院ID + */ + private Long collegeId; + + /** + * 学院名称 + */ + private String collegeName; + + /** + * 专业ID + */ + private Long majorId; + + /** + * 专业名称 + */ + private String majorName; + + /** + * 班级ID + */ + private Long classId; + + /** + * 班级名称 + */ + private String className; + + /** + * 校区ID + */ + private Long campusId; + + /** + * 校区名称 + */ + private String campusName; + + /** + * 宿舍区域ID + */ + private Long areaId; + + /** + * 宿舍区域名称 + */ + private String areaName; + + /** + * 宿舍楼ID + */ + @NotNull(message = "宿舍楼ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long buildingId; + + /** + * 宿舍楼名称 + */ + @NotBlank(message = "宿舍楼名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String buildingName; + + /** + * 宿舍房间ID + */ + @NotNull(message = "宿舍房间ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long roomId; + + /** + * 房间名称 + */ + @NotBlank(message = "房间名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String roomName; + + /** + * 床位ID + */ + private Long bedId; + + /** + * 床位名称 + */ + private String bedName; + + /** + * 违纪类型 + */ + @NotBlank(message = "违纪类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String violationType; + + /** + * 违纪等级:1轻微 2一般 3严重 4特别严重 + */ + @NotBlank(message = "违纪等级:1轻微 2一般 3严重 4特别严重不能为空", groups = { AddGroup.class, EditGroup.class }) + private String violationLevel; + + /** + * 违纪发生时间 + */ + @NotNull(message = "违纪发生时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date violationTime; + + /** + * 违纪行为描述 + */ + @NotBlank(message = "违纪行为描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String violationDescription; + + /** + * 涉及其他学生id(逗号分隔) + */ + private String involvedStudents; + + /** + * 附件OSS ID列表(逗号分隔) + */ + private String attachmentOssIds; + + /** + * 删除标志(0代表存在 1代表删除) + */ + private String deleted; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormViolationVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormViolationVo.java new file mode 100644 index 00000000..dd0cbc81 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormViolationVo.java @@ -0,0 +1,208 @@ +package org.dromara.xg.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.xg.domain.XgDormViolation; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 宿舍违纪记录视图对象 xg_dorm_violation + * + * @author zlwu + * @date 2025-08-16 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = XgDormViolation.class) +public class XgDormViolationVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 违纪记录ID(主键) + */ + @ExcelProperty(value = "违纪记录ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "主=键") + private Long id; + + /** + * 学生ID + */ + @ExcelProperty(value = "学生ID") + private Long studentId; + + /** + * 学生姓名 + */ + @ExcelProperty(value = "学生姓名") + private String studentName; + + /** + * 学号 + */ + @ExcelProperty(value = "学号") + private String studentNo; + + /** + * 学院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 campusId; + + /** + * 校区名称 + */ + @ExcelProperty(value = "校区名称") + private String campusName; + + /** + * 宿舍区域ID + */ + @ExcelProperty(value = "宿舍区域ID") + private Long areaId; + + /** + * 宿舍区域名称 + */ + @ExcelProperty(value = "宿舍区域名称") + private String areaName; + + /** + * 宿舍楼ID + */ + @ExcelProperty(value = "宿舍楼ID") + private Long buildingId; + + /** + * 宿舍楼名称 + */ + @ExcelProperty(value = "宿舍楼名称") + private String buildingName; + + /** + * 宿舍房间ID + */ + @ExcelProperty(value = "宿舍房间ID") + private Long roomId; + + /** + * 房间名称 + */ + @ExcelProperty(value = "房间名称") + private String roomName; + + /** + * 床位ID + */ + @ExcelProperty(value = "床位ID") + private Long bedId; + + /** + * 床位名称 + */ + @ExcelProperty(value = "床位名称") + private String bedName; + + /** + * 违纪类型 + */ + @ExcelProperty(value = "违纪类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dorm_violation_type") + private String violationType; + + /** + * 违纪等级:1轻微 2一般 3严重 4特别严重 + */ + @ExcelProperty(value = "违纪等级:1轻微 2一般 3严重 4特别严重", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dorm_violation_level") + private String violationLevel; + + /** + * 违纪发生时间 + */ + @ExcelProperty(value = "违纪发生时间") + private Date violationTime; + + /** + * 违纪行为描述 + */ + @ExcelProperty(value = "违纪行为描述") + private String violationDescription; + + /** + * 涉及其他学生id(逗号分隔) + */ + @ExcelProperty(value = "涉及其他学生id", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逗=号分隔") + private String involvedStudents; + + /** + * 附件OSS ID列表(逗号分隔) + */ + @ExcelProperty(value = "附件OSS ID列表", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "逗=号分隔") + private String attachmentOssIds; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @ExcelProperty(value = "删除标志", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=代表存在,1=代表删除") + private String deleted; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormViolationMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormViolationMapper.java new file mode 100644 index 00000000..0ceceed4 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormViolationMapper.java @@ -0,0 +1,15 @@ +package org.dromara.xg.mapper; + +import org.dromara.xg.domain.XgDormViolation; +import org.dromara.xg.domain.vo.XgDormViolationVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 宿舍违纪记录Mapper接口 + * + * @author zlwu + * @date 2025-08-16 + */ +public interface XgDormViolationMapper extends BaseMapperPlus { + +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormViolationService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormViolationService.java new file mode 100644 index 00000000..3a2f9d52 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormViolationService.java @@ -0,0 +1,68 @@ +package org.dromara.xg.service; + +import org.dromara.xg.domain.vo.XgDormViolationVo; +import org.dromara.xg.domain.bo.XgDormViolationBo; +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 zlwu + * @date 2025-08-16 + */ +public interface IXgDormViolationService { + + /** + * 查询宿舍违纪记录 + * + * @param id 主键 + * @return 宿舍违纪记录 + */ + XgDormViolationVo queryById(Long id); + + /** + * 分页查询宿舍违纪记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 宿舍违纪记录分页列表 + */ + TableDataInfo queryPageList(XgDormViolationBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的宿舍违纪记录列表 + * + * @param bo 查询条件 + * @return 宿舍违纪记录列表 + */ + List queryList(XgDormViolationBo bo); + + /** + * 新增宿舍违纪记录 + * + * @param bo 宿舍违纪记录 + * @return 是否新增成功 + */ + Boolean insertByBo(XgDormViolationBo bo); + + /** + * 修改宿舍违纪记录 + * + * @param bo 宿舍违纪记录 + * @return 是否修改成功 + */ + Boolean updateByBo(XgDormViolationBo bo); + + /** + * 校验并批量删除宿舍违纪记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormViolationServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormViolationServiceImpl.java new file mode 100644 index 00000000..dd4d3d09 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormViolationServiceImpl.java @@ -0,0 +1,157 @@ +package org.dromara.xg.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.xg.domain.bo.XgDormViolationBo; +import org.dromara.xg.domain.vo.XgDormViolationVo; +import org.dromara.xg.domain.XgDormViolation; +import org.dromara.xg.mapper.XgDormViolationMapper; +import org.dromara.xg.service.IXgDormViolationService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 宿舍违纪记录Service业务层处理 + * + * @author zlwu + * @date 2025-08-16 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class XgDormViolationServiceImpl implements IXgDormViolationService { + + private final XgDormViolationMapper baseMapper; + + /** + * 查询宿舍违纪记录 + * + * @param id 主键 + * @return 宿舍违纪记录 + */ + @Override + public XgDormViolationVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询宿舍违纪记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 宿舍违纪记录分页列表 + */ + @Override + public TableDataInfo queryPageList(XgDormViolationBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的宿舍违纪记录列表 + * + * @param bo 查询条件 + * @return 宿舍违纪记录列表 + */ + @Override + public List queryList(XgDormViolationBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(XgDormViolationBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(XgDormViolation::getId); + lqw.eq(bo.getStudentId() != null, XgDormViolation::getStudentId, bo.getStudentId()); + lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XgDormViolation::getStudentName, bo.getStudentName()); + lqw.like(StringUtils.isNotBlank(bo.getStudentNo()), XgDormViolation::getStudentNo, bo.getStudentNo()); + lqw.eq(bo.getCollegeId() != null, XgDormViolation::getCollegeId, bo.getCollegeId()); + lqw.like(StringUtils.isNotBlank(bo.getCollegeName()), XgDormViolation::getCollegeName, bo.getCollegeName()); + lqw.eq(bo.getMajorId() != null, XgDormViolation::getMajorId, bo.getMajorId()); + lqw.like(StringUtils.isNotBlank(bo.getMajorName()), XgDormViolation::getMajorName, bo.getMajorName()); + lqw.eq(bo.getClassId() != null, XgDormViolation::getClassId, bo.getClassId()); + lqw.like(StringUtils.isNotBlank(bo.getClassName()), XgDormViolation::getClassName, bo.getClassName()); + lqw.eq(bo.getCampusId() != null, XgDormViolation::getCampusId, bo.getCampusId()); + lqw.like(StringUtils.isNotBlank(bo.getCampusName()), XgDormViolation::getCampusName, bo.getCampusName()); + lqw.eq(bo.getAreaId() != null, XgDormViolation::getAreaId, bo.getAreaId()); + lqw.like(StringUtils.isNotBlank(bo.getAreaName()), XgDormViolation::getAreaName, bo.getAreaName()); + lqw.eq(bo.getBuildingId() != null, XgDormViolation::getBuildingId, bo.getBuildingId()); + lqw.like(StringUtils.isNotBlank(bo.getBuildingName()), XgDormViolation::getBuildingName, bo.getBuildingName()); + lqw.eq(bo.getRoomId() != null, XgDormViolation::getRoomId, bo.getRoomId()); + lqw.like(StringUtils.isNotBlank(bo.getRoomName()), XgDormViolation::getRoomName, bo.getRoomName()); + lqw.eq(bo.getBedId() != null, XgDormViolation::getBedId, bo.getBedId()); + lqw.like(StringUtils.isNotBlank(bo.getBedName()), XgDormViolation::getBedName, bo.getBedName()); + lqw.eq(StringUtils.isNotBlank(bo.getViolationType()), XgDormViolation::getViolationType, bo.getViolationType()); + lqw.eq(StringUtils.isNotBlank(bo.getViolationLevel()), XgDormViolation::getViolationLevel, bo.getViolationLevel()); + lqw.eq(bo.getViolationTime() != null, XgDormViolation::getViolationTime, bo.getViolationTime()); + lqw.like(StringUtils.isNotBlank(bo.getViolationDescription()), XgDormViolation::getViolationDescription, bo.getViolationDescription()); + lqw.like(StringUtils.isNotBlank(bo.getInvolvedStudents()), XgDormViolation::getInvolvedStudents, bo.getInvolvedStudents()); + lqw.like(StringUtils.isNotBlank(bo.getAttachmentOssIds()), XgDormViolation::getAttachmentOssIds, bo.getAttachmentOssIds()); + lqw.eq(StringUtils.isNotBlank(bo.getDeleted()), XgDormViolation::getDeleted, bo.getDeleted()); + return lqw; + } + + /** + * 新增宿舍违纪记录 + * + * @param bo 宿舍违纪记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(XgDormViolationBo bo) { + XgDormViolation add = MapstructUtils.convert(bo, XgDormViolation.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改宿舍违纪记录 + * + * @param bo 宿舍违纪记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(XgDormViolationBo bo) { + XgDormViolation update = MapstructUtils.convert(bo, XgDormViolation.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(XgDormViolation entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除宿舍违纪记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormViolation/XgDormViolationMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormViolation/XgDormViolationMapper.xml new file mode 100644 index 00000000..48e937cb --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormViolation/XgDormViolationMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据字典配置.sql b/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据字典配置.sql new file mode 100644 index 00000000..a5b01ac1 --- /dev/null +++ b/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据字典配置.sql @@ -0,0 +1,65 @@ +-- 宿舍违纪记录管理数据字典配置脚本(超简化版) +-- 来源:宿舍违纪记录数据模型设计 +-- 用途:配置宿舍违纪记录模块所需的数据字典项(仅主表相关字典) +-- 维护人:数据库设计团队 +-- 日期:2025-01-28 + +-- ============================================================================= +-- 1. 违纪类型字典 +-- ============================================================================= +INSERT INTO sys_dict_type (dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) +VALUES (NEXT VALUE FOR sys_dict_type_seq, '000000', '宿舍违纪类型', 'dorm_violation_type', 103, 1, NOW(), 1, NOW(), '宿舍违纪类型分类'); + +INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) +VALUES +-- 卫生违纪类 +(NEXT VALUE FOR sys_dict_data_seq, '000000', 1, '垃圾乱扔', 'WS001001', 'dorm_violation_type', '', 'warning', 'N', 103, 1, NOW(), 1, NOW(), '在宿舍内外乱扔垃圾'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 2, '床铺不整', 'WS001002', 'dorm_violation_type', '', 'warning', 'N', 103, 1, NOW(), 1, NOW(), '床铺整理不规范'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 3, '物品摆放混乱', 'WS001003', 'dorm_violation_type', '', 'warning', 'N', 103, 1, NOW(), 1, NOW(), '个人物品摆放不规范'), + +-- 纪律违纪类 +(NEXT VALUE FOR sys_dict_data_seq, '000000', 11, '晚归违纪', 'JL001001', 'dorm_violation_type', '', 'info', 'N', 103, 1, NOW(), 1, NOW(), '超过规定时间归宿'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 12, '噪音扰民', 'JL001002', 'dorm_violation_type', '', 'info', 'N', 103, 1, NOW(), 1, NOW(), '在休息时间制造噪音'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 13, '夜不归宿', 'JL001003', 'dorm_violation_type', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '整夜未在宿舍住宿'), + +-- 安全违纪类 +(NEXT VALUE FOR sys_dict_data_seq, '000000', 21, '违规用电', 'AQ001001', 'dorm_violation_type', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '使用违规电器或私拉电线'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 22, '吸烟违纪', 'AQ001002', 'dorm_violation_type', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '在宿舍内吸烟'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 23, '明火使用', 'AQ001003', 'dorm_violation_type', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '在宿舍内使用明火'), + +-- 物品违纪类 +(NEXT VALUE FOR sys_dict_data_seq, '000000', 31, '损坏公物', 'WP001001', 'dorm_violation_type', '', 'primary', 'N', 103, 1, NOW(), 1, NOW(), '故意或过失损坏公共物品'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 32, '私改设施', 'WP001002', 'dorm_violation_type', '', 'primary', 'N', 103, 1, NOW(), 1, NOW(), '私自改动宿舍设施'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 33, '盗用他人物品', 'WP001003', 'dorm_violation_type', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '盗用或损坏他人物品'); + +-- ============================================================================= +-- 2. 违纪等级字典 +-- ============================================================================= +INSERT INTO sys_dict_type (dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) +VALUES (NEXT VALUE FOR sys_dict_type_seq, '000000', '违纪等级', 'dorm_violation_level', 103, 1, NOW(), 1, NOW(), '宿舍违纪等级分类'); + +INSERT INTO sys_dict_data (dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, create_dept, create_by, create_time, update_by, update_time, remark) +VALUES +(NEXT VALUE FOR sys_dict_data_seq, '000000', 1, '轻微', '1', 'dorm_violation_level', '', 'success', 'Y', 103, 1, NOW(), 1, NOW(), '轻微违纪'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 2, '一般', '2', 'dorm_violation_level', '', 'warning', 'N', 103, 1, NOW(), 1, NOW(), '一般违纪'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 3, '严重', '3', 'dorm_violation_level', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '严重违纪'), +(NEXT VALUE FOR sys_dict_data_seq, '000000', 4, '特别严重', '4', 'dorm_violation_level', '', 'danger', 'N', 103, 1, NOW(), 1, NOW(), '特别严重违纪'); + +-- ============================================================================= +-- 数据字典配置完成提示 +-- ============================================================================= +-- 宿舍违纪记录管理数据字典配置脚本执行完成(超简化版) +-- 包含字典类型: +-- 1. dorm_violation_type - 宿舍违纪类型(12个违纪类型) +-- 2. dorm_violation_level - 违纪等级(4个等级) +-- +-- 功能特点: +-- 1. 超级简化设计,仅保留核心字典 +-- 2. 违纪类型使用字典管理,无需单独表 +-- 3. 附件使用OSS ID存储,无需附件类型字典 +-- 4. 移除了处罚、审核、累计等复杂字典 +-- +-- 注意事项: +-- 1. 违纪类型编码采用分类前缀(WS卫生、JL纪律、AQ安全、WP物品) +-- 2. 所有字典数据采用项目统一规范 +-- 3. 专注于记录功能,大幅简化了数据字典结构 \ No newline at end of file diff --git a/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据库建表脚本.sql b/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据库建表脚本.sql new file mode 100644 index 00000000..49b14136 --- /dev/null +++ b/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据库建表脚本.sql @@ -0,0 +1,96 @@ +-- 宿舍违纪记录管理数据库建表脚本(超简化版) +-- 来源:宿舍违纪记录数据模型设计 +-- 用途:创建宿舍违纪记录管理所需的数据库表(仅主表) +-- 维护人:数据库设计团队 +-- 日期:2025-01-28 + +-- ============================================================================= +-- 1. 宿舍违纪记录表 (xg_dorm_violation) - 唯一核心表 +-- ============================================================================= +DROP TABLE IF EXISTS `xg_dorm_violation`; +CREATE TABLE `xg_dorm_violation` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '违纪记录ID(主键)', + + -- 学生信息(冗余存储,提高查询性能) + `student_id` bigint(20) NOT NULL COMMENT '学生ID', + `student_name` varchar(100) NOT NULL COMMENT '学生姓名', + `student_no` varchar(50) NOT NULL COMMENT '学号', + `college_id` bigint(20) DEFAULT NULL COMMENT '学院ID', + `college_name` varchar(100) DEFAULT NULL COMMENT '学院名称', + `major_id` bigint(20) DEFAULT NULL COMMENT '专业ID', + `major_name` varchar(100) DEFAULT NULL COMMENT '专业名称', + `class_id` bigint(20) DEFAULT NULL COMMENT '班级ID', + `class_name` varchar(100) DEFAULT NULL COMMENT '班级名称', + + -- 宿舍位置信息(复用现有宿舍管理结构) + `campus_id` bigint(20) DEFAULT NULL COMMENT '校区ID', + `campus_name` varchar(100) DEFAULT NULL COMMENT '校区名称', + `area_id` bigint(20) DEFAULT NULL COMMENT '宿舍区域ID', + `area_name` varchar(100) DEFAULT NULL COMMENT '宿舍区域名称', + `building_id` bigint(20) NOT NULL COMMENT '宿舍楼ID', + `building_name` varchar(100) NOT NULL COMMENT '宿舍楼名称', + `room_id` bigint(20) NOT NULL COMMENT '宿舍房间ID', + `room_name` varchar(50) NOT NULL COMMENT '房间名称', + `bed_id` bigint(20) DEFAULT NULL COMMENT '床位ID', + `bed_name` varchar(20) DEFAULT NULL COMMENT '床位名称', + + -- 违纪基本信息 + `violation_type` varchar(50) NOT NULL COMMENT '违纪类型', + `violation_level` char(1) NOT NULL COMMENT '违纪等级:1轻微 2一般 3严重 4特别严重', + `violation_time` datetime NOT NULL COMMENT '违纪发生时间', + `violation_description` text NOT NULL COMMENT '违纪行为描述', + + -- 附加信息 + `involved_students` text DEFAULT NULL COMMENT '涉及其他学生信息(JSON格式)', + -- 附件信息(OSS存储) + `attachment_oss_ids` text DEFAULT NULL COMMENT '附件OSS ID列表(逗号分隔)', + + -- 系统字段 + `deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + + PRIMARY KEY (`id`), + KEY `idx_student_id` (`student_id`), + KEY `idx_student_no` (`student_no`), + KEY `idx_college_id` (`college_id`), + KEY `idx_building_id` (`building_id`), + KEY `idx_room_id` (`room_id`), + KEY `idx_violation_type` (`violation_type`), + KEY `idx_violation_time` (`violation_time`), + KEY `idx_violation_level` (`violation_level`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_deleted` (`deleted`), + + -- 复合索引(统计查询优化) + KEY `idx_college_time` (`college_id`, `violation_time`), + KEY `idx_building_level` (`building_id`, `violation_level`), + KEY `idx_student_time` (`student_id`, `violation_time`), + KEY `idx_type_level` (`violation_type`, `violation_level`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='宿舍违纪记录表'; + +-- ============================================================================= +-- 数据库建表脚本执行完成提示 +-- ============================================================================= +-- 宿舍违纪记录管理数据库建表脚本执行完成(超简化版) +-- +-- 创建表: +-- 1. xg_dorm_violation - 宿舍违纪记录主表(包含所有核心功能) +-- +-- 设计特点: +-- 1. 单表设计,降低复杂度 +-- 2. 违纪类型使用字典管理 +-- 3. 附件使用OSS ID存储 +-- 4. 冗余存储关键信息,提高查询性能 +-- 5. 完整的索引设计,支持高效查询和统计 +-- +-- 注意事项: +-- 1. 违纪类型使用sys_dict_data表管理 +-- 2. 附件OSS ID使用逗号分隔存储 +-- 3. 所有字段遵循项目统一规范 +-- 4. 支持多租户和逻辑删除 \ No newline at end of file diff --git a/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据模型设计.md b/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据模型设计.md new file mode 100644 index 00000000..32115022 --- /dev/null +++ b/docs/设计文档/database/学工管理-宿舍管理/宿舍违纪管理数据模型设计.md @@ -0,0 +1,363 @@ +# 宿舍违纪记录管理数据模型设计文档(超简化版) + +## 📋 文档信息 + +| 项目 | 信息 | +|------|------| +| **项目名称** | 校园管理系统 - 宿舍违纪记录管理模块 | +| **数据库版本** | MySQL 8.0+ | +| **文档版本** | V2.0.0(超简化版) | +| **创建时间** | 2025-01-28 | +| **创建人员** | 数据库设计团队 | +| **审核状态** | 待审核 | + +## 🎯 设计目标 + +### 核心目标 +- 建立最简化的宿舍违纪记录管理系统 +- 使用单表存储所有核心数据,降低系统复杂度 +- 违纪类型通过字典管理,便于维护和扩展 +- 附件通过OSS ID字符串存储,简化文件管理 + +### 设计原则 +- **极简设计**:单表设计,减少表关联复杂度 +- **字典驱动**:违纪类型使用系统字典管理 +- **OSS存储**:附件使用阿里云OSS,表中仅存储ID +- **查询优化**:通过索引设计支持高效查询和统计 +- **性能第一**:冗余存储关键信息,避免复杂JOIN + +## 🗄️ 数据库表设计 + +### 唯一核心表 + +#### 宿舍违纪记录表 (xg_dorm_violation) +**表说明**:违纪记录管理的唯一核心表,包含所有功能 + +**核心字段组**: + +##### 📊 学生信息(冗余存储) +- **student_id**, **student_name**, **student_no**:学生基本信息 +- **college_id**, **college_name**:学院信息 +- **class_id**, **class_name**:班级信息 + +##### 🏠 宿舍位置信息(充分复用现有结构) +- **campus_id**, **campus_name**:校区信息 +- **area_id**, **area_name**:宿舍区域信息 +- **building_id**, **building_name**:宿舍楼信息(必填) +- **room_id**, **room_no**:房间信息(必填) +- **bed_id**, **bed_no**:床位信息 + +##### 🚨 违纪基本信息 +- **violation_type_dict**:违纪类型(字典值,如WS001001) +- **violation_level**:违纪等级(1轻微 2一般 3严重 4特别严重) +- **violation_time**:违纪发生时间 +- **violation_description**:违纪行为描述 +- **violation_location**:违纪具体位置 + +##### 🔍 发现信息 +- **discoverer_type**:发现人类型(1宿管员 2学生 3巡查员 4其他) +- **discoverer_id**, **discoverer_name**:发现人信息 +- **discovery_method**:发现方式(1日常检查 2举报 3巡查 4其他) +- **discovery_time**:发现时间 + +##### 📋 记录状态和评分 +- **record_status**:记录状态(1已记录 2已确认 3已归档) +- **severity_score**:严重程度评分(0-100) +- **is_repeat**, **repeat_count**:重复违纪信息 + +##### 📎 附件信息(OSS存储) +- **attachment_oss_ids**:附件OSS ID列表(逗号分隔字符串) +- **attachment_count**:附件数量 + +**设计特点**: +- **单表设计**:所有功能集中在一张表,减少复杂度 +- **冗余存储**:关键信息冗余存储,避免复杂JOIN查询 +- **字典管理**:违纪类型使用系统字典,便于维护 +- **OSS集成**:附件使用阿里云OSS存储,表中仅存ID +- **索引优化**:完整的索引设计,支持高效查询 + +### 🔗 与现有系统的关系 + +#### 宿舍管理系统集成 +违纪记录管理充分复用现有宿舍管理数据结构: + +```sql +-- 关联关系(查询时关联,表结构独立) +xg_dorm_violation.campus_id -> xg_dorm_campus.id +xg_dorm_violation.area_id -> xg_dorm_area.id +xg_dorm_violation.building_id -> xg_dorm_building.id +xg_dorm_violation.room_id -> xg_dorm_room.id +xg_dorm_violation.bed_id -> xg_dorm_bed.id +xg_dorm_violation.student_id -> xg_dorm_bed_student.student_id +``` + +#### 系统字典集成 +违纪类型通过系统字典管理: + +```sql +-- 字典关联 +xg_dorm_violation.violation_type_dict -> sys_dict_data.dict_value +-- 其中 dict_type = 'dorm_violation_type' +``` + +#### 用户系统集成 +发现人和处理人信息关联: + +```sql +-- 关联关系 +xg_dorm_violation.discoverer_id -> sys_user.user_id +xg_dorm_violation.handler_id -> sys_user.user_id +``` + +## 📊 索引设计 + +### 1. 基础查询索引 +```sql +-- 核心查询索引 +KEY `idx_student_id` (`student_id`) -- 按学生查询 +KEY `idx_student_no` (`student_no`) -- 按学号查询 +KEY `idx_college_id` (`college_id`) -- 按学院查询 +KEY `idx_building_id` (`building_id`) -- 按宿舍楼查询 +KEY `idx_room_id` (`room_id`) -- 按房间查询 +KEY `idx_violation_type` (`violation_type_dict`) -- 按违纪类型查询 +KEY `idx_violation_time` (`violation_time`) -- 按违纪时间查询 +KEY `idx_record_status` (`record_status`) -- 按记录状态查询 +KEY `idx_violation_level` (`violation_level`) -- 按违纪等级查询 +KEY `idx_is_repeat` (`is_repeat`) -- 按重复违纪查询 +``` + +### 2. 复合索引(统计优化) +```sql +-- 统计分析优化索引 +KEY `idx_college_time` (`college_id`, `violation_time`) +KEY `idx_building_level` (`building_id`, `violation_level`) +KEY `idx_student_time` (`student_id`, `violation_time`) +KEY `idx_type_level` (`violation_type_dict`, `violation_level`) +KEY `idx_status_time` (`record_status`, `create_time`) +``` + +## 📈 业务逻辑设计 + +### 1. 违纪类型字典管理 +```sql +-- 违纪类型编码规则 +WS001001 - 垃圾乱扔(卫生类) +JL001001 - 晚归违纪(纪律类) +AQ001001 - 违规用电(安全类) +WP001001 - 损坏公物(物品类) + +-- 编码格式:分类前缀 + 6位数字 +-- WS: 卫生违纪, JL: 纪律违纪, AQ: 安全违纪, WP: 物品违纪 +``` + +### 2. 附件OSS存储 +```sql +-- 附件ID存储格式 +attachment_oss_ids = "oss_id_1,oss_id_2,oss_id_3" + +-- 解析方式 +String[] ossIds = attachmentOssIds.split(","); +``` + +### 3. 违纪等级评分机制 +```sql +-- 违纪等级与评分对应 +'1' (轻微): 0-20分 +'2' (一般): 21-40分 +'3' (严重): 41-70分 +'4' (特别严重): 71-100分 +``` + +### 4. 记录状态流转 +```sql +-- 简化状态流转 +'1' (已记录) -> '2' (已确认) -> '3' (已归档) +``` + +### 5. 重复违纪检测 +```sql +-- 检测逻辑 +同一学生 + 相同违纪类型 + 时间窗口内 = 重复违纪 +时间窗口: 当前学期或最近6个月 +``` + +## 📋 数据字典 + +### 核心字典类型(5个) + +| 字典类型 | 字典名称 | 说明 | +|---------|---------|------| +| dorm_violation_type | 宿舍违纪类型 | 12种违纪类型,按分类前缀编码 | +| dorm_violation_level | 违纪等级 | 轻微、一般、严重、特别严重 | +| dorm_discoverer_type | 发现人类型 | 宿管员、学生、巡查员、其他 | +| dorm_discovery_method | 发现方式 | 日常检查、举报、巡查、其他 | +| dorm_record_status | 违纪记录状态 | 已记录、已确认、已归档 | + +### 违纪类型详细清单 + +#### 🧹 卫生违纪类(WS) +- **WS001001** - 垃圾乱扔:在宿舍内外乱扔垃圾 +- **WS001002** - 床铺不整:床铺整理不规范 +- **WS001003** - 物品摆放混乱:个人物品摆放不规范 + +#### ⏰ 纪律违纪类(JL) +- **JL001001** - 晚归违纪:超过规定时间归宿 +- **JL001002** - 噪音扰民:在休息时间制造噪音 +- **JL001003** - 夜不归宿:整夜未在宿舍住宿 + +#### ⚠️ 安全违纪类(AQ) +- **AQ001001** - 违规用电:使用违规电器或私拉电线 +- **AQ001002** - 吸烟违纪:在宿舍内吸烟 +- **AQ001003** - 明火使用:在宿舍内使用明火 + +#### 🛠️ 物品违纪类(WP) +- **WP001001** - 损坏公物:故意或过失损坏公共物品 +- **WP001002** - 私改设施:私自改动宿舍设施 +- **WP001003** - 盗用他人物品:盗用或损坏他人物品 + +## 🚀 性能优化 + +### 1. 查询优化策略 +- **索引覆盖**:主要查询字段都有对应索引 +- **复合索引**:统计查询使用复合索引优化 +- **冗余字段**:避免复杂JOIN,直接查询单表 +- **分页优化**:使用limit offset优化大数据量查询 + +### 2. 存储优化策略 +- **OSS集成**:附件文件外部存储,减轻数据库压力 +- **字符串存储**:附件ID使用逗号分隔,简化存储结构 +- **数据压缩**:JSON格式存储复杂字段(如涉及其他学生信息) + +### 3. 缓存策略 +- **字典缓存**:违纪类型等字典数据Redis缓存 +- **热点数据**:常用查询结果缓存 +- **统计缓存**:定时更新统计数据缓存 + +## 📊 统计分析功能 + +### 1. 基础统计 +- 按时间段的违纪记录统计 +- 按学院、宿舍楼的违纪分布 +- 按违纪类型的频次统计 +- 违纪等级分布分析 + +### 2. 趋势分析 +- 违纪记录的时间趋势 +- 重复违纪学生识别 +- 违纪热点区域分析 +- 违纪类型变化趋势 + +### 3. 对比分析 +- 不同学院违纪情况对比 +- 不同宿舍楼违纪率对比 +- 不同时间段违纪情况对比 + +## 🔒 数据安全设计 + +### 1. 敏感信息保护 +- 学生身份信息的访问权限控制 +- 违纪记录的查看权限分级 +- OSS附件的安全访问控制 + +### 2. 审计追踪 +- 完整的操作日志记录 +- 数据变更的版本追踪 + +### 3. 数据备份 +- 违纪记录的定期备份 +- OSS附件的安全存储 +- 历史数据的归档管理 + +## 📝 变更记录 + +| 版本 | 日期 | 变更内容 | 变更人 | +|------|------|----------|--------| +| V2.0.0 | 2025-01-28 | 超简化版设计:单表设计,违纪类型使用字典,附件使用OSS ID | 数据库设计团队 | +| V1.0.0 | 2025-01-28 | 简化版初始创建,专注违纪记录功能,移除处罚和审核模块 | 数据库设计团队 | + +## 📄 相关文档 + +| 文档名称 | 文档路径 | 说明 | +|---------|---------|------| +| 建表脚本 | `宿舍违纪管理数据库建表脚本.sql` | 超简化版数据库建表SQL(仅1张表) | +| 数据字典 | `宿舍违纪管理数据字典配置.sql` | 超简化版字典配置(5个字典类型) | +| 宿舍管理设计 | `宿舍管理数据库设计.md` | 现有宿舍管理数据模型 | +| 数据库规范 | `../mysql-database-standard.md` | 项目数据库设计规范 | + +## 🎯 功能特点 + +### 1. 超简化设计理念 +- **单表设计**:所有功能集中在一张表,极大降低复杂度 +- **字典驱动**:违纪类型通过系统字典管理,便于维护和扩展 +- **OSS集成**:附件使用云存储,表中仅存储ID,简化文件管理 +- **性能优先**:通过冗余存储避免复杂关联查询 + +### 2. 核心功能 +- 违纪记录的增删改查 +- 违纪类型的字典化管理 +- 重复违纪的自动检测 +- 附件文件的OSS存储管理 +- 多维度的统计分析 + +### 3. 系统集成 +- 充分复用现有宿舍管理数据结构 +- 与用户管理系统无缝集成 +- 与系统字典管理完美融合 +- 遵循项目统一的数据库设计规范 + +## 🎯 技术优势 + +### 1. 开发效率 +- **单表操作**:减少复杂的多表关联查询 +- **字典管理**:违纪类型维护简单,无需修改表结构 +- **OSS集成**:文件管理交给专业云服务,简化开发 + +### 2. 运维效率 +- **部署简单**:只需创建一张表和几个字典 +- **维护容易**:数据结构简单,问题排查快速 +- **扩展灵活**:新增违纪类型只需添加字典项 + +### 3. 性能优势 +- **查询高效**:单表查询,避免复杂JOIN +- **索引优化**:针对性的索引设计,支持高效统计 +- **存储优化**:大文件外部存储,减轻数据库压力 + +## 🎯 后续扩展 + +### 1. 功能扩展方向 +- 违纪预警和风险评估 +- 违纪数据的智能分析 +- 与学生综合评价系统的集成 +- 移动端违纪上报功能 + +### 2. 性能扩展方向 +- 大数据量的分表策略 +- 实时统计和报表功能 +- 违纪图片的AI识别功能 +- 多校区数据的同步机制 + +### 3. 管理扩展方向 +- 违纪数据的导出功能 +- 与家长通知系统的对接(如需要) +- 违纪数据的开放API接口 +- 历史数据的分析报告生成 + +## 💡 使用建议 + +### 1. 开发建议 +- 使用单表DAO模式,简化数据访问层 +- 违纪类型从字典缓存中获取,提高性能 +- 附件上传直接到OSS,异步更新记录表 +- 统计查询优先使用复合索引 + +### 2. 维护建议 +- 定期清理OSS中的孤立文件 +- 监控单表数据量,适时进行数据归档 +- 定期更新字典缓存,保持数据一致性 +- 建立完善的数据备份和恢复机制 + +### 3. 扩展建议 +- 如需处罚功能,可单独增加处罚表关联违纪记录 +- 如需工作流,可集成Warm-Flow框架 +- 如需复杂统计,可考虑数据仓库方案 +- 如需移动端,优先考虑API接口设计 \ No newline at end of file diff --git a/web/src/api/xg/xgss/dormViolation/dormViolation/index.ts b/web/src/api/xg/xgss/dormViolation/dormViolation/index.ts new file mode 100644 index 00000000..f7ed5e2a --- /dev/null +++ b/web/src/api/xg/xgss/dormViolation/dormViolation/index.ts @@ -0,0 +1,153 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { + DormViolationVO, + DormViolationForm, + DormViolationQuery, + StudentOptionVO, + StudentOptionQuery, + CampusOptionVO, + AreaOptionVO, + BuildingOptionVO, + RoomOptionVO, + BedOptionVO +} from '@/api/xg/xgss/dormViolation/dormViolation/types'; + +/** + * 查询宿舍违纪记录列表 + * @param query + * @returns {*} + */ + +export const listDormViolation = (query?: DormViolationQuery): AxiosPromise => { + return request({ + url: '/dormViolation/dormViolation/list', + method: 'get', + params: query + }); +}; + +/** + * 查询宿舍违纪记录详细 + * @param id + */ +export const getDormViolation = (id: string | number): AxiosPromise => { + return request({ + url: '/dormViolation/dormViolation/' + id, + method: 'get' + }); +}; + +/** + * 新增宿舍违纪记录 + * @param data + */ +export const addDormViolation = (data: DormViolationForm) => { + return request({ + url: '/dormViolation/dormViolation', + method: 'post', + data: data + }); +}; + +/** + * 修改宿舍违纪记录 + * @param data + */ +export const updateDormViolation = (data: DormViolationForm) => { + return request({ + url: '/dormViolation/dormViolation', + method: 'put', + data: data + }); +}; + +/** + * 删除宿舍违纪记录 + * @param id + */ +export const delDormViolation = (id: string | number | Array) => { + return request({ + url: '/dormViolation/dormViolation/' + id, + method: 'delete' + }); +}; + +/** + * 获取学生选择器选项列表(支持按学号、姓名检索) + * @param query 查询参数 + * @returns 学生选项列表 + */ +export const getStudentOptions = (query?: StudentOptionQuery): AxiosPromise<{ + total: number; + rows: StudentOptionVO[]; +}> => { + return request({ + url: '/holidayStay/holidayStay/studentOptions', + method: 'get', + params: query + }); +}; + +/** + * 获取校区选项列表 + * @returns 校区选项列表 + */ +export const getCampusOptions = (): AxiosPromise => { + return request({ + url: '/xqxx/dormCampus/list', + method: 'get' + }); +}; + +/** + * 获取指定校区的宿舍区选项列表 + * @param campusId 校区ID + * @returns 宿舍区选项列表 + */ +export const getAreaOptions = (campusId?: string | number): AxiosPromise => { + return request({ + url: '/ssqxx/dormArea/list', + method: 'get', + params: campusId ? { campusId } : undefined + }); +}; + +/** + * 获取指定宿舍区的宿舍楼选项列表 + * @param areaId 宿舍区ID + * @returns 宿舍楼选项列表 + */ +export const getBuildingOptions = (areaId?: string | number): AxiosPromise => { + return request({ + url: '/sslxx/dormBuilding/list', + method: 'get', + params: areaId ? { areaId } : undefined + }); +}; + +/** + * 获取指定宿舍楼的房间选项列表 + * @param buildingId 宿舍楼ID + * @returns 房间选项列表 + */ +export const getRoomOptions = (buildingId?: string | number): AxiosPromise => { + return request({ + url: '/xgss/dormRoom/list', + method: 'get', + params: buildingId ? { buildingId } : undefined + }); +}; + +/** + * 获取指定房间的床位选项列表 + * @param roomId 房间ID + * @returns 床位选项列表 + */ +export const getBedOptions = (roomId?: string | number): AxiosPromise => { + return request({ + url: '/dormbed/dormBed/list', + method: 'get', + params: roomId ? { roomId } : undefined + }); +}; diff --git a/web/src/api/xg/xgss/dormViolation/dormViolation/types.ts b/web/src/api/xg/xgss/dormViolation/dormViolation/types.ts new file mode 100644 index 00000000..6d4452f7 --- /dev/null +++ b/web/src/api/xg/xgss/dormViolation/dormViolation/types.ts @@ -0,0 +1,483 @@ +export interface DormViolationVO { + /** + * 违纪记录ID(主键) + */ + id: string | number; + + /** + * 学生ID + */ + studentId: string | number; + + /** + * 学生姓名 + */ + studentName: string; + + /** + * 学号 + */ + studentNo: string; + + /** + * 学院ID + */ + collegeId: string | number; + + /** + * 学院名称 + */ + collegeName: string; + + /** + * 专业ID + */ + majorId: string | number; + + /** + * 专业名称 + */ + majorName: string; + + /** + * 班级ID + */ + classId: string | number; + + /** + * 班级名称 + */ + className: string; + + /** + * 校区ID + */ + campusId: string | number; + + /** + * 校区名称 + */ + campusName: string; + + /** + * 宿舍区域ID + */ + areaId: string | number; + + /** + * 宿舍区域名称 + */ + areaName: string; + + /** + * 宿舍楼ID + */ + buildingId: string | number; + + /** + * 宿舍楼名称 + */ + buildingName: string; + + /** + * 宿舍房间ID + */ + roomId: string | number; + + /** + * 房间名称 + */ + roomName: string; + + /** + * 床位ID + */ + bedId: string | number; + + /** + * 床位名称 + */ + bedName: string; + + /** + * 违纪类型 + */ + violationType: string; + + /** + * 违纪等级:1轻微 2一般 3严重 4特别严重 + */ + violationLevel: string; + + /** + * 违纪发生时间 + */ + violationTime: string; + + /** + * 违纪行为描述 + */ + violationDescription: string; + + /** + * 涉及其他学生id(逗号分隔) + */ + involvedStudents: string; + + /** + * 附件OSS ID列表(逗号分隔) + */ + attachmentOssIds: string | number; + + /** + * 删除标志(0代表存在 1代表删除) + */ + deleted: string; + + /** + * 备注 + */ + remark: string; + +} + +export interface DormViolationForm extends BaseEntity { + /** + * 违纪记录ID(主键) + */ + id?: string | number; + + /** + * 学生ID + */ + studentId?: string | number; + + /** + * 学生姓名 + */ + studentName?: string; + + /** + * 学号 + */ + studentNo?: string; + + /** + * 学院ID + */ + collegeId?: string | number; + + /** + * 学院名称 + */ + collegeName?: string; + + /** + * 专业ID + */ + majorId?: string | number; + + /** + * 专业名称 + */ + majorName?: string; + + /** + * 班级ID + */ + classId?: string | number; + + /** + * 班级名称 + */ + className?: string; + + /** + * 校区ID + */ + campusId?: string | number; + + /** + * 校区名称 + */ + campusName?: string; + + /** + * 宿舍区域ID + */ + areaId?: string | number; + + /** + * 宿舍区域名称 + */ + areaName?: string; + + /** + * 宿舍楼ID + */ + buildingId?: string | number; + + /** + * 宿舍楼名称 + */ + buildingName?: string; + + /** + * 宿舍房间ID + */ + roomId?: string | number; + + /** + * 房间名称 + */ + roomName?: string; + + /** + * 床位ID + */ + bedId?: string | number; + + /** + * 床位名称 + */ + bedName?: string; + + /** + * 违纪类型 + */ + violationType?: string; + + /** + * 违纪等级:1轻微 2一般 3严重 4特别严重 + */ + violationLevel?: string; + + /** + * 违纪发生时间 + */ + violationTime?: string; + + /** + * 违纪行为描述 + */ + violationDescription?: string; + + /** + * 涉及其他学生id(逗号分隔) + */ + involvedStudents?: string; + + /** + * 附件OSS ID列表(逗号分隔) + */ + attachmentOssIds?: string | number; + + /** + * 删除标志(0代表存在 1代表删除) + */ + deleted?: string; + + /** + * 备注 + */ + remark?: string; + +} + +export interface DormViolationQuery extends PageQuery { + + /** + * 学生ID + */ + studentId?: string | number; + + /** + * 学生姓名 + */ + studentName?: string; + + /** + * 学号 + */ + studentNo?: string; + + /** + * 学院ID + */ + collegeId?: string | number; + + /** + * 学院名称 + */ + collegeName?: string; + + /** + * 专业ID + */ + majorId?: string | number; + + /** + * 专业名称 + */ + majorName?: string; + + /** + * 班级ID + */ + classId?: string | number; + + /** + * 班级名称 + */ + className?: string; + + /** + * 校区ID + */ + campusId?: string | number; + + /** + * 校区名称 + */ + campusName?: string; + + /** + * 宿舍区域ID + */ + areaId?: string | number; + + /** + * 宿舍区域名称 + */ + areaName?: string; + + /** + * 宿舍楼ID + */ + buildingId?: string | number; + + /** + * 宿舍楼名称 + */ + buildingName?: string; + + /** + * 宿舍房间ID + */ + roomId?: string | number; + + /** + * 房间名称 + */ + roomName?: string; + + /** + * 床位ID + */ + bedId?: string | number; + + /** + * 床位名称 + */ + bedName?: string; + + /** + * 违纪类型 + */ + violationType?: string; + + /** + * 违纪等级:1轻微 2一般 3严重 4特别严重 + */ + violationLevel?: string; + + /** + * 违纪发生时间 + */ + violationTime?: string; + + /** + * 违纪行为描述 + */ + violationDescription?: string; + + /** + * 涉及其他学生id(逗号分隔) + */ + involvedStudents?: string; + + /** + * 附件OSS ID列表(逗号分隔) + */ + attachmentOssIds?: string | number; + + /** + * 删除标志(0代表存在 1代表删除) + */ + deleted?: string; + + /** + * 日期范围参数 + */ + params?: any; +} + +// 学生选择相关类型 +export interface StudentOptionVO { + id: string | number; + name: string; + studentNo: string; + gender: string; + collegeId?: string | number; + collegeName?: string; + majorId?: string | number; + majorName?: string; + classId?: string | number; + className?: string; + phone?: string; + dormInfo?: { + campusId?: string | number; + campusName?: string; + areaId?: string | number; + areaName?: string; + buildingId?: string | number; + buildingName?: string; + roomId?: string | number; + roomName?: string; + bedId?: string | number; + bedName?: string; + }; +} + +export interface StudentOptionQuery extends PageQuery { + keyword?: string; +} + +// 宿舍级联选择相关类型 +export interface CampusOptionVO { + id: string | number; + campusName: string; +} + +export interface AreaOptionVO { + id: string | number; + areaName: string; +} + +export interface BuildingOptionVO { + id: string | number; + buildingName: string; +} + +export interface RoomOptionVO { + id: string | number; + roomName: string; +} + +export interface BedOptionVO { + id: string | number; + bedName: string; +} + + + diff --git a/web/src/views/xg/xgss/dormViolation/dormViolation/index.vue b/web/src/views/xg/xgss/dormViolation/dormViolation/index.vue new file mode 100644 index 00000000..9756eb8b --- /dev/null +++ b/web/src/views/xg/xgss/dormViolation/dormViolation/index.vue @@ -0,0 +1,1695 @@ + + + + +