范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

工作流ActivitiOA低代码平台bpmnjs源码分析

  低代码平台第二步:bpmnjs源码分析
  带您感受下低代码的功能实现案例,通过简单的几步操作,就能完成一个模块的CRUD操作。
  更多技术文档请点击查看:bpmnjs源码分析 · 语雀
  预览地址:青锋后台管理系统
  核心代码位置-package
  bpmn核心代码全部在package包下面,如下图的位置:
  流程设计器模块process-designer页面对应内容
  页面布局代码                                                                           设计器控制面板process-panel
  代码重构基础组件refactor
  包含了基础组件、流程表达式、流程表单、监听器、多实例、其他任务、参数设置、信号消息、任务管理等等基础组件。
  了解了代码重构的基础组件,在实际业务中可以根据自己的需求进行修改。
  任务组件-改造讲解
  在工作流的设计器中,我们对任务组件做了改造,由于之前的任务只能选择固定的人员或者组织,并没有和实际的数据库进行关联,无法与系统的用户打通,导致设计流程任务审批节点无法动态配置。
  为了打通工作流与系统用户、组织之间的壁垒,我们通过对流程设计器的改造,重新指定了任务组件。
  静态用户任务基础业务介绍
  1、选择静态分配后,我们可以选择用户和组织信息。
  2、选择用户和组织的公共组件可以查看单选用户、单选组织、多选用户、多选组织的案例。
  功能代码介绍
  创建候选静态候选用户表单,可以动态选择用户或者组织。                选择       清空                        选择       清空     
  重新设置用户表单
  resetTaskForm() {       this.$set(this.userTaskForm, "model_id", this.bpmnElement.parent.id);       this.$set(this.userTaskForm, "node_key", this.bpmnElement?.id);       for (let key in this.defaultTaskForm) {         let value;         if (key === "candidateUsers" || key === "candidateGroups") {           value = this.bpmnElement?.businessObject[key]             ? this.bpmnElement.businessObject[key].split(",")             : [];           if (value != "") {             findUserOrOrganizeNames({ type: key, ids: value.join(",") }).then(               (response) => {                 console.log(response);                 if (key === "candidateUsers") {                   this.$set(                     this.userTaskForm,                     "candidateUsers",                     response.data.data.myIds                   );                   this.$set(                     this.userTaskForm,                     "candidateUsersName",                     response.data.data.myNames                   );                 } else if (key === "candidateGroups") {                   this.$set(                     this.userTaskForm,                     "candidateGroups",                     response.data.data.myIds                   );                   this.$set(                     this.userTaskForm,                     "candidateGroupsName",                     response.data.data.myNames                   );                 }               }             );           } else {             if (key === "candidateUsers") {               this.$set(this.userTaskForm, "candidateUsers", "");               this.$set(this.userTaskForm, "candidateUsersName", "");             } else if (key === "candidateGroups") {               this.$set(this.userTaskForm, "candidateGroups", "");               this.$set(this.userTaskForm, "candidateGroupsName", "");             }           }         } else if (key === "assignee") {           value =             this.bpmnElement?.businessObject[key] || this.defaultTaskForm[key];           if (value != "") {             findUserOrOrganizeNames({ type: key, ids: value }).then(               (response) => {                 this.$set(                   this.userTaskForm,                   "assignee",                   response.data.data.myIds                 );                 this.$set(                   this.userTaskForm,                   "assigneeName",                   response.data.data.myNames                 );               }             );           } else {             this.$set(this.userTaskForm, "assignee", "");             this.$set(this.userTaskForm, "assigneeName", "");           }         } else {           value =             this.bpmnElement?.businessObject[key] || this.defaultTaskForm[key];           this.$set(this.userTaskForm, key, value);         }         console.log(key + "|" + value);       }动态用户任务
                                                                                                                     节点解析所有人员中选择(根据组织选择)
  可以从系统人员中,选择节点需要审批的人员,可以指定一个人或者多个人,如果指定一个,则这个人就是本节点的办理人,如果指定了多个人,则流程下发时由上一级用户选择。
  组织选择(指定组织父节点)
  指定组织父节点后,节点办理人为当前组织下的人员,上一节点用户发起流程可以从改组织下面所有的人员中选择下级节点的办理人。
  用户组选择(选择指定组内成员)
  指定用户分组,节点办理人为当前用户组下的人员,上一节点用户发起流程可以从该分组下面所有的人员中选择下级节点的办理人。
  发起人本组织选择
  节点办理人为当前用户同组织下的人员,上一节点用户发起流程可以从发起人同组织下面所有的人员中选择下级节点的办理人。
  部门经理
  在人员中设置人员的部门经理,流程发起人员发起的流程由发起人的部门经理进行审批。
  上级领导
  在人员中设置人员的上级领导,流程发起人员发起的流程由发起人的上级领导进行审批。
  分管领导
  在人员中设置人员的分管领导,流程发起人员发起的流程由发起人的分管领导进行审批。
  流程发起人
  用户节点由流程发起人审批。
  指定范围选择
  指定范围选择-可以选择一个用户集合,用户节点审核时,由上一节点办理人指定用户节点具体的办理人。
  代理人(选择单用户)
  如果节点设置为代理人,则可以指定当前审核代理人,制定后节点由设置的代理人进行审核。
  候选人(选择多用户)
  候选人,可以设置多为候选人,流程审批节点会同时给多为候选人发起审批任务,谁先认领谁审批,由第一个认领的候选人审批。
  候选组(选择多组织)
  候选组的概念同候选人,流程审批节点会同时给多为候选组下的所有人发起审批任务,谁先认领谁审批,由第一个认领的候选人审批。
  在activiti7中,抛弃了候选组审批的功能,在activiti5 和activiti6中依然保持着候选组的审批模式。
  功能代码分析
  下面是具体的核心方法源码,完成的源码需要在代码中进行查看和分析。    cellclick(row) {       var key = this.checktype;       let taskAttr = Object.create(null);       this.userTaskForm.assignee = row.id;       this.dialogVisible = false;       if (key === "candidateUsers" || key === "candidateGroups") {         taskAttr[key] =           this.userTaskForm[key] && this.userTaskForm[key].length             ? this.userTaskForm[key].join()             : null;       } else {         taskAttr[key] = this.userTaskForm[key] || null;         console.log(taskAttr[key]);       }       window.bpmnInstances.modeling.updateProperties(         this.bpmnElement,         taskAttr       );     },     clearAssignee(key) {       let value;       let taskAttr = Object.create(null);       if (key === "candidateUsers" || key === "candidateGroups") {         console.log(key);       } else {         taskAttr[key] = ""; //this.bpmnElement?.businessObject[key] || this.defaultTaskForm[key];       }       this.$set(this.userTaskForm, key, "");       window.bpmnInstances.modeling.updateProperties(         this.bpmnElement,         taskAttr       );     },      //初始化initGroup     initGroup() {       findGroupList({}).then((response) => {         this.groupList = response.data.data;       });     },      //选择办理人     selectAssignee() {       this.dialog(SelectOneUser, "assignee", {         user_id: this.userTaskForm.assignee,         user_name: this.userTaskForm.assigneeName,       });     },     //选择候选人     selectCandidateUsers() {       this.dialog(SelectMoreUser, "candidateUsers", {         user_ids: this.userTaskForm.candidateUsers,         user_names: this.userTaskForm.candidateUsersName,       });     },     //选择候选组     selectCandidateGroups() {       this.dialog(SelectMoreOrganize, "candidateGroups", {         organize_ids: this.userTaskForm.candidateGroups,         organize_names: this.userTaskForm.candidateGroupsName,       });     },      //选择单组织     selectOneOrganize() {       this.dialog(SelectOneOrganize, "oneOrganize", {         organize_id: this.userTaskForm.organize_id,         organize_name: this.userTaskForm.organize_name,       });     },     //选择多用户     selectMoreUser() {       this.dialog(SelectMoreUser, "moreUser", {         user_ids: this.userTaskForm.user_ids,         user_names: this.userTaskForm.user_names,       });     },     //选择单用户     selectOneUser() {       this.dialog(SelectOneUser, "oneUser", {         user_id: this.userTaskForm.user_id,         user_name: this.userTaskForm.user_name,       });     },     //选择多组织     selectMoreOrganize() {       this.dialog(SelectMoreOrganize, "moreOrganize", {         organize_ids: this.userTaskForm.organize_ids,         organize_names: this.userTaskForm.organize_names,       });     },      //选择用户组织弹框     dialog(component, fileType, record) {       console.log(component, fileType, record);       const that = this;       this.$dialog(         component,         // component props         {           record,           on: {             ok() {               console.log("ok 回调");             },             cancel() {               console.log("cancel 回调");             },             close() {               console.log("modal close 回调");             },             initValue(value, type) {               if (type == "1") {                 if (fileType == "assignee") {                   that.userTaskForm.assignee = value.split(":")[0];                   that.userTaskForm.assigneeName = value.split(":")[1];                   //更新文档参数                   that.updateActivitiProperties(                     "assignee",                     value.split(":")[0]                   );                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 } else if (fileType == "oneUser") {                   that.userTaskForm.user_id = value.split(":")[0];                   that.userTaskForm.user_name = value.split(":")[1];                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 }               } else if (type == "2") {                 if (fileType == "candidateUsers") {                   that.userTaskForm.candidateUsers = value.split(":")[0];                   that.userTaskForm.candidateUsersName = value.split(":")[1];                   //更新文档参数                   that.updateActivitiProperties(                     "candidateUsers",                     value.split(":")[0]                   );                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 } else if (fileType == "moreUser") {                   that.userTaskForm.user_ids = value.split(":")[0];                   that.userTaskForm.user_names = value.split(":")[1];                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 }               } else if (type == "3") {                 if (fileType == "oneOrganize") {                   that.userTaskForm.organize_id = value.split(":")[0];                   that.userTaskForm.organize_name = value.split(":")[1];                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 }               } else if (type == "4") {                 if (fileType == "candidateGroups") {                   that.userTaskForm.candidateGroups = value.split(":")[0];                   that.userTaskForm.candidateGroupsName = value.split(":")[1];                   //更新文档参数                   that.updateActivitiProperties(                     "candidateGroups",                     value.split(":")[0]                   );                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 } else if (fileType == "moreOrganize") {                   that.userTaskForm.organize_ids = value.split(":")[0];                   that.userTaskForm.organize_names = value.split(":")[1];                   that.saveAssignMode(                     value.split(":")[0] + "#" + value.split(":")[1]                   );                 }               }               that.$forceUpdate();             },           },         },         // modal props         {           title: "操作",           width: 800,           height: 500,           centered: true,           maskClosable: false,           okText: "确认",           cancelText: "取消",         }       );     },     updateActivitiProperties(key, value) {       let taskAttr = {};       taskAttr[key] = value;       window.bpmnInstances.modeling.updateProperties(         this.bpmnElement,         taskAttr       );     },     selectAssignMode() {       let assign_mode = this.userTaskForm.assign_mode;       let assign_content = this.userTaskForm.assign_content;       if (         assign_mode == "0" ||         assign_mode == "3" ||         assign_mode == "4" ||         assign_mode == "5" ||         assign_mode == "6" ||         assign_mode == "7" ||         (assign_mode == "2" &&           assign_content != "" &&           assign_content != undefined)       ) {         saveAssignment({           id: this.userTaskForm.node_id,           type: this.userTaskForm.type,           assign_mode: this.userTaskForm.assign_mode,           assign_content: this.userTaskForm.assign_content,           model_id: this.userTaskForm.model_id,           node_key: this.userTaskForm.node_key,         }).then((response) => {           console.log(response);         });       }     },     saveAssignMode(assign_content) {       saveAssignment({         id: this.userTaskForm.node_id,         type: this.userTaskForm.type,         assign_mode: this.userTaskForm.assign_mode,         model_id: this.userTaskForm.model_id,         node_key: this.userTaskForm.node_key,         assign_content: assign_content,       }).then((response) => {         console.log(response);       });     },   },    beforeDestroy() {     this.bpmnElement = null;   }, };

推荐方便灵活,适用范围广家庭影院天空(或增高)声道扬声器,你有如下选择方便灵活,适用范围广作为家庭影院天空声道(或增高声道)扬声器,你有如下选择!在家庭影院案例里面使用三维沉浸式音效配置在目前几乎是标配。目前应用到家庭影院的有DolbyAtmosDT大部分小白都会犯得错电脑装好之后显示器没有输出信号导读很多小伙伴在装完机器之后,满怀欣喜的按下开机键准备进入到装系统的界面的时候,发现不管怎么按下开关键怎么弄都是显示器无信号输出,于是乎在那抓耳挠腮的,想着是不是自己有哪些地方装错计算机毕业设计之JavaWeb个性化音乐推荐系统音乐网站开发技术前端JQueryHTMLCSS后端JSPServletJDBC算法标签推荐热门推荐代码开源地址httpsgitee。combysj2021music特色推荐算法注释丰富纯经计算机毕业设计之springbootvue。js音乐推荐系统音乐网站开发技术前端vue。jselemenetUI后端springbootmybatismysql功能计算机毕业设计计算机毕业设计运行截图计算机毕业设计计算机毕业设计计算机毕业设计计算机计算机毕业设计吊炸天Python网易云音乐爬虫大数据分析可视化系统开发技术pymysqlpandas百度echartsrequests创新点(特色)爬虫可视化大数据分析源码开放地址(码云gitee)httpsgitee。combysj2021mu后翼弃兵将改编为音乐剧,版权已售出天才和拯救大概称得上是美剧最受欢迎的两个题材了,而2020年的一部美剧同时集齐了这两个元素,又凭借高颜值的女主和爽文风格大爆。这部剧就是后翼弃兵。后翼弃兵根据沃尔特特维斯的小说改编神兽全球首秀成都车展哈弗开启混动新时代8月29日,第二十四届成都车展上,长城汽车旗下哈弗坦克魏牌欧拉及长城皮卡五大整车品牌集结登场。而作为支撑长城汽车崛起的功勋品牌,哈弗携哈弗神兽哈弗H6S哈弗H6Supreme哈弗H全球汽车巨头齐步推进电动化能否赢得市场青睐日前,大众汽车监事会主席潘师(HansDieterPoetsch)表示,为了加速电气化转型,大众汽车计划到2025年投资1500亿欧元(1780亿美元)。1500亿欧元,也成为迄今华为明明全球领先,华为为什么不上市如果上市,市值绝对远远碾压茅台,华为为什么不上市?明明5G领域全球领先专利全球领先技术研发全球领先,还有全球最优秀的数学家物理学家化学家。如果一上市,市值超过10万亿,甚至超过1061岁麦当娜再次风靡全球,被众男神示爱唯一让我心动的女人放眼当今最酷的女明星,她排第二绝对没人敢排第一!人称时尚带货王,多次霸榜福布斯最富女歌手。凭着一张天赐神颜撩遍音乐界影视界和体育界的大佬们,剪起短发来,女生多看一眼都会被掰弯!(真专题各出奇招,更加注重用户体验浅谈投影产品的线上销售与线下经销(连载4)优派中国区投影机电商负责人林健优派在京东和天猫平台都拥有品牌自营旗舰店。两间店铺的产品投资和销售是齐头并进的,都会作为优派直接与消费者接触和沟通的渠道。优派希望在两间旗舰店开展更多
OPPO公关黄宏涛,发引战言论诋毁鸿蒙操作系统,你对此事怎么看?近日华为官宣,在6月2日举办鸿蒙操作系统发布会时,OPPO的公关经理黄宏涛第一个站出来,说不会使用华为的鸿蒙系统,并用粗暴的语气发表引战言论,用词极其恶毒,简直让人不忍直视!OPP中国供应全球80电动车电池!美国坐不住了拟斥1。1万亿追赶中国垄断全球80的电池供应,昔日电池巨头美国惊慌失措,斥资1。1万亿穷追猛赶。近年来,作为中国各行业的竞争敌手,美国开始越发重视我们各行业的发展,上至建筑工程技术,下到小小的电池,戴威,败光百亿成老赖,被1600万人追债,他的故事有多惨?1817年,第一辆自行车在法国巴黎诞生,从此,人们的出行方式就发生了巨变。虽然现在又有了汽车电瓶车等私人交通工具,但相比之下,最环保的自行车依然是许多人出行时的不二之选。自行车最大华为Mate50Pro售价曝光,或将7月份发布,王者归来声明原创不易,禁止搬运,违者必究!说起华为的手机业务,还是有不少人表示意难平。有了自研的麒麟芯片,并且在业界口碑还非常好,却因为代工厂商问题,而无法实现量产,从而出现缺芯。在5G技想买华为手机,必选华为在美丽国一次又一次的打压下,展现出来了不一样的生机与活力,是在用一个公司的力量,来对抗美国这一超级大国,但也不完全对,因为在华为背后,还有一个强大的祖国,还有祖国的千千万人民,华为MateXs2将升级120Hz高刷屏依旧外折叠方案售价约1。6万元经过多日爆料,华为官方日前宣布,将在4月28日举行华为折叠屏旗舰及全场景新品发布会,届时全新的华为MateXs2折叠屏旗舰将正式与大家见面。而随着发布时间日益临近,外界关于该机的爆华为为什么把手机品牌荣耀独立出来?转眼间,荣耀已经5岁了。5年前,我们勇敢做自己,5年后,我们拥抱潮流,主张活出,我的荣耀。带你看看这其中的故事。移动互联网时代,顺应时势,自我革命和进步。华为内部对终端业务何去何从00852开头的电话天天打,怎么办?拉入黑名单就行了00852是香港区号,你先听听,然后挂断。直接听可以在运营商的app上开通一个免费高频电话拦截服务。中国移动的就有,其他运营商的可以联系一下客服。以下教程仅供参考。什么叫做RIC助听器?您好!什么叫做RIC助听器?RIC指的是助听器中的受话器外置的一种。这种助听器属于耳背式的一种,但是它比常规耳背式更小巧,不易被察觉。功能方面也比定制机更多,按键齐全。从性能上来讲小米Civi1s与小米Civi有什么区别?小米Civi1S相比小米Civi主要有3个升级,处理器换成了骁龙778G芯片,自拍部分加入了前置人眼追焦功能与美颜技术再次升级,还带来了全新的奇迹阳光配色。其他方面保持不比,依旧是网购家电靠谱吗,为什么比实体店便宜?线上和线下产品有区别吗?网络专供,实体专供,你说有没有区别,使用的材料都不一样,你说有没有区别,明眼看差不多,其实用的材料有很大差别,厚度,光泽度,颜色都有差别。咱们日常生活中都离不开家电,但是大家对于购