From 26044cc7905a63b1ed1a7b56df3d5c2fad12f818 Mon Sep 17 00:00:00 2001 From: weizhong Date: Tue, 19 Aug 2025 19:59:44 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=9C=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TeacherAssessmentController.java | 36 + .../bzrkh/domain/BmzrAssessmentScore.java | 136 ++++ .../bzrkh/domain/bo/AssessmentSubmitBo.java | 61 ++ .../bzrkh/domain/vo/AssessmentDetailVo.java | 80 ++ .../domain/vo/AssessmentIndicatorScoreVo.java | 89 +++ .../bzrkh/domain/vo/ClassDetailVo.java | 78 ++ .../bzrkh/domain/vo/CoefficientVo.java | 64 ++ .../domain/vo/SpecialWorkIndicatorVo.java | 64 ++ .../mapper/BmzrAssessmentScoreMapper.java | 14 + .../bzrkh/mapper/TeacherAssessmentMapper.java | 82 ++ .../service/ITeacherAssessmentService.java | 31 + .../impl/TeacherAssessmentServiceImpl.java | 370 +++++++++ .../mapper/bzrkh/TeacherAssessmentMapper.xml | 199 +++++ .../班主任考核指标类型管理权限配置.sql | 49 ++ .../ruoyi-bzrkh/班主任考核提交功能开发说明.md | 247 +++++++ .../班主任考核提交功能必要数据.sql | 87 +++ .../ruoyi-bzrkh/班主任考核提交功能权限配置.md | 86 +++ .../班主任考核管理/bmzr_assessment_tables.sql | 5 +- .../api/bzrkh/assessmentIndicator/index.ts | 4 +- web/src/api/bzrkh/teacherAssessment/index.ts | 37 +- web/src/api/bzrkh/teacherAssessment/types.ts | 217 ++++++ .../views/bzrkh/teacherAssessment/index.vue | 115 ++- .../bzrkh/teacherAssessment/submitDialog.vue | 699 ++++++++++++++++++ 23 files changed, 2835 insertions(+), 15 deletions(-) create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/BmzrAssessmentScore.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/AssessmentSubmitBo.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentDetailVo.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentIndicatorScoreVo.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/ClassDetailVo.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/CoefficientVo.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/SpecialWorkIndicatorVo.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/BmzrAssessmentScoreMapper.java create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/班主任考核指标类型管理权限配置.sql create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能必要数据.sql create mode 100644 backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能权限配置.md create mode 100644 web/src/views/bzrkh/teacherAssessment/submitDialog.vue diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java index 67c6b3a3..ae28a3a5 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java @@ -1,5 +1,6 @@ package org.dromara.bzrkh.controller; +import java.math.BigDecimal; import java.util.List; import lombok.RequiredArgsConstructor; @@ -14,7 +15,9 @@ import org.dromara.common.core.domain.R; import org.dromara.common.log.enums.BusinessType; import org.dromara.bzrkh.domain.vo.TeacherClassVo; import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo; +import org.dromara.bzrkh.domain.vo.AssessmentDetailVo; import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo; +import org.dromara.bzrkh.domain.bo.AssessmentSubmitBo; import org.dromara.bzrkh.service.ITeacherAssessmentService; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; @@ -81,6 +84,39 @@ public class TeacherAssessmentController extends BaseController { return R.ok(detail); } + /** + * 获取考核提交详情数据 + */ + @SaCheckPermission("bzrkh:teacherAssessment:detail") + @GetMapping("/submitDetail") + public R getAssessmentSubmitDetail(@RequestParam Long planId, @RequestParam Long classId) { + Long teacherId = LoginHelper.getUserId(); + AssessmentDetailVo detail = teacherAssessmentService.getAssessmentSubmitDetail(planId, classId, teacherId); + return R.ok(detail); + } + + /** + * 提交考核评分数据 + */ + @SaCheckPermission("bzrkh:teacherAssessment:submit") + @Log(title = "班主任考核管理", businessType = BusinessType.INSERT) + @PostMapping("/submitScore") + public R submitAssessmentScore(@RequestBody AssessmentSubmitBo bo) { + Long teacherId = LoginHelper.getUserId(); + boolean result = teacherAssessmentService.submitAssessmentScore(bo, teacherId); + return toAjax(result); + } + + /** + * 测试人数系数计算(临时调试接口) + * 用于验证特定人数的系数计算是否正确 + */ + @GetMapping("/testCoefficient") + public R testStudentCountCoefficient(@RequestParam int studentCount) { + BigDecimal coefficient = teacherAssessmentService.testStudentCountCoefficient(studentCount); + return R.ok("学生人数: " + studentCount + ", 计算系数: " + coefficient); + } + /** * 提交考核请求对象 */ diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/BmzrAssessmentScore.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/BmzrAssessmentScore.java new file mode 100644 index 00000000..69946dee --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/BmzrAssessmentScore.java @@ -0,0 +1,136 @@ +package org.dromara.bzrkh.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 班主任考核得分对象 bmzr_assessment_score + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bmzr_assessment_score") +public class BmzrAssessmentScore extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 考核计划ID + */ + private Long planId; + + /** + * 考核方案ID + */ + private Long schemeId; + + /** + * 考核指标ID + */ + private Long indicatorId; + + /** + * 被评价用户ID + */ + private Long evaluatedUserId; + + /** + * 被评价用户姓名 + */ + private String evaluatedUserName; + + /** + * 被评价用户部门ID + */ + private Long evaluatedDeptId; + + /** + * 自评分数 + */ + private BigDecimal selfScore; + + /** + * 自评意见 + */ + private String selfComment; + + /** + * 自评提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date selfSubmitTime; + + /** + * 上级评分数 + */ + private BigDecimal superiorScore; + + /** + * 上级评意见 + */ + private String superiorComment; + + /** + * 上级评价人ID + */ + private Long superiorEvaluatorId; + + /** + * 上级评提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date superiorSubmitTime; + + /** + * 评价等级 dict_type = bmzr_evaluation_level + */ + private String evaluationLevel; + + /** + * 审核状态(0=待审核 1=审核通过 2=审核不通过) + */ + private String auditStatus; + + /** + * 最终得分 + */ + private BigDecimal finalScore; + + /** + * 提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date submitTime; + + /** + * 班级ID + */ + private Long classId; + + /** + * 自我总体评价 + */ + private String selfOverallComment; + + /** + * 上级总体评价 + */ + private String superiorOverallComment; + +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/AssessmentSubmitBo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/AssessmentSubmitBo.java new file mode 100644 index 00000000..bfefe10d --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/AssessmentSubmitBo.java @@ -0,0 +1,61 @@ +package org.dromara.bzrkh.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.bzrkh.domain.vo.AssessmentIndicatorScoreVo; +import org.dromara.bzrkh.domain.vo.SpecialWorkIndicatorVo; + +import jakarta.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 考核提交业务对象 + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class AssessmentSubmitBo extends BaseEntity { + + /** + * 考核计划ID + */ + @NotNull(message = "考核计划ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long planId; + + /** + * 班级ID + */ + @NotNull(message = "班级ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long classId; + + /** + * 班主任常规工作指标评分 + */ + private List routineWorkScores; + + /** + * 班级扣分 + */ + private BigDecimal classDeduction; + + /** + * 班级扣分意见 + */ + private String classDeductionComment; + + /** + * 特色工作指标评分 + */ + private List specialWorkScores; + + /** + * 总体评价 + */ + private String overallComment; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentDetailVo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentDetailVo.java new file mode 100644 index 00000000..462f39d6 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentDetailVo.java @@ -0,0 +1,80 @@ +package org.dromara.bzrkh.domain.vo; + +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 考核详情视图对象 + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +public class AssessmentDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 班级详细信息 + */ + private ClassDetailVo classDetail; + + /** + * 系数信息 + */ + private CoefficientVo coefficient; + + /** + * 班主任常规工作指标列表 + */ + private List routineWorkIndicators; + + /** + * 班级扣分指标 + */ + private AssessmentIndicatorScoreVo classDeductionIndicator; + + /** + * 特色工作指标列表 + */ + private List specialWorkIndicators; + + /** + * 月考核得分 + */ + private BigDecimal monthlyScore; + + /** + * 总体评价 + */ + private String overallComment; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentIndicatorScoreVo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentIndicatorScoreVo.java new file mode 100644 index 00000000..814b6720 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentIndicatorScoreVo.java @@ -0,0 +1,89 @@ +package org.dromara.bzrkh.domain.vo; + +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 考核指标评分视图对象 + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +public class AssessmentIndicatorScoreVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 指标ID + */ + private Long id; + + /** + * 指标名称 + */ + private String indicatorName; + + /** + * 指标编码 + */ + private String indicatorCode; + + /** + * 指标描述 + */ + private String description; + + /** + * 指标分值 + */ + private BigDecimal score; + + /** + * 自评分数 + */ + private BigDecimal selfScore; + + /** + * 自评意见 + */ + private String selfComment; + + /** + * 自我总体评价 + */ + private String selfOverallComment; + + /** + * 排序 + */ + private Integer sortOrder; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/ClassDetailVo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/ClassDetailVo.java new file mode 100644 index 00000000..6a487319 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/ClassDetailVo.java @@ -0,0 +1,78 @@ +package org.dromara.bzrkh.domain.vo; + +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 班级详细信息视图对象 + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +public class ClassDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 班级ID + */ + private Long id; + + /** + * 学院名称 + */ + private String collegeName; + + /** + * 专业名称 + */ + private String majorName; + + /** + * 班级名称 + */ + private String className; + + /** + * 班级层次:1-中级工 2-高级工 3-预备技师 4-技师 5-中高职一体 + */ + private String classType; + + /** + * 班级总人数 + */ + private Integer totalStudentCount; + + /** + * 住校生人数 + */ + private Integer boardingStudentCount; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/CoefficientVo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/CoefficientVo.java new file mode 100644 index 00000000..8ad8bbb1 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/CoefficientVo.java @@ -0,0 +1,64 @@ +package org.dromara.bzrkh.domain.vo; + +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 系数信息视图对象 + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +public class CoefficientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 人数系数(K2) + */ + private BigDecimal studentCountCoefficient; + + /** + * 住校生系数(K3) + */ + private BigDecimal boardingCoefficient; + + /** + * 层次系数(K1) + */ + private BigDecimal levelCoefficient; + + /** + * 总系数(K = K1 * (K2 + K3)) + */ + private BigDecimal totalCoefficient; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/SpecialWorkIndicatorVo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/SpecialWorkIndicatorVo.java new file mode 100644 index 00000000..92a3ec8e --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/SpecialWorkIndicatorVo.java @@ -0,0 +1,64 @@ +package org.dromara.bzrkh.domain.vo; + +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 特色工作指标视图对象 + * + * @author ruoyi + * @date 2025-01-27 + */ +@Data +public class SpecialWorkIndicatorVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 指标编码 + */ + private String indicatorCode; + + /** + * 指标名称 + */ + private String indicatorName; + + /** + * 分值 + */ + private BigDecimal score; + + /** + * 自评意见 + */ + private String selfComment; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/BmzrAssessmentScoreMapper.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/BmzrAssessmentScoreMapper.java new file mode 100644 index 00000000..6d6b3013 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/BmzrAssessmentScoreMapper.java @@ -0,0 +1,14 @@ +package org.dromara.bzrkh.mapper; + +import org.dromara.bzrkh.domain.BmzrAssessmentScore; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 班主任考核得分Mapper接口 + * + * @author ruoyi + * @date 2025-01-27 + */ +public interface BmzrAssessmentScoreMapper extends BaseMapperPlus { + +} \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java index b7657afd..89735ac4 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java @@ -2,10 +2,14 @@ package org.dromara.bzrkh.mapper; import org.dromara.bzrkh.domain.vo.TeacherClassVo; import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo; +import org.dromara.bzrkh.domain.vo.ClassDetailVo; +import org.dromara.bzrkh.domain.vo.AssessmentIndicatorScoreVo; +import org.dromara.bzrkh.domain.vo.SpecialWorkIndicatorVo; import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; import java.util.List; /** @@ -31,4 +35,82 @@ public interface TeacherAssessmentMapper extends BaseMapperPlus * @return 考核计划列表 */ List selectTeacherAssessmentPlanList(TeacherAssessmentQueryBo bo); + + /** + * 查询班级详细信息 + * + * @param classId 班级ID + * @return 班级详细信息 + */ + ClassDetailVo selectClassDetail(@Param("classId") Long classId); + + /** + * 查询班主任常规工作指标列表 + * + * @param planId 计划ID + * @return 指标列表 + */ + List selectRoutineWorkIndicators(@Param("planId") Long planId); + + /** + * 查询班级扣分指标 + * + * @return 班级扣分指标 + */ + AssessmentIndicatorScoreVo selectClassDeductionIndicator(); + + /** + * 查询特色工作指标列表 + * + * @return 特色工作指标列表 + */ + List selectSpecialWorkIndicators(); + + /** + * 查询已保存的评分数据 + * + * @param planId 计划ID + * @param teacherId 班主任ID + * @return 评分数据列表 + */ + List selectSavedAssessmentScores(@Param("planId") Long planId, @Param("teacherId") Long teacherId); + + /** + * 根据计划ID查询方案ID + * + * @param planId 计划ID + * @return 方案ID + */ + Long selectSchemeIdByPlanId(@Param("planId") Long planId); + + /** + * 根据指标编码查询指标ID + * + * @param indicatorCode 指标编码 + * @return 指标ID + */ + Long selectIndicatorIdByCode(@Param("indicatorCode") String indicatorCode); + + /** + * 逻辑删除指定计划和教师的评分数据 + * + * @param planId 计划ID + * @param teacherId 教师ID + */ + void deleteAssessmentScoresByPlanAndTeacher(@Param("planId") Long planId, @Param("teacherId") Long teacherId); + + + + /** + * 更新评分数据的备注 + * + * @param planId 计划ID + * @param indicatorId 指标ID + * @param teacherId 教师ID + * @param remark 备注 + */ + void updateAssessmentScoreRemark(@Param("planId") Long planId, + @Param("indicatorId") Long indicatorId, + @Param("teacherId") Long teacherId, + @Param("remark") String remark); } \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java index 8d37fd2d..4c057533 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java @@ -2,10 +2,13 @@ package org.dromara.bzrkh.service; import org.dromara.bzrkh.domain.vo.TeacherClassVo; import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo; +import org.dromara.bzrkh.domain.vo.AssessmentDetailVo; import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo; +import org.dromara.bzrkh.domain.bo.AssessmentSubmitBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import java.math.BigDecimal; import java.util.List; /** @@ -52,4 +55,32 @@ public interface ITeacherAssessmentService { * @return 考核详情 */ Object getAssessmentDetail(Long planId, Long classId, Long teacherId); + + /** + * 获取考核提交详情数据 + * + * @param planId 计划ID + * @param classId 班级ID + * @param teacherId 班主任ID + * @return 考核提交详情 + */ + AssessmentDetailVo getAssessmentSubmitDetail(Long planId, Long classId, Long teacherId); + + /** + * 提交考核评分数据 + * + * @param bo 考核提交数据 + * @param teacherId 班主任ID + * @return 是否成功 + */ + boolean submitAssessmentScore(AssessmentSubmitBo bo, Long teacherId); + + /** + * 测试人数系数计算(临时调试方法) + * 用于验证特定人数的系数计算是否正确 + * + * @param studentCount 学生人数 + * @return 计算出的系数 + */ + BigDecimal testStudentCountCoefficient(int studentCount); } \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java index a88e3d62..cc62b1d3 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java @@ -4,14 +4,28 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.dromara.bzrkh.domain.vo.TeacherClassVo; import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo; +import org.dromara.bzrkh.domain.vo.AssessmentDetailVo; +import org.dromara.bzrkh.domain.vo.ClassDetailVo; +import org.dromara.bzrkh.domain.vo.CoefficientVo; +import org.dromara.bzrkh.domain.vo.AssessmentIndicatorScoreVo; +import org.dromara.bzrkh.domain.vo.SpecialWorkIndicatorVo; import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo; +import org.dromara.bzrkh.domain.bo.AssessmentSubmitBo; import org.dromara.bzrkh.mapper.TeacherAssessmentMapper; +import org.dromara.bzrkh.mapper.BmzrAssessmentScoreMapper; import org.dromara.bzrkh.service.ITeacherAssessmentService; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.bzrkh.domain.BmzrAssessmentScore; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; +import java.util.ArrayList; +import java.util.Date; /** * 班主任考核管理Service业务层处理 @@ -19,11 +33,13 @@ import java.util.List; * @author ruoyi * @date 2025-01-27 */ +@Slf4j @RequiredArgsConstructor @Service public class TeacherAssessmentServiceImpl implements ITeacherAssessmentService { private final TeacherAssessmentMapper teacherAssessmentMapper; + private final BmzrAssessmentScoreMapper assessmentScoreMapper; /** * 查询班主任管理的班级列表 @@ -96,4 +112,358 @@ public class TeacherAssessmentServiceImpl implements ITeacherAssessmentService { // 4. 获取考核记录和评分 return null; } + + /** + * 获取考核提交详情数据 + * + * @param planId 计划ID + * @param classId 班级ID + * @param teacherId 班主任ID + * @return 考核提交详情 + */ + @Override + public AssessmentDetailVo getAssessmentSubmitDetail(Long planId, Long classId, Long teacherId) { + AssessmentDetailVo detailVo = new AssessmentDetailVo(); + + // 1. 获取班级详细信息 + ClassDetailVo classDetail = teacherAssessmentMapper.selectClassDetail(classId); + detailVo.setClassDetail(classDetail); + + // 2. 计算系数信息 + CoefficientVo coefficient = calculateCoefficient(classDetail); + detailVo.setCoefficient(coefficient); + + // 3. 获取班主任常规工作指标 + List routineWorkIndicators = teacherAssessmentMapper.selectRoutineWorkIndicators(planId); + detailVo.setRoutineWorkIndicators(routineWorkIndicators); + + // 4. 获取班级扣分指标 + AssessmentIndicatorScoreVo classDeductionIndicator = teacherAssessmentMapper.selectClassDeductionIndicator(); + detailVo.setClassDeductionIndicator(classDeductionIndicator); + + // 5. 获取特色工作指标 + List specialWorkIndicators = teacherAssessmentMapper.selectSpecialWorkIndicators(); + detailVo.setSpecialWorkIndicators(specialWorkIndicators); + + // 6. 获取已保存的评分数据(如果有) + List savedScores = teacherAssessmentMapper.selectSavedAssessmentScores(planId, teacherId); + if (savedScores != null && !savedScores.isEmpty()) { + // 将已保存的评分数据合并到指标中 + mergeAssessmentScores(detailVo, savedScores); + + // 获取总体评价(从任意一条记录中获取,因为都是同样的总体评价) + savedScores.stream() + .findFirst() + .ifPresent(saved -> detailVo.setOverallComment(saved.getSelfOverallComment())); + } + + return detailVo; + } + + /** + * 提交考核评分数据 + * + * @param bo 考核提交数据 + * @param teacherId 班主任ID + * @return 是否成功 + */ + @Override + public boolean submitAssessmentScore(AssessmentSubmitBo bo, Long teacherId) { + try { + // 1. 先逻辑删除该计划下该教师的历史评分数据 + teacherAssessmentMapper.deleteAssessmentScoresByPlanAndTeacher(bo.getPlanId(), teacherId); + + Long schemeId = teacherAssessmentMapper.selectSchemeIdByPlanId(bo.getPlanId()); + String currentUserName = LoginHelper.getUsername(); + Long currentDeptId = LoginHelper.getDeptId(); + Date now = new Date(); + + // 2. 插入班主任常规工作指标评分 + if (bo.getRoutineWorkScores() != null && !bo.getRoutineWorkScores().isEmpty()) { + for (AssessmentIndicatorScoreVo score : bo.getRoutineWorkScores()) { + BmzrAssessmentScore assessmentScore = new BmzrAssessmentScore(); + assessmentScore.setPlanId(bo.getPlanId()); + assessmentScore.setSchemeId(schemeId); + assessmentScore.setIndicatorId(score.getId()); + assessmentScore.setEvaluatedUserId(teacherId); + assessmentScore.setEvaluatedUserName(currentUserName); + assessmentScore.setEvaluatedDeptId(currentDeptId); + assessmentScore.setSelfScore(score.getSelfScore()); + assessmentScore.setSelfComment(score.getSelfComment()); + assessmentScore.setSelfSubmitTime(now); + assessmentScore.setSubmitTime(now); + assessmentScore.setAuditStatus("0"); + // 设置班级ID和自我总体评价 + assessmentScore.setClassId(bo.getClassId()); + assessmentScore.setSelfOverallComment(bo.getOverallComment()); + + assessmentScoreMapper.insert(assessmentScore); + } + } + + // 3. 插入班级扣分指标评分 + Long classDeductionIndicatorId = teacherAssessmentMapper.selectIndicatorIdByCode("bzrwjkf001"); + if (classDeductionIndicatorId != null) { + BmzrAssessmentScore assessmentScore = new BmzrAssessmentScore(); + assessmentScore.setPlanId(bo.getPlanId()); + assessmentScore.setSchemeId(schemeId); + assessmentScore.setIndicatorId(classDeductionIndicatorId); + assessmentScore.setEvaluatedUserId(teacherId); + assessmentScore.setEvaluatedUserName(currentUserName); + assessmentScore.setEvaluatedDeptId(currentDeptId); + assessmentScore.setSelfScore(bo.getClassDeduction()); + assessmentScore.setSelfComment(bo.getClassDeductionComment()); + assessmentScore.setSelfSubmitTime(now); + assessmentScore.setSubmitTime(now); + assessmentScore.setAuditStatus("0"); + // 设置班级ID和自我总体评价 + assessmentScore.setClassId(bo.getClassId()); + assessmentScore.setSelfOverallComment(bo.getOverallComment()); + + assessmentScoreMapper.insert(assessmentScore); + } + + // 4. 插入特色工作指标评分 + if (bo.getSpecialWorkScores() != null && !bo.getSpecialWorkScores().isEmpty()) { + for (SpecialWorkIndicatorVo score : bo.getSpecialWorkScores()) { + Long indicatorId = teacherAssessmentMapper.selectIndicatorIdByCode(score.getIndicatorCode()); + if (indicatorId != null) { + BmzrAssessmentScore assessmentScore = new BmzrAssessmentScore(); + assessmentScore.setPlanId(bo.getPlanId()); + assessmentScore.setSchemeId(schemeId); + assessmentScore.setIndicatorId(indicatorId); + assessmentScore.setEvaluatedUserId(teacherId); + assessmentScore.setEvaluatedUserName(currentUserName); + assessmentScore.setEvaluatedDeptId(currentDeptId); + assessmentScore.setSelfScore(score.getScore()); + assessmentScore.setSelfComment(score.getSelfComment()); + assessmentScore.setSelfSubmitTime(now); + assessmentScore.setSubmitTime(now); + assessmentScore.setAuditStatus("0"); + // 设置班级ID和自我总体评价 + assessmentScore.setClassId(bo.getClassId()); + assessmentScore.setSelfOverallComment(bo.getOverallComment()); + + assessmentScoreMapper.insert(assessmentScore); + } + } + } + + // 5. 总体评价已经通过上述步骤存储到每条记录的 self_overall_comment 字段中 + + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 计算系数信息 + * + * @param classDetail 班级详细信息 + * @return 系数信息 + */ + private CoefficientVo calculateCoefficient(ClassDetailVo classDetail) { + CoefficientVo coefficient = new CoefficientVo(); + + // 计算人数系数(K2) + int totalStudents = classDetail.getTotalStudentCount() != null ? classDetail.getTotalStudentCount() : 0; + log.info("计算人数系数 - 班级ID: {}, 班级名称: {}, 学生总人数: {}", + classDetail.getId(), classDetail.getClassName(), totalStudents); + + // 数据验证:如果学生人数为0但前端显示有人数,可能是数据同步问题 + if (totalStudents == 0) { + log.warn("警告:班级{}学生人数为0,请检查xg_student_msg表数据", classDetail.getClassName()); + } + + BigDecimal studentCountCoefficient = calculateStudentCountCoefficient(totalStudents); + log.info("计算人数系数结果: {}", studentCountCoefficient); + + // 关键修复:确保人数系数不为0 + if (studentCountCoefficient == null || studentCountCoefficient.compareTo(BigDecimal.ZERO) == 0) { + log.error("人数系数计算异常,学生人数: {},计算结果: {},进行修复", totalStudents, studentCountCoefficient); + // 直接重新计算并设置最低值 + if (totalStudents > 0) { + // 手动计算25人的系数:1 - (36-25)*0.02 = 1 - 0.22 = 0.78 + if (totalStudents < 36) { + int missingStudents = 36 - totalStudents; + BigDecimal deduction = BigDecimal.valueOf(missingStudents).multiply(BigDecimal.valueOf(0.02)); + studentCountCoefficient = BigDecimal.ONE.subtract(deduction); + if (studentCountCoefficient.compareTo(BigDecimal.valueOf(0.7)) < 0) { + studentCountCoefficient = BigDecimal.valueOf(0.7); + } + studentCountCoefficient = studentCountCoefficient.setScale(4, RoundingMode.HALF_UP); + log.info("修复后的人数系数: {}", studentCountCoefficient); + } else { + studentCountCoefficient = BigDecimal.valueOf(0.7).setScale(4, RoundingMode.HALF_UP); + } + } else { + studentCountCoefficient = BigDecimal.valueOf(0.7).setScale(4, RoundingMode.HALF_UP); + } + } + + coefficient.setStudentCountCoefficient(studentCountCoefficient); + + // 验证系数设置是否成功 + if (coefficient.getStudentCountCoefficient() == null || + coefficient.getStudentCountCoefficient().compareTo(BigDecimal.ZERO) == 0) { + log.error("错误:人数系数设置仍然失败,当前值: {}", coefficient.getStudentCountCoefficient()); + } + + // 计算住校生系数(K3) + int boardingStudents = classDetail.getBoardingStudentCount() != null ? classDetail.getBoardingStudentCount() : 0; + BigDecimal boardingCoefficient = calculateBoardingCoefficient(boardingStudents); + coefficient.setBoardingCoefficient(boardingCoefficient); + + // 计算层次系数(K1) + BigDecimal levelCoefficient = calculateLevelCoefficient(classDetail.getClassType()); + coefficient.setLevelCoefficient(levelCoefficient); + + // 计算总系数(K = K1 * (K2 + K3)) + BigDecimal totalCoefficient = levelCoefficient.multiply(studentCountCoefficient.add(boardingCoefficient)); + coefficient.setTotalCoefficient(totalCoefficient); + + return coefficient; + } + + /** + * 计算人数系数(K2) + * 班级人数36~40人(含36人),系数为1; + * 超过40人,每增加1名学生,系数增加0.02; + * 少于36人,每减少1名学生,系数减少0.02; + * 本项系数最低0.7 + */ + private BigDecimal calculateStudentCountCoefficient(int studentCount) { + log.info("开始计算人数系数 - 输入学生人数: {}", studentCount); + + // 数据验证:如果学生人数异常,使用保护性默认值 + if (studentCount < 0) { + log.warn("学生人数为负数({}),使用默认值0", studentCount); + studentCount = 0; + } + + BigDecimal coefficient; + if (studentCount >= 36 && studentCount <= 40) { + coefficient = BigDecimal.ONE; + log.info("人数在36-40人范围内,系数为1.0"); + } else if (studentCount > 40) { + int extraStudents = studentCount - 40; + coefficient = BigDecimal.ONE.add(BigDecimal.valueOf(extraStudents * 0.02)); + log.info("人数超过40人,额外{}人,系数为{}", extraStudents, coefficient); + } else { + // 少于36人的情况 + int missingStudents = 36 - studentCount; + // 使用更精确的BigDecimal计算,避免精度问题 + BigDecimal deduction = BigDecimal.valueOf(missingStudents).multiply(BigDecimal.valueOf(0.02)); + coefficient = BigDecimal.ONE.subtract(deduction); + log.info("人数少于36人,缺少{}人,扣减{},计算系数为{}", missingStudents, deduction, coefficient); + + // 最低0.7 + BigDecimal minCoefficient = BigDecimal.valueOf(0.7); + if (coefficient.compareTo(minCoefficient) < 0) { + log.info("系数{}低于最低值0.7,调整为0.7", coefficient); + coefficient = minCoefficient; + } + } + + BigDecimal result = coefficient.setScale(4, RoundingMode.HALF_UP); + log.info("最终人数系数: {}", result); + + // 额外验证:确保结果不为0 + if (result.compareTo(BigDecimal.ZERO) == 0) { + log.error("严重错误:人数系数计算结果为0,学生人数: {},强制设置为最低值0.7", studentCount); + result = BigDecimal.valueOf(0.7).setScale(4, RoundingMode.HALF_UP); + } + + return result; + } + + /** + * 测试人数系数计算(临时调试方法) + * 可以通过调用这个方法来验证具体人数的系数计算 + */ + public BigDecimal testStudentCountCoefficient(int studentCount) { + log.info("=== 测试人数系数计算 ==="); + log.info("输入学生人数: {}", studentCount); + BigDecimal result = calculateStudentCountCoefficient(studentCount); + log.info("计算结果: {}", result); + log.info("=== 测试结束 ==="); + return result; + } + + /** + * 计算住校生系数(K3) + * 根据住校生人数,按人均0.005计算 + */ + private BigDecimal calculateBoardingCoefficient(int boardingCount) { + return BigDecimal.valueOf(boardingCount * 0.005).setScale(4, RoundingMode.HALF_UP); + } + + /** + * 计算层次系数(K1) + * 技师班(K1=0.95),高级工班(K1=1),中级工班(K1=1.05) + */ + private BigDecimal calculateLevelCoefficient(String classType) { + if (classType == null) { + return BigDecimal.ONE; + } + + switch (classType) { + case "1": // 中级工 + return BigDecimal.valueOf(1.05); + case "2": // 高级工 + return BigDecimal.ONE; + case "3": // 预备技师 + return BigDecimal.valueOf(0.95); + case "4": // 技师 + return BigDecimal.valueOf(0.95); + case "5": // 中高职一体 + return BigDecimal.ONE; + default: + return BigDecimal.ONE; + } + } + + /** + * 合并已保存的评分数据 + */ + private void mergeAssessmentScores(AssessmentDetailVo detailVo, List savedScores) { + // 合并班主任常规工作指标评分 + if (detailVo.getRoutineWorkIndicators() != null) { + for (AssessmentIndicatorScoreVo indicator : detailVo.getRoutineWorkIndicators()) { + savedScores.stream() + .filter(saved -> saved.getId().equals(indicator.getId())) + .findFirst() + .ifPresent(saved -> { + indicator.setSelfScore(saved.getSelfScore()); + indicator.setSelfComment(saved.getSelfComment()); + }); + } + } + + // 合并班级扣分指标评分 + if (detailVo.getClassDeductionIndicator() != null) { + savedScores.stream() + .filter(saved -> "bzrwjkf001".equals(saved.getIndicatorCode())) + .findFirst() + .ifPresent(saved -> { + detailVo.getClassDeductionIndicator().setSelfScore(saved.getSelfScore()); + detailVo.getClassDeductionIndicator().setSelfComment(saved.getSelfComment()); + }); + } + + // 合并特色工作指标评分 + if (detailVo.getSpecialWorkIndicators() != null) { + for (SpecialWorkIndicatorVo indicator : detailVo.getSpecialWorkIndicators()) { + savedScores.stream() + .filter(saved -> indicator.getIndicatorCode().equals(saved.getIndicatorCode())) + .findFirst() + .ifPresent(saved -> { + indicator.setScore(saved.getSelfScore()); + indicator.setSelfComment(saved.getSelfComment()); + }); + } + } + } } \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml index de6046c1..8b8089f2 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml @@ -45,6 +45,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE bmzr_assessment_score + SET deleted = 1, + update_time = NOW() + WHERE plan_id = #{planId} + AND evaluated_user_id = #{teacherId} + AND deleted = 0 + + + + + + + UPDATE bmzr_assessment_score + SET remark = #{remark}, + update_time = NOW() + WHERE plan_id = #{planId} + AND indicator_id = #{indicatorId} + AND evaluated_user_id = #{teacherId} + AND deleted = 0 + + \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核指标类型管理权限配置.sql b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核指标类型管理权限配置.sql new file mode 100644 index 00000000..3757bb81 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核指标类型管理权限配置.sql @@ -0,0 +1,49 @@ +-- ========================================== +-- 班主任考核指标类型管理权限配置 +-- 版本:V1.0.0 +-- 功能:班主任考核指标类型管理相关权限 +-- 作者:系统设计 +-- 时间:2025-01-08 +-- 模块:学工管理-班主任考核指标类型管理权限 +-- ========================================== + +-- 删除已存在的权限数据 +DELETE FROM sys_menu WHERE menu_name = '指标类型管理' OR parent_id IN (SELECT id FROM (SELECT id FROM sys_menu WHERE menu_name = '指标类型管理') temp); + +-- 1. 班主任考核指标类型管理主菜单 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id) +VALUES ('指标类型管理', 2000, 4, 'assessmentIndicatorType', 'bzrkh/assessmentIndicatorType/index', '', 1, 0, 'C', '0', '0', 'bzrkh:assessmentIndicatorType:list', 'list', 103, 1, NOW(), 1, NOW(), '班主任考核指标类型管理菜单', '000000'); + +-- 获取刚插入的主菜单ID +SET @menu_id = LAST_INSERT_ID(); + +-- 2. 班主任考核指标类型查询按钮 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id) +VALUES ('班主任考核指标类型查询', @menu_id, 1, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:query', '#', 103, 1, NOW(), 1, NOW(), '', '000000'); + +-- 3. 班主任考核指标类型新增按钮 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id) +VALUES ('班主任考核指标类型新增', @menu_id, 2, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:add', '#', 103, 1, NOW(), 1, NOW(), '', '000000'); + +-- 4. 班主任考核指标类型修改按钮 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id) +VALUES ('班主任考核指标类型修改', @menu_id, 3, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:edit', '#', 103, 1, NOW(), 1, NOW(), '', '000000'); + +-- 5. 班主任考核指标类型删除按钮 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id) +VALUES ('班主任考核指标类型删除', @menu_id, 4, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:remove', '#', 103, 1, NOW(), 1, NOW(), '', '000000'); + +-- 6. 班主任考核指标类型导出按钮 +INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id) +VALUES ('班主任考核指标类型导出', @menu_id, 5, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:export', '#', 103, 1, NOW(), 1, NOW(), '', '000000'); + +-- ========================================== +-- 权限字符说明 +-- ========================================== +-- bzrkh:assessmentIndicatorType:list - 班主任考核指标类型查询权限 +-- bzrkh:assessmentIndicatorType:query - 班主任考核指标类型详情查询权限 +-- bzrkh:assessmentIndicatorType:add - 班主任考核指标类型新增权限 +-- bzrkh:assessmentIndicatorType:edit - 班主任考核指标类型修改权限 +-- bzrkh:assessmentIndicatorType:remove - 班主任考核指标类型删除权限 +-- bzrkh:assessmentIndicatorType:export - 班主任考核指标类型导出权限 +-- ========================================== \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md new file mode 100644 index 00000000..64d9bd81 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md @@ -0,0 +1,247 @@ +# 班主任考核提交功能开发说明 + +## 功能概述 + +完善了班主任考核管理界面中的"提交考核"按钮功能,实现了完整的考核评分提交流程。 + +## 开发内容 + +### 前端部分(Vue 3 + TypeScript + Element Plus) + +#### 1. API类型定义扩展 +**文件位置**: `web/src/api/bzrkh/teacherAssessment/types.ts` + +**新增类型定义**: +- `ClassDetailVO` - 班级详细信息 +- `CoefficientVO` - 系数信息 +- `AssessmentIndicatorVO` - 考核指标信息 +- `SpecialWorkIndicatorVO` - 特色工作指标 +- `AssessmentSubmitVO` - 考核提交数据 +- `AssessmentDetailVO` - 考核详情数据 + +#### 2. API接口扩展 +**文件位置**: `web/src/api/bzrkh/teacherAssessment/index.ts` + +**新增接口**: +- `getAssessmentSubmitDetail()` - 获取考核提交详情数据 +- `submitAssessmentScore()` - 提交考核评分数据 + +#### 3. 提交弹窗组件 +**文件位置**: `web/src/views/bzrkh/teacherAssessment/submitDialog.vue` + +**功能特性**: +- 9张卡片式布局:班级信息、人数系数、住校生系数、层次系数、总系数、班主任常规工作、班级管理实效、特色工作、月考核得分 +- 自动系数计算:根据班级人数、住校生人数、班级层次自动计算各项系数 +- 动态评分:支持自评分数输入和自评意见填写 +- 实时计算:月考核得分根据公式自动计算 +- 数据验证:表单验证确保数据完整性 + +#### 4. 主界面集成 +**文件位置**: `web/src/views/bzrkh/teacherAssessment/index.vue` + +**集成内容**: +- 引入提交弹窗组件 +- 修改提交考核按钮逻辑 +- 添加成功回调处理 + +### 后端部分(Spring Boot 3.4.6 + MyBatis-Plus) + +#### 1. VO类创建 +**文件位置**: `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/` + +**新增VO类**: +- `ClassDetailVo.java` - 班级详细信息视图对象 +- `CoefficientVo.java` - 系数信息视图对象 +- `AssessmentIndicatorScoreVo.java` - 考核指标评分视图对象 +- `SpecialWorkIndicatorVo.java` - 特色工作指标视图对象 +- `AssessmentDetailVo.java` - 考核详情视图对象 + +#### 2. BO类创建 +**文件位置**: `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/` + +**新增BO类**: +- `AssessmentSubmitBo.java` - 考核提交业务对象 + +#### 3. Controller扩展 +**文件位置**: `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java` + +**新增接口**: +- `getAssessmentSubmitDetail()` - 获取考核提交详情数据 +- `submitAssessmentScore()` - 提交考核评分数据 + +#### 4. Service接口和实现扩展 +**文件位置**: +- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java` +- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java` + +**新增方法**: +- `getAssessmentSubmitDetail()` - 获取考核提交详情数据 +- `submitAssessmentScore()` - 提交考核评分数据 +- `calculateCoefficient()` - 计算系数信息(私有方法) +- `calculateStudentCountCoefficient()` - 计算人数系数(私有方法) +- `calculateBoardingCoefficient()` - 计算住校生系数(私有方法) +- `calculateLevelCoefficient()` - 计算层次系数(私有方法) +- `mergeAssessmentScores()` - 合并已保存的评分数据(私有方法) + +#### 5. Mapper接口和XML扩展 +**文件位置**: +- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java` +- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml` + +**新增方法**: +- `selectClassDetail()` - 查询班级详细信息 +- `selectRoutineWorkIndicators()` - 查询班主任常规工作指标列表 +- `selectClassDeductionIndicator()` - 查询班级扣分指标 +- `selectSpecialWorkIndicators()` - 查询特色工作指标列表 +- `selectSavedAssessmentScores()` - 查询已保存的评分数据 +- `selectSchemeIdByPlanId()` - 根据计划ID查询方案ID +- `selectIndicatorIdByCode()` - 根据指标编码查询指标ID +- `deleteAssessmentScoresByPlanAndTeacher()` - 逻辑删除评分数据 +- `insertAssessmentScore()` - 插入评分数据 +- `updateAssessmentScoreRemark()` - 更新评分数据备注 + +## 核心业务逻辑 + +### 1. 系数计算规则 + +#### 人数系数(K2) +- 班级人数36~40人(含36人),系数为1 +- 超过40人,每增加1名学生,系数增加0.02 +- 少于36人,每减少1名学生,系数减少0.02 +- 本项系数最低0.7 + +#### 住校生系数(K3) +- 根据住校生人数,按人均0.005计算 + +#### 层次系数(K1) +- 技师班(K1=0.95) +- 高级工班(K1=1) +- 中级工班(K1=1.05) +- 预备技师班(K1=0.95) +- 中高职一体(K1=1) + +#### 总系数(K) +- 计算公式:K = K1 * (K2 + K3) + +### 2. 月考核得分计算 +- 计算公式:总系数(K)* (班主任常规工作自评分之和 - 按班级扣分50%计的分值 + 特色工作总分值) + +### 3. 数据存储逻辑 +1. 先逻辑删除该计划下该教师的历史评分数据 +2. 插入班主任常规工作指标评分 +3. 插入班级扣分指标评分 +4. 插入特色工作指标评分(4个固定指标) +5. 将总体评价存储到备注字段 + +## 权限配置 + +### API接口权限 +- `bzrkh:teacherAssessment:list` - 查看班级和考核计划列表 +- `bzrkh:teacherAssessment:detail` - 查看考核详情 +- `bzrkh:teacherAssessment:submit` - 提交考核 + +详细权限配置请参考:`班主任考核提交功能权限配置.md` + +## 数据准备 + +### 必要的指标数据 +系统需要以下5个考核指标才能正常运行: + +1. `bzrwjkf001` - 班级扣分 +2. `bzrtsgz001` - 及时并妥善处理好学生违纪事件 +3. `bzrtsgz002` - 班级活动获奖情况 +4. `bzrtsgz003` - 班级宣传工作有特色 +5. `bzrtsgz004` - 其他 + +数据插入脚本:`班主任考核提交功能必要数据.sql` + +## 部署说明 + +### 1. 数据库脚本执行 +```sql +-- 执行必要数据插入脚本 +source 班主任考核提交功能必要数据.sql; +``` + +### 2. 后端编译重启 +```bash +# 编译ruoyi-bzrkh模块 +mvn clean compile -pl ruoyi-modules/ruoyi-bzrkh + +# 重启应用服务 +# (请根据实际部署方式重启服务) +``` + +### 3. 前端构建 +```bash +# 前端无需重新构建,代码已支持热更新 +# 如需构建: +npm run build:prod +``` + +### 4. 权限配置 +1. 登录系统管理后台 +2. 进入系统管理-菜单管理 +3. 为班主任考核相关菜单配置权限 +4. 为相关角色分配权限 + +## 测试验证 + +### 1. 基础功能测试 +- [ ] 班主任登录系统 +- [ ] 查看考核计划列表 +- [ ] 点击"提交考核"按钮 +- [ ] 弹窗正常显示9张卡片 +- [ ] 系数自动计算正确 + +### 2. 评分功能测试 +- [ ] 班主任常规工作指标可正常输入评分 +- [ ] 班级扣分可正常输入,50%计算正确 +- [ ] 特色工作4个指标可正常输入评分 +- [ ] 月考核得分自动计算正确 + +### 3. 数据保存测试 +- [ ] 提交评分数据成功 +- [ ] 数据正确保存到数据库 +- [ ] 再次打开弹窗数据正确回显 + +## 技术亮点 + +1. **响应式系数计算**:前端实时计算各项系数,提供直观的数据展示 +2. **组件化设计**:弹窗组件独立封装,便于维护和复用 +3. **数据一致性**:采用逻辑删除+重新插入的方式确保数据一致性 +4. **权限控制**:完整的权限控制体系,确保数据安全 +5. **用户体验**:直观的卡片式布局,清晰的数据展示 +6. **实时人数统计**:班级总人数从xg_student_msg表实时统计,确保数据准确性 + +## 班级人数统计规则(2025-01-27更新) + +### 班级总人数统计 +- **数据来源**: `xg_student_msg`表 +- **统计条件**: + - `class_id` = 班级ID + - `student_status` = '1'(正常状态) + - `deleted` = 0(未逻辑删除) +- **统计方式**: COUNT(1) + +### 住校生人数统计 +- **数据来源**: `xg_student_msg`表 +- **统计条件**: + - `class_id` = 班级ID + - `student_status` = '1'(正常状态) + - `dormitory_room` IS NOT NULL AND `dormitory_room` != ''(有宿舍信息) + - `deleted` = 0(未逻辑删除) +- **统计方式**: COUNT(1) + +## 待扩展功能 + +1. 学生违规处分信息查看功能 +2. 考核结果审核功能 +3. 考核数据统计分析功能 +4. 考核历史记录查询功能 + +--- + +**开发完成时间**: 2025-01-27 +**开发版本**: V1.0.0 +**测试状态**: 待测试验证 \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能必要数据.sql b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能必要数据.sql new file mode 100644 index 00000000..8737e97c --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能必要数据.sql @@ -0,0 +1,87 @@ +-- ========================================== +-- 班主任考核提交功能必要数据 +-- 功能:插入班主任考核提交功能所需的考核指标数据 +-- 作者:系统开发 +-- 时间:2025-01-27 +-- ========================================== + +-- 插入必要的考核指标数据 +-- 注意:这些指标是班主任考核提交功能必需的,请确保在数据库中存在 + +-- 1. 班级扣分指标 +INSERT INTO `bmzr_assessment_indicator` ( + `id`, `tenant_id`, `indicator_name`, `indicator_code`, `indicator_type`, + `parent_id`, `sort_order`, `weight_ratio`, `max_score`, `score`, + `allow_self_evaluation`, `allow_superior_evaluation`, `status`, `remark`, + `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted` +) VALUES ( + 1882452817132150786, '000000', '班级扣分', 'bzrwjkf001', 'routine', + 0, 1, 1.0000, 50.00, 50.00, + '1', '1', '0', '班级管理实效评分指标', + 103, 1, NOW(), 1, NOW(), 0 +) ON DUPLICATE KEY UPDATE + indicator_name = VALUES(indicator_name), + update_time = NOW(); + +-- 2. 及时并妥善处理好学生违纪事件 +INSERT INTO `bmzr_assessment_indicator` ( + `id`, `tenant_id`, `indicator_name`, `indicator_code`, `indicator_type`, + `parent_id`, `sort_order`, `weight_ratio`, `max_score`, `score`, + `allow_self_evaluation`, `allow_superior_evaluation`, `status`, `remark`, + `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted` +) VALUES ( + 1882452817132150787, '000000', '及时并妥善处理好学生违纪事件', 'bzrtsgz001', 'special', + 0, 1, 1.0000, 20.00, 20.00, + '1', '1', '0', '特色工作评分指标', + 103, 1, NOW(), 1, NOW(), 0 +) ON DUPLICATE KEY UPDATE + indicator_name = VALUES(indicator_name), + update_time = NOW(); + +-- 3. 班级活动获奖情况 +INSERT INTO `bmzr_assessment_indicator` ( + `id`, `tenant_id`, `indicator_name`, `indicator_code`, `indicator_type`, + `parent_id`, `sort_order`, `weight_ratio`, `max_score`, `score`, + `allow_self_evaluation`, `allow_superior_evaluation`, `status`, `remark`, + `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted` +) VALUES ( + 1882452817132150788, '000000', '班级活动获奖情况', 'bzrtsgz002', 'special', + 0, 2, 1.0000, 20.00, 20.00, + '1', '1', '0', '特色工作评分指标', + 103, 1, NOW(), 1, NOW(), 0 +) ON DUPLICATE KEY UPDATE + indicator_name = VALUES(indicator_name), + update_time = NOW(); + +-- 4. 班级宣传工作有特色 +INSERT INTO `bmzr_assessment_indicator` ( + `id`, `tenant_id`, `indicator_name`, `indicator_code`, `indicator_type`, + `parent_id`, `sort_order`, `weight_ratio`, `max_score`, `score`, + `allow_self_evaluation`, `allow_superior_evaluation`, `status`, `remark`, + `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted` +) VALUES ( + 1882452817132150789, '000000', '班级宣传工作有特色', 'bzrtsgz003', 'special', + 0, 3, 1.0000, 20.00, 20.00, + '1', '1', '0', '特色工作评分指标', + 103, 1, NOW(), 1, NOW(), 0 +) ON DUPLICATE KEY UPDATE + indicator_name = VALUES(indicator_name), + update_time = NOW(); + +-- 5. 其他特色工作 +INSERT INTO `bmzr_assessment_indicator` ( + `id`, `tenant_id`, `indicator_name`, `indicator_code`, `indicator_type`, + `parent_id`, `sort_order`, `weight_ratio`, `max_score`, `score`, + `allow_self_evaluation`, `allow_superior_evaluation`, `status`, `remark`, + `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted` +) VALUES ( + 1882452817132150790, '000000', '其他', 'bzrtsgz004', 'special', + 0, 4, 1.0000, 20.00, 20.00, + '1', '1', '0', '特色工作评分指标', + 103, 1, NOW(), 1, NOW(), 0 +) ON DUPLICATE KEY UPDATE + indicator_name = VALUES(indicator_name), + update_time = NOW(); + +-- 创建完成提示 +SELECT '班主任考核提交功能必要数据插入完成!' AS result; \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能权限配置.md b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能权限配置.md new file mode 100644 index 00000000..5342b431 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能权限配置.md @@ -0,0 +1,86 @@ +# 班主任考核提交功能权限配置 + +## API接口权限字符 + +### 新增的API接口权限 +以下是新增的班主任考核提交功能相关的API接口权限字符,需要在系统菜单权限中进行配置: + +1. **获取考核提交详情数据** + - 权限字符:`bzrkh:teacherAssessment:detail` + - 接口路径:`GET /bzrkh/teacherAssessment/submitDetail` + - 功能描述:获取考核提交弹窗的详情数据 + +2. **提交考核评分数据** + - 权限字符:`bzrkh:teacherAssessment:submit` + - 接口路径:`POST /bzrkh/teacherAssessment/submitScore` + - 功能描述:提交班主任考核评分数据 + +### 现有的API接口权限 +以下是现有的相关API接口权限: + +1. **查询班主任管理的班级列表** + - 权限字符:`bzrkh:teacherAssessment:list` + - 接口路径:`GET /bzrkh/teacherAssessment/classes` + +2. **查询班主任考核计划列表** + - 权限字符:`bzrkh:teacherAssessment:list` + - 接口路径:`GET /bzrkh/teacherAssessment/plans` + +3. **提交考核(原有)** + - 权限字符:`bzrkh:teacherAssessment:submit` + - 接口路径:`POST /bzrkh/teacherAssessment/submit` + +4. **查看考核详情(原有)** + - 权限字符:`bzrkh:teacherAssessment:detail` + - 接口路径:`GET /bzrkh/teacherAssessment/detail` + +## 菜单权限配置建议 + +### 菜单配置 +建议在系统管理-菜单管理中配置以下菜单项: + +``` +父菜单:班主任考核管理 +├── 考核计划管理(已有) +└── 班主任考核提交(新增) + ├── 权限字符:bzrkh:teacherAssessment:list + ├── 权限字符:bzrkh:teacherAssessment:detail + └── 权限字符:bzrkh:teacherAssessment:submit +``` + +### 角色权限分配 +建议为以下角色分配相应权限: + +1. **班主任角色** + - `bzrkh:teacherAssessment:list` - 查看班级和考核计划列表 + - `bzrkh:teacherAssessment:detail` - 查看考核详情 + - `bzrkh:teacherAssessment:submit` - 提交考核 + +2. **学工管理员角色** + - 全部权限(包括考核计划管理权限) + +3. **系统管理员角色** + - 全部权限 + +## 数据库表说明 + +### 涉及的主要表 +1. `bmzr_assessment_score` - 班主任考核得分表(核心业务表) +2. `bmzr_assessment_plan` - 考核计划表 +3. `bmzr_assessment_scheme` - 考核方案表 +4. `bmzr_assessment_indicator` - 考核指标表 +5. `xg_class_msg` - 班级信息表 +6. `xg_student_msg` - 学生信息表 + +### 关键业务逻辑 +1. **系数计算**:根据班级人数、住校生人数、班级层次自动计算系数 +2. **指标管理**:支持常规工作指标、班级扣分指标、特色工作指标 +3. **数据存储**:评分数据统一存储在`bmzr_assessment_score`表中 +4. **数据更新**:采用逻辑删除+重新插入的方式确保数据一致性 + +## 注意事项 + +1. 权限配置完成后需要重新登录系统生效 +2. 确保相关角色用户已分配对应的菜单权限 +3. 建议先在测试环境验证权限配置正确性 +4. 需要确保数据库中存在相关的考核指标数据(特别是5个特定编码的指标) \ No newline at end of file diff --git a/docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql b/docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql index 9a2dc002..9e05bd97 100644 --- a/docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql +++ b/docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql @@ -155,11 +155,14 @@ CREATE TABLE `bmzr_assessment_score` ( `evaluated_user_id` bigint(20) NOT NULL COMMENT '被评价用户ID', `evaluated_user_name` varchar(50) NOT NULL COMMENT '被评价用户姓名', `evaluated_dept_id` bigint(20) COMMENT '被评价用户部门ID', + `class_id` bigint(20) COMMENT '班级ID', `self_score` decimal(5,2) COMMENT '自评分数', `self_comment` text COMMENT '自评意见', + `self_overall_comment` text COMMENT '自我总体评价', `self_submit_time` datetime COMMENT '自评提交时间', `superior_score` decimal(5,2) COMMENT '上级评分数', `superior_comment` text COMMENT '上级评意见', + `superior_overall_comment` text COMMENT '上级总体评价', `superior_evaluator_id` bigint(20) COMMENT '上级评价人ID', `superior_submit_time` datetime COMMENT '上级评提交时间', `evaluation_level` varchar(20) COMMENT '评价等级 dict_type = bmzr_evaluation_level', @@ -174,7 +177,7 @@ CREATE TABLE `bmzr_assessment_score` ( `update_time` datetime COMMENT '更新时间', `deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)', PRIMARY KEY (`id`), - UNIQUE KEY `uk_plan_indicator_user` (`plan_id`, `indicator_id`, `evaluated_user_id`), + KEY `uk_plan_indicator_user` (`plan_id`, `indicator_id`, `evaluated_user_id`), KEY `idx_plan_id` (`plan_id`), KEY `idx_scheme_id` (`scheme_id`), KEY `idx_indicator_id` (`indicator_id`), diff --git a/web/src/api/bzrkh/assessmentIndicator/index.ts b/web/src/api/bzrkh/assessmentIndicator/index.ts index b8ef568e..0a80bf4c 100644 --- a/web/src/api/bzrkh/assessmentIndicator/index.ts +++ b/web/src/api/bzrkh/assessmentIndicator/index.ts @@ -70,7 +70,7 @@ export function delBmzrAssessmentIndicator(ids: string | number | Array => { + return request({ + url: '/bzrkh/teacherAssessment/submitDetail', + method: 'get', + params: { + planId, + classId + } + }); +}; + +/** + * 提交考核评分数据 + * @param data 考核提交数据 + */ +export const submitAssessmentScore = (data: AssessmentSubmitVO): AxiosPromise => { + return request({ + url: '/bzrkh/teacherAssessment/submitScore', + method: 'post', + data + }); }; \ No newline at end of file diff --git a/web/src/api/bzrkh/teacherAssessment/types.ts b/web/src/api/bzrkh/teacherAssessment/types.ts index fb46e450..44d9d4ab 100644 --- a/web/src/api/bzrkh/teacherAssessment/types.ts +++ b/web/src/api/bzrkh/teacherAssessment/types.ts @@ -204,4 +204,221 @@ export interface TeacherClassQuery { * 班级状态:1-正常,2-暂停,3-毕业,4-解散 */ classStatus?: string; +} + +// ========== 新增:考核提交相关类型定义 ========== + +/** + * 班级详细信息 + */ +export interface ClassDetailVO { + /** + * 班级ID + */ + id?: string | number; + + /** + * 学院名称 + */ + collegeName?: string; + + /** + * 专业名称 + */ + majorName?: string; + + /** + * 班级名称 + */ + className?: string; + + /** + * 班级层次:1-中级工 2-高级工 3-预备技师 4-技师 5-中高职一体 + */ + classType?: string; + + /** + * 班级总人数 + */ + totalStudentCount?: number; + + /** + * 住校生人数 + */ + boardingStudentCount?: number; +} + +/** + * 系数信息 + */ +export interface CoefficientVO { + /** + * 人数系数(K2) + */ + studentCountCoefficient?: number; + + /** + * 住校生系数(K3) + */ + boardingCoefficient?: number; + + /** + * 层次系数(K1) + */ + levelCoefficient?: number; + + /** + * 总系数(K = K1 * (K2 + K3)) + */ + totalCoefficient?: number; +} + +/** + * 考核指标信息 + */ +export interface AssessmentIndicatorVO { + /** + * 指标ID + */ + id?: string | number; + + /** + * 指标名称 + */ + indicatorName?: string; + + /** + * 指标编码 + */ + indicatorCode?: string; + + /** + * 指标描述 + */ + description?: string; + + /** + * 指标分值 + */ + score?: number; + + /** + * 自评分数 + */ + selfScore?: number; + + /** + * 自评意见 + */ + selfComment?: string; + + /** + * 排序 + */ + sortOrder?: number; +} + +/** + * 特色工作指标 + */ +export interface SpecialWorkIndicatorVO { + /** + * 指标编码 + */ + indicatorCode?: string; + + /** + * 指标名称 + */ + indicatorName?: string; + + /** + * 分值 + */ + score?: number; + + /** + * 自评意见 + */ + selfComment?: string; +} + +/** + * 考核提交数据 + */ +export interface AssessmentSubmitVO { + /** + * 考核计划ID + */ + planId?: string | number; + + /** + * 班级ID + */ + classId?: string | number; + + /** + * 班主任常规工作指标评分 + */ + routineWorkScores?: AssessmentIndicatorVO[]; + + /** + * 班级扣分 + */ + classDeduction?: number; + + /** + * 班级扣分意见 + */ + classDeductionComment?: string; + + /** + * 特色工作指标评分 + */ + specialWorkScores?: SpecialWorkIndicatorVO[]; + + /** + * 总体评价 + */ + overallComment?: string; +} + +/** + * 考核详情数据 + */ +export interface AssessmentDetailVO { + /** + * 班级详细信息 + */ + classDetail?: ClassDetailVO; + + /** + * 系数信息 + */ + coefficient?: CoefficientVO; + + /** + * 班主任常规工作指标列表 + */ + routineWorkIndicators?: AssessmentIndicatorVO[]; + + /** + * 班级扣分指标 + */ + classDeductionIndicator?: AssessmentIndicatorVO; + + /** + * 特色工作指标列表 + */ + specialWorkIndicators?: SpecialWorkIndicatorVO[]; + + /** + * 月考核得分 + */ + monthlyScore?: number; + + /** + * 总体评价 + */ + overallComment?: string; } \ No newline at end of file diff --git a/web/src/views/bzrkh/teacherAssessment/index.vue b/web/src/views/bzrkh/teacherAssessment/index.vue index 96011607..48806f00 100644 --- a/web/src/views/bzrkh/teacherAssessment/index.vue +++ b/web/src/views/bzrkh/teacherAssessment/index.vue @@ -35,15 +35,15 @@
@@ -78,10 +78,22 @@ @@ -100,10 +112,19 @@ + + +
+ + \ No newline at end of file