修改请假流程

This commit is contained in:
jason
2021-11-07 17:38:00 +08:00
parent d0a59f7ef1
commit b784bf3e12
25 changed files with 495 additions and 872 deletions

View File

@ -36,25 +36,21 @@ public class OALeaveController {
@Resource
private OALeaveService leaveService;
@PostMapping("/create")
@ApiOperation("创建请假申请")
@PreAuthorize("@ss.hasPermission('oa:leave:create')")
public CommonResult<Long> createLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
// TODO @芋艿processKey 自己去理解下。不过得把 leave 变成枚举
// TODO @芋艿 该方法没有用到, 是前一个版本的, 可以删掉。
createReqVO.setProcessKey("leave");
return success(leaveService.createLeave(createReqVO));
}
@PostMapping("/form-key/create")
@ApiOperation("创建外置请假申请")
public CommonResult<Long> createFormKeyLeave(@Valid @RequestBody OALeaveCreateReqVO createReqVO) {
// TODO @芋艿:processKey 自己去理解下。不过得把 formkey 变成枚举
// TODO @芋艿 : processKey 是 bpmn <process> 中定义的id, 提交业务表单时候, 需要启动流程, 或许从前台传更合适
createReqVO.setProcessKey("leave-formkey");
// processKey 前台传入
return success(leaveService.createLeave(createReqVO));
}
@GetMapping("/getLeaveApplyMembers")
@ApiOperation("获取本人请假申请流程中审批人员,可先检查这些人员是否存在")
public CommonResult<OALeaveApplyMembersVO> getLeaveApplyMembers() {
return success(leaveService.getLeaveApplyMembers());
}
@PutMapping("/update")
@ApiOperation("更新请假申请")
@PreAuthorize("@ss.hasPermission('oa:leave:update')")

View File

@ -0,0 +1,25 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ApiModel("请假申请审批人员 Response VO")
@Data
@Builder
@EqualsAndHashCode
@ToString
public class OALeaveApplyMembersVO {
@ApiModelProperty(value = "部门的hr")
private String hr;
@ApiModelProperty(value = "部门的项目经理")
private String pm;
@ApiModelProperty(value = "部门的部门经理")
private String bm;
}

View File

@ -3,11 +3,21 @@ package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
import lombok.*;
import io.swagger.annotations.*;
import java.util.Map;
@ApiModel("请假申请创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OALeaveCreateReqVO extends OALeaveBaseVO {
/**
* 对应 bpmn 文件 <process> 的 id
*/
@ApiModelProperty(value = "流程key")
private String processKey;
@ApiModelProperty(value = "流程用户任务的变量")
private Map<String,Object> taskVariables;
}

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.adminserver.modules.bpm.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 流程状态
*/
@Getter
@AllArgsConstructor
public enum FlowStatusEnum {
HANDLE(1, "处理中"),
PASS(2, "审批通过"),
REJECTED(3, "审批不通过");
/**
* 状态
*/
private final Integer status;
/**
* 描述
*/
private final String desc;
}

View File

@ -10,4 +10,10 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
*/
public interface OAErrorCodeConstants {
ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在");
ErrorCode PM_POST_NOT_EXISTS = new ErrorCode(1003001002, "项目经理岗位未设置");
ErrorCode DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1003001003, "部门的项目经理不存在");
ErrorCode BM_POST_NOT_EXISTS = new ErrorCode(1003001004, "部门经理岗位未设置");
ErrorCode DEPART_BM_POST_NOT_EXISTS = new ErrorCode(1003001005, "部门的部门经理不存在");
ErrorCode HR_POST_NOT_EXISTS = new ErrorCode(1003001006, "HR岗位未设置");
ErrorCode DAY_LEAVE_ERROR = new ErrorCode(1003001007, "请假天数必须大于0");
}

View File

@ -2,16 +2,21 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper;
import cn.iocoder.yudao.adminserver.modules.bpm.enums.FlowStatusEnum;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Objects;
// TODO @jason类注释
/**
* 请假流程结束流程监听处理服务 根据请假申请审批通过还是未通过 更新请假表单
*/
@Component
public class ReportBackEndProcessor implements ExecutionListener {
public class LeaveApplyEndProcessor implements ExecutionListener {
@Resource
private OALeaveMapper leaveMapper;
@ -20,10 +25,14 @@ public class ReportBackEndProcessor implements ExecutionListener {
@Transactional(rollbackFor = Exception.class)
public void notify(DelegateExecution delegateExecution) {
final String businessKey = delegateExecution.getProcessInstanceBusinessKey();
final Object approved = delegateExecution.getVariable("approved");
OALeaveDO updateDo = new OALeaveDO();
updateDo.setId(Long.valueOf(businessKey));
// TODO @jsonstatus 要枚举起来不要出现 magic number
updateDo.setStatus(2);
if (Objects.equals(approved, true)) {
updateDo.setStatus(FlowStatusEnum.PASS.getStatus());
}else{
updateDo.setStatus(FlowStatusEnum.REJECTED.getStatus());
}
leaveMapper.updateById(updateDo);
}

View File

@ -1,10 +1,7 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExportReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeavePageReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -73,4 +70,11 @@ public interface OALeaveService {
*/
List<OALeaveDO> getLeaveList(OALeaveExportReqVO exportReqVO);
/**
* 获取本人请假申请流程中审批人员
* @return 包括,本人部门的项目经理, 部门经理, HR
*/
OALeaveApplyMembersVO getLeaveApplyMembers();
}

View File

@ -1,13 +1,19 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeaveExportReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.OALeavePageReqVO;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo.*;
import cn.iocoder.yudao.adminserver.modules.bpm.convert.oa.OALeaveConvert;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.OALeaveMapper;
import cn.iocoder.yudao.adminserver.modules.bpm.enums.FlowStatusEnum;
import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.OALeaveService;
import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserBaseVO;
import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dept.SysPostMapper;
import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import org.activiti.api.task.model.Task;
@ -20,9 +26,11 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.*;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.LEAVE_NOT_EXISTS;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.oa.OAErrorCodeConstants.*;
import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.POST_CODE_DUPLICATE;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
@ -46,23 +54,33 @@ public class OALeaveServiceImpl implements OALeaveService {
@Resource
private TaskRuntime taskRuntime;
@Resource
private SysPostMapper sysPostMapper;
@Resource
private SysUserMapper sysUserMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createLeave(OALeaveCreateReqVO createReqVO) {
// 插入 OA 请假单
OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO);
leave.setStatus(1);
leave.setStatus(FlowStatusEnum.HANDLE.getStatus());
// TODO @jason应该是存储 userId
leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
leaveMapper.insert(leave);
Date startTime = createReqVO.getStartTime();
Date endTime = createReqVO.getEndTime();
long day = DateUtil.betweenDay(startTime, endTime, false);
if (day <= 0) {
throw ServiceExceptionUtil.exception(DAY_LEAVE_ERROR);
}
Map<String, Object> taskVariables = createReqVO.getTaskVariables();
taskVariables.put("day", day);
// 创建工作流
Map<String, Object> variables = new HashMap<>();
// 如何得到部门领导人,暂时写死
variables.put("deptLeader", "admin"); // TODO @芋艿:需要部门的负责人
Long id = leave.getId();
String businessKey = String.valueOf(id);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, variables);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, taskVariables);
String processInstanceId = processInstance.getProcessInstanceId();
// 将工作流的编号,更新到 OA 请假单中
@ -104,9 +122,6 @@ public class OALeaveServiceImpl implements OALeaveService {
this.validateLeaveExists(id);
// 删除
leaveMapper.deleteById(id);
// TODO @jason需要调用 runtimeService 的 delete 方法,删除???
// TOTO @芋道源码 目前页面暂时没有实现基于业务表单的删除, 该代码自动生成的。
// TODO @芋道源码 我理解提交流程后,是不允许删除的? 只能在流程处理中作废流程
}
private void validateLeaveExists(Long id) {
@ -135,4 +150,64 @@ public class OALeaveServiceImpl implements OALeaveService {
return leaveMapper.selectList(exportReqVO);
}
/**
* 获取本人请假申请流程中审批人员
* @return 包括,本人部门的项目经理, 部门经理, hr
*/
@Override
public OALeaveApplyMembersVO getLeaveApplyMembers() {
final Long id = SecurityFrameworkUtils.getLoginUser().getId();
//项目经理
//TODO jason 定义enum
SysPostDO pmPostDO = sysPostMapper.selectByCode("pm");
if (Objects.isNull(pmPostDO)) {
throw ServiceExceptionUtil.exception(PM_POST_NOT_EXISTS);
}
SysUserDO userDO = sysUserMapper.selectById(id);
Set<Long> postIds = new HashSet<>(8);
postIds.add( pmPostDO.getId());
SysUserBaseVO baseVO = new SysUserBaseVO();
baseVO.setDeptId(userDO.getDeptId())
.setPostIds(postIds);
final List<SysUserDO> pmUsers = sysUserMapper.selectListByBaseVO(baseVO);
if (CollUtil.isEmpty(pmUsers)) {
throw ServiceExceptionUtil.exception(DEPART_PM_POST_NOT_EXISTS);
}
//部门经理
SysPostDO bmPostDO = sysPostMapper.selectByCode("bm");
if (Objects.isNull(bmPostDO)) {
throw ServiceExceptionUtil.exception(BM_POST_NOT_EXISTS);
}
userDO = sysUserMapper.selectById(id);
postIds = new HashSet<>(8);
postIds.add( bmPostDO.getId());
baseVO = new SysUserBaseVO();
baseVO.setDeptId(userDO.getDeptId())
.setPostIds(postIds);
final List<SysUserDO> bmUsers = sysUserMapper.selectListByBaseVO(baseVO);
if (CollUtil.isEmpty(bmUsers)) {
throw ServiceExceptionUtil.exception(DEPART_BM_POST_NOT_EXISTS);
}
//人事
SysPostDO hrPostDO = sysPostMapper.selectByCode("hr");
if (Objects.isNull(hrPostDO)) {
throw ServiceExceptionUtil.exception(HR_POST_NOT_EXISTS);
}
userDO = sysUserMapper.selectById(id);
postIds = new HashSet<>(8);
postIds.add( hrPostDO.getId());
baseVO = new SysUserBaseVO();
baseVO.setDeptId(userDO.getDeptId())
.setPostIds(postIds);
final List<SysUserDO> hrUsers = sysUserMapper.selectListByBaseVO(baseVO);
if (CollUtil.isEmpty(hrUsers)) {
throw ServiceExceptionUtil.exception(DEPART_BM_POST_NOT_EXISTS);
}
return OALeaveApplyMembersVO.builder().pm(pmUsers.get(0).getUsername())
.bm(bmUsers.get(0).getUsername())
.hr(hrUsers.get(0).getUsername()).build();
}
}

View File

@ -6,22 +6,50 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
// TODO @芋艿:前缀,注释
// TODO @json类和方法的注释。咱是开源项目有注释大家才能更容易读懂
/**
* 用户任务服务接口
*/
public interface TaskService {
/**
* 获取当前用户的待办任务, 分页
*/
PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO);
/**
* 签收任务
* @param taskId 用户任务id
*/
void claimTask(String taskId);
/**
* 办理完成用户任务
* @param taskReq 任务参数, 包含任务的参数,和 评论
*/
void completeTask(TaskReqVO taskReq);
// void flowImage(String taskId, HttpServletResponse response);
/**
* 根据任务id, 查询已经完成的用户任务,未完成的用户任务
* @param taskQuery 查询参数 一般 taskId
*/
TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery);
/**
* 根据流程实例id, 查询历史用户任务,包括已完成,未完成
* @param processInstanceId 流程实例id
*/
List<TaskStepVO> getHistorySteps(String processInstanceId);
/**
* 获取用户任务的 formKey, 对应外置表单, 需要根据formKey 对应业务表单
* @param taskQuery 查询参数 ,一般taskId
*/
TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);

View File

@ -89,7 +89,7 @@ public class TaskServiceImpl implements TaskService {
/**
* 工作流,完成 userTask, 完成用户任务 一般传入参数 1。是否同意variables). 2. 评论(comment)
* variables 变量名 和 评论 由前台传入
* @param taskReq
* @param taskReq 任务参数
*/
@Override
@Transactional
@ -103,25 +103,7 @@ public class TaskServiceImpl implements TaskService {
.build());
}
// @Override
// public void flowImage(String taskId, HttpServletResponse response) {
//
// final Task task = taskRuntime.task(taskId);
// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// final Process process = bpmnModel.getMainProcess();
// ProcessDefinitionEntity processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
// List<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);
// List<String> highLightedFlows = getHighLightedFlows(processDefinition, processInstance.getId());
// ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
// InputStream imageStream =diagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds, highLightedFlows);
//
// // 输出资源内容到相应对象
// byte[] b = new byte[1024];
// int len;
// while ((len = imageStream.read(b, 0, 1024)) != -1) {
// response.getOutputStream().write(b, 0, len);
// }
// }
@Override
public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) {
@ -148,8 +130,7 @@ public class TaskServiceImpl implements TaskService {
// TODO @jason可以考虑把 comments 读取后,在统一调用 convert 拼接。另外 Comment 是废弃的类,有没其它可以使用的哈?
List<Comment> comments = activitiTaskService.getTaskComments(instance.getTaskId());
if (!CollUtil.isEmpty(comments)) {
// TODO @jasonIDEA 在 t.getFullMessage() 有提示告警,可以解决下。
stepVO.setComment(Optional.ofNullable(comments.get(0)).map(t->t.getFullMessage()).orElse(""));
stepVO.setComment(Optional.ofNullable(comments.get(0)).map(Comment::getFullMessage).orElse(""));
}
steps.add(stepVO);
});
@ -188,45 +169,11 @@ public class TaskServiceImpl implements TaskService {
return respVO;
}
// private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) {
//
// List<String> highLightedFlows = new ArrayList<String>();
// List<HistoricActivityInstance> historicActivityInstances = historyService
// .createHistoricActivityInstanceQuery()
// .processInstanceId(processInstanceId)
// .orderByHistoricActivityInstanceStartTime().asc().list();
//
// List<String> historicActivityInstanceList = new ArrayList<String>();
// for (HistoricActivityInstance hai : historicActivityInstances) {
// historicActivityInstanceList.add(hai.getActivityId());
// }
// // add current activities to list
// List<String> highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId);
// historicActivityInstanceList.addAll(highLightedActivities);
// activities and their sequence-flows
// for (ActivityImpl activity : processDefinition.getActivities()) {
// int index = historicActivityInstanceList.indexOf(activity.getId());
//
// if (index >= 0 && index + 1 < historicActivityInstanceList.size()) {
// List<PvmTransition> pvmTransitionList = activity
// .getOutgoingTransitions();
// for (PvmTransition pvmTransition : pvmTransitionList) {
// String destinationFlowId = pvmTransition.getDestination().getId();
// if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) {
// highLightedFlows.add(pvmTransition.getId());
// }
// }
// }
// }
// return highLightedFlows;
// }
@Override
public void getHighlightImg(String processInstanceId, HttpServletResponse response) {
// 查询历史
//TODO 云扬四海 貌似流程结束后,点击审批进度会报错
HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
// 如果有结束时间
if (hpi == null) {

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user;
import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserBaseVO;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
@ -8,9 +10,11 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUs
import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.logging.log4j.util.Strings;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
@Mapper
public interface SysUserMapper extends BaseMapperX<SysUserDO> {
@ -52,5 +56,13 @@ public interface SysUserMapper extends BaseMapperX<SysUserDO> {
return selectList(new QueryWrapperX<SysUserDO>().like("username", username));
}
default List<SysUserDO> selectListByBaseVO(SysUserBaseVO reqVO) {
return selectList(new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername())
.likeIfPresent("nickname", reqVO.getNickname())
.eq("status", CommonStatusEnum.ENABLE.getStatus())
.eq("dept_id", reqVO.getDeptId())
.likeIfPresent("post_ids", Optional.ofNullable(reqVO.getPostIds()).map(t -> Strings.join(t, ',')).orElse("")));
}
}

View File

@ -6,6 +6,7 @@
<settings>
<setting name="lazyLoadingEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
</settings>
<typeAliases>
<typeAlias type="org.activiti.engine.impl.persistence.ByteArrayRefTypeHandler" alias="ByteArrayRefTypeHandler"/>

View File

@ -1,152 +0,0 @@
<?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:xsd="http://www.w3.org/2001/XMLSchema" 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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://bpmn.io/schema/bpmn">
<process id="leave-formkey" name="请假流程-外置表单" isExecutable="true">
<documentation>外置表单</documentation>
<startEvent id="startevent1" name="Start" activiti:initiator="applyUserId" activiti:formKey="/flow/leave/apply"></startEvent>
<userTask id="deptLeaderVerify" name="部门经理审批" activiti:assignee="${deptLeader}" activiti:formKey="/flow/leave/approve-leader"></userTask>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<userTask id="hrVerify" name="人事经理审批" activiti:candidateGroups="hr" activiti:formKey="/flow/leave/approve-hr"></userTask>
<exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway>
<userTask id="reportBack" name="申请人确认" activiti:assignee="${applyUserId}" activiti:formKey="/flow/leave/confirm">
</userTask>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="modifyApply" name="调整申请内容" activiti:assignee="${applyUserId}" activiti:formKey="/flow/leave/modify"></userTask>
<exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway"></exclusiveGateway>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="deptLeaderVerify"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="deptLeaderVerify" targetRef="exclusivegateway1"></sequenceFlow>
<sequenceFlow id="flow3" name="同意" sourceRef="exclusivegateway1" targetRef="hrVerify">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptLeaderApproved == 'true'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" sourceRef="hrVerify" targetRef="exclusivegateway2"></sequenceFlow>
<sequenceFlow id="flow5" name="同意" sourceRef="exclusivegateway2" targetRef="reportBack">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrApproved == 'true'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow6" sourceRef="reportBack" targetRef="endevent1">
<extensionElements>
<activiti:executionListener event="take" delegateExpression="${reportBackEndProcessor}"></activiti:executionListener>
</extensionElements>
</sequenceFlow>
<sequenceFlow id="flow7" name="不同意" sourceRef="exclusivegateway2" targetRef="modifyApply">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrApproved == 'false'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow8" name="不同意" sourceRef="exclusivegateway1" targetRef="modifyApply">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptLeaderApproved == 'false'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow9" sourceRef="modifyApply" targetRef="exclusivegateway3"></sequenceFlow>
<sequenceFlow id="flow10" name="调整后继续申请" sourceRef="exclusivegateway3" targetRef="deptLeaderVerify">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${reApply == 'true'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow11" name="取消申请,并设置取消标志" sourceRef="exclusivegateway3" targetRef="endevent1">
<extensionElements>
<activiti:executionListener event="take" delegateExpression="${reportBackEndProcessor}"></activiti:executionListener>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${reApply == 'false'}]]></conditionExpression>
</sequenceFlow>
<textAnnotation id="textannotation1" textFormat="text/plain">
<text>请求被驳回后员工可以选择继续申请,或者取消本次申请</text>
</textAnnotation>
<association id="association1" sourceRef="modifyApply" targetRef="textannotation1"></association>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_leave-formkey">
<bpmndi:BPMNPlane bpmnElement="leave-formkey" id="BPMNPlane_leave-formkey">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="10.0" y="50.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="deptLeaderVerify" id="BPMNShape_deptLeaderVerify">
<omgdc:Bounds height="55.0" width="105.0" x="90.0" y="40.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
<omgdc:Bounds height="40.0" width="40.0" x="230.0" y="47.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="hrVerify" id="BPMNShape_hrVerify">
<omgdc:Bounds height="55.0" width="105.0" x="310.0" y="40.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
<omgdc:Bounds height="40.0" width="40.0" x="470.0" y="47.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="reportBack" id="BPMNShape_reportBack">
<omgdc:Bounds height="55.0" width="105.0" x="580.0" y="40.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="615.0" y="213.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="modifyApply" id="BPMNShape_modifyApply">
<omgdc:Bounds height="55.0" width="105.0" x="198.0" y="120.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="BPMNShape_exclusivegateway3">
<omgdc:Bounds height="40.0" width="40.0" x="230.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="textannotation1" id="BPMNShape_textannotation1">
<omgdc:Bounds height="57.0" width="112.0" x="340.0" y="168.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="45.0" y="67.0"></omgdi:waypoint>
<omgdi:waypoint x="90.0" y="67.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="195.0" y="67.0"></omgdi:waypoint>
<omgdi:waypoint x="230.0" y="67.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="270.0" y="67.0"></omgdi:waypoint>
<omgdi:waypoint x="310.0" y="67.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="11.0" width="22.0" x="269.0" y="50.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="415.0" y="67.0"></omgdi:waypoint>
<omgdi:waypoint x="470.0" y="67.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="510.0" y="67.0"></omgdi:waypoint>
<omgdi:waypoint x="580.0" y="67.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="11.0" width="22.0" x="529.0" y="50.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
<omgdi:waypoint x="632.0" y="95.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="213.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
<omgdi:waypoint x="490.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="490.0" y="147.0"></omgdi:waypoint>
<omgdi:waypoint x="303.0" y="147.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="11.0" width="33.0" x="438.0" y="119.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
<omgdi:waypoint x="250.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="250.0" y="120.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="11.0" width="33.0" x="260.0" y="87.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
<omgdi:waypoint x="250.0" y="175.0"></omgdi:waypoint>
<omgdi:waypoint x="250.0" y="210.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
<omgdi:waypoint x="230.0" y="230.0"></omgdi:waypoint>
<omgdi:waypoint x="142.0" y="230.0"></omgdi:waypoint>
<omgdi:waypoint x="142.0" y="95.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="11.0" width="77.0" x="159.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
<omgdi:waypoint x="270.0" y="230.0"></omgdi:waypoint>
<omgdi:waypoint x="615.0" y="230.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="33.0" width="100.0" x="58.0" y="-37.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association1" id="BPMNEdge_association1">
<omgdi:waypoint x="303.0" y="147.0"></omgdi:waypoint>
<omgdi:waypoint x="396.0" y="168.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@ -0,0 +1,177 @@
<?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">
<process id="leave-update" name="leave-update" isExecutable="true">
<startEvent id="start" name="开始" activiti:initiator="applyUserId" activiti:formKey="/flow/leave/apply" />
<exclusiveGateway id="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" name="请假天数" />
<sequenceFlow id="sid-8022586B-8169-44C2-84FA-46E8278EB2EC" sourceRef="start" targetRef="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" />
<userTask id="pmVerify" name="项目经理审批" activiti:assignee="${pm}" activiti:formKey="/flow/leave/approve"/>
<userTask id="bmVerify" name="部门经理审批" activiti:assignee="${bm}" activiti:formKey="/flow/leave/approve" />
<sequenceFlow id="sid-DE7C5477-8C20-42C5-ADE5-AB4A9A13D58D" name="大于3天" sourceRef="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" targetRef="bmVerify">
<conditionExpression xsi:type="tFormalExpression">${day&gt;3}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-B8A78811-23EE-47FA-9913-F04F056EBF99" name="小于等于3天" sourceRef="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" targetRef="pmVerify">
<conditionExpression xsi:type="tFormalExpression">${day&lt;=3}</conditionExpression>
</sequenceFlow>
<exclusiveGateway id="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" name="" />
<exclusiveGateway id="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" name="" />
<userTask id="hrVerify" name="人事审批" activiti:assignee="${hr}" activiti:formKey="/flow/leave/approve"/>
<endEvent id="end" />
<sequenceFlow id="sid-3BDD734B-CF1F-4ECA-A234-92BB81132A1E" name="不同意" sourceRef="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" targetRef="end">
<extensionElements>
<activiti:executionListener event="take" delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression">${approved =='false'}</conditionExpression>
</sequenceFlow>
<exclusiveGateway id="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" name="" />
<sequenceFlow id="sid-31C8FAA6-11F1-4744-99F6-D7DB98AB1B10" name="不同意" sourceRef="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" targetRef="end">
<extensionElements>
<activiti:executionListener event="take" delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression">${approved =='false'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-63703246-F9C8-4C23-966B-DBC627A81C96" sourceRef="bmVerify" targetRef="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" />
<sequenceFlow id="sid-F94C3FB1-CD76-4ED1-BDEC-57B9FCA97E16" name="同意" sourceRef="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" targetRef="hrVerify">
<conditionExpression xsi:type="tFormalExpression">${approved =='true'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-FA244B53-B5C2-41AB-85C6-CB2F40879779" name="同意" sourceRef="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" targetRef="hrVerify">
<conditionExpression xsi:type="tFormalExpression">${approved =='true'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-924D40AA-1A8E-4EC9-B73C-41D2A7DEFCCD" sourceRef="pmVerify" targetRef="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" />
<sequenceFlow id="sid-ED1242F0-B0A6-4677-A02C-D0D06715DEBD" sourceRef="hrVerify" targetRef="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" />
<sequenceFlow id="sid-B82F41EA-B147-4A19-AD93-A4EC3C40C92E" name="不同意" sourceRef="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" targetRef="end">
<extensionElements>
<activiti:executionListener event="take" delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression">${approved =='false'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-028073A9-C8C6-4B60-B0AC-6B61B79C17C4" name="同意" sourceRef="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" targetRef="end">
<extensionElements>
<activiti:executionListener event="take" delegateExpression="${leaveApplyEndProcessor}"></activiti:executionListener>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression">${approved =='true'}</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_leave-update">
<bpmndi:BPMNPlane id="BPMNPlane_leave-update" bpmnElement="leave-update">
<bpmndi:BPMNEdge id="BPMNEdge_sid-8022586B-8169-44C2-84FA-46E8278EB2EC" bpmnElement="sid-8022586B-8169-44C2-84FA-46E8278EB2EC">
<omgdi:waypoint x="112.75714598551785" y="126.17405584019453" />
<omgdi:waypoint x="143.71121010641568" y="126.40818009529674" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-DE7C5477-8C20-42C5-ADE5-AB4A9A13D58D" bpmnElement="sid-DE7C5477-8C20-42C5-ADE5-AB4A9A13D58D">
<omgdi:waypoint x="163.86363505003538" y="106.56060503891644" />
<omgdi:waypoint x="163.86363505003538" y="53.13651552996619" />
<omgdi:waypoint x="234.27272508339232" y="53.13651552996619" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="159" y="77" width="40" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-B8A78811-23EE-47FA-9913-F04F056EBF99" bpmnElement="sid-B8A78811-23EE-47FA-9913-F04F056EBF99">
<omgdi:waypoint x="163.36363505003538" y="146.06060503891644" />
<omgdi:waypoint x="163.36363505003538" y="189.4949990648568" />
<omgdi:waypoint x="234.27272508339232" y="189.4949990648568" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="148" y="165" width="62" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-924D40AA-1A8E-4EC9-B73C-41D2A7DEFCCD" bpmnElement="sid-924D40AA-1A8E-4EC9-B73C-41D2A7DEFCCD">
<omgdi:waypoint x="331.23231804130836" y="189.49499906485684" />
<omgdi:waypoint x="385.7878751389872" y="189.49499906485684" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-63703246-F9C8-4C23-966B-DBC627A81C96" bpmnElement="sid-63703246-F9C8-4C23-966B-DBC627A81C96">
<omgdi:waypoint x="326.19171605111364" y="53.34371922706731" />
<omgdi:waypoint x="371.04578381953866" y="53.54593921607711" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-3BDD734B-CF1F-4ECA-A234-92BB81132A1E" bpmnElement="sid-3BDD734B-CF1F-4ECA-A234-92BB81132A1E">
<omgdi:waypoint x="425.32578782529805" y="189.957086378546" />
<omgdi:waypoint x="643.3636579939932" y="189.52287904122937" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="518" y="172" width="33" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-FA244B53-B5C2-41AB-85C6-CB2F40879779" bpmnElement="sid-FA244B53-B5C2-41AB-85C6-CB2F40879779">
<omgdi:waypoint x="410.4195073141635" y="174.12663124003316" />
<omgdi:waypoint x="446.39393516122516" y="123.49474452854777" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="417" y="131" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-F94C3FB1-CD76-4ED1-BDEC-57B9FCA97E16" bpmnElement="sid-F94C3FB1-CD76-4ED1-BDEC-57B9FCA97E16">
<omgdi:waypoint x="396.41667858914667" y="67.35619707424723" />
<omgdi:waypoint x="446.39393516122516" y="100.69330097746277" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="410" y="66" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-B82F41EA-B147-4A19-AD93-A4EC3C40C92E" bpmnElement="sid-B82F41EA-B147-4A19-AD93-A4EC3C40C92E">
<omgdi:waypoint x="410.23752422668827" y="53.53535143670566" />
<omgdi:waypoint x="704.9797941833938" y="53.53535143670566" />
<omgdi:waypoint x="704.9797941833938" y="190.5669944706311" />
<omgdi:waypoint x="671.3600836513306" y="189.81010495572275" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="703" y="119" width="33" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-ED1242F0-B0A6-4677-A02C-D0D06715DEBD" bpmnElement="sid-ED1242F0-B0A6-4677-A02C-D0D06715DEBD">
<omgdi:waypoint x="542.3536331797492" y="111.73247557218357" />
<omgdi:waypoint x="567.6060552057011" y="111.73247557218357" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-31C8FAA6-11F1-4744-99F6-D7DB98AB1B10" bpmnElement="sid-31C8FAA6-11F1-4744-99F6-D7DB98AB1B10">
<omgdi:waypoint x="589.3360756732812" y="130.00245510460337" />
<omgdi:waypoint x="646.8251334621888" y="180.27870448400202" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="602" y="137" width="33" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_sid-028073A9-C8C6-4B60-B0AC-6B61B79C17C4" bpmnElement="sid-028073A9-C8C6-4B60-B0AC-6B61B79C17C4">
<omgdi:waypoint x="607.1060552057011" y="112.23247557218357" />
<omgdi:waypoint x="657.3636302334985" y="112.23247557218357" />
<omgdi:waypoint x="657.3636302334985" y="175.49499906485684" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="621" y="94" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="BPMNShape_startEvent1" bpmnElement="start">
<omgdc:Bounds x="83" y="111" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="87" y="148" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" bpmnElement="sid-AA8342FE-0C98-4CDC-B90F-B09B1AFB8F18" isMarkerVisible="true">
<omgdc:Bounds x="143" y="106" width="40" height="40" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="217" y="116" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-815754A6-1E86-43E5-8287-6D2A1DF59121" bpmnElement="pmVerify">
<omgdc:Bounds x="234" y="167" width="97" height="46" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-1E8B3F37-4DF8-459A-921C-74F2C210E3E2" bpmnElement="bmVerify">
<omgdc:Bounds x="234" y="30" width="92" height="46" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-57610114-27FA-4024-94BF-B0FFE4A02E90" bpmnElement="sid-57610114-27FA-4024-94BF-B0FFE4A02E90" isMarkerVisible="true">
<omgdc:Bounds x="386" y="169" width="40" height="40" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="384" y="216" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" bpmnElement="sid-287EF265-9109-4233-AEF1-14DF6FEF4B24" isMarkerVisible="true">
<omgdc:Bounds x="371" y="33" width="40" height="40" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="369" y="80" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-A9CA50A0-1773-4341-B123-85FD1F360277" bpmnElement="hrVerify">
<omgdc:Bounds x="446" y="91" width="96" height="42" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-1B06331A-52FE-4D1B-A62B-80E71ABB7D0E" bpmnElement="end">
<omgdc:Bounds x="643" y="175" width="28" height="28" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_sid-76B28F95-2D0C-4364-B898-AB1EC8182879" bpmnElement="sid-76B28F95-2D0C-4364-B898-AB1EC8182879" isMarkerVisible="true">
<omgdc:Bounds x="568" y="92" width="40" height="40" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="566" y="139" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>