Просмотр исходного кода

“0901班主任考核计算公式调整”

weizhong 1 год назад
Родитель
Сommit
933f39d79b

+ 1 - 1
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;
 

+ 1 - 1
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<SpecialWorkIndicatorVo> specialWorkIndicators;
 
     /**
-     * 月考核得分
+     * 考核得分
      */
     private BigDecimal monthlyScore;
 

+ 25 - 6
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();
     }

+ 13 - 1
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. 先逻辑删除该计划下该教师的历史评分数据

+ 1 - 1
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;

+ 15 - 13
web/src/views/bzrkh/assessmentApproval/approvalDialog.vue

@@ -249,17 +249,17 @@
         </el-table>
       </el-card>
 
-      <!-- 7. 月考核得分卡片 -->
+      <!-- 7. 考核得分卡片 -->
       <el-card shadow="never" class="info-card">
         <template #header>
           <div class="card-header">
-            <span>月考核得分</span>
+            <span>考核得分</span>
           </div>
         </template>
         <el-form :model="monthlyScoreForm" label-width="100px" class="monthly-score-form">
           <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="月考核得分">
+              <el-form-item label="考核得分">
                 <el-input :value="calculateMonthlyScore().toFixed(2)" readonly style="width: 100%; text-align: center" />
               </el-form-item>
             </el-col>
@@ -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)

+ 10 - 10
web/src/views/bzrkh/assessmentApproval/viewDialog.vue

@@ -202,17 +202,17 @@
         </el-table>
       </el-card>
 
-      <!-- 7. 月考核得分卡片 -->
+      <!-- 7. 考核得分卡片 -->
       <el-card shadow="never" class="info-card">
         <template #header>
           <div class="card-header">
-            <span>月考核得分</span>
+            <span>考核得分</span>
           </div>
         </template>
         <el-form label-width="100px" class="monthly-score-form">
           <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="月考核得分">
+              <el-form-item label="考核得分">
                 <el-input :value="calculateMonthlyScore().toFixed(2)" readonly style="width: 100%; text-align: center" />
               </el-form-item>
             </el-col>
@@ -259,7 +259,7 @@
               </el-tooltip>
             </div>
           </el-descriptions-item>
-          <el-descriptions-item label="月考核得分">
+          <el-descriptions-item label="考核得分">
             {{ calculateMonthlyScore().toFixed(2) }}分
           </el-descriptions-item>
           <el-descriptions-item label="审批时间">
@@ -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)

+ 19 - 9
web/src/views/bzrkh/teacherAssessment/submitDialog.vue

@@ -280,17 +280,17 @@
         </el-form>
       </el-card>
 
-      <!-- 7. 月考核得分卡片 -->
+      <!-- 7. 考核得分卡片 -->
       <el-card shadow="never" class="info-card">
         <template #header>
           <div class="card-header">
-            <span>月考核得分</span>
+            <span>考核得分</span>
           </div>
         </template>
         <el-form :model="monthlyScoreForm" label-width="100px" class="monthly-score-form">
           <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="月考核得分">
+              <el-form-item label="考核得分">
                 <el-input :value="calculateMonthlyScore().toFixed(2)" readonly style="width: 100%; text-align: center" />
               </el-form-item>
             </el-col>
@@ -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;

+ 25 - 15
web/src/views/bzrkh/teacherAssessment/viewDialog.vue

@@ -256,17 +256,17 @@
         </template>
       </el-card>
 
-      <!-- 7. 月考核得分卡片 -->
+      <!-- 7. 考核得分卡片 -->
       <el-card shadow="never" class="info-card">
         <template #header>
           <div class="card-header">
-            <span>月考核得分</span>
+            <span>考核得分</span>
           </div>
         </template>
         <!-- 提交模式:简单显示 -->
         <template v-if="viewMode === 'submit'">
           <el-descriptions :column="1" border>
-            <el-descriptions-item label="月考核得分">
+            <el-descriptions-item label="考核得分">
               <div class="monthly-score">{{ formatNumber(calculateMonthlyScore(), 2) }}</div>
             </el-descriptions-item>
             <el-descriptions-item label="总体评价">
@@ -279,7 +279,7 @@
           <el-form label-width="100px" class="monthly-score-form">
             <el-row :gutter="20">
               <el-col :span="8">
-                <el-form-item label="月考核得分">
+                <el-form-item label="考核得分">
                   <el-input :value="calculateMonthlyScore().toFixed(2)" readonly style="width: 100%; text-align: center; height: 24px;" />
                 </el-form-item>
               </el-col>
@@ -325,7 +325,7 @@
               </el-tooltip>
             </div>
           </el-descriptions-item>
-          <el-descriptions-item label="月考核得分">
+          <el-descriptions-item label="考核得分">
             {{ calculateMonthlyScore().toFixed(2) }}分
           </el-descriptions-item>
           <el-descriptions-item label="审批时间">
@@ -556,12 +556,12 @@ const specialWorkForm = reactive({
   totalScore: 0
 });
 
-  // 月考核得分表单(只读)
+  // 考核得分表单(只读)
   const monthlyScoreForm = reactive({
     overallComment: ''
   });
 
-  // 审批模式下的月考核得分数据
+  // 审批模式下的考核得分数据
   const approvalMonthlyScoreData = reactive({
     selfOverallComment: '',
     superiorOverallComment: ''
@@ -632,7 +632,7 @@ const formatNumber = (value?: number | string, precision = 4) => {
   return numValue.toFixed(precision);
 };
 
-/** 计算月考核得分 */
+/** 计算考核得分 */
 const calculateMonthlyScore = () => {
   if (viewMode.value === 'approval') {
     // 审批模式:使用上级评分计算
@@ -648,7 +648,7 @@ const calculateMonthlyScore = () => {
     // 特色工作上级评分之和
     const specialWorkTotal = approvalSpecialWorkScores.value.reduce((sum, item) => sum + (item.superiorScore || 0), 0);
 
-    // 月考核得分 = 总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和)
+    // 考核得分 = 总系数(K)* (班主任常规工作上级评分之和 + 班级管理实效上级评分 + 特色工作上级评分之和)
     return totalCoefficient * (routineWorkTotal + managementEffectivenessScore + specialWorkTotal);
   } else {
     // 提交模式:使用自评分计算
@@ -664,8 +664,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);
   }
 };
 
@@ -673,7 +683,7 @@ const calculateMonthlyScore = () => {
 const calculateEvaluationLevel = () => {
   const score = calculateMonthlyScore();
   console.log('=== 📊 评价等级计算调试 ===');
-  console.log('💯 月考核得分:', score);
+  console.log('💯 考核得分:', score);
   console.log('📈 是否有统计数据:', !!evaluationStats.value);
   
   if (evaluationStats.value) {
@@ -899,10 +909,10 @@ const loadApprovalDetail = async () => {
       console.log('审批模式 - 特色工作数据初始化完成,条目数量:', approvalSpecialWorkScores.value.length);
     }
 
-    // 初始化月考核得分数据
+    // 初始化考核得分数据
     approvalMonthlyScoreData.selfOverallComment = approvalDetail.value?.selfOverallComment || '';
     approvalMonthlyScoreData.superiorOverallComment = approvalDetail.value?.superiorOverallComment || '';
-    console.log('审批模式 - 月考核得分数据初始化完成');
+    console.log('审批模式 - 考核得分数据初始化完成');
 
     // 获取评价等级统计数据
     try {
@@ -976,7 +986,7 @@ const loadAssessmentDetail = async () => {
     specialWorkForm.totalScore =
       (specialWorkForm.score1 || 0) + (specialWorkForm.score2 || 0) + (specialWorkForm.score3 || 0) + (specialWorkForm.score4 || 0);
 
-    // 初始化月考核得分数据
+    // 初始化考核得分数据
     monthlyScoreForm.overallComment = assessmentDetail.value?.overallComment || '';
 
     console.log('=== 查看考核数据加载完成 ===');