1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        使用Camunda流程引擎開發(fā),共享任務(wù)如何實(shí)現(xiàn)?

        共 4342字,需瀏覽 9分鐘

         ·

        2022-03-06 16:03

        最近在用Camunda流程引擎做業(yè)務(wù)開發(fā)時,產(chǎn)品經(jīng)理提了一個需求:共享任務(wù)根據(jù)產(chǎn)品經(jīng)理的描述:流程引擎首先會產(chǎn)生一個共享任務(wù),然后多個人會看到此任務(wù),如果有一個人執(zhí)行了此任務(wù)之后,此任務(wù)就成已執(zhí)行,其它人就不能執(zhí)行,也看不到此任務(wù)了 ,流程流轉(zhuǎn)到下一個節(jié)點(diǎn)舉個栗子,有下面這樣一樣流程:37dbab11ef24eafb187b269a95e01d26.webp
        在發(fā)起此流程后,執(zhí)行完新增申請信息節(jié)點(diǎn)的任務(wù)后,在共享任務(wù)這個流程節(jié)點(diǎn)會產(chǎn)生一個任務(wù),這個任務(wù)需要A、B 兩人其中一個人來執(zhí)行,要完成此功能先來整理下思路:

        1. 流程產(chǎn)生任務(wù)
        2. 記錄能完成此任務(wù)的用戶(如果有2個用戶,2個用戶都能看到此任務(wù))
        3. 如果用戶1有強(qiáng)迫癥,看到任務(wù)提醒的紅點(diǎn)都要點(diǎn)開查看,看到任務(wù)并完成后,流程流程到下一節(jié)點(diǎn)
        思路清楚了,Camunda流程引擎是如何完成此功能的呢?在此流程中, 在完成【申請信息】節(jié)點(diǎn)產(chǎn)生的任務(wù)后,Camunda 流程引擎會幫助我們完成產(chǎn)生【共享任務(wù)】節(jié)點(diǎn)的任務(wù)重點(diǎn):在完成【申請信息】的任務(wù)時,會把A、B 兩人信息通過參數(shù)提交,Camunda 流程引擎會把A、B信息存儲起來,并產(chǎn)生任務(wù),此任務(wù)只有A、B兩人都能看見那么問題來了,此信息存儲在什么地方?在Camunda的庫中,有ACT_HI_IDENTITYLINK這樣一張表,此表記錄了任務(wù)與人員的信息c8763cad792f7972470df56ac170dd0b.webp
        我提交的參數(shù)分別是:demo、8,然后在此表中產(chǎn)生了2條數(shù)據(jù)那么問題又來了,沒有寫一行代碼,是如何實(shí)現(xiàn)此功能的呢?Camunda 之所以很強(qiáng)大,就是在這些細(xì)節(jié)方面,現(xiàn)在一起來看看繪制流程圖時都干了什么:a6311115c7060b2a57b3071f66de8033.webp
        相信大家都注意到了圖片中的紅色框,配制一個 【candidateUsers】這樣的參數(shù),Camunda 就是根據(jù)此參數(shù)的值存 把任務(wù)與人的信息綁定并存儲到 ACT_HI_IDENTITYLINK 表中只是查詢?nèi)蝿?wù)的時候,去查詢一下 ACT_HI_IDENTITYLINK 表就完成任務(wù)列表的功能了。
         /**         * 查詢?nèi)蝿?wù)列表     */    @Override    public List getTodoTaskList(WorkflowQueryDto workflowQueryDto) {        QueryWrapper queryWrapper = new QueryWrapper<>();        if(ObjectUtils.isNotEmpty(workflowQueryDto.getTaskId()) && StringUtils.isNotBlank(workflowQueryDto.getTaskId())) {            queryWrapper.eq("ID_", workflowQueryDto.getTaskId());        }        if(ObjectUtils.isNotEmpty(workflowQueryDto.getProcessDefinitionName()) && StringUtils.isNotBlank(workflowQueryDto.getProcessDefinitionName())) {            queryWrapper.eq("PROC_DEF_NAME_", workflowQueryDto.getProcessDefinitionName());        }        queryWrapper.or(ObjectUtils.isNotEmpty(workflowQueryDto.getOwner()),                qw -> qw.eq("OWNER_", workflowQueryDto.getOwner()));        queryWrapper.or(ObjectUtils.isNotEmpty(workflowQueryDto.getAssignee()),                qw -> qw.eq("ASSIGNEE_", workflowQueryDto.getAssignee()));        boolean isEmpty = StringUtils.isBlank(workflowQueryDto.getCandidateUsers())                && StringUtils.isBlank(workflowQueryDto.getCandidateGroups());        if (!isEmpty){            queryWrapper.or(qw -> {                if(StringUtils.isNotBlank(workflowQueryDto.getCandidateUsers())) {                    qw.or().exists(String.format("select ID_ from ACT_HI_IDENTITYLINK " +                            "where TASK_ID_ = t.ID_ and TYPE_ = 'candidate' " +                            "and USER_ID_ = '%s'", workflowQueryDto.getCandidateUsers()));                }                if (StringUtils.isNotBlank(workflowQueryDto.getCandidateGroups())) {                    String groupIds = StringUtils.getSqlInStringByArray(workflowQueryDto.getCandidateGroups());                    qw.or().exists(String.format("select ID_ from ACT_HI_IDENTITYLINK " +                            "where TASK_ID_ = t.ID_ and TYPE_ = 'candidate' " +                            "and GROUP_ID_ in (%s)", groupIds));                }            });        }        queryWrapper.orderByDesc("START_TIME_");        return workflowTaskMapper.listTodoTaskByPage(queryWrapper);    }    // 對應(yīng) Mapper 接口里的查詢方法    @Select("SELECT * from (" +        " SELECT t1.*, t3.NAME_ procDefName   FROM ACT_HI_TASKINST t1 " +        "left JOIN ACT_RE_PROCDEF t2 on t1.PROC_DEF_ID_ = t2.ID_ " +        "left join ACT_RE_DEPLOYMENT t3 on t3.ID_ = t2.DEPLOYMENT_ID_ "+        " )t ${ew.customSqlSegment}")    List listCompleteTaskByPage(        @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
        到這里完成了參數(shù)設(shè)置、任務(wù)展示,是不是功能就完了呢?NO!其實(shí)還有很重要的一步需要做,那就是在完成任務(wù)的時候?這里留個疑問,大家可以結(jié)合下面的代碼想一想,為什么?
        @Overridepublic String completeTask(String taskId, WorkflowVariableDto dto) {    // 獲取完成前任務(wù)    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();    if(ObjectUtils.isEmpty(task)){        return "沒有查找到當(dāng)前任務(wù)";    }    // 對共享任務(wù)的處理    if(StringUtils.isBlank(task.getAssignee())){        if(StringUtils.isBlank(dto.getVariables().get("assignee").toString())){            return"當(dāng)前任務(wù)為共享任務(wù),請先設(shè)置執(zhí)行人";        }else {            claimTask(taskId, dto.getVariables().get("assignee").toString());        }    }    // 完成任務(wù)填寫的備注    if(StringUtils.isNotBlank(dto.getReason()) && StringUtils.isNotBlank(task.getProcessInstanceId())){        taskService.createComment(task.getId(), task.getProcessInstanceId(), dto.getReason());    }    // 完成當(dāng)前任務(wù)    taskService.complete(taskId, dto.getVariables());    return null;}// taskId  任務(wù)ID// claimUser 認(rèn)領(lǐng)用戶ID@Overridepublic void claimTask(String taskId, String claimUser) {    taskService.claim(taskId, claimUser);}
        OK,今天就寫到這里,如果你使用過或者正在使用Camunda ,大家可以一起交流??!
        瀏覽 60
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧洲奶水xxxx哺乳期 | 无码内射在线播放 | 色插综合网| 暴操熟妇 | 国产婷婷 | 黄片TV | www.性 | 天天日天天舔 | 欧美色爱综合网 | 一级黄色毛 |