update 发送消息

This commit is contained in:
liao
2023-11-16 10:08:05 +08:00
parent d10a0d5b72
commit 833ac1be92
14 changed files with 295 additions and 59 deletions
@@ -15,4 +15,6 @@ public class ProcessDefinitionKey {
public static final String FB_STANDARD_PURCHASE = "fb-standard-purchase"; // 法规采购流程
public static final String FB_STANDARD_COMPLIANCE_ASSESSMENT = "fb-standard-compliance-assessment"; // 法规合规评估流程
}
@@ -13,12 +13,19 @@ import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ProcessDraftService;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import com.spire.ms.System.Collections.ArrayList;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.springframework.web.bind.annotation.GetMapping;
@@ -28,8 +35,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Objects;
import java.util.*;
/**
* @Author: liao
@@ -48,6 +54,12 @@ public class ProcessFbInfoController {
private IProcessHandleService processHandleService;
@Resource
private ProcessDraftService processDraftService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Resource
private HistoryService historyService;
@DictPoint
@GetMapping("/getNodeList")
@@ -79,16 +91,65 @@ public class ProcessFbInfoController {
@ApiOperation(value = "测试")
@GetMapping("/test")
public Result<T> test() {
List<ProcessInstance> subProcessInstanceList = processHandleService
.subProcessList("20231114120041259", "Activity_0mj9ddw");
System.out.println("================================测试开始=================================");
subProcessInstanceList.forEach(subProcessInstance -> {
System.out.println("Sub Process Instance ID: " + subProcessInstance.getId());
System.out.println("Sub Process Definition Key: " + subProcessInstance.getProcessDefinitionKey());
// 其他子流程实例信息
System.out.println(subProcessInstance.toString());
Map<String, Object> variables = new HashMap<>();
variables.put("creator", "tom");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("test_countersign", variables);
String processInstanceId = processInstance.getId();
System.out.println("流程实例Id: " + processInstanceId);
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
System.out.println("============== 提出申请 ============");
taskList.forEach(task -> {
System.out.println("任务Id: " + task.getId());
System.out.println("任务名称: " + task.getName());
System.out.println("执行实例Id: " + task.getExecutionId());
System.out.println("任务处理人: " + task.getAssignee());
});
System.out.println("=======================================================================");
System.out.println("==========================");
List<String> leaderList = Arrays.asList(new String[] {"aaa", "bbb", "ccc"});
variables.put("leaderList", leaderList);
runtimeService.setVariables(processInstanceId, variables);
Task tomTask = taskList.get(0);
taskService.complete(tomTask.getId());
System.out.println("完成任务: " + tomTask.getId());
System.out.println("任务名称: " + tomTask.getName());
System.out.println("完成人: " + tomTask.getAssignee());
taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
System.out.println("============== 多人会签 ============");
taskList.forEach(task -> {
System.out.println("任务Id: " + task.getId());
System.out.println("任务名称: " + task.getName());
System.out.println("执行实例Id: " + task.getExecutionId());
System.out.println("任务处理人: " + task.getAssignee());
});
System.out.println("==========================");
System.out.println("============= 多人会签 =============");
taskList.forEach(task -> {
taskService.claim(task.getId(), task.getAssignee());
taskService.complete(task.getId());
System.out.println("完成任务: " + task.getId());
});
System.out.println("==========================");
taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
System.out.println("============== 汇总 ============");
taskList.forEach(task -> {
System.out.println("任务Id: " + task.getId());
System.out.println("任务名称: " + task.getName());
System.out.println("执行实例Id: " + task.getExecutionId());
System.out.println("任务处理人: " + task.getAssignee());
});
System.out.println("==========================");
tomTask = taskList.get(0);
taskService.complete(tomTask.getId());
System.out.println("完成任务: " + tomTask.getId());
System.out.println("任务名称: " + tomTask.getName());
System.out.println("完成人: " + tomTask.getAssignee());
return Result.OK();
}
@@ -29,7 +29,7 @@ import java.util.List;
*/
@Api(tags="法规采购流程表")
@RestController
@RequestMapping("/activiti.process.fb/processFbStandardPurchase")
@RequestMapping("/process/fb/processFbStandardPurchase")
@Slf4j
public class ProcessFbStandardPurchaseController extends JeroController<ProcessFbStandardPurchase, IProcessFbStandardPurchaseService> {
@Autowired
@@ -32,7 +32,7 @@ public interface IProcessHandleService {
* @Date: 2023/11/10 9:44
* @Description: 设置流程变量
**/
void setProcessVariables(String processInstanceId, Map<String, Object> userInfoMap);
Map<String, Object> setProcessVariables(Map<String, Object> userInfoMap);
/**
* @Author: liao
@@ -28,10 +28,7 @@ import com.jero.common.exception.JeroBootException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
@@ -135,17 +132,22 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
ProcessFbStandardConsultationVO businessInfoDTO = processInfoVO.getBusinessInfoDTO(); // 全部业务信息
ProcessFbConsultationUserLink userLink = businessInfoDTO.getProcessFbConsultationUserLink(); // 业务分派信息
String taskId = processInfoVO.getBasicTaskInfoDTO().getTaskId();
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String taskProcessInstanceId = task.getProcessInstanceId();
LambdaQueryWrapper<ProcessFbConsultationUserLink> removeWrapper = new LambdaQueryWrapper<>();
removeWrapper.eq(ProcessFbConsultationUserLink::getBusinessId, processInfoVO.getBusinessId());
removeWrapper.eq(ProcessFbConsultationUserLink::getDepartLeaderId, CurrentUserUtil.getId());
processFbConsultationUserLinkService.remove(removeWrapper); // 删除原先存储的关联
Map<String, Object> variables = new HashMap<>();
List<ProcessFbConsultationUserLink> linkList = new ArrayList<>();
if ("1".equals(userLink.getUserType())) { // 模块负责人
if (StringUtils.isBlank(userLink.getModuleOwnerId())) {
throw new JeroBootException(ResultCommon.EMPTY_COMMON, "moduleOwnerId");
}
List<String> moduleOwnerIds = Arrays.asList(userLink.getModuleOwnerId().split(","));
List<ProcessFbConsultationUserLink> linkList = new ArrayList<>();
moduleOwnerIds.forEach(moduleOwnerId -> {
ProcessFbConsultationUserLink link = new ProcessFbConsultationUserLink();
link.setBusinessId(processInfoVO.getBusinessId());
@@ -154,8 +156,32 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
linkList.add(link);
});
processFbConsultationUserLinkService.saveBatch(linkList, linkList.size());
variables.put("passFirst", true);
variables.put("moduleOwnerList", moduleOwnerIds);
} else { // 设计工程师
if (StringUtils.isBlank(userLink.getDesignEngineerId())) {
throw new JeroBootException(ResultCommon.EMPTY_COMMON, "designEngineerId");
}
List<String> designEngineerIds = Arrays.asList(userLink.getDesignEngineerId().split(","));
designEngineerIds.forEach(designEngineerId -> {
ProcessFbConsultationUserLink link = new ProcessFbConsultationUserLink();
link.setBusinessId(processInfoVO.getBusinessId());
link.setDepartLeaderId(CurrentUserUtil.getId());
link.setDesignEngineerId(designEngineerId);
linkList.add(link);
});
processFbConsultationUserLinkService.saveBatch(linkList, linkList.size());
variables.put("passFirst", false);
variables.put("designEngineerList", designEngineerIds);
}
// 完成任务
taskService.complete(taskId, variables);
System.out.println("================================启动流程=================================");
System.out.println("processInstanceId: " + processInfoVO.getBasicProcessInfoDTO().getProcessInstanceId());
System.out.println("taskProcessInstanceId: " + taskProcessInstanceId);
System.out.println("taskId: " + taskId);
System.out.println("=======================================================================");
}
}
@@ -80,7 +80,7 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
updateProcessAll(processInfoVO);
// 保存选人信息
setProcessVariables(processInstanceId, userInfoMap);
Map<String, Object> variables = setProcessVariables(userInfoMap);
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap);
// 根据流程实例id和任务处理人查询任务
@@ -95,11 +95,11 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
updateApprovalRecord(processInfoVO);
// 完成任务
taskService.complete(taskId);
taskService.complete(taskId, variables);
System.out.println("================================流程信息=================================");
System.out.println("================================启动流程=================================");
System.out.println("流程定义id: " + processDefinitionId);
System.out.println("流程实例id: " + processInstanceId);
System.out.println("流程实例name: " + processInstance.getName());
System.out.println("=======================================================================");
}
@@ -122,22 +122,28 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
String processInstanceId = processDTO.getProcessInstanceId();
String processDefinitionId = processDTO.getProcessDefinitionId();
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
Map<String, Object> variables = setProcessVariables(userInfoMap);
if (!Objects.isNull(userInfoMap) && !userInfoMap.isEmpty()) {
// 保存选人信息
setProcessVariables(processInstanceId, userInfoMap);
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap);
}
if (pass) { // 通过
runtimeService.setVariableLocal(processInstanceId, "pass", true);
variables.put("pass", true);
basicTaskInfoDTO.setCommitFlag(CommitFlagEnum.PASS.getValue());
} else { // 驳回
runtimeService.setVariableLocal(processInstanceId, "pass", false);
variables.put("pass", false);
basicTaskInfoDTO.setCommitFlag(CommitFlagEnum.REJECT.getValue());
}
// 更新审批记录表
updateApprovalRecord(processInfoVO);
// 完成任务
taskService.complete(taskId);
taskService.complete(taskId, variables);
System.out.println("================================启动流程=================================");
System.out.println("流程定义id: " + processDefinitionId);
System.out.println("流程实例id: " + processInstanceId);
System.out.println("任务id: " + taskId);
System.out.println("=======================================================================");
}
/**
@@ -146,16 +152,18 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
* @Description: 设置流程变量
**/
@Override
public void setProcessVariables(String processInstanceId, Map<String, Object> userInfoMap) {
public Map<String, Object> setProcessVariables(Map<String, Object> userInfoMap) {
Map<String, Object> variables = new HashMap<>();
userInfoMap.forEach((k, v) -> {
String value = (String) v;
if (k.contains("List") && StringUtils.isNotBlank(value)) { // 会签节点
List<String> userList = Arrays.asList(value.split(","));
runtimeService.setVariable(processInstanceId, k, userList);
} else { // 普通节点
runtimeService.setVariable(processInstanceId, k, v);
variables.put(k, userList);
} else if (StringUtils.isNotBlank(value)) { // 普通节点
variables.put(k, v);
}
});
return variables;
}
/**
@@ -9,6 +9,7 @@ import com.jero.common.util.MessageUtils;
import com.jero.common.util.MinioUtil;
import com.jero.common.api.vo.ResultCommon;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.laws.common.vo.LawsDictModel;
import com.jero.modules.laws.common.vo.ManyStandardSelectionBox;
import com.jero.modules.laws.common.vo.ManyStandardSelectionBoxVO;
import com.jero.modules.laws.enterprise.util.WaterMarkUtil;
@@ -26,6 +27,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* @Author: liao
@@ -69,6 +71,12 @@ public class LawsCommonController {
return Result.OK(lawsCommonService.getManyStandardSelectionBox(selectionBoxVO, pageNo, pageSize));
}
@ApiOperation(value="分标委下拉列表", notes="分标委下拉列表")
@GetMapping(value = "/getBiddingCommittee")
public Result<List<LawsDictModel>> getBiddingCommittee() {
return Result.OK(lawsCommonService.getBiddingCommittee());
}
/**
* 下载带水印的PDF文件
@@ -1,6 +1,7 @@
package com.jero.modules.laws.common.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jero.modules.laws.common.vo.LawsDictModel;
import com.jero.modules.laws.common.vo.ManyStandardSelectionBox;
import com.jero.modules.laws.common.vo.ManyStandardSelectionBoxVO;
import com.jero.modules.oss.entity.OSSFile;
@@ -183,4 +184,11 @@ public interface ILawsCommonService {
* @Description: 将标准编号集合中的标准改成废止状态
**/
void updateToAbolish(List<String> standardNumbers);
/**
* @Author: liao
* @Date: 2023/11/16 9:50
* @Description: 分标委下拉列表
**/
List<LawsDictModel> getBiddingCommittee();
}
@@ -18,6 +18,7 @@ import com.jero.common.api.vo.ResultCommon;
import com.jero.modules.laws.common.mapper.LawsCommonMapper;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.laws.common.util.ImportUtil;
import com.jero.modules.laws.common.vo.LawsDictModel;
import com.jero.modules.laws.common.vo.ManyStandardSelectionBox;
import com.jero.modules.laws.common.vo.ManyStandardSelectionBoxVO;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardAuthDept;
@@ -29,6 +30,8 @@ import com.jero.modules.laws.enterprise.util.EnterpriseStandardUtil;
import com.jero.modules.laws.enterprise.util.WaterMarkUtil;
import com.jero.modules.laws.standard.entity.*;
import com.jero.modules.laws.standard.service.*;
import com.jero.modules.laws.standardization.entity.LawsStandardization;
import com.jero.modules.laws.standardization.service.ILawsStandardizationService;
import com.jero.modules.oss.entity.OSSFile;
import com.jero.modules.oss.service.IOSSFileService;
import com.jero.modules.personal.entity.LawsBrowsingHistory;
@@ -117,6 +120,8 @@ public class LawsCommonServiceImpl implements ILawsCommonService {
private ILawsTreeNodeService lawsTreeNodeService;
@Autowired
private ILawsBrowsingHistoryService lawsBrowsingHistoryService;
@Resource
private ILawsStandardizationService lawsStandardizationService;
@Resource
private EnterpriseStandardInspectContentService esInspectContentService;
@@ -2099,6 +2104,27 @@ public class LawsCommonServiceImpl implements ILawsCommonService {
lawsEnterpriseStandardService.update(qbUpdateWrapper);
}
/**
* @Author: liao
* @Date: 2023/11/16 9:51
* @Description: 分标委下拉列表
**/
@Override
public List<LawsDictModel> getBiddingCommittee() {
LawsStandardization parent = lawsStandardizationService.getById("0");
LambdaQueryWrapper<LawsStandardization> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(LawsStandardization::getPid, parent.getId());
List<LawsStandardization> standardizationList = lawsStandardizationService.list(queryWrapper);
List<LawsDictModel> lawsDictModelList = new ArrayList<>();
standardizationList.forEach(standardization -> {
LawsDictModel lawsDictModel = new LawsDictModel();
lawsDictModel.setValue(standardization.getId());
lawsDictModel.setText(standardization.getName());
lawsDictModelList.add(lawsDictModel);
});
return lawsDictModelList;
}
/**
* 创建企标导入模板的Workbook
*
@@ -0,0 +1,23 @@
package com.jero.modules.laws.common.vo;
import lombok.Data;
/**
* @Author: liao
* @Date: 2023/11/16 9:46
* @Description: 字典模型
*/
@Data
public class LawsDictModel {
/**
* 字典value
*/
private String value;
/**
* 字典文本
*/
private String text;
}
@@ -29,11 +29,11 @@
<bpmn:outgoing>Flow_1ezcutn</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_0hpm8eq" sourceRef="depart_leader_start" targetRef="Gateway_0mogtm0" />
<bpmn:userTask id="design_engineer_2" name="填写征求意见,到期不填视为无意见">
<bpmn:userTask id="design_engineer_2" name="填写征求意见,到期不填视为无意见" activiti:assignee="${designEngineer}">
<bpmn:incoming>Flow_05oz1ja</bpmn:incoming>
<bpmn:outgoing>Flow_09jjte7</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics activiti:collection="designEngineerList" activiti:elementVariable="designEngineer">
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances== nrOfCompletedInstances}</bpmn:completionCondition>
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances == nrOfCompletedInstances}</bpmn:completionCondition>
</bpmn:multiInstanceLoopCharacteristics>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_05oz1ja" name="否" sourceRef="Gateway_0mogtm0" targetRef="design_engineer_2">
@@ -49,7 +49,7 @@
<bpmn:incoming>Flow_1ezcutn</bpmn:incoming>
<bpmn:outgoing>Flow_0oc8671</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics activiti:collection="moduleOwnerList" activiti:elementVariable="moduleOwner">
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances== nrOfCompletedInstances}</bpmn:completionCondition>
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances == nrOfCompletedInstances}</bpmn:completionCondition>
</bpmn:multiInstanceLoopCharacteristics>
<bpmn:startEvent id="Event_15afvr9">
<bpmn:outgoing>Flow_13krhma</bpmn:outgoing>
@@ -59,11 +59,11 @@
<bpmn:outgoing>Flow_0e4x3wm</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_13krhma" sourceRef="Event_15afvr9" targetRef="module_owner_start" />
<bpmn:userTask id="design_engineer_1" name="填写征求意见,到期不填视为无意见">
<bpmn:userTask id="design_engineer_1" name="填写征求意见,到期不填视为无意见" activiti:assignee="${designEngineer}">
<bpmn:incoming>Flow_0e4x3wm</bpmn:incoming>
<bpmn:outgoing>Flow_0vnqotz</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics activiti:collection="designEngineerList" activiti:elementVariable="designEngineer">
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances== nrOfCompletedInstances}</bpmn:completionCondition>
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances == nrOfCompletedInstances}</bpmn:completionCondition>
</bpmn:multiInstanceLoopCharacteristics>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0e4x3wm" sourceRef="module_owner_start" targetRef="design_engineer_1" />
@@ -102,11 +102,11 @@
<bpmn:outgoing>Flow_0qai32h</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0qai32h" sourceRef="depart_leader_end_2" targetRef="Event_0r7jsfk" />
<bpmn:userTask id="module_owner_end_2" name="汇总全部分发人审批意见-修改/通过">
<bpmn:userTask id="module_owner_end_2" name="汇总全部分发人审批意见-修改/通过" activiti:assignee="${moduleOwner}">
<bpmn:incoming>Flow_0f48izh</bpmn:incoming>
<bpmn:outgoing>Flow_14aeapm</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics activiti:collection="moduleOwnerList" activiti:elementVariable="moduleOwner">
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances== nrOfCompletedInstances}</bpmn:completionCondition>
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances == nrOfCompletedInstances}</bpmn:completionCondition>
</bpmn:multiInstanceLoopCharacteristics>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_14aeapm" sourceRef="module_owner_end_2" targetRef="depart_leader_end_1" />
@@ -196,13 +196,6 @@
<dc:Bounds x="160" y="360" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_0k4hx5w" bpmnElement="depart_leader_end_3">
<dc:Bounds x="1780" y="430" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_07yr7ob_di" bpmnElement="Event_07yr7ob">
<dc:Bounds x="1492" y="502" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0mj9ddw_di" bpmnElement="Activity_0mj9ddw" isExpanded="true">
<dc:Bounds x="320" y="40" width="1120" height="690" />
</bpmndi:BPMNShape>
@@ -223,16 +216,6 @@
<dc:Bounds x="730" y="360" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0r7jsfk_di" bpmnElement="Event_0r7jsfk">
<dc:Bounds x="1252" y="552" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_18s4mik" bpmnElement="module_owner_end_2">
<dc:Bounds x="1090" y="340" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1xd2kp3_di" bpmnElement="Gateway_1xd2kp3" isMarkerVisible="true">
<dc:Bounds x="1245" y="435" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0gcol5c_di" bpmnElement="depart_leader_end_1">
<dc:Bounds x="890" y="420" width="100" height="80" />
<bpmndi:BPMNLabel />
@@ -274,10 +257,20 @@
<di:waypoint x="1220" y="210" />
<di:waypoint x="1282" y="210" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Gateway_1xd2kp3_di" bpmnElement="Gateway_1xd2kp3" isMarkerVisible="true">
<dc:Bounds x="1245" y="435" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0r7jsfk_di" bpmnElement="Event_0r7jsfk">
<dc:Bounds x="1252" y="552" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_1qjvmbo" bpmnElement="depart_leader_end_2">
<dc:Bounds x="730" y="530" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_18s4mik" bpmnElement="module_owner_end_2">
<dc:Bounds x="1090" y="340" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1gv6jmb_di" bpmnElement="Flow_1gv6jmb">
<di:waypoint x="378" y="400" />
<di:waypoint x="430" y="400" />
@@ -344,6 +337,13 @@
<bpmndi:BPMNShape id="Gateway_0pd0196_di" bpmnElement="Gateway_0pd0196" isMarkerVisible="true">
<dc:Bounds x="1585" y="495" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_07yr7ob_di" bpmnElement="Event_07yr7ob">
<dc:Bounds x="1492" y="502" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_0k4hx5w" bpmnElement="depart_leader_end_3">
<dc:Bounds x="1780" y="430" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0qqp5sb_di" bpmnElement="Activity_0qqp5sb" isExpanded="true">
<dc:Bounds x="1492" y="600" width="528" height="240" />
</bpmndi:BPMNShape>
@@ -354,16 +354,16 @@
<dc:Bounds x="1590" y="680" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_035drax" bpmnElement="depart_leader_end_4">
<dc:Bounds x="1730" y="680" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1pq4fen_di" bpmnElement="Gateway_1pq4fen" isMarkerVisible="true">
<dc:Bounds x="1865" y="695" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_07vxc54_di" bpmnElement="Event_07vxc54">
<dc:Bounds x="1952" y="702" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_035drax" bpmnElement="depart_leader_end_4">
<dc:Bounds x="1730" y="680" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1bfoa9n_di" bpmnElement="Flow_1bfoa9n">
<di:waypoint x="1548" y="720" />
<di:waypoint x="1590" y="720" />
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:bpmn="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:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<bpmn:process id="test_countersign" name="测试会签流程" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_11ole3t</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="start_process" name="提出申请" activiti:assignee="${creator}">
<bpmn:incoming>Flow_11ole3t</bpmn:incoming>
<bpmn:outgoing>Flow_14ls1wj</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_11ole3t" sourceRef="StartEvent_1" targetRef="start_process" />
<bpmn:userTask id="countersign" name="多人会签" activiti:assignee="${leader}">
<bpmn:incoming>Flow_14ls1wj</bpmn:incoming>
<bpmn:outgoing>Flow_1lnd67n</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics activiti:collection="leaderList" activiti:elementVariable="leader">
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfInstances==nrOfCompletedInstances}</bpmn:completionCondition>
</bpmn:multiInstanceLoopCharacteristics>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_14ls1wj" sourceRef="start_process" targetRef="countersign" />
<bpmn:userTask id="end_process" name="汇总" activiti:assignee="${creator}">
<bpmn:incoming>Flow_1lnd67n</bpmn:incoming>
<bpmn:outgoing>Flow_1sn8gxp</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1lnd67n" sourceRef="countersign" targetRef="end_process" />
<bpmn:endEvent id="Event_1tpa9t3">
<bpmn:incoming>Flow_1sn8gxp</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1sn8gxp" sourceRef="end_process" targetRef="Event_1tpa9t3" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="test_countersign">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="79" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1mn9ou0_di" bpmnElement="start_process">
<dc:Bounds x="270" y="57" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_182083l_di" bpmnElement="countersign">
<dc:Bounds x="430" y="57" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0g2pw4w_di" bpmnElement="end_process">
<dc:Bounds x="590" y="57" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1tpa9t3_di" bpmnElement="Event_1tpa9t3">
<dc:Bounds x="752" y="79" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_11ole3t_di" bpmnElement="Flow_11ole3t">
<di:waypoint x="215" y="97" />
<di:waypoint x="270" y="97" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_14ls1wj_di" bpmnElement="Flow_14ls1wj">
<di:waypoint x="370" y="97" />
<di:waypoint x="430" y="97" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1lnd67n_di" bpmnElement="Flow_1lnd67n">
<di:waypoint x="530" y="97" />
<di:waypoint x="590" y="97" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1sn8gxp_di" bpmnElement="Flow_1sn8gxp">
<di:waypoint x="690" y="97" />
<di:waypoint x="752" y="97" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>