鍍金池/ 問(wèn)答/Java  網(wǎng)絡(luò)安全/ 在Activiti中如何判斷當(dāng)前任務(wù)的狀態(tài)?

在Activiti中如何判斷當(dāng)前任務(wù)的狀態(tài)?

在activiti中, 對(duì)于正在執(zhí)行的任務(wù), 已經(jīng)執(zhí)行過(guò)得任務(wù), 未執(zhí)行的任務(wù)可以判斷出來(lái), 但是還有一種狀態(tài), 就是任務(wù)已經(jīng)執(zhí)行過(guò)了, 但是因?yàn)楹竺嬉驗(yàn)榱鞒踢x擇關(guān)系又回到了這個(gè)任務(wù)的前面一些任務(wù), 那這個(gè)任務(wù)可能還會(huì)執(zhí)行一遍, 如何判斷任務(wù)的這個(gè)狀態(tài)?

比如下面這個(gè)請(qǐng)假流程圖
clipboard.png
當(dāng)執(zhí)行到人事審批這邊, 人事審批拒絕了當(dāng)前申請(qǐng), 開(kāi)始調(diào)整申請(qǐng)任務(wù), 所以人事審批有可能還會(huì)執(zhí)行一次, 這個(gè)已經(jīng)執(zhí)行過(guò), 但是可能還會(huì)執(zhí)行的狀態(tài)改如何判斷?

回答
編輯回答
局外人

帶變量,將流程經(jīng)過(guò)的節(jié)點(diǎn)寫(xiě)在變量中?
或者直接在數(shù)據(jù)庫(kù)中標(biāo)記流程經(jīng)過(guò)的每一個(gè)節(jié)點(diǎn),到達(dá)節(jié)點(diǎn)的時(shí)候根據(jù)流程id去判斷就可以了。

2017年1月28日 00:54
編輯回答
老梗

自己琢磨了一下, 找到了滿足自己的這個(gè)要求的解決方法, 主要就是對(duì)于已經(jīng)執(zhí)行過(guò)的任務(wù)的狀態(tài)進(jìn)行判斷, 比如審批任務(wù), 如果審批不通過(guò), 則會(huì)退回到申請(qǐng)步驟, 所以這個(gè)時(shí)候?qū)徟蝿?wù)是執(zhí)行完成過(guò)一次, 但是可能還會(huì)執(zhí)行一次, 對(duì)于這個(gè)狀態(tài)我判定的思路是這樣的:
首先根據(jù)ProcessInstanceID可以獲得該流程所有的歷史活動(dòng)實(shí)例(ACT_HI_ACTINS表)的, 按時(shí)間排序后進(jìn)行遍歷, 將activityID放入到一個(gè)數(shù)組中, 如果一個(gè)activityId重復(fù)出現(xiàn)了兩次, 則這兩個(gè)activityId中間的則是這種狀態(tài)的, 然后將部分從數(shù)組中移除

代碼

    public Map<String, TaskCoordinate> getTaskCoordinates(String processInstanceId) {
        log.debug("in get activiti process image function");

        try {
            // 獲取歷史流程實(shí)例
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                    .processInstanceId(processInstanceId).singleResult();
            if (historicProcessInstance == null) {
                throw new CustomException("示例" + processInstanceId + "不存在");
            }

            ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
                    .getDeployedProcessDefinition(historicProcessInstance.getProcessDefinitionId());

            // 獲取流程歷史中已執(zhí)行的節(jié)點(diǎn), 并按照節(jié)點(diǎn)在流程中執(zhí)行先后順序排序
            List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery()
                    .processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list();

            // 已執(zhí)行節(jié)點(diǎn)的坐標(biāo)集合
            executedCoordinates = new HashMap<>();

            // 按任務(wù)的執(zhí)行順序存放taskId
            activityIds = new ArrayList<>();

            log.debug(">>>>>>>>>>>>>>>>>>>>>獲取已經(jīng)執(zhí)行的節(jié)點(diǎn)ID<<<<<<<<<<<<<<<<<<<<<");
            for (HistoricActivityInstance activityInstance : historicActivityInstances) {
                // 如果是用戶任務(wù)類(lèi)型
                if (StringUtils.equalsIgnoreCase(activityInstance.getActivityType(), "userTask")) {
                    updateTaskCoordinate(activityInstance, processDefinition);

                }
            }

            return executedCoordinates;
        } catch (Exception e) {
            log.error("獲取已執(zhí)行任務(wù)坐標(biāo)失敗, message --> {}", e.getMessage());
             throw new CustomException("獲取任務(wù)失敗!" + e.getMessage());
        }
    }
    
       /**
     * 更新當(dāng)前活動(dòng)的狀態(tài)級(jí)添加任務(wù)處理信息
     *
     * @param activityInstance 活動(dòng)示例
     * @param taskCoordinate   任務(wù)坐標(biāo)信息
     */
    private void updateTaskCoordinate(HistoricActivityInstance activityInstance, TaskCoordinate taskCoordinate) {
        // 根據(jù)當(dāng)前任務(wù)是否有結(jié)束時(shí)間來(lái)判斷是否為進(jìn)行中的任務(wù)
        if (activityInstance.getEndTime() == null) {
            taskCoordinate.setType(TaskCoordinate.TASK_IN_PROCESS);
        } else {
            taskCoordinate.setType(TaskCoordinate.TASK_COMPLETED);
        }
        TaskInfo taskInfo = new TaskInfo(activityInstance.getTaskId(), activityInstance.getAssignee(), activityInstance.getEndTime());
        taskCoordinate.addTaskInfo(taskInfo);
    }

    /**
     * 更新任務(wù)狀態(tài)
     *
     * @param activityInstance
     * @param processDefinition
     */
    private void updateTaskCoordinate(HistoricActivityInstance activityInstance, ProcessDefinitionEntity processDefinition) {
        ActivityImpl activity = processDefinition.findActivity(activityInstance.getActivityId());
        TaskCoordinate taskCoordinate;
        String activityId = activityInstance.getActivityId();

        activityIds.add(activityId);
        log.debug("activity id list  --> {}", activityIds);

        if (executedCoordinates.get(activityId) == null) {
            // 新建coordinate對(duì)象, 設(shè)置act_id及坐標(biāo)
            taskCoordinate = new TaskCoordinate();
            taskCoordinate.setNode(activityInstance.getActivityId());
            taskCoordinate.setName(activityInstance.getActivityName());
            taskCoordinate.setCoordinate(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight());
            // 更新?tīng)顟B(tài)和添加任務(wù)信息
            updateTaskCoordinate(activityInstance, taskCoordinate);
            executedCoordinates.put(activityId, taskCoordinate);
        } else {
            // 從map中獲取coordinate對(duì)象
            taskCoordinate = executedCoordinates.get(activityId);
            // 更新?tīng)顟B(tài)和添加任務(wù)信息
            updateTaskCoordinate(activityInstance, taskCoordinate);
            executedCoordinates.put(activityId, taskCoordinate);


            int preIndex = preIndexOfLastTaskId(activityIds, activityId);
            log.debug("preIndex --> {}", preIndex);
            if (preIndex != -1) {
                // 得到需要設(shè)置狀態(tài)為other的子列表取出來(lái)
                List<String> subActivityIds = activityIds.subList(preIndex + 1, activityIds.size() - 1 - 1);
                // 將狀態(tài)為other的元素去掉
                activityIds = activityIds.subList(0, preIndex + 1);
                if (subActivityIds.size() > 0) {
                    log.info("sub task id list --> ", subActivityIds);
                    for (String subTaskId : subActivityIds) {
                        executedCoordinates.get(subTaskId).setType(TaskCoordinate.TASK_OTHER);
                    }
                }
            }
        }
    }

    /**
     * 得到list最后一個(gè)activityID的前一個(gè)值相同的小標(biāo)
     *
     * @param list    list
     * @param lastStr last activity id
     * @return
     */
    private int preIndexOfLastTaskId(List<String> list, String lastStr) {

        return list.subList(0, list.size() - 1 - 1).lastIndexOf(lastStr);
    } 

javaBean

@Data
public class TaskCoordinate {
    public static final Integer TASK_UNEXECUTED = 0;    // 未執(zhí)行
    public static final Integer TASK_COMPLETED = 1;     // 任務(wù)已完成
    public static final Integer TASK_IN_PROCESS = 2;    // 任務(wù)進(jìn)行中
    public static final Integer TASK_OTHER = 3;         // 執(zhí)行過(guò), 可能還會(huì)被執(zhí)行

    private String node;                // 對(duì)應(yīng)activityId
    private String name;                // 對(duì)應(yīng)activityName
    private Integer type;               // 任務(wù)類(lèi)型
    private List<TaskInfo> taskInfos;

    // 坐標(biāo)
    private Integer x;
    private Integer y;
    private Integer width;
    private Integer height;

    public TaskCoordinate() {
        this.taskInfos = new ArrayList<>();
    }

    public TaskCoordinate(String node, Integer type) {
        this.taskInfos = new ArrayList<>();
        this.node = node;
        this.type = type;
    }

    /**
     * 給當(dāng)前的流程節(jié)點(diǎn)添加一條任務(wù)信息
     *
     * @param taskInfo
     */
    public void addTaskInfo(TaskInfo taskInfo) {
        this.taskInfos.add(taskInfo);
    }

    /**
     * 設(shè)置坐標(biāo)
     *
     * @param x      x
     * @param y      y
     * @param width  寬度
     * @param height 高度
     */
    public void setCoordinate(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TaskInfo {
    private String taskId;      // 任務(wù)id

    private String assignee;    // 辦理人

    private Date completeTime;  // 完成時(shí)間
}

因?yàn)楝F(xiàn)在需求中的場(chǎng)景比較簡(jiǎn)單, 對(duì)于使用并行網(wǎng)關(guān)的情況并沒(méi)有考慮, 對(duì)于復(fù)雜的流程可能還需要改進(jìn)

2017年5月25日 10:54