“出国申请工作流修改10.29版”
This commit is contained in:
1 parent
f907b9cd40
commit
32b9822146
7 files changed
+593
-169
No files matched your search
+181
-1
@@ -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
|
||||
**维护人员**:开发团队
|
||||
**变更记录**:新增工作流动态审批人方案说明
|
||||
Reference in new issue
Block a user