拆分顺序:数据模型 → BPMN 配置协议 → 后端扫描发送 → 前端配置入口 → 测试验证 每个任务尽量控制在 3-5 个核心文件内,避免把流程设计器、消息模块和扫描服务混在一个提交里。
ApproverConfig.vue。flowable:dueDate。templateCode、params、channel 和 sendIfAbsent。FlowTimeoutServiceImpl 定时扫描未启用且通知发送为 TODO。/apply 前确认迁移版本号,当前使用 V1.0.74。forge-server/db/migration/V1.0.74__add_flow_task_overdue_reminder.sql — 新增提醒记录表、扩展 sys_flow_node_config、写入字典、默认模板和消息业务类型。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/entity/FlowOverdueReminderRecord.java — 新增提醒记录实体。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/entity/FlowNodeConfig.java — 增加逾期提醒 fallback 字段。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/mapper/FlowOverdueReminderRecordMapper.java — 新增 Mapper。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/resources/mapper/FlowOverdueReminderRecordMapper.xml — 新增按唯一键查询/更新发送结果 SQL。java
public class FlowOverdueReminderRecord {
private String id;
private Long tenantId;
private String taskId;
private String processInstanceId;
private String processDefKey;
private String taskDefKey;
private String reminderKey;
private String channel;
private String templateCode;
private String receiverUserIds;
private Long messageId;
private Integer sendStatus;
private LocalDateTime sendTime;
private String errorMessage;
}
IF NOT EXISTS / information_schema 防重复保护。tenant_id=1。tenant_id + reminder_key + channel。forge-admin-ui/src/components/flow-designer/constants/default-configs.js — 审批节点默认配置新增逾期提醒字段。forge-admin-ui/src/components/flow-designer/converter/user-task-parser.js — 解析 flowable:overdueReminder* 属性。forge-admin-ui/src/components/flow-designer/converter/user-task-writer.js — 写出 flowable:overdueReminder* 属性,并兼容天/小时处理时限。forge-admin-ui/src/components/flow-designer/converter/__tests__/user-task-parser-permissions.spec.js — 增加逾期提醒解析测试。forge-admin-ui/src/components/flow-designer/converter/__tests__/json-to-bpmn.spec.js — 增加逾期提醒写出测试。js
const overdueReminderDefaults = {
dueDateDays: 0,
dueDateHours: 0,
overdueReminderEnabled: false,
overdueReminderTemplateCode: 'FLOW_TASK_OVERDUE',
overdueReminderChannels: ['WEB'],
overdueReminderRepeatMode: 'once',
overdueReminderIntervalMinutes: 1440,
overdueReminderMaxTimes: 1,
}
xml
flowable:dueDate="P1DT2H"
flowable:overdueReminderEnabled="true"
flowable:overdueReminderTemplateCode="FLOW_TASK_OVERDUE"
flowable:overdueReminderChannels="WEB,EMAIL"
flowable:overdueReminderRepeatMode="once"
flowable:overdueReminderIntervalMinutes="1440"
flowable:overdueReminderMaxTimes="1"
sys_flow_task 找到逾期待办任务,并读取 BPMN 或旧节点配置中的提醒规则。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/mapper/FlowTaskMapper.java — 新增逾期任务查询方法。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/resources/mapper/FlowTaskMapper.xml — 新增 selectOverduePendingTasks XML SQL。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/dto/FlowOverdueReminderConfig.java — 新增运行时提醒配置 DTO。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowOverdueReminderConfigResolver.java — 新增 BPMN/旧配置解析器。public FlowOverdueReminderConfig resolve(FlowTask task);
- **验收标准**:
- 查询只返回 `status IN (0, 1)` 且 `due_date <= now` 的任务。
- 配置解析优先 BPMN UserTask 属性,旧 `sys_flow_node_config` 作为 fallback。
- 未启用提醒、无模板、无渠道或无截止时间时跳过。
## Task 4: 审批人解析与消息发送
- **状态**: 已完成
- **目标**: 复用消息模块对逾期任务审批人推送模板消息,并保证幂等。
- **涉及文件**:
- `forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/FlowTaskReceiverResolver.java` — 新增任务接收人解析服务。
- `forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowTaskReceiverResolverImpl.java` — 从 assignee/candidateUsers/candidateGroups 解析用户。
- `forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/listener/FlowTaskEventListener.java` — 改用接收人解析服务发送任务创建站内信,减少重复逻辑。
- `forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowOverdueReminderServiceImpl.java` — 新增消息构造、发送、记录更新。
- **关键签名**:
```java
Set<Long> resolveReceivers(FlowTask task);
public void sendOverdueReminder(FlowTask task, FlowOverdueReminderConfig config);
java
Map.of(
"taskId", task.getTaskId(),
"taskName", task.getTaskName(),
"taskTitle", task.getTitle(),
"processName", task.getProcessName(),
"startUserName", task.getStartUserName(),
"dueDate", formatDateTime(task.getDueDate()),
"overdueMinutes", overdueMinutes,
"jumpUrl", "/flow/todo?taskId=" + task.getTaskId()
)
assignee。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/FlowOverdueReminderService.java — 新增扫描服务接口。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowOverdueReminderServiceImpl.java — 实现分页扫描、重复策略、最大次数判断。forge-server/forge-flow/forge-flow-server/src/main/java/com/mdframe/forge/flow/controller/FlowTaskController.java — 可选新增手动扫描接口。forge-server/forge-flow/forge-flow-server/src/main/resources/application.yml — 增加扫描开关、间隔和每批数量默认值。@PostMapping("/overdue-reminder/scan") public RespInfo scanOverdueReminders()
- **配置建议**:
```yaml
forge:
flow:
overdue-reminder:
enabled: true
scan-interval-ms: 300000
batch-size: 200
forge-admin-ui/src/components/flow-designer/panel/OverdueReminderConfig.vue — 新增逾期提醒配置组件。forge-admin-ui/src/components/flow-designer/panel/ApproverConfig.vue — 增加“逾期提醒”页签并接入组件。forge-admin-ui/src/api/message.js — 复用或补充模板查询参数方法。forge-admin-ui/src/components/flow-designer/panel/__tests__/OverdueReminderConfig.spec.js — 新增组件测试。NSwitchNInputNumberNSelect 远程加载消息模板NSelect multiple,选项来自 useDict('sys_message_channel')DictSelect 或字典驱动的 NSelectforge-server/forge-flow/forge-flow-server/src/main/java/com/mdframe/forge/flow/controller/FlowTaskController.java — 新增任务提醒记录查询接口。forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/resources/mapper/FlowOverdueReminderRecordMapper.xml — 新增按 taskId 查询记录 SQL。forge-admin-ui/src/api/flow.js — 新增查询提醒记录 API。forge-admin-ui/src/views/flow/monitor.vue 或 forge-admin-ui/src/views/flow/todo.vue — 任务详情中展示提醒记录。java
List<FlowOverdueReminderRecord> selectByTaskId(@Param("taskId") String taskId);
pageNum/pageSize。code-copilot/changes/flow-task-overdue-reminder/execution-log.md — 记录命令、结果、警告、跳过项和服务清理情况。code-copilot/changes/flow-task-overdue-reminder/test-spec.md — 若进入 /test 或测试范围扩大,再补独立测试说明。bash
cd forge-admin-ui
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm vitest run src/components/flow-designer
pnpm build
bash
cd forge-server
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-flow,forge-flow/forge-flow-server -am test
mvn clean compile -DskipTests
execution-log.md 标注。