中文字幕一区二区不卡_国产精品久久久久久久岛一牛影视_亚洲老司机在线_91久久精品美女高潮_精品国产一区二区精华_久久精品99久久久_91在线看www_国产精品污www在线观看_99久久精品免费看国产_亚洲成人av在线

焦點速看:Springboot整合Camunda工作流引擎實現審批流程實例

環境:Spingboot2.6.14+camunda-spring-boot-starter7.18.0環境配置依賴配置7.18.0org.camunda

環境:Spingboot2.6.14 +camunda-spring-boot-starter7.18.0

環境配置

依賴配置


(資料圖片僅供參考)

7.18.0  org.camunda.bpm.springboot  camunda-bpm-spring-boot-starter-webapp  ${camunda.version}  org.camunda.bpm.springboot  camunda-bpm-spring-boot-starter-rest  ${camunda.version}

應用程序配置

camunda.bpm:  webapp:    # 設置管理控制臺的訪問上下文    application-path: /workflow  auto-deployment-enabled: true  admin-user:    # 配置登錄管理控制臺的用戶    id: admin    password: admin    firstName: admin  filter:    create: All tasks  database:    #數據庫類型    type: mysql     #是否自動更新表信息    schema-update: truelogging:  level:    #配置日志,這樣在開發過程中就能看到每步執行的SQL語句了    "[org.camunda.bpm.engine.impl.persistence.entity]": debug---spring:  jersey:    application-path: /api-flow    type: servlet    servlet:      load-on-startup: 0

通過上面的配置后訪問控制臺:http://localhost:8100/workflow/

默認是沒有上面的tasks中的內容,這里是我之前測試數據

環境準備好后,接下來就可以設計工作流程。

上面的camunda-bpm-spring-boot-starter-rest依賴中定義了一系列操作camunda的 rest api 這api的實現是通過jersey實現,我們可以通過/api-flow前綴來訪問這些接口,具體有哪些接口,我們可以通過官方提供的camunda-bpm-run-7.18.0.zip

http://localhost:8080/swaggerui/#/

設計流程

這里設計兩個節點的審批流程,經理審批---》人事審批 流程。

經理審批節點

人事審批節點

上面配置了2個用戶任務節點,并且為每個任務節點都設置了表達式,指定節點的審批人。

最終生成的流程XML內容如下:

            Flow_18pxcpx                  Flow_18pxcpx      Flow_0n014x3                  Flow_0n014x3      Flow_0dsfy6s              Flow_0dsfy6s                                                                                                                                                                                          
部署流程

這里我不通過上面的rest api 進行部署,而是通過自定義的接口然后調用camunda的相關api來實現流程部署。

上面的流程設計我是通過vue整合的camunda進行設計,并沒有使用官方提供的設計器。設計完成后直接上傳到服務端。

接口
@RestController@RequestMapping("/camunda")public class BpmnController {  // 上傳路徑  @Value("${gx.camunda.upload}")  private String path ;    // 通用的工作流操作api服務類  @Resource  private ProcessService processService ;    @PostMapping("/bpmn/upload")  public AjaxResult uploadFile(MultipartFile file, String fileName, String name) throws Exception {    try {      // 上傳并返回新文件名稱      InputStream is = file.getInputStream() ;      File storageFile = new File(path + File.separator + fileName) ;      FileOutputStream fos = new FileOutputStream(new File(path + File.separator + fileName)) ;      byte[] buf = new byte[10 * 1024] ;      int len = -1 ;      while((len = is.read(buf)) > -1) {        fos.write(buf, 0, len) ;      }      fos.close() ;      is.close() ;      // 創建部署流程      processService.createDeploy(fileName, name, new FileSystemResource(storageFile)) ;      return AjaxResult.success();    } catch (Exception e) {      return AjaxResult.error(e.getMessage());    }  }}
部署流程Service
// 這個是camunda spring boot starter 自動配置@Resourceprivate RepositoryService repositoryService ;public void createDeploy(String resourceName, String name, org.springframework.core.io.Resource resource) {  try {    Deployment deployment = repositoryService.createDeployment()      .addInputStream(resourceName, resource.getInputStream())      .name(name)      .deploy();    logger.info("流程部署id: {}", deployment.getId());    logger.info("流程部署名稱: {}", deployment.getName());  } catch (IOException e) {    throw new RuntimeException(e) ;  }}

執行上面的接口就能將上面設計的流程部署到camunda中(其實就是將流程文件保存到了數據庫中,對應的數據表是:act_ge_bytearray)。

啟動流程

啟動流程還是一樣,通過我們自己的接口來實現。

接口
@RestController@RequestMapping("/process")public class ProcessController {  @Resource  private ProcessService processService ;    // 根據流程定義id,啟動流程;整個流程需要動態傳2個參數(審批人),如果不傳將會報錯  @GetMapping("/start/{processDefinitionId}")  public AjaxResult startProcess(@PathVariable("processDefinitionId") String processDefinitionId) {    Map variables = new HashMap<>() ;    variables.put("uid", "1") ;    variables.put("mid", "1000") ;    processService.startProcessInstanceAssignVariables(processDefinitionId, "AKF", variables) ;    return AjaxResult.success("流程啟動成功") ;  }}
服務Service接口
@Resourceprivate RuntimeService runtimeService ;public ProcessInstance startProcessInstanceAssignVariables(String processDefinitionId, String businessKey, Map variables) {  ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, businessKey, variables);  logger.info("流程定義ID: {}", processInstance.getProcessDefinitionId());  logger.info("流程實例ID: {}", processInstance.getId());  logger.info("BussinessKey: {}", processInstance.getBusinessKey()) ;  return processInstance ;}

流程啟動后就可以查看當前需要自己審批的所有審批單

接口實現
@Resourceprivate TaskService taskService ;@Resourceprivate ManagementService managementService ;// 根據時間段查詢public List queryTasksByBusinessAndCreateTime(String assignee, String businessKey, String startTime, String endTime) {  NativeTaskQuery nativeQuery = taskService.createNativeTaskQuery() ;  nativeQuery.sql("select distinct RES.* from " + managementService.getTableName(TaskEntity.class) +  " RES "                  + " left join " + managementService.getTableName(IdentityLinkEntity.class) + " I on I.TASK_ID_ = RES.ID_ "                  + " WHERE (RES.ASSIGNEE_ = #{assignee} or "                  + " (RES.ASSIGNEE_ is null and I.TYPE_ = "candidate" "                  + " and (I.USER_ID_ = #{assignee} or I.GROUP_ID_ IN ( #{assignee} ) ))) "                  + " and RES.CREATE_TIME_ between #{startTime} and #{endTime} "                  + " order by RES.CREATE_TIME_ asc LIMIT #{size} OFFSET 0") ;  nativeQuery.parameter("assignee", assignee) ;  nativeQuery.parameter("startTime", startTime) ;  nativeQuery.parameter("endTime", endTime) ;  nativeQuery.parameter("size", Integer.MAX_VALUE) ;  return nativeQuery.list() ;}
審批流程

流程啟動后,接下來就是各個用戶任務節點配置的用戶進行審批

接口
@GetMapping("/approve/{id}")public AjaxResult approve(@PathVariable("id") String instanceId) {  if (StringUtils.isEmpty(instanceId)) {    return AjaxResult.error("未知審批任務") ;  }  // 下面的參數信息應該自行保存管理(與發起審批設置的指派人要一致)  Map variables = new HashMap<>() ;  // 第一個節點所要提供的遍歷信息(這里就是依次類推,mid等)  variables.put("uid", "1") ;  processService.executionTask(variables, instanceId, task -> {}, null) ;  return AjaxResult.success() ; }
服務Service接口
@Resourceprivate TaskService taskService ;@Resourceprivate RuntimeService runtimeService ;@Transactionalpublic void executionTask(Map variables, String instanceId, Consumer consumer, String type) {  Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult() ;  if (task == null) {    logger.error("任務【{}】不存在", instanceId) ;    throw new RuntimeException("任務【" + instanceId + "】不存在") ;  }  taskService.setVariables(task.getId(), variables);  taskService.complete(task.getId(), variables) ;  long count = runtimeService.createExecutionQuery().processInstanceId(instanceId).count();  if (count == 0) {    consumer.accept(task) ;  }}

以上就完成了從整個流程的生命周期:

設計流程---》部署流程---》啟動流程---》審批流程

完畢?。。?/p>

關鍵詞:
責任編輯:hn1007
中文字幕一区二区不卡_国产精品久久久久久久岛一牛影视_亚洲老司机在线_91久久精品美女高潮_精品国产一区二区精华_久久精品99久久久_91在线看www_国产精品污www在线观看_99久久精品免费看国产_亚洲成人av在线
日韩国产一区二| 91丝袜美腿高跟国产极品老师 | 亚洲一区二区三区在线看| 国产盗摄一区二区| 欧美理论片在线| 中文字幕一区二区三中文字幕 | 亚洲成人午夜影院| 日韩欧美国产小视频| 一区二区三区不卡视频在线观看| 91一区二区三区在线观看| 欧美电视剧在线观看完整版| 午夜在线成人av| 欧美乱妇一区二区三区不卡视频| 激情六月婷婷久久| 欧美精品一区二区在线观看| 麻豆精品国产91久久久久久| 久久综合九色综合欧美就去吻| 精品第一国产综合精品aⅴ| 国产精品一级片| 亚洲国产你懂的| 久久女同精品一区二区| 99国内精品久久| 亚洲成av人综合在线观看| 欧美一区二区三区色| 精品一区二区三区久久| 一区二区三区免费网站| 欧美三级午夜理伦三级中视频| 久久91精品国产91久久小草| 亚洲激情男女视频| 欧美综合久久久| 亚洲高清免费观看高清完整版在线观看| 99久久国产综合精品女不卡| 亚洲男同1069视频| 26uuu精品一区二区三区四区在线| 成人高清在线视频| 国产成人夜色高潮福利影视| 免费观看久久久4p| 免费在线一区观看| 蜜臀av性久久久久蜜臀aⅴ| 亚洲人亚洲人成电影网站色| 国产色91在线| 欧美精三区欧美精三区| 97久久久精品综合88久久| 亚洲精品欧美在线| 亚洲人成7777| 久久久久久久久久久99999| 7777精品伊人久久久大香线蕉经典版下载| 亚洲va在线va天堂| 日本中文字幕不卡| 亚洲国产中文字幕| 美女视频网站黄色亚洲| 亚洲成va人在线观看| 波多野结衣亚洲| 夫妻av一区二区| 日韩色在线观看| 一区av在线播放| 色噜噜狠狠一区二区三区果冻| 欧美国产一区二区在线观看| 日韩av午夜在线观看| 在线视频一区二区免费| 亚洲日本一区二区| 欧美性大战久久久久久久蜜臀 | 91黄色在线观看| 欧美亚洲综合色| 国产精品久久久久久妇女6080| 欧美aⅴ一区二区三区视频| 色婷婷国产精品综合在线观看| 精品乱人伦小说| 蜜桃91丨九色丨蝌蚪91桃色| 日本韩国一区二区| 中文子幕无线码一区tr| 热久久久久久久| 欧美va亚洲va| 老司机精品视频在线| 日韩欧美国产午夜精品| 五月天欧美精品| 欧美日韩一区二区在线视频| 亚洲一区在线电影| 欧美日韩亚洲综合在线| 午夜精品久久久久久| 欧美一区国产二区| 美女视频黄 久久| 久久综合久久久久88| 国产91丝袜在线观看| 一区二区三区日韩欧美| 日韩亚洲欧美一区二区三区| 韩国在线一区二区| 99视频一区二区| 一区二区三区不卡视频| 成人性视频网站| 久久色在线观看| 亚洲午夜一区二区| 色伊人久久综合中文字幕| 日韩午夜激情免费电影| 欧美一区二区三区免费视频| 日本不卡123| 成人网在线免费视频| 欧美性xxxxxxxx| 极品少妇一区二区| 亚洲美女免费在线| 国产精品女主播在线观看| 在线91免费看| 在线欧美一区二区| 国产一区二区视频在线播放| 天天操天天色综合| 精品久久久久久久人人人人传媒| 国产精品69久久久久水密桃| 国产精品午夜在线观看| 亚洲精品一区二区三区蜜桃下载| 毛片av中文字幕一区二区| 亚洲成a人在线观看| 一区二区三区在线不卡| 亚洲欧洲精品一区二区三区| 中文字幕的久久| 欧美美女黄视频| 欧美日韩中文国产| 国产91精品一区二区麻豆亚洲| 国产电影一区二区三区| eeuss鲁片一区二区三区在线看| 成人午夜激情影院| 粉嫩aⅴ一区二区三区四区| 成人做爰69片免费看网站| 国产精品1024| 91国偷自产一区二区开放时间| 免费观看成人av| 国产精品白丝jk白祙喷水网站| 成人av免费网站| 欧美视频中文一区二区三区在线观看| 欧美视频第二页| 日本一区二区三区国色天香| 精品福利一区二区三区 | 成人av动漫网站| 欧美xfplay| 中文字幕日韩欧美一区二区三区| 日韩二区三区四区| 精品中文字幕一区二区小辣椒| 午夜精品久久久久久久99水蜜桃| 亚洲综合免费观看高清完整版在线| 日韩高清欧美激情| 色中色一区二区| 久久精品亚洲精品国产欧美kt∨ | 亚洲成年人影院| 91福利在线观看| 精品欧美一区二区在线观看| 午夜精品久久久久久久蜜桃app| 精品一区二区三区蜜桃| 欧美亚洲高清一区二区三区不卡| 日本一区二区三级电影在线观看| 久久精品久久精品| 成人动漫一区二区三区| 欧美一级日韩不卡播放免费| 偷拍自拍另类欧美| www.成人在线| 国产精品免费免费| 在线观看免费一区| 麻豆一区二区三| 国产欧美精品在线观看| 91免费版在线看| 麻豆高清免费国产一区| 国产人成一区二区三区影院| 不卡的av在线| 久久精品国产精品亚洲综合| 日韩女优电影在线观看| 99久久伊人久久99| 毛片av中文字幕一区二区| 国产精品精品国产色婷婷| 91亚洲精品乱码久久久久久蜜桃| 亚洲成人黄色影院| 91国产免费观看| 成人手机在线视频| 一区二区三区 在线观看视频| 欧美不卡在线视频| 欧美日韩国产综合视频在线观看 | 天堂精品中文字幕在线| 午夜日韩在线观看| 色狠狠色狠狠综合| 欧美自拍偷拍一区| 日韩丝袜美女视频| 欧美色欧美亚洲另类二区| 欧美亚洲综合另类| 久久精品一区二区三区av| 亚洲人成网站影音先锋播放| 青青草原综合久久大伊人精品优势| 韩国精品一区二区| 欧美日韩亚洲另类| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲在线观看免费视频| 成人av在线一区二区| 精品国产露脸精彩对白| 亚洲综合色网站| 日韩福利电影在线| 国产成a人亚洲精品| 欧美精品免费视频| 亚洲同性gay激情无套| 国产成人免费网站| 日韩欧美中文字幕精品| 婷婷国产在线综合| 色综合欧美在线| 成人欧美一区二区三区1314| 久久福利资源站|