件(start event),这声称一个东程序比如说是的交都能点。一个东程序启动此前,首再行驶离第一个有Gmail标志的方形中所,这个方形叫作一个 User Task,在这个 User Task 中所,副经理可以可落选择许可亦或者断然拒绝。UserTask 的下一步是一个直角,这个称作排他点对点(Exclusive Gateway),这个都能将立即路由到各不相同的偏远地区。再行说是许可,如果在第一个方形中所,副经理可落选择了许可,那么就都能转入到一个带有齿轮标志的方形中所,在这个方形中所我们我们可以额外好好一些好过错,然后又都能函数调加到一个 UserTask,就此进行整个东程序。如果副经理可落选择了断然拒绝,则都能转入到比如说是的发收件的方形中所,在这个中所我们可以给管理层发送一个告知,告知他因故从未通过。当系统走到最右边的弧线此前,就声称这个东程序指派终止了。
这个东程序图完全相同的 XML 收件座落在 src/main/resources/processes/holiday-request.bpmn20.xml 方位,其内容如下:
Request" isExecutable="true"> 很多想研读东程序增压器的恰巧都都能被这个 XML 收件当面,但是!!!
如果你愿意静下心来仔细阅读这个 XML 收件,你都能发掘单单东程序增压器原来如此最简单!
我们来挨个看下这里的每一个终端:
process:这声称一个东程序,例如本文则和大家交友的因故就是一个东程序。startEvent:这声称东程序的开始,这就是一个开始过错件。userTask:这就是一个具体内容的东程序终端了,flowable:candidateGroups 要素声称这个终端该由哪个Gmail组中所的Gmail来妥善处理。sequenceFlow:这就是连结各个东程序终端错综复杂的弧线,这个里边一般有两个要素,sourceRef 和 targetRef,前者声称弧线的交都能点,后者声称弧线的终点。exclusiveGateway:声称一个实质上点对点,也就是那个直角可落选择框。从实质上点对点单单来的弧线有两个,大家警惕看右边的预定义,这两个弧线中所都关乎到一个表达式 approved,如果这个表达式为 true,则 targeRef 就是 externalSystemCall;如果这个表达式为 false,则 targetRef 就是 rejectLeave。serviceTask:这就是我们下定义的一个具体内容的外部增系数,如果在整个东程序指派的流程中所,你有一些必须自己进行的好过错,那么可以通过 serviceTask 来做到,这个终端都能有一个 flowable:class 要素,这个要素的系数就是一个自下定义类。另外,上文则中所之外终端中所还关乎到表达式 ${},这个表达式是在东程序指派的流程中所风行进来的。总而言之,只要小卡比静下心来仔细阅读一下右边的 XML,你都能发掘单单 So Easy!
4. 因故申领好了,年中我们就来看一个具体内容的因故申领。由于因故东程序只要不放对方位,就都能定时存储,所以我们并不必须手动存储因故东程序,必要开始一个因故申领东程序需。
4.1 增系数端终端首再行我们必须一个实体类来接受后端惊醒的因故常量:Gmail名、因故起算以及因故这不:
public class AskForLeaveVO { private String name; private Integer days; private String reason; // 省略 getter/setter}日后拿著祖传的 RespBean,以便号召信息方便一些:
public class RespBean { private Integer status; private String msg; private Object data; public static RespBean ok(String msg, Object data) { return new RespBean(200, msg, data); } public static RespBean ok(String msg) { return new RespBean(200, msg, null); } public static RespBean error(String msg, Object data) { return new RespBean(500, msg, data); } public static RespBean error(String msg) { return new RespBean(500, msg, null); } private RespBean() { } private RespBean(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } // 省略 getter/setter}年中我们提供一个妥善处理因故申领的终端:
@RestControllerpublic class AskForLeaveController { @Autowired AskForLeaveService askForLeaveService; @PostMapping("/ask_for_leave") public RespBean askForLeave(@RequestBody AskForLeaveVO askForLeaveVO) { return askForLeaveService.askForLeave(askForLeaveVO); }}核心范式在 AskForLeaveService 中所,来无限期看:
@Servicepublic class AskForLeaveService { @Autowired RuntimeService runtimeService; @Transactional public RespBean askForLeave(AskForLeaveVO askForLeaveVO) { Map variables = new HashMap<>(); variables.put("name", askForLeaveVO.getName()); variables.put("days", askForLeaveVO.getDays()); variables.put("reason", askForLeaveVO.getReason()); try { runtimeService.startProcessInstanceByKey("holidayRequest", askForLeaveVO.getName(), variables); return RespBean.ok("已草拟因故申领"); } catch (Exception e) { e.printStackTrace(); } return RespBean.error("草拟申领挫败"); }}小卡比看一下,在草拟因故申领的时候,分别风行了 name、days 以及 reason 三个常量,我们将这三个常量不放入到一个 Map 中所,然后通过 RuntimeService#startProcessInstanceByKey 方式来重启一个东程序,重启东程序的时候将近风行了三个常量:
第一个常量声称东程序增压器的叫作,这就是我们居然在东程序的 XML 收件中所下定义的叫作。第二个常量声称理论上这个东程序的 key,我用了申领人的叫作,到时我们可以通过申领人的叫作检索这个人在此此前草拟的所有申领东程序。第三个常量就是我们的表达式了。好了,这增系数端就撰写好了。
4.2 后端该网站年中我们来整合后端该网站。
后端我适用 Vue+ElementUI+Axios,咱们这个个案比较最简单,就从未必要搭建单该网站了,必要用都可的 HTML 才行。另外,Vue 我是用了 Vue3:
charset="UTF-8"> Title script> 开始一个因故东程序 劝读写单单处: 劝读写因故起算: 劝读写因故这不: 草拟因故申领 Vue.createApp( { data() { return { afl: { name: 'javaboy', days: 3, reason: '往常一下' } } }, methods: { submit() { let _this = this; axios.post('/ask_for_leave', this.afl) .then(function (response) { if (response.data.status == 200) { //草拟就此 _this.$message.success(response.data.msg); } else { //草拟挫败 _this.$message.error(response.data.msg); } }) .catch(function (error) { console.log(error); }); } } } ).use(ElementPlus).mount('#app')这个该网站有几个必须警惕的点:
通过 Vue.createApp 来创立一个 Vue 比如说是,这跟现在 Vue2 中所必要 new 一个 Vue 比如说是不一样。在最比如说是,通过 use 来备有 ElementPlus 的软件,这个跟 Vue2 也不一样。在 Vue2 中所,如果我们所谓的在 HTML 该网站中所引用 ElementUI 并不必须这个解决办法。仅剩的东西就比较最简单了,右边再行替换转成 Vue3、Axios 以及 ElementPlus,然后三个读写框,页面按钮草拟立即,常量就是三个读写框中所的信息,草拟就此或者挫败,分别弹个框单单来提示一下才行。好啦,这就撰写好了。
然而,草拟进行后,从未一个准确的演示,虽然后端提示说是草拟就此了,但是只不过就此没,还得眼见为实。
5. 战斗任务演示好了,年中我们要好好的好过错就是把Gmail草拟的东程序演示单单来。
按理说是,比如副经理写明就此此前,系统该网站就定时演示单单来副经理必须许可后的东程序,但是我们理论上这个举例来说是为了最简单,就从未写明这个系统设计了,必须必须Gmail到时在页面上落选一下自己的身为,年中就都能演示单单这个身为所完全相同的必须系统设计的东程序。
我们来看战斗任务终端:
@GetMapping("/list")public RespBean leaveList(String identity) { return askForLeaveService.leaveList(identity);}这个立即常量 identity 就声称理论上Gmail的身为(从前应该是写明后定时得到,但是因为我们现今从未写明,所以这个常量是由后端发送到过来)。来无限期看 askForLeaveService 中所的方式:
@Servicepublic class AskForLeaveService { @Autowired TaskService taskService; public RespBean leaveList(String identity) { List tasks = taskService.createTaskQuery().taskCandidateGroup(identity).list(); List