流程定义定时激活 : act_re_procdef 的 suspension_status
ClassPathResource classPathResource = new ClassPathResource("hehe/HistoryDemo01.bpmn20.xml");
repositoryService.createDeployment().addInputStream(classPathResource.getFilename(),classPathResource.getInputStream())
// 定时激活
.activateProcessDefinitionsOn(new Date(System.currentTimeMillis()+120*1000)).deploy();
// 定时挂起
repositoryService.suspendProcessDefinitionByKey("HistoryDemo01",true,new Date(System.currentTimeMillis()+120*1000));
// 定时激活 null 表示立马激活
repositoryService.activateProcessDefinitionByKey("HistoryDemo01",true,null);
act_ru_time_job
: 定时任务
act_ru_job
: 被扫描到后会立马执行
act_ru_deadletter_job
// 移动到 act_ru_deadletter_job 中 取消定时任务
managementService.moveJobToDeadLetterJob("54a99b79-9b94-11ed-9a24-f0b61e94ce8e");
// 移动到 act_ru_job 定时任务立即执行
managementService.moveTimerToExecutableJob("54a99b79-9b94-11ed-9a24-f0b61e94ce8e");
对于移动到 死信队列中的任务,也可以再次移动会 act_ru_job
,会立马执行,无论时间到没到
// 移动 act_ru_deadletter_job 到 act_ru_job ,, 重试3次
managementService.moveDeadLetterJobToExecutableJob("jobId",3);
表单
内置表单
查询启动节点的表单定义:
获取表单的属性: 可以知道,当启动流程的时候需要填哪些表单信息
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("DynamicFormDemo").latestVersion().singleResult();
// 开始节点上的 表单定义信息
StartFormData startFormData = formService.getStartFormData(processDefinition.getId());
// 表单的属性
List<FormProperty> formProperties = startFormData.getFormProperties();
for (FormProperty fp : formProperties) {
FormType type = fp.getType();
Object info = "";
// 对于日期和枚举类型,还可以获取该字段的额外信息
if (type instanceof EnumFormType){
// 枚举类型
info = type.getInformation("values");
}else if (type instanceof DateFormType){
// 日期类型
info = type.getInformation("datePattern");
}
System.out.println(fp.getId()+"--"+fp.getName()+"--"+fp.getValue()+"--"+fp.getType().getName()+"--"+info);
}
启动流程时 传入表单变量:
// 将表单实例当作 普通变量对待
HashMap<String, Object> map = new HashMap<>();
map.put("days",10);
map.put("reason","hehe");
map.put("startTime","2023-1-24");
map.put("type","请假");
Authentication.setAuthenticatedUserId("ww");
runtimeService.startProcessInstanceByKey("DynamicFormDemo", map);
formService传入表单属性:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("DynamicFormDemo").latestVersion().singleResult();
// 将表单实例当作 普通变量对待
HashMap<String, String> map = new HashMap<>();
map.put("days","10");
map.put("reason","hehe");
map.put("startTime","2023-1-24");
map.put("endTime","2023-2-24");
map.put("type","askforleave");
Authentication.setAuthenticatedUserId("ww");
// 提交表单,,启动一个新的流程 表单提交会进行约束 对提交的数据进行限制,,required,无效的enum
formService.submitStartFormData(processDefinition.getId(),map);
查找UserTask上的内置表单信息
Task task = taskService.createTaskQuery().singleResult();
// 根据taskId 查找 表单属性
TaskFormData taskFormData = formService.getTaskFormData(task.getId());
List<FormProperty> formProperties = taskFormData.getFormProperties();
for (FormProperty fp : formProperties) {
FormType type = fp.getType();
Object info = "";
// 对于日期和枚举类型,还可以获取该字段的额外信息
if (type instanceof EnumFormType){
// 枚举类型
info = type.getInformation("values");
}else if (type instanceof DateFormType){
// 日期类型
info = type.getInformation("datePattern");
}
System.out.println(fp.getId()+"--"+fp.getName()+"--"+fp.getValue()+"--"+fp.getType().getName()+"--"+info);
}
完成一个表单 : 修改表单数据,,,不会去完成任务,只是修改表单数据,,也可以使用 taskService.complete()
Task task = taskService.createTaskQuery().singleResult();
// 修改 task 的form .. 会进行数据校验 ,,, 日期填写错误不会报错,会存入null
Map<String, String> map = new HashMap<>();
map.put("days","20");
map.put("reason","hehe");
map.put("startTime","2023-1-24");
map.put("endTime","2023-2-24");
map.put("type","askforleave");
// 保存表单数据
formService.saveFormData(task.getId(),map);
外置表单
提前有一个准备好的html文件,这个文件作为 外置表单
开始节点的时候,,提交表单数据
创建两个表单,一个发送数据,一个回填数据:
表单和流程 一起部署,有相同的部署id,,,不然找不到表单
部署有外置表单的流程:
DeploymentBuilder builder = repositoryService.createDeployment().name("名字").category("分类").key("自定义工作流的key");
ClassPathResource ext = new ClassPathResource("hehe/ExtFormDemo.bpmn20.xml");
ClassPathResource askLeave = new ClassPathResource("hehe/askleave.html");
ClassPathResource leaderApproval = new ClassPathResource("hehe/leader_approval.html");
// 流程实例 和 外置表单一起部署,,使用同一个 部署id
builder.addInputStream(ext.getFilename(),ext.getInputStream())
.addInputStream(askLeave.getFilename(),askLeave.getInputStream())
.addInputStream(leaderApproval.getFilename(),leaderApproval.getInputStream());
builder.deploy();
查看流程的 外置表单信息:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("ExtFormDemo").singleResult();
// 查询启动节点上,,外置表单的key
String startFormKey = formService.getStartFormKey(processDefinition.getId());
System.out.println("startFormKey = " + startFormKey);
// 查询启动节点上,渲染之后的流程表单,,这个方法主要针对外置表单来使用
String renderedStartForm = (String) formService.getRenderedStartForm(processDefinition.getId());
System.out.println("renderedStartForm = " + renderedStartForm);
查找表单内容是在 act_ge_bytearray
查询,,根据流程的部署ID,,deployment_id ,所以表单和流程 一定要 一起部署
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("ExtFormDemo").latestVersion().singleResult();
Map<String, String> map = new HashMap<>();
map.put("days","30");
map.put("reason","hehe");
map.put("startTime","2023-1-24");
map.put("endTime","2023-2-24");
// 开启一个流程,,传入表单数据
formService.submitStartFormData(processDefinition.getId(),map);
查找userTask的 外置表单渲染后的内容:
Task task = taskService.createTaskQuery().singleResult();
// 获取被渲染后的 外置表单,,这里会自动读取流程变量,并且将表单中的值渲染出来
String renderedTaskForm = (String) formService.getRenderedTaskForm(task.getId());
System.out.println("renderedTaskForm = " + renderedTaskForm);
完成当前UserTask,并修改表单数据:
Task task = taskService.createTaskQuery().singleResult();
Map<String, String> map = new HashMap<>();
map.put("days","40");
map.put("reason","hehe");
map.put("startTime","2023-1-24");
map.put("endTime","2023-2-24");
// 流程审批 并修改表单内容
formService.submitTaskFormData(task.getId(),map);
外置表单 json类型
创建一个名字是application_form.form
的json表单
{
"key":"application_form.form",
"name":"请假审批表单",
"fields":[
{
"id":"days",
"name":"请假天数",
"type":"string",
"required":true,
"placeholder":"empty"
},
{
"id":"reason",
"name":"请假理由",
"type":"string",
"required":true,
"placeholder":"empty"
},
{
"id":"startTime",
"name":"开始时间",
"type":"date",
"required":true,
"placeholder":"empty"
},
{
"id":"endTime",
"name":"结束时间",
"type":"date",
"required":true,
"placeholder":"empty"
}
]
}
springboot配置文件:
# 表单资源位置
flowable.form.resource-location=classpath*:/forms/
flowable.form.resource-suffixes=**.form
去部署流程定义,,启动一个流程实例,,
获取表单信息通过task:
Task task = taskService.createTaskQuery().singleResult();
// 获取UserTask 上的表单信息
FormInfo formInfo = taskService.getTaskFormModel(task.getId());
String key = formInfo.getKey();
String id = formInfo.getId();
String name = formInfo.getName();
String description = formInfo.getDescription();
int version = formInfo.getVersion();
System.out.println(key+"---"+name+"---"+description+"---"+version);
// 获取表单的 字段
SimpleFormModel formModel = (SimpleFormModel) formInfo.getFormModel();
List<FormField> fields = formModel.getFields();
for (FormField field : fields) {
String type = field.getType();
Object value = field.getValue();
String name1 = field.getName();
String id1 = field.getId();
String placeholder = field.getPlaceholder();
System.out.println(id1+"---"+name1+"---"+value+"---"+type+"---"+placeholder);
}