@steedos-labs/content-compliance-bev 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/lib/actions/spotCheckMaterial.d.ts +19 -0
- package/lib/actions/spotCheckMaterial.js +418 -67
- package/lib/actions/spotCheckMaterial.js.map +1 -1
- package/lib/const.d.ts +1 -1
- package/lib/index.js +66 -33
- package/lib/index.js.map +1 -1
- package/main/default/applications/pepsico_content_review.app.yml +6 -0
- package/main/default/applications/pepsico_content_setting.app.yml +11 -0
- package/main/default/objects/pepsico_approval_process/fields/owner.field.yml +1 -0
- package/main/default/objects/pepsico_material_approval/fields/check_list.field.yml +1 -1
- package/package.json +1 -1
- package/tsconfig.json +2 -0
- package//345/256/241/346/211/271/345/274/225/346/223/216/350/257/264/346/230/216.md +206 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# 审批引擎说明
|
|
2
|
+
|
|
3
|
+
## 核心流程节点
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
草稿(draft)
|
|
7
|
+
│
|
|
8
|
+
├─[DCO类型内容]──────────────────────────────────────────► 结论(conclusion)
|
|
9
|
+
│
|
|
10
|
+
└─[普通内容]
|
|
11
|
+
│
|
|
12
|
+
▼
|
|
13
|
+
AI审核(ai_review)
|
|
14
|
+
│
|
|
15
|
+
├─[拒绝]──► 草稿(draft) ← 退回发起人修改
|
|
16
|
+
│
|
|
17
|
+
└─[通过] ──► 路由判断(flow_rule规则)
|
|
18
|
+
│
|
|
19
|
+
┌──────────┴──────────┐
|
|
20
|
+
│ │
|
|
21
|
+
▼ ▼
|
|
22
|
+
四部门并行审核 专员审核
|
|
23
|
+
(departmental_review) (personnel_review)
|
|
24
|
+
│ │
|
|
25
|
+
└─────────┬───────────┘
|
|
26
|
+
│
|
|
27
|
+
┌─────────┴─────────┐
|
|
28
|
+
│ │
|
|
29
|
+
[拒绝] [通过]
|
|
30
|
+
│ │
|
|
31
|
+
▼ ┌───┴───────────────┐
|
|
32
|
+
提交人修改 ch_upload=no? ch_upload=yes?
|
|
33
|
+
(submitter_revisions) │ │
|
|
34
|
+
│ [直接结束] 待传输
|
|
35
|
+
│ conclusion (awaiting_deployment)
|
|
36
|
+
│ │
|
|
37
|
+
└────────────────► 结论(conclusion)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 各节点详情
|
|
43
|
+
|
|
44
|
+
| 节点 | 标识 | 操作人 | 说明 |
|
|
45
|
+
|------|------|--------|------|
|
|
46
|
+
| **草稿** | `draft` | 发起人 | 填写信息、上传素材,提交后进入 AI 审核 |
|
|
47
|
+
| **AI 审核** | `ai_review` | AI 系统账号 | 自动合规检查;管理员可 skip 此步骤 |
|
|
48
|
+
| **四部门并行审核** | `departmental_review` | NS / Legal / SRA / CA | 四部门同时审核,**全部通过**才算通过,**任一驳回**即推进到驳回 |
|
|
49
|
+
| **专员审核** | `personnel_review` | 审核专员(guding) | 单人/单部门审核 |
|
|
50
|
+
| **提交人修改** | `submitter_revisions` | 发起人 | 被驳回后修改,重提后智能跳过上轮已通过的审核人 |
|
|
51
|
+
| **待传输** | `awaiting_deployment` | material_owner | 通知素材负责人确认/延后传输到 Content Hub |
|
|
52
|
+
| **结论** | `conclusion` | - | 终态,可能是通过/驳回/中止 |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 路由规则 (flow_rule)
|
|
57
|
+
|
|
58
|
+
通过 `pepsico_flow_rule` 表的公式动态决定走哪个审核路径:
|
|
59
|
+
|
|
60
|
+
- **`skip_approve`** 条件为真 → 跳过审核,AI 通过后直接 `conclusion`
|
|
61
|
+
- **`name`** 公式为真 → 走**专员审核** (`personnel_review`)
|
|
62
|
+
- **`name`** 公式为假 → 走**四部门并行** (`departmental_review`)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 部门内多人审核规则
|
|
67
|
+
|
|
68
|
+
### 两个层级的多对多关系
|
|
69
|
+
|
|
70
|
+
审核涉及两个维度的"多":
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
审批单
|
|
74
|
+
└── 多个部门 (CA / NS / Legal / SRA) — 并行
|
|
75
|
+
└── 每个部门有多个处理人 (handler_ca: [A, B, C])
|
|
76
|
+
└── 每个处理人对每个素材逐一处理
|
|
77
|
+
└── pepsico_approval_task (一条记录 = 一人 × 一素材)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 单素材的部门通过规则
|
|
81
|
+
|
|
82
|
+
判断逻辑在 `getMaterialStatus` (`src/methods/task.ts`):
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
对于某部门的某素材:
|
|
86
|
+
1. 如果 handler_xxx 人数 > 已提交 task 数量 → pending (有人未处理)
|
|
87
|
+
2. 遍历每一位处理人:
|
|
88
|
+
如果该用户没有 approval_status == true 的 task → rejected
|
|
89
|
+
3. 所有处理人都有 approved task → approved
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**结论:部门内所有处理人必须全部通过,该素材才算该部门通过。任意一人驳回即驳回。**
|
|
93
|
+
|
|
94
|
+
### 审批单部门状态的汇总规则
|
|
95
|
+
|
|
96
|
+
判断逻辑在 `getUserReviewedAllMaterialsStatus` (`src/methods/material.ts`),由 `approveMaterial` / `rejectMaterial` 触发:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
每当某处理人完成一个素材的审核后:
|
|
100
|
+
检查该审批单的所有未作废素材的 {dept}_approval_status:
|
|
101
|
+
- 存在 null / '' / undefined 的素材 → pending (继续等待)
|
|
102
|
+
- 全部非空且有 false → rejected → 触发驳回流程
|
|
103
|
+
- 全部为 true → approved → 触发通过流程
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 处理人完成"当前步骤"的判断
|
|
107
|
+
|
|
108
|
+
在 `submitMaterialTask` (`src/methods/task.ts`) 中:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
当处理人完成某素材后,检查:
|
|
112
|
+
"该用户还有多少未处理的素材(排除已作废)" vs "该用户还有多少未完成的 task"
|
|
113
|
+
|
|
114
|
+
如果 processed.length == pendingMaterialList.length
|
|
115
|
+
→ 该用户已完成所有素材
|
|
116
|
+
→ 更新 pepsico_approval_process 为 approved/rejected
|
|
117
|
+
→ 将用户加入 person_done
|
|
118
|
+
→ 从 person_pending_user 中移除该用户
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 角色判定:同一人属于哪个部门?
|
|
122
|
+
|
|
123
|
+
`getApproverField` (`src/methods/material.ts`) 通过以下顺序判断用户角色:
|
|
124
|
+
|
|
125
|
+
1. 当前步骤是 `departmental_review` 时,依次检查用户是否在 `ca_reviewer / handler_ca`、`sra_reviewer / handler_sra`、`ns_reviewer / handler_ns`、`legal_reviewer / handler_legal` 中
|
|
126
|
+
2. 再检查 `pepsico_approval_process` 中该用户的 `type` 字段(Kids 优先)
|
|
127
|
+
3. Kids 单独判断:`child_files == 'yes'` 且部门状态尚未完成
|
|
128
|
+
|
|
129
|
+
> **注意:** 当前实现中一个用户同一步骤只映射到第一个匹配的部门角色(`if / else if` 链),如果同一人被同时配置到两个部门则只取第一个。
|
|
130
|
+
|
|
131
|
+
### 完整的"部门通过"链路
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
处理人 A 审核素材 X → pepsico_approval_task (A, X, ca, approved)
|
|
135
|
+
处理人 B 审核素材 X → pepsico_approval_task (B, X, ca, approved)
|
|
136
|
+
↓
|
|
137
|
+
getMaterialStatus: A + B 都通过 → approved
|
|
138
|
+
↓
|
|
139
|
+
pepsico_material.ca_approval_status = true
|
|
140
|
+
↓
|
|
141
|
+
getUserReviewedAllMaterialsStatus: 所有素材都 true?
|
|
142
|
+
↓ 是
|
|
143
|
+
pepsico_material_approval.ca_approval_status = true
|
|
144
|
+
↓
|
|
145
|
+
approvalContent: 检查 CA/NS/Legal/SRA 四部门是否全部完成
|
|
146
|
+
↓ 全部完成
|
|
147
|
+
advanceApproval → 推进到下一步
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Kids 特殊审核
|
|
153
|
+
|
|
154
|
+
当 `child_files == 'yes'` 时,无论走哪条路径,都**额外附加 Kids 审核人**:
|
|
155
|
+
|
|
156
|
+
- 四部门审核时:Kids 与四部门并行
|
|
157
|
+
- 专员审核时:Kids 与专员并行
|
|
158
|
+
- 必须专员 + Kids **都完成**才能推进步骤
|
|
159
|
+
- Kids 采用逐素材审核模式,不自动推进审批单状态,需通过 `submitKidsContent` 显式推进
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 外部用户流程
|
|
164
|
+
|
|
165
|
+
`is_external == true` 时,草稿提交后**不走审核流**,而是将 owner 转移给内部负责人,由内部人员重新正式提交。
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 传输节点 (awaiting_deployment)
|
|
170
|
+
|
|
171
|
+
仅当 `ch_upload != 'no'` 时才会出现。`material_owner` 可选择:
|
|
172
|
+
|
|
173
|
+
- **确认传输** (`confirmDeployment`) → 推进到 `conclusion` + 推送 Content Hub
|
|
174
|
+
- **延后传输** (`postponeDeployment`) → 标记 `launch=postpone`,记录延后日期
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 中止能力
|
|
179
|
+
|
|
180
|
+
发起人、空间管理员、或当前待审批人均可**中止审批** (`terminate`),直接进入 `conclusion`,`review_status = terminated`。
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 重审优化(submitter_revisions 后)
|
|
185
|
+
|
|
186
|
+
提交人修改后重新提交时,引擎会检查各部门上轮是否已通过:
|
|
187
|
+
|
|
188
|
+
- **上轮已通过**的审核人 → 自动跳过,不再分配任务
|
|
189
|
+
- **上轮驳回或未处理**的审核人 → 重新分配
|
|
190
|
+
- **所有审核人上轮均已通过** → 直接进入 `conclusion`
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 关键数据字段
|
|
195
|
+
|
|
196
|
+
| 字段 | 说明 |
|
|
197
|
+
|------|------|
|
|
198
|
+
| `current_step` | 当前所处节点 |
|
|
199
|
+
| `review_status` | 整体审核状态:`draft/under_review/approved/rejected/terminated` |
|
|
200
|
+
| `person_pending_approve` | 当前待审批人员列表 |
|
|
201
|
+
| `person_pending_user` | 以用户维度的待处理人员(同一用户在多角色时去重处理) |
|
|
202
|
+
| `person_approved` | 历史已处理人员 |
|
|
203
|
+
| `person_done` | 本轮已完成审批人员(重审时清空) |
|
|
204
|
+
| `handler_*` | 各部门本轮实际处理人(CA/NS/Legal/SRA/Kids/guding) |
|
|
205
|
+
| `display_handler_*` | 各部门历史处理人(含历史轮次,用于展示) |
|
|
206
|
+
| `{dept}_approval_status` | 各部门审核结果:`true=通过 / false=驳回 / ''=审核中` |
|