初始化提交

This commit is contained in:
liweijie
2026-08-18 09:49:02 +08:00
commit 5a74ab0b0d
1102 changed files with 119160 additions and 0 deletions
Binary file not shown.
+38
View File
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.roomroot</groupId>
<artifactId>roomroot</artifactId>
<version>3.9.2</version>
</parent>
<artifactId>roomroot-jwgl</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 核心框架模块(包含 security, validation, mybatis-plus, druid, poi, web 等) -->
<dependency>
<groupId>com.roomroot</groupId>
<artifactId>roomroot-framework</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,71 @@
package com.roomroot.jwgl.config;
import com.roomroot.jwgl.interceptor.AccountManagementAuthorizationInterceptor;
import com.roomroot.jwgl.interceptor.OperationLogInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 在线账户状态和账户管理权限 Web MVC 配置。
*
* <p>该配置对已有在线会话执行账户状态校验,同时保持普通匿名请求的原有访问规则;
* 账户管理路径继续执行超级管理员权限校验,并在校验通过后采集操作日志上下文。</p>
*/
@Configuration
public class AccountManagementWebMvcConfig implements WebMvcConfigurer {
/**
* 账户管理身份和权限拦截器。
*/
private final AccountManagementAuthorizationInterceptor
authorizationInterceptor;
/**
* 操作日志统一请求采集拦截器。
*/
private final OperationLogInterceptor operationLogInterceptor;
/**
* 构造账户管理和操作日志统一 Web MVC 配置。
*
* @param authorizationInterceptor 账户管理身份和权限拦截器
* @param operationLogInterceptor 操作日志统一请求采集拦截器
*/
public AccountManagementWebMvcConfig(
AccountManagementAuthorizationInterceptor
authorizationInterceptor,
OperationLogInterceptor operationLogInterceptor) {
// 第一步:保存账户管理专用拦截器,供 MVC 注册阶段使用。
this.authorizationInterceptor = authorizationInterceptor;
// 第二步:保存操作日志采集拦截器,供 MVC 注册阶段使用。
this.operationLogInterceptor = operationLogInterceptor;
}
/**
* 注册账户状态校验、账户管理权限和操作日志采集规则。
*
* @param registry Spring MVC 拦截器注册器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
/*
* 第一步:注册账户管理鉴权拦截器。
* 第二步:覆盖全部 Controller 请求,使停用或已合并账户不能绕过
* 账户管理路径继续访问其他业务接口。
* 第三步:拦截器内部会放行没有 Servlet 会话的普通匿名请求,
* 因此不会改变项目现有公开接口的访问方式。
*/
// registry.addInterceptor(authorizationInterceptor)
// .addPathPatterns("/**");
/*
* 第四步:在账户状态和账户管理权限校验通过后采集日志上下文。
* 第五步:覆盖全部 Controller 请求,由采集拦截器自行跳过
* 非 Controller 处理器和没有有效登录记录的请求。
*/
registry.addInterceptor(operationLogInterceptor)
.addPathPatterns("/**");
}
}
@@ -0,0 +1,31 @@
package com.roomroot.jwgl.dto;
import com.roomroot.jwgl.entity.XYJXQJB;
import lombok.Data;
import java.util.List;
/**
* 请假DTO
* <p>
* 包含学员教学请假表实体、实施_课堂编号列表、学员编号
* </p>
*/
@Data
public class LeaveDTO {
/**
* 学员教学请假表实体
*/
private XYJXQJB leave;
/**
* 实施_课堂编号列表
*/
private List<String> ssktBhList;
/**
* 学员编号
*/
private String xybh;
}
@@ -0,0 +1,79 @@
package com.roomroot.jwgl.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* 请假查询DTO
* <p>
* 支持按XYJXQJB字段查询,起始时间、结束时间、创建时间支持范围查询
* </p>
*/
@Data
public class LeaveQueryDTO {
/**
* 编号
*/
private String bh;
/**
* 名称
*/
private String mc;
/**
* 状态
*/
private String zt;
/**
* 学员队编号
*/
private String xydbh;
/**
* 起始时间-开始
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime qssjStart;
/**
* 起始时间-结束
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime qssjEnd;
/**
* 结束时间-开始
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime jssjStart;
/**
* 结束时间-结束
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime jssjEnd;
/**
* 创建时间-开始
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime cjsjStart;
/**
* 创建时间-结束
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime cjsjEnd;
}
@@ -0,0 +1,85 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import static com.roomroot.jwgl.utils.AccountManagementConstants.PASSWORD_COMPLEXITY_PATTERN;
/**
* 账户新增参数。
*/
@Data
public class AccountCreateDTO {
/**
* 登录账号。
*/
@NotBlank(message = "登录账号不能为空")
@Size(max = 50, message = "登录账号不能超过50个字符")
private String loginName;
/**
* 用户姓名。
*/
@NotBlank(message = "用户姓名不能为空")
@Size(max = 50, message = "用户姓名不能超过50个字符")
private String userName;
/**
* 初始密码。
*/
@NotBlank(message = "初始密码不能为空")
@Size(min = 8, max = 50, message = "初始密码长度必须在8到50个字符之间")
@Pattern(
regexp = PASSWORD_COMPLEXITY_PATTERN,
message = "初始密码必须包含大写字母、小写字母、数字和特殊字符,且不能包含空白字符")
private String password;
/**
* 统一身份账号。
*/
@Size(max = 50, message = "统一账号不能超过50个字符")
private String unifiedAccount;
/**
* 联系电话。
*/
@Size(max = 20, message = "联系电话不能超过20个字符")
private String phone;
/**
* 身份证号码。
*/
@Size(max = 50, message = "身份证号码不能超过50个字符")
private String idCard;
/**
* 密码提示问题。
*/
@Size(max = 50, message = "密码提示问题不能超过50个字符")
private String passwordQuestion;
/**
* 密码提示答案。
*/
@Size(max = 50, message = "密码提示答案不能超过50个字符")
private String passwordAnswer;
/**
* 自我介绍。
*/
@Size(max = 2000, message = "自我介绍不能超过2000个字符")
private String introduction;
/**
* 新账户需要绑定的角色和数据范围;允许为空。
*/
@Valid
private List<AccountRoleAssignmentDTO> roles = new ArrayList<>();
}
@@ -0,0 +1,26 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 账户停用参数。
*/
@Data
public class AccountDisableDTO {
/**
* 登录信息编号。
*/
@NotBlank(message = "账户编号不能为空")
@Size(max = 36, message = "账户编号不能超过36个字符")
private String id;
/**
* 停用原因。
*/
@Size(max = 200, message = "停用原因不能超过200个字符")
private String reason;
}
@@ -0,0 +1,20 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 账户唯一编号参数。
*/
@Data
public class AccountIdDTO {
/**
* 登录信息编号。
*/
@NotBlank(message = "账户编号不能为空")
@Size(max = 36, message = "账户编号不能超过36个字符")
private String id;
}
@@ -0,0 +1,44 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 本地账户密码登录参数。
*/
@Data
public class AccountLoginDTO {
/**
* 登录账号。
*/
@NotBlank(message = "登录账号不能为空")
@Size(max = 50, message = "登录账号不能超过50个字符")
private String loginName;
/**
* 原始登录密码。
*/
@NotBlank(message = "登录密码不能为空")
@Size(min = 8, max = 50, message = "登录密码长度必须在8到50个字符之间")
private String password;
/**
* 当前登录验证码编号。
*
* <p>该编号由验证码获取接口生成,用于确认提交的验证码
* 与当前 Servlet Session 中最近一次生成的验证码一致。</p>
* <p>可选字段,为空时跳过验证码校验。</p>
*/
@Size(max = 36, message = "验证码编号不能超过36个字符")
private String captchaId;
/**
* 用户输入的登录验证码。
* <p>可选字段,为空时跳过验证码校验。</p>
*/
@Size(min = 4, max = 4, message = "验证码必须为4个字符")
private String captchaCode;
}
@@ -0,0 +1,32 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 当前登录账户的登录信息和登录历史查询参数。
*
* <p>账户编号不由客户端提交,业务层会根据当前 Servlet Session
* 对应的在线记录取得真实账户编号。</p>
*/
@Data
public class AccountLoginInformationQueryDTO {
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条,单页最多100条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(value = 100, message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
}
@@ -0,0 +1,33 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 账户合并参数。
*/
@Data
public class AccountMergeDTO {
/**
* 被合并并最终停用的源账户编号。
*/
@NotBlank(message = "源账户编号不能为空")
@Size(max = 36, message = "源账户编号不能超过36个字符")
private String sourceAccountId;
/**
* 接收角色和数据范围的目标账户编号。
*/
@NotBlank(message = "目标账户编号不能为空")
@Size(max = 36, message = "目标账户编号不能超过36个字符")
private String targetAccountId;
/**
* 合并原因。
*/
@Size(max = 200, message = "合并原因不能超过200个字符")
private String reason;
}
@@ -0,0 +1,43 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import static com.roomroot.jwgl.utils.AccountManagementConstants.PASSWORD_COMPLEXITY_PATTERN;
/**
* 当前登录账户修改密码参数。
*/
@Data
public class AccountPasswordChangeDTO {
/**
* 当前正在使用的原密码。
*/
@NotBlank(message = "原密码不能为空")
@Size(min = 8, max = 50, message = "原密码长度必须在8到50个字符之间")
private String currentPassword;
/**
* 修改后的新密码。
*/
@NotBlank(message = "新密码不能为空")
@Size(min = 8, max = 50, message = "新密码长度必须在8到50个字符之间")
@Pattern(
regexp = PASSWORD_COMPLEXITY_PATTERN,
message = "新密码必须包含大写字母、小写字母、数字和特殊字符,且不能包含空白字符")
private String newPassword;
/**
* 页面再次输入的新密码。
*/
@NotBlank(message = "确认密码不能为空")
@Size(min = 8, max = 50, message = "确认密码长度必须在8到50个字符之间")
@Pattern(
regexp = PASSWORD_COMPLEXITY_PATTERN,
message = "确认密码必须包含大写字母、小写字母、数字和特殊字符,且不能包含空白字符")
private String confirmPassword;
}
@@ -0,0 +1,34 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import static com.roomroot.jwgl.utils.AccountManagementConstants.PASSWORD_COMPLEXITY_PATTERN;
/**
* 账户密码重置参数。
*/
@Data
public class AccountPasswordResetDTO {
/**
* 登录信息编号。
*/
@NotBlank(message = "账户编号不能为空")
@Size(max = 36, message = "账户编号不能超过36个字符")
private String id;
/**
* 重置后的密码。
*/
@NotBlank(message = "重置密码不能为空")
@Size(min = 8, max = 50, message = "重置密码长度必须在8到50个字符之间")
@Pattern(
regexp = PASSWORD_COMPLEXITY_PATTERN,
message = "重置密码必须包含大写字母、小写字母、数字和特殊字符,且不能包含空白字符")
private String newPassword;
}
@@ -0,0 +1,53 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 账户列表查询参数。
*/
@Data
public class AccountQueryDTO {
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条,单页最多100条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(value = 100, message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 查询关键字,可匹配账号、姓名、统一账号、电话、身份证及角色身份。
*/
@Size(max = 50, message = "查询关键字不能超过50个字符")
private String keyword;
/**
* 启用状态;不填写时同时查询启用和停用账户。
*/
private Boolean enabled;
/**
* 角色类型;不填写时不限制账户角色。
*/
@Size(max = 40, message = "角色类型不能超过40个字符")
private String roleType;
/**
* 角色身份编号;填写后必须同时填写角色类型。
*/
@Size(max = 50, message = "角色身份编号不能超过50个字符")
private String targetId;
}
@@ -0,0 +1,27 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 账户角色和数据范围绑定参数。
*/
@Data
public class AccountRoleAssignmentDTO {
/**
* 角色类型编码。
*/
@NotBlank(message = "角色类型不能为空")
@Size(max = 40, message = "角色类型不能超过40个字符")
private String roleType;
/**
* 角色对应的人员、组织或班次身份编号。
*/
@NotBlank(message = "角色身份编号不能为空")
@Size(max = 50, message = "角色身份编号不能超过50个字符")
private String targetId;
}
@@ -0,0 +1,32 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.List;
/**
* 账户角色和数据范围整体配置参数。
*/
@Data
public class AccountRoleConfigurationDTO {
/**
* 登录信息编号。
*/
@NotBlank(message = "账户编号不能为空")
@Size(max = 36, message = "账户编号不能超过36个字符")
private String accountId;
/**
* 账户最终应保留的全部角色绑定;空集合表示清空全部角色。
*/
@Valid
@NotNull(message = "角色配置列表不能为空")
@Size(max = 500, message = "单个账户最多配置500个角色身份")
private List<AccountRoleAssignmentDTO> roles;
}
@@ -0,0 +1,51 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.*;
import lombok.Data;
/**
* 账户角色可选身份查询参数。
*/
@Data
public class AccountRoleOptionQueryDTO {
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条,单页最多100条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(value = 100, message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 需要查询的角色类型编码。
*/
@NotBlank(message = "角色类型不能为空")
@Size(max = 40, message = "角色类型不能超过40个字符")
private String roleType;
/**
* 查询关键字,可匹配身份编号、名称及数据范围。
*/
@Size(max = 50, message = "查询关键字不能超过50个字符")
private String keyword;
/**
* 是否只查询尚未绑定账户的身份。
*/
private Boolean unboundOnly;
/**
* 当前正在配置的账户编号,用于在只查未绑定身份时保留本账户已有身份。
*/
@Size(max = 36, message = "当前账户编号不能超过36个字符")
private String accountId;
}
@@ -0,0 +1,20 @@
package com.roomroot.jwgl.dto.accountmanagement;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 统一身份认证会话解析参数。
*/
@Data
public class AccountSsoSessionResolveDTO {
/**
* 校园统一身份认证生成的会话标识。
*/
@NotBlank(message = "SSO会话标识不能为空")
@Size(max = 50, message = "SSO会话标识不能超过50个字符")
private String sessionKey;
}
@@ -0,0 +1,70 @@
package com.roomroot.jwgl.dto.accountmanagement;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 账户基本信息修改参数。
*/
@Data
public class AccountUpdateDTO {
/**
* 登录信息编号。
*/
@NotBlank(message = "账户编号不能为空")
@Size(max = 36, message = "账户编号不能超过36个字符")
private String id;
/**
* 登录账号。
*/
@NotBlank(message = "登录账号不能为空")
@Size(max = 50, message = "登录账号不能超过50个字符")
private String loginName;
/**
* 用户姓名。
*/
@NotBlank(message = "用户姓名不能为空")
@Size(max = 50, message = "用户姓名不能超过50个字符")
private String userName;
/**
* 统一身份账号。
*/
@Size(max = 50, message = "统一账号不能超过50个字符")
private String unifiedAccount;
/**
* 联系电话。
*/
@Size(max = 20, message = "联系电话不能超过20个字符")
private String phone;
/**
* 身份证号码。
*/
@Size(max = 50, message = "身份证号码不能超过50个字符")
private String idCard;
/**
* 密码提示问题。
*/
@Size(max = 50, message = "密码提示问题不能超过50个字符")
private String passwordQuestion;
/**
* 密码提示答案。
*/
@Size(max = 50, message = "密码提示答案不能超过50个字符")
private String passwordAnswer;
/**
* 自我介绍。
*/
@Size(max = 2000, message = "自我介绍不能超过2000个字符")
private String introduction;
}
@@ -0,0 +1,37 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 人员隶属关系统一操作DTO。
*
* <p>通过 personnelType 区分教员/学员/机关参谋三类人员,
* 避免为每类人员单独设置接口,降低前端对接成本。</p>
*
* <p>各接口必填字段由业务层按操作类型分别校验:
* list 必填 personnelTypeassign 必填 personnelType+departmentId+personnelId
* unassign 必填 personnelType+personnelIdhistory 必填 personnelType+personnelId。</p>
*/
@Data
public class PersonnelAffiliationDTO {
/** 人员类型:TEACHER=教员 / STUDENT=学员 / DEPARTMENT_PERSONNEL=机关参谋 */
@NotBlank(message = "人员类型不能为空")
@Size(max = 50, message = "人员类型不能超过50个字符")
private String personnelType;
/** 部门/组织单元编号(教研室代号 / 学员队期编号 / 实施_机关编号) */
@Size(max = 64, message = "部门编号不能超过64个字符")
private String departmentId;
/** 人员编号(教员编号 / 学员编号 / 机关参谋编号) */
@Size(max = 64, message = "人员编号不能超过64个字符")
private String personnelId;
/** 关键字筛选(姓名/拼音) */
@Size(max = 100, message = "查询关键字不能超过100个字符")
private String keyword;
}
@@ -0,0 +1,36 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 人员异动调整专用DTO。
*
* <p>异动调整区别于普通分配:必须记录异动原因,
* 且会在人员表的"异动历史"字段追加一条历史记录。</p>
*/
@Data
public class PersonnelTransferDTO {
/** 人员类型:TEACHER / STUDENT / DEPARTMENT_PERSONNEL */
@NotBlank(message = "人员类型不能为空")
@Size(max = 50, message = "人员类型不能超过50个字符")
private String personnelType;
/** 人员编号 */
@NotBlank(message = "人员编号不能为空")
@Size(max = 64, message = "人员编号不能超过64个字符")
private String personnelId;
/** 异动后归属编号(教研室代号 / 学员队期编号 / 实施_机关编号) */
@NotBlank(message = "异动目标部门编号不能为空")
@Size(max = 64, message = "目标部门编号不能超过64个字符")
private String toDepartmentId;
/** 异动原因(强制填写,写入历史记录) */
@NotBlank(message = "异动原因不能为空")
@Size(max = 500, message = "异动原因不能超过500个字符")
private String reason;
}
@@ -0,0 +1,26 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 新增教研室隶属关系参数。
*/
@Data
public class ResearchOfficeAffiliationAddDTO {
/**
* 待关联的部别编号,对应“实施_机关.编号”。
*/
@NotBlank(message = "部别编号不能为空")
@Size(max = 36, message = "部别编号不能超过36个字符")
private String departmentId;
/**
* 待关联的教研室编号,对应“教研室表.教研室代号”。
*/
@NotBlank(message = "教研室编号不能为空")
@Size(max = 50, message = "教研室编号不能超过50个字符")
private String researchOfficeId;
}
@@ -0,0 +1,20 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 教研室隶属关系编号参数。
*/
@Data
public class ResearchOfficeAffiliationIdDTO {
/**
* 隶属关系唯一编号,对应“实施_机关_教研室.编号”。
*/
@NotBlank(message = "隶属关系编号不能为空")
@Size(max = 36, message = "隶属关系编号不能超过36个字符")
private String id;
}
@@ -0,0 +1,26 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 已隶属教研室查询参数。
*/
@Data
public class ResearchOfficeAffiliationQueryDTO {
/**
* 当前选择的部别编号。
*/
@NotBlank(message = "部别编号不能为空")
@Size(max = 36, message = "部别编号不能超过36个字符")
private String departmentId;
/**
* 教研室查询关键字,可匹配编号、名称、简称和系别。
*/
@Size(max = 100, message = "查询关键字不能超过100个字符")
private String keyword;
}
@@ -0,0 +1,18 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 教研室隶属关系页面选项查询参数。
*/
@Data
public class ResearchOfficeOptionQueryDTO {
/**
* 可选部别或未隶属教研室的查询关键字。
*/
@Size(max = 100, message = "查询关键字不能超过100个字符")
private String keyword;
}
@@ -0,0 +1,40 @@
package com.roomroot.jwgl.dto.affiliationsetting;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 教学班次隶属关系管理统一请求参数。
*
* <p>同一功能的查询、新增和解除操作共用该 DTO,
* 各接口需要的必填字段由业务层按照具体操作分别校验。</p>
*/
@Data
public class TeachingClassAffiliationDTO {
/**
* 部别编号,对应“实施_机关.编号”。
*/
@Size(max = 36, message = "部别编号不能超过36个字符")
private String departmentId;
/**
* 教学班次编号,对应“学员队表.学员队编号”。
*/
@Size(max = 50, message = "教学班次编号不能超过50个字符")
private String teachingClassId;
/**
* 查询关键字,可匹配教学班次或部别的主要展示字段。
*/
@Size(max = 100, message = "查询关键字不能超过100个字符")
private String keyword;
/**
* 在校状态筛选条件,对应“学员队表.在校状态”。
*/
@Size(max = 50, message = "在校状态不能超过50个字符")
private String status;
}
@@ -0,0 +1,29 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 调课申请-新教室参数。
* <p>
* 用于在调课申请中指定调整后的教室信息。
* </p>
*/
@Data
public class AdjustRoomDTO {
/**
* 教室编号,必填,标识调整后使用的教室。
*/
@NotBlank(message = "教室编号不能为空")
@Size(max = 50, message = "教室编号不能超过50个字符")
private String jsbh;
/**
* 备注,教室使用相关补充说明。
*/
@Size(max = 200, message = "备注不能超过200个字符")
private String bz;
}
@@ -0,0 +1,34 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 调课申请-新保障明细参数。
* <p>
* 用于在调课申请中指定调整后的教学保障提供明细。
* </p>
*/
@Data
public class AdjustSupportDTO {
/**
* 保障提供明细编号,必填,关联保障提供主表。
*/
@NotBlank(message = "保障提供明细编号不能为空")
@Size(max = 50, message = "保障提供明细编号不能超过50个字符")
private String bztgmxbh;
/**
* 数量,保障提供的数量。
*/
private Integer sl;
/**
* 备注,保障相关补充说明。
*/
@Size(max = 200, message = "备注不能超过200个字符")
private String bz;
}
@@ -0,0 +1,34 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 调课申请-新辅助教员参数。
* <p>
* 用于在调课申请中指定调整后的辅助教员信息。
* </p>
*/
@Data
public class AdjustTeacherDTO {
/**
* 辅助教员编号,必填,标识调整后使用的辅助教员。
*/
@NotBlank(message = "辅助教员编号不能为空")
@Size(max = 50, message = "辅助教员编号不能超过50个字符")
private String fzjybh;
/**
* 是否主教员,1-是,0-否;用于标识该教员在调整后是否为主讲。
*/
private Integer zjy;
/**
* 备注,教员相关补充说明。
*/
@Size(max = 200, message = "备注不能超过200个字符")
private String bz;
}
@@ -0,0 +1,23 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 调课申请-新学员队参数。
* <p>
* 用于在调课申请中指定调整后的学员队信息。
* </p>
*/
@Data
public class AdjustTeamDTO {
/**
* 学员队编号,必填,标识调整后涉及的学员队。
*/
@NotBlank(message = "学员队编号不能为空")
@Size(max = 50, message = "学员队编号不能超过50个字符")
private String xydbh;
}
@@ -0,0 +1,30 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 教学班次课程导入参数。
* <p>
* 用于从课程教学计划编制子系统导入指定教学班次的课程安排数据。
* </p>
*/
@Data
public class ClassesImportDTO {
/**
* 教学班次编号,对应实施_课程学员队表中的学员队编号。
*/
@NotBlank(message = "教学班次编号不能为空")
@Size(max = 50, message = "教学班次编号不能超过50个字符")
private String classBh;
/**
* 年度,对应实施_课程表中的年度字段。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
}
@@ -0,0 +1,34 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
import java.util.List;
/**
* 删除已导入课程参数。
* <p>
* 用于删除已导入到课程教学运行管理子系统的课次数据,支持按学期、班次或单个课次删除。
* </p>
*/
@Data
public class ImportRemoveDTO {
/**
* 删除范围,取值为:semester(按学期删除)、class(按班次删除)、single(按单个课次删除)。
*/
@NotBlank(message = "删除范围不能为空")
@Size(max = 20, message = "删除范围不能超过20个字符")
private String scope;
/**
* 课次编号列表,当删除范围为single时必填。
*/
private List<String> idList;
/**
* 年度,用于按学期或班次删除时限定年度范围。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
}
@@ -0,0 +1,46 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 运行分析查询参数。
* <p>
* 用于查询教学运行数据统计分析,支持按年度、学期、教学系等条件筛选。
* </p>
*/
@Data
public class OperationAnalysisQueryDTO {
/**
* 年度,如2024。
*/
private String nd;
/**
* 学期第次,如"1"表示第一学期。
*/
private String xqd;
/**
* 教学系编号。
*/
private String jxxbh;
/**
* 起始日期。
*/
private LocalDateTime startDate;
/**
* 结束日期。
*/
private LocalDateTime endDate;
/**
* 统计维度:week(按周)、month(按月)、department(按教学系)。
*/
private String dimension;
}
@@ -0,0 +1,113 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
import java.time.LocalDateTime;
import java.util.List;
/**
* 调课申请参数。
* <p>
* 用于提交调课申请,包含课次编号、调课事由、新的日期节次、新的教室、新的辅助教员、
* 新的学员队、教学内容变更、新的保障明细等完整信息。
* </p>
*/
@Data
public class ScheduleAdjustApplyDTO {
/**
* 实施_课程表编号,必填,标识需要调整的课次。
*/
@NotBlank(message = "课次编号不能为空")
@Size(max = 50, message = "课次编号不能超过50个字符")
private String sskcbbh;
/**
* 调课事由,必填,描述本次调课的原因和依据。
*/
@NotBlank(message = "调课事由不能为空")
@Size(max = 500, message = "调课事由不能超过500个字符")
private String sy;
/**
* 调课后新日期,课次调整后的上课日期时间。
*/
@NotNull(message = "调课后新日期不能为空")
private LocalDateTime rq;
/**
* 调课后新节次,课次调整后的节次序号。
*/
@NotNull(message = "调课后新节次不能为空")
private Integer jc;
/**
* 年度,对应课次所属的教学年度。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
/**
* 申请教员编号,必填,标识提交申请的教员。
*/
@NotBlank(message = "申请教员编号不能为空")
@Size(max = 50, message = "申请教员编号不能超过50个字符")
private String sqjybh;
/**
* 调课后教学内容,调整后的本节课教学主题或知识点。
*/
@Size(max = 2000, message = "教学内容不能超过2000个字符")
private String jxnr;
/**
* 调课后教学要点,调整后的本节课重点和难点。
*/
@Size(max = 1000, message = "教学要点不能超过1000个字符")
private String jxyd;
/**
* 调课后教学方法,调整后的教学方法。
*/
@Size(max = 200, message = "教学方法不能超过200个字符")
private String jxff;
/**
* 教学保障备注,调整后需要的其他教学保障需求说明。
*/
@Size(max = 1000, message = "教学保障备注不能超过1000个字符")
private String jxbzbz;
/**
* 用车信息,调整后需要的车辆保障需求。
*/
@Size(max = 500, message = "用车信息不能超过500个字符")
private String ycxx;
/**
* 备注,补充说明信息。
*/
@Size(max = 500, message = "备注不能超过500个字符")
private String bz;
/**
* 新教室列表,调课后使用的教室信息。
*/
private List<AdjustRoomDTO> roomList;
/**
* 新辅助教员列表,调课后使用的辅助教员信息。
*/
private List<AdjustTeacherDTO> teacherList;
/**
* 新学员队列表,调课后涉及的学员队信息。
*/
private List<AdjustTeamDTO> teamList;
/**
* 新保障明细列表,调课后需要的保障提供明细。
*/
private List<AdjustSupportDTO> supportList;
}
@@ -0,0 +1,55 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
import jakarta.validation.constraints.Size;
/**
* 调课申请审批参数。
* <p>
* 用于教研室或机关审批调课申请,包含审批结果、审批意见和审批人编号。
* </p>
*/
@Data
public class ScheduleAdjustAuditDTO {
/**
* 调课申请编号,必填,标识需要审批的调课申请。
*/
@NotBlank(message = "调课申请编号不能为空")
@Size(max = 50, message = "调课申请编号不能超过50个字符")
private String ssdksqbh;
/**
* 审批角色,必填:jys(教研室审批)、jg(机关审批)。
*/
@NotBlank(message = "审批角色不能为空")
@Size(max = 20, message = "审批角色不能超过20个字符")
private String auditRole;
/**
* 审批结果,必填:1-同意,2-发回修改,3-拒绝。
*/
@NotNull(message = "审批结果不能为空")
private Integer spzt;
/**
* 审批意见,可选,记录审批的具体意见或发回原因。
*/
@Size(max = 500, message = "审批意见不能超过500个字符")
private String fhyj;
/**
* 审批人编号,必填,标识审批人身份。
*/
@NotBlank(message = "审批人编号不能为空")
@Size(max = 50, message = "审批人编号不能超过50个字符")
private String sprbh;
/**
* 机关编号,机关审批时必填,标识审批机关。
*/
@Size(max = 50, message = "机关编号不能超过50个字符")
private String jgbh;
}
@@ -0,0 +1,64 @@
package com.roomroot.jwgl.dto.courserunning;
import com.roomroot.jwgl.unit.PageQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 调课申请查询参数。
* <p>
* 用于分页查询调课申请列表,支持按课次编号、申请教员、年度、审批状态、
* 教研室查收状态、日期范围等条件进行筛选。
* </p>
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ScheduleAdjustQueryDTO extends PageQuery {
/**
* 实施_课程表编号,筛选指定课次的调课申请。
*/
private String sskcbbh;
/**
* 申请教员编号,筛选指定教员提交的调课申请。
*/
private String sqjybh;
/**
* 年度。
*/
private Integer nd;
/**
* 教研室审批状态:0-未审批,1-已同意,2-已发回,3-已拒绝。
*/
private Integer jyspzzt;
/**
* 教研室查收状态:0-未查收,1-已查收。
*/
private Integer jyscszt;
/**
* 机关审批状态:0-未审批,1-已同意,2-已发回,3-已拒绝。
*/
private Integer jgspzt;
/**
* 删除状态:0-正常,1-已删除。
*/
private Integer sczt;
/**
* 申请日期范围开始。
*/
private LocalDateTime cjsjStart;
/**
* 申请日期范围结束。
*/
private LocalDateTime cjsjEnd;
}
@@ -0,0 +1,52 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;
/**
* 调课策略新增/修改参数。
* <p>
* 统一处理新增和修改:策略编号为空时执行新增,非空时执行修改。
* 策略类型为 TIME_LIMIT 时需填写截止星期和截止节次;
* 策略类型为 AUTO_APPROVE 时截止星期和截止节次不生效。
* </p>
*/
@Data
public class ScheduleAdjustStrategyDTO {
/** 策略编号(修改时必填,新增时为空) */
@Size(max = 50, message = "策略编号不能超过50个字符")
private String clbh;
/** 策略名称 */
@NotBlank(message = "策略名称不能为空")
@Size(max = 100, message = "策略名称不能超过100个字符")
private String clmc;
/** 策略类型:TIME_LIMIT=时间段限制,AUTO_APPROVE=免审批 */
@NotBlank(message = "策略类型不能为空")
@Size(max = 20, message = "策略类型不能超过20个字符")
private String cllx;
/** 是否启用:0=停用,1=启用(为空时默认1) */
private Integer sfqy;
/** 截止星期:0-6(仅 TIME_LIMIT 类型使用) */
private Integer jzxq;
/** 截止节次(仅 TIME_LIMIT 类型使用) */
private Integer jzjc;
/** 生效开始时间 */
private LocalDateTime sxkssj;
/** 生效结束时间 */
private LocalDateTime sxjssj;
/** 备注 */
@Size(max = 500, message = "备注不能超过500个字符")
private String bz;
}
@@ -0,0 +1,27 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 整学期课程导入参数。
* <p>
* 用于从课程教学计划编制子系统导入指定年度学期的所有课程安排数据。
* </p>
*/
@Data
public class SemesterImportDTO {
/**
* 年度,对应实施_课程表中的年度字段。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
/**
* 学期第次,对应实施_课程表中的学期第次字段。
*/
@NotNull(message = "学期第次不能为空")
private Integer xqdc;
}
@@ -0,0 +1,35 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 单门课程导入参数。
* <p>
* 用于从课程教学计划编制子系统导入指定教学班次的单门课程安排数据。
* </p>
*/
@Data
public class SingleCourseImportDTO {
/**
* 课程编号,对应实施_课程表中的课编号字段。
*/
@NotBlank(message = "课程编号不能为空")
@Size(max = 50, message = "课程编号不能超过50个字符")
private String courseBh;
/**
* 教学班次编号,对应实施_课程学员队表中的学员队编号。
*/
@NotBlank(message = "教学班次编号不能为空")
@Size(max = 50, message = "教学班次编号不能超过50个字符")
private String classBh;
/**
* 年度,对应实施_课程表中的年度字段。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
}
@@ -0,0 +1,79 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
import java.time.LocalDateTime;
import java.util.List;
/**
* 学员正课请假申请参数。
* <p>
* 用于学员提交正课请假申请,包含请假原因、时间范围、关联课次等信息。
* </p>
*/
@Data
public class StudentLeaveApplyDTO {
/**
* 学员编号,必填,标识提交请假申请的学员。
*/
@NotBlank(message = "学员编号不能为空")
@Size(max = 50, message = "学员编号不能超过50个字符")
private String xybh;
/**
* 学员姓名,可选,用于展示。
*/
@Size(max = 50, message = "学员姓名不能超过50个字符")
private String xyxm;
/**
* 学员队编号,必填,标识学员所属学员队。
*/
@NotBlank(message = "学员队编号不能为空")
@Size(max = 50, message = "学员队编号不能超过50个字符")
private String xydbh;
/**
* 请假原因,必填,描述请假的具体原因。
*/
@NotBlank(message = "请假原因不能为空")
@Size(max = 500, message = "请假原因不能超过500个字符")
private String yy;
/**
* 开始时间,必填,请假开始时间。
*/
@NotNull(message = "开始时间不能为空")
private LocalDateTime qssj;
/**
* 结束时间,必填,请假结束时间。
*/
@NotNull(message = "结束时间不能为空")
private LocalDateTime jssj;
/**
* 请假类型,如病假、事假、公假等。
*/
@Size(max = 20, message = "请假类型不能超过20个字符")
private String qjlx;
/**
* 目的地,外出请假时填写。
*/
@Size(max = 100, message = "目的地不能超过100个字符")
private String mdd;
/**
* 备注,补充说明信息。
*/
@Size(max = 500, message = "备注不能超过500个字符")
private String bz;
/**
* 关联课次编号列表,标识请假涉及的课次。
*/
private List<String> sskcbbhList;
}
@@ -0,0 +1,41 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.*;
import lombok.Data;
/**
* 学员请假审批参数。
* <p>
* 用于教师审批学员提交的正课请假申请。
* </p>
*/
@Data
public class StudentLeaveAuditDTO {
/**
* 请假编号,必填,标识需要审批的请假申请。
*/
@NotBlank(message = "请假编号不能为空")
@Size(max = 50, message = "请假编号不能超过50个字符")
private String qjbh;
/**
* 审批结果,1-同意,2-拒绝,3-发回修改。
*/
@NotNull(message = "审批结果不能为空")
private Integer spzt;
/**
* 审批人编号,必填,标识进行审批的教师。
*/
@NotBlank(message = "审批人编号不能为空")
@Size(max = 50, message = "审批人编号不能超过50个字符")
private String sprbh;
/**
* 审批意见,可选,记录审批意见或发回原因。
*/
@Size(max = 500, message = "审批意见不能超过500个字符")
private String spyj;
}
@@ -0,0 +1,79 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 学员请假查询参数。
* <p>
* 用于分页查询学员正课请假记录,支持多条件筛选。
* </p>
*/
@Data
public class StudentLeaveQueryDTO {
/**
* 页码,从1开始。
*/
@NotNull(message = "页码不能为空")
private Integer pageNum;
/**
* 每页记录数。
*/
@NotNull(message = "每页记录数不能为空")
private Integer pageSize;
/**
* 请假编号,精确匹配。
*/
@Size(max = 50, message = "请假编号不能超过50个字符")
private String qjbh;
/**
* 学员编号,精确匹配。
*/
@Size(max = 50, message = "学员编号不能超过50个字符")
private String xybh;
/**
* 学员姓名,模糊匹配。
*/
@Size(max = 50, message = "学员姓名不能超过50个字符")
private String xyxm;
/**
* 学员队编号,精确匹配。
*/
@Size(max = 50, message = "学员队编号不能超过50个字符")
private String xydbh;
/**
* 请假类型,精确匹配。
*/
@Size(max = 50, message = "请假类型不能超过50个字符")
private String qjlx;
/**
* 审批状态:0-待审批,1-已同意,2-已拒绝,3-已发回。
*/
private Integer spzt;
/**
* 年度。
*/
private Integer nd;
/**
* 创建时间范围起始。
*/
private LocalDateTime cjsjStart;
/**
* 创建时间范围结束。
*/
private LocalDateTime cjsjEnd;
}
@@ -0,0 +1,25 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
/**
* 教学实施计划批量填写参数。
* <p>
* 用于一次性提交多个课次的教学实施计划填写数据,
* 提高教员批量填写实施计划的效率。
* </p>
*/
@Data
public class TeachingPlanBatchFillDTO {
/**
* 教学实施计划填写列表,至少包含一条记录。
*/
@NotEmpty(message = "填写列表不能为空")
@Valid
private List<TeachingPlanFillDTO> planList;
}
@@ -0,0 +1,96 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 教学实施计划单条填写参数。
* <p>
* 用于对单个课次填写教学实施计划内容,包括教学内容、教学要点、教学方法、
* 上课日期节次、班组模式、用车信息及教学保障备注等。
* </p>
*/
@Data
public class TeachingPlanFillDTO {
/**
* 实施_课程表编号,必填,标识需要填写实施计划的具体课次。
*/
@NotBlank(message = "课次编号不能为空")
@Size(max = 50, message = "课次编号不能超过50个字符")
private String sskcbbh;
/**
* 教学目的,描述本节课的教学目标和预期效果。
*/
@Size(max = 1000, message = "教学目的不能超过1000个字符")
private String jxmd;
/**
* 教学内容,描述本节课的具体教学主题或知识点。
*/
@Size(max = 2000, message = "教学内容不能超过2000个字符")
private String jxnr;
/**
* 教学要点,描述本节课的重点和难点。
*/
@Size(max = 1000, message = "教学要点不能超过1000个字符")
private String jxyd;
/**
* 课后作业,描述本节课布置的课后作业内容。
*/
@Size(max = 1000, message = "课后作业不能超过1000个字符")
private String khzy;
/**
* 教学方法,如讲授、讨论、实操、案例教学等。
*/
@Size(max = 200, message = "教学方法不能超过200个字符")
private String jxff;
/**
* 上课日期,本节课的计划上课日期时间。
*/
private LocalDateTime rq;
/**
* 节次,本节课在当天的节次序号。
*/
private Integer jc;
/**
* 班组模式,描述本节课的班组组织形式。
*/
@Size(max = 100, message = "班组模式不能超过100个字符")
private String bzms;
/**
* 班组划分信息,详细描述各班组的人员构成或分组情况。
*/
@Size(max = 1000, message = "班组划分信息不能超过1000个字符")
private String bzhfxx;
/**
* 用车信息,描述本节课需要的车辆保障需求。
*/
@Size(max = 500, message = "用车信息不能超过500个字符")
private String ycxx;
/**
* 教学保障备注,描述本节课需要的其他教学保障需求。
*/
@Size(max = 1000, message = "教学保障备注不能超过1000个字符")
private String jxbzbz;
/**
* 教员备注,授课教员对本节课的补充说明。
*/
@Size(max = 1000, message = "教员备注不能超过1000个字符")
private String jybz;
}
@@ -0,0 +1,49 @@
package com.roomroot.jwgl.dto.courserunning;
import com.roomroot.jwgl.unit.PageQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 教学实施计划课次查询参数。
* <p>
* 用于分页查询待填写或已填写的课次列表,支持按实施课程编号、年度、
* 教学方法、日期范围等条件进行筛选。
* </p>
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class TeachingPlanQueryDTO extends PageQuery {
/**
* 实施_课程编号,关联课程教学计划编制子系统的课程数据。
*/
private String sskcbh;
/**
* 年度,对应课次所属的教学年度。
*/
private Integer nd;
/**
* 教学方法,筛选使用特定教学方法的课次。
*/
private String jxff;
/**
* 日期范围开始,筛选上课日期大于等于此值的课次。
*/
private LocalDateTime rqStart;
/**
* 日期范围结束,筛选上课日期小于等于此值的课次。
*/
private LocalDateTime rqEnd;
/**
* 填写状态:0-未填写,1-已填写,2-已提交;为空时查询全部。
*/
private Integer txzt;
}
@@ -0,0 +1,31 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
/**
* 教学保障计划批量登记参数。
* <p>
* 用于一次性为单个课次登记多条教学保障需求,提高保障登记效率。
* </p>
*/
@Data
public class TeachingSupportBatchPlanDTO {
/**
* 实施_课程表编号(课次编号),必填,标识需要登记保障的课次。
*/
@NotBlank(message = "课次编号不能为空")
private String sskcbbh;
/**
* 教学保障计划列表,至少包含一条记录。
*/
@NotEmpty(message = "保障计划列表不能为空")
@Valid
private List<TeachingSupportPlanItemDTO> planList;
}
@@ -0,0 +1,36 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.*;
import lombok.Data;
/**
* 教学保障到位确认参数。
* <p>
* 用于确认某条教学保障计划已经落实到位,记录确认人和确认时间。
* </p>
*/
@Data
public class TeachingSupportConfirmDTO {
/**
* 课程表_保障明细编号,必填,标识需要确认的保障计划记录。
*/
@NotBlank(message = "保障计划编号不能为空")
@Size(max = 50, message = "保障计划编号不能超过50个字符")
private String kcbbzmxbh;
/**
* 确认人编号,必填,标识进行保障确认的人员。
*/
@NotBlank(message = "确认人编号不能为空")
@Size(max = 50, message = "确认人编号不能超过50个字符")
private String qrrbh;
/**
* 确认备注,可选,记录保障到位情况的补充说明。
*/
@Size(max = 500, message = "确认备注不能超过500个字符")
private String qrbz;
}
@@ -0,0 +1,48 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.*;
import lombok.Data;
/**
* 教学保障计划登记参数。
* <p>
* 用于为单个课次登记一条教学保障需求,指定保障提供明细、数量、备注及确认状态。
* </p>
*/
@Data
public class TeachingSupportPlanDTO {
/**
* 实施_课程表编号(课次编号),必填,标识需要登记保障的课次。
*/
@NotBlank(message = "课次编号不能为空")
@Size(max = 50, message = "课次编号不能超过50个字符")
private String sskcbbh;
/**
* 保障提供明细编号,必填,关联保障提供明细表(保障资源库)。
*/
@NotBlank(message = "保障提供明细编号不能为空")
@Size(max = 50, message = "保障提供明细编号不能超过50个字符")
private String bztgmxbh;
/**
* 年度,课次所属的教学年度。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
/**
* 数量,本课次需要该保障提供的数量。
*/
@NotNull(message = "数量不能为空")
private Integer sl;
/**
* 备注,保障计划相关补充说明。
*/
@Size(max = 500, message = "备注不能超过500个字符")
private String bz;
}
@@ -0,0 +1,40 @@
package com.roomroot.jwgl.dto.courserunning;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 教学保障计划批量登记条目参数。
* <p>
* 用于批量登记时描述单条保障需求信息。
* </p>
*/
@Data
public class TeachingSupportPlanItemDTO {
/**
* 保障提供明细编号,必填,关联保障提供明细表(保障资源库)。
*/
@NotBlank(message = "保障提供明细编号不能为空")
@Size(max = 50, message = "保障提供明细编号不能超过50个字符")
private String bztgmxbh;
/**
* 年度,课次所属的教学年度。
*/
@NotNull(message = "年度不能为空")
private Integer nd;
/**
* 数量,本课次需要该保障提供的数量。
*/
@NotNull(message = "数量不能为空")
private Integer sl;
/**
* 备注,保障计划相关补充说明。
*/
@Size(max = 500, message = "备注不能超过500个字符")
private String bz;
}
@@ -0,0 +1,35 @@
package com.roomroot.jwgl.dto.courserunning;
import jakarta.validation.constraints.*;
import lombok.Data;
/**
* 教学保障计划修改参数。
* <p>
* 用于修改已登记的教学保障计划,包括调整数量和备注信息。
* </p>
*/
@Data
public class TeachingSupportUpdateDTO {
/**
* 课程表_保障明细编号,必填,标识需要修改的保障计划记录。
*/
@NotBlank(message = "保障计划编号不能为空")
@Size(max = 50, message = "保障计划编号不能超过50个字符")
private String kcbbzmxbh;
/**
* 数量,修改后的保障提供数量。
*/
@NotNull(message = "数量不能为空")
private Integer sl;
/**
* 备注,修改后的保障计划备注。
*/
@Size(max = 500, message = "备注不能超过500个字符")
private String bz;
}
@@ -0,0 +1,51 @@
package com.roomroot.jwgl.dto.department;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 部别新增参数。
*/
@Data
public class DepartmentCreateDTO {
/**
* 部别名称,对应“实施_机关.机关名称”。
*/
@NotBlank(message = "部别名称不能为空")
@Size(max = 50, message = "部别名称不能超过50个字符")
private String name;
/**
* 机关类别,对应“实施_机关.机关类别”。
*/
@NotBlank(message = "机关类别不能为空")
@Size(max = 50, message = "机关类别不能超过50个字符")
private String category;
/**
* 分类号;未传入时使用数据库原有默认语义“0”。
*/
@Size(max = 50, message = "分类号不能超过50个字符")
private String classificationCode = "0";
/**
* 分级号;未传入时使用数据库原有默认语义 0。
*/
@NotNull(message = "分级号不能为空")
@Min(value = 0, message = "分级号不能小于0")
private Integer levelNumber = 0;
/**
* 上级部别编号;根节点不填写。
*/
@Size(max = 36, message = "上级部别编号不能超过36个字符")
private String parentId;
/**
* 部别简称。
*/
@Size(max = 500, message = "简称不能超过500个字符")
private String abbreviation;
}
@@ -0,0 +1,19 @@
package com.roomroot.jwgl.dto.department;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 部别编号参数。
*/
@Data
public class DepartmentIdDTO {
/**
* 部别唯一编号。
*/
@NotBlank(message = "部别编号不能为空")
@Size(max = 36, message = "部别编号不能超过36个字符")
private String id;
}
@@ -0,0 +1,29 @@
package com.roomroot.jwgl.dto.department;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 部别查询参数。
*/
@Data
public class DepartmentQueryDTO {
/**
* 模糊查询关键字,可匹配编号、名称、简称和分类号。
*/
@Size(max = 100, message = "查询关键字不能超过100个字符")
private String keyword;
/**
* 机关类别精确查询条件,忽略英文字母大小写。
*/
@Size(max = 50, message = "机关类别不能超过50个字符")
private String category;
/**
* true 查询启用数据,false 查询停用数据,null 查询全部。
*/
private Boolean enabled;
}
@@ -0,0 +1,58 @@
package com.roomroot.jwgl.dto.department;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 部别修改参数。
*/
@Data
public class DepartmentUpdateDTO {
/**
* 待修改部别的唯一编号。
*/
@NotBlank(message = "部别编号不能为空")
@Size(max = 36, message = "部别编号不能超过36个字符")
private String id;
/**
* 修改后的部别名称。
*/
@NotBlank(message = "部别名称不能为空")
@Size(max = 50, message = "部别名称不能超过50个字符")
private String name;
/**
* 修改后的机关类别。
*/
@NotBlank(message = "机关类别不能为空")
@Size(max = 50, message = "机关类别不能超过50个字符")
private String category;
/**
* 修改后的分类号。
*/
@Size(max = 50, message = "分类号不能超过50个字符")
private String classificationCode = "0";
/**
* 修改后的分级号。
*/
@NotNull(message = "分级号不能为空")
@Min(value = 0, message = "分级号不能小于0")
private Integer levelNumber = 0;
/**
* 修改后的上级部别编号;根节点不填写。
*/
@Size(max = 36, message = "上级部别编号不能超过36个字符")
private String parentId;
/**
* 修改后的部别简称。
*/
@Size(max = 500, message = "简称不能超过500个字符")
private String abbreviation;
}
@@ -0,0 +1,56 @@
package com.roomroot.jwgl.dto.departmentpersonnel;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 部别人员新增参数。
*/
@Data
public class DepartmentPersonnelCreateDTO {
/**
* 所属部别编号,对应“实施_机关参谋.实施_机关编号”。
*/
@NotBlank(message = "所属部别编号不能为空")
@Size(max = 36, message = "所属部别编号不能超过36个字符")
private String departmentId;
/**
* 人员姓名,对应“实施_机关参谋.用户姓名”。
*/
@NotBlank(message = "人员姓名不能为空")
@Size(max = 50, message = "人员姓名不能超过50个字符")
private String name;
/**
* 人员序号,用于同一部别下的稳定排序。
*/
@Size(max = 50, message = "人员序号不能超过50个字符")
private String sequenceNumber;
/**
* 人员职务。
*/
@Size(max = 50, message = "人员职务不能超过50个字符")
private String position;
/**
* 人员卡号。
*/
@Size(max = 50, message = "人员卡号不能超过50个字符")
private String cardNumber;
/**
* 人员姓名拼音。
*/
@Size(max = 50, message = "人员姓名拼音不能超过50个字符")
private String pinyin;
/**
* 是否为主官;未传入时默认为否。
*/
@NotNull(message = "主官标志不能为空")
private Boolean principal = false;
}
@@ -0,0 +1,20 @@
package com.roomroot.jwgl.dto.departmentpersonnel;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
/**
* 部别人员编号参数。
*/
@Data
public class DepartmentPersonnelIdDTO {
/**
* 人员唯一编号。
*/
@NotBlank(message = "人员编号不能为空")
@Size(max = 36, message = "人员编号不能超过36个字符")
private String id;
}
@@ -0,0 +1,23 @@
package com.roomroot.jwgl.dto.departmentpersonnel;
import lombok.Data;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import java.util.List;
/**
* 部别人员批量导入参数。
*/
@Data
public class DepartmentPersonnelImportDTO {
/**
* 待导入人员列表;单次最多导入1000人。
*/
@Valid
@NotEmpty(message = "导入人员列表不能为空")
@Size(max = 1000, message = "单次最多导入1000人")
private List<DepartmentPersonnelCreateDTO> personnel;
}
@@ -0,0 +1,34 @@
package com.roomroot.jwgl.dto.departmentpersonnel;
import lombok.Data;
import jakarta.validation.constraints.Size;
/**
* 部别人员查询及导出筛选参数。
*/
@Data
public class DepartmentPersonnelQueryDTO {
/**
* 所属部别编号;不填写时查询全部部别。
*/
@Size(max = 36, message = "所属部别编号不能超过36个字符")
private String departmentId;
/**
* 查询关键字,可匹配姓名、序号、职务、卡号、拼音和人员编号。
*/
@Size(max = 50, message = "查询关键字不能超过50个字符")
private String keyword;
/**
* 离职状态;不填写时同时查询在职和离职人员。
*/
private Boolean departed;
/**
* 主官状态;不填写时不限制。
*/
private Boolean principal;
}
@@ -0,0 +1,63 @@
package com.roomroot.jwgl.dto.departmentpersonnel;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 部别人员修改参数。
*/
@Data
public class DepartmentPersonnelUpdateDTO {
/**
* 人员唯一编号。
*/
@NotBlank(message = "人员编号不能为空")
@Size(max = 36, message = "人员编号不能超过36个字符")
private String id;
/**
* 调整后的所属部别编号。
*/
@NotBlank(message = "所属部别编号不能为空")
@Size(max = 36, message = "所属部别编号不能超过36个字符")
private String departmentId;
/**
* 人员姓名。
*/
@NotBlank(message = "人员姓名不能为空")
@Size(max = 50, message = "人员姓名不能超过50个字符")
private String name;
/**
* 人员序号。
*/
@Size(max = 50, message = "人员序号不能超过50个字符")
private String sequenceNumber;
/**
* 人员职务。
*/
@Size(max = 50, message = "人员职务不能超过50个字符")
private String position;
/**
* 人员卡号。
*/
@Size(max = 50, message = "人员卡号不能超过50个字符")
private String cardNumber;
/**
* 人员姓名拼音。
*/
@Size(max = 50, message = "人员姓名拼音不能超过50个字符")
private String pinyin;
/**
* 是否为主官。
*/
@NotNull(message = "主官标志不能为空")
private Boolean principal;
}
@@ -0,0 +1,24 @@
package com.roomroot.jwgl.dto.dict;
import lombok.Data;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
/**
* 字典数据批量查询参数。
* <p>
* 用于页面初始化时一次性查询多个字典类型的数据,
* 返回结果按类型编码分组,减少前端请求次数,提高页面加载效率。
* </p>
*/
@Data
public class DictDataBatchQueryDTO {
/**
* 字典类型编码列表。
* <p>至少包含一个类型编码,每个编码对应一个需要查询的字典类型。</p>
*/
@NotEmpty(message = "字典类型编码列表不能为空")
private List<String> typeCodes;
}
@@ -0,0 +1,50 @@
package com.roomroot.jwgl.dto.dict;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 字典数据分页查询参数。
* <p>
* 用于字典数据管理页面的分页列表查询,支持按字典类型编码(必填)、
* 关键字(模糊匹配标签或值)、状态进行筛选。
* </p>
*/
@Data
public class DictDataQueryDTO {
/**
* 当前页码;未填写时默认查询第一页,最小为1。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条,最小1条,单页最多100条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(value = 100, message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 字典类型编码;必填,用于筛选指定类型的字典数据。
*/
@NotBlank(message = "字典类型编码不能为空")
@Size(max = 50, message = "字典类型编码不能超过50个字符")
private String dictTypeCode;
/**
* 查询关键字,可匹配字典标签、字典值。
* <p>不填写时不作为筛选条件。</p>
*/
@Size(max = 50, message = "查询关键字不能超过50个字符")
private String keyword;
/**
* 状态(0停用 1正常);不填写时同时查询启用和停用。
*/
private Integer status;
}
@@ -0,0 +1,89 @@
package com.roomroot.jwgl.dto.dict;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
/**
* 字典数据保存参数(新增/编辑合一)。
* <p>
* 用于字典数据的新增和编辑操作。通过 {@code dictDataId} 区分是新增还是编辑:
* 为空时新增,有值时编辑。保存时会校验关联的字典类型是否存在,
* 若 {@code isDefault} 设置为 1,会自动取消该类型下其他数据的默认标记。
* </p>
*/
@Data
public class DictDataSaveDTO {
/**
* 字典数据ID;为空时执行新增操作,有值时执行编辑操作。
*/
private Long dictDataId;
/**
* 字典类型编码。
* <p>用于关联字典类型,保存时会校验该类型是否存在。</p>
*/
@NotBlank(message = "字典类型编码不能为空")
@Size(max = 50, message = "字典类型编码不能超过50个字符")
private String dictTypeCode;
/**
* 字典标签(显示用)。
* <p>前端下拉框、单选、多选组件中展示的文本。</p>
*/
@NotBlank(message = "字典标签不能为空")
@Size(max = 50, message = "字典标签不能超过50个字符")
private String dictLabel;
/**
* 字典值(存储用)。
* <p>实际存入数据库或用于业务逻辑判断的值。</p>
*/
@NotBlank(message = "字典值不能为空")
@Size(max = 50, message = "字典值不能超过50个字符")
private String dictValue;
/**
* 排序号。
* <p>控制数据项在前端下拉框中的展示顺序,数值越小越靠前。</p>
*/
@NotNull(message = "排序号不能为空")
private Integer dictSort;
/**
* 标签样式(success/warning/info/danger)。
* <p>用于前端标签组件的颜色样式,可不填。</p>
*/
@Size(max = 20, message = "标签样式不能超过20个字符")
private String cssClass;
/**
* 表格回显样式。
* <p>用于前端表格中该字典项的展示样式,可不填。</p>
*/
@Size(max = 20, message = "表格回显样式不能超过20个字符")
private String listClass;
/**
* 是否默认(0否 1是)。
* <p>同一类型下只有一个默认选项,设置新的默认值会自动取消旧的。</p>
*/
@NotNull(message = "是否默认不能为空")
private Integer isDefault;
/**
* 状态(0停用 1正常)。
* <p>停用后该选项在业务界面不可选。</p>
*/
@NotNull(message = "状态不能为空")
private Integer status;
/**
* 备注。
*/
@Size(max = 200, message = "备注不能超过200个字符")
private String remark;
}
@@ -0,0 +1,53 @@
package com.roomroot.jwgl.dto.dict;
import lombok.Data;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
/**
* 字典类型分页查询参数。
* <p>
* 用于字典类型管理页面的分页列表查询,支持按关键字(模糊匹配类型编码或名称)、
* 所属分组、状态进行筛选。分页参数采用固定结构,与项目其他分页查询保持一致。
* </p>
*/
@Data
public class DictTypeQueryDTO {
/**
* 当前页码;未填写时默认查询第一页,最小为1。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条,最小1条,单页最多100条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(value = 100, message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 查询关键字,可匹配字典类型编码、字典类型名称。
* <p>不填写时不作为筛选条件。</p>
*/
@Size(max = 50, message = "查询关键字不能超过50个字符")
private String keyword;
/**
* 所属分组;不填写时查询全部分组。
* <p>常见分组:基础数据、教学数据、学籍数据、师资数据。</p>
*/
@Size(max = 30, message = "分组不能超过30个字符")
private String dictGroup;
/**
* 状态(0停用 1正常);不填写时同时查询启用和停用。
*/
private Integer status;
}
@@ -0,0 +1,57 @@
package com.roomroot.jwgl.dto.dict;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 字典类型保存参数(新增/编辑合一)。
* <p>
* 用于字典类型的新增和编辑操作。通过 {@code dictTypeId} 区分是新增还是编辑:
* 为空时新增,有值时编辑。新增时校验类型编码全局唯一性。
* </p>
*/
@Data
public class DictTypeSaveDTO {
/**
* 字典类型ID;为空时执行新增操作,有值时执行编辑操作。
*/
private Long dictTypeId;
/**
* 字典类型编码(全局唯一,程序引用键)。
* <p>新增时必须唯一,编辑时若修改编码需重新校验唯一性。</p>
*/
@NotBlank(message = "字典类型编码不能为空")
@Size(max = 50, message = "字典类型编码不能超过50个字符")
private String dictTypeCode;
/**
* 字典类型名称(用于页面展示)。
*/
@NotBlank(message = "字典类型名称不能为空")
@Size(max = 50, message = "字典类型名称不能超过50个字符")
private String dictTypeName;
/**
* 所属分组(基础数据/教学数据/学籍数据等)。
* <p>用于对字典类型进行分类展示。</p>
*/
@NotBlank(message = "所属分组不能为空")
@Size(max = 30, message = "所属分组不能超过30个字符")
private String dictGroup;
/**
* 状态(0停用 1正常)。
* <p>停用后该类型下的数据项在业务下拉框中不可见。</p>
*/
@NotNull(message = "状态不能为空")
private Integer status;
/**
* 备注。
*/
@Size(max = 200, message = "备注不能超过200个字符")
private String remark;
}
@@ -0,0 +1,19 @@
package com.roomroot.jwgl.dto.elective;
import com.roomroot.jwgl.entity.XYDB;
import com.roomroot.jwgl.entity.XYDQB;
import lombok.Data;
/**
* 新增教学班次请求参数
* <p>同时携带学员队表和学员队期表数据,一次请求同时写入两张表。</p>
*/
@Data
public class AddClassDTO {
/** 教学班次信息(学员队表) */
private XYDB clazz;
/** 学号规则与注册设置(学员队期表) */
private XYDQB period;
}
@@ -0,0 +1,19 @@
package com.roomroot.jwgl.dto.faculty;
import com.roomroot.jwgl.entity.JYB;
import com.roomroot.jwgl.entity.JYSX;
import lombok.Data;
/**
* 新增教员请求参数
* <p>同时携带教员表和教员属性表的数据,一次请求同时写入两张表。</p>
*/
@Data
public class AddTeacherDTO {
/** 教员基本信息 */
private JYB teacher;
/** 教员属性信息(含职务、技术等级、学历学位等非空字段) */
private JYSX attributes;
}
@@ -0,0 +1,22 @@
package com.roomroot.jwgl.dto.login;
import lombok.Data;
/**
* 登录请求参数
*/
@Data
public class LoginDTO {
/** 单位编号(管理员登录时可为空) */
private String orgId;
/** 登录名/账号 */
private String loginName;
/** 密码 */
private String password;
/** 用户类型: ADMIN-行政 TEACHER-教员 STUDENT-学员 MANAGER-管理员 */
private String userType;
}
@@ -0,0 +1,66 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import jakarta.validation.constraints.*;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.CATEGORY_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.CONTENT_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.DEFAULT_CATEGORY;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.PRIORITY_MAX_VALUE;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.REMARK_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.TITLE_MAX_LENGTH;
/**
* 通知公告新增参数。
*
* <p>新增接口只创建拟制公告,公告状态、发布时间、阅读次数和发布范围
* 均由服务端按照固定业务规则生成,不接收客户端指定值。</p>
*/
@Data
public class NoticeAnnouncementCreateDTO {
/**
* 公告标题。
*/
@NotBlank(message = "公告标题不能为空")
@Size(
max = TITLE_MAX_LENGTH,
message = "公告标题不能超过100个字符")
private String title;
/**
* 公告正文。
*/
@NotBlank(message = "公告内容不能为空")
@Size(
max = CONTENT_MAX_LENGTH,
message = "公告内容不能超过100000个字符")
private String content;
/**
* 公告类别;未填写时默认使用“公告”。
*/
@NotBlank(message = "公告类别不能为空")
@Size(
max = CATEGORY_MAX_LENGTH,
message = "公告类别不能超过50个字符")
private String category = DEFAULT_CATEGORY;
/**
* 公告优先级;数值越大,列表排序越靠前。
*/
@Min(value = 0, message = "公告优先级不能小于0")
@Max(
value = PRIORITY_MAX_VALUE,
message = "公告优先级不能超过9999")
private Integer priority = Integer.valueOf(0);
/**
* 公告备注。
*/
@Size(
max = REMARK_MAX_LENGTH,
message = "公告备注不能超过500个字符")
private String remark;
}
@@ -0,0 +1,26 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.NOTICE_ID_MAX_LENGTH;
/**
* 通知公告编号参数。
*
* <p>只接收公告业务编号,不接收账户编号或公告状态等可由服务端查询的数据。</p>
*/
@Data
public class NoticeAnnouncementIdDTO {
/**
* 通知公告编号。
*/
@NotBlank(message = "公告编号不能为空")
@Size(
max = NOTICE_ID_MAX_LENGTH,
message = "公告编号不能超过50个字符")
private String id;
}
@@ -0,0 +1,36 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import jakarta.validation.constraints.*;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.NOTICE_ID_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.PRIORITY_MAX_VALUE;
/**
* 通知公告优先级调整参数。
*
* <p>优先级设置为0表示取消置顶效果,大于0时按照数值从高到低排列。</p>
*/
@Data
public class NoticeAnnouncementPriorityDTO {
/**
* 待调整的通知公告编号。
*/
@NotBlank(message = "公告编号不能为空")
@Size(
max = NOTICE_ID_MAX_LENGTH,
message = "公告编号不能超过50个字符")
private String id;
/**
* 调整后的公告优先级。
*/
@NotNull(message = "公告优先级不能为空")
@Min(value = 0, message = "公告优先级不能小于0")
@Max(
value = PRIORITY_MAX_VALUE,
message = "公告优先级不能超过9999")
private Integer priority;
}
@@ -0,0 +1,47 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.util.List;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.MAX_DEPARTMENT_SCOPE_SIZE;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.NOTICE_ID_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.SCOPE_TYPE_MAX_LENGTH;
/**
* 通知公告发布参数。
*
* <p>发布账户由服务端会话识别,接收账户由发布范围计算,
* 客户端不能直接提交接收账户编号。</p>
*/
@Data
public class NoticeAnnouncementPublishDTO {
/**
* 待发布的通知公告编号。
*/
@NotBlank(message = "公告编号不能为空")
@Size(
max = NOTICE_ID_MAX_LENGTH,
message = "公告编号不能超过50个字符")
private String id;
/**
* 发布范围类型:ALL、ALL_TEACHERS 或 DEPARTMENTS。
*/
@NotBlank(message = "发布范围不能为空")
@Size(
max = SCOPE_TYPE_MAX_LENGTH,
message = "发布范围类型不能超过20个字符")
private String scopeType;
/**
* 指定部别编号集合;仅 DEPARTMENTS 范围使用。
*/
@Size(
max = MAX_DEPARTMENT_SCOPE_SIZE,
message = "单次最多选择200个部别")
private List<String> departmentIds;
}
@@ -0,0 +1,90 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDate;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.CATEGORY_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.MAX_PAGE_SIZE;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.STATUS_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.TITLE_MAX_LENGTH;
/**
* 通知公告分页查询参数。
*
* <p>只接收通知公告管理页面的筛选条件,不接收数据库实体和统计结果,
* 保证查询入参与页面出参相互独立。</p>
*/
@Data
public class NoticeAnnouncementQueryDTO {
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(
value = MAX_PAGE_SIZE,
message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 公告标题关键字;未填写时不限制标题。
*/
@Size(
max = TITLE_MAX_LENGTH,
message = "公告标题不能超过100个字符")
private String title;
/**
* 最低优先级;未填写时不限制优先级下限。
*/
@Min(value = 0, message = "最低优先级不能小于0")
private Integer minPriority;
/**
* 最高优先级;未填写时不限制优先级上限。
*/
@Min(value = 0, message = "最高优先级不能小于0")
private Integer maxPriority;
/**
* 发布开始日期;查询结果包含该日期。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate publishStartDate;
/**
* 发布结束日期;查询结果包含该日期。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate publishEndDate;
/**
* 公告类别;未填写时查询全部类别。
*/
@Size(
max = CATEGORY_MAX_LENGTH,
message = "公告类别不能超过50个字符")
private String category;
/**
* 公告状态;未填写时查询全部状态。
*/
@Size(
max = STATUS_MAX_LENGTH,
message = "公告状态不能超过50个字符")
private String status;
}
@@ -0,0 +1,23 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
/**
* 通知公告接收人批量写入参数。
*
* <p>该 DTO 仅在业务层与 Mapper 之间传递服务端生成的接收人快照,
* 不作为 Controller 的客户端请求参数。</p>
*/
@Data
public class NoticeAnnouncementRecipientInsertDTO {
/**
* 通告用户信息记录编号。
*/
private String id;
/**
* 接收账户编号。
*/
private String accountId;
}
@@ -0,0 +1,55 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import jakarta.validation.constraints.*;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.MAX_PAGE_SIZE;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.NOTICE_ID_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.RECIPIENT_KEYWORD_MAX_LENGTH;
/**
* 通知公告接收人分页查询参数。
*/
@Data
public class NoticeAnnouncementRecipientQueryDTO {
/**
* 待查询接收情况的公告编号。
*/
@NotBlank(message = "公告编号不能为空")
@Size(
max = NOTICE_ID_MAX_LENGTH,
message = "公告编号不能超过50个字符")
private String id;
/**
* 当前页码。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(
value = MAX_PAGE_SIZE,
message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 接收账户或用户姓名关键字。
*/
@Size(
max = RECIPIENT_KEYWORD_MAX_LENGTH,
message = "接收人关键字不能超过100个字符")
private String keyword;
/**
* 阅读状态;为空时查询全部,true 查询已读,false 查询未读。
*/
private Boolean read;
}
@@ -0,0 +1,30 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.NOTICE_ID_MAX_LENGTH;
/**
* 通知公告修改参数。
*
* <p>继承公告可编辑内容,只额外接收待修改公告编号。
* 拟制和已下架状态允许修改,已发布状态由业务层拒绝修改。</p>
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class NoticeAnnouncementUpdateDTO
extends NoticeAnnouncementCreateDTO {
/**
* 待修改的通知公告编号。
*/
@NotBlank(message = "公告编号不能为空")
@Size(
max = NOTICE_ID_MAX_LENGTH,
message = "公告编号不能超过50个字符")
private String id;
}
@@ -0,0 +1,59 @@
package com.roomroot.jwgl.dto.noticeannouncement;
import lombok.Data;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.CATEGORY_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.MAX_PAGE_SIZE;
import static com.roomroot.jwgl.utils.NoticeAnnouncementConstants.TITLE_MAX_LENGTH;
/**
* 当前登录用户的通知公告分页查询参数。
*
* <p>查询目标账户只从当前服务端会话读取,DTO 不提供账户编号字段。</p>
*/
@Data
public class UserNoticeAnnouncementQueryDTO {
/**
* 当前页码。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(
value = MAX_PAGE_SIZE,
message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 公告标题关键字。
*/
@Size(
max = TITLE_MAX_LENGTH,
message = "公告标题不能超过100个字符")
private String title;
/**
* 公告类别。
*/
@Size(
max = CATEGORY_MAX_LENGTH,
message = "公告类别不能超过50个字符")
private String category;
/**
* 是否只查询未读公告。
*/
private Boolean unreadOnly = Boolean.FALSE;
}
@@ -0,0 +1,57 @@
package com.roomroot.jwgl.dto.notificationlog;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;
import static com.roomroot.jwgl.utils.NotificationLogConstants.CATEGORY_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NotificationLogConstants.SEND_STATUS_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NotificationLogConstants.TITLE_MAX_LENGTH;
/**
* 通知日志导出筛选参数。
*
* <p>导出接口只接收业务筛选条件,不接收分页参数;
* 服务端按照固定批次查询全部符合条件的通知日志。</p>
*/
@Data
public class NotificationLogExportDTO {
/**
* 通知标题关键字;未填写时不限制标题。
*/
@Size(
max = TITLE_MAX_LENGTH,
message = "通知标题不能超过100个字符")
private String title;
/**
* 通知类别;未填写时查询全部类别。
*/
@Size(
max = CATEGORY_MAX_LENGTH,
message = "通知类别不能超过50个字符")
private String category;
/**
* 发送开始时间;导出结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime sendStartTime;
/**
* 发送结束时间;导出结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime sendEndTime;
/**
* 发送状态;支持发送成功、部分成功和发送失败。
*/
@Size(
max = SEND_STATUS_MAX_LENGTH,
message = "发送状态不能超过20个字符")
private String sendStatus;
}
@@ -0,0 +1,27 @@
package com.roomroot.jwgl.dto.notificationlog;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import static com.roomroot.jwgl.utils.NotificationLogConstants.NOTIFICATION_ID_MAX_LENGTH;
/**
* 通知日志编号参数。
*
* <p>该 DTO 只接收通知日志对应的通知编号,
* 不允许客户端提交发送、接收或阅读统计结果。</p>
*/
@Data
public class NotificationLogIdDTO {
/**
* 待查询的通知编号。
*/
@NotBlank(message = "通知日志编号不能为空")
@Size(
max = NOTIFICATION_ID_MAX_LENGTH,
message = "通知日志编号不能超过50个字符")
private String id;
}
@@ -0,0 +1,78 @@
package com.roomroot.jwgl.dto.notificationlog;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;
import static com.roomroot.jwgl.utils.NotificationLogConstants.CATEGORY_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NotificationLogConstants.MAX_PAGE_SIZE;
import static com.roomroot.jwgl.utils.NotificationLogConstants.SEND_STATUS_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NotificationLogConstants.TITLE_MAX_LENGTH;
/**
* 通知日志发送历史分页查询参数。
*
* <p>该 DTO 只接收通知日志页面提交的筛选条件,
* 不接收数据库统计结果或页面展示字段。</p>
*/
@Data
public class NotificationLogQueryDTO {
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(
value = MAX_PAGE_SIZE,
message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 通知标题关键字;未填写时不限制标题。
*/
@Size(
max = TITLE_MAX_LENGTH,
message = "通知标题不能超过100个字符")
private String title;
/**
* 通知类别;未填写时查询全部类别。
*/
@Size(
max = CATEGORY_MAX_LENGTH,
message = "通知类别不能超过50个字符")
private String category;
/**
* 发送开始时间;查询结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime sendStartTime;
/**
* 发送结束时间;查询结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime sendEndTime;
/**
* 发送状态;支持发送成功、部分成功和发送失败。
*/
@Size(
max = SEND_STATUS_MAX_LENGTH,
message = "发送状态不能超过20个字符")
private String sendStatus;
}
@@ -0,0 +1,63 @@
package com.roomroot.jwgl.dto.notificationlog;
import lombok.Data;
import jakarta.validation.constraints.*;
import static com.roomroot.jwgl.utils.NotificationLogConstants.MAX_PAGE_SIZE;
import static com.roomroot.jwgl.utils.NotificationLogConstants.NOTIFICATION_ID_MAX_LENGTH;
import static com.roomroot.jwgl.utils.NotificationLogConstants.RECIPIENT_KEYWORD_MAX_LENGTH;
/**
* 通知日志接收与阅读明细分页查询参数。
*
* <p>该 DTO 只保存页面筛选条件,
* 接收人账户信息和阅读结果统一由数据库查询。</p>
*/
@Data
public class NotificationLogRecipientQueryDTO {
/**
* 待查询的通知编号。
*/
@NotBlank(message = "通知日志编号不能为空")
@Size(
max = NOTIFICATION_ID_MAX_LENGTH,
message = "通知日志编号不能超过50个字符")
private String id;
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(
value = MAX_PAGE_SIZE,
message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 登录账号或接收人姓名关键字。
*/
@Size(
max = RECIPIENT_KEYWORD_MAX_LENGTH,
message = "接收人关键字不能超过100个字符")
private String keyword;
/**
* 接收状态;为空查询全部,true 查询成功,false 查询失败。
*/
private Boolean received;
/**
* 阅读状态;为空查询全部,true 查询已读,false 查询未读。
*/
private Boolean read;
}
@@ -0,0 +1,54 @@
package com.roomroot.jwgl.dto.operationlog;
import jakarta.validation.constraints.Size;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* 操作日志导出筛选参数。
*
* <p>导出接口只接收日志筛选条件,不接收分页参数。
* 业务层会按照固定批次查询全部符合条件的数据。</p>
*/
@Data
public class OperationLogExportDTO {
/**
* 操作开始时间;导出结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
/**
* 操作结束时间;导出结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
/**
* 操作人关键字,可匹配登录账号、用户姓名和统一账号。
*/
@Size(max = 50, message = "操作人关键字不能超过50个字符")
private String operatorKeyword;
/**
* 业务模块名称;不填写时导出全部模块。
*/
@Size(max = 20, message = "模块名称不能超过20个字符")
private String module;
/**
* 操作内容关键字;不填写时不限制操作内容。
*/
@Size(max = 100, message = "操作内容关键字不能超过100个字符")
private String contentKeyword;
/**
* 请求地址关键字;不填写时不限制请求地址。
*/
@Size(max = 200, message = "请求地址关键字不能超过200个字符")
private String urlKeyword;
}
@@ -0,0 +1,25 @@
package com.roomroot.jwgl.dto.operationlog;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import static com.roomroot.jwgl.utils.BasicManagementConstants.IDENTIFIER_MAX_LENGTH;
/**
* 操作日志唯一编号参数。
*/
@Data
public class OperationLogIdDTO {
/**
* 操作日志编号,对应“操作日志表.编号”。
*/
@NotBlank(message = "操作日志编号不能为空")
@Size(
max = IDENTIFIER_MAX_LENGTH,
message = "操作日志编号不能超过36个字符")
private String id;
}
@@ -0,0 +1,72 @@
package com.roomroot.jwgl.dto.operationlog;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* 操作日志分页查询参数。
*
* <p>只接收页面查询条件,不接收操作人编号或登录记录编号,
* 防止客户端使用不可信身份数据干扰审计查询。</p>
*/
@Data
public class OperationLogQueryDTO {
/**
* 当前页码;未填写时默认查询第一页。
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小为1")
private Integer pageNum = Integer.valueOf(1);
/**
* 每页记录数;未填写时默认20条,单页最多100条。
*/
@NotNull(message = "每页大小不能为空")
@Min(value = 1, message = "每页最小为1条")
@Max(value = 100, message = "每页最大为100条")
private Integer pageSize = Integer.valueOf(20);
/**
* 操作开始时间;查询结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
/**
* 操作结束时间;查询结果包含等于该时间的日志。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
/**
* 操作人关键字,可匹配登录账号、用户姓名和统一账号。
*/
@Size(max = 50, message = "操作人关键字不能超过50个字符")
private String operatorKeyword;
/**
* 业务模块名称;未填写时查询全部模块。
*/
@Size(max = 20, message = "模块名称不能超过20个字符")
private String module;
/**
* 操作内容关键字;未填写时不限制操作内容。
*/
@Size(max = 100, message = "操作内容关键字不能超过100个字符")
private String contentKeyword;
/**
* 请求地址关键字;未填写时不限制请求地址。
*/
@Size(max = 200, message = "请求地址关键字不能超过200个字符")
private String urlKeyword;
}
@@ -0,0 +1,46 @@
package com.roomroot.jwgl.dto.operationlog;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import static com.roomroot.jwgl.utils.BasicManagementConstants.IDENTIFIER_MAX_LENGTH;
import static com.roomroot.jwgl.utils.BasicManagementConstants.OPERATION_CONTENT_MAX_LENGTH;
import static com.roomroot.jwgl.utils.BasicManagementConstants.OPERATION_URL_MAX_LENGTH;
/**
* 操作日志内部记录参数。
*
* <p>该 DTO 只在服务端自动记录流程中传递当前登录记录编号、
* 操作内容和请求地址,不接收日志编号、操作时间或客户端身份信息。</p>
*/
@Data
public class OperationLogRecordDTO {
/**
* 当前请求关联的登录记录编号。
*/
@NotBlank(message = "登录记录编号不能为空")
@Size(
max = IDENTIFIER_MAX_LENGTH,
message = "登录记录编号不能超过36个字符")
private String loginRecordId;
/**
* 当前请求对应的业务操作内容。
*/
@NotBlank(message = "操作内容不能为空")
@Size(
max = OPERATION_CONTENT_MAX_LENGTH,
message = "操作内容不能超过2000个字符")
private String operationContent;
/**
* 当前请求的应用内访问地址。
*/
@NotBlank(message = "请求地址不能为空")
@Size(
max = OPERATION_URL_MAX_LENGTH,
message = "请求地址不能超过200个字符")
private String url;
}
@@ -0,0 +1,123 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;
/**
* 学期初始化参数保存参数。
*/
@Data
public class SemesterInitializationSaveDTO {
/**
* 学期所属年度。
*/
@NotNull(message = "学期年度不能为空")
@Min(value = 2000, message = "学期年度不能小于2000")
@Max(value = 2100, message = "学期年度不能大于2100")
private Integer year;
/**
* 同一年度内的学期序号。
*/
@NotNull(message = "学期序号不能为空")
@Min(value = 1, message = "学期序号不能小于1")
@Max(value = 10, message = "学期序号不能大于10")
private Integer sequenceNumber;
/**
* 开学时间。
*/
@NotNull(message = "开学时间不能为空")
private LocalDateTime startAt;
/**
* 学期结束时间。
*/
@NotNull(message = "学期结束时间不能为空")
private LocalDateTime endAt;
/**
* 是否设置为当前学期。
*/
@NotNull(message = "当前学期标志不能为空")
private Boolean currentSemester = Boolean.TRUE;
/**
* 调课是否不需要审批。
*/
@NotNull(message = "调课不审批标志不能为空")
private Boolean adjustmentWithoutApproval = Boolean.FALSE;
/**
* 课时系数方案编号。
*/
@Size(max = 100, message = "课时系数方案编号不能超过100个字符")
private String hourCoefficientSchemeId;
/**
* 是否禁止调课。
*/
@NotNull(message = "禁止调课标志不能为空")
private Boolean adjustmentForbidden = Boolean.FALSE;
/**
* 终结成绩是否定为及格。
*/
@NotNull(message = "终结成绩定及格标志不能为空")
private Boolean finalGradeAsPass = Boolean.FALSE;
/**
* 调课是否需要教务领导审核。
*/
@NotNull(message = "教务领导审核调课标志不能为空")
private Boolean leadershipReviewRequired = Boolean.FALSE;
/**
* 教员调整是否不需要审批。
*/
@NotNull(message = "教员调整不审批标志不能为空")
private Boolean teacherAdjustmentWithoutApproval = Boolean.FALSE;
/**
* 时间调整是否不需要审批。
*/
@NotNull(message = "时间调整不审批标志不能为空")
private Boolean timeAdjustmentWithoutApproval = Boolean.FALSE;
/**
* 保障调整是否不需要审批。
*/
@NotNull(message = "保障调整不审批标志不能为空")
private Boolean supportAdjustmentWithoutApproval = Boolean.FALSE;
/**
* 场地调整是否不需要审批。
*/
@NotNull(message = "场地调整不审批标志不能为空")
private Boolean venueAdjustmentWithoutApproval = Boolean.FALSE;
/**
* 锁定周数。
*/
@NotNull(message = "锁定周数不能为空")
@Min(value = 0, message = "锁定周数不能小于0")
@Max(value = 100, message = "锁定周数不能大于100")
private Integer lockedWeeks = Integer.valueOf(0);
/**
* 锁定计量单位。
*/
@Size(max = 50, message = "锁定计量单位不能超过50个字符")
private String lockMeasurementUnit;
/**
* 课时统计时间。
*/
private LocalDateTime teachingHourStatisticsAt;
}
@@ -0,0 +1,88 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 系统初始化基础参数保存参数。
*/
@Data
public class SystemInitializationConfigurationSaveDTO {
/**
* 页面查询到的当前版本编号。
*
* <p>系统已经存在配置时必须传入,用于防止旧页面覆盖其他人刚保存的新版本。</p>
*/
@Min(value = 1, message = "期望版本编号不能小于1")
private Integer expectedVersionId;
/**
* 新配置版本值;未填写时沿用当前版本值。
*/
@Size(max = 100, message = "配置版本值不能超过100个字符")
private String versionValue;
/**
* 院校名称。
*/
@NotBlank(message = "院校名称不能为空")
@Size(max = 200, message = "院校名称不能超过200个字符")
private String universityName;
/**
* 院校代码。
*/
@NotBlank(message = "院校代码不能为空")
@Size(max = 100, message = "院校代码不能超过100个字符")
private String universityCode;
/**
* 缺省系统名称。
*/
@NotBlank(message = "缺省系统名称不能为空")
@Size(max = 200, message = "缺省系统名称不能超过200个字符")
private String defaultSystemName;
/**
* 系统运行模式。
*/
@NotBlank(message = "系统运行模式不能为空")
@Size(max = 50, message = "系统运行模式不能超过50个字符")
private String systemMode;
/**
* 学期名称显示样式。
*/
@NotBlank(message = "学期名称样式不能为空")
@Size(max = 200, message = "学期名称样式不能超过200个字符")
private String semesterNameStyle;
/**
* 节次类别。
*/
@NotBlank(message = "节次类别不能为空")
@Size(max = 100, message = "节次类别不能超过100个字符")
private String periodCategory;
/**
* 学员队全名称是否包含年级。
*/
@NotNull(message = "学员队全名称含年级标志不能为空")
private Boolean studentTeamFullNameIncludesGrade;
/**
* 外部文件存储根路径。
*/
@NotBlank(message = "外部文件存储根路径不能为空")
@Size(max = 1000, message = "外部文件存储根路径不能超过1000个字符")
private String externalFileStorageRootPath;
/**
* 本站文件访问路径。
*/
@NotBlank(message = "本站文件访问路径不能为空")
@Size(max = 1000, message = "本站文件访问路径不能超过1000个字符")
private String localFileAccessPath;
}
@@ -0,0 +1,34 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
/**
* 系统初始化历史部别导入行。
*/
@Data
public class SystemInitializationDepartmentImportRowDTO {
/** 部别编号。 */
private String id;
/** 部别名称。 */
private String name;
/** 部别类别。 */
private String category;
/** 分类号。 */
private String classificationCode;
/** 分级号。 */
private Integer levelNumber;
/** 上级部别编号。 */
private String parentId;
/** 部别简称。 */
private String abbreviation;
/** 是否停用。 */
private Boolean disabled;
}
@@ -0,0 +1,42 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
/**
* 系统初始化最终执行确认参数。
*/
@Data
public class SystemInitializationExecutionDTO {
/**
* 页面预检查时使用的配置版本编号。
*/
@NotNull(message = "配置版本编号不能为空")
@Min(value = 1, message = "配置版本编号不能小于1")
private Integer expectedConfigurationVersionId;
/**
* 页面预检查时使用的当前学期年度。
*/
@NotNull(message = "当前学期年度不能为空")
@Min(value = 2000, message = "当前学期年度不能小于2000")
@Max(value = 2100, message = "当前学期年度不能大于2100")
private Integer semesterYear;
/**
* 页面预检查时使用的当前学期序号。
*/
@NotNull(message = "当前学期序号不能为空")
@Min(value = 1, message = "当前学期序号不能小于1")
private Integer semesterSequenceNumber;
/**
* 是否已经由操作人明确确认执行初始化。
*/
@NotNull(message = "初始化确认标志不能为空")
private Boolean confirmed;
}
@@ -0,0 +1,39 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 已从 Excel 解析并规范化的系统初始化历史基础数据。
*
* <p>该 DTO 只在 Controller 入参解析后的业务流程中流转,
* 不作为数据库实体或接口返回对象使用。</p>
*/
@Data
public class SystemInitializationHistoricalDataDTO {
/**
* 原始上传文件名称。
*/
private String fileName;
/**
* 待导入部别。
*/
private List<SystemInitializationDepartmentImportRowDTO> departments =
new ArrayList<>();
/**
* 待导入教研室及其所属部别。
*/
private List<SystemInitializationResearchOfficeImportRowDTO>
researchOffices = new ArrayList<>();
/**
* 待导入部别人员。
*/
private List<SystemInitializationPersonnelImportRowDTO> personnel =
new ArrayList<>();
}
@@ -0,0 +1,19 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import jakarta.validation.constraints.NotNull;
/**
* 系统初始化历史基础数据导入参数。
*/
@Data
public class SystemInitializationHistoricalImportDTO {
/**
* 包含“部别”“教研室”“部别人员”工作表的 Excel 文件。
*/
@NotNull(message = "历史数据文件不能为空")
private MultipartFile file;
}
@@ -0,0 +1,37 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
/**
* 系统初始化历史部别人员导入行。
*/
@Data
public class SystemInitializationPersonnelImportRowDTO {
/** 人员编号。 */
private String id;
/** 所属部别编号。 */
private String departmentId;
/** 人员姓名。 */
private String name;
/** 显示序号。 */
private String sequenceNumber;
/** 职务。 */
private String position;
/** 卡号。 */
private String cardNumber;
/** 姓名拼音。 */
private String pinyin;
/** 是否为主官。 */
private Boolean principal;
/** 是否离职。 */
private Boolean departed;
}
@@ -0,0 +1,43 @@
package com.roomroot.jwgl.dto.systeminitialization;
import lombok.Data;
/**
* 系统初始化历史教研室导入行。
*/
@Data
public class SystemInitializationResearchOfficeImportRowDTO {
/** 教研室编号。 */
private String id;
/** 教研室名称。 */
private String name;
/** 所属部别编号。 */
private String departmentId;
/** 教研室简称。 */
private String abbreviation;
/** 显示序号。 */
private String sequenceNumber;
/** 备注。 */
private String remark;
/** 是否为虚拟教研室。 */
private Boolean virtual;
/** 是否具有机关性质。 */
private Boolean organNature;
/** 是否停用。 */
private Boolean disabled;
/** 教研室原有部系文本。 */
private String departmentText;
/** 待建立隶属关系的服务端编号。 */
private String relationId;
}
@@ -0,0 +1,103 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 班次课堂教学日志
* <p>
* 教学日志核心表,记录每堂课的教学情况。
* 状态(zt): 0-未填写 1-填写中 2-已上报教研室 3-已上报中层单位 4-已上报业务机关 5-已审核通过
* </p>
*/
@Data
@TableName("班次课堂教学日志")
public class BCKTJXRZ {
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
@TableField("实施_课程编号")
private String sskcbh;
@TableField("实施_课程表编号")
private String sskcbbh;
@TableField("学员队编号")
private String xydbh;
@TableField("年度")
private Integer nd;
@TableField("日期")
private LocalDateTime rq;
@TableField("节次")
private Integer jc;
@TableField("实际时间安排")
private Integer sjsjap;
@TableField("课程科目编号")
private String kckmbh;
@TableField("教学方法")
private String jxff;
@TableField("应到人数")
private Integer ydrs;
@TableField("实到人数")
private Integer sdrs;
@TableField("调停课情况")
private String dtkqk;
@TableField("授课情况_教学态度")
private String skqkjxtd;
@TableField("授课情况_教学内容")
private String skqkjxnr;
@TableField("授课情况_教学方法")
private String skqkjxff;
@TableField("授课情况_课堂管理")
private String skqkktgl;
@TableField("授课情况_学习收获")
private String skqkxxsh;
@TableField("领导专家听查课")
private Integer ldzjtck;
@TableField("跟班队干编号")
private String gbdgbh;
@TableField("教学状态")
private String jxzt;
@TableField("意见建议")
private String yjjy;
/** 状态: 0-未填写 1-填写中 2-已上报教研室 3-已上报中层单位 4-已上报业务机关 5-已审核通过 */
@TableField("状态")
private String zt;
@TableField("教务部门反馈意见")
private String jwbmfkyj;
@TableField("填报学员编号")
private String tbxybh;
@TableField("核准管理员编号")
private String hzglybh;
@TableField("教学管理机构编号")
private String jxgljgbh;
@TableField("与实施计划一致")
private Integer yssjhyz;
}
@@ -0,0 +1,44 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.roomroot.jwgl.unit.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 班次课堂教学日志_授课教员
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("班次课堂教学日志_授课教员")
public class BCKTJXRZSKJY extends BaseEntity {
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
@TableField("班次课堂教学日志_编号")
private String bcktjxrzbh;
@TableField("辅助教员编号")
private String fzjybh;
/** 主教员: 1-主讲教师 0-辅讲教师 */
@TableField("主教员")
private Integer zjy;
@TableField("年度")
private Integer nd;
@TableField(exist = false)
private LocalDateTime createTime;
@TableField(exist = false)
private LocalDateTime updateTime;
@TableField(exist = false)
private String createBy;
@TableField(exist = false)
private String updateBy;
@TableField(exist = false)
private Integer delFlag;
}
@@ -0,0 +1,106 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.roomroot.jwgl.unit.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 班次学期教材需求表
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("班次学期教材需求表")
public class BCXQJCXQB extends BaseEntity {
/**
* 编号
*/
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
/**
* 教学任务教材需求编号
*/
private String jxrwjcxqbh;
/**
* 班次学期编号
*/
private String bcxqbh;
/**
* 班次编号
*/
private String bcbh;
/**
* 教材信息编号
*/
private String jcxxbh;
/**
* 课编号
*/
private String kbh;
/**
* 需求数量
*/
private Integer xqsl;
/**
* 年度
*/
private Integer nd;
/**
* 教材性质
*/
private String jcxz;
/**
* 教材选用说明
*/
private String jcxysm;
/**
* 领用类型
*/
private String lylx;
/**
* 领用教材库存明细项编号
*/
private String lyjckcmxxbh;
/**
* 领用教材库存单编号
*/
private String lyjckcdbh;
/**
* 创建时间
*/
private LocalDateTime cjsj;
/**
* 修改时间
*/
private LocalDateTime xgsj;
/**
* 开课日期
*/
private LocalDateTime kkrq;
/**
* 开班日期
*/
private LocalDateTime kbrq;
}
@@ -0,0 +1,81 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.roomroot.jwgl.unit.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 补考
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("补考")
public class BK extends BaseEntity {
/**
* 编号
*/
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
/**
* 年度
*/
private Integer nd;
/**
* 名称
*/
private String mc;
/**
* 补考时间
*/
private LocalDateTime bksj;
/**
* 补考地点
*/
private String bkdd;
/**
* 补考负责人编号
*/
private String bkfzrbh;
/**
* 补考状态
*/
private String bkzt;
/**
* 创建时间
*/
private LocalDateTime cjsj;
/**
* 成绩录入时间
*/
private LocalDateTime cjlrsj;
/**
* 成绩审核时间
*/
private LocalDateTime cjshsj;
/**
* 备注
*/
private String bz;
/**
* 缓考为终结性成绩
*/
private Integer hkwzjxcj;
}
@@ -0,0 +1,39 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.roomroot.jwgl.unit.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 补考地点表
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("补考地点表")
public class BKDDB extends BaseEntity {
/**
* 编号
*/
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
/**
* 补考编号
*/
private String bkbh;
/**
* 教室编号
*/
private String jsbh;
/**
* 备注
*/
private String bz;
}
@@ -0,0 +1,39 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.roomroot.jwgl.unit.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 补考监考表
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("补考监考表")
public class BKJKB extends BaseEntity {
/**
* 编号
*/
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
/**
* 补考编号
*/
private String bkbh;
/**
* 教员编号
*/
private String jybh;
/**
* 备注
*/
private String bz;
}
@@ -0,0 +1,49 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.roomroot.jwgl.unit.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 补考学员
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("补考学员")
public class BKXY extends BaseEntity {
/**
* 编号
*/
@TableId(value = "编号", type = IdType.INPUT)
private String bh;
/**
* 学员课程成绩编号
*/
private String xykccjbh;
/**
* 补考编号
*/
private String bkbh;
/**
* 考试成绩
*/
private Float kscj;
/**
* 备注
*/
private String bz;
/**
* 缓考
*/
private Integer hk;
}
@@ -0,0 +1,40 @@
package com.roomroot.jwgl.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
/**
* 保障类别
*/
@Data
@TableName(value = "保障类别", schema = "JW")
public class BZLB {
/**
* 编号
*/
@TableId(value = "BH", type = IdType.INPUT)
private String bh;
/**
* 名称
*/
@TableField("名称")
private String mc;
/**
* 部门编号
*/
@TableField("部门编号")
private String bmbh;
/**
* 停用
*/
@TableField("停用")
private Integer ty;
}

Some files were not shown because too many files have changed in this diff Show More