From 933f39d79b971090d7ab5fa49b601729b3b9010a Mon Sep 17 00:00:00 2001 From: weizhong Date: Mon, 1 Sep 2025 17:13:59 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=9C0901=E7=8F=AD=E4=B8=BB=E4=BB=BB?= =?UTF-8?q?=E8=80=83=E6=A0=B8=E8=AE=A1=E7=AE=97=E5=85=AC=E5=BC=8F=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/vo/AssessmentApprovalDetailVo.java | 2 +- .../bzrkh/domain/vo/AssessmentDetailVo.java | 2 +- .../impl/AssessmentApprovalServiceImpl.java | 31 +++++++++++--- .../ruoyi-bzrkh/班主任考核提交功能开发说明.md | 14 ++++++- docs/设计文档/database/hzdyjs_xg0820.sql | 2 +- .../assessmentApproval/approvalDialog.vue | 28 +++++++------ .../bzrkh/assessmentApproval/viewDialog.vue | 20 +++++----- .../bzrkh/teacherAssessment/submitDialog.vue | 28 ++++++++----- .../bzrkh/teacherAssessment/viewDialog.vue | 40 ++++++++++++------- 9 files changed, 110 insertions(+), 57 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentApprovalDetailVo.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentApprovalDetailVo.java index 23fba61a..4f41847e 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentApprovalDetailVo.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/AssessmentApprovalDetailVo.java @@ -72,7 +72,7 @@ public class AssessmentApprovalDetailVo implements Serializable { private String superiorOverallComment; /** - * 月考核得分 + * 考核得分 */ private BigDecimal monthlyScore; 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 index 462f39d6..31e9d612 100644 --- 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 @@ -47,7 +47,7 @@ public class AssessmentDetailVo implements Serializable { private List specialWorkIndicators; /** - * 月考核得分 + * 考核得分 */ private BigDecimal monthlyScore; diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/AssessmentApprovalServiceImpl.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/AssessmentApprovalServiceImpl.java index 2d485fcf..c45283c0 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/AssessmentApprovalServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/AssessmentApprovalServiceImpl.java @@ -426,7 +426,7 @@ public class AssessmentApprovalServiceImpl implements IAssessmentApprovalService AssessmentDetailVo detailVo = teacherAssessmentService.getAssessmentSubmitDetail( approval.getPlanId(), approval.getClassId(), approval.getEvaluatedUserId()); - // 计算月考核得分 + // 计算考核得分 Double monthlyScore = calculateMonthlyScore(detailVo, approval); ScoreRankingVo ranking = new ScoreRankingVo(); @@ -469,7 +469,7 @@ public class AssessmentApprovalServiceImpl implements IAssessmentApprovalService } /** - * 计算月考核得分 + * 计算考核得分 */ private Double calculateMonthlyScore(AssessmentDetailVo detailVo, AssessmentApprovalVo approval) { // 总系数(K) @@ -523,10 +523,29 @@ public class AssessmentApprovalServiceImpl implements IAssessmentApprovalService } } - // 月考核得分 = 总系数(K)* (班主任常规工作评分 - 按班级扣分50%计的分值 + 特色工作评分) - // 注意:班级扣分是减法,因为它是扣分项 - BigDecimal monthlyScore = totalCoefficient.multiply( - BigDecimal.valueOf(routineWorkTotal - deductionHalf + specialWorkTotal)); + // 判断是否为自评模式(如果没有上级评分,则为自评模式) + boolean isSelfEvaluationMode = scoreDetail.getClassDeductionScore() != null && + scoreDetail.getClassDeductionScore().getSuperiorScore() == null; + + // 检查是否有实际评分数据(避免空白状态显示50分) + boolean hasAnyScore = routineWorkTotal > 0 || deductionHalf > 0 || specialWorkTotal > 0; + + BigDecimal monthlyScore; + if (!hasAnyScore || totalCoefficient.compareTo(BigDecimal.ZERO) == 0) { + // 没有评分数据时返回0 + monthlyScore = BigDecimal.ZERO; + } else if (isSelfEvaluationMode) { + // 自评模式:修正后的考核得分公式 = 总系数(K)* ((班主任常规工作评分 + 班级扣分项满分值) - 按班级扣分50%计的分值 + 特色工作评分) + // 班级扣分项满分值(固定50分)- 仅在有评分数据时计算 + double classDeductionMaxScore = 50.0; + monthlyScore = totalCoefficient.multiply( + BigDecimal.valueOf((routineWorkTotal + classDeductionMaxScore) - deductionHalf + specialWorkTotal)); + } else { + // 审核模式:考核得分 = 总系数(K)* (班主任常规工作评分 - 按班级扣分50%计的分值 + 特色工作评分) + // 注意:班级扣分是减法,因为它是扣分项 + monthlyScore = totalCoefficient.multiply( + BigDecimal.valueOf(routineWorkTotal - deductionHalf + specialWorkTotal)); + } return monthlyScore.setScale(2, RoundingMode.HALF_UP).doubleValue(); } diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md index 64d9bd81..5981091b 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md +++ b/backend/ruoyi-modules/ruoyi-bzrkh/班主任考核提交功能开发说明.md @@ -124,7 +124,19 @@ - 计算公式:K = K1 * (K2 + K3) ### 2. 月考核得分计算 -- 计算公式:总系数(K)* (班主任常规工作自评分之和 - 按班级扣分50%计的分值 + 特色工作总分值) + +#### 自评模式(修正后公式) +- 计算公式:总系数(K)* ((班主任常规工作自评分之和 + 班级扣分项满分值) - 按班级扣分50%计的分值 + 特色工作总分值) +- 班级扣分项满分值:固定50分(来自指标设置) +- 修正原因:确保基础分值不受扣分影响,提高计算结果的合理性 + +#### 审核模式(保持不变) +- 计算公式:总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和) + +#### 公式变化对比 +- **修正前**:K × (常规工作自评分 - 班级扣分50% + 特色工作总分) +- **修正后**:K × ((常规工作自评分 + 50) - 班级扣分50% + 特色工作总分) +- **关键变化**:新增班级扣分项满分值(50分)确保基础分值 ### 3. 数据存储逻辑 1. 先逻辑删除该计划下该教师的历史评分数据 diff --git a/docs/设计文档/database/hzdyjs_xg0820.sql b/docs/设计文档/database/hzdyjs_xg0820.sql index 2cb0e969..21c308f0 100644 --- a/docs/设计文档/database/hzdyjs_xg0820.sql +++ b/docs/设计文档/database/hzdyjs_xg0820.sql @@ -2186,7 +2186,7 @@ DROP TABLE IF EXISTS `rs_overseas_record_status_backup`; CREATE TABLE `rs_overseas_record_status_backup` ( `record_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '记录ID', `completion_status` char(1) DEFAULT '0' COMMENT '完成状态:0-进行中,1-已完成,2-提前结束', - `old_status_text` varchar(12) CHARACTER SET latin1 NOT NULL DEFAULT '', + `old_status_text` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '原状态文本', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/web/src/views/bzrkh/assessmentApproval/approvalDialog.vue b/web/src/views/bzrkh/assessmentApproval/approvalDialog.vue index ca3ee38c..8a5b93c9 100644 --- a/web/src/views/bzrkh/assessmentApproval/approvalDialog.vue +++ b/web/src/views/bzrkh/assessmentApproval/approvalDialog.vue @@ -249,17 +249,17 @@ - + - + @@ -360,7 +360,7 @@ const managementEffectivenessForm = reactive({ superiorComment: '' }); -// 月考核得分表单 +// 考核得分表单 const monthlyScoreForm = reactive({ selfOverallComment: '', superiorOverallComment: '' @@ -404,7 +404,7 @@ const formatNumber = (value?: number | string, precision = 4) => { return numValue.toFixed(precision); }; -/** 计算月考核得分 */ +/** 计算考核得分 */ const calculateMonthlyScore = () => { // 总系数(K) const totalCoefficient = approvalDetail.value?.coefficient?.totalCoefficient || 0; @@ -418,7 +418,7 @@ const calculateMonthlyScore = () => { // 特色工作上级评分之和(使用上级评分,而非自评分) const specialWorkTotal = specialWorkScores.value.reduce((sum, item) => sum + (item.superiorScore || 0), 0); - // 月考核得分 = 总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和) + // 考核得分 = 总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和) return totalCoefficient * (routineWorkTotal + managementEffectivenessScore + specialWorkTotal); }; @@ -490,25 +490,27 @@ const loadApprovalDetail = async () => { managementEffectivenessForm.classDeduction = Number(indicator.selfScore) || 0; managementEffectivenessForm.classDeductionHalf = (Number(indicator.selfScore) || 0) * 0.5; managementEffectivenessForm.selfComment = indicator.selfComment || ''; - // 上级评分默认使用按班级扣分50%计的分值 + // 上级评分默认使用50分-按班级扣分50%计的分值 const classDeductionHalf = (Number(indicator.selfScore) || 0) * 0.5; - managementEffectivenessForm.superiorScore = Number(indicator.superiorScore) || classDeductionHalf; + const defaultSuperiorScore = 50 - classDeductionHalf; + managementEffectivenessForm.superiorScore = Number(indicator.superiorScore) || defaultSuperiorScore; managementEffectivenessForm.superiorComment = indicator.superiorComment || ''; console.log('班级管理实效数据初始化:', { 班级扣分: managementEffectivenessForm.classDeduction, 扣分50计: managementEffectivenessForm.classDeductionHalf, 自评意见: managementEffectivenessForm.selfComment, 上级评分: managementEffectivenessForm.superiorScore, - 上级意见: managementEffectivenessForm.superiorComment + 上级意见: managementEffectivenessForm.superiorComment, + 默认上级评分计算: `50 - ${classDeductionHalf} = ${defaultSuperiorScore}` }); } else { // 如果没有找到班级扣分指标,设置默认值 managementEffectivenessForm.classDeduction = 0; managementEffectivenessForm.classDeductionHalf = 0; managementEffectivenessForm.selfComment = ''; - managementEffectivenessForm.superiorScore = 0; // 默认为0 + managementEffectivenessForm.superiorScore = 50; // 默认为满分50分 managementEffectivenessForm.superiorComment = ''; - console.warn('班级管理实效数据为空,使用默认值'); + console.warn('班级管理实效数据为空,使用默认值,上级评分默认为满分50分'); } // 初始化特色工作数据 - 确保包含所有必要字段 @@ -541,10 +543,10 @@ const loadApprovalDetail = async () => { console.warn('特色工作数据为空或格式错误'); } - // 初始化月考核得分数据 + // 初始化考核得分数据 monthlyScoreForm.selfOverallComment = approvalDetail.value?.selfOverallComment || ''; monthlyScoreForm.superiorOverallComment = approvalDetail.value?.superiorOverallComment || ''; - console.log('月考核得分数据初始化:', { + console.log('考核得分数据初始化:', { 自我总体评价: monthlyScoreForm.selfOverallComment, 上级总体评价: monthlyScoreForm.superiorOverallComment, 计算得分: calculateMonthlyScore().toFixed(2) diff --git a/web/src/views/bzrkh/assessmentApproval/viewDialog.vue b/web/src/views/bzrkh/assessmentApproval/viewDialog.vue index dc996577..2fba8e33 100644 --- a/web/src/views/bzrkh/assessmentApproval/viewDialog.vue +++ b/web/src/views/bzrkh/assessmentApproval/viewDialog.vue @@ -202,17 +202,17 @@ - + - + @@ -259,7 +259,7 @@ - + {{ calculateMonthlyScore().toFixed(2) }}分 @@ -343,7 +343,7 @@ const managementEffectivenessData = reactive({ superiorComment: '' }); -// 月考核得分数据 +// 考核得分数据 const monthlyScoreData = reactive({ selfOverallComment: '', superiorOverallComment: '' @@ -409,7 +409,7 @@ const formatNumber = (value?: number | string, precision = 4) => { return numValue.toFixed(precision); }; -/** 计算月考核得分 */ +/** 计算考核得分 */ const calculateMonthlyScore = () => { // 总系数(K) const totalCoefficient = viewDetail.value?.coefficient?.totalCoefficient || 0; @@ -423,7 +423,7 @@ const calculateMonthlyScore = () => { // 特色工作上级评分之和(查看界面显示最终审批结果,使用上级评分) const specialWorkTotal = specialWorkScores.value.reduce((sum, item) => sum + (item.superiorScore || 0), 0); - // 月考核得分 = 总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和) + // 考核得分 = 总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和) return totalCoefficient * (routineWorkTotal + managementEffectivenessScore + specialWorkTotal); }; @@ -431,7 +431,7 @@ const calculateMonthlyScore = () => { const calculateEvaluationLevel = () => { const score = calculateMonthlyScore(); console.log('=== 📊 评价等级计算调试 ==='); - console.log('💯 月考核得分:', score); + console.log('💯 考核得分:', score); console.log('📈 是否有统计数据:', !!evaluationStats.value); console.log('👤 当前用户ID:', currentRow.value?.evaluatedUserId); @@ -683,10 +683,10 @@ const loadViewDetail = async () => { console.warn('特色工作数据为空或格式错误'); } - // 初始化月考核得分数据 + // 初始化考核得分数据 monthlyScoreData.selfOverallComment = viewDetail.value?.selfOverallComment || ''; monthlyScoreData.superiorOverallComment = viewDetail.value?.superiorOverallComment || ''; - console.log('月考核得分数据初始化:', { + console.log('考核得分数据初始化:', { 自我总体评价: monthlyScoreData.selfOverallComment, 上级总体评价: monthlyScoreData.superiorOverallComment, 计算得分: calculateMonthlyScore().toFixed(2) diff --git a/web/src/views/bzrkh/teacherAssessment/submitDialog.vue b/web/src/views/bzrkh/teacherAssessment/submitDialog.vue index 677e9715..06656520 100644 --- a/web/src/views/bzrkh/teacherAssessment/submitDialog.vue +++ b/web/src/views/bzrkh/teacherAssessment/submitDialog.vue @@ -280,17 +280,17 @@ - + - + @@ -455,7 +455,7 @@ const specialWorkForm = reactive({ totalScore: 0 }); -// 月考核得分表单 +// 考核得分表单 const monthlyScoreForm = reactive({ overallComment: '' }); @@ -509,7 +509,7 @@ const calculateTotalSpecialScore = () => { (specialWorkForm.score1 || 0) + (specialWorkForm.score2 || 0) + (specialWorkForm.score3 || 0) + (specialWorkForm.score4 || 0); }; -/** 计算月考核得分 */ +/** 计算考核得分 */ const calculateMonthlyScore = () => { // 总系数(K) const totalCoefficient = assessmentDetail.value?.coefficient?.totalCoefficient || 0; @@ -523,8 +523,18 @@ const calculateMonthlyScore = () => { // 特色工作总分值 const specialWorkTotal = specialWorkForm.totalScore || 0; - // 月考核得分 = 总系数(K)* (班主任常规工作自评分之和 - 按班级扣分50%计的分值 + 特色工作总分值) - return totalCoefficient * (routineWorkTotal - deductionHalf + specialWorkTotal); + // 检查是否有实际评分数据(避免空白状态显示50分) + const hasAnyScore = routineWorkTotal > 0 || deductionHalf > 0 || specialWorkTotal > 0; + + if (!hasAnyScore || totalCoefficient === 0) { + return 0; // 没有评分数据时显示0 + } + + // 班级扣分项满分值(固定50分)- 仅在有评分数据时计算 + const classDeductionMaxScore = 50; + + // 修正后的考核得分公式 = 总系数(K)* ((班主任常规工作自评分之和 + 班级扣分项满分值) - 按班级扣分50%计的分值 + 特色工作总分值) + return totalCoefficient * ((routineWorkTotal + classDeductionMaxScore) - deductionHalf + specialWorkTotal); }; /** 打开弹窗 */ @@ -609,7 +619,7 @@ const loadAssessmentDetail = async () => { // 确保特色工作总分重新计算 calculateTotalSpecialScore(); - // 初始化月考核得分数据 + // 初始化考核得分数据 monthlyScoreForm.overallComment = assessmentDetail.value?.overallComment || ''; // 详细的调试信息:验证数据是否正确加载 @@ -978,7 +988,7 @@ defineExpose({ } } -/* 月考核得分表单样式优化 */ +/* 考核得分表单样式优化 */ :deep(.monthly-score-form) { .el-form-item__label { text-align: center; diff --git a/web/src/views/bzrkh/teacherAssessment/viewDialog.vue b/web/src/views/bzrkh/teacherAssessment/viewDialog.vue index 619ea023..8c91e595 100644 --- a/web/src/views/bzrkh/teacherAssessment/viewDialog.vue +++ b/web/src/views/bzrkh/teacherAssessment/viewDialog.vue @@ -256,17 +256,17 @@ - +