This commit is contained in:
@jyuhsin
2026-03-26 14:03:21 +08:00
parent c5fbf8576c
commit dc71dc22d8
21 changed files with 585 additions and 509 deletions
@@ -4,6 +4,8 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.vo.LabelValueVO;
import com.budwk.app.flow.constant.FlowConst;
@@ -12,14 +14,8 @@ import com.budwk.app.flow.engine.event.ProcessEvent;
import com.budwk.app.flow.engine.event.ProcessPublisher;
import com.budwk.app.flow.engine.model.ProcessModel;
import com.budwk.app.flow.engine.model.TaskModel;
import com.budwk.app.flow.entity.Candidate;
import com.budwk.app.flow.entity.ProcessDefine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessEventTypeEnum;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskPerformTypeEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.entity.*;
import com.budwk.app.flow.enums.*;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.flow.vo.HighLightVO;
import com.budwk.app.flow.vo.ProcessInstanceVO;
@@ -146,20 +142,25 @@ public class FlowCommonController {
@SaCheckLogin
@ApiOperation("获取流程定义的审批记录")
public Result approvalRecord(Long instanceId) {
List<ProcessTask> processTaskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instanceId)
.and(ProcessTask::getTaskState, "not in", List.of(ProcessTaskStateEnum.DOING, ProcessTaskStateEnum.WITHDRAW, ProcessTaskStateEnum.ABANDON))
.asc(ProcessTask::getUpdatedAt));
List<ProcessTaskVO> res = new ArrayList<>();
processTaskList.forEach(processTask -> {
ProcessTaskVO vo = BeanUtil.toBean(processTask, ProcessTaskVO.class);
if (vo.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) && StrUtil.isNotBlank(vo.getOperator())) {
List<ProcessTask> processTaskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instanceId)
.and(ProcessTask::getTaskState, "not in", List.of(ProcessTaskStateEnum.WITHDRAW, ProcessTaskStateEnum.ABANDON))
.asc(ProcessTask::getUpdatedAt));
List<ProcessTaskVO> res = new ArrayList<>();
processTaskList.forEach(processTask -> {
ProcessTaskVO vo = BeanUtil.toBean(processTask, ProcessTaskVO.class);
if (vo.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) && StrUtil.isNotBlank(vo.getOperator())) {
}
}
if(vo.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode())) {
List<ProcessTaskActor> taskActorList = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", processTask.getId()));
List<JSONObject> list = JSONUtil.toList(JSONUtil.toJsonStr(taskActorList), JSONObject.class);
vo.setTaskActorList(list);
}
res.add(vo);
});
return Result.success(res);
}
res.add(vo);
});
return Result.success(res);
}
@At
@SaCheckLogin
@@ -239,7 +240,7 @@ public class FlowCommonController {
@Aop(TransAop.READ_COMMITTED)
public Result executeTask(@Param("data") String param) {
Dict args = Json.fromJson(Dict.class, param);
flowCommonService.executeTask(args);
flowCommonService.executeTask(args);
return Result.success();
}
@@ -19,6 +19,7 @@ import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import java.util.List;
@@ -37,7 +38,8 @@ public class FlowCommonService {
*/
public void executeTask(Dict args){
Long processTaskId = args.getLong(FlowConst.PROCESS_TASK_ID_KEY);
String operator = SecurityUtil.getUserId();
String operator = SecurityUtil.getUserId();
if (args.containsKey(FlowConst.EXT_ENABLE_OPERATOR)&&args.getBool(FlowConst.EXT_ENABLE_OPERATOR)){
operator = FlowConst.ADMIN_ID;
}
@@ -46,6 +48,15 @@ public class FlowCommonService {
if (submitType == null) {
submitType = ProcessSubmitTypeEnum.AGREE.getCode();
}
ProcessTask processTask = flowEngine.processTaskService().getById(processTaskId);
ProcessTask parentTask = flowEngine.processTaskService().getById(processTask.getTaskParentId());
Dict taskArgs = Json.fromJson(Dict.class, parentTask.getVariable());
if(taskArgs.containsKey("tf_sourceTaskKey") && !taskArgs.getBool("tf_audit")) {
submitType = ProcessSubmitTypeEnum.JUMP.getCode();
args.put(FlowConst.TASK_NAME, taskArgs.getStr("tf_sourceTaskKey"));
}
args.put(FlowConst.SUBMIT_TYPE, submitType);
// 设置办理人信息到表单参数
@@ -270,43 +270,43 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl<ProcessInstance>
@Override
public HighLightVO highLight(Long processInstanceId) {
HighLightVO vo = new HighLightVO();
ProcessInstanceVO processInstance = findById(processInstanceId);
HighLightVO vo = new HighLightVO();
ProcessInstanceVO processInstance = findById(processInstanceId);
FlowEngine flowEngine = ServiceContext.find(FlowEngine.class);
FlowEngine flowEngine = ServiceContext.find(FlowEngine.class);
if (processInstance != null) {
ProcessModel processModel = flowEngine.processDefineService().getProcessModel(processInstance.getProcessDefineId());
// 拿到正在进行中的任务==>活跃节点
List<ProcessTask> processTaskList = flowEngine.processTaskService().getDoingTaskList(processInstanceId, new String[]{});
// 拿到历史任务-按更新时间倒序
List<ProcessTask> hisProcessTaskList = flowEngine.processTaskService().query(Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId).desc(ProcessTask::getUpdatedAt));
processTaskList.forEach(task -> {
if (!vo.getActiveNodeNames().contains(task.getTaskName())) {
vo.getActiveNodeNames().add(task.getTaskName());
recursionModel(processModel.getStart(), processInstance, processTaskList, hisProcessTaskList, task.getTaskName(), vo);
}
});
// 拿到非正常结束的流程实例状态值
List<Integer> orderStatusList = Arrays.stream(ProcessInstanceStateEnum.values()).filter(item -> !item.equals(ProcessInstanceStateEnum.DOING) && !item.equals(ProcessInstanceStateEnum.FINISHED)).map(ProcessInstanceStateEnum::getCode).toList();
// 非正常结束,需要进行特殊处理
if (orderStatusList.contains(processInstance.getState())) {
if (CollectionUtil.isNotEmpty(hisProcessTaskList)) {
ProcessTask lastProcessTask = hisProcessTaskList.get(hisProcessTaskList.size() - 1);
NodeModel nodeModel = processModel.getNode(lastProcessTask.getTaskName());
recursionModel(processModel.getStart(), processInstance, processTaskList, hisProcessTaskList, nodeModel.getOutputs().get(0).getTo(), vo);
}
} else {
List<EndModel> endModels = processModel.getModels(EndModel.class);
if (endModels != null) {
endModels.forEach(endModel -> {
recursionModel(processModel.getStart(), processInstance, processTaskList, hisProcessTaskList, endModel.getName(), vo);
});
}
}
}
return vo;
}
if (processInstance != null) {
ProcessModel processModel = flowEngine.processDefineService().getProcessModel(processInstance.getProcessDefineId());
// 拿到正在进行中的任务==>活跃节点
List<ProcessTask> processTaskList = flowEngine.processTaskService().getDoingTaskList(processInstanceId, new String[]{});
// 拿到历史任务-按更新时间倒序
List<ProcessTask> hisProcessTaskList = flowEngine.processTaskService().query(Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId).desc(ProcessTask::getUpdatedAt));
processTaskList.forEach(task -> {
if (!vo.getActiveNodeNames().contains(task.getTaskName())) {
vo.getActiveNodeNames().add(task.getTaskName());
recursionModel(processModel.getStart(), processInstance, processTaskList, hisProcessTaskList, task.getTaskName(), vo);
}
});
// 拿到非正常结束的流程实例状态值
List<Integer> orderStatusList = Arrays.stream(ProcessInstanceStateEnum.values()).filter(item -> !item.equals(ProcessInstanceStateEnum.DOING) && !item.equals(ProcessInstanceStateEnum.FINISHED)).map(ProcessInstanceStateEnum::getCode).toList();
// 非正常结束,需要进行特殊处理
if (orderStatusList.contains(processInstance.getState())) {
if (CollectionUtil.isNotEmpty(hisProcessTaskList)) {
ProcessTask lastProcessTask = hisProcessTaskList.get(hisProcessTaskList.size() - 1);
NodeModel nodeModel = processModel.getNode(lastProcessTask.getTaskName());
recursionModel(processModel.getStart(), processInstance, processTaskList, hisProcessTaskList, nodeModel.getOutputs().get(0).getTo(), vo);
}
} else {
List<EndModel> endModels = processModel.getModels(EndModel.class);
if (endModels != null) {
endModels.forEach(endModel -> {
recursionModel(processModel.getStart(), processInstance, processTaskList, hisProcessTaskList, endModel.getName(), vo);
});
}
}
}
return vo;
}
@Override
public List<ProcessTaskVO> approvalRecord(Long processInstanceId) {
@@ -195,6 +195,11 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
// execution.getArgs().remove(key);
// }
// 删一下吧,只保证退回的那个任务节点有这两个字段,不然要出问题喔
if(execution.getArgs().containsKey("tf_sourceTaskKey")) {
execution.getArgs().remove("tf_sourceTaskKey");
execution.getArgs().remove("tf_audit");
}
processTask.setVariable(JSONUtil.toJsonStr(execution.getArgs()));
processTask.setCreatedAt(now);
processTask.setUpdatedAt(now);