“出国申请工作流修改10.29版”

This commit is contained in:
weizhong committed 2025-10-29 12:48:19 +08:00
1 parent f907b9cd40
commit 32b9822146
7 files changed
+593 -169

No files matched your search

+181 -1
View File
@@ -1061,4 +1061,184 @@ PDF模板包含以下空白填写区域(完全手工填写):
**🆕 更新日志**:
- 2025-10-17 新增党籍保留PDF空白模板下载功能(线下手工填写)
- 接口路径调整:从 `/application/downloadPartyRetentionTemplate/{id}` 改为 `/record/downloadPartyRetention`
- 模板类型变更:从预填充模板改为完全空白模板
- 模板类型变更:从预填充模板改为完全空白模板
---
## 附录:工作流集成说明
### 动态审批人方案
#### 背景
出国申请业务集成了Warm-Flow工作流引擎,审批流程为:**发起人 → 部门领导 → 校领导**。审批人根据申请人所属部门动态确定,系统需要实时查询当前待审批人信息。
#### 方案设计
##### 1. 数据库字段说明
`rs_overseas_application` 表中的 `current_approver_id` 字段:
- **字段类型**:`bigint(20)`
- **字段作用**:**冗余展示字段**(非核心业务字段)
- **维护方式**:不再由后端业务代码维护
- **数据来源**:前端通过工作流API实时查询获取
- **设计原因**:
- 审批人由工作流引擎动态确定,工作流表 `flow_node_user` 是唯一数据源
- 避免数据冗余和不一致问题
- 简化后端业务逻辑,降低维护成本
##### 2. 后端实现
**核心原则**:后端不维护 `current_approver_id` 字段
```java
// OverseasApplicationServiceImpl.java
// ✅ 新增申请:不设置 current_approver_id
public Long addOverseasApplication(OverseasApplicationBo bo) {
// ... 业务逻辑
// 不再包含:application.setCurrentApproverId(xxx);
}
// ✅ 提交审批:不设置 current_approver_id
public R<Void> submitApplication(Long id) {
// ... 提交工作流
// 不再包含:application.setCurrentApproverId(xxx);
}
// ✅ 审批通过:不设置 current_approver_id
public R<Void> approve(Long id, String remark) {
// ... 审批逻辑
// 不再包含:application.setCurrentApproverId(xxx);
}
```
**代码清理**:
- 所有 `setCurrentApproverId()` 调用已移除
- 相关查询逻辑已删除
- 字段仅作为数据库表结构保留(历史兼容)
##### 3. 前端实现
**核心方案**:通过工作流API实时查询当前审批人
```typescript
// overseasApplication/index.vue
// 方案一:列表查询时批量获取审批人(推荐)
const getList = async () => {
const response = await listOverseasApplication(queryParams.value);
dataList.value = response.rows;
total.value = response.total;
// 批量查询审批人信息
await batchGetCurrentApproverNames();
};
// 批量获取审批人姓名
const batchGetCurrentApproverNames = async () => {
const promises = dataList.value
.filter(item => item.status === 'processing')
.map(async item => {
try {
// 调用工作流API查询当前审批人
const approvers = await getCurrentApproversForTask(item.flowProcessId);
item.currentApproverName = approvers.map(u => u.name).join('、');
} catch (error) {
item.currentApproverName = '-';
}
});
await Promise.all(promises);
};
// 方案二:详情查询时单独获取审批人
const handleViewDetail = async (row: OverseasApplicationVo) => {
currentRow.value = row;
// 如果流程进行中,查询当前审批人
if (row.flowProcessId && row.status === 'processing') {
try {
const approvers = await getCurrentApproversForTask(row.flowProcessId);
currentRow.value.currentApproverName = approvers.map(u => u.name).join('、');
} catch (error) {
currentRow.value.currentApproverName = '查询失败';
}
}
detailDialogVisible.value = true;
};
```
**工作流API调用**:
```typescript
// 查询当前审批人(从工作流引擎获取)
import { getCurrentApproversForTask } from '@/api/workflow/common';
// API 路径:/api/workflow/instance/{processId}/current-approvers
// 返回格式:
{
"code": 200,
"msg": "操作成功",
"data": [
{
"userId": 1001,
"userName": "张三",
"nodeId": 2,
"nodeName": "部门领导审批"
}
]
}
```
##### 4. 接口改造
相关API接口响应中的 `current_approver_id` 字段说明:
| 接口 | 字段说明 | 使用建议 |
|------|---------|---------|
| 查询列表 | 返回null或历史值 | 忽略,通过工作流API获取 |
| 查询详情 | 返回null或历史值 | 忽略,通过工作流API获取 |
| 新增/修改 | 不处理该字段 | 前端不传递 |
| 提交审批 | 不处理该字段 | 前端不传递 |
##### 5. 优势分析
**✅ 数据一致性**
- 工作流表是唯一数据源,避免双写不一致
- 审批人变更(如转办、委派)自动生效
**✅ 降低维护成本**
- 后端无需在多个业务方法中同步更新
- 减少代码复杂度和潜在Bug
**✅ 实时性**
- 前端每次查询都获取最新审批人
- 支持工作流引擎的高级功能(并行审批、会签等)
**✅ 扩展性**
- 审批流程调整时,前端无需修改
- 支持更复杂的审批场景(多人会签、或签等)
#### 实施步骤
1. ✅ **后端改造**:移除所有 `current_approver_id` 字段的赋值代码
2. ✅ **前端改造**:实现基于工作流API的动态查询
3. ⏳ **测试验证**:确保列表、详情页面正确显示审批人
4. ⏳ **文档更新**:同步更新API文档和技术文档
#### 注意事项
- 历史数据中的 `current_approver_id` 字段可能存在脏数据,前端应忽略
- 工作流API调用失败时,前端应显示友好提示(如 "-" 或 "查询失败")
- 性能优化:列表页建议使用批量查询,避免N+1查询问题
- 缓存策略:同一个流程实例的审批人信息可短时间缓存(如30秒)
---
**更新时间**:2025-10-28
**维护人员**:开发团队
**变更记录**:新增工作流动态审批人方案说明