关于工作流:蜻蜓开箱即用的安全工作流编排

性能介绍蜻蜓平安工作台是一个为平安工程师所打造的平安工作流编排平台;集成了市面中场景的平安工具,让工程师一键应用,进步工作效率;工程师也能够在平台中施展本人的创造力,低成本的编排专属于本人的工作剧本;也能够将本人的成绩与别人一键共享。 次要蕴含了三大性能:1.平安工具库2.低代码工作流编排3.工作流共享 平安工具库平安工程师在日常工作中会用到很多平安工具,比如说sqlmap、nmap、xray等等,这些工具的应用办法、装置办法、依赖环境都是不一样的,而且这样的小工具高达上百种,工程师要应用这些工具须要去破费很大一笔工夫在装置和应用办法上,蜻蜓平安工具平台简化了工具的装置和应用的学习老本,收集了大量常见的平安工具并将它通过容器化包装成规范的工具,启动和应用办法都是统一的,大幅度降低工程师的学习老本。 工作流编排平台低代码平台很多人都分明它的概念,蜻蜓低代码工具平台与之相似,次要作用是将一些小工具编排成一个工作流,使工具A和工具B能够衔接起来,让本来数据格式不同、调用形式不同、输入后果格局不同的工具可能标准化;用户只须要在蜻蜓编排面板绘制工作流程,不同工具就能够协同工作起来。 工作流共享当工程师利用蜻蜓低代码平台制作了高质量的工作流,能够一键分享到市场,其余工程师能够一键克隆此工作流模板。 目前蜻蜓平安工作台外面蕴含许多预设的工作流模板,蕴含了破绽扫描,代码审计,信息收集几个利用场景。你能够在市场页面中找到它们一键克隆并运行工作流。 性能展现用户扫码登录后,在市场页面筛选工作流模板,筛选实现后点击下发的增加到工作流按钮;主动跳转到工作流运行界面,首次运行须要在编排页面填写配置信息,点击编排流程。 进入工作流编排页面,在此页面中能够配置参数。节点会依照自上而下运行,运行过程中状态图标会始终旋转,当运行实现时,能够看到胜利的小图标。 当程序运行实现之后,能够在数据中心页面筛选数据,如下图所示。 在列表页面只展现了一小部分数据,能够点击查看按钮,在详情页查看具体的破绽信息,用于审计标注,如下图所示。 在线试用在线试用地址:http://qingting.starcross.cn/ 代码审计实际案例蜻蜓:GitLab联合fortify实现自动化代码审计实际 (https://segmentfault.com/a/11...) Web扫描器实际案例高效率开发Web平安扫描器之路(一)(https://segmentfault.com/a/11...)微信交换群:分割微信:songboy8888

December 16, 2022 · 1 min · jiezi

关于工作流:flowable多任务实现会签或签

1简介做工作流,根本会遇到会签、或签的需要。而flowable是通过多任务形式来实现的 2次要实现形式在流程运行到工作节点时不是依照默认规定只生成一条工作记录,而是依据须要同时生成多条工作记录,甚至生成的多条工作都能别离对应到指定的各个审批人。而不再须要支付。这种就叫多任务 要实现多任务,则须要对 须要的工作节点须要做相干解决 上面介绍理解到两种形式解决 2.1 xml形式此种形式是间接通过在xml的相应节点来定义多任务,这种官网有大量的xml 例子 【官网】多任务的xml 应用flowable 官网的套件来配置多任务的交互见面大略如下(图片来源于网上): 最终对应到理论的外围xml具体如下 (上面xml不严格对应上图) <bpmn2:userTask id="Activity_1g65lke" name="审批啊14" flowable:assignee="${assignee}" flowable:candidateGroups="2317,2347" flowable:category="CHECK"> <bpmn2:extensionElements> <flowable:executionListener class="***.listens.MultiInstanceListen" event="start" /> </bpmn2:extensionElements> <bpmn2:incoming>Flow_1666168081285</bpmn2:incoming> <bpmn2:outgoing>Flow_03sldqb</bpmn2:outgoing> <bpmn2:multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee"> <bpmn2:extensionElements> </bpmn2:extensionElements> <bpmn2:completionCondition>${nrOfCompletedInstances>=1}</bpmn2:completionCondition> </bpmn2:multiInstanceLoopCharacteristics> </bpmn2:userTask>如果你不是用的官网的UI来生成的xml, 那么你的本人想方法也须要结构出下面的xml2.2 java类后端解决此种形式是我在调研时看到的,我并未尝试过,不太切合咱们的需要,然而也是一种形式 此种形式就是运行到相应节点,后端通过调用api来生成多任务所须要的所有 这边就不放外围代码了,间接能够点击网友曾经做好的整顿 activiti多实例设置(会签/或签)3 外围参数解释下面应该能看到咱们须要配置一些货色能力反对多任务。这里具体说下相干参数及重要点 3.1 相干参数isSequential: 示意并行,还是程序。(xml跟配图可能有出入)loop cardinality:循环基数。可选项。能够间接填整数,示意会签、或签的人数 - (会创立基数个工作实例) 应用该参数只能保障生成相应的工作,然而生成的工作没有assign 该参数跟上面 collection 二选一就行 flowable:collection: 此种形式是示意的会签、或签的具体人。这里xml只须要约定好固定的格局 即可。比方 flowable:collection="assigneeList"flowable:elementVariable: 元素变量, 这里xml只须要约定好固定的格局 即可 flowable:elementVariable="assignee"completionCondition:实现条件。这个条件管制着这里是会签、或签如何能力算实现。 nrOfCompletedInstances: 实现的工作实例数nrOfInstances: 总共生成的工作实例数(依据会签、或签指定的人数生成相应的工作数)参考配置 当是或签时,间接固定配置: ${nrOfCompletedInstances>=1} 即可 当是会签时,固定配置: ${nrOfCompletedInstances==nrOfInstances} 即可 3.2 重要点在会签、或签节点减少 multiInstanceLoopCharacteristics 相应的标签指定生成的工作数。这里更倡议应用 collection。 因为它能够相干配置做到 给生成的工作实例时就有assign工作标签上属性 flowable:assignee="${assignee}" 必须固定这么指定,否则创立的多任务记录外面 assign还是没值 ...

October 21, 2022 · 2 min · jiezi

关于工作流:实时营销引擎在vivo营销自动化中的实践-引擎篇04

作者:vivo 互联网服务器团队本文是《vivo营销自动化技术解密》的第5篇文章,重点剖析介绍在营销自动化业务中实时营销场景的背景价值、实时营销引擎架构以及我的项目开发过程中如何利用动静队列做好业务流量隔离,动静公布,应用规定引擎来晋升营销规定的配置效率等几种关键技术设计实际。 《vivo营销自动化技术解密》系列文章: vivo营销自动化技术解密|开篇设计模式如何晋升 vivo 营销自动化业务扩展性 | 引擎篇01状态机引擎在vivo营销自动化中的深度实际 | 引擎篇02工作流引擎在vivo营销自动化中的利用实际 | 引擎篇03一、背景 营销自动化的触达场景依照时效性划分次要有两大类:  1. 离线指标用户群发。 通过对业务离线数据的剖析决策,制订适合的经营策略对指标用户进行群发触达。典型的场景有:新品举荐、流动预热、定期关心、用户召回等。 2.实时个性化触达。 通过剖析单个用户在一段指定工夫内的行为轨迹,进行个性化的实时性营销触达。典型的场景有:领取揭示,满足流动条件触达等。 离线指标用户群发个别依据流动规定,T+n或者周期性对大数据离线用户数据进行批处理剖析查问,获取满足条件的指标用户,从而进行营销触达。 须要关注的问题是:海量大数据的贮存、查问性能和稳定性。而相比于离线指标用户群发,实时个性化触达对时效性的要求更高,一般来说触达成果也会更优,比方: 对24小时内珍藏订单后,同时退出购物车的用户,push推送流动领券揭示;对支付优惠券1小时内未应用的用户,推送应用揭示;对流动期间胜利下单总金额达到999元的用户,推送支付处分揭示;实时个性化触达须要关注问题包含: 1. 事件实时接入的高扩展性 。 须要疾速撑持接入不同业务零碎的各类行为事件和规定,须要进行对立的散发解决。 2.高性能高牢靠对立散发解决。 3.简单多源数据的解决。 包含数据的补全,各种规定指标的统计,指标用户的交并差计算。 4.高效可扩大的规定匹配。 对业务定义的各种简单规定,须要有一套强扩展性的规定匹配工具。 二、外围架构设计剖析 接入层 提供多种业务事件数据接入形式(比方反对异构内部零碎的通用HTTP,外部的DUBBO、MQ等),最初转成MQ的形式对立散发。 因为事件数据源的不同,须要对宿主业务进行队列流量隔离管控,同时还须要评估后续队列的容量伸缩效率。 须要满足新增事件时,无需对系统进行重新部署,须要进行动静音讯队列接入(下文会进行具体解析)。数据处理层 实时引擎的外围局部。次要负责对事件数据进行加工解决,次要包含:  业务数据的对立标识补全,将多源数据进行买通关联。对业务数据进行各种指标计算。常见的是基于工夫窗口和会话窗口的流式计算,个别应用Flink来搭建。         指标用户匹配。罕用的用户间接交并差集计算,可能更好的对指标用户进行试验。业务规定匹配。基于业务逻辑对用户的数据进行匹配。数据输入层 负责后果数据输入散发,次要目标是数据调配和触达发送策略。 数据管理 保留事件元数据的配置。 数据仓库 离线数据的贮存,作用于流程中各种数据处理流程。 三、要害组件和流程设计3.1 事件实时接入的扩展性设计因为公司外部业务技术栈不尽相同,须要反对多种业务事件数据接入形式,比方通用HTTP接口,Java技术栈的DUBBO接口、和MQ音讯队列的形式,为了零碎外部能够进行对立治理,最初转成MQ的形式进行对立散发。 3.1.1 接入队列设计因为事件数据源的不同,须要对宿主业务进行MQ队列流量管控隔离。不同业务零碎事件接入需要有以下不同的设计方案: 计划一:为每个接入的事件创立一条新队列,不同事件应用不同队列。 长处:最小粒度的流量管制,不同事件接入之间能够做到隔离,互不影响。毛病:每次接入新事件都须要申请创立队列,随着事件接入数据减少,队列保护老本比拟高。计划二:同一接入方的事件应用同一队列,不同接入方应用不同队列(目前音讯核心的计划) 长处:按接入方来进行流量管制,接入方之间进行隔离,同一接入方只需在首次接入应用时创立队列,后续接入新事件无需创立。毛病: 不同接入方接入时须要创立队列,同一接入方不隔离,有相互影响的危险。计划三:不同接入方、事件均应用同一队列 长处:业务方应用敌对,后续接入无需变更,耦合度小,不便切换MQ中间件。毛病:最大粒度的流量管制,无奈做到隔离,危险较高,须要常常进行队列扩容。计划四:当时评估每个事件的优先级(如流量),高优先级的事件独自创立一条队列,低优先级的事件共用同一队列 长处:按事件的维度进行流量管制。毛病:对接入方应用不够敌对,不同业务接入时须要创立队列。各计划比照如下: 论断:依照以后我的项目优先级综合评估来看,业务隔离性>可伸缩性>可维护性>接入方敌对性。 计划二比拟适宜 。(不同的我的项目能够依据本人的理论状况按优先级进行适合的选型) 3.1.2 动静音讯监听背景:当须要做好业务间危险隔离时,就必须按业务或者事件的维度进行队列拆分。此时若进行新接入事件就可能须要从新创立新的队列。 初期计划:采纳公司中间件vivo-rmq, 当接入方须要新增队列时,须要批改代码新增队列监听,从新发版,这样做的问题是从新发版老本较高,依照我的项目流程治理进行效率低。 优化计划一: 批改启动加载类加载指定目录下的配置文件,新增队列时批改配置文件上传。 长处:无需发版。毛病:仍须要重启服务器,同时须要保护配置文件目录等信息。优化计划二:保留队列配置信息到数据表中,启用定时工作在服务器运行时动静监听数据库配置,新增或者下线队列配置记录后,主动进行队列变更。 长处:无需发版和重启。毛病:定时工作实时性稍差,必须确保队列监听胜利后在告诉业务方接入。论断:采纳计划二,新增事件无需对系统进行重新部署,应用运行时动静形式进行音讯队列接入。 3.2 对立散发解决形象公共散发模板:事件参数和有效性检测 → 散发到事件规定匹配器 EventMatcher →  输入到渠道发送流程 ...

October 10, 2022 · 1 min · jiezi

关于工作流:轻量级工作流引擎的设计与实现

一、什么是工作流引擎工作流引擎是驱动工作流执行的一套代码。 至于什么是工作流、为什么要有工作流、工作流的利用景,同学们能够看一看网上的材料,在此处不在开展。 二、为什么要反复造轮子开源的工作流引擎很多,比方 activiti、flowable、Camunda 等,那么,为什么没有选它们呢?基于以下几点思考: 最重要的,满足不了业务需要,一些非凡的场景无奈实现。有些需要实现起来比拟绕,更有甚者,须要间接批改引擎数据库,这对于引擎的稳固运行带来了微小的隐患,也对当前引擎的版本升级制作了一些艰难。材料、代码量、API繁多,学习老本较高,维护性较差。通过剖析与评估,咱们的业务场景须要的BPMN元素较少,开发实现的代价不大。因而,反复造了轮子,其实,还有一个更深层次的策略上的思考,即:作为科技公司,咱们肯定要有咱们本人的外围底层技术!这样,能力不受制于人(参考最近的芯片问题)。 三、怎么造的轮子对于一次学习型分享来讲,过程比后果更重要,那些只说后果,不细说过程甚至不说的分享,我认为是秀肌肉,而不是真正意义上的分享。因而,接下来,本文将重点形容造轮子的次要过程。 一个成熟的工作流引擎的构建是很简单的,如何应答这种复杂性呢?一般来讲,有以下三种办法: 确定性交付:弄清楚需要是什么,验收规范是什么,最好可能写出测试用例,这一步是为了明确指标。迭代式开发:先从小的问题集的解决开始,逐渐过渡到解决大的问题集上来,罗马不是一天建成的,人也不是一天就能成熟的,是须要个过程的。分而治之:把大的问题拆成小的问题,小问题的解决会推动大问题的解决(这个思维实用场景比拟多,同学们能够用心领会和了解哈)。如果依照上述办法,一步一步的具体开展,那么可能须要一本书。为了缩减篇幅而又不失干货,本文会形容重点几个迭代,进而论述轻量级工作流引擎的设计与次要实现。那么,轻量级又是指什么呢?这里,次要是指以下几点 少依赖:代码的java实现上,除了jdk8以外,不依赖与其余第三方jar包,从而能够更好的缩小依赖带来的问题。内核化:设计上,采纳了微内核架构模式,内核玲珑,实用,同时提供了肯定的扩展性。从而能够更好地了解与利用本引擎。轻标准:并没有齐全实现BPMN标准,也没有齐全依照BPMN标准进行设计,而只是参考了该标准,且只实现以一小部分必须实现的元素。从而升高了学习老本,能够依照需要自由发挥。工具化:代码上,只是一个工具(UTIL),不是一个应用程序。从而你能够简略的运行它,扩大你本人的数据层、节点层,更加不便的集成到其余利用中去。好,废话说完了,开始第一个迭代......四、Hello ProcessEngine依照国际惯例,第一个迭代用来实现 hello world 。 1、需要 作为一个流程管理员,我心愿流程引擎能够运行如下图所示的流程,以便我可能配置流程来打印不同的字符串。 2、剖析 第一个流程,能够打印Hello ProcessEngine,第二个流程能够打印ProcessEngine Hello,这两个流程的区别是只有程序不同,蓝色的节点与红色的节点的自身性能没有发生变化蓝色的节点与红色的节点都是节点,它们的性能是不一样的,即:红色的节点打印Hello,蓝色的节点打印ProcessEngine开始与完结节点是两个非凡的节点,一个开始流程,一个完结流程节点与节点之间是通过线来连贯的,一个节点执行结束后,是通过箭头来确定下一个要执行的节点须要一种示意流程的形式,或是XML、或是JSON、或是其余,而不是图片3、设计 (1)流程的示意 相较于JSON,XML的语义更丰盛,能够表白更多的信息,因而这里应用XML来对流程进行示意,如下所示 <definitions> <process id="process_1" name="hello"> <startEvent id="startEvent_1"> <outgoing>flow_1</outgoing> </startEvent> <sequenceFlow id="flow_1" sourceRef="startEvent_1" targetRef="printHello_1" /> <printHello id="printHello_1" name="hello"> <incoming>flow_1</incoming> <outgoing>flow_2</outgoing> </printHello> <sequenceFlow id="flow_2" sourceRef="printHello_1" targetRef="printProcessEngine_1" /> <printProcessEngine id="printProcessEngine_1" name="processEngine"> <incoming>flow_2</incoming> <outgoing>flow_3</outgoing> </printProcessEngine> <sequenceFlow id="flow_3" sourceRef="printProcessEngine_1" targetRef="endEvent_1"/> <endEvent id="endEvent_1"> <incoming>flow_3</incoming> </endEvent> </process></definitions>process示意一个流程startEvent示意开始节点,endEvent示意完结节点printHello示意打印hello节点,就是需要中的蓝色节点processEngine示意打印processEngine节点,就是需要中的红色节点sequenceFlow示意连线,从sourceRef开始,指向targetRef,例如:flow_3,示意一条从printProcessEngine_1到endEvent_1的连线。 (2)节点的示意 outgoing示意出边,即节点执行结束后,应该从那个边进来。incoming示意入边,即从哪个边进入到本节点。一个节点只有outgoing而没有incoming,如:startEvent,也能够 只有入边而没有出边,如:endEvent,也能够既有入边也有出边,如:printHello、processEngine。(3)流程引擎的逻辑 基于上述XML,流程引擎的运行逻辑如下 找到开始节点(startEvent)找到startEvent的outgoing边(sequenceFlow)找到该边(sequenceFlow)指向的节点(targetRef)执行节点本身的逻辑找到该节点的outgoing边(sequenceFlow)反复3-5,直到遇到完结节点(endEvent),流程完结4、实现 首先要进行数据结构的设计,即:要把问题域中的信息映射到计算机中的数据。 能够看到,一个流程(PeProcess)由多个节点(PeNode)与边(PeEdge)组成,节点有出边(out)、入边(in),边有流入节点(from)、流出节点(to)。 具体的定义如下: public class PeProcess { public String id; public PeNode start; public PeProcess(String id, PeNode start) { this.id = id; this.start = start; }} public class PeEdge { private String id; public PeNode from; public PeNode to; public PeEdge(String id) { this.id = id; }} public class PeNode { private String id; public String type; public PeEdge in; public PeEdge out; public PeNode(String id) { this.id=id; }}PS : 为了表述次要思维,在代码上比拟“奔放自在”,生产中不可间接复制粘贴! ...

September 26, 2022 · 7 min · jiezi

关于工作流:使用4D工作法规划每日工作

概念什么是4D工作法对于我来说,4D工作法这个概念来源于《小强升职记》、《只管去做》的作者邹小强老师.别离是Delay it, Do it now, Don’t do it, Delegate it. Do it now: 就是须要立马去做的, 这在公司中对应着生产事变, 老板散会, 访客到访, 或者是那种两分钟内就能做完的事件, 那就间接归到这类, 实现再说. Delay it: 指那种须要比拟长时间的, 比拟重要, 然而不是特地紧急, 能够安顿工夫做的事. Delegate it: 指那种能够尽量受权他人做的事, 尤其是作为管理者, 尽量把本人曾经会的货色, 传授给共事去做. 然而须要留神的事, 安顿他人做的事件, 须要本人定一个揭示, 到期了去询问进度和成绩. Don’t do it: 一些无意义的会议, 有效的社交, 就不要去做了. 我感觉这类事件还真的须要好好思考, 不要什么事都想去做, 把本人的工夫节约掉. 什么是工作四项限这是在学习到4D工作法之前就看到过的概念 工作四象限这个概念的问题是,没有明确的action,我感觉不如4D工作法, 间接蕴含4个action, 通俗易懂. 实际心理建设和典礼感不论多忙, 须要养成每日布局打算的习惯, 否则不论是生存还是工作, 都像是同流合污的浮萍, 飘到哪算哪. 从心理学的角度讲, 就像条件反射一样, 须要一些”触发器”揭示你的身材, 该开始做什么了, 将布局一天的工作, 做的像每天喝水一样, 天然就能做好. 因而, 能够在每天喝第一口水后, 开始布局明天的4D工作. 我的每日待办清单演进过程v1-一般清单-应用notion的todo block ...

August 17, 2022 · 1 min · jiezi

关于工作流:技术实践干货-从工作流到工作流

本文作者: 葱油饼,观远前端工程师,落地团队开发标准,开发品质与速度并存,致力于打造更易用的 ABI 产品。背景先举个简略的例子,因为工作须要,你可能每天要从数据库抽取数据,而后做成报表,最初以邮件的模式发送给相干的领导。然而每个领导可能须要看的货色不一样,你须要在做成报表前对数据做下筛选和解决,那么每天这个反复的流程,是不是能够形象成为一个具体的工作流程,把每个步骤具象成一个性能结点,而后以工作的模式串联起来,通过 DAG 的可视化模式展示进去,每天定时跑一下就能够了呢?为此,咱们会须要一个工作流来标准化和自动化这个流程。 那工作流是什么?DAG 又是什么?上面让咱们进入明天的内容。 前言这篇文章会解说咱们 Universe(观远三大产品线之一,即观远数据的智能数据开发平台)里的工作流和 DAG 这两个概念,而后开展介绍一些其余内容。整体分为四个局部: 开发平台里的工作流;如何形象实现 DAG;其余工作流介绍;基于工作流和 DAG 的总结与思考。接下来让咱们开始吧~一、工作流首先简略介绍下 Universe 里的工作流: 实现各类工作的依赖关系、调度程序设计,对流程进行可视化、低代码的设计及治理,对工作节点进行疾速且高可用的配置,来解决一系列的数据工作;并且能够在约定工夫/满足事件依赖后运行,有序调起各个工作节点,主动实现数据处理过程,具备简略易用、高可靠性及高扩展性等劣势。依据这段形容,咱们能够简略总结出工作流的两个外围能力: 调度;配置化(节点)。上面具体介绍下这两个外围能力。 1.1 调度开发平台反对基于 Cron 表达式的定时调度和基于输出源数据依赖的事件调度,其中定时调度采纳 quartz 散布式调度器。具备以下几点个性: 高可用性通过 DAG 实现工作节点的可视化编排,毋庸简单的平台语言学习老本,任务调度开箱即用;反对配置程序调度、胜利调度、失败调度等多种调度关系,灵便调整调度策略;反对按时、按天、按周、按月等定时运行工作流,运行后果可疾速推送至钉钉、企业微信等平台,一次配置,继续可用。高可靠性:去中心化的多Master和多Worker分布式架构, 防止单点故障,加强系统可靠性。高扩展性:能够基于 SDK 开发自定义工作类型和流程无缝连接。1.1.1 定时调度 反对以每天/每周/每月/每年并准确到分钟的模式和距离时长(时/分)的模式去设置定时。 举个例子:我冀望工作流每天早上 7 时和早晨 21 时去运行,那我就能够抉择 每天 - 7时/21时 - 00 分的模式,也能够设置分钟/时的间隔时间去运行。 1.1.2 事件调度 个别工作流都会有数据源依赖,比方数据集/数据库,当开启依赖的数据源全副更新的时候,工作流能够主动去运行一次。 1.2 配置化 基于一个约定式的配置形容,产出一个可交互的 UI,用于构建指标对象。调度的目标是运行工作流,工作流的运行依赖于不同工作节点的配置,不同的配置必然会存在不一样的 UI 组件,那如何能用已知的数据结构去组装一个可视化的 UI 呢?答案就是配置化。 咱们基于一个配置形容(对象)去进行读取,而后依据配置渲染对应的组件,同时把组件的值集中设置到一个总的配置对象里,从而实现了从形容到 UI 再到指标对象构建的一个过程。上面我会简略的举三个例子来阐明配置化的弱小与魅力。 1.2.1 根底能力 如果咱们须要构建如下的一个指标对象: {    name: '',    description: '',}而后咱们就会有以下一段配置形容: [    {        fieldName: 'name',        label: '名称',        type: 'STRING',        defaultValue: '',    },    {        fieldName: 'description',        label: '形容',        type: 'TEXT',        defaultValue: '',    },]生成的 UI 如下: 1.2.2 动静能力 很多时候咱们会须要动静实现一个指标对象,什么意思呢?就是抉择一个属性的不同值,动静应用一个属性组合成一个新的指标对象,那对应到 UI 上就是抉择不同属性值对应展现不同的组件,那光靠咱们的根底能力去实现,显然无奈做到。 比方我想计算一个图形的面积,如正方形须要的是边长属性,而圆须要的是半径属性,那指标对象和 UI 就会变成: ...

July 22, 2022 · 2 min · jiezi

关于工作流:工作流自动化-低代码是关键

受内外部环境变动以及竞争压力的影响,企业纷纷将数字化转型作为外围策略,旨在充分运用数字化技术推动商业模式、研发模式、制作模式、服务模式、经营模式和决策模式的转型,进而塑造面向未来的企业竞争力,实现继续稳固的业务增长。 企业推动数字化转型,业务流程自动化无疑是其中至关重要的一环。通过将自动化作为充沛且必要元素纳入数字化转型过程,企业就能在业务经营中取得速度、准确性和老本效益等方面的竞争劣势。 业务流程自动化即BPA,源于组织实现业务流程自动化以实现数字化转型的须要,旨在将业务流程扩大到合作伙伴、客户和供应商,在他们与组织互动时为他们提供更好的体验。尽管听起来与BPM相似,但两者最大的区别在于,业务流程自动化是在假设业务流程曾经数字化并筹备好进行优化的情境下产生的。 BPA应用技术来自动化可反复的工作,BPM是业务和IT之间的合作,以建模和优化业务流程,以满足更大的战略目标。换句话说,BPM是将组织看作一个整体的实际,而BPA是改良特定流程的策略。因而,BPM是整体的意识形态,而BPA是指个体的口头步骤业务流程自动化也代表了晚期业务流程治理实际的天然演变,尽管前几代BPM反对企业对其业务流程转变的致力,但BPM作为一个技术类别通常无奈实现对流程自动化所需的端到端、跨应用程序自动化的反对。 业务流程自动化解决了这一限度,通过创立实现数字化的应用程序,使整个组织的人员可能将各种组织业务流程数字化。 家喻户晓,低代码是一种直观的可视化软件开发办法,可能为用户提供可视化开发界面,给业余开发人员和业务人员提供疾速创立应用程序的平台。它也可用于实现工作、端到端流程和简单工作流程的自动化。低代码流程自动化不是在遗留零碎内实现重复性工作的自动化,而是让企业在以后技术能力背景下重构流程并灵便实现古代数字化。 让业余开发人员和业务人员之间可能更好地合作,是低代码平台能带来的另一大劣势。而且,得益于低代码开发平台自身易于了解和操纵的界面,使得业务人员在很大水平上,也能独立实现构建利用的工作,仅在必要时再动用技术资源。因而,企业可能更快地获得我的项目停顿,也不用放心技术人员负担过重而耽搁更加外围的工作进度。 此外,与传统的利用程序开发形式相比,研发人员能够在低代码平台通过前端图形化的利落拽实现需求,实现了研发效率的进步,应用低代码平台升高了研发人员的工作量和对编码人员开发技能的要求。低代码平台套用封装代码,根本打消测试修复 bug 的环节。同时,低代码开发平台是松耦合的并发开发模型,大大降低开发中对合作方的依赖性,从而升高沟通和工夫老本。 低代码与业务流程自动化的交融,企业将在不进行大量投资和技术改造的状况下放慢流程自动化,升高经营老本并依据市场需求疾速推出和扩大新的解决方案,进步客户参与度。 在传统模式下,流程转换、自动化和利用程序开发还是各自为政,但在低代码平台上壁垒得以小时,三者融汇在一起,业务人员和技术团队都可能创立面向流程的应用程序,在不进行大量投资和技术改造的状况下放慢流程自动化,以反对企业范畴的数字化需要。

June 28, 2022 · 1 min · jiezi

关于工作流:为企业业务流程提速的BPM

数字化时代的最大特色是数据驱动所有,所以企业必须具备一个根底条件“数据能力”;同时数字时代的另一个重要体现是,业务成为驱动企业IT改革的重要推手。数据与业务的协同作战成为企业是否在数字时代占得竞争先机的要害因素。 企业业务流程的再造、优化,同时贯通以数据流的残缺穿透,把数据与业务紧密结合令BPM在数字化时代的战略地位失去极大的晋升,这个已经深埋在企业底层治理理念和治理逻辑的IT零碎得以在数字化时代被更多的企业所认知。 BPMS即业务流程管理系统,是以规范化的端到端的业务流程为核心的管理系统,目标是为了持续性的进步业务绩效。艰深来讲就是针对流程治理的信息化零碎。 BPM的次要特点是流程导向,以帮忙企业将流程作为切入点,通过弱小的集成能力、端到端连贯梳理企业业务,极大地缩小了业务实现工夫,从外部治理角度实现降本增效。从企业外部实现、组织管控能力降级、业务管理绩效晋升。 治理上的地区距离、层级限度和零碎隔离等问题在BPM平台上迎刃而解,借助BPM赋能平台的多租户模式和接口整合能力,企业内的管控失去全方位降级;业务流程的复杂多变和流转艰难等行业痛点和难点在BPM平台上得以攻克,借助BPM赋能平台的可视化配置模式和流程引擎的诸多中国特色,企业业务流程的规范性和高效性失去充沛保障。 而信息化建设的老本导向在BPM平台的利用过程中也失去扭转,借助BPM赋能平台以“流程”为外围的整套引擎式开发套件和方法论,企业在流程管控可继续倒退的路上有了更弱小的工具武装。 在古代,技术赋能的BPM容许链接端到端业务流程中应用的应用程序。此链接容许流程所有者监督流程听从性,并评估该流程是否满足公司指标的能力。同时,一个古代的BPM程序能够做到监督并获取“态势”,被动向适当的用户收回警报,帮忙他们采取行动来改良或进步公司的性能。 并且,古代BPMS工具能够把无关的材料会集起来,依据端到端流程可视性的须要,应用来自多个零碎的数据来生成这些组合信息视图,提供一个残缺的状况,以便用户迅速进行评估和改良决策。 当企业有一套适合的BPM零碎时,每个业务流程都曾经确定并且履行,通过流程零碎企业能够意识和响应客户需要、进步企业的生产力、放弃企业的外围竞争力。 新技术为更好地治理企业带来了新机遇,BPM也经验了技术改革和改良、商业模式的翻新,不再受价格、老本、产品复杂度的局限,BPM从大规模企业的利用部署一直下探,以更细分场景、更小模块、更小范畴部署的特点进入更广大的腰部及腰部以下企业市场,让更多的企业实现业务流程自动化。

June 1, 2022 · 1 min · jiezi

关于工作流:Activiti7工作流idea2021筑基的网关仙术

仙术1、设置变量画图 xml文件:sequenceFlow 就代表了上方的双指向箭头双指向箭头在idea插件外面是没有的,须要用后面说的软件,点击指向线点击设置符号就会显示 <?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.activiti.org/processdef" exporter="activiti Modeler" exporterVersion="3.0.0"> <process id="dd" name="testUpdate" isExecutable="true"> <startEvent id="sid-f9290572-60fe-46c8-ba1a-6d49ab85d9c7" /> <userTask id="_3" name="创立出差申请" activiti:assignee="${assignee0}"> <extensionElements> <activiti:formProperty id="Property 1" /> <activiti:formProperty id="Property 2" /> </extensionElements> </userTask> <sequenceFlow id="sid-b30ee1df-6da8-4cfe-ac98-91f72c8494bc" sourceRef="sid-f9290572-60fe-46c8-ba1a-6d49ab85d9c7" targetRef="_3" /> <userTask id="_4" name="部门经理审核" activiti:assignee="${assignee1}"> <extensionElements> <activiti:formProperty id="Property 1" /> </extensionElements> </userTask> <sequenceFlow id="sid-9573370a-bf0b-4003-8d51-d51c463a282c" sourceRef="_3" targetRef="_4" /> <userTask id="_5" name="总经理审批" activiti:assignee="${assignee2}"> <extensionElements> <activiti:formProperty id="Property 1" /> </extensionElements> </userTask> <userTask id="_6" name="财务审批" activiti:assignee="${assignee3}" > <extensionElements> <activiti:formProperty id="Property 1" /> </extensionElements> </userTask> **<sequenceFlow id="_11" sourceRef="_4" targetRef="_5"> <conditionExpression xsi:type="tFormalExpression">${evection.num>=3}</conditionExpression> </sequenceFlow> <sequenceFlow id="_10" sourceRef="_4" targetRef="_6"> <conditionExpression xsi:type="tFormalExpression">${!(evection.num>=3)}</conditionExpression> </sequenceFlow>** <!--<sequenceFlow id="_11" sourceRef="_4" targetRef="_5">--> <!-- <conditionExpression xsi:type="tFormalExpression">${evection.num&gt;=3}</conditionExpression>--> <!--</sequenceFlow>--> <!--<sequenceFlow id="_10" sourceRef="_4" targetRef="_6">--> <!-- <conditionExpression xsi:type="tFormalExpression">${evection.num&lt;3}</conditionExpression>--> <!--</sequenceFlow>--> <sequenceFlow id="sid-5566d8ce-7ce5-49c1-9bb5-3b0430b874b1" sourceRef="_5" targetRef="_6" /> <endEvent id="sid-a173a463-e580-4c50-8e37-1436c0a34950" /> <sequenceFlow id="sid-5af69afe-a2f7-4259-b953-628840a60ee2" sourceRef="_6" targetRef="sid-a173a463-e580-4c50-8e37-1436c0a34950" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_testUpdate"> <bpmndi:BPMNPlane id="BPMNPlane_testUpdate" bpmnElement="testUpdate"> <bpmndi:BPMNShape id="shape-da9b2c9f-2cc1-4b6d-9564-0b64729aaf1f" bpmnElement="sid-f9290572-60fe-46c8-ba1a-6d49ab85d9c7"> <omgdc:Bounds x="261" y="81" width="30" height="30" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="shape-ab0f3ec4-3b5f-493f-9e9c-8e5c402af1db" bpmnElement="_3"> <omgdc:Bounds x="231" y="126" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-1d876cf9-3158-4b8c-b5b0-136f1d017ee7" bpmnElement="sid-b30ee1df-6da8-4cfe-ac98-91f72c8494bc"> <omgdi:waypoint x="283.5" y="111" /> <omgdi:waypoint x="281" y="126" /> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-05c6fa49-0531-48e8-84cd-36fe3f33d9c8" bpmnElement="_4"> <omgdc:Bounds x="231" y="221" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-69760489-b8bc-4419-a1fc-504694e219e9" bpmnElement="sid-9573370a-bf0b-4003-8d51-d51c463a282c"> <omgdi:waypoint x="281" y="206" /> <omgdi:waypoint x="281" y="221" /> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-b444c63b-fa51-4e0a-b103-25fea15de25e" bpmnElement="_5"> <omgdc:Bounds x="156" y="326" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="shape-bb3d593f-baaa-40fd-b233-6a21ec80239d" bpmnElement="_6"> <omgdc:Bounds x="316" y="326" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-15573ce2-e6a3-414c-b927-6d24214e5f6d" bpmnElement="_11"> <omgdi:waypoint x="256" y="301" /> <omgdi:waypoint x="231" y="326" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="edge-7a29c150-4f0e-48dc-8301-3fb34c3602cd" bpmnElement="_10"> <omgdi:waypoint x="306" y="301" /> <omgdi:waypoint x="341" y="326" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="edge-bb04d8dd-0c80-4dd1-82c2-d0a508f705c6" bpmnElement="sid-5566d8ce-7ce5-49c1-9bb5-3b0430b874b1"> <omgdi:waypoint x="256" y="366" /> <omgdi:waypoint x="316" y="366" /> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="shape-0b537d4f-587d-4f06-b1d7-6b21374a8f49" bpmnElement="sid-a173a463-e580-4c50-8e37-1436c0a34950"> <omgdc:Bounds x="466" y="351" width="30" height="30" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="edge-b166ebec-c69f-41ad-92b3-6b2ea2bb03ce" bpmnElement="sid-5af69afe-a2f7-4259-b953-628840a60ee2"> <omgdi:waypoint x="416" y="366" /> <omgdi:waypoint x="466" y="366.00002" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram></definitions>而后失常流程启动: ...

March 22, 2022 · 3 min · jiezi

关于工作流:Activiti7工作流idea2021监听器法器的使用

法器宝贝宝贝转过身来 4、监听器工作流的结尾都是创立bpmn文件,留神一点细节问题:须要加监听器了首先咱们得有一个监听器 package listener;import org.activiti.engine.delegate.*; public class MyTaskListener implements TaskListener { public void notify(DelegateTask delegateTask) { //delegateTasK是当前任务的对象 //默认是create事件 if("创立申请".equals(delegateTask.getName()) && "create".equals(delegateTask.getEventName())){ delegateTask.setAssignee("张三"); } } }而后呢启动Camunda Modele,也就是我之前文章放的那个链接,解压后就能够用了。为什么用它而不应用插件呢,因为插件外面基本没有监听器,在填完阶段的根本信息后(也就是id和name),找到Listeners,点击Execution是全局,Task是流动阶段,点击加号创立一个监听器,默认是create创立时监听,上面的Java Class就是监听器的包搁置地位。我放的很简略构建好之后将这个流程导出来,这是一张图该怎么导成bpmn文件呢? 点击xml文件,如果上面没有这两个选项点击log关上菜单,复制粘贴或者间接另存为,另存为文件的时候默认xml格局的,须要改成bpmn文件格式 导进idea之后会报错:如果删了呢,会有更多谬误。这里就有一个坑:idea跟Camunda Modeler不兼容的问题,其实就是一个camunda标签的问题,idea外面是没有的,将他全副改成activiti就能够了,而后失常走流程看成果: ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment() .name("测试监听器") .addClasspathResource("bpmn/demo-listen.bpmn") .addClasspathResource("bpmn/testListener.bpmn20.png") .deploy();定义好之后数据表会有信息 act_re_procdef表后果:启动流程:ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();runtimeService.startProcessInstanceByKey("testListener");ACT_RU_TASK后果图果然是一件好宝贝

March 18, 2022 · 1 min · jiezi

关于工作流:Activiti工作流入门筑基圆满

第十一步:关联业务表 //关联业务表 @Test public void actionwith(){//1、获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2、获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService();// 3、启动流程的过程中,增加businesskey//第二个参数:businessKey,业务表的id,就是1001 ProcessInstance instance = runtimeService. startProcessInstanceByKey("holiday", "1001");//4、输入 System.out.println("businessKey=="+instance.getBusinessKey()); }运行截图: 第十二步:应用uel表达式创立负责人(一)从新创立bpmn文件 png图片和bpmn文件见下面的步骤```Java流程部署//1、创立ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2、获取RepositoryServcie RepositoryService repositoryService = processEngine.getRepositoryService();//3、应用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中 Deployment deploy = repositoryService.createDeployment() .name("出差申请流程-uel") .addClasspathResource("bpmn/myEvection.bpmn20.xml") .addClasspathResource("bpmn/Evection.png") .deploy();//4、输入部署信息 System.out.println("流程部署id="+deploy.getId()); System.out.println("流程部署名字="+deploy.getName());```启动实例:```Java//获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService();//设定assignee的值,用来替换uel表达式 Map<String,Object> assigneeMap = new HashMap(); assigneeMap.put("assignee0","张三"); assigneeMap.put("assignee1","李经理"); assigneeMap.put("assignee2","王总经理"); assigneeMap.put("assignee3","赵财务");//启动流程实例 runtimeService.startProcessInstanceByKey("myEvection",assigneeMap);```数据库表信息更改: 第十三步:候选人实例创立bpmn文件参考下面步骤,在bpmn文件中的部门经理审核加上一句话,增加候选人 <sequenceFlow id="sid-6d79513c-9c03-4877-b998-6e587f5c182d" sourceRef="testCandateStart" targetRef="_3"/> <userTask id="_4" name="部门经理审批" **activiti:candidateUsers="lisi,wangwu"**> <extensionElements> <activiti:formProperty id="Property 1"/> <activiti:formProperty id="Property 2"/> <activiti:formProperty id="Property 3"/> <activiti:formProperty id="Property 4"/> </extensionElements>代码步骤: ...

March 18, 2022 · 2 min · jiezi

关于工作流:Activiti工作流入门筑基下篇养性

二、眉头一皱退到众人身后身子养好了,开始脱离凡尘做筹备 第六步:流程部署(一)流程部署形式一、 @Test public void GenActivitiTables2() { // 创立流程引擎ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RepositoryServcie(re表的服务层) RepositoryService repositoryService = processEngine.getRepositoryService(); //3、应用service进行流程的部署,部署bpmn和png Deployment deploy = repositoryService.createDeployment().name("出差申请流程") .addClasspathResource("bpmn/holiday.bpmn20.xml") .addClasspathResource("bpmn/holiday.bpmn20.png") .deploy(); }(二)、流程部署形式二、 //1、将png和bpmn打包成zip包//2、创立(流程引擎)ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//3、获取RepositoryServcie(re表的服务层)\ RepositoryService repositoryService = processEngine.getRepositoryService();//读取资源包文件,结构成inputStream InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("bpmn/holiday.zip");//用inputStream 结构ZipInputStream ZipInputStream zipInputStream = new ZipInputStream(inputStream);//应用压缩包的流进行流程的部署 Deployment deploy = repositoryService.createDeployment() .addZipInputStream(zipInputStream) .deploy();部署去数据库查看,原来没有日期的体现在有了日期的,点击进去能够查看具体数据 第七步:启动流程实例 //1、创立ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2、获取RunTimeServiceRuntimeService runtimeService = processEngine.getRuntimeService();//3、依据流程定义的id启动流程ProcessInstance instance = runtimeService.startProcessInstanceByKey("就是bpmn文件中的process id");启动后发现有新的表数据:act_hi_taskinst(历史工作实例数据表)act_hi_procinst(历史流程实例数据表,正在执行的工作也在其中)act_hi_actinst(历史节点数据,图片上的节点信息)act_hi_identitylink(历史流程用户信息数据表)act_ru_execution运行时流程执行实例数据表,一条是开始事件的执行实例,这个始终存在,只到流程完结后才会主动删除,is_active字段示意是否正在执行实例)act_ru_task(运行时工作信息数据信息表) 第八步:查问集体代办工作 @Test public void getActiv(){ //1、获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取taskService TaskService taskService = processEngine.getTaskService(); //3、依据流程key 和 工作的负责人 查问工作 List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("holiday").taskAssignee("zhangsan").list(); //4、输入 for (org.activiti.engine.task.Task task : taskList) { System.out.println("流程实例id="+task.getProcessInstanceId()); System.out.println("工作Id="+task.getId()); System.out.println("工作负责人="+task.getAssignee()); System.out.println("工作名称="+task.getName()); } }执行后果:进入数据库也能够查看到信息: ...

March 17, 2022 · 2 min · jiezi

关于工作流:Activiti工作流入门筑基上篇修身

Activiti工作流一、我不是韩立,我叫厉飞雨 一、工作流的简略理解 1、介绍:将一组工作组织起来以实现某个事件的过程 :定义了工作的触发程序和触发条件,每个工作能够由一个或多个 软件系统 实现,也能够由一个或一组人实现,还能够由一个或多集体与软件系统合作实现。只有牵扯到了多个角色的多个工作都能够应用1-1目前常见的工作流程有两种形式: (1)通过状态字段实现流程管制。原始,适宜简略流程管制。 (2)工作流引擎实现流程管制。实用场景更宽泛,扩展性更好。2、实现原理:不扭转代码的前提下实现各种业务流程的治理,适用性,扩展性很优良。activiti通过创立流程实例引擎,能够实现不同流程的流转,通过一直读取创立的流程节点实现流程流转。3、工作流引擎分类 工作流引擎性能文档环境部署Activiti反对绝大部分工作流性能,合乎中国国情的审批流程须要在此基础上进行开发。文档丰盛,csdn有相应专栏,并且国人奉献了一本《activiti实战》具体的解说了基于activiti的开发内容,网上教程资源丰盛。官网提供webapp war包,部署在Tomcat下可疾速操作和理解activiti,eclipse提供反对activiti我的项目的ide插件,总的来说环境反对良好。jBPM反对绝大部分工作流程,合乎中国国情的审批需持续二次开发。中文文档绝对匮乏,网上教程资源参考价值不大。 jFlow反对大部分流程的根底性能:后退、后退、转向、转发、撤销、抄送、挂起、草稿、委托代办,也反对高级性能取回审批、项目组、内部用户等公司提供残缺具体的接口文档和操作手册,属于国内公司开源我的项目,有专门的BBS论坛官网提供疾速运行体验http://demo.ccflow.org/,也可依照教程部署到本地Tomcat下拜访本地http://127.0.0.1:8080/jflow-web/地址测试。activitiActiviti是由jBPM 的创立Tom Baeyen离JBoss之后建设的我的项目,构建在开发 jBPM 版本1到4时积攒的多年教训的根底之上,旨在创立下一代的 BPM 解决方案。 Activity 绝对简略,仅有流程引擎,没有表单引擎。在BPM的钻研畛域, 很多的学者,专家都是把流程引擎与表单引擎离开的流程定义是线下依照bpmn2.0规范去形容业务流程,通常应用activiti-explorer(web控制台)或activiti-eclipse-designer插件对业务流程进行建模,这两种形式都遵循bpmn2.0规范。劣势从技术组成来看,Activiti最大的劣势是采纳了PVM(流程虚拟机),反对除了BPMN2.0标准之外的流程格局,与内部服务有良好的集成能力,连续了jBPM3、jBPM4良好的社区反对,服务接口清晰,链式API更为优雅Activiti上手比拟快,界面也比拟简洁、直观Activiti 绝对丰盛的材料,并且高度与 SpringBoot 集成成熟、稳固、满足BPMN2.0标准用户泛滥,社区沉闷,趋势良好易于上手,基于Spring、MyBatis罕用互联网技术堆栈作为技术底层劣势长久化层没有遵循JPA标准Activiti 对表单的反对目前还是比拟弱的,流程表单设计还是须要开发人员去解决Activiti的简略demo试验不难,然而若想结合实际业务灵便应用Activiti,须要破费不少工夫。 flowable简介2016 年 10 月,Activiti 工作流引擎的次要开发者来到 Alfresco 公司并在 Activiti 分支根底上开启了 Flowable 开源我的项目,是Activiti的一个分支activiti5以及activiti6、flowable是Tijs Rademakers团队开发的。Activiti7是 Salaboy团队开发的。activiti6以及activiti5代码目前有 Salaboy团队进行保护。因为Tijs Rademakers团队去开发flowable框架了,所以activiti6以及activiti5代码曾经交接给了 Salaboy团队(能够了解为到职之前工作交接)。目前的activiti5以及activiti6代码还是原Tijs Rademakers原有团队开发的。Salaboy团队目前在开发activiti7框架。对于activiti6以及activiti5的代码官网曾经声称暂停保护了。activiti7就是噱头 内核应用的还是activiti6。并没有为引擎注入更多的新个性,只是在activiti之外的下层封装了一些利用。activiti6的很多框架bug在flowable框架中曾经修复的差不多了,能够实现零老本从activiti迁徙到flowable也新增了很多性能,如flowable反对jms、rabbitmq、mongodb等形式解决历史数据jBPM简介jBPM是公开源代码我的项目,jBPM在2004年10月18日,公布了2.0版本,并在同一天退出了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBoss jBPM。劣势jBPM最大的劣势是采纳了Apache Mina异步通信技术,采纳JPA/JTA长久化方面的规范,以功能齐全的Guvnor作为流程仓库,有RedHat(http://jBoss.org被红帽收买)的专业化反对劣势对本身技术依赖过紧且目前仅反对BPMN2JBPM 网上集成的材料甚少,且新版本绝对比拟轻便。jBPM7次要与JBoss下的规定引擎集成较好jFlow简介jFlow属于济南驰骋信息技术有限公司的开源我的项目,向社会100%开源。研发于2003年,到始终继续到当初,功能强大丰盛,图形化的配置,功能性配置较高,在中国国情下成长起来的优良的工作流引擎。在国内有肯定的市场位置,是国内驰名的老牌工作流引擎。前身ccFlow,.NET开源的工作流. jFlow是java版本劣势jFlow是JFlow流程引擎+CCForm的表单引擎的有机联合,内容绝对简单,配置程度较高,施行周期短,上手快。劣势Activiti引擎: 1、介绍1、建模业务流程的规范规定,一个流程由一个流动或多个流动组成。事件Event:Start开始,end完结,IntermediateCatching两头流动Activity:User Task用户工作,Service Task服务工作,Sub Process子流程网关GateWay:InclusiveGateWay并行网关,ExclusiveGateWay排他网关,EventGateWay事件网关2、应用个别状况下都是通过创立BPMN进行业务流程建模,两种形式,idea插件或者eclipse插件,通过符号创立流程。Activiti插件叫actiBPM,官网对应的idea只更新到了2019.1.4版本(应用idea2019.1.4之前的版本上面步骤根本能够跳过),往后的idea版本都不能够应用,往后的版本能够应用Activiti BPMN visualize这个插件,相差不大装置实现后能够看见 右键创立好的BPMN文件能够看到 ![2022-03-16_150849.png](/img/bVcYyzl)装置流程图设计器camunda-modeler基于 bpmn.io的面向 BPMN DMN和CMMN的集成建模解决方案,camunda-modeler是一款内部流程设计器,同一般装置软件一样装置完后双击.exe程序即可应用,也能够通过IDEA装置内部Tool应用。链接:https://pan.baidu.com/s/1b9ZQHwuRZZUU7N3UW-qmtQ提取码:juzi装置解压即可应用idea配置camunda-modeler 右键滑到External Tools有显示设计器即可 3、入门 第一步:增加maven依赖 <!-- 对立治理版本activiti 的相干包 mysql的驱动包 mybatis log4j 数据库链接池--> <properties> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.12</log4j.version> <activiti.version>7.0.0.Beta1</activiti.version> </properties> <dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> </dependency> <!-- bpmn 模型解决 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>${activiti.version}</version> </dependency> <!-- bpmn 转换 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-converter</artifactId> <version>${activiti.version}</version> </dependency> <!-- bpmn json数据转换 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>${activiti.version}</version> </dependency> <!-- bpmn 布局 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-layout</artifactId> <version>${activiti.version}</version> </dependency> <!-- activiti 云反对 --> <dependency> <groupId>org.activiti.cloud</groupId> <artifactId>activiti-cloud-services-api</artifactId> <version>${activiti.version}</version> </dependency> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- 链接池 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> </dependencies>第二步:创立activiti的xml配置文件activiti.cfg.xml,放在配置文件目录下 ...

March 17, 2022 · 2 min · jiezi

关于工作流:Flowable实战八BPMN20-任务

 工作是流程中最重要的组成部分。Flowable提供了多种工作类型,以满足理论需要。 罕用工作类型有: 用户工作Java Service工作脚本工作业务规定工作执行监听器工作监听器多实例 集成扩大的工作类型有: 手动工作Java接管工作Shell工作弥补处理器Web Service工作邮件工作Http工作Camel工作Mule工作 工作的图形都是以一个圆角矩形为根底,在左上角增加具体类型的图标。 一、罕用的工作类型1.1 用户工作1.1.1 形容 “用户工作(user task)”指须要人工执行的工作。当流程执行达到用户工作时,流程实例会进行期待,直到用户触发实现工作动作。 1.1.2 图示 用户工作用左上角有一个小用户图标的规范工作(圆角矩形)示意。 1.1.3 XML示意 用户工作在XML中如下定义。其中id是必须属性,name是可选属性。 <userTask id="theTask" name="重要工作" />1.1.4 到期日期 每个工作都能够设置到期日期(due date)。 能够指定固定工夫或绝对工夫,比方,当dueDate为“PT30M”时,示意达到工作30分钟后到期。 到期日期必须合乎java.util.Date或java.util.String(ISO8601格局)。 理论利用,咱们指定为变量值。 <userTask id="theTask" name="Important task" flowable:dueDate="${dateVariable}"/> 工作的到期日期能够应用TaskService,或者在TaskListener中应用传递的DelegateTask批改。 1.1.5 工作指派指派确定的办理人 <userTask id="theTask" name="重要工作" flowable:assignee="jinyangjie"/>指派潜在办理人 <userTask id="theTask" name="重要工作" flowable:candidateUsers="jinyangjie, zhangsan" />指派潜在办理组 <userTask id="theTask" name="重要工作" flowable:candidateGroups="leader, manager" /> 更多任务指派的内容,已在“用户和组”的篇章中介绍,这里不再赘述。 1.2 Java Service工作1.2.1 形容 Java Service工作(Java service task)用于调用Java类。Java Service不属于BPMN2.0标准,而是Flowable的自定义扩大。 1.2.2 图示 服务工作用左上角有一个小齿轮图标的圆角矩形示意。 1.2.3 XML示意 有三种办法申明如何调用Java逻辑,上面别离介绍: 调用固定的类 应用flowable:class属性提供全限定类名(fully qualified classname),指定流程执行时调用的类,该类必须实现JavaDelegate或ActivityBehavior接口。 ...

January 15, 2022 · 4 min · jiezi

关于工作流:LRNet自定义工作流可视化配置

工作流是对工作流程及其各操作步骤之间业务规定的形象、概括形容。工作流建模,行将工作流程中的工作如何前后组织在一起的逻辑和规定,在计算机中以失当的模型表白并对其施行计算。工作流所解决的次要问题就是为实现某个业务指标,利用计算机在多个参与者之间按某种预约规定主动传递文档、信息或者工作。简而言之,工作流就是对业务的流程化形象。 而工作流引擎则是驱动工作流实现的一套工具。工作流引擎使得企业处理过程自动化,并通过将工作分解成定义良好的工作、角色,依照肯定的规定和过程来执行这些工作并对他们进行监控,使人以及各种利用相互之间协调工作,实现某我的项目工作,达到进步办公效率、升高生成老本、进步企业生成经营管理水平和企业竞争力。 LR.Net低代码开发平台配置功能强大的工作流引擎,贯通于整个协同办公平台,连贯买通其它各个利用模块之间的工作协同,能够帮忙用户自行定义基于企业业务模式和管理模式所须要的各种流程利用,疾速构建企业本身的流程管控体系。 其工作流的设计过程灵便弹性,全程可视化操作,用户通过利落拽等形式来绘制流程,并通过对于环节的配置来实现环节操作、环节表单、环节参与者的配置。 以下图为例,用户进入[流程设计]界面,点击[新增],即可进入工作流设计界面。 界面又栏输出流程属性,设定好[模板编号]、[模板名称]、[模板图标]等根本信息,在左侧的绘制界面定义流程步,拖放工具栏的图标来设置定义步骤类型,入口步骤、进口步骤、告诉模式、人员、角色、发送告诉的内容等。 最初抉择[发动权限],设定应用人员,点击[保留],即可开始运行该流程。 而一个好的工作流零碎,必须是灵便可配置的,作为工作流引擎嵌入其余业务零碎中,提供专属的流程服务;作为工作流治理服务中心部署在撑持层,为多个业务零碎同时提供流程服务。LR.Net除了流程设计之外,还下设了泛滥功能模块。 流程发动,用户在此模块内发动流程,让办公流程对立治理,更加标准。 流程工作。在此模块内用户可查看本人的审批工作、委托工作、已办工作等,工作内容高深莫测,程序查问更加不便。 流程监控。这里显示发动的所有流程,监控流程进度,能够查看不同状态流程的流程内容,流程进度及流转记录,同时操作指派审核人和停止流程性能。 流程委托。用户转交给他人办理的工作。工作流程中的审批人呈现某段时间不在岗的状况,可在流程委托中指定代理人、工夫、委托审批的流程,代理人在指定工夫内继承委托人审批权限。 签章治理。反对线上电子盖章,省去线下的繁琐流程及工夫。 LR.Net低代码开发平台将企业日常流程全程电子化、流程化、智能化,企业可依据个性化业务需要自定义场景流程,满足企业各种简单流程、自在流程需要实现企业流程自动化运作,节俭外部经营老本,提成企业管控能力,具备弱小的组织控制力同时能无效打消流程断点,让流程流转更高效、用户体验更敌对,达到从“人找事”向“事找人”智能转变。更多残缺性能请返回www.learun.cn/Home/VerificationForm进行体验。

January 12, 2022 · 1 min · jiezi

关于工作流:Flowable实战四BPMN20-启动与结束事件

一、BPMN2.0 BPMN2.0标准是一个规范,开源框架和不同供应商都遵循这份规范,使得最终用户不会因为依赖专有解决方案,而被供应商“绑架”。有了BPMN2.0规范,不同解决方案之间的迁徙,变得非常简略平滑。 毛病则是规范通常是不同观点大量探讨与斗争的后果,有些构造或办法会非常轻便。Flowable在实现标准的根底上进行了性能和应用性扩大。 自定义扩大是在规范形式的根底上进行简化。因而当你决定应用自定义扩大时,依然能够用规范形式。应用自定义扩大时,总是通过flowable:命名空间前缀,明确标识出XML元素、属性等。Flowable引擎也反对activiti:命名空间前缀。 注:在官网文档中,启动和完结事件已有较具体的介绍,是英文版。启动和完结事件是流程里重要的内容,当初做个汇总整顿。 二、启动事件 启动事件(start event)是流程的终点。 启动事件在XML中,类型由子元素申明来定义。启动事件放弃等待状态,直到特定的触发器被触发。启动事件是细线图形。2.1 空启动事件2.1.1 形容 空启动事件(none Start Event),指的是未指定触发器,由用户调用的启动事件。 2.1.2 图示 空启动事件用空心圆圈示意,两头没有图标(也就是说,没有触发器)。 2.1.3 XML示意 空启动事件的XML示意格局,就是一般的启动事件申明,而没有任何子元素(其余品种的启动事件都有用于申明其类型的子元素)。 <startEvent id="start" name="my start event" />2.1.4 应用办法: ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();2.1.5 自定义扩大 formKey: 援用表单定义,用户须要在启动时填写的表单。(目前只需理解到启动事件能够绑定表单即可,具体内容在表单章节中解说。) <startEvent id="request" flowable:formKey="simpleForm" />2.2 定时器启动事件2.2.1 形容 定时器启动事件(timer start event)在指定工夫内创立一次或屡次的流程实例。 定时器启动事件,在流程部署的同时就开始计时。不须要调用startProcessInstanceByXXX就会在工夫启动。调用startProcessInstanceByXXX时会在定时启动之外额定启动一个流程。当部署带有定时器启动事件的流程的更新版本时,上一版本的定时器作业会被移除。这是因为通常并不心愿旧版本的流程依然主动启动新的流程实例。2.2.2 图示 定时器启动事件,用其中有一个钟表图标的圆圈来示意。 2.2.3 XML示意 定时器启动事件的XML示意格局,是一般的启动事件申明加上定时器定义子元素。 定时器定义必须且只能蕴含下列的一种元素: timeDate。这个元素指定了ISO 8601格局的固定工夫。在这个工夫就会触发触发器。例如: <timerEventDefinition> <timeDate>2022-01-11T12:13:14</timeDate> </timerEventDefinition>timeDuration。要定义定时器须要期待多长时间再触发,同样应用ISO 8601格局(BPMN 2.0标准要求)。例如(期待10天): <timerEventDefinition> <timeDuration>P10D</timeDuration> </timerEventDefinition>timeCycle。指定反复周期,可用于周期性启动流程。例如(反复三次启动,每次距离为10小时,到指定工夫时完结反复): <timerEventDefinition> <timeCycle>R3/PT10H/2022-01-12T23:59:59+00:00</timeCycle> </timerEventDefinition>也能够应用变量,如${EndDate} <timerEventDefinition> <timeCycle>R3/PT10H/${EndDate}</timeCycle> </timerEventDefinition>2.3 音讯启动事件2.3.1 形容 音讯启动事件(message start event)应用具名音讯启动流程实例。音讯名用于定位指定的启动事件。 ...

January 11, 2022 · 2 min · jiezi

关于工作流:Azkaban工作流调度

作者:あおざき 起源:恒生LIGHT云社区 1.Azkaban介绍Azkaban是由linkedin(领英)公司推出的一个批量工作流任务调度器,用于在一个工作流内以一个特定的程序运行一组工作和流程。Azkaban应用job配置文件建设工作之间的依赖关系,并提供一个易于应用的web用户界面保护和跟踪你的工作流。 Azkaban性能特点:1.提供性能清晰,简略易用的Web UI界。2.提供job配置文件疾速建设工作和工作之间的依赖关系。3.提供模块化和可插拔的插件机制,原生反对command、Java、Hive、Pig、Hadoop。 2.Azkaban原理 mysql服务器: 存储元数据,如项目名称、我的项目形容、我的项目权限、工作状态、SLA规定。 AzkabanWebServer:对外提供web服务,使用户能够通过web页面治理。职责包含项目管理、权限受权、任务调度、监控executor。 AzkabanExecutorServer:负责具体的工作流的提交、执行。 3.Azkaban三种部署模式(1)solo server mode:该模式中webServer和executorServer运行在同一个过程中,过程名是AzkabanSingleServer。应用自带的H2数据库。这种模式蕴含Azkaban的所有个性,但个别用来学习和测试。 (2)two server mode:该模式应用MySQL数据库, Web Server和Executor Server运行在不同的过程中。 (3)multiple executor model:该模式应用MySQL数据库, Web Server和Executor Server运行在不同的机器中,且有多个Executor Server,该模式实用于大规模利用。 4.Azkaban源码编译Azkaban3.x在装置前须要本人编译成二进制包,并且提前装置好Maven、Ant、Node等软件。 (1)编译环境: yum install –y gityum install –y gcc-c++(2)下载源码解压 wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gztar -zxvf 3.51.0.tar.gz cd ./azkaban-3.51.0/(4)编译源码 ./gradlew build installDist -x testGradle是一个基于Apache Ant和Apache Maven的我的项目自动化构建工具。-x test 跳过测试。编译胜利之后就能够在指定的门路下获得对应的安装包了。 #solo-server模式安装包门路azkaban-solo-server/build/distributions/#two-server模式和multiple-executor模式web-server安装包门路azkaban-web-server/build/distributions/#two-server模式和multiple-executor模式exec-server安装包门路azkaban-exec-server/build/distributions/ azkaban-db/build/distributions/数据库相干安装包门路5.Azkaban装置部署这里只介绍solo server模式部署 (1)解压配置 mkdir /export/servers/azkabantar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz –C /export/servers/azkaban/vim conf/azkaban.propertiesdefault.timezone.id=Asia/Shanghai #批改时区vim plugins/jobtypes/commonprivate.properties增加:memCheck.enabled=falseazkaban默认须要3G的内存,残余内存不足则会报异样(2)启动验证 cd azkaban-solo-server-0.1.0-SNAPSHOT/bin/start-solo.sh(3)登录web页面 拜访Web Server=>http://node-1:8081/ 默认用户名明码azkaban ...

December 24, 2021 · 1 min · jiezi

关于工作流:LR审批流程设计一站式解决办公难题

在企业运行中,有些工作须要上级领导们的层层批准。公司外部的审批流程都是标准化的,然而这些审批流程简单且耗时长,大大拖慢了工作的推动速度。尽管很多公司在摸索审批流程信息化,但依然没有达到便捷自动化的解决审批流程,公司整体生产力和员工工作效率仍旧没有失去大幅提高。 当初管理模式在大多数企业中并不受器重,经济效益永远都是企业放在首位的指标,然而如果企业中存在着大量治理方面的问题,那迟早有一天这些问题会浮现,造成不可挽回的损失。很多企业根底管理水平差,如岗位操作不标准、流程审批效率低下、部门之间合作无序、沟通效率低下、打算治理流于形式、常识文档管理混乱、行政指令传播迟缓、文化建设没有章法等,然而借助合乎企业个性的OA零碎可无效晋升管理水平。 利用力软疾速开发框架的OA零碎能够全面笼罩日常利用场景,定制化开发的工作流能够帮忙突破层层审批效率慢的问题。流程审批的单据重要信息,发起人和审批者对单据信息高深莫测;更重要的是审批流程与组织框架智能协同,自在增加审批人,能够疾速申请审批流程,及时做出审批决策。 一.角色在企业中,每个人都会有本人的岗位职责和层级之分,不同的岗位和层级定位不一样,须要实现的工作也不一样。在审批流程中,大抵形象划分为两类: 流程的发起人是一个流程的所有者,也是比较关心审批停顿的人,发起人实现的次要是事务性、操作性的工作。从发起人的角度来说,在创立完审批事项后,还须要欠缺相干信息、督促审批人及时审批、解决驳回修改意见、从新提交等。发起人角度设计的要点是:兼容对立发动入口和业务场景触发罕用的审批事项要不便找到有对立汇总的审批治理页面。 审批人在流程中须要实现的次要是决策性的工作,因而在审批人的视角,内容和操作都应该尽量精简。只看到最重要的信息,防止信息过多影响判断只进行必要操作,不能有过多抉择或过多输出,影响决策效率对立的页面进行审批操作和治理须要有审批历史,以便追溯。 二.内容 依据审批事项的不同,流转内容也会有所不同。对于审批流程最外围的内容,简化内容流程一是能够加重发起人的工作累赘,二是能进步决策的准确性和效率。 在审批的过程中,有时候须要让不同的审批人查看不同的内容,且限定有些人有批改权限而有些人只有只读权限。 三.流程 串行流程就是每一个审批环节的人审批通过后,才会进入到下一个环节。每个环节的驳回,能够依据业务须要,设计成驳回到发起人、驳回到上一个环节或驳回到指定环节从新审批,或兼而有之,做为选项供审批人抉择。 并行流程是一个审批环节须要几个人或角色审批通过才算通过,能够有以下两种形式:任意一个人审批通过即进入下一环节和必须所有人审批通过才进入下一环节。 四.动作 通过审批由审批人操作,是否须要输出通过起因、通过起因是否必填须要依据理论业务状况决定。 驳回批改动作由审批人操作,和通过不同,为了让发起人晓得如何批改申请事项。 从新提交则由发起人操作,和驳回批改是对应的。 勾销动作可选,发起人申请须要批改能够抉择勾销申请从新提交。 更多审批流程设计可返回www.learun.cn/Home/VerificationForm进行体验。

November 25, 2021 · 1 min · jiezi

关于工作流:企业运行助推器力软工作流引擎

工作流在企业中承当着“生命血液”的作用,它是指为实现某个业务指标,利用计算机将文档、信息或工作在多个参与者之间按某种预约规定进行主动传递,促成执行。而让所有流程循序渐进地创立、流转、实现,是办公线上化的重要性能。 工作流是协同办公的一部分。在日常办公中,每一项工作都有一套流程,而且各流程都有相应的业务规定。只有信息在人与人、人与零碎或者零碎与零碎之间进行传递,就必须构建工作流。 例如一个文档管理系统,它须要经验上传报告→合法性验证→审核评估→零碎评分→评估报告→认证→公布的流程,这个流程内容简单,手续繁多,这种状况下,就有必要引入工作流引擎帮忙清晰跟进我的项目施行状况,疾速剖析数据。 工作流引擎是一种能够用来实现工作流的组件化工具,是供业务流程可视化设计、治理和管制业务流程的运行,并在理论执行过程中可动静批改业务流程的低代码开发平台的一种核心技术。它让用户可自主搭建简单表单、配置流程审批节点,生成用户可应用的表单与工作流,不须要从头开发,从而达到疾速上线新流程、流程性能和格调配置对立的目标。 因为业务流程中的每一步操作都会波及到不同的人和事,以传统的线下纸质办公形式进行,效率必然非常低下。利用工作流引擎实现工作流,不仅能够确保流程审批及时进行,审批过程更加不便,而且流程治理更加清晰高效,高深莫测。在信息化的场景下,只需接入工作流,流程发起人就能在零碎上填表单、提交表单。接着,流程就会依照预设的规定去执行,把文档、信息或工作发送给相干人员,让事项失去及时处理。此外,相干人员还能随时查问工作流程的进度或过往记录。 它个别领有流程的节点治理、流向治理、流程样例治理等重要性能。其中的“发送、退回、移交、流程完结”等操作,就相当于汽车主动驾驶零碎的“主动启动、折返、更换路线、达到起点”等指令。以销假流程为例,填写销假申请单、审核申请单,都对应着一个业务模块,而工作流引擎就负责把这些业务模块串起来,实现业务流的流转。 现在,越来越多的平台为企业提供工作流引擎让其自主配置工作流,比方LeaRun工作流引擎,业务流程界面可视化配置,用户可用利落拽的形式来操作节点,并间接在右侧配置属性信息,以此实现跨零碎的业务编排组合。 在LeaRun工作流引擎中,管理员能够对审批流程进行全程预览监控,对在途单据进行审批调整,并为流程优化提供参考,晋升工作效率。 LeaRun工作流引擎内还具备弱小的表单设计器,并且反对集成企业微信、ERP、CRM、HRM等支流帮助与研发治理,配合丰盛的API接口、为企业提供一站式打造数据互通互连,满足不同企业外部团队差异化需要,可灵便适配。 在数字化时代里,在线办公成为了企业的常态,搭建工作流也成为企业节约老本、提高效率的必然选择。LeaRun工作流引擎基于利落拽的形式拼接出一个直观残缺的业务流,并且作为独自的工作流产品可能满足用户的个性化需要,让企业面对简单的市场环境,时刻都有高效的信息系统配合撑持,在竞争中占据劣势、放弃当先。 工作流引擎演示案例:www.learun.cn/Home/VerificationForm 文.LeaRun

October 27, 2021 · 1 min · jiezi

关于工作流:如何在云效上设计工作流和创建看板

如何在云效上设计工作流和创立看板,团队利用看板办法的指标:顺畅、高质量地交付无效价值,看板的设计须要服务于这一指标,所以看板的设计,要实在和清晰的反映团队合作交付价值的过程,做到体现价值、反映合作和裸露问题。 作者:舍卫|阿里巴巴团体技术专家 看板设计可分四个步骤进行: 1、剖析价值流动过程(工作流的剖析)2、选取可视化设计元素3、用看板建模价值流动过程4、如何在云效上配置工作流和看板 1、剖析价值流动过程 剖析价值流动过程是看板设计的根底。为了剖析价值流,须要辨认团队交付的价值类型,个别团队交付的价值类型包含业务需要、关联需要、改良类需要和其余工作,而往往业务需要占团队工作的比重比拟大,这里围绕业务需要来设计工作流。 如下图所示,首先要确定的是价值流动所经验的次要工作步骤,如剖析、开发、测试等,在图中用绿色方框示意;在这些步骤之间可能会发现显著的交接或期待,如打算后期待开始实现,开发实现后向测试移交等,在图中用红色方框示意。期待环节尽管没有具体的工作,却也占用了价值流动的工夫,并可能产生积压,也须要辨认进去。 2、选取可视化设计元素 看板设计应用可视化元素建模和反映价值流动过程。 队列 用户需要在某个状态停留会造成队列。停留的起因有两种,第一是工作正在被解决,如开发中和测试中等;第二是期待进入下一个环节,如开发实现和期待验收等。对应的,看板上的列也分为工作列和期待列。 如下图,典型状况下,看板上的工作列和期待列交替呈现,需要从左至右流经各个列。 列的划分可细可粗,细的譬如能够把开发阶段分成设计、编码、自测和评审等,粗的譬如合并开发和测试阶段,统称为实现阶段。 具体细化到哪一个级别,依赖于两点:其一,工作是否会改阶段显著停留,其二,使用者是否须要特地关注这些阶段。 另一个问题是从哪个阶段开始,到哪个阶段完结。实践上,端到端的看板应该从用户的问题开始,到用户的问题被解决完结,造成业务闭环。而理论利用中,团队能够从本人能影响到的部分流程开始,并随着工夫的推移,再寻求向上游和上游延长,以促成整个组织的合作和需要端到端的顺畅流动。 以阿里外部某全功能研发团队的实际为例,看板的起始阶段是”已抉择”,失常终止状态是”已公布“ 确定了看板的起止阶段后,就能够依据团队的状况设置两头的各阶段了。 工作项 在看板上流动的根本单元包含业务需要、关联需要、改良类需要和其余工作,这里的其余工作个别蕴含开发工作和测试过程中发现的缺点,所有业务需要、开发工作和缺点都会在看板上进行流动。 3、用看板建模价值流动 在后面两步的根底上,咱们能够设计团队的看板了,看板的设计过程是综合选取价值流动过程和可视化元素,即可建设可视化的看板。 如下图所示,是在云效上建设的看板,需要的阶段包含待处理(需要池)、已抉择、剖析中、就绪(待开发)、开发中、待测试、测试中、待发布和已公布 这里有两个阶段须要特地阐明一下: 已抉择:由业务方和开发团队代表共同完成,清晰要解决的问题和要达成的指标后,并通过可行性剖析,按优先级放入已抉择队列。 就绪(待开发):就绪队列在研发团队正式开始开发之前,是研发团队的输出队列,其意思是需要已筹备好了,处于能够开始开发的状态,比方:用户的需要已清晰,团队了解了用户的需要,相干的依赖和关联关系曾经确认等。就绪队列也是研发团队与其上游产品团队的交接点,是看板系统设计的必选项。 4、如何在云效上配置工作流和看板 咱们以在云效上建设以”麻利开发“为模板的我的项目为例子。 阐明立刻体验:云效项目管理看板 需设置需要、缺点和工作的工作流,这里重点讲需要工作流的配置,缺点和工作应用默认的工作流即可。 • 设置需要工作流的入口: • 编辑需要工作流,增加、批改和删除需要状态 • 配置实现的需要工作流 • 配置实现的看板视图如下,需做到用户价值驱动,前后职能拉通和左右模块对齐。 总结 在云效上设计工作流和创立看板中可视化价值流动是整个团队合作交付价值的根底,团队依据各自上下文,提供不同的服务,交付不同类型的价值,价值流动过程也不同,看板系统设计必须从剖析团队具体的价值流开始,抉择和利用最正当的视觉元素,设计出适宜团队本身的云效看板。

September 24, 2021 · 1 min · jiezi

关于工作流:存储元宇宙智能让数据更有价值

元宇宙正在从科幻走向事实,存储作为元宇宙和事实世界的重要支柱之一,它同时领有虚拟世界与事实世界大量数据积淀,使元宇宙这个概念落地的重大突破口便在于盘活存储中的海量数据,让4K、8K、VR、AR、XR 等等内容具备更高遍及度,渗透到各畛域与阶层。随着元宇宙逐步成型,视频流量将只增不减,因而,凭借AI技术辅助存储业务减速各大厂商对内容生态的构建是存储的重要课题,各类型视频内容的解决能力高下将成为吸引用户的决定性因素。 在这样的强需要下,腾讯云对象存储 COS 依靠 数据万象(Cloud Infinite,CI)集成了一套残缺的端到云到端的数据存储、智能解决、公布等“一站式”云上智能存储解决方案---“数据工作流”,其中蕴含一系列针对音视频方面品质晋升、降本增效的智能解决能力,开启智能存储全链路降级。 1 画质晋升、片源降级极速高清—更小更好的视频COS工作流中的极速高清性能能够实现最低的码率状况下晋升视频的主观画质,挑战编码极限,集成了画质修复与加强、内容自适应参数抉择、V265编码器等一整套视频解决解决方案让视频更小更清晰,可能保障低网络资源耗费的同时带给用户视觉上更佳体验。 成果展现: https://www.bilibili.com/vide... 视频加强系列性能—低画质视频品质晋升视频加强系列对视频进行综合剖析与评估,借力 AI 技术提供细节加强、色调加强、SDR to HDR 动静范畴变换、超分辨率、降噪、修复等性能,从各维度晋升视频画质。实用于降级老旧片源、画面丑化加强。 超分辨率辨认图片的内容与轮廓高清重建图片的细节与部分特色,通过一系列低分辨率的图像来失去一幅高分辨率的图像,可与视频加强搭配应用降级老旧片源。 2 升高前期及人工成本HDR to SDR 动静范畴下变换COS 率先达成互联网视听节目规范,在存储环节解决视频素材不同类型的终端适配问题,防止画面失真,过曝、过暗的状况, 应用 COS 的媒体解决可能使下变换后视频的明暗细节最大水平贴近原视频,将视频原汁原味地出现给用户。 精彩集锦COS的精彩集锦性能,可能做到在海量视频中智能精准地提取视频中的精彩片段,利用多模态内容了解技术,对视频的内容、动作姿势、场景进行多维度辨认与聚合,以匹配业余编辑的水准迅速剪辑生成视频中进球霎时、副歌低潮、综艺爆笑点,实用于体育赛事、娱乐综艺、大型晚会等各种场景,帮用户大幅缩小人工剪辑老本 成果展现:https://www.bilibili.com/vide... 人声拆散人声拆散可能将同一素材中的人声与背景音拆散开来生成新的独立音频文件,便于您后续对剥离了伴奏、杂音的素材做其余格调的艺术加工。 体验链接:https://cloud.tencent.com/log... 官网链接:https://cloud.tencent.com/doc... — END —

September 3, 2021 · 1 min · jiezi

关于工作流:activiti工作流审批系统轻松落地请假审批demo从流程绘制到审批结束实例

前言activiti工作流,企业erp、oa、hr、crm等审批零碎轻松落地,销假审批demo从流程绘制到审批完结实例。 一、我的项目模式springboot+vue+activiti集成了activiti在线编辑器,疾速开发平台,可插拔工作流服务。 二、我的项目介绍本我的项目领有用户治理,部门治理,代码生成,零碎监管,报表,大屏展现,业务审批等性能。性能太强大,只能粗矿的介绍,所见即所得,体验一下吧。 三、工作流1.流程模型绘制进入流程模型菜单,创立流程模型,这里波及到网关流转,须要设置流转条件,咱们这里是三十岁以上的走上面分支,三十岁以下的走下面的分支。点击分支线,设置流转条件即可。${age<=30}。保留后咱们在列表中点击公布即可。 2.流程配置公布后,就到了已公布模型列表,在启用之前,咱们须要先对进行节点设置和关联具体单据。 审批人员能够依据角色,间接指定人,部门,部门负责人,发起人部门负责人来进行配置,基本上满足所有的流转需要,并且能够设置表单变量。 设置流程表单,目前就做了一个销假的测试表单,并且能够对相应角色受权,做到自定义权限。 设置完后启动即可。 3.流程提交填写销假表单 提交单据,优先级分为一般,重要,紧急。音讯告诉能够抉择站内告诉,短信,邮件。 提交之后能够撤回单据。 查看流程流转进度状况。 也能够挂起,删除流程。 4.流程审批办理人审批列表,能够解决单据(驳回或者通过),也能够委托别人待办。 审批通过。 委托别人待代。 审批通过后进入已办列表。 年龄大于30岁,进入上面分支流转。 审批通过。 5.待办信息推送站内音讯推送。 总结下面只是展现了平台的审批流性能,还有其余很多性能没展现进去,本人也写了一些十分好用的组件,做到零碎麻利疾速开发,大大减少开发工夫和老本,目前正在对接挪动端审批。之前因为没有工夫去部署线上测试环境,思考近期部署,目前能够独自找我,近程演示,有须要源码的分割我。q:2500564056。 鸣谢: jeecgboot开源版http://jeecg.com/ 咖啡兔activiti实战https://kafeitu.me/

September 3, 2021 · 1 min · jiezi

关于工作流:工作流引擎Activiti的使用进阶详细分析工作流框架中高级功能的使用示例

Activiti高级性能简介Activit的高级用例,会超过BPMN 2.0流程的领域,应用Activiti高级性能须要有Activiti开发的明确指标和足够的Activiti开发教训 监听流程解析bpmn 2.0 xml文件须要被解析为Activiti外部模型,而后能力在Activiti引擎中运行.解析过程产生在公布流程或在内存中找不到对应流程的时候,这时会从数据库查问对应的xml对于每个流程 ,BpmnParser类都会创立一个新的BpmnParse实例.这个实例会作为解析过程中的容器来应用解析过程: 对于每个BPMN 2.0元素,引擎中都会有一个对应的org.activiti.engine.parse.BpmnParseHandler实例解析器会保留一个BPMN 2.0元素与BpmnParseHandler实例的映射默认Activiti应用BpmnParseHandler来解决所有反对的元素同时也应用BpmnParseHandler来提供执行监听器,以反对流程历史能够向Activiti引擎中增加自定义的org.activiti.engine.parse.BpmnParseHandler实例常常应用的用例是把执行监听器增加到对应的环节,来解决一些事件队列.Activiti在外部就是这样进行历史解决的要想增加这样的自定义处理器,须要为Activit减少配置: <property name="preBpmnParseHandlers"><list> <bean class="org.activiti.parsing.MyFirstBpmnParseHandler" /></list></property><property name="postBpmnParseHandlers"><list> <bean class="org.activiti.parsing.MySecondBpmnParseHandler" /> <bean class="org.activiti.parsing.MyThirdBpmnParseHandler" /></list></property>当自定义处理器外部逻辑对解决程序有要求时须要思考: 配置到preBpmnParseHandlers的BpmnParseHandler实例会增加在默认处理器的后面配置到postBpmnParseHandlers的BpmnParseHandler实例会增加在默认处理器的前面接口- org.activiti.engine.parse.BpmnParseHandler: public interface BpmnParseHandler {Collection<Class>? extends BaseElement>> getHandledTypes();void parse(BpmnParse bpmnParse, BaseElement element);}在BpmnParseHandler接口中: getHandledTypes()办法会翻译这个解析器解决的所有类型的汇合,这些都是BaseElement的子类,返回汇合的泛型限度也阐明了这一点也能够继承AbstractBpmnParseHandler类并重写getHandledType()办法,这样就只须要返回一个类型,而不是一个汇合这个类也蕴含须要默认解析处理器所须要的办法BpmnParseHandler实例只有在解析器拜访到这个办法返回的类型时才会被调用示例: 当BPMN 2.0 xml蕴含process元素时,就会执行executeParse办法中的逻辑这是一个曾经实现类型转换的办法,替换BpmnParseHandler接口中的parse办法 public class TestBPMNParseHandler extends AbstractBpmnParseHandler<Process> {protected Class<? extends BaseElement> getHandledType() {return Process.class;}protected void executeParse(BpmnParse bpmnParse, Process element) { ..}}留神: 在编写自定义解析处理器时,不要应用任何解析BPMN 2.0构造的外部类,这会导致呈现问题很难定义应该实现BpmnParseHandler接口或集成外部抽象类 org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler也能够替换默认的BpmnParseHandler实例,把解析BPMN 2.0元素替换为解析Activiti外部模型: <property name="customDefaultBpmnParseHandlers"><list>...</list></property>示例: 将所有工作强制设置为异步 public class CustomUserTaskBpmnParseHandler extends ServiceTaskParseHandler {protected void executeParse(BpmnParse bpmnParse, ServiceTask serviceTask) { // Do the regular stuff super.executeParse(bpmnParse, serviceTask); // Make always async ActivityImpl activity = findActivity(bpmnParse, serviceTask.getId()); activity.setAsync(true);}}反对高并发的UUID的ID生成器在高并发的场景中,默认的ID生成器可能因为无奈很快的获取新ID区域而导致异样所有流程引擎都有一个ID生成器,默认的ID生成器会在数据库划取一块ID范畴,其余引擎不能应用雷同范畴的ID在引擎运行期间,当默认的ID生成器发现曾经越过ID范畴时,就会启动一个新事务来取得新范畴.在极限的状况下,高负载会导致问题对于大部分状况,默认ID生成曾经足够: ...

June 13, 2021 · 2 min · jiezi

关于工作流:工作流Activiti框架中LDAP组件详细解析实现对工作流目录信息的访问控制

Activiti集成LDAP简介企业在LDAP零碎中保留了用户和群组信息,Activiti提供了一种解决方案,通过简略的配置就能够让activit连贯LDAP 用法要想在我的项目中集成LDAP,须要在pom.xml中增加activiti-ldap依赖: <dependency><groupId>org.activiti</groupId><artifactId>activiti-ldap</artifactId><version>latest.version</version></dependency>用例集成LDAP有两大用例: 通过IdentityService进行认证: 应用Activiti Explorer 通过LDAP登录取得用户的组: 在查问用户能够看到哪些工作时十分重要,比方任务分配给一个候选组 配置集成LDAP是通过向流程引擎配置中的configurators注入 org.activiti.ldap.LDAPConfigurator的实例来实现的这个类是高度可扩大的: 如果默认的实现不合乎用例的话,能够很容易的重写办法,很多依赖的bean都是可插拔的 <bean id="processEngineConfiguration" class="...SomeProcessEngineConfigurationClass"> ... <property name="configurators"> <list> <bean class="org.activiti.ldap.LDAPConfigurator"> <!-- Server connection params --> <property name="server" value="ldap://localhost" /> <property name="port" value="33389" /> <property name="user" value="uid=admin, ou=users, o=activiti" /> <property name="password" value="pass" /> <!-- Query params --> <property name="baseDn" value="o=activiti" /> <property name="queryUserByUserId" value="(&(objectClass=inetOrgPerson)(uid={0}))" /> <property name="queryUserByFullNameLike" value="(&(objectClass=inetOrgPerson)(|({0}=*{1}*)({2}=*{3}*)))" /> <property name="queryGroupsForUser" value="(&(objectClass=groupOfUniqueNames)(uniqueMember={0}))" /> <!-- Attribute config --> <property name="userIdAttribute" value="uid" /> <property name="userFirstNameAttribute" value="cn" /> <property name="userLastNameAttribute" value="sn" /> <property name="groupIdAttribute" value="cn" /> <property name="groupNameAttribute" value="cn" /> </bean> </list> </property> </bean>'属性org.activiti.ldap.LDAPConfigurator可配置的属性:属性名形容类型默认值serverLDAP服务器地址String portLDAP运行的端口int user连贯LDAP应用的账号用户名String password连贯LDAP应用的明码String initialContextFactory连贯LDAP应用的InitialContextFactory名称Stringcom.sun.jndi.ldap.LdapCtxFactorysecurityAuthentication连贯LDAP时设置的java.naming.security.authentication属性值StringsimplecustomConnectionParameters能够设置那些没有对应setter的连贯参数,这些属性用来配置连接池,特定的平安设置等等.所有提供的参数都会用来创立LDAP连贯Map<String,String> baseDn搜寻用户和组基于的DN(显著名称)String userBaseDn搜寻用户基于的DN(distinguished name).如果没有提供,会应用baseDnString groupBaseDn搜寻群组基于的DN.如果没有提供,会应用baseDnString searchTimeLimit搜寻LDAP的超时工夫,单位毫秒Long1 hqueryUserByUserId应用用户Id搜寻用户的查问语句:(&(objectClass=inetOrgPerson)(uid={0})), LDAP中所有蕴含inetOrgPerson类的匹配uid属性的值都会返回.如果只设置一个查问无奈满足特定的LDAP设置,能够抉择应用LDAPQueryBuilder, 这样就会提供比单纯应用查问减少更多功能String queryUserByFullNameLike应用全名搜寻用户的查问语句:(& (objectClass=inetOrgPerson) (({0}={1})({2}={3})) ),LDAP中所有蕴含inetOrgPerson类的 匹配first name和last name的值都会返回.留神{0}会替换为firstNameAttribute,{1}和{3}是搜寻内容. {2}是lastNameAttribute. 如果只设置一个查问无奈满足特定的LDAP设置,能够抉择应用LDAPQueryBuilder, 这样就会提供比单纯应用查问减少更多功能String queryGroupsForUser应用搜寻指定用户的组的查问语句: (&(objectClass=groupOfUniqueNames)(uniqueMember={0})) ,LDAP中所有蕴含groupOfUniqueNames类的提供的DN(匹配用户的DN)是uniqueMember的记录都会返回.{0}会替换为用户Id.如果只设置一个查问无奈满足特定的LDAP设置,能够抉择应用LDAPQueryBuilder, 这样就会提供比单纯应用查问减少更多功能String userIdAttribute匹配用户Id的属性名.这个属性用来在查找用户对象时,关联LDAP对象与Activiti用户对象之间的关系String userFirstNameAttribute匹配first name的属性名.这个属性用来在查找用户对象时,关联LDAP对象与Activiti用户对象之间的关系String userLastNameAttribute匹配last name的属性名.这个属性用来在查找用户对象时,关联LDAP对象与Activiti用户对象之间的关系String groupIdAttribute匹配组Id的属性名.这个属性用来在查找组对象时,关联LDAP对象与Activiti组对象之间的关系String groupNameAttribute匹配组名的属性名.这个属性用来在查找组对象时,关联LDAP对象与Activiti组对象之间的关系String groupTypeAttribute匹配组类型的属性名.这个属性用来在查找组对象时,关联LDAP对象与Activiti组对象之间的关系String 高级属性: 心愿批改默认行为或批改组缓存时应用属性名形容类型默认值ldapUserManagerFactory设置LDAPUserManagerFactory的自定义实例,如果默认实现不满足需要LDAPUserManagerFactory的实例 ldapGroupManagerFactory设置LDAPGroupManagerFactory的自定义实例,如果默认实现不满足需要LDAPGroupManagerFactory的实例 ldapMemberShipManagerFactory设置LDAPMembershipManagerFactory的自定义实例,如果默认实现不满足需要.不常常应用因为失常状况下LDAP会本人治理关联关系LDAPMembershipManagerFactory的实例 ldapQueryBuilder设置自定义查问结构器,如果默认实现不满足需要.LDAPQueryBuilder实例用在LDAPUserManager和LDAPGroupManager中,执行对LDAP的查问. 默认实现会应用配置的queryGroupsForUser和queryUserById属性org.activiti.ldap.LDAPQueryBuilder的实例 groupCacheSize组缓存的大小.这是一个LRU缓存,用来缓存用户的组,能够防止每次查问用户的组时,都要拜访LDAP.如果值小于0,就不会创立缓存.默认为-1,所以不会进行缓存int-1groupCacheExpirationTime设置组缓存的过期工夫,单位为毫秒.当获取特定用户的组时,并且组缓存也启用,组会保留到缓存中,并应用这个属性设置的工夫:当组在00:00被获取,过期工夫为30分钟,那么所有在00:30之后进行的查问都不会应用缓存,而是再次去LDAP查问.因而,所以在00:00-00:30进行的查问都会应用缓存long1 h留神: 在应用流动目录AD时 ,InitialDirContext须要设置为Context.REFERRAL能够通过customConnectionParameters传递 ...

June 12, 2021 · 1 min · jiezi

关于工作流:工作流中容器化的依赖注入Activiti集成CDI实现工作流的可配置型和可扩展型

Activiti工作流集成CDI简介activiti-cdi模块提供activiti的可配置型和cdi扩大activiti-cdi的个性: 反对 @BusinessProcessScoped beans, 绑定到流程实例的cdi bean流程为cdi bean反对自定义EL处理器应用注解为流程实例提供申明式管制Activiti能够挂接在cdi事件总线上反对Java EE和Java SE, 反对Spring反对单元测试要在maven我的项目中应用activiti-cdi,须要增加依赖: <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-cdi</artifactId> <version>5.8</version></dependency>activiti-cdi 5.6以上的版本会主动退出activiti-entin和spring 设置activiti-cdiActiviti cdi能够装置在不同环境中 查找流程引擎cdi扩大须要拜访到ProcessEngine, 为了实现此性能: 应用org.activiti.cdi.spi.ProcessEngineLookup接口在运行期间进行查找cdi模块应用默认的名为org.activiti.cdi.impl.LocalProcessEngineLookup的实现,应用ProcessEngines这个工具类来查找ProcessEngine默认配置下,应用ProcessEngines#NAME_DEFAULT来查找ProcessEngine.这个类可能是应用自定义名称的子类==留神:== 须要把activiti.cfg.xml放在classpath下Activiti cdi应用java.util.ServiceLoader SPI解决org.activiti.cdi.spi.ProcessEngineLookup的实例 为了提供接口的自定义实现,须要创立一个文本文件,名为META-INF/services/org.activiti.cdi.spi.ProcessEngineLookup, 在文件中须要指定实现的全类名如果你没有提供自定义的org.activiti.cdi.spi.ProcessEngineLookup实现,activiti会应用默认的LocalProcessEngineLookup实现,须要做的就是把activiti.cfg.xml放到classpath下 配置Process Engine理论的配置依赖于选用的ProcessEngineLookup策略在这里次要联合LocalProcessEngineLookup探讨可用的配置,要求在classpath下提供一个spring的activiti.cfg.xmlActiviti提供了不同的ProcessEngineConfiguration实现,次要是依赖理论应用的事务管理策略activiti-cdi模块对事务的要求不严格,意味着任何事务管理策略都能够应用,即使是spring事务形象层cdi模块提供两种自定义ProcessEngineConfiguration实现: org.activiti.cdi.CdiJtaProcessEngineConfiguration: activiti的JtaProcessEngineConfiguration的子类,用于在activiti应用JTA治理的事务环境org.activiti.cdi.CdiStandaloneProcessEngineConfiguration: activiti的StandaloneProcessEngineConfiguration的子类,用于在activiti应用简略JDBC事务环境JBoss7下的activiti.cfg.xml: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- lookup the JTA-Transaction manager --> <bean id="transactionManager" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:jboss/TransactionManager"></property> <property name="resourceRef" value="true" /> </bean> <!-- process engine configuration --> <bean id="processEngineConfiguration" class="org.activiti.cdi.CdiJtaProcessEngineConfiguration"> <!-- lookup the default Jboss datasource --> <property name="dataSourceJndiName" value="java:jboss/datasources/ExampleDS" /> <property name="databaseType" value="h2" /> <property name="transactionManager" ref="transactionManager" /> <!-- using externally managed transactions --> <property name="transactionsExternallyManaged" value="true" /> <property name="databaseSchemaUpdate" value="true" /> </bean></beans>在Glassfish 3.1.1,假如配置好名为jdbc/activiti的datasource: ...

June 11, 2021 · 2 min · jiezi

关于工作流:Activiti中工作流的生命周期详细解析一个BPMN流程示例带你认识项目中流程的生命周期

BPMN 2.0介绍业务流程模型注解(BusinessProcess Modeling Notation - BPMN)是业务流程模型的一种规范图形注解.这个规范是由对象治理组(Object Management Group - OMG)保护的BPMN标准的2.0版本容许增加准确的技术细节在BPMN的图形和元素中,同时制订BPMN元素的执行语法.通过应用XML语言来指定业务流程的可执行语法,BPMN标准曾经演变为业务流程的语言,能够执行在任何兼容BPMN2的流程引擎中,同时仍然能够应用弱小的图形注解简略来说,BPMN即图标与标签的联合 定义一个流程创立一个新的XML文件并命名,确认文件后缀为 .bpmn20.xml或 .bpmn, 否则引擎无奈公布BPMN 2.0根节点是definitions节点. 这个元素中,能够定义多个流程定义(不过倡议每个文件只蕴含一个流程定义, 能够简化开发过程中的保护难度)一个空的流程定义如下所示:留神definitions元素起码也要蕴含xmlns和 targetNamespace的申明 targetNamespace能够是任意值,它用来对流程实例进行分类 <definitionsxmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:activiti="http://activiti.org/bpmn"targetNamespace="Examples"><process id="myProcess" name="My First Process">..</process></definitions>能够抉择增加线上的BPMN 2.0格局地位: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd==process元素有两个属性:==id: 这个属性是必须的,对应着Activiti ProcessDefinition对象的key属性.id能够用来启动流程定义的流程实例,通过RuntimeService的startProcessInstanceByKey办法 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");==留神:== 它和startProcessInstanceById办法不同:这个办法冀望应用Activiti引擎在公布时主动生成的id.能够通过调用processDefinition.getId() 办法取得这个值,生成的id的格局为 key:version, 最大长度限度为64个字符, 如果在启动时抛出了一个ActivitiException: 阐明生成的id太长了,须要限度流程的key的长度 name: 这个属性是可选的, 对应ProcessDefinition的name属性.引擎本人不会应用这个属性,是用来在用户接口显示便于浏览的名称 BPMN流程示例前提曾经装置Activiti并且可能运行Activiti Demo应用了独立运行的H2服务器批改db.properties,设置其中的jdbc.url=jdbc:h2:tcp://localhost/activiti,而后启动独立服务器 指标学习Activiti和一些根本的BPMN 2.0概念最终后果是一个简略的Java SE程序能够公布流程定义,通过Activiti引擎API操作流程应用一些Activiti相干的工具,构建本人的业务流程web利用 用例每个月都要给公司领导一个金融报表,由会计部门负责当报表实现时,一个上级领导须要审批文档,而后能力发给所有领导 流程图流程的图形化BPMN 2.0标记:空开始事件(左侧圆圈),前面是两个用户工作:制作月度财报和验证月度财报,最初是空完结事件(右侧粗线圆圈) XML内容在业务流程的XML中很容易找到流程的次要元素: (空)开始事件是流程的入口用户工作是流程中与操作者相干的工作申明: 第一个任务分配给accountancy组第二个任务分配给management组当流程达到空完结事件就会完结这些元素都应用连线连贯,这些连线领有source和target属性,定义了连线的方向 <definitions id="definitions"targetNamespace="http://activiti.org/bpmn20"xmlns:activiti="http://activiti.org/bpmn"xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"> <process id="financialReport" name="Monthly financial report reminder process"> <startEvent id="theStart" /> <sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportTask' /> <userTask id="writeReportTask" name="Write monthly financial report" > <documentation> Write monthly financial report for publication to shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>accountancy</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <sequenceFlow id='flow2' sourceRef='writeReportTask' targetRef='verifyReportTask' /> <userTask id="verifyReportTask" name="Verify monthly financial report" > <documentation> Verify monthly financial report composed by the accountancy department. This financial report is going to be sent to all the company shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>management</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <sequenceFlow id='flow3' sourceRef='verifyReportTask' targetRef='theEnd' /> <endEvent id="theEnd" /> </process></definitions>启动一个流程实例创立好业务流程的流程定义,就能够创立流程实例一个流程实例对应了特定月度财报的创立和审批,所有流程实例都共享同一个流程定义为了应用流程定义创立流程实例,首先要公布业务流程: ...

May 31, 2021 · 3 min · jiezi

关于工作流:springbootvue前后端分离整合activiti在线流程编辑器

一、平台介绍基于springboot,vue开发的前后端疾速开发平台,集成了activiti工作流,可间接用来开发OA,ERP,HR,CRM等利用。 二、平台性能1.系统管理模块用户治理角色治理菜单治理部门治理我的部门职务治理通讯录数据字典零碎布告多租户2.流程模块流程模型:公布,设计流程。已公布模型:启用禁用,节点设置,转为模型。所有流程:所有已公布模型对立治理,发动流程。我的申请:发动对应的业务表单申请,关联具体的模型。审批待办:审批操作,包含通过,驳回,委托,查看流程流转状况。审批已办:查看流程流转状况。进行中的流程:能够挂起流程,查看以后我提交的单据,我参加过审批单据的流转状况。已实现的流程:展现已实现的流程。流程审批操作音讯告诉3.在线开发在线表单开发:做到0代码开发,间接配置配置,性能就进去了,也不必设计数据表,具体性能太强大,一言半语不迭尝试一下。在线报表配置零碎编码规定4.系统监控路由网关定时工作日志治理数据日志SQL监控性能监控三、平台演示https://blog.csdn.net/weixin_...

May 28, 2021 · 1 min · jiezi

关于工作流:工作流引擎使用详解工作流框架Activiti的详细配置以及安装和使用

创立ProcessEngineActiviti流程引擎的配置文件是名为activiti.cfg.xml的XML文件.留神与应用Spring形式创立流程引擎是不一样的应用org.activiti.engine.ProcessEngines类,取得ProcessEngine: ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()它会在classpath下搜寻activiti.cfg.xml,并基于这个文件中的配置构建引擎 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" /> <property name="jdbcDriver" value="org.h2.Driver" /> <property name="jdbcUsername" value="sa" /> <property name="jdbcPassword" value="" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <property name="mailServerHost" value="mail.my-corp.com" /> <property name="mailServerPort" value="5025" /></bean></beans>配置文件中应用的ProcessEngineConfiguration能够通过编程形式创立,能够配置不同的bean id ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName); // 配置不同的bean idProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);如果不应用配置文件进行配置,就会基于默认创立配置 ProcessEngineConfiguration.createXXX() 办法都会返回ProcessEngineConfiguration,后续能够调整成所需的对象. 在调用buildProcessEngine()后, 就会创立一个ProcessEngine: ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE).setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000").setJobExecutorActivate(true).buildProcessEngine();ProcessEngineConfiguration beanactiviti.cfg.xml必须蕴含一个id='processEngineConfiguration' 的bean <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">这个bean会用来构建ProcessEngine. 有多个类能够用来定义processEngineConfiguration. 这些类对应不同的环境,并设置了对应的默认值: org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration: 独自运行的流程引擎.Activiti会本人处理事务.默认数据库只在引擎启动时检测(如果没有Activiti的表或者表构造不正确就会抛出异样)org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration: 单元测试时的辅助类.Activiti会本人管制事务. 默认应用H2内存数据库,数据库表会在引擎启动时创立,敞开时删除.应用它时,不须要其余配置(除非应用job执行器或邮件性能)org.activiti.spring.SpringProcessEngineConfiguration: 在Spring环境下应用流程引擎org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration: 独自运行流程引擎,并应用JTA事务 数据库配置定义数据库配置参数基于数据库配置参数定义数据库连贯配置 jdbcUrl: 数据库的JDBC URLjdbcDriver: 对应不同数据库类型的驱动jdbcUsername: 连贯数据库的用户名jdbcPassword: 连贯数据库的明码基于JDBC参数配置的数据库连贯 会应用默认的MyBatis连接池,配置MyBatis连接池: jdbcMaxActiveConnections: 连接池中处于被应用状态的连贯的最大值.默认为10jdbcMaxIdleConnections: 连接池中处于闲暇状态的连贯的最大值jdbcMaxCheckoutTime: 连贯被取出应用的最长工夫,超过工夫会被强制回收. 默认为20000(20秒)jdbcMaxWaitTime: 这是一个底层配置,让连接池能够在长时间无奈取得连贯时, 打印一条日志,并从新尝试获取一个连贯.(防止因为谬误配置导致缄默的操作失败) 默认为20000(20秒) ...

May 27, 2021 · 4 min · jiezi

关于工作流:BPMN工作流的基本概念详解工作流框架Activiti

工作流工作流简介工作流(Workflow): 工作流就是通过计算机技术对业务流程进行自动化治理。实现多个参与者依照预约的流程去主动执行业务流程。 定义: 通过计算机对业务流程自动化执行治理次要解决的是: 使在多个参与者之间依照某种预约义的规定主动进行传递文档,信息或工作的过程.从而实现某个预期的业务指标,或者促使此指标的实现工作流管理系统的指标: 管理工作的流程以确保工作在正确的工夫被冀望的人员所执行在自动化进行的业务过程中插入人工的执行和干涉工作流框架: Activiti,JBPM,OSWorkFlow,WorkFlow工作流框架底层须要有数据库提供反对 工作流术语工作流引擎ProcessEngine对象: 这是Activiti工作的外围.负责生成流程运行时的各种实例及数据,监控和治理流程的运行 BPM业务流程治理: 是一种以规范化的结构端到端的卓越业务流程为核心,以继续的进步组织业务绩效为目标的系统化办法常见商业治理教育如EMBA,MBA等均将BPM蕴含在内 BPMN业务流程建模与标注: 这些图如何组合成一个业务流程图(Business Process Diagram)探讨BPMN的各种的用处:包含以何种精度来影响一个流程图中的模型BPMN作为一个规范的价值BPMN将来倒退的近景 流对象一个业务流程图有三个流对象的外围元素 事件 一个事件用圆圈来形容,示意一个业务流程期间产生的货色事件影响流程的流动.个别有一个起因(触发器)或一个影响(后果)基于它们对流程的影响,有三种事件:开始事件,两头事件,终止事件流动 用圆角矩形示意,一个流程由一个流动或多个流动组成条件 条件用菱形示意,用于管制序列流的分支与合并。能够作为抉择,包含门路的分支与合并外部的标记会给出控制流的类型 Activiti开源工作流框架Activiti简介Activiti是一个开源的工作流引擎,它实现了BPMN 2.0标准,能够公布设计好的流程定义,并通过api进行流程调度Activiti 作为一个听从 Apache 许可的工作流和业务流程治理开源平台,其外围是基于Java的超疾速,超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员Activiti 流程引擎重点关注在零碎开发的易用性和轻量性上.每一项BPM业务性能Activiti流程引擎都以服务的模式提供给开发人员.通过应用这些服务,开发人员可能构建出功能丰富,轻便且高效的BPM应用程序 Activiti服务构造Activiti零碎服务结构图外围类: ProcessEngine: 流程引擎的形象,能够通过此类获取须要的所有服务服务类: XxxService: 通过ProcessEngine获取,Activiti将不同生命周期的服务封装在不同Service中,包含定义,部署,运行.通过服务类可获取相干生命周期中的服务信息 ==RepositoryService== Repository Service提供了对repository的存取服务Activiti中每一个不同版本的业务流程的定义都须要应用一些定义文件,部署文件和反对数据(例如BPMN2.0XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中==RuntimeService== Runtime Service提供了启动流程,查问流程实例,设置获取流程实例变量等性能.此外它还提供了对流程部署,流程定义和流程实例的存取服务==TaskService== Task Service提供了对用户Task和Form相干的操作.它提供了运行时工作查问,支付,实现,删除以及变量设置等性能==HistoryService== History Service用于获取正在运行或曾经实现的流程实例的信息,与Runtime Service中获取的流程信息不同,历史信息蕴含曾经长久化存储的永恒信息,并曾经被针对查问优化==FormService== 应用Form Service能够存取启动和实现工作所需的表单数据并且依据须要来渲染表单Activiti中的流程和状态Task均能够关联业务相干的数据==IdentityService== Identity Service提供了对Activiti零碎中的用户和组的治理性能Activiti中内置了用户以及组治理的性能,必须应用这些用户和组的信息能力获取到相应的TaskManagementService Management Service提供了对Activiti流程引擎的治理和保护性能这些性能不在工作流驱动的应用程序中应用,次要用于 Activiti 零碎的日常保护外围业务对象: org.activiti.engine.impl.persistence.entity包下的类,包含Task,ProcessInstance,Execution等依据不同职责实现相应接口的办法(如须要长久化则继承PersistentObject接口),与传统的实体类不同 Activiti组件==Activiti上下文组件Context:== 用来保留生命周期比拟长,全局性的信息,相似Application.次要包含如下三类: CommandContext: 命令上下文-保留每个命令必要的资源,如长久化须要的sessionProcessEngineConfigurationImpl: 流程引擎相干配置信息-整个引擎全局的配置信息.如数据源DataSource等.该对象为单例,在流程引擎创立的时候初始化ExecutionContext: 持有ExecutionEntity对象==长久化组件:== Activiti应用mybatis作OR映射,并在此基础上减少设计了本人的长久化框架在流程引擎创立时初始化,顶层接口Session,SessionFactorySession有两个实现类: DbSqlSession: 负责sql表达式的执行AbstractManager: 负责对象的长久化操作SessionFactory有两个实现类: DbSqlSessionFactory: 负责DbSqlSession相干操作GenericManagerFactory: 负责AbstractManager相干操作==Event-Listener组件:== Activiti容许客户代码染指流程执行,提供了事件监听组件监听的事件类型: TaskListenerJavaDelegateExpressionExecutionListenerProcessEngineConfigurationImpl持有DelegateInterceptor的某个实例,不便调用handleInvocation==Cache组件== DbSqlSession中有cache的实现Activiti基于List和Map来做缓存:如查问时先查缓存,没有则间接查问并放入缓存==异步执行组件== Activiti能够执行工作,JobExecutor为其外围类,JobExecutor蕴含三个次要属性: ...

May 27, 2021 · 1 min · jiezi

关于工作流:实用流程工具浅析LRNET配置型工作流引擎

在企业信息化过程中,软件系统始终是无奈绕过的话题,一套优良的企业信息系统至多应该要领有好看敌对的交互界面,稳固的数据库信息替换,满足理论业务需要的高效程序逻辑等,这将在肯定水平上保障其易用性。 稳固,是为了保证系统的可靠性;界面,是为了操作的便捷性;逻辑,是为了保障流程高效,这样能够在业务流程发生变化,例如决策权的扭转、组织构造的变动时,随之变换的全新业务逻辑。 想领有一套灵便工作流机制的OA、ERP等管理系统的企业不在少数,基于企业的理论需要,很多软件公司也在近些年开发了针对企业的工作流零碎,LEARUN.NET工作流便是其中之一,大略思路如下。 首先定义每个操做,就是定义流程步,定义流程步次要包含:操作的接口地址、操作参数、操作类型(起始操作、两头操作等)。定义操作的目标是接着为每个操作设置关系和定义流程时选用这些定义好的操作步。 第二定义操作的参数,有了接口地址外,还须要定义操作参数。 第三是定义操作步之间的关系。就是定义一个流程中每个操作步的前驱、后继的操作步。 第四是定义流程了,必要的信息是流程名称等根本信息和定义流程的各个操作步以及流转规定。流程根本信息就不用说了。流程步定义比较复杂,设置定义步骤类型(起始、两头、终结),入口步骤、进口步骤、告诉模式、人员、角色、发送告诉的内容。 第五是波及跳步状况的定义,比方须要依据参数的不同提交到不同的步骤进行审批,这里叫做流程步骤变迁规定设置。设置的内容须要:原步骤、指标步骤、变迁方向(正/负)、条件规定(判断参数时用与还是用或)。接着设置参数和参数值及比拟条件。 第六是受权治理。这个比较简单了,判断被提交的人是否处于受权状态,从而进行受权解决。 以上所说只是根底方向,理论编写过程中要思考各种简单状况,案例请参阅“learun”.

December 31, 2020 · 1 min · jiezi

关于工作流:net-core增强工作流组件基于稳定平台多项目整合开发

工作流是企业信息系统的外围和灵魂,在公司治理和运行中引入审批工作流,代替本来的纸质申请和审批,能够无效进步公司的运行效率以及公司管理制度的规范化。 通常,工作流所蕴含的页面内容基本上没有大的差异,更多的是在外部逻辑数据的解决上,能够关注一下几点: 一.角色 在企业中,每个人都会有本人的岗位职责和层级之分,不同的岗位和层级定位不一样,须要实现的工作也不一样。 在审批流程中,大抵形象划分为两类: 1.发起人 流程的发起人是一个流程的所有者,也是比较关心审批停顿的人,发起人实现的次要是事务性、操作性的工作。从发起人的角度来说,在创立完审批事项后,还须要欠缺相干信息、督促审批人及时审批、解决驳回修改意见、从新提交等。发起人角度设计的要点是:兼容对立发动入口和业务场景触发罕用的审批事项要不便找到有对立汇总的审批治理页面。 2.审批人 审批人在流程中须要实现的次要是决策性的工作,因而在审批人的视角,内容和操作都应该尽量精简: 只看到最重要的信息,防止信息过多影响判断只进行必要操作,不能有过多抉择或过多输出,影响决策效率对立的页面进行审批操作和治理须要有审批历史,以便追溯。 二. 内容 提炼最小汇合依据审批事项的不同,流转内容也会有所不同。对于审批流程的设计来说,须要在理论业务中提炼出最外围的内容,一则能够加重发起人的工作累赘(发动一个审批要填一堆的材料置信没人会开心),二则能够进步决策的准确性和效率。 例如一个销假审批流程,外围就是销假工夫、事由和销假类型;而一个立项投决的审批,则须要重点展现立项会的表决后果,同时还须要把会议记录做为附件带上,以便在必要时能够查看,在交互上,这里同样须要留神内容的归类、收纳。 设计要点总结如下: 内容尽可能精炼有些内容是必要的,但零碎能够自行获取就不要让发起人再输出一遍预置罕用的内容,用抉择的形式代替输出的形式,同时也进步了内容的规范性。 查看和批改在审批的过程中,有时候须要让不同的审批人查看不同的内容,且限定有些人有批改权限而有些人只有只读权限,这都会在前面的“权限”里总结。 三. 流程 自主选定审批人流程这是一种比拟轻量、灵便的审批流程模式,实用于公司规模不大、流程没有标准化的状况。要点是发起人发动一个审批事项并提交时,须要自行抉择下一个环节的审批人。而下一个环节的审批人审批通过后,能够抉择持续流转到再下一个人去审批,或者完结这个流程。 串行流程串行流程就是每一个审批环节的人审批通过后,才会进入到下一个环节。每个环节的驳回,能够依据业务须要,设计成驳回到发起人、驳回到上一个环节或驳回到指定环节从新审批,或兼而有之,做为选项供审批人抉择。 并行流程并行流程是一个审批环节须要几个人或角色审批通过才算通过,能够有以下两种形式: 任意一个人审批通过即进入下一环节必须所有人审批通过才进入下一环节 上述第一个形式比拟好了解,第二个形式和串行流程容易混同,即同样是要多集体审批,到底是一个接一个、还是同时通过才算通过?到底用哪种形式,区别是审批人是不是同一个级别,并行的形式其实相似于同级别的会签,而串行形式适宜有高低层级关系的状况。 并行流程的驳回则绝对简略,个别是设计成有一个人驳回则该环节即算驳回。 条件触发流程条件触发流程在审批工作流中也比拟常见,设计上就是某个审批环节要由谁/或哪个角色审批,须要取决于条件判断。例如金额低于1万元由财务总监审批通过后即完结,金额在1万元以上则由副总裁审批通过后即完结。 混合流程混合流程顾名思义就是混合了以上几种流程,还是以上述金额审批为例,咱们批改成:金额低于1万元的,由财务审批通过后即完结;金额在1万元到10万元的,须要先由财务审批,之后交由副总裁审批通过后即完结;金额高于10万元的,须要由董事长和总裁一起审批通过后才完结。 四. 动作 通过通过动作由审批人操作,是否须要输出通过起因、通过起因是否必填须要依据理论业务状况决定。总结就是:简略申请不须要填写通过起因,或者起因选填通过起因须要填的话,可用于反馈或激励发起人的状况。 驳回批改驳回批改动作由审批人操作,和通过不同,为了让发起人晓得如何批改,驳回起因个别须要设定成必填项,否则发起人或上一个审批环节的人不晓得为何被驳回、以及要如何批改。 驳回批改可依据业务须要,在以下逻辑中抉择: 驳回到发起人驳回上一环节驳回到选定的之前的某个审批环节。 从新提交从新提交由发起人操作,和驳回批改是一一对应的。设计上要留神,审批人审批从新提交的内容时,须要附带上一次驳回批改的起因。 勾销勾销动作可选,一般来说是发起人勾销,而不是审批人勾销,起因如下: 审批人只关怀一个审批事务过去后,判断并决策是通过还是驳回勾销和驳回含意容易混同,辨别不开 在设计上,咱们还能够做到发起人是否可勾销可由配置项进行配置。 五. 权限 权限的管制贯通在审批流程的方方面面,上述的角色、内容、流程和动作都会波及到权限的管制。权限体系的设计是一个大工程,在审批流程中,采纳基于角色的访问控制体系(RBAC)是一个不错的抉择: “基于角色的访问控制体系,包含用户、角色、指标、操作、许可权五个根本数据元素,每个角色至多具备一个权限,每个用户至多表演一个角色,能够对齐全不同的角色调配完全相同的拜访权限,用户和角色是多对多的关系。” 设计要点总结如下: 操作和许可权内容,可辨别为性能权限和数据权限什么人能够发动什么审批,由性能权限管制什么人/角色在整个审批流程中可见什么数据,由数据权限管制什么人/角色能够审批什么环节,由独立的审批配置管制。 六. 配置和扩展性 审批工作流的配置灵便度和开发复杂度成反比,具体要灵便到什么水平,须要由业务需要决定。个别针对公司开发的中后盾零碎,灵活性绝对较少,而面向多个公司的商业化的零碎,则灵活性要求大大提高。配置的灵活性体现在以下方面: 审批流程的类型可批改具体的审批环节可增删改各个环节审批人/角色可配置审批相干的权限可变更 七. 效率 工作流的外围指标是进步企业运行效率,如果线上审批流程效率还不如原来的纸质操作,那这个流程的设计就是失败的,也失去了意义。因而,在实现整个审批流程的设计之后,咱们还须要花大精力对流程的效率进行扫视和优化。对于审批流程效率的晋升,总结就是:审批的操作尽可能精简,且操作含意明确只要求输出必要的表单待审批事项及时告诉到审批人审批停顿及时告诉发起人发起人可抉择被动督促审批人做好下一步操作的疏导。 总结 审批流程是中后盾工作流的根底利用,咱们在设计的过程中,把握的外围要点是“提高效率,标准治理”,在设计过程中要时时回头扫视,免得脱离了这个最重要的指标。 流程案例可参考learun麻利开发框架,这是基于asp.net/java为根底的业务平台,能够便捷的开发出OA、ERP、CRM、MIS、SAAS、BPM、挪动app、电商后盾等多种比拟实用的企业信息系统,详情参阅learun.cn. 牧码人.

November 18, 2020 · 1 min · jiezi

关于工作流:配置企业管理系统什么样的工作流才有用

工作流是企业应用开发过程中十分重要的一部分,简直常见的治理、业务类零碎都与工作流有千头万绪的分割。 工作流作为利用零碎的一部分,依据角色、分工和条件的不同,来解决信息传递路由、内容等级问题的外围解决方案。 罕用的工作流应蕴含节点治理、流向治理、流程样例等根底性能。 优良的企业应用,其美观大方的零碎界面是最根底的局部;数据库之间的信息替换是必备条件;而保障利用零碎的功能性、符合性、稳定性和易维护性则是重中之重。 思考到前期的维护性,能够采纳模块化和结构化应用程序,这样在业务流程发生变化时(决策权扭转、组织构造变动)能迅速产生全新业的务逻辑。而且,如果应用程序不足齐备高效的逻辑层(通常由工作流引擎实现),就会容易呈现信息的路由谬误和运行效率低下这一类问题。 在架构上,面向服务的体系结构,是一个组件模型,它将应用程序的不同性能单元通过这些服务之间定义的接口和契约分割起来。接口定义采纳中立形式进行,它独立于硬件、零碎和编程语言。工作流引擎使得构建在这类零碎中的服务,能够对立通用的形式进行交互。 LeaRun规范工作流引擎 在早前,很多企业都迫切需要一套灵便的OA工作流机制,于是有越来越多人开始利用Domino来构建;起初当ASP.NET呈现时,大家犹如醍醐灌顶个别,各团体高层都开始要求应用工作流引擎实现企业流程审批信息化。 基于市场的理论需要,咱们最开始开发了规范的ASP.NET企业级工作流引擎(LeaRun),并取得相干认证,各项指标及客户反映都不错,所以随后的java平台也连续了其设计思维: 首先定义流程步骤,次要包含:操作的接口地址、操作参数、操作类型(起始操作、两头操作)。其目标是为每个操作设置好相干关系,在定义流程时即可选用设置好的流程步骤。 其次定义操作的参数,是除接口地址外的另一必须项。 再次是定义流程操作步骤之间的关系。即定义一个流程中每个操作步的前驱、后继的操作。 而后定义流程,其内容包含根本信息和流程定义中的各操作步骤、流转规定。流程根本信息无需赘述。流程步骤定义比较复杂,设置定义步骤类型(起始、两头、终结),入口步骤、进口步骤、告诉模式、人员、角色、告诉发送的内容。 之后定义波及跳步的状况,如需依据不同参数提交到相应的步骤进行审批,这里叫做流程步骤变迁规定设置。其须要设置的内容:原步骤、指标步骤、变迁方向(正/负)、条件规定(判断“与”、“或”运算)。接着设置参数、值、比拟条件。 最初治理受权。该项较简略,判断被提交的人是否处于受权状态,从而进行相干解决。 上述所说是流程的大抵逻辑,理论编写过程中思考的状况会更为简单,如需案例参考,请搜寻“力软”进行查看。 Windy.

November 6, 2020 · 1 min · jiezi

关于工作流:flowable中终止流程二

终止流程代码 public void stopProcessInstanceById(String processInstanceId) { ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if (processInstance != null) { //1、获取终止节点 List<EndEvent> endNodes =findEndFlowElement(processInstance.getProcessDefinitionId()); String endId = endNodes.get(0).getId(); //2、执行终止 List<Execution> executions = runtimeService.createExecutionQuery().parentId(processInstanceId).list(); List<String> executionIds = new ArrayList<>(); executions.forEach(execution -> executionIds.add(execution.getId())); runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); log.info("终止processInstanceId:{}胜利",processInstanceId); }else { log.info("不存在运行的流程实例processInstanceId:{},请确认!",processInstanceId); }}public List findEndFlowElement(String processDefId) { Process mainProcess = repositoryService.getBpmnModel(processDefId).getMainProcess(); Collection<FlowElement> list = mainProcess.getFlowElements(); if (CollectionUtils.isEmpty(list)) { return Collections.EMPTY_LIST; } return list.stream().filter(f -> f instanceof EndEvent).collect(Collectors.toList());}坑1:网上搜寻的一些帖子中,只调用 ...

September 27, 2020 · 1 min · jiezi

关于工作流:工作流引擎你所不知道的事开源软件诞生16

渊远流长的工作流--第16篇 用日志记录“开源软件”的诞生 工作流定义工作流诞生于企业治理和办公自动化的须要,它是针对日常工作中的业务流程管控而产生的一个概念。目标是将工作步骤分解成的工作,依据肯定的准则和逻辑来实现这些工作并加以监控,从而实现更加无效的业务流程治理、更加标准的业务制度执行。 工作流不是审批流看了工作流的定义,可能你认为曾经懂了或者你认为还很形象,没关系,咱们先来探讨一个常见的了解误区:工作流就是审批流。既然说了是误区,那这个了解必定就是谬误的。只是很多人在接触工作流时往往都是通过OA外面的审批流,所以才有了这个误区。当然审批流必定是属于工作流,但它只是工作流的一个利用。 上面咱们再次回到工作流上,其实这是两个词的组合,一个是工作、一个是流程,所以从特点上曾经表露无遗。首先它得是要实现的一个工作,肯定是企业对人的一个治理要求,喝水它不是工作。其次这个工作必须要经验一个流程能力做完,并且在过程中要产生数据的变动,也就是说流程中必须要做点什么影响它。比如说下班打卡,它就不是流程,不需应用工作流。 到此,我想大家应该曾经比拟清晰为什么工作流不是审批流,因为审批只是咱们日常工作中的一项工作而已,其余的工作只有波及流程,它也是工作流,能够应用工作流零碎实现管控。 工作流的利用 (1)主业务流程:订单、洽购、合同审核、供应链治理、仓储治理等 (2)行政治理类:出差申请、加班申请、销假申请、用车申请、各种办公用品申请、日报周报等 (3)人事管理类:员工培训、绩效考核、工资发放流程、职员招聘等 (4)财务相干类:收付款、发票治理、费用报销、打算估算等 (5)客户服务类:客户信息管理、客户投诉、售后服务等 (6)非凡服务类:ISO治理流程、品质治理流程、进出口报关流程、物流跟踪解决流程等 举个栗子下面说了很多工作流可利用的场景,上面咱们就来找一个典型的案例来剖析一下整个处理过程。以打算估算的制订为例来解说。失常每个公司都会在年底制订一套打算估算来管控第二年的支出和收入,以保障按计划实现一年的指标。个别流程如下: (1)公司个别会制订一个顶层的规定,包含估算下限、估算事项和科目、估算制订的颗粒度等,而后下发。 (2)公司的所有部门会依据公司制订的规定以及部门外部本人的布局制订一个部门估算,包含:人力、行政、财务、信息、业务等各个部门。 (3)制订实现后,上报上级领导审批,并通过几轮商议并敲定。 (4)各部门的估算确定后,会有专人汇总估算并核查公司的规定,接着交给董事会审批。 (5)审核后,会有专人负责从新下发给各部门以及外部发文告诉。 打算估算这个例子,比拟典型,因为它蕴含了审批、蕴含了业务解决、甚至蕴含了不同零碎的合作。由此可见,波及到应用工作流的场景往往是业务或逻辑简单场景,工作流适宜帮忙企业把简单的事件变得简略,把逻辑梳理的清晰有序。 工作流零碎如何实现 因为篇幅起因,下一篇文章我会具体介绍工作流的框架,以及如何整合部署。本篇我就先用本人的语言总结一下,要实现一个工作流引擎都须要哪些性能。 (1)流程图,不论是应用通用的工作流引擎还是本人开发,咱们肯定首先须要指定流程,指定流程的形式多种多样,能够采纳配置的模式,也能够间接通过画流程图的形式(最终也会造成一个可数据化的流程xml)。不论用什么形式这一步是外围,通知零碎你的流转过程。 (2)数据库,所有的流程信息、节点信息、工作信息、历史信息、用户信息都必须存储于数据表中,每一个操作也会间接反馈给表中的数据。 (3)工作的应用,工作是一个重要的概念,流程流转的是工作,咱们无需记录工作的具体内容,这是业务零碎须要思考的事件,咱们只须要记录工作的流转过程即可。能够给工作做个分类,分为人工执行的和零碎主动执行的。 (4)流程变量,这个概念也同样的重要,因为没有一个流程是相对固定的,它的流转分支以及逻辑断定必须是动静的才有意义。而动静也就意味着必须在流程启动时能力确定某些数据的值,这个值的传入就必须要通过流程变量实现。 (5)历史记录,每一个曾经流转实现的流程都须要具体的历史记录,这是必须的,能够排除危险并确定责任。 (6)可调用的工具类或接口,流程中执行的每一个操作:启动、终止、通过、退回,都须要用户手工或零碎主动触发,所以要提供所有可执行的API。 在很多开源的流程引擎框架里,并没有思考太多的国内的应用须要,所以咱们在设计或客户化咱们的工作流零碎时,要思考到各种非凡状况。比方:撤回、终止、回调等。后记如果您对咱们正在做的开源软件感兴趣,欢送各种模式的单干,作为贡献者或间接退出咱们!让咱们一起打造一套开源的企业级信息化解决方案。 【码云】或【GitHub】搜寻“赤龙ERP”点击星标,亦可退出咱们! 让咱们从小开始做点平凡的事!

September 27, 2020 · 1 min · jiezi

关于工作流:flowable中终止流程一

应用flowable工作流框架时,为了将业务零碎和工作流服务进行解耦,将工作流服务独立为一个外围模块,不波及业务逻辑的解决。但凡须要业务数据的中央都通过配置化的模式申请业务零碎,具体配置可参考 <serviceTask id="serviceTask1" name="task1" flowable:delegateExpression="${remoteHttpServiceTask}"> <extensionElements> <flowable:field name="requestUrl"> <flowable:string><![CDATA[http://baseweb-service/testXml]]></flowable:string> </flowable:field> <flowable:field name="requestBody"> <flowable:string><![CDATA[{"age":"2"}]]></flowable:string> </flowable:field> <flowable:field name="requestMethod"> <flowable:string><![CDATA[POST]]></flowable:string> </flowable:field> </extensionElements></serviceTask>通过serviceTask的模式自定义相干配置,申请业务零碎,获取对应的数据。这样,工作流服务和业务零碎就齐全解耦了。当然,这里是采纳http的模式进行跨服务调用的,也能够通过redis订阅、音讯队列等模式进行跨服务申请调用,这样的设计是不是很奇妙呢?然而,马上就面临问题了。。。有时候serviceTask申请失败了怎么办?网络不通顺怎么办?业务数据须要进行操作回滚怎么办?比方,某个销假流程中,业务零碎中销假表单的状态为初始化状态,首先工作流服务申请业务零碎更改销假状态为销假中状态,接着工作流服务告知业务零碎执行具体逻辑(此处笔者采纳的是http调用),然而业务零碎执行出错了或者呈现了其余的谬误,工作流服务岂不是要申请业务零碎复原销假状态或者更改为异样状态(理论状况可能比这个简单的多),这些属于流程图之外的异样思考范畴了,毕竟太多的serviceTask不可能所有的都加上弥补机制,怎么办呢?有人立马会想到弥补机制,减少一个弥补工作不久ok了吗?然而我的业务性能被宰割成了泛滥独自的模块(即很多的serviceTask),如果每一个服务都须要这样的一个弥补机制,那么我的流程图就会变得很臃肿,临时放弃这种抉择!最初想了一个方法,对立的将这些须要回滚的数据进行入库操作,后盾线程定时查询数据库实现这些弥补机制。(当然,大家如果有很好的方法,能够留言探讨)serviceTask局部代码如下: @Overridepublic void execute(DelegateExecution delegateExecution) { log.info(String.format("服务工作开始执行,ExecutionId--->%s", delegateExecution.getId())); if (Objects.isNull(requestUrl) || Objects.isNull(requestMethod)) { log.error("requestUrl or requestMethod is empty"); return; } String urlStr = parseExpression(requestUrl, delegateExecution, serviceConfig::processHttpUrl); String methodStr = parseExpression(requestMethod, delegateExecution, Function.identity()); String jsonStr = parseExpression(requestBody, delegateExecution, Function.identity()); try { switch (methodStr) { case MethodType.GET: ResponseEntity<String> getResponseEntity = httpUtil.sendGetMethod(urlStr, jsonStr, String.class); handleResponse(getResponseEntity, delegateExecution); break; case MethodType.POST: ResponseEntity<String> postResponseEntity = httpUtil.sendPostMethod(urlStr, jsonStr); handleResponse(postResponseEntity, delegateExecution); break; default: log.error("request method not support"); } } catch (BpmnError e) { throw e; } catch (Exception e) { e.printStackTrace(); throwExceptionWhenFail(delegateExecution, Collections.EMPTY_MAP); }}当然,这个只是解决了某些须要回滚或更新业务数据状态的问题,目标是为了使流程在可控范畴之内,然而,http调用出错呢,业务数据和工作流服务之间忽然网络不通顺,或者呈现了大量丢包超时的景象,间接上图 ...

September 27, 2020 · 1 min · jiezi

Online开发初体验JeecgBoot-在线设计流程

Online开发——初体验(在线设计流程) 01 在线设计流程02 在线设计流程和表单对接03 表单业务申请 演示在线设计流程 演示在线设计流程与表单对接 演示业务OA申请

July 16, 2019 · 1 min · jiezi

激活效能,CODING 敏捷研发模块上线

近日,巴黎圣母院失火,而我们当中的许多人都还没来得及去欣赏它的真容。我们曾以为美好的事物会等待我们,伟大的目标也会等待我们。世事无常,唯一不变的就是变化。在软件研发领域,敏捷研发就是这么一个小步快跑来积极面对变化的工作方式。敏捷研发带动企业小步快跑敏捷研发是涉及整个软件工程的理念与实践,它的核心是迭代和增量式软件开发方法。开发者快速发布一个可运行但不完美的版本投入市场,在后续迭代中根据用户的反馈改进产品,新增一到多个用户可以感知的完整功能,从而逼近产品的最终形态。敏捷实践帮助企业以一个低预算迅速展开业务。在瞬息万变的市场下,需求通常是紧急且不确定的,过大的前期规划可能造成更多浪费。敏捷研发的关键在于拥抱持续改进的心态。 通过迭代让团队在一到三个星期就能看到产品功能的直观变化,给团队带来持续激励的同时,也让团队在迭代和增量中快速成长。通过 CODING 开启敏捷研发从需求构思到软件发布,CODING 将先进的敏捷研发方法融入到工作流当中来。维护需求池产品经理将产品需求、用户反馈、缺陷转换而来的需求录入到需求池。需求是指用户解决某一问题或达到某一目标所需的软件功能。当产品经理创建一个需求后,可以设置优先级、截止日期、需求分类等基本信息,并指定处理人员处理。较大粒度的需求需要分解为较小的子需求。规划迭代团队成员进行迭代会议,对迭代的目标、内容、周期、负责人达成共识。迭代的生命周期按先后顺序依次为未开始、进行中和已完成三个阶段。跟踪迭代各成员按照优先级处理自己负责的事务,每日通过 15 分钟左右的站立会议,沟通迭代进度和期间发生的问题,迅速同步信息。团队所有成员可在迭代概览中跟踪迭代进度、事务处理趋势和速度。回顾迭代在迭代完成后,团队对本次迭代进行复盘,反思出现的问题、评估迭代质量、总结经验、并将复盘后的经验和解决方案应用到下一次迭代中。同时,针对迭代遗留事务进行评估,决定哪些事务需要移入“未规划”,哪些可规划进未来的迭代中。若存在未完成的子需求,可将其升级为父需求,并决定下一次迭代。CODING 敏捷研发管理涵盖了从产品规划、需求管理、迭代规划、任务进度跟踪、开发测试、持续部署整个研发生命周期的管理,满足不同大小团队或企业的协作和管理。我们鼓励 CODING 的用户敢于想象,大胆行动,希望 CODING 能够成为企业在荆棘之路上的创新引擎。点击试用 CODING 研发管理系统,体验敏捷研发,拥抱变化!

April 17, 2019 · 1 min · jiezi

PB 级数据处理挑战,Kubernetes如何助力基因分析?

摘要: 一家大型基因测序功能公司每日会产生 10TB 到 100TB 的下机数据,大数据生信分析平台需要达到 PB 级别的数据处理能力。这背后是生物科技和计算机科技的双向支撑:测序应用从科研逐步走向临床应用,计算模式从离线向在线演进,交付效率越来越重要。作者李鹏,原文首发于InfoQ,《容器混合云,Kubernetes 助力基因分析》引言James Watson 和 Francis Crick 于 1953 年发现了 DNA 的双螺旋结构,从此揭开了物种进化和遗传的神秘面纱,开启了人类对数字化遗传的认知,但是人类基因奥秘却是一点点被读懂的。1956 年,一则癌症和染色体相关性的发现令整个癌症研究界震动:慢性骨髓性白血病(CML)患者的第 22 号染色体,比一般然明显短很多。二十余年后,学者们发现,9 号染色体的 Abl 基因,与 22 号染色体的 BCR 基因连到了一块,交错易位产生了一条 BCR-Abl 融合基因。BCR-Abl 蛋白一直处于活跃状态且不受控制,引发不受控的细胞分裂,从而导致癌症。也就是说,只要细胞表达 BCR-Abl 蛋白,就有血癌风险。美国着手深入研究,并成功推出了治疗慢性骨髓性白血病的新药。这,就是格列卫,也是去年《我不是药神》中被我们熟知的‘高价药’。在格列卫诞生前,只有 30% 的慢性骨髓性白血病患者能在确诊后活过 5 年。格列卫将这一数字从 30% 提高到了 89%,且在 5 年后,依旧有 98% 的患者取得了血液学上的完全缓解。为此,它也被列入了世界卫生组织的基本药物标准清单,被认为是医疗系统中“最为有效、最为安全,满足最重大需求”的基本药物之一。容器混合云如何应对基因测序的 IT 挑战基因测序在血液肿瘤领域应用的越来越广泛。根据病人的诊断结果, 血液肿瘤专科医生会选择相应的检查,比如 PCR 结合实时荧光探针技术, 来检测测 BCR-Abl 融合基因, 以诊断慢性骨髓性白血病, 也可以通过二代测序方式,SEGF(Single-end Gene Fusion)能够通过单端 NGS 测序数据检测复杂的基因融合类型。在另一面,无创产检唐氏/爱德华式筛查,近年来以高准确率和对胎儿的低风险,越来越受到国内年轻产妇的欢迎。基因公司每年都完成几十万例的 NIPT 检查,每一例的 NIPT 涉及到数百 MB+ 的数据处理,存储和报告生成。一家大型基因测序功能公司每日会产生 10TB 到 100TB 的下机数据,大数据生信分析平台需要达到 PB 级别的数据处理能力。这背后是生物科技和计算机科技的双向支撑:测序应用从科研逐步走向临床应用,计算模式从离线向在线演进,交付效率越来越重要。基因计算面临以下几方面挑战:1.数据存储:数据增长快,存储费用高,管理困难;长期保存数据可靠性难以保障;需要寻求低成本大数据量的数据压缩方式;元数据管理混乱,数据清理困难。2.分发共享:海量数据需要快速、安全的分发到国内多地及海外;传统硬盘寄送方式周期长,可靠性低;多地中心数据需要共享访问。3.计算分析:批量样本处理时间长,资源需求峰谷明显,难以规划;大规模样本的数据挖掘需要海量计算资源,本地集群难以满足;计算工作1. 3. 流流程迁移困难、线上线下调度困难、跨地域管理困难;线下弹性能力差,按需计算需求。4.安全合规:基因数据安全隐私要求极高;自建数据中心安全防护能力不足;数据合约(区块链);RAM 子账号支持。而这样看来一套完备架构方案则是必不可少的。与传统高性能计算相比,按需切分任务的需求,自动从云中申请资源,自动伸缩能力达到最小化资源持有成本,90% 以上的资源使用率,用完后自动返还计算资源。最大化资源的使用效率,最低单样本的处理成本,最快速的完成大批量样本的处理。随着基因测序业务增长,自动完成线下资源使用,和线上资源扩容。高速内网带宽,和高吞吐的存储,和几乎无限的存储空间。基因计算不同于常规的计算,对海量数据计算和存储能力都提出了很高的要求。主要通过容器计算的自动伸缩特性和阿里云 ECS 的自动伸缩能力的打通,可以大规模弹性调度云上的计算资源。通过对基因数据的合理切分,实现大规模的并行计算同时处理 TB 级别的样本数据。通过按需获取的计算能力,以及高吞吐的对象存储的使用,大幅降低了计算资源持有的成本和单个样本的处理成本。整体技术架构是云原生容器混合云,云上云下资源一体,跨地域集群统一管理。作为主要 Player,容器技术在数据分拆,数据质量控制,Call 变异提供了标准化流程化、加速、弹性、鉴权、观测、度量等能力,在另外一方面,高价值挖掘需要借助容器化的机器学习平台和并行框架对基因、蛋白质、医疗数据完成大规模线性代数计算来建立模型,从而使精准医疗能力成为现实。基因工程中的关键问题及解决方案数据迁移与传输数据迁移、数据拆分阶段百万小文件的读取对底层的文件系统压力,通过避免不必要小文件的读写提高样本的处理效率。 通过数据中心与阿里云的专线连接,实现高吞吐低延迟的数据上云以及与工作流结合的上云、校验、检测方式。而最终需要达成的目标是:在短时间内完成数十 TB 级数据的加密搬迁,确保数据传输客户端的高性能与安全性,实现并发传输、断点续传,且保有完善的访问授权控制。基因计算典型任务:增强型工作流基因计算的典型特征就是数据分批计算,需要按照特定步骤先后依次完成。将该问题抽象后,即需要申明式工作流定义 AGS(AlibabaCloud Genomics Service) workflow。其工作流的特点是:多层次,有向无环图。科研大工作流 1000-5000+ 深度的 DAG,需要准确的流程状态监控和高度的流程稳定性。简单流程从任意步骤重现启动 ,失败步骤可以自动完成重试和继续,定时任务,通知,日志,审计,查询,统一操作入口 CLI/UI 。[图片上传失败…(image-f4ed64-1554348389942)]我们采用的方案是:1.简单 YAML 申明式定义,多层次,有向无环图, 复杂依赖支持, 任务自动分拆,自动并行化;2.云原生,与社区 Argo 完全兼容的增强性 Workflow 定义;3.实时资源统计,监控集成云监控,云日志 SLS 集成, 审计集成, 定时任务;4.统一操作入口 ags-cli 与 Kubectl 集成;5.阿里云存储卷申明式支持,NAS,OSS,CloudDisk, 缓存加速支持。云上云下资源的统一调度通过跨越 IDC 和云上可用区的混合云 ACK 集群实现计算资源的统一调度和数据的云端汇聚。自动化,流程化上云数据,和后续的数据处理流程,形成 24 小时内完成批次下机数据的本地, 上云,云端处理和报告生成。按需弹性提供计算节点或者无服务化计算资源,形成按需计算能力,处理突发分析任务。我所带领的阿里云基因数据服务团队努力构建更具弹性的容器化集群,分钟级数百节点自动伸缩能力和分钟级数千轻量容器拉起的 Serverless 能力, 通过提高并行度来提高内网带宽的利用率,最终提高整体数据吞吐率,通过 NAS 客户端和服务端的 TCP 优化来提高 IO 读写速度,通过为 OSS 增加缓存层和分布式的缓存来实现对象存储读取加速等等。还有很多问题,篇幅原因在此不一一展开:如何进行基因数据管理、最优化单位数据处理成本、采用批量计算的方式进行对样本分析、怎样使得基因数据处理安全及跨组织安全分享等等。生命科学和精准医学应用,未来已来NovaSeq 测序仪带来了低成本(100$/WGS)高产出(6TB 通量)的二代测序方案,大量 NovaSeq 的使用为基因测序公司每天产出的几十 TB 数据,这就要求大量的算力来分拆和发现变异,以及需要大量的存储来保存原始数据和变异数据。阿里云基因数据服务不断提升极致弹性的计算能力,和大规模并行处理能力,以及海量高速存储来帮助基因公司快速自动化处理每天几十上百 TB 的下机数据,并产通过 GATK 标准产出高质量的变异数据。以 PacBio 和 Nanopore 为代表的三代测序的出现,超过 30K 到数百 K 的长读,和 20GB 到 15TB 的大通量产出,长读和数据量对数据比对,分拆,发现变异带来了更大的算力需要和高 IO 吞吐的需求,对基因计算过程中优化基因分析流程,拆分数据,按需调度大量计算资源,提供超高的 IO 吞吐带来了更大的挑战。解码未知,丈量生命。科技的每一小步,都会成为人类前行的一大步。本文作者:李鹏(Eric Li),阿里云资深架构师,数据科学家,美国 FDA2018 精准医疗大赛Top2 Winner ,金融/生物计算行业解决方案专家,专注于基于 Kubernetes 的容器产品开发和银行,生信行业的生产落地。在加入阿里云之前,曾在 IBM 担任 Watson 数据服务容器平台首席架构师,机器学习平台架构师,IBM 2015 Spark 全球大赛金奖获得者,带领多个大型开发项目,涵盖云计算,数据库性能工具、分布式架构、生物计算,大数据和机器学习。本文作者:木环阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 4, 2019 · 1 min · jiezi

前端生涯的第二年-2018

回顾18年,怎么讲,工作上有很多不顺利吧,经常会特别的焦虑,在这座城市找不到存在感,觉得很难够留在这个城市。崩塌,你会发现你原来的各种各样的认识,你会发现你全都没法说服自己,没法证明它是对的,它都不对了。你会怀疑自己,怀疑一切。你会发现你对这个世界一无所知。我原来觉得自己只要努力,只要不停的努力,只要不停的学习,我可以获得我想要的东西,现在发现这一切好像都太可能了。对了,18年末尾,我辞掉了工作,认识我的朋友觉得之前都那么多份工作经验了,这一个还说个锤子,但是这一个辞职原因不一样,真的不一样。自己的不合群,令人反感的企业文化,错综复杂的同事关系,学不会的阿谀奉承,XX的工作气氛与付出不匹配的工资,不懂行的老板,被肆意侵占的个人时间。岁月不居,时节如流。距离2019农历春节还剩下5天,家里也搞好清洁了,空出点时间,于是打算花点时间对这一年做一个总结。学习JS已经不是原来的JS了不是所有前端都在写 JS。已经有很多前端在用 TypeScript 了,还有一些前端在用 Reason、Elm、ClojureScript 和 Dart。尤其是 TypeScript 的发展势头最猛,JS 学得好的前端很快就能上手 TypeScript,很多大公司的前端对 TypeScript 更是爱不释手。趋势:前端 == 全端移动 App、移动网页、PC 应用、PC 网页、微信小程序、支付宝小程序、百度小程序、各种小程序……面试其实在去年大学毕业的时候,我就说过2018这一年一定是我技术成长最快的一年,但是现在我认为我当初的想法是错误的,其实在技术方面,这一年,我收获的并不多,在工作上,一些业务需求都是重复的,本身前端就没有过多的逻辑,再加上自律性不强,没能静下心下深究那些更深层次的东西,这才导致有换工作有压力的危机感。陆陆续续进行了一大波面试的直接原因。老实讲,面试的过程并不顺利。像各种大公司,如腾讯、YY的面试我都参加了几次,我一直认为自己的技术水平还是不错的,但在实际面试中,还是会对一些问题有所疏漏,以至于答的不能让面试官满意,以至于最终基本都挂掉了。还有一次印象比较深刻的经历就是,在内推流程中直接简历评估就被 PASS 掉了,这让我一度很是蛋疼,备受打击。但后来也明白了,面试这个事情,最忌讳的就是妄自菲薄,因为挂掉不一定意味着你的能力不行,也可能是不合适,而且,面试也不是一个可以量化的考核过程,达标并不意味着通过,面试者肯定会选择最好的那一个,况且,千里马常有,而伯乐不常有,所以也没必要太计较结果。总结2018,有开心,有失望,有快乐,有彷徨,但我觉得这一年更多的是在迷茫和焦虑中摸索前行。一个人的变化只有自己是最不容易察觉到的,也是只有自己最容易感受到的。这一年,毕业、就业,自己潜移默化中改变了很多。2019,想对自己说:少些浮躁,多关注本质,多尝试,少回头,不要很快被磨平棱角。

March 29, 2019 · 1 min · jiezi

odoo12 工作流

介绍新版本的odoo开始减少workflow的使用,推荐使用workflow-ish的方式来处理工作流过程很多模块中还是使用到工作流,这里我记录一个简单的实例,欢迎大家给出建议。在本实例中工作流可以分为两个部分,一部分是“view视图”,一部分是“model方法”和相关的“流程字段”定义流程流转字段state = fields.Selection([ (‘draft’, ‘草稿’), (‘read’, ‘已阅’), (‘write’, ‘已写心得’), (‘submit’, ‘已上传心得’)], string=‘Status’, default=‘draft’, readonly=True, copy=False, track_visibility=‘onchange’)Selection 是一个多值选择的字段类型,里面可以定义一个数组集。odoo工作流String 是一个字段前台显示的值。default 是一个默认的初始的状态新创建数据后会默认加载这个状态初始值。track_visibility 流程变更可见性。readonly 是定义改状态值是否只读。定义工作流程的 def@api.onedef button_done(self): self.state = ‘read’ self.message_post(‘变更——————草稿 ——> 已阅’, subtype=‘mail.mt_note’)@api.onedef button_confirm(self): self.state = ‘submit’ self.message_post(‘变更——————已写心得 ——> 已上传心得’, subtype=‘mail.mt_note’) for rel in self.employee_ids: domain = [(‘id’, ‘=’, rel.id)] employee = self.env[‘files.employee’].search(domain) data = { ’name’: employee.name, ’email’: employee.work_email, ’event_id’: self.id, ‘wx_number’: employee.wx_number, } self.env[‘activity.registration’].create(data)定义页面的 View<record model=“ir.ui.view” id=“view_activity_form”> <field name=“name”>activity.event.form</field> <field name=“model”>activity.event</field> <field name=“arch” type=“xml”> <form string=“党员活动”> <header> <button string=“活动已阅” name=“button_done” states=“draft” type=“object” class=“oe_highlight” groups=“base.group_user”/> <button string=“已上传活动心得” name=“button_confirm” states=“read” type=“object” class=“oe_highlight” groups=“base.group_user”/> <field name=“state” widget=“statusbar” statusbar_visible=“draft,confirm,done”/> </header> <sheet>states=“draft” 是button显示与否的判断条件,如果值是这个值,则改button显示可见,即可用。class=“oe_highlight” 是引入的 button 的样式,可自定义样式并引入。name=“button_done” 是调用模型中的方法字段,如该方法调用后台 def button_done(self) 方法。string=“活动已阅” String是该状态按钮显示的值,最好定义为英文,然后进行国际化i18n翻译。<field name=“state”… 是工作流程流转的状态值显示,到哪个阶段显示到哪个阶段的值。widget=“statusbar” 样式效果展示。 ...

March 14, 2019 · 1 min · jiezi

2019 年,容器技术生态会发生些什么?

Kubernetes 项目被采纳度将持续增长作为“云原生”(Cloud Native)理念落地的核心,Kubernetes 项目已经成为了构建容器化平台体系的默认选择。但是,不同于一个只能生产资源的集群管理工具,Kubernetes 项目最大的价值,乃在于它从一开始就提倡的声明式 API 和以此为基础“控制器”模式。在这个体系的指导下, Kubernetes 项目保证了在自身突飞猛进的的发展过程中 API 层的相对稳定的和一定的向后兼容能力,这是作为一个平台级项目被用户广泛接受和认可的重要前提。更重要的是,Kubernetes 项目为使用者提供了宝贵的 API 可扩展能力和良好的 API 编程范式,催生出了一个完全基于Kubernetes API 构建出来的上层应用服务生态。可以说,正是这个生态的逐步完善与日趋成熟,才确立了 Kubernetes 项目如今在云平台领域牢不可破的领导地位,也间接宣告了其它竞品方案的边缘化。与此同时,上述事实标准的确立,也使得“正确和合理的使用了 Kubernetes 的能力”,在某种意义上成为了评判上层应用服务框架(比如 PaaS 和 Serverless )的一个重要依据:这不仅包括了对框架本身复杂性和易用性的考量,也包括了对框架可扩展性和演进趋势的预期与判断。不过,相比于国外公有云上以 Kubernetes 为基础的容器化作业的高占比,国内公有云市场对容器的采纳程度目前仍然处于比较初步的水平,直接贩卖虚拟机及其关联 IaaS 层能力依然是国内绝大多数公有云提供商的主要业务形态。所以,不同于国外市场容器技术增长逐步趋于稳定、Kubernetes 公有云服务已经开始支撑头部互联网客户的情况,Kubernetes 以及容器技术在国内云计算市场里的依然具有巨大的增长空间和强劲的发展势头。不难预测,Kubernetes 项目在国内公有云上的逐渐铺开,会逐渐成为接下来几年国内公有云市场上的一个重要趋势。而无论是国内外,大量 Kubernetes 项目相关岗位的涌现,正是验证这个趋势与变化的一个最直接的征兆。2. “Serverless 化”与“多样性”将成为上层应用服务生态的两大关键词当云上的平台层被 Kubernetes 项目逐步统一之后,过去长期纠结在应用编排、调度与资源管理上裹足不前的 PaaS 项目得到了生产力的全面释放,进而在云平台层之上催生出了一个日趋多样化的应用服务生态。事实上,这个生态的本质与2014年之前的 PaaS 生态没有太大不同。只不过,当原本 PaaS 项目的平台层功能(编排、调度、资源管理等)被剥离了出来之后,PaaS 终于可以专注于应用服务和发布流程管理这两个最核心的功能上,开始向更轻、更薄、更以应用为中心的方向进行演进。而在这个过程中, Serverless 自然开始成为了主流话题。这里需要指出的是,Serverless 从2014年 AWS 发布 Lambda时专门用来指代函数计算(或者说 FaaS)发展到今天,已经被扩展成了包括大多数 PaaS 功能在内的一个泛指术语,即:Serverless = FaaS + BaaS。而究其本质,“高可扩展性”、“工作流驱动”和“按使用计费”,可以认为是 Serverless 最主要的三个特征。这也是为什么我们会说今天大家所谈论的 Serverless,其实是经典 PaaS 演进到今天的一种“极端”形态。伴随着 Serverless 概念本身的“横向发展”,我们不难预料到,2019年之后云端的应用服务生态,一定会趋于多样化,进而覆盖到更多场景下的应用服务管理需求。并且,无论是Function,传统应用,容器,存储服务,网络服务,都会开始尝试以不同的方式和形态嵌入到“高可扩展性”、“工作流驱动”和“按使用计费”这三个特征当中。当然,这种变化趋势的原因也不言而喻:Serverless 三个特征背后所体现的,**乃是云端应用开发过程向“用户友好”和“低心智负担”方向演进的最直接途径。而这种“简单、经济、可信赖”的朴实诉求,正是云计算诞生的最初期许和永恒的发展方向。**而在这种上层应用服务能力向 Serverless 迁移的演进过程中,不断被优化的 Auto-scaling 能力和细粒度的资源隔离技术,将会成为确保 Serverless 能为用户带来价值的最有力保障。3. 看得见、摸得着、能落地的“云原生”自从 CNCF 社区迅速崛起以来,“云原生”三个字就成了各大云厂商竞相角逐的一个关键词。不过,相比于 Kubernetes 项目和容器技术实实在在的发展和落地过程,云原生(Cloud Native)的概念却长期以来“曲高和寡”,让人很难说出个所以然来。其实,“云原生”的本质,不是简单对 Kubernetes 生态体系的一个指代。“云原生” 刻画出的,是一个使用户能低心智负担的、敏捷的,以可扩展、可复制的方式,最大化利用”云“的能力、发挥”云“的价值的一条最佳路径。而这其中,”不可变基础设施“是“云原生”的实践基础(这也是容器技术的核心价值);而 Kubernetes、Prometheus、Envoy 等 CNCF 核心项目,则可以认为是这个路径落地的最佳实践。这套理论体系的发展过程,与 CNCF 基金会创立的初衷和云原生生态的发展历程是完全一致的。也正是伴随着这样的发展过程,云原生对于它的使用者的意义,在2019年之后已经变得非常清晰:是否采用云原生技术体系,实际上已经成为了一个关系到是不是要最大化”云“的价值、是不是要在”云“上赢取最广泛用户群体的一个关键取舍。这涉及到的,关系到整个组织的发展、招聘、产品形态等一系列核心问题,而绝非一个单纯的技术决定。明白了这一层道理,在2019年,我们已经不难看到,国内最顶尖的技术公司们,都已经开始在云原生技术框架下发起了实实在在的技术体系升级与落地的“战役”。显然,大家都已经注意到,相比于纠结于“云原生到底是什么”这样意识形态话题,抓紧时间和机遇将 Kubernetes 及其周边核心技术生态在组织中生长起来,并借此机会完成自身基础技术体系的转型与升级,才是这些体量庞大的技术巨人赶上这次云计算浪潮的不二法宝。在这个背景下,所谓“云原生”体系在这些公司的落地,只是这个激动人心的技术革命背后的一个附加值而已。而在”云原生”这个关键词的含义不断清晰的过程中,我们一定要再次强调:”云原生不等于 CNCF,更不等于 Kubernetes“。云原生固然源自于 Kubernetes 技术生态和理念,但也必然是一个超越 CNCF 和 Kubernetes 存在的一个全集。它被创立的目的和始终在坚持探索的方向,是使用户能够最大化利用”云“的能力、发挥”云“的价值,而不是在此过程中构建一个又一个不可复制、不可扩展的“巨型烟囱”。所以说,云原生这个词语的准确定义,是围绕着 Kubernetes 技术生态为核心的,但也一定是一个伴随着 CNCF 社区和 Kubernetes 项目不断演进而日趋完善的一个动态过程。而更为重要的是,在这次以”云“为关键词的技术革命当中,阿里巴巴很可能成为”云原生“的一个重要的定义者。本文作者:jessie筱姜阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 7, 2019 · 1 min · jiezi

从0开始使用webpack搭建react工作流

很多人想搭建一套属于自己的前端工作流,最开始的时候我们的工作流萌芽是从写一个项目的时候,拷贝以前写过的一个项目文件夹改完直接使用开始的,后来使用了grunt和gulp,再到webpack,每一个前端人员想掌握如何书写一个符合自己项目的工作流,以便复用,达到高效工作的目的。另外一方面,即使不是想搭建自己的工作流,而是使用现成的脚手架,大家都会用。vue init webpack 项目名跑一下vue官方的例子,但是实际工作的时候,文件夹结构一变,或者组件的倒入和导出和官方例子不一致,就彻底不会了。很多人会vue也仅仅限于能跑起来vue官方的例子,或者在它的基础上复制,但是深度的定制以符合实际生产环境,是很多人不会的,甚至连改一个图片的路径都搞不定,明显这样的“会”就相当于你知道蜡烛是用来照明的,但是在冬天的夜里,你冻得直哆嗦,旁边有一堆木头,你却不能用蜡烛引燃木料取暖一样。更简单直接的说法,就是,鹦鹉学舌而已。显然,彻底掌握如何从零开始搭建一个能够贴近实际项目的工作流,是一个想要满足工作最基本要求的人必备的技能。今天我们就来实现它。我们通过从零开始实现一个react开发环境的脚手架,让大家能够彻底的掌握如何深度定制vue、react和angular项目的能力,同时能够让大家慢慢的形成自己的一套工作流,大幅度提高工作效率。OK,开始吧。1.我们新建一个文件夹,helloworld.2.我们进入文件夹,初始化项目。npm init3.安装webpack。npm i webpack –save-dev为什么用webpack?因为现在公司基本都用它。我们使用webpack 4.29.0,也就是最新版,因为最新版本配置起来最容易,功能也最强大。4.安装Webpack命令行工具,webpack-cli。 为什么要装它?因为webpack其实配置起来挺麻烦的,用它稍微好点儿。npm i webpack-cli –save-dev5.打开package.json,添加一句:“build”: “webpack"报错了,人家提示的特别到位,说你没有入口文件,人家缺啥你就补啥就行了。index.js里面随便写点啥:console.log(‘大彬哥666’);再跑一遍:npm run buildok,很美好。ng](/img/bVbnMEu)ok,game over.有同学可能会说,等会儿,老师,你这个咋跟我学过的不一样,不得配置入口文件和输出文件吗?并!不!需!要!那是你没遇见我,你早遇见我,你早就不配置了。6.我们确实可以打包了,但是这样好像还是不行啊,我们通常情况下分为开发环境和生产环境,现在这样怪怪的。没关系马上就满足你的需求,解决你的难言之隐,让你找回男人的尊严。我们搞一把开发模式和生产模式,一图抵万言:“dev”: “webpack –mode development”,“build”: “webpack –mode production"我们回到gitbash里面,我们走一个npm run dev很好,直接就给搬到dist文件夹了,但是我们想上线肯定得是压缩的:npm run build搞定鸟。又有人说了,老师我们公司项目不是用的默认入口和输出,咋办,我们公司比较崇拜你,所有的文件都是用dabinge666文件夹包一层的(下面可以不做直接看6)。“dev”: “webpack –mode development ./dabinge666/src/js/index.js –output ./dabinge666/main.js”,“build”: “webpack –mode production ./dabinge666/src/js/index.js –output ./dabinge666/main.js"信彬哥,无bug.7.配置完了webpack打包这块,我们想写代码都时候用ES6或者ES7,因为这两个装起B来666.也好搞,先装babel加载器npm i @babel/core babel-loader @babel/preset-env –save-dev然后配置, “dev”: “webpack –mode development –module-bind js=babel-loader”, “build”: “webpack –mode production –module-bind js=babel-loader"最后:npm run build 打开main.js,已经编译了。8.好,我们开始再把B格提升一个档次,我们玩玩react.首先装reactnpm i react react-dom –save-dev然后装babel-preset-reactnpm i @babel/preset-react –save-dev新建 .babelrc,输入,{ “presets”: ["@babel/preset-env”, “@babel/preset-react”]}新建一个webpack.config.js,输入module.exports = { module: { rules: [ { test: /.(js|jsx)$/, exclude: /node_modules/, use: { loader: “babel-loader” } } ] }};然后新建一个App.jsimport React from “react”;import ReactDOM from “react-dom”;const App = () => { return ( <div> <p>大彬哥一如既往的666</p> </div> );};export default App;ReactDOM.render(<App />, document.getElementById(“app”));最后引入到index.js里面import App from “./App”;然后重新build,又可以了,岂止是很赞,简直是很赞。到这里react安装就搞定了。9.如果你想搞点sass了你可以继续搞,因为不是每一个项目都用,我就不搞了,我只搞最原生的css,当然顺便也把html搞了。npm i mini-css-extract-plugin css-loader –save-devnpm i html-webpack-plugin html-loader –save-devwebpack.config.js配置文件如下:const HtmlWebPackPlugin = require(“html-webpack-plugin”);const MiniCssExtractPlugin = require(“mini-css-extract-plugin”);module.exports = { module: { rules: [ { test: /.js$/, exclude: /node_modules/, use: { loader: “babel-loader” } }, { test: /.html$/, use: [ { loader: “html-loader”, options: { minimize: true } } ] }, { test: /.css$/, use: [MiniCssExtractPlugin.loader, “css-loader”] } ] }, plugins: [ new HtmlWebPackPlugin({ template: “./src/index.html”, filename: “./index.html” }), new MiniCssExtractPlugin({ filename: “[name].css”, chunkFilename: “[id].css” }) ]};10.搞了这么多,我其实想实现的就是,我修改点东西,然后自动服务器刷新,最后开发完了,然后build一次完事儿。这个简单:npm i webpack-dev-server –save-dev配置一下,然后输入npm start就可以了。通过上面的过程呢,我们就实现了完整的工作流,但是有些具体的项目可以根据需要去添加对应的loaders等,不如有人写less,那就加less的loaders,还有我们需要对最终上线的文件(比如bundle.js)加时间戳去缓存,这些都是个性化的不同项目的需求了,大家可以在我的这个基础上继续搞。最后我们总结一下,工作流实现了:1.ES6编译2.css编译3.html压缩4.react支持5.服务器自动刷新大家可以在我的基础上继续添加功能,实现自己的工作流,有了工作流配合着组件库,就能真正的工业化生产,大幅度的提高效率。本文所有源码:https://github.com/leolau2012… ...

January 25, 2019 · 1 min · jiezi

如何优化基于Jupyter的分析/挖掘测试项目

对于一个有软件工程项目基础的程序员而言,我们这群来源「可疑」的Data Scientist最被人诟病的就是期代码质量堪忧到让人崩溃的程度。本篇文章将介绍自己在以python/Jupyter Notebook为基础的分析/挖掘项目时是如何优化代码使其具有更大的可读性(执行效率不是本文的主要目的)。Python语法级别的优化合适的style当然,这个层面的优化是最简单的,大家熟悉的PEP风格和GOOGLE风格都是不错的实践。参加下面两个文档:PEP代码风格GOOGLE代码风格值得一试的命名方案多年经(踩)验(坑)摸索出一套比较适合的变量命名方案,基本的方法是具象词([介词短语])[数据结构]具象词是描述数据的具体用处的词语,例如一个班级的男生的成绩,可以用boy_score来表述。操作则是概括了对数据做过什么处理,如果是个人团队可以维护一个简单的缩略词词库。比如,我们要描述一个班级的成绩做过去空值的处理,可以用drop_null或者rm_na来表示。在这种情况下,我们可以对上面的对象完整描述成boy_score_rm_na。介词短语其实也是操作的一部分,往往以in/over/top(不严谨地归在此类)/group by等。比如,我们这里要描述一个班级的学生按性别取前10的成绩并做了去重处理,可以写成score_unique_groupbysex_top10,如果长度过长,维护一个简写的映射表当然也是不错的(牺牲部分可读性)。数据结构则是描述数据是存储在什么数据结构中的,常见的比如list,pandas.DataFrame、dict等,在上面的例子里,我们储存在pandas.DataFrame则可以写成score_unique_groupbysex_top10_df。而操作和介词短语在很多场合下可以不写。当然在更加抽象地机器学习训练中时,可以以test_df、train_df这种抽象描述是更适合的方案。Jupyter级别的优化线性执行这点是容易忽视的一个问题,任何Jupyter里面的cell一定要保证,具体的cell中的代码是自上而下执行的。这在工作中,可能由于反复调试,导致在编辑cell的过程中不是线性操作。保证notebook可以线性执行的原因,一部分是方便其他阅读人可以正常执行整个notebook;另一部分,也是为了增加可读性。<!– 可接受的例子 –>cell 1import pandas as pd``````cell 2df = pd.read_csv('train.csv')``````cell 3def sum_ab(row): return row['a'] + row['b']``````cell 4df.apply(sum_ab, axis=1)<!– 不可接受的例子,不能正常运行 –>cell 1import pandas as pd``````cell 2df = pd.read_csv('train.csv')``````cell 3df.apply(sum_ab, axis=1)``````cell 4def sum_ab(row): return row['a'] + row['b']载入模块和读入数据放在开头在具体分析中,载入模块和数据是非常常见的工作,而放置在notebook开始容易帮助阅读者注意,需要的依赖以及数据。如果零散地出现在notebook任何地方,这样就容易造成困难的路径依赖检查、模块重命名方式和模块依赖检查。如果有些模块并不常用,但在notebook引用到了,建议在载入模块前的cell中加入一个cell用来安装依赖。jupyter可以用!来实现临时调用系统的命令行,这个可以很好地利用在这个场景中。此外,所有数据和自写模块使用相对链接的方式导入是不错的选择。因为,后期可能别人会通过git的方法获取你的代码,相对链接可以允许我们不修改链接也能使用git项目中的模块和数据。cell 1!pip install scikit-learn``````cell 2import panda as pdfrom sklearn import metricsimport sys## 自编模块sys.path.append('../')from my_module import my_func``````cell 3df = pd.read_csv('./train.csv')一个Cell一个功能我们在具体撰写Jupyter时,无法避免,会反复尝试,并且测试中间输出的结果。因此,很多同行的cell代码往往会呈现以下状态。cell 1df_1 = df.sum(axis = 1)``````cell 2df_2 = df_1.fill_na(0)``````cell 3ggplot(df_2, aes(x = 'x', y = 'y')) + geom_point()这样的做法无可厚非,且并没有错误,但是,这样的缺点是,读者可能需要run三个cells才能得出最终的结果,而中间的处理过程,在阅读报告中,往往是无关紧要的甚至会影响到可读性,具体查看中间步骤只有复现和纠错时才是必要的。因此,我们要保持一个原则,就是一个Cell理应要承担一个功能需求的要求。具体优化如下:cell 1df_1 = df.sum(axis = 1)df_2 = df_1.fill_na(0)## 绘图ggplot(df_2, aes(x = 'x', y = 'y')) + geom_point()但很多朋友可能会遇到,过程过于复杂,导致一个cell看起来非常的冗余,或者处理过程异常漫长,需要一些中间表的情况,后面的建议中,我会提到如何改善这两个问题。数据(包括中间结果)与运算分离回到刚才的问题,很多时候,我们会遇到一个中间过程的运行时间过长,如何改变这种状况呢,比如上个例子,我们发现fillna的时间很长,如果放在一个cell中,读者在自己重新运行时或者自己测试时就会非常耗时。一个具体的解决方案就是,写出临时结果,并且在自己编辑过程中,维持小cell,只在最后呈递时做处理。比如上面的任务,我会如此工作。cell 1df_1 = df.sum(axis = 1)``````cell 2df_2 = df_1.fill_na(0)df_2.to_pickle('../temp/df_2.pickle')``````cell 3ggplot(df_2, aes(x = 'x', y = 'y')) + geom_point()最后呈递notebook时改成如下样子cell 1##~~~~ 中间处理 ~~~~### df_1 = df.sum(axis = 1)# df_2 = df_1.fill_na(0)# df_2.to_pickle('../temp/df_2.pickle')##~~~~ 中间处理 ~~~~##df_2 = pd.read_pickle('../temp/df_2.pickle')## 绘图ggplot(df_2, aes(x = 'x', y = 'y')) + geom_point()这样做的另外个好处可以实现,数据在notebook之间的交互,我们会在之后提到具体场景。抽象以及可复用分离到Notebook外部我们在撰写notebook时遇到的另一个问题,很多具体地清洗或者特征工程时的方法,过于隆长,而这些方法,可能在别的地方也会复用,此时写在一个cell里就非常不好看,例如下面一个方法。cell 1def func1(x): """add 1 """ return x + 1def func2(x): temp = list(map(func1, x)) temp.sorted() return temp[0] + temp[-1]df.a.apply(func2, axis)这种情况的解决方案,是独立于notebook之外维护一个文件夹专门存放notebook中会用到的代码。例如,使用如下结构存放模块,具体使用时再载入。— my_module |__ init.py |__ a.py___ notebook |__ test.ipynb注意使用sys模块添加环境来载入模块。## import cellimport pandas as pdimport syssys.path.append(’../’)from my_module import *但这种方案,存在一个问题——我们会经常改动模块的内容,特别是在测试时,这时候需要能重载模块,这个时候我们需要反复重载模块,python在这方面的原生支持并不友善,甚至重开内核运行所有都比手写这个重载代码快。这时候我们需要一个ipython的magic extension——autoreload,具体的方法参考这个问答。我们只需要在载入模块的开头写上如下行,这样我们每当修改我们自己编写的module时就会重载模块,实现更新。%load_ext autoreload%autoreload 2import pandas as pdimport syssys.path.append(’../’)from my_module import *而模块分离最终的好处是,我们最后可以容易的把这些模块最后移植到生产环境的项目中。项目级别的优化一个notebook解决一个问题为了让项目更加具有可读性,对任务做一个分解是不错的方案,要实现一个notebook只执行一个问题。具体,我在工作中会以下列方案来做一个jupyter的notebook分类。其中0. introduction and contents.ipynb是必须的,里面要介绍该项目中其他notebook的任务,并提供索引。这种方案,就可以提高一个分析/挖掘项目的可读性。- 0. introduction and contents.ipynb- eda.1 EDA问题一.ipynb- eda.2 EDA问题二.ipynb- eda. …- 1.1 方案一+特征工程.ipynb- 1.2 方案一训练和结果.ipynb- 2.1 方案二+特征工程.ipynb- 2.2 方案二训练和结果.ipynb- 3.1 方案三+特征工程.ipynb- 3.2 方案三训练和结果.ipynb- …- final.1 结论.ipynb对文件进行必要的整理一个分析、挖掘的项目,经常包括但不限于数据源、中间文件、临时文件、最终报告等内容,因此一个好的整理项目文件的习惯是必要的。我在工作中,具体采用下面这个例子来维护整个分析/挖掘项目。当然,初始化这些文件夹是一个非常麻烦的,因此,这里分享一个初始化脚本(支持python版本3.6+),大家可以根据自己整理习惯稍作修改。– 项目根目录 |__ SQL:存储需要用的SQL |__ notebook: 存放notebook的地方 |__ 0. introduction and contents.ipynb |__ eda.1 EDA问题一.ipynb |__ eda.2 EDA问题二.ipynb |__ eda. … |__ 1.1 方案一+特征工程.ipynb |__ 1.2 方案一训练和结果.ipynb |__ 2.1 方案二+特征工程.ipynb |__ 2.2 方案二训练和结果.ipynb |__ 3.1 方案三+特征工程.ipynb |__ 3.2 方案三训练和结果.ipynb |__ … |__ final.1 结论.ipynb |__ src: 撰写报告或者文档时需要引用的文件 |__ data: 存放原始数据 |__ csv: csv文件 |__ train.csv |__ … |__ … |__ temp: 存放中间数据 |__ output: 最后报告需要的综合分析结果 |__ *.pptx |__ *.pdf |__ src |__ example.png |__ … |__ temp_module: 自己写的notebook需要引用的模块结语优化一个Jupyter代码并非不可能,只是看是否具有相关的习惯,增加可读性对自己以及团队的工作和开源社区的声望都会有利,希望上面的建议对大家有所帮助。 ...

November 4, 2018 · 2 min · jiezi