diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/CourseRunningController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/CourseRunningController.java index 270351230..d13505346 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/CourseRunningController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/CourseRunningController.java @@ -3,7 +3,6 @@ package com.roomroot.web.controller.jwgl; import com.roomroot.jwgl.dto.courserunning.ClassesImportDTO; import com.roomroot.jwgl.dto.courserunning.ImportRemoveDTO; import com.roomroot.jwgl.dto.courserunning.ScheduleAdjustApplyDTO; -import com.roomroot.jwgl.dto.courserunning.ScheduleAdjustStrategyDTO; import com.roomroot.jwgl.dto.courserunning.ScheduleAdjustAuditDTO; import com.roomroot.jwgl.dto.courserunning.ScheduleAdjustQueryDTO; import com.roomroot.jwgl.dto.courserunning.SemesterImportDTO; @@ -309,7 +308,7 @@ public class CourseRunningController { * 查询单个调课申请的完整详情。 *
* 根据调课申请编号查询该申请的完整信息,包括申请信息、调整后的内容、 - * 教研室审批状态、机关审批记录、关联的教室、辅助教员、学员队、保障明细等。 + * 教研室审批与查收状态、关联的教室、辅助教员、学员队、保障明细等。 *
* * @param ssdksqbh 调课申请编号 @@ -338,148 +337,30 @@ public class CourseRunningController { /** * 教研室审批调课申请。 *- * 教研室审批教员提交的调课申请,包含同意、发回、拒绝三种处理方式。 + * 教研室审批调课申请。点审批即已查收,审批人同时记为查收人。 + * 同意、发回、拒绝均为已查收;教员撤回后为未查收。 *
* - * @param dto 教研室审批参数(auditRole 传 "jys") + * @param dto 教研室审批参数 * @return 操作结果 */ @PostMapping("/adjust/audit/jys") public Result- * 教研室查收调课申请,标记查收状态和查收时间。 - *
- * - * @param ssdksqbh 调课申请编号 - * @param csrbh 查收人编号 - * @return 操作结果 - */ - @PostMapping("/adjust/receive/jys") - public Result- * 教学系审批教研室已同意的调课申请,包含同意、发回、拒绝三种处理方式。 - * 构成三级审批流程的中间环节(教研室→教学系→机关)。 - *
- * - * @param dto 教学系审批参数(auditRole 传 "jxx") - * @return 操作结果 - */ - @PostMapping("/adjust/audit/jxx") - public Result- * 机关审批教研室已同意的调课申请,包含同意、发回、拒绝三种处理方式。 - *
- * - * @param dto 机关审批参数(auditRole 传 "jg",需传 jgbh) - * @return 操作结果 - */ - @PostMapping("/adjust/audit/jg") - public Result- * 机关查收调课申请,标记查收状态和查收时间。 - *
- * - * @param ssdksqbh 调课申请编号 - * @param jgbh 机关编号 - * @param csrbh 查收人编号 - * @return 操作结果 - */ - @PostMapping("/adjust/receive/jg") - public Result- * 教员撤销自己提交的、未经过审批的调课申请。 + * 教员撤销未经过审批的调课申请。列表已按登录教员过滤,只需传申请编号。 *
* * @param ssdksqbh 调课申请编号 - * @param sqjybh 申请教员编号 * @return 操作结果 */ @DeleteMapping("/adjust/cancel") - public Result- * 支持按策略类型筛选,返回所有策略(含停用)。 - *
- * - * @param cllx 策略类型:TIME_LIMIT=时间段限制,AUTO_APPROVE=免审批,为空时查询全部 - * @return 调课策略列表 - */ - @GetMapping("/adjust/strategy/list") - public Result- * 策略编号为空时执行新增,非空时执行修改。 - *
- * - * @param dto 策略参数 - * @return 策略编号 - */ - @PostMapping("/adjust/strategy/save") - public Result表头顺序:教员编号, 教员姓名, 教研室代号, 职称, 专业技术职务等级, 教员类别, + * 性别, 手机号, 身份证号, 备注, 序号, 虚实类型。教员编号不填自动创建,离职状态默认 0。
+ */ + @PostMapping("/teacher/import") + public Result表头顺序:专业代号, 专业名称, 专业代码, 专业版本, 培训类型, 培训层次, 学年制, + * 学期数, 专业方向, 专业备注, 学员类别, 简称, 培训类型2。专业代号不填自动生成。
+ */ + @PostMapping("/import") + public Result表头顺序:专业代号, 课编号, 学期第次, 课类型, 学时, 学分, 周课时, 课程定位, + * 模块, 成绩分制, 理论学时, 实践学时, 考试课时, 教研室代号, 简称。编号由系统自动生成。
+ */ + @PostMapping("/import") + public Result该配置对已有在线会话执行账户状态校验,同时保持普通匿名请求的原有访问规则; - * 账户管理路径继续执行超级管理员权限校验,并在校验通过后采集操作日志上下文。
+ * 操作日志采集 Web MVC 配置。 + *页面菜单权限由前端控制;后台只校验登录态,查询时再按角色和用户ID过滤数据。
*/ @Configuration public class AccountManagementWebMvcConfig implements WebMvcConfigurer { - /** - * 账户管理身份和权限拦截器。 - */ - private final AccountManagementAuthorizationInterceptor - authorizationInterceptor; - - /** - * 操作日志统一请求采集拦截器。 - */ private final OperationLogInterceptor operationLogInterceptor; - private final JwglApiAccessInterceptor jwglApiAccessInterceptor; - - /** - * 构造账户管理和操作日志统一 Web MVC 配置。 - * - * @param authorizationInterceptor 账户管理身份和权限拦截器 - * @param operationLogInterceptor 操作日志统一请求采集拦截器 - * @param jwglApiAccessInterceptor 教务角色接口访问拦截器 - */ - public AccountManagementWebMvcConfig( - AccountManagementAuthorizationInterceptor - authorizationInterceptor, - OperationLogInterceptor operationLogInterceptor, - JwglApiAccessInterceptor jwglApiAccessInterceptor) { - // 第一步:保存账户管理专用拦截器,供 MVC 注册阶段使用。 - this.authorizationInterceptor = authorizationInterceptor; - - // 第二步:保存操作日志采集拦截器,供 MVC 注册阶段使用。 + public AccountManagementWebMvcConfig(OperationLogInterceptor operationLogInterceptor) { this.operationLogInterceptor = operationLogInterceptor; - - this.jwglApiAccessInterceptor = jwglApiAccessInterceptor; } - /** - * 注册账户状态校验、账户管理权限和操作日志采集规则。 - * - * @param registry Spring MVC 拦截器注册器 - */ @Override public void addInterceptors(InterceptorRegistry registry) { - /* - * 第一步:注册账户管理鉴权拦截器。 - * 第二步:覆盖全部 Controller 请求,使停用或已合并账户不能绕过 - * 账户管理路径继续访问其他业务接口。 - * 第三步:拦截器内部会放行没有 Servlet 会话的普通匿名请求, - * 因此不会改变项目现有公开接口的访问方式。 - */ - // registry.addInterceptor(authorizationInterceptor) - // .addPathPatterns("/**"); - - /* - * 第四步:在账户状态和账户管理权限校验通过后采集日志上下文。 - * 第五步:覆盖全部 Controller 请求,由采集拦截器自行跳过 - * 非 Controller 处理器和没有有效登录记录的请求。 - */ - registry.addInterceptor(jwglApiAccessInterceptor) - .addPathPatterns("/**") - .excludePathPatterns( - "/login", - "/register", - "/captchaImage", - "/jys/teacher/list", - "/swagger-ui/**", - "/v3/api-docs/**", - "/druid/**"); - registry.addInterceptor(operationLogInterceptor) .addPathPatterns("/**"); } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustApplyDTO.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustApplyDTO.java index 04a9b875d..877a19cba 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustApplyDTO.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustApplyDTO.java @@ -24,10 +24,10 @@ public class ScheduleAdjustApplyDTO { private String sskcbbh; /** - * 调课事由,必填,描述本次调课的原因和依据。 + * 调课事由,对应 实施_调课申请.事由 VARCHAR(200)。 */ @NotBlank(message = "调课事由不能为空") - @Size(max = 500, message = "调课事由不能超过500个字符") + @Size(max = 200, message = "调课事由不能超过200个字符") private String sy; /** @@ -79,9 +79,9 @@ public class ScheduleAdjustApplyDTO { private String xjsbh; /** - * 调课后教学内容,调整后的本节课教学主题或知识点。 + * 调课后教学内容,对应 实施_调课申请.教学内容 VARCHAR(500)。 */ - @Size(max = 2000, message = "教学内容不能超过2000个字符") + @Size(max = 500, message = "教学内容不能超过500个字符") private String jxnr; /** @@ -91,9 +91,9 @@ public class ScheduleAdjustApplyDTO { private String jxyd; /** - * 调课后教学方法,调整后的教学方法。 + * 调课后教学方法,对应 实施_调课申请.教学方法 VARCHAR(50)。 */ - @Size(max = 200, message = "教学方法不能超过200个字符") + @Size(max = 50, message = "教学方法不能超过50个字符") private String jxff; /** @@ -109,9 +109,9 @@ public class ScheduleAdjustApplyDTO { private String ycxx; /** - * 备注,补充说明信息。 + * 备注,对应 实施_调课申请.备注 VARCHAR(50)。 */ - @Size(max = 500, message = "备注不能超过500个字符") + @Size(max = 50, message = "备注不能超过50个字符") private String bz; /** diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustAuditDTO.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustAuditDTO.java index 1ce2812df..68fb81838 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustAuditDTO.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustAuditDTO.java @@ -2,53 +2,42 @@ package com.roomroot.jwgl.dto.courserunning; import lombok.Data; -import jakarta.validation.constraints.*; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; /** - * 调课申请审批参数。 - *- * 用于教研室或机关审批调课申请,包含审批结果、审批意见和审批人编号。 - *
+ * 教研室审批调课申请参数。 */ @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-拒绝。 + * 审批结果:1-同意,2-发回,3-拒绝。点审批即已查收。 */ @NotNull(message = "审批结果不能为空") + @Min(value = 1, message = "审批结果不正确") + @Max(value = 3, message = "审批结果不正确") private Integer spzt; /** - * 审批意见,可选,记录审批的具体意见或发回原因。 + * 审批意见,发回时填写原因。 */ @Size(max = 500, message = "审批意见不能超过500个字符") private String fhyj; /** - * 审批人编号,不传时由服务端取当前登录人。 + * 审批人编号,不传时取当前登录人;同时记为查收人。 */ @Size(max = 50, message = "审批人编号不能超过50个字符") private String sprbh; - - /** - * 机关编号,机关审批时可选。 - */ - @Size(max = 50, message = "机关编号不能超过50个字符") - private String jgbh; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustQueryDTO.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustQueryDTO.java index ec9ebff35..776d8d94a 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustQueryDTO.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustQueryDTO.java @@ -38,15 +38,10 @@ public class ScheduleAdjustQueryDTO extends PageQuery { private Integer jyspzzt; /** - * 教研室查收状态:0-未查收,1-已查收。 + * 教研室查收状态:0-未查收,1-已查收。点了审批即为已查收。 */ private Integer jyscszt; - /** - * 机关审批状态:0-未审批,1-已同意,2-已发回,3-已拒绝。 - */ - private Integer jgspzt; - /** * 删除状态:0-正常,1-已删除。 */ diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustStrategyDTO.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustStrategyDTO.java deleted file mode 100644 index 7ae2004e3..000000000 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/courserunning/ScheduleAdjustStrategyDTO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.roomroot.jwgl.dto.courserunning; - -import lombok.Data; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; -import java.time.LocalDateTime; - -/** - * 调课策略新增/修改参数。 - *- * 统一处理新增和修改:策略编号为空时执行新增,非空时执行修改。 - * 策略类型为 TIME_LIMIT 时需填写截止星期和截止节次; - * 策略类型为 AUTO_APPROVE 时截止星期和截止节次不生效。 - *
- */ -@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; -} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQBZMX.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQBZMX.java index 2415b9675..d009e03bd 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQBZMX.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQBZMX.java @@ -1,8 +1,9 @@ package com.roomroot.jwgl.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.roomroot.jwgl.unit.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,55 +18,48 @@ import java.time.LocalDateTime; @TableName("调课申请_保障明细") public class DKSQBZMX extends BaseEntity { - /** - * 编号 - */ @TableId(value = "编号", type = IdType.INPUT) private String bh; - /** - * 申请编号 - */ + @TableField("申请编号") private String sqbh; - /** - * 保障提供明细编号 - */ + @TableField("保障提供明细编号") private String bztgmxbh; - /** - * 数量 - */ + @TableField("数量") private Integer sl; - /** - * 备注 - */ + @TableField("备注") private String bz; - /** - * 查收状态 - */ + @TableField("查收状态") private Integer cszt; - /** - * 查收时间 - */ + @TableField("查收时间") private LocalDateTime cssj; - /** - * 年度 - */ + @TableField("年度") private Integer nd; - /** - * 日期 - */ + @TableField("日期") private LocalDateTime rq; - /** - * 节次 - */ + @TableField("节次") private Integer jc; + @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; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQFZJY.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQFZJY.java index f9c0524aa..48fbf05e5 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQFZJY.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQFZJY.java @@ -1,8 +1,9 @@ package com.roomroot.jwgl.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.roomroot.jwgl.unit.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,60 +18,51 @@ import java.time.LocalDateTime; @TableName("调课申请_辅助教员") public class DKSQFZJY extends BaseEntity { - /** - * 编号 - */ @TableId(value = "编号", type = IdType.INPUT) private String bh; - /** - * 调课申请编号 - */ + @TableField("调课申请编号") private String dksqbh; - /** - * 辅助教员编号 - */ + @TableField("辅助教员编号") private String fzjybh; - /** - * 查收状态 - */ + @TableField("查收状态") private Integer cszt; - /** - * 查收时间 - */ + @TableField("查收时间") private LocalDateTime cssj; - /** - * 主教员 - */ + @TableField("主教员") private Integer zjy; - /** - * 移除状态 - */ + @TableField("移除状态") private Integer yczt; - /** - * 年度 - */ + @TableField("年度") private Integer nd; - /** - * 备注 - */ + @TableField("备注") private String bz; - /** - * 日期 - */ + @TableField("日期") private LocalDateTime rq; - /** - * 节次 - */ + @TableField("节次") private Integer jc; + @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; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQJS.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQJS.java index eeee15723..6b3241405 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQJS.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQJS.java @@ -1,8 +1,9 @@ package com.roomroot.jwgl.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.roomroot.jwgl.unit.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,40 +18,39 @@ import java.time.LocalDateTime; @TableName("调课申请_教室") public class DKSQJS extends BaseEntity { - /** - * 编号 - */ @TableId(value = "编号", type = IdType.INPUT) private String bh; - /** - * 调课申请编号 - */ + @TableField("调课申请编号") private String dksqbh; - /** - * 教室编号 - */ + @TableField("教室编号") private String jsbh; - /** - * 备注 - */ + @TableField("备注") private String bz; - /** - * 年度 - */ + @TableField("年度") private Integer nd; - /** - * 日期 - */ + @TableField("日期") private LocalDateTime rq; - /** - * 节次 - */ + @TableField("节次") private Integer jc; + @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; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQXYD.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQXYD.java index 094602c4d..9a4ccf559 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQXYD.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/DKSQXYD.java @@ -1,8 +1,9 @@ package com.roomroot.jwgl.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.roomroot.jwgl.unit.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,50 +18,45 @@ import java.time.LocalDateTime; @TableName("调课申请_学员队") public class DKSQXYD extends BaseEntity { - /** - * 编号 - */ @TableId(value = "编号", type = IdType.INPUT) private String bh; - /** - * 调课申请编号 - */ + @TableField("调课申请编号") private String dksqbh; - /** - * 学员队编号 - */ + @TableField("学员队编号") private String xydbh; - /** - * 查收状态 - */ + @TableField("查收状态") private Integer cszt; - /** - * 查收时间 - */ + @TableField("查收时间") private LocalDateTime cssj; - /** - * 移除状态 - */ + @TableField("移除状态") private Integer yczt; - /** - * 年度 - */ + @TableField("年度") private Integer nd; - /** - * 日期 - */ + @TableField("日期") private LocalDateTime rq; - /** - * 节次 - */ + @TableField("节次") private Integer jc; + @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; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQ.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQ.java index b2cb9cc3f..6fc9bbe83 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQ.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQ.java @@ -57,16 +57,6 @@ public class SSDKSQ extends BaseEntity { @TableField("教研室批准人编号") private String jyspzrbh; - /** 原表无此列 */ - @TableField(exist = false) - private Integer jxxspzzt; - - @TableField(exist = false) - private LocalDateTime jxxspzsj; - - @TableField(exist = false) - private String jxxspzrbh; - @TableField("备注") private String bz; diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQSP.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQSP.java deleted file mode 100644 index 1a7f64a1e..000000000 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSDKSQSP.java +++ /dev/null @@ -1,81 +0,0 @@ -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 SSDKSQSP extends BaseEntity { - - /** - * 编号 - */ - @TableId(value = "编号", type = IdType.INPUT) - private String bh; - - /** - * 实施_调课申请编号 - */ - private String ssdksqbh; - - /** - * 机关编号 - */ - private String jgbh; - - /** - * 创建时间 - */ - private LocalDateTime cjsj; - - /** - * 审批时间 - */ - private LocalDateTime spsj; - - /** - * 审批状态 - */ - private Integer spzt; - - /** - * 审批人编号 - */ - private String sprbh; - - /** - * 查收状态 - */ - private Integer cszt; - - /** - * 查收时间 - */ - private LocalDateTime cssj; - - /** - * 查收人编号 - */ - private String csrbh; - - /** - * 发回意见 - */ - private String fhyj; - - /** - * 年度 - */ - private Integer nd; - -} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSKC.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSKC.java index da7c9efbf..883c299b7 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSKC.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/SSKC.java @@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; +import com.roomroot.jwgl.handler.DmGuidTypeHandler; import lombok.Data; +import org.apache.ibatis.type.JdbcType; import java.time.LocalDateTime; @@ -13,13 +15,14 @@ import java.time.LocalDateTime; * 实施_课程 */ @Data -@TableName(value = "实施_课程") +@TableName(value = "实施_课程", autoResultMap = true) public class SSKC { /** - * 编号 + * 编号(库内 VARBINARY(16),Java 侧按 36 位 UUID 字符串使用) */ @TableId(value = "编号", type = IdType.INPUT) + @TableField(value = "编号", jdbcType = JdbcType.VARBINARY, typeHandler = DmGuidTypeHandler.class) private String bh; /** diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/ScheduleAdjustStrategy.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/ScheduleAdjustStrategy.java deleted file mode 100644 index 953a6e161..000000000 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/ScheduleAdjustStrategy.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.roomroot.jwgl.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 实施_调课策略 - *- * 管理调课的时间段限制策略与免审批策略。 - * 策略类型为 TIME_LIMIT 时,用于限制教员在规定时间后不得调整下周课程; - * 策略类型为 AUTO_APPROVE 时,用于在生效范围内自动通过调课申请,跳过三级审批。 - *
- */ -@Data -@TableName("实施_调课策略") -public class ScheduleAdjustStrategy { - - /** 策略编号 */ - @TableId(value = "策略编号", type = IdType.INPUT) - private String clbh; - - /** 策略名称 */ - @TableField("策略名称") - private String clmc; - - /** - * 策略类型:TIME_LIMIT=时间段限制,AUTO_APPROVE=免审批 - */ - @TableField("策略类型") - private String cllx; - - /** 是否启用:0=停用,1=启用 */ - @TableField("是否启用") - private Integer sfqy; - - /** - * 截止星期:0-6(周日到周六),仅 TIME_LIMIT 类型使用。 - * 含义:当前时间超过该星期时,不允许调整下周课程。为空表示不限制星期。 - */ - @TableField("截止星期") - private Integer jzxq; - - /** - * 截止节次:仅 TIME_LIMIT 类型使用。 - * 含义:到达截止星期当天的该节次后不允许调整下周课程。为空表示不限制节次。 - */ - @TableField("截止节次") - private Integer jzjc; - - /** 生效开始时间(包含),为空表示不限制开始时间 */ - @TableField("生效开始时间") - private LocalDateTime sxkssj; - - /** 生效结束时间(包含),为空表示不限制结束时间 */ - @TableField("生效结束时间") - private LocalDateTime sxjssj; - - /** 备注 */ - @TableField("备注") - private String bz; - - /** 创建时间 */ - @TableField("创建时间") - private LocalDateTime cjsj; - - /** 更新时间 */ - @TableField("更新时间") - private LocalDateTime gxsj; -} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/handler/DmGuidTypeHandler.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/handler/DmGuidTypeHandler.java new file mode 100644 index 000000000..50e94b337 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/handler/DmGuidTypeHandler.java @@ -0,0 +1,41 @@ +package com.roomroot.jwgl.handler; + +import com.roomroot.jwgl.utils.UuidUtil; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 达梦 VARBINARY(16) GUID 与 Java 字符串互转。 + *+ * 仅通过实体 / resultMap 显式引用,避免把其它 VARBINARY 字段都当成 UUID。 + * 禁止把带横线的 CHAR UUID 直接绑定到 VARBINARY,达梦会按十六进制解析并报 -6147。 + *
+ */ +public class DmGuidTypeHandler extends BaseTypeHandler- * 提供调课申请审批记录数据的CRUD操作及自定义查询。 - *
- */ -@Mapper -public interface SSDKSQSPMapper extends BaseMapper- * 关联机构表获取机关名称,关联教员表获取审批人姓名。 - *
- * - * @param ssdksqbh 调课申请编号 - * @return 审批记录列表 - */ - List- * 教研室审批教员提交的调课申请,包含同意、发回、拒绝三种处理方式。 - * 同意时同步更新课次数据,发回时记录发回原因,拒绝时标记申请为已拒绝。 + * 教研室审批调课申请。点审批即已查收,审批人同时记为查收人。 + * 同意后写回课次;发回、拒绝也记为已查收。 *
* * @param dto 教研室审批参数 */ void auditByTeachingOffice(ScheduleAdjustAuditDTO dto); - /** - * 教研室查收调课申请。 - *- * 教研室查收调课申请,标记查收状态和查收时间。 - *
- * - * @param ssdksqbh 调课申请编号 - * @param csrbh 查收人编号 - */ - void receiveByTeachingOffice(String ssdksqbh, String csrbh); - - /** - * 教学系审批调课申请。 - *- * 教学系审批教研室已同意的调课申请,包含同意、发回、拒绝三种处理方式。 - * 教学系同意后流转到机关审批。 - *
- * - * @param dto 教学系审批参数 - */ - void auditByTeachingDepartment(ScheduleAdjustAuditDTO dto); - - /** - * 机关审批调课申请。 - *- * 机关审批教研室已同意的调课申请,包含同意、发回、拒绝三种处理方式。 - * 机关全部同意后调课申请最终生效,课次按调整后的内容执行。 - *
- * - * @param dto 机关审批参数 - */ - void auditByAuthority(ScheduleAdjustAuditDTO dto); - - /** - * 机关查收调课申请。 - *- * 机关查收调课申请,标记查收状态和查收时间。 - *
- * - * @param ssdksqbh 调课申请编号 - * @param jgbh 机关编号 - * @param csrbh 查收人编号 - */ - void receiveByAuthority(String ssdksqbh, String jgbh, String csrbh); - /** * 撤销调课申请。 *- * 教员撤销自己提交的、未经过审批的调课申请。 - * 软删除调课申请,标记删除状态为1。 + * 教员撤销未经过审批的调课申请。列表已按登录教员过滤。 *
* * @param ssdksqbh 调课申请编号 - * @param sqjybh 申请教员编号(用于权限校验) */ - void cancelScheduleAdjust(String ssdksqbh, String sqjybh); - - // ==================== 调课策略管理 ==================== - - /** - * 查询调课策略列表。 - *- * 支持按策略类型筛选,返回所有策略(含停用)。 - *
- * - * @param cllx 策略类型:TIME_LIMIT/AUTO_APPROVE,为空时查询全部 - * @return 调课策略列表 - */ - List- * 策略编号为空时执行新增,非空时执行修改。 - *
- * - * @param dto 策略参数 - * @return 策略编号 - */ - String saveScheduleAdjustStrategy(ScheduleAdjustStrategyDTO dto); - - /** - * 删除调课策略。 - * - * @param clbh 策略编号 - */ - void deleteScheduleAdjustStrategy(String clbh); + void cancelScheduleAdjust(String ssdksqbh); // ==================== 教学保障管理 ==================== diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/FacultyService.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/FacultyService.java index f203db276..f7c50b4ca 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/FacultyService.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/FacultyService.java @@ -76,6 +76,16 @@ public interface FacultyService { */ JYB getJYBById(String jYBH); + /** + * 从 Excel(.xls/.xlsx) 导入教员 + */ + int importJYBFromExcel(MultipartFile file) throws Exception; + + /** + * 导出教员到 Excel(.xlsx) + */ + void exportJYBExcel(jakarta.servlet.http.HttpServletResponse response) throws Exception; + /** * 分页条件查询教员列表 */ diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/TrainingProgramService.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/TrainingProgramService.java index 6ab673595..31dccfa1a 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/TrainingProgramService.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/TrainingProgramService.java @@ -53,4 +53,10 @@ public interface TrainingProgramService { * @return 分页结果 */ PageResult- * 教研室审批教员提交的调课申请,包含同意、发回、拒绝三种处理方式。 - * 同意时同步更新课次数据,发回时记录发回原因,拒绝时标记申请为已拒绝。 + * 教研室审批调课申请。点审批即已查收,审批人同时记为查收人。 + * 同意后写回课次;发回、拒绝也记为已查收。 *
* * @param dto 教研室审批参数 @@ -1226,26 +1175,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic @Override @Transactional(rollbackFor = Exception.class) public void auditByTeachingOffice(ScheduleAdjustAuditDTO dto) { - if (dto == null) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批参数不能为空"); - } - if (jwglRoleHelper.isTeacher()) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "教员无权审批调课申请"); - } - if (jwglRoleHelper.isDepartmentPersonnel() && !jwglRoleHelper.isAdmin()) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "机关人员请使用机关审批,不办理教研室审批"); - } - if (!jwglRoleHelper.isAdmin() && !jwglRoleHelper.isResearchOffice()) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "仅教研室可进行一审"); - } - if (!"jys".equals(dto.getAuditRole())) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批角色不正确,应为jys"); - } - if (dto.getSpzt() == null - || (dto.getSpzt() != 1 && dto.getSpzt() != 2 && dto.getSpzt() != 3)) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批结果不正确,应为1(同意)、2(发回)或3(拒绝)"); - } - SSDKSQ apply = ssdksqMapper.selectById(dto.getSsdksqbh()); if (apply == null) { throw new BusinessException(BasicManagementConstants.NOT_FOUND, "调课申请不存在"); @@ -1253,17 +1182,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic if (apply.getSczt() != null && apply.getSczt() == 1) { throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已撤销,不允许审批"); } - if (jwglRoleHelper.isResearchOffice()) { - String officeId = jwglRoleHelper.requireResearchOfficeId(); - String applyOffice = apply.getJysdh(); - if (StringUtils.isEmpty(applyOffice) && StringUtils.isNotEmpty(apply.getSqjybh())) { - JYB teacher = jybMapper.selectById(apply.getSqjybh()); - applyOffice = teacher == null ? null : teacher.getJysdh(); - } - if (applyOffice == null || !officeId.equals(applyOffice.trim())) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "只能审批本教研室的调课申请"); - } - } if (apply.getJyspzzt() != null && apply.getJyspzzt() != 0) { throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已审批,无需重复审批"); } @@ -1273,275 +1191,36 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic apply.setJyspzzt(dto.getSpzt()); apply.setJyspzrbh(auditor); apply.setJyspzsj(now); + apply.setJyscszt(1); + apply.setJyscsrbh(auditor); + apply.setJyscssj(now); apply.setFhyj(dto.getFhyj()); - if (dto.getSpzt() != null && dto.getSpzt() == 2) { + if (dto.getSpzt() == 2) { apply.setFhzt(1); apply.setFhsj(now); } ssdksqMapper.updateById(apply); - recordOperationLog(apply.getBh(), "教研室审批", "教研室审批调课申请:" + apply.getBh() - + ",审批结果:" + dto.getSpzt() + ",审批意见:" + dto.getFhyj()); - } - - /** - * 教研室查收调课申请。 - *- * 教研室查收调课申请,标记查收状态和查收时间。 - *
- * - * @param ssdksqbh 调课申请编号 - * @param csrbh 查收人编号 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void receiveByTeachingOffice(String ssdksqbh, String csrbh) { - // 步骤1:校验参数 - if (ssdksqbh == null || ssdksqbh.trim().isEmpty()) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "调课申请编号不能为空"); - } - if (csrbh == null || csrbh.trim().isEmpty()) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "查收人编号不能为空"); - } - - // 步骤2:查询调课申请实体 - SSDKSQ apply = ssdksqMapper.selectById(ssdksqbh); - if (apply == null) { - throw new BusinessException(BasicManagementConstants.NOT_FOUND, "调课申请不存在"); - } - - // 步骤3:校验是否已查收,避免重复查收 - if (apply.getJyscszt() != null && apply.getJyscszt() == 1) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已查收,无需重复查收"); - } - - // 步骤4:更新查收状态和查收时间 - apply.setJyscszt(1); // 教研室查收状态:已查收 - apply.setJyscsrbh(csrbh); // 教研室查收人编号 - apply.setJyscssj(LocalDateTime.now()); // 教研室查收时间 - apply.setUpdateTime(LocalDateTime.now()); // 更新时间 - ssdksqMapper.updateById(apply); - - // 步骤5:记录查收操作日志 - recordOperationLog(apply.getBh(), "教研室查收", "教研室查收调课申请:" + apply.getBh()); - } - - /** - * 教学系审批调课申请。 - *- * 教学系审批教研室已同意的调课申请,包含同意、发回、拒绝三种处理方式。 - * 教学系同意后流转到机关审批,构成三级审批流程(教研室→教学系→机关)。 - *
- * - * @param dto 教学系审批参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void auditByTeachingDepartment(ScheduleAdjustAuditDTO dto) { - // 步骤1:校验审批参数 - if (dto == null) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批参数不能为空"); - } - if (!"jxx".equals(dto.getAuditRole())) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批角色不正确,应为jxx"); - } - if (dto.getSpzt() == null - || (dto.getSpzt() != 1 && dto.getSpzt() != 2 && dto.getSpzt() != 3)) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批结果不正确,应为1(同意)、2(发回)或3(拒绝)"); - } - - // 步骤2:查询调课申请实体 - SSDKSQ apply = ssdksqMapper.selectById(dto.getSsdksqbh()); - if (apply == null) { - throw new BusinessException(BasicManagementConstants.NOT_FOUND, "调课申请不存在"); - } - if (apply.getSczt() != null && apply.getSczt() == 1) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已撤销,不允许审批"); - } - - // 步骤3:校验教研室是否已同意,教学系审批应在教研室同意之后进行 - if (apply.getJyspzzt() == null || apply.getJyspzzt() != 1) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "教研室未同意或未审批,无法进行教学系审批"); - } - - // 步骤4:校验教学系是否已审批,避免重复审批 - if (apply.getJxxspzzt() != null && apply.getJxxspzzt() != 0) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请教学系已审批,无需重复审批"); - } - - // 步骤5:更新调课申请主表的教学系审批状态 - LocalDateTime now = LocalDateTime.now(); - apply.setJxxspzzt(dto.getSpzt()); // 教学系审批状态 - apply.setJxxspzrbh(dto.getSprbh()); // 教学系审批人编号 - apply.setJxxspzsj(now); // 教学系审批时间 - apply.setFhyj(dto.getFhyj()); // 发回意见 - apply.setUpdateTime(now); // 更新时间 - ssdksqMapper.updateById(apply); - - // 步骤6:根据审批结果执行不同的后续处理 - if (dto.getSpzt() == 3) { - // 拒绝:恢复课次原数据,标记申请最终结束 - restoreLessonSchedule(apply); - } else if (dto.getSpzt() == 2) { - // 发回:发回教研室,课次保留调整后数据,由教研室重新处理 - } else { - // 同意:流转到机关审批 - } - - // 步骤7:记录教学系审批操作日志 - recordOperationLog(apply.getBh(), "教学系审批", "教学系审批调课申请:" + apply.getBh() - + ",审批结果:" + dto.getSpzt() + ",审批意见:" + dto.getFhyj()); - } - - /** - * 机关审批调课申请。 - *- * 机关审批教研室已同意的调课申请,包含同意、发回、拒绝三种处理方式。 - * 机关全部同意后调课申请最终生效,课次按调整后的内容执行。 - *
- * - * @param dto 机关审批参数 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void auditByAuthority(ScheduleAdjustAuditDTO dto) { - // 步骤1:校验审批参数 - if (dto == null) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批参数不能为空"); - } - if (!"jg".equals(dto.getAuditRole())) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批角色不正确,应为jg"); - } - if (dto.getSpzt() == null - || (dto.getSpzt() != 1 && dto.getSpzt() != 2 && dto.getSpzt() != 3)) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "审批结果不正确"); - } - if (jwglRoleHelper.isTeacher() || jwglRoleHelper.isResearchOffice()) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "仅机关人员可进行终审"); - } - if (!jwglRoleHelper.isAdmin() && !jwglRoleHelper.isDepartmentPersonnel()) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "仅机关人员可进行终审"); - } - - SSDKSQ apply = ssdksqMapper.selectById(dto.getSsdksqbh()); - if (apply == null) { - throw new BusinessException(BasicManagementConstants.NOT_FOUND, "调课申请不存在"); - } - if (apply.getSczt() != null && apply.getSczt() == 1) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已撤销,不允许审批"); - } - if (apply.getJyspzzt() == null || apply.getJyspzzt() != 1) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "教研室未同意,无法进行机关审批"); - } - - String jgbh = StringUtils.isNotEmpty(dto.getJgbh()) ? dto.getJgbh() : "JG"; - String auditor = StringUtils.isNotEmpty(dto.getSprbh()) ? dto.getSprbh() : currentOperatorId(); - - SSDKSQSP audit = new SSDKSQSP(); - audit.setBh(UuidUtil.getOriginalUUID()); - audit.setSsdksqbh(dto.getSsdksqbh()); - audit.setJgbh(jgbh); - audit.setSprbh(auditor); - audit.setSpsj(LocalDateTime.now()); - audit.setSpzt(dto.getSpzt()); - audit.setFhyj(dto.getFhyj()); - audit.setNd(apply.getNd()); - audit.setCreateTime(LocalDateTime.now()); - audit.setUpdateTime(LocalDateTime.now()); - ssdksqspMapper.insert(audit); - if (dto.getSpzt() == 1) { applyApprovedSchedule(apply); } - recordOperationLog(apply.getBh(), "机关审批", "机关审批调课申请:" + apply.getBh() - + ",机关编号:" + jgbh + recordOperationLog(apply.getBh(), "教研室审批", "教研室审批调课申请:" + apply.getBh() + ",审批结果:" + dto.getSpzt() + ",审批意见:" + dto.getFhyj()); } - /** - * 机关查收调课申请。 - *- * 机关查收调课申请,标记查收状态和查收时间。 - *
- * - * @param ssdksqbh 调课申请编号 - * @param jgbh 机关编号 - * @param csrbh 查收人编号 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void receiveByAuthority(String ssdksqbh, String jgbh, String csrbh) { - // 步骤1:校验参数 - if (ssdksqbh == null || ssdksqbh.trim().isEmpty()) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "调课申请编号不能为空"); - } - if (jgbh == null || jgbh.trim().isEmpty()) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "机关编号不能为空"); - } - if (csrbh == null || csrbh.trim().isEmpty()) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "查收人编号不能为空"); - } - - // 步骤2:查询调课申请实体 - SSDKSQ apply = ssdksqMapper.selectById(ssdksqbh); - if (apply == null) { - throw new BusinessException(BasicManagementConstants.NOT_FOUND, "调课申请不存在"); - } - - // 步骤3:检查当前机关是否已查收 - LambdaQueryWrapper- * 教员撤销自己提交的、未经过审批的调课申请。 - * 软删除调课申请,标记删除状态为1。 - * 事务保证主表软删除与课次原数据恢复的一致性。 + * 教员撤销未经过审批的调课申请。列表已按登录教员过滤。 *
* * @param ssdksqbh 调课申请编号 - * @param sqjybh 申请教员编号(用于权限校验) */ @Override @Transactional(rollbackFor = Exception.class) - public void cancelScheduleAdjust(String ssdksqbh, String sqjybh) { - if (jwglRoleHelper.isDepartmentPersonnel() || jwglRoleHelper.isResearchOffice()) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "仅申请教员本人可撤销调课申请"); - } - if (ssdksqbh == null || ssdksqbh.trim().isEmpty()) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "调课申请编号不能为空"); - } - String teacherId = jwglRoleHelper.requireTeacherId(); - if (sqjybh != null && !sqjybh.trim().isEmpty() && !teacherId.equals(sqjybh.trim())) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "仅申请教员本人可撤销该调课申请"); - } - sqjybh = teacherId; - + public void cancelScheduleAdjust(String ssdksqbh) { SSDKSQ apply = ssdksqMapper.selectById(ssdksqbh); if (apply == null) { throw new BusinessException(BasicManagementConstants.NOT_FOUND, "调课申请不存在"); @@ -1549,29 +1228,19 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic if (apply.getSczt() != null && apply.getSczt() == 1) { throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已撤销,无需重复撤销"); } - if (!sqjybh.equals(apply.getSqjybh())) { - throw new BusinessException(BasicManagementConstants.FORBIDDEN, "仅申请教员本人可撤销该调课申请"); + if (apply.getJyspzzt() != null && apply.getJyspzzt() != 0) { + throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请已审批,不允许撤销"); } - if (apply.getJyspzzt() != null && apply.getJyspzzt() == 1) { - throw new BusinessException(BasicManagementConstants.BAD_REQUEST, "该调课申请教研室已同意,不允许撤销"); - } - apply.setSczt(1); + apply.setJyscszt(0); + apply.setJyscsrbh(null); + apply.setJyscssj(null); ssdksqMapper.updateById(apply); recordOperationLog(apply.getBh(), "撤销", "撤销调课申请:" + apply.getBh()); } /** - * 构建原日期节次描述。 - *- * 根据课次实体生成原日期节次的字符串描述,便于调课申请中保留原信息。 - *
- * - * @param lesson 课次实体 - * @return 原日期节次描述 - */ - /** - * 机关终审同意后,将调整结果写回学员队任务表、课程表,以及可选的实施课次。 + * 教研室同意后,将调整结果写回课次、学员队任务表和课程表。 */ private void applyApprovedSchedule(SSDKSQ apply) { if (apply == null || StringUtils.isEmpty(apply.getSskcbbh())) { @@ -1642,28 +1311,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic return sb.toString(); } - /** - * 恢复课次原数据。 - *- * 当调课申请被拒绝或撤销时,恢复课次到申请前的原始数据。 - * 实际业务中通常需要从历史快照恢复,此处简化为清空日期节次。 - *
- * - * @param apply 调课申请实体 - */ - private void restoreLessonSchedule(SSDKSQ apply) { - // 步骤1:查询课次实体 - SSKCB lesson = sskcbMapper.selectById(apply.getSskcbbh()); - if (lesson == null) { - return; - } - - // 步骤2:清空课次因调课而设置的日期节次(恢复原状) - lesson.setRq(null); - lesson.setJc(null); - sskcbMapper.updateById(lesson); - } - // ==================== 教学保障管理 ==================== /** @@ -2971,192 +2618,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic return value == null ? "" : String.valueOf(value); } - // ============================================================ - // 调课策略管理实现(时间段限制策略 + 免审批策略) - // ============================================================ - - /** 策略类型常量:时间段限制 */ - private static final String STRATEGY_TIME_LIMIT = "TIME_LIMIT"; - /** 策略类型常量:免审批 */ - private static final String STRATEGY_AUTO_APPROVE = "AUTO_APPROVE"; - /** 星期中文描述 */ - private static final String[] WEEK_DAY_NAMES = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; - - @Override - public List
diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/FacultyServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/FacultyServiceImpl.java
index e57c7c43a..4195177fc 100644
--- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/FacultyServiceImpl.java
+++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/FacultyServiceImpl.java
@@ -9,6 +9,7 @@ import com.roomroot.jwgl.service.FacultyService;
import com.roomroot.jwgl.unit.BusinessException;
import com.roomroot.jwgl.unit.PageQuery;
import com.roomroot.jwgl.unit.PageResult;
+import com.roomroot.jwgl.utils.ExcelExportUtil;
import com.roomroot.jwgl.utils.ExcelParseUtil;
import com.roomroot.jwgl.utils.UuidUtil;
import com.roomroot.jwgl.vo.faculty.TeacherListVO;
@@ -160,6 +161,52 @@ public class FacultyServiceImpl implements FacultyService {
return jybMapper.selectById(jybh);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int importJYBFromExcel(MultipartFile file) throws Exception {
+ if (file == null || file.isEmpty()) {
+ throw new BusinessException("导入文件不能为空");
+ }
+ List 表头顺序: 表头顺序: 表头顺序:
- * 用于展示调课申请中机关审批环节的审批记录,包括机关编号、审批时间、
- * 审批状态、审批人、查收状态、发回意见等信息。
- *
* 用于展示调课申请的完整信息,包括课次信息、申请教员、调整后的日期节次、
* 教学内容变更、新的教室列表、辅助教员列表、学员队列表、保障明细列表,
- * 以及教研室和机关的审批记录。
+ * 以及教研室审批与查收信息。
*