diff --git a/.gitignore b/.gitignore
index fd624ea9..03ef4a45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -326,4 +326,5 @@ docs/变更管理/
查找界面中涉及到的权限字符.md
docs/部署文档/nginx配置/hzdyjsweb.camasort.com.conf
首页完善的提示词.md
-scripts/
\ No newline at end of file
+scripts/
+学生宿舍卫生检查、学生违纪记录统计.md
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-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