approvalList(
+ @RequestParam(value = "auditState", required = false) String auditState,
+ @RequestParam(value = "status", required = false) String status,
NoticeQuery query,
@SortDefault(sort = "updateTime", direction = Sort.Direction.DESC) Sort sort) {
- return noticeService.approvalList(auditState, query, PageUtils.toPageable(query, sort));
+ return noticeService.approvalList(
+ StringUtils.hasText(auditState) ? auditState : status, query, PageUtils.toPageable(query, sort));
+ }
+
+ // ============================ 待我审批数量(菜单角标) ============================
+
+ /**
+ * 待我审批数量:待审批且当前步审批人快照含当前登录人(账号或教师ID)。
+ */
+ @GetMapping("ApprovalCount")
+ public int approvalCount() {
+ return noticeService.approvalCount();
}
/** 解析 scopes JSON 参数为范围列表(空/非法返回 null = 无范围) */
diff --git a/src/main/java/com/yunhai/campusnotice/entity/Notice.java b/src/main/java/com/yunhai/campusnotice/entity/Notice.java
index 97c056a..a54e484 100644
--- a/src/main/java/com/yunhai/campusnotice/entity/Notice.java
+++ b/src/main/java/com/yunhai/campusnotice/entity/Notice.java
@@ -165,6 +165,20 @@ public class Notice extends BaseEntity {
@Column(name = "approver_tea_ids", columnDefinition = "LONGTEXT")
private String approverTeaIds;
+ /**
+ * 当前待审步骤的审批人账号快照(JSON 账号数组 ["zhd","lwj"]):随流程推进刷新为
+ * 当前步审批人组,ApprovalList 按「待我审批」过滤(与 approverTeaIds 双轨匹配)。
+ */
+ @Column(name = "approver_accounts", columnDefinition = "LONGTEXT")
+ private String approverAccounts;
+
+ /**
+ * 当前待审步骤下标(0 起,对齐前端 approvalLevel):0=第 1 步审批中;
+ * 走完全部步(已发布)= 步骤总数;无流程为 null。步骤全量见 notice_approval_step 表。
+ */
+ @Column(name = "approval_level")
+ private Integer approvalLevel;
+
/**
* 定时发送已真正发布标记:到点调度后回写为 1,避免重复触发(改造方案 4.2)。
* 立即发布的通知在真实发布时一并置 1。
diff --git a/src/main/java/com/yunhai/campusnotice/model/notice/ApprovalListVo.java b/src/main/java/com/yunhai/campusnotice/model/notice/ApprovalListVo.java
deleted file mode 100644
index 9707b2d..0000000
--- a/src/main/java/com/yunhai/campusnotice/model/notice/ApprovalListVo.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.yunhai.campusnotice.model.notice;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 审批列表行 VO(notice/ApprovalList,待审/已审合一)。
- * 已审行携带最新处理信息:或签下含「他人已处理」(handledByMe=false),
- * 实际处理人/动作/时间/意见取 notice_approval 最新通过/驳回行。
- */
-@Data
-public class ApprovalListVo {
-
- private Integer id;
-
- private String title;
-
- /** 通知类型:1 普通 / 2 重要 */
- private Integer type;
-
- private String typeDesc;
-
- /** 状态:2 待审批 / 1 已发布 / 3 已驳回 */
- private Integer status;
-
- private String statusDesc;
-
- /** 发布人账号 */
- private String publisherAccount;
-
- /** 发布人姓名 */
- private String publisherName;
-
- /** 本轮审批人姓名(来自提交行 assignees 快照,列表页免查用户中心) */
- private List approverNames = new ArrayList<>();
-
- /** 最新一轮提交时间 */
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime submitTime;
-
- /** 是否需要学员阅读回执 */
- private Integer receiptFlag;
-
- /** 定时发送时间(审批通过后到点真实发布) */
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime timingSendTime;
-
- // ==================== 已审 Tab 字段(待审 Tab 为空) ====================
-
- /** 是否已有处理结果(已审 Tab 恒 true,冗余字段便于前端判断) */
- private boolean handled;
-
- /** 是否由当前登录人处理(false=或签下他人已处理) */
- private boolean handledByMe;
-
- /** 实际处理人账号 */
- private String handledAccount;
-
- /** 实际处理人姓名 */
- private String handledName;
-
- /** 实际处理动作:2 通过 / 3 驳回 */
- private Integer handledAction;
-
- /** 实际处理动作描述 */
- private String handledActionDesc;
-
- /** 实际处理时间 */
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private LocalDateTime handledTime;
-
- /** 处理意见(长文本建议进详情查看) */
- private String handledOpinion;
-}
diff --git a/src/main/java/com/yunhai/campusnotice/model/notice/NoticeDetailVo.java b/src/main/java/com/yunhai/campusnotice/model/notice/NoticeDetailVo.java
index 353e843..1e9e354 100644
--- a/src/main/java/com/yunhai/campusnotice/model/notice/NoticeDetailVo.java
+++ b/src/main/java/com/yunhai/campusnotice/model/notice/NoticeDetailVo.java
@@ -93,6 +93,32 @@ public class NoticeDetailVo {
@JsonProperty("approverTeaIds")
private List approverTeaIds;
+ // ==================== 多步审批流(审核改造,学员端 mobiapi 不返回) ====================
+
+ /** 是否启用审批流:0 否 / 1 是(存在审批步骤即为 1) */
+ @JsonProperty("approvalEnabled")
+ private Integer approvalEnabled;
+
+ /** 审批状态:none / pending / approved / rejected */
+ @JsonProperty("approvalStatus")
+ private String approvalStatus;
+
+ /** 审批状态文本(待审批带步骤进度) */
+ @JsonProperty("approvalStatusDesc")
+ private String approvalStatusDesc;
+
+ /** 当前待审步骤下标(0 起;已走完=步数;无流程=0) */
+ @JsonProperty("approvalLevel")
+ private Integer approvalLevel;
+
+ /** 当前用户是否为本单当前步待签审批人 */
+ @JsonProperty("canApprove")
+ private Boolean canApprove;
+
+ /** 多步审批流进度(含每步审核记录;也用于发布/编辑表单回显审批人配置) */
+ @JsonProperty("approvalFlow")
+ private List approvalFlow;
+
/**
* 附件项(旧 ChaoSend 数组元素)。
*/
diff --git a/src/main/java/com/yunhai/campusnotice/model/notice/NoticeRequest.java b/src/main/java/com/yunhai/campusnotice/model/notice/NoticeRequest.java
index 0c351f1..32069e3 100644
--- a/src/main/java/com/yunhai/campusnotice/model/notice/NoticeRequest.java
+++ b/src/main/java/com/yunhai/campusnotice/model/notice/NoticeRequest.java
@@ -63,6 +63,20 @@ public class NoticeRequest {
/** 发布方式:direct 直接发布(默认,兼容旧链路)/ draft 存为草稿 / approve 提交审批(需携带 approverTeaIds) */
private String publishType;
- /** 提交审批时所选审批教师ID(教师树叶子节点ID,publishType=approve 时必填;独立 Submit 接口走 SubmitRequest) */
+ /** 提交审批时所选审批教师ID(教师树叶子节点ID,旧链路兼容;publishType=approve 时与 flow 二选一) */
private List approverTeaIds;
+
+ // ==================== 多步审批流(审核改造:步骤表 + 审核记录表) ====================
+
+ /**
+ * 多步审批流:[{name, vote, approvers:[登录账号]}],按序流转,任一步驳回整单退回。
+ * 传了 flow 时忽略 approvers/vote/approverTeaIds。
+ */
+ private List flow;
+
+ /** 单步审批人登录账号列表(flow 缺省时的单步简写;选人即送审) */
+ private List approvers;
+
+ /** 单步表决方式:any 或签(默认)/ all 会签(配合 approvers) */
+ private String vote;
}
diff --git a/src/main/java/com/yunhai/campusnotice/model/notice/NoticeVo.java b/src/main/java/com/yunhai/campusnotice/model/notice/NoticeVo.java
index 755b9f7..61ec7f9 100644
--- a/src/main/java/com/yunhai/campusnotice/model/notice/NoticeVo.java
+++ b/src/main/java/com/yunhai/campusnotice/model/notice/NoticeVo.java
@@ -58,6 +58,22 @@ public class NoticeVo {
/** 审批教师ID快照(JSON 数组串 [101,102],发布流程展示用) */
private String approverTeaIds;
+ // ==================== 多步审批流(审核改造) ====================
+
+ /**
+ * 审批状态(前端枚举):none 免审已发布 / pending 待审批 / approved 审批通过已发布 / rejected 已驳回。
+ */
+ private String approvalStatus;
+
+ /** 审批状态文本:待审批时带步骤进度(如「第1/2步 校级审核·会签 0/2」) */
+ private String approvalStatusDesc;
+
+ /** 当前待审步骤下标(0 起;已走完=步数;无流程=0) */
+ private Integer approvalLevel;
+
+ /** 当前用户是否为本单当前步待签审批人(审批列表/详情操作按钮用) */
+ private Boolean canApprove;
+
/** 附件ID串("1,2,3",列表页下载入口使用;对齐旧 .NET UpFile 字段) */
private String UpFile;
diff --git a/src/main/java/com/yunhai/campusnotice/model/notice/SubmitRequest.java b/src/main/java/com/yunhai/campusnotice/model/notice/SubmitRequest.java
index a44750f..bd75807 100644
--- a/src/main/java/com/yunhai/campusnotice/model/notice/SubmitRequest.java
+++ b/src/main/java/com/yunhai/campusnotice/model/notice/SubmitRequest.java
@@ -6,7 +6,7 @@ import java.util.List;
/**
* 提交审批入参(notice/Submit)。
- * 审批人可多选,或签语义:任一审批人通过即发布、任一驳回即驳回。
+ * 审批人可多选;steps 多步流程优先,缺省时 approverTeaIds 包装为单步或签(旧链路兼容)。
*/
@Data
public class SubmitRequest {
@@ -14,9 +14,12 @@ public class SubmitRequest {
/** 通知ID */
private Integer serid;
- /** 选定审批教师ID列表(教师树叶子节点ID,至少一人) */
+ /** 选定审批教师ID列表(教师树叶子节点ID,旧链路:单步或签) */
private List approverTeaIds;
+ /** 多步审批流([{name, vote, approvers:[登录账号]}],传了则忽略 approverTeaIds) */
+ private List steps;
+
/** 提交说明(可选) */
private String opinion;
}
diff --git a/src/main/java/com/yunhai/campusnotice/repository/NoticeApprovalRepository.java b/src/main/java/com/yunhai/campusnotice/repository/NoticeApprovalRepository.java
index 677f98b..b7aa999 100644
--- a/src/main/java/com/yunhai/campusnotice/repository/NoticeApprovalRepository.java
+++ b/src/main/java/com/yunhai/campusnotice/repository/NoticeApprovalRepository.java
@@ -29,4 +29,7 @@ public interface NoticeApprovalRepository extends JpaRepository getStuTree(Integer schId);
+ List getTeaTree(Integer schId,boolean toUser);
+
+ List getStuTree(Integer schId,boolean toUser);
}
diff --git a/src/main/java/com/yunhai/campusnotice/service/IDictService.java b/src/main/java/com/yunhai/campusnotice/service/IDictService.java
index c76d2c5..a822810 100644
--- a/src/main/java/com/yunhai/campusnotice/service/IDictService.java
+++ b/src/main/java/com/yunhai/campusnotice/service/IDictService.java
@@ -71,4 +71,35 @@ public interface IDictService {
* @return 部门名称;无匹配时返回 null
*/
String resolveDeptName(String deptId);
+
+ // ==================== 审批人池(审核设置,多步审批选人数据源) ====================
+
+ /**
+ * 审批人候选池(仅启用者):发公告选审批人数据源。
+ *
+ * @return List<Map> 每项 {id, name, account, deptName, isParent}
+ */
+ List