diff --git a/.gitignore b/.gitignore
index fd624ea9..1ec16190 100644
--- a/.gitignore
+++ b/.gitignore
@@ -326,4 +326,8 @@ docs/变更管理/
查找界面中涉及到的权限字符.md
docs/部署文档/nginx配置/hzdyjsweb.camasort.com.conf
首页完善的提示词.md
-scripts/
\ No newline at end of file
+scripts/
+学生宿舍卫生检查、学生违纪记录统计.md
+学生调宿、退宿功能.md
+学生动向信息界面(宿管员).md
+prompt/
diff --git a/backend/pom.xml b/backend/pom.xml
index 3f903412..261234a4 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -85,6 +85,16 @@
true
+
+ prod-local
+
+
+ prod-local
+ warn
+ ruoyi
+ 123456
+
+
prod
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/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/controller/CwProjectApprovalController.java b/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/controller/CwProjectApprovalController.java
new file mode 100644
index 00000000..b4e7c626
--- /dev/null
+++ b/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/controller/CwProjectApprovalController.java
@@ -0,0 +1,156 @@
+package org.dromara.cw.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.cw.domain.bo.CwCustomApprovalBo;
+import org.dromara.cw.domain.bo.CwApprovalActionBo;
+import org.dromara.cw.domain.vo.CwProjectApprovalProcessVo;
+import org.dromara.cw.domain.vo.CwApprovalRecordVo;
+import org.dromara.cw.service.ICwProjectApprovalService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.log.enums.BusinessType;
+
+/**
+ * 项目审批流程管理
+ *
+ * @author ruoyi
+ * @date 2025-01-03
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/cw/projectApproval")
+public class CwProjectApprovalController extends BaseController {
+
+ private final ICwProjectApprovalService projectApprovalService;
+
+ /**
+ * 启动自定义审批流程
+ */
+ @SaCheckPermission("cw:projectApproval:start")
+ @Log(title = "启动审批流程", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping("/start")
+ public R startApprovalProcess(@Validated @RequestBody CwCustomApprovalBo bo) {
+ // 设置提交人信息
+ bo.setSubmitterId(LoginHelper.getUserId());
+ bo.setSubmitterName(LoginHelper.getUsername());
+ return toAjax(projectApprovalService.startCustomApprovalProcess(bo));
+ }
+
+ /**
+ * 执行审批操作
+ */
+ @SaCheckPermission("cw:projectApproval:approve")
+ @Log(title = "执行审批操作", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping("/approve")
+ public R executeApproval(@Validated @RequestBody CwApprovalActionBo bo) {
+ return toAjax(projectApprovalService.executeApproval(bo));
+ }
+
+ /**
+ * 获取我的待审批列表
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @GetMapping("/pending")
+ public TableDataInfo getMyPendingApprovals(PageQuery pageQuery) {
+ return projectApprovalService.getMyPendingApprovals(pageQuery);
+ }
+
+ /**
+ * 获取我的已审批列表
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @GetMapping("/processed")
+ public TableDataInfo getMyProcessedApprovals(PageQuery pageQuery) {
+ return projectApprovalService.getMyProcessedApprovals(pageQuery);
+ }
+
+ /**
+ * 查询审批流程列表
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @GetMapping("/list")
+ public TableDataInfo list(PageQuery pageQuery) {
+ return projectApprovalService.queryProcessList(pageQuery);
+ }
+
+ /**
+ * 获取审批流程详情
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(projectApprovalService.getProcessDetail(id));
+ }
+
+ /**
+ * 获取审批记录列表
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @GetMapping("/records/{applicationId}")
+ public R> getApprovalRecords(@PathVariable Long applicationId) {
+ return R.ok(projectApprovalService.getApprovalRecords(applicationId));
+ }
+
+ /**
+ * 终止审批流程
+ */
+ @SaCheckPermission("cw:projectApproval:terminate")
+ @Log(title = "终止审批流程", businessType = BusinessType.UPDATE)
+ @DeleteMapping("/{ids}")
+ public R terminate(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(projectApprovalService.terminateProcess(List.of(ids)));
+ }
+
+ /**
+ * 审批流程验证
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @PostMapping("/validate")
+ public R validateApprovalProcess(@RequestBody CwCustomApprovalBo bo) {
+ // 简单验证逻辑
+ if (bo.getAuditorIds() == null || bo.getAuditorIds().isEmpty()) {
+ return R.fail("请选择审核人");
+ }
+ if (bo.getAuditorIds().size() > 10) {
+ return R.fail("审核人数量不能超过10个");
+ }
+ return R.ok("验证通过");
+ }
+
+ /**
+ * 审批选项查询(用于下拉选择)
+ */
+ @SaCheckPermission("cw:projectApproval:query")
+ @GetMapping("/options")
+ public R