Commit ee6e03cf by chenweisong

更新

parent d7ac0dd2
......@@ -33,7 +33,7 @@ public class Swagger2Config {
ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("补录系统")
.description("补录系统api")
.description("补录系统接口列表")
.termsOfServiceUrl("")
.version("1.0.0")
.contact(new Contact("", "", ""))
......@@ -55,7 +55,7 @@ public class Swagger2Config {
return new Docket(DocumentationType.SWAGGER_2)
.host(this.host)
.select()
.apis(RequestHandlerSelectors.basePackage("com.keymobile.rest.ctrl"))
.apis(RequestHandlerSelectors.basePackage("com.keymobile.rest.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(this.apiInfo());
......
package com.keymobile.rest.common.constant;
public interface AssignmentConstant {
int KIND_RECORD = 1;
int KIND_AUDIT = 2;
int TYPE_AUTO = 2;
int TYPE_MANUAL = 1;
int STATUS_RELEASED = 2;
int STATUS_UNRELEASED = 1;
int STATUS_COMPLETED = 3;
int AUDIT_NEED = 1;
int AUDIT_NO_NEED = 2;
}
package com.keymobile.rest.common.constant;
public interface TemplateConstant {
}
package com.keymobile.rest.controller;
import com.google.common.collect.ImmutableMap;
import com.keymobile.rest.common.bean.ApiResponse;
import com.keymobile.rest.model.*;
import com.keymobile.rest.service.ExcelService;
import com.keymobile.rest.service.JobInfoService;
import com.keymobile.rest.service.UserService;
import com.keymobile.rest.vo.RecordDataForm;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.activiti.engine.*;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(value = "模板控制器")
@RestController
@RequestMapping(path = "/api/excel")
public class ExcelController {
@Autowired
private RecordDataService recordDataService;
@Autowired
private ExcelService excelService;
@Autowired
private JobInfoService jobInfoService;
@Autowired
private UserService userService;
@Autowired
private TaskService taskService;
@ApiOperation(value = "填写补录数据")
@PostMapping(value = "/excel/saveData")
public ApiResponse saveRecordData(@RequestBody RecordDataForm form) {
User curUser = userService.getNormalUser();
Template template = excelService.get(form.getExcelId());
ProcessInfo processInfo = jobInfoService.findByExcelIdAndUserId(form.getExcelId(), curUser.getId());
DataInfo dataInfo;
if (form.getDataId() != null) {
dataInfo = recordDataService.update(form);
} else {
form.setProcessInfo(processInfo);
dataInfo = recordDataService.save(form);
}
Assignment assignment = template.getAssignment();
String processId = assignment.getProcessId();
// 发起人把流程发送到下一个人
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processId)
.taskAssignee(curUser.getUsername()).list();
Task task = taskList.get(0);
User judge = userService.getAudit();
taskService.complete(task.getId(), ImmutableMap.of("judgeId", judge.getUsername()));
return ApiResponse.ok(dataInfo.getId());
}
@ApiOperation(value = "传excelId过来,获取用户填写的数据")
@PostMapping(value = "/excel/getData")
public ApiResponse getRecordData(@RequestParam long excelId) {
User curUser = userService.getNormalUser();
ProcessInfo processInfo = jobInfoService.findByExcelIdAndUserId(excelId, curUser.getId());
List<DataInfo> dataInfoList = processInfo.getDataInfoList();
if (dataInfoList.size() > 0) {
return ApiResponse.ok(dataInfoList.get(0));
} else {
return ApiResponse.ok();
}
}
}
package com.keymobile.rest.ctrl;
package com.keymobile.rest.controller;
import com.google.common.collect.ImmutableMap;
import com.keymobile.activiti.service.formService.FormExcelFileService;
import com.keymobile.rest.common.bean.ApiResponse;
import com.keymobile.rest.common.validator.TwinkleValidator;
import com.keymobile.rest.model.*;
import com.keymobile.rest.service.*;
import com.keymobile.rest.vo.*;
import com.keymobile.rest.model.Template;
import com.keymobile.rest.model.Assignment;
import com.keymobile.rest.model.ProcessInfo;
import com.keymobile.rest.model.User;
import com.keymobile.rest.service.ExcelService;
import com.keymobile.rest.service.JobInfoService;
import com.keymobile.rest.service.JobService;
import com.keymobile.rest.service.UserService;
import com.keymobile.rest.vo.ExcelForm;
import com.keymobile.rest.vo.JobForm;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.java.Log;
import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
......@@ -24,10 +29,14 @@ import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
@Log
@RestController
@RequestMapping(path = "/api")
public class IndexCtrl {
@RequestMapping(path = "/api/task")
@Api(value = "活动控制器")
public class TaskController {
// 默认启动的固化流程
@Value("${app.active-process}")
private String process;
@Autowired
private ManagementService managementService;
......@@ -36,8 +45,6 @@ public class IndexCtrl {
@Autowired
private ExcelService excelService;
@Autowired
private RecordDataService recordDataService;
@Autowired
private JobInfoService jobInfoService;
@Autowired
private UserService userService;
......@@ -47,20 +54,12 @@ public class IndexCtrl {
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private ProcessEngineConfigurationImpl processEngineConfiguration;
@Autowired
private FormExcelFileService formExcelFileService;
@Value("${app.active-process}")
private String process;
@ApiOperation(value = "获取首页活动列表")
@PostMapping(value = "/task/list")
@PostMapping(value = "/list")
public ApiResponse getTaskList(@RequestParam Integer pageNo, @RequestParam Integer pageSize, @RequestParam(required = false) @ApiParam(name = "name", value = "活动名称") String name) {
Page<Job> taskList;
Page<Assignment> taskList;
String orderBy = "descending"; //
String propBy = "id"; // groupBy
if (name != null) {
......@@ -72,20 +71,20 @@ public class IndexCtrl {
}
@ApiOperation(value = "查看活动")
@PostMapping(value = "/task/get")
@PostMapping(value = "/get")
public ApiResponse get(@RequestParam @ApiParam(required = true, name = "taskId", value = "活动id") Long taskId) {
Job job = jobService.get(taskId);
TwinkleValidator.notNull(job, "活动不存在");
return ApiResponse.ok(job);
Assignment assignment = jobService.get(taskId);
TwinkleValidator.notNull(assignment, "活动不存在");
return ApiResponse.ok(assignment);
}
@ApiOperation(value = "补录任务列表及审核任务列表")
@PostMapping(value = "/task/getMyTasks")
@PostMapping(value = "/getMyTasks")
public ApiResponse getMyTasks() {
User user = userService.getNormalUser();
User audit = userService.getAudit();
List<Job> jobList = new ArrayList<>();
List<Assignment> assignmentList = new ArrayList<>();
// 获取任务
List<Task> tasks = taskService.createNativeTaskQuery()
.sql("SELECT * FROM " + managementService.getTableName(Task.class) + " T WHERE T.ASSIGNEE_ = #{assignee1} OR T.ASSIGNEE_ = #{assignee2}")
......@@ -94,23 +93,23 @@ public class IndexCtrl {
for (Task task : tasks) {
String processId = task.getProcessInstanceId();
Job job = jobService.findByProcessId(processId);
if (job != null && job.getStatus() != Job.STATUS_COMPLETED) {
Assignment assignment = jobService.findByProcessId(processId);
if (assignment != null && assignment.getStatus() != Assignment.STATUS_COMPLETED) {
if (task.getTaskDefinitionKey().equals("addData")) {
job.setKind(Job.KIND_RECORD);
assignment.setKind(Assignment.KIND_RECORD);
} else {
job.setKind(Job.KIND_AUDIT);
assignment.setKind(Assignment.KIND_AUDIT);
}
jobList.add(job);
assignmentList.add(assignment);
}
}
return ApiResponse.ok(jobList);
return ApiResponse.ok(assignmentList);
}
@ApiOperation(value = "新建活动")
@PostMapping(value = "/task/create")
@PostMapping(value = "/create")
public ApiResponse createTask(@RequestBody JobForm form) {
TwinkleValidator.notEmpty(form.getName(), "名称不能为空");
TwinkleValidator.notNull(form.getType(), "类型不能为空");
......@@ -118,59 +117,59 @@ public class IndexCtrl {
// 创建人
User manager = userService.getManager();
form.setUser(manager);
Job job = jobService.save(form);
Assignment assignment = jobService.save(form);
// 新建excel实例
List<ExcelForm> excelFormList = form.getExcels();
excelFormList.forEach(excelForm -> {
TwinkleValidator.notEmpty(excelForm.getUserIds(), "补录人不能为空");
excelForm.setJob(job);
Excel excel = excelService.save(excelForm);
excelForm.setAssignment(assignment);
Template template = excelService.save(excelForm);
// 新建补录人员任务关联
String[] userIds = excelForm.getUserIds().split(",");
List<Long> userIdList = Arrays.asList(userIds).stream().map(Long::parseLong).collect(Collectors.toList());
List<User> userList = userService.findAllByIdIn(userIdList);
TwinkleValidator.notLessThan(userList.size(), 1, "补录人员不存在");
userList.forEach(user -> {
jobInfoService.save(user, excel);
jobInfoService.save(user, template);
});
});
return ApiResponse.ok(job.getId());
return ApiResponse.ok(assignment.getId());
}
@ApiOperation(value = "修改活动")
@PostMapping(value = "/task/update")
@PostMapping(value = "/update")
public ApiResponse updateTask(@RequestBody JobForm form) {
TwinkleValidator.isFalse((form.getId() == null && form.getId() <= 0), "活动id不能为空");
Job job = jobService.get(form.getId());
TwinkleValidator.notNull(job, "活动不存在");
int status = job.getStatus();
TwinkleValidator.isFalse(status != Job.STATUS_UNRELEASED, "活动已经发起");
Assignment assignment = jobService.get(form.getId());
TwinkleValidator.notNull(assignment, "活动不存在");
int status = assignment.getStatus();
TwinkleValidator.isFalse(status != Assignment.STATUS_UNRELEASED, "活动已经发起");
TwinkleValidator.notEmpty(form.getName(), "名称不能为空");
TwinkleValidator.notNull(form.getType(), "类型不能为空");
TwinkleValidator.isFalse((form.getExcels() == null || form.getExcels().size() == 0), "补录模板不能为空");
job.setType(form.getType());
job.setRemark(form.getRemark());
job.setName(form.getName());
jobService.update(job);
assignment.setType(form.getType());
assignment.setRemark(form.getRemark());
assignment.setName(form.getName());
jobService.update(assignment);
// 新建excel实例
List<ExcelForm> excelFormList = form.getExcels();
excelFormList.forEach(excelForm -> {
Excel excel = excelService.get(excelForm.getId());
TwinkleValidator.notNull(excel, "模板不存在");
excel.setName(excelForm.getName());
excel.setConfig(excelForm.getConfig());
excel.setRemark(excelForm.getRemark());
excel.setDataAt(excelForm.getDataAt());
excelService.update(excel);
Template template = excelService.get(excelForm.getId());
TwinkleValidator.notNull(template, "模板不存在");
template.setName(excelForm.getName());
template.setConfig(excelForm.getConfig());
template.setRemark(excelForm.getRemark());
template.setDataAt(excelForm.getDataAt());
excelService.update(template);
});
return ApiResponse.ok(job.getId());
return ApiResponse.ok(assignment.getId());
}
@ApiOperation(value = "手动发起活动")
@PostMapping(value = "/task/start")
@PostMapping(value = "/start")
public ApiResponse startTask(@RequestParam Long taskId) {
Job job = jobService.get(taskId);
TwinkleValidator.notNull(job, "活动不存在");
Assignment assignment = jobService.get(taskId);
TwinkleValidator.notNull(assignment, "活动不存在");
// 部署补录流程
Deployment deploy = repositoryService
.createDeployment()
......@@ -181,53 +180,53 @@ public class IndexCtrl {
createProcessDefinitionQuery().
deploymentId(deploy.getId()).
singleResult();
String inputUser = job.getUser().getUsername();
String inputUser = assignment.getUser().getUsername();
Map<String, Object> variables = new HashMap<>();
variables.put("managerId", inputUser);
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinition.getKey(), variables);
job.setProcessId(processInstance.getId());
jobService.update(job);
assignment.setProcessId(processInstance.getId());
jobService.update(assignment);
// 发起人把流程发送到下一个人
Task resultTask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).
taskInvolvedUser(inputUser).singleResult();
// 根据活动查找需要填写的人 目前只支持一人
List<Excel> excelList = job.getExcelList();
TwinkleValidator.notLessThan(excelList.size(), 1, "补录模板不存在");
List<Template> templateList = assignment.getTemplateList();
TwinkleValidator.notLessThan(templateList.size(), 1, "补录模板不存在");
Excel excel = excelList.get(0);
List<JobInfo> jobInfoList = jobInfoService.findAllByExcelId(excel.getId());
TwinkleValidator.notLessThan(jobInfoList.size(), 1, "补录人员不存在");
taskService.complete(resultTask.getId(), ImmutableMap.of("userId", jobInfoList.get(0).getUser().getUsername()));
Template template = templateList.get(0);
List<ProcessInfo> processInfoList = jobInfoService.findAllByExcelId(template.getId());
TwinkleValidator.notLessThan(processInfoList.size(), 1, "补录人员不存在");
taskService.complete(resultTask.getId(), ImmutableMap.of("userId", processInfoList.get(0).getUser().getUsername()));
return ApiResponse.ok();
}
@ApiOperation(value = "审核通过活动")
@PostMapping(value = "/task/pass")
@PostMapping(value = "/pass")
public ApiResponse passTask(@RequestParam Long taskId) {
Job job = jobService.get(taskId);
Assignment assignment = jobService.get(taskId);
// 完结活动, 流程跑完
User judge = userService.getAudit();
List<Task> taskList = taskService.createTaskQuery().processInstanceId(job.getProcessId())
List<Task> taskList = taskService.createTaskQuery().processInstanceId(assignment.getProcessId())
.taskAssignee(judge.getUsername()).list();
TwinkleValidator.notLessThan(taskList.size(), 1, "启动失败");
Task task = taskList.get(0);
taskService.complete(task.getId(), ImmutableMap.of("pass", "true"));
job.setStatus(Job.STATUS_COMPLETED);
jobService.update(job);
assignment.setStatus(Assignment.STATUS_COMPLETED);
jobService.update(assignment);
return ApiResponse.ok();
}
@ApiOperation(value = "审核驳回活动")
@PostMapping(value = "/task/reject")
@PostMapping(value = "/reject")
public ApiResponse rejectTask(@RequestParam Long taskId) {
Job job = jobService.get(taskId);
Assignment assignment = jobService.get(taskId);
// 完结活动, 流程跑完
User judge = userService.getAudit();
List<Task> taskList = taskService.createTaskQuery().processInstanceId(job.getProcessId())
List<Task> taskList = taskService.createTaskQuery().processInstanceId(assignment.getProcessId())
.taskAssignee(judge.getUsername()).list();
TwinkleValidator.notLessThan(taskList.size(), 1, "启动失败");
Task task = taskList.get(0);
......@@ -235,57 +234,11 @@ public class IndexCtrl {
return ApiResponse.ok();
}
// @ApiOperation(value = "查看当前活动进度")
// @ApiOperation(value = "查看当前活动进度")
// @PostMapping(value = "/task/viewTaskProcess")
// public ApiResponse viewTaskProcess(@RequestParam Long taskId) {
// return ApiResponse.ok();
// }
@ApiOperation(value = "获取补录人员列表")
@PostMapping(value = "/user/list")
public ApiResponse getUserList() {
List<User> userList = userService.findAllByRole(User.ROLE_NORMAL);
return ApiResponse.ok(userList);
}
@ApiOperation(value = "填写补录数据")
@PostMapping(value = "/excel/saveData")
public ApiResponse saveRecordData(@RequestBody RecordDataForm form) {
User curUser = userService.getNormalUser();
Excel excel = excelService.get(form.getExcelId());
JobInfo jobInfo = jobInfoService.findByExcelIdAndUserId(form.getExcelId(), curUser.getId());
RecordData recordData;
if (form.getDataId() != null) {
recordData = recordDataService.update(form);
} else {
form.setJobInfo(jobInfo);
recordData = recordDataService.save(form);
}
Job job = excel.getJob();
String processId = job.getProcessId();
// 发起人把流程发送到下一个人
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processId)
.taskAssignee(curUser.getUsername()).list();
Task task = taskList.get(0);
User judge = userService.getAudit();
taskService.complete(task.getId(), ImmutableMap.of("judgeId", judge.getUsername()));
return ApiResponse.ok(recordData.getId());
}
@ApiOperation(value = "传excelId过来,获取用户填写的数据")
@PostMapping(value = "/excel/getData")
public ApiResponse getRecordData(@RequestParam long excelId) {
User curUser = userService.getNormalUser();
JobInfo jobInfo = jobInfoService.findByExcelIdAndUserId(excelId, curUser.getId());
List<RecordData> recordDataList = jobInfo.getRecordDataList();
if (recordDataList.size() > 0) {
return ApiResponse.ok(recordDataList.get(0));
} else {
return ApiResponse.ok();
}
}
}
package com.keymobile.rest.controller;
import com.google.common.collect.ImmutableMap;
import com.keymobile.activiti.service.formService.FormExcelFileService;
import com.keymobile.rest.common.bean.ApiResponse;
import com.keymobile.rest.model.*;
import com.keymobile.rest.service.*;
import com.keymobile.rest.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@Api(value = "用户控制器")
@RestController
@RequestMapping(path = "/api/user")
public class UserController {
@Autowired
private UserService userService;
@ApiOperation(value = "获取补录人员列表")
@PostMapping(value = "/user/list")
public ApiResponse getUserList() {
List<User> userList = userService.findAllByRole(User.ROLE_NORMAL);
return ApiResponse.ok(userList);
}
}
package com.keymobile.rest.dao;
import com.keymobile.rest.model.Excel;
import com.keymobile.rest.model.Template;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ExcelDao extends JpaRepository<Excel, Long> {
public interface ExcelDao extends JpaRepository<Template, Long> {
List<Excel> findAllByIdIn(List<Long> ids);
List<Template> findAllByIdIn(List<Long> ids);
List<Excel> findAllByJobId(long jid);
List<Template> findAllByJobId(long jid);
}
package com.keymobile.rest.dao;
import com.keymobile.rest.model.Job;
import com.keymobile.rest.model.Assignment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface JobDao extends JpaRepository<Job, Long> {
public interface JobDao extends JpaRepository<Assignment, Long> {
Page<Job> findAll(Pageable pageable);
Page<Assignment> findAll(Pageable pageable);
Page<Job> findAllByNameLike(String valueOf, Pageable pageable);
Page<Assignment> findAllByNameLike(String valueOf, Pageable pageable);
Job findByProcessId(String pid);
Assignment findByProcessId(String pid);
}
package com.keymobile.rest.dao;
import com.keymobile.rest.model.JobInfo;
import com.keymobile.rest.model.ProcessInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface JobInfoDao extends JpaRepository<JobInfo, Long> {
public interface JobInfoDao extends JpaRepository<ProcessInfo, Long> {
List<JobInfo> findAllByExcelId(long eid);
List<ProcessInfo> findAllByExcelId(long eid);
List<JobInfo> findAllByUserId(long uid);
List<ProcessInfo> findAllByUserId(long uid);
void deleteAllByExcelId(long eid);
JobInfo findByExcelIdAndUserId(long eid, long uid);
ProcessInfo findByExcelIdAndUserId(long eid, long uid);
}
package com.keymobile.rest.dao;
import com.keymobile.rest.model.RecordData;
import com.keymobile.rest.model.DataInfo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface RecordDataDao extends JpaRepository<RecordData, Long> {
public interface RecordDataDao extends JpaRepository<DataInfo, Long> {
......
package com.keymobile.rest.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
......@@ -13,28 +12,15 @@ import java.io.Serializable;
import java.util.List;
/**
* @name 流程、任务
* @desc 包含属于哪个activiti流程、相关人员、附件信息id
* @name 活动, 任务
* @desc 包含一些活动的定义以及绑定一些spreadJs生成的excel模板
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@NoArgsConstructor // 自动生成无参数构造函数。
@AllArgsConstructor // 自动生成全参数构造函数。
@NoArgsConstructor
@Data
@Entity
public class Job implements Serializable {
public class Assignment implements Serializable {
public static int KIND_RECORD = 1;
public static int KIND_AUDIT = 2;
public static int TYPE_AUTO = 2;
public static int TYPE_MANUAL = 1;
public static int STATUS_RELEASED = 2;
public static int STATUS_UNRELEASED = 1;
public static int STATUS_COMPLETED = 3;
public static int AUDIT_NEED = 1;
public static int AUDIT_NO_NEED = 2;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......@@ -44,20 +30,17 @@ public class Job implements Serializable {
private String name;
@Column(nullable = false)
private int type = 1;
private int type;
@Column(nullable = false)
private int status = 1;
private int status;
@Column(nullable = false)
private int audit = 1;
private int needAudit;
@Column
private String remark;
@Column(name = "process_id")
private String processId;
// 报送频度 按年 按年 按周 按月 按日 自动推送
@Column(name = "start_at")
private Timestamp startAt;
......@@ -67,14 +50,9 @@ public class Job implements Serializable {
@CreationTimestamp
private Timestamp createAt;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "job")
private List<Excel> excelList;
private List<Template> templateList;
@ManyToOne
private User user;
@Transient
private int kind;
}
......@@ -2,7 +2,6 @@ package com.keymobile.rest.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
......@@ -12,14 +11,13 @@ import java.io.Serializable;
import java.sql.Timestamp;
/**
* spreadJs 填写的数据
* 已经填写的数据实例
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class RecordData implements Serializable {
public class DataInfo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......@@ -34,5 +32,5 @@ public class RecordData implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private JobInfo jobInfo;
private ProcessInfo processInfo;
}
package com.keymobile.rest.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
/**
* @name 进程
* @desc
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@NoArgsConstructor
@Data
@Entity
public class Process implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
// activiti运行中的流程实例id
@Column(name = "process_id")
private String processId;
}
package com.keymobile.rest.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
......@@ -13,14 +11,13 @@ import java.sql.Timestamp;
import java.util.List;
/**
* spreadJs 补录人员信息
* 进程&指派人员关系
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class JobInfo implements Serializable {
public class ProcessInfo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......@@ -31,12 +28,12 @@ public class JobInfo implements Serializable {
private Timestamp createAt;
@OneToOne
private Excel excel;
private Template template;
@OneToOne
private User user;
@OneToMany(mappedBy = "jobInfo", fetch = FetchType.EAGER)
List<RecordData> recordDataList;
List<DataInfo> dataInfoList;
}
......@@ -2,7 +2,6 @@ package com.keymobile.rest.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
......@@ -10,17 +9,15 @@ import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.List;
/**
* spreadJs 配置的报表
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Excel implements Serializable {
public class Template implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......@@ -44,5 +41,5 @@ public class Excel implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private Job job;
private Assignment assignment;
}
package com.keymobile.rest.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -10,7 +9,6 @@ import java.io.Serializable;
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class User implements Serializable {
......
......@@ -2,7 +2,7 @@ package com.keymobile.rest.service;
import com.keymobile.activiti.utils.DateUtil;
import com.keymobile.rest.dao.*;
import com.keymobile.rest.model.Excel;
import com.keymobile.rest.model.Template;
import com.keymobile.rest.vo.ExcelForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -16,36 +16,36 @@ public class ExcelService {
@Autowired
private ExcelDao excelDao;
public Excel save(ExcelForm form) {
Excel excel = new Excel();
excel.setName(form.getName());
excel.setDataAt(1);
excel.setConfig(form.getConfig());
excel.setRemark(form.getRemark());
excel.setJob(form.getJob());
public Template save(ExcelForm form) {
Template template = new Template();
template.setName(form.getName());
template.setDataAt(1);
template.setConfig(form.getConfig());
template.setRemark(form.getRemark());
template.setAssignment(form.getAssignment());
Timestamp now = Timestamp.valueOf(DateUtil.getDateTime());
excel.setCreateAt(now);
excel = excelDao.save(excel);
return excel;
template.setCreateAt(now);
template = excelDao.save(template);
return template;
}
public Excel get(long id) {
public Template get(long id) {
return excelDao.getOne(id);
}
public void update(Excel excel) {
excelDao.save(excel);
public void update(Template template) {
excelDao.save(template);
}
public List<Excel> findAllByIdIn(List<Long> ids) {
public List<Template> findAllByIdIn(List<Long> ids) {
return excelDao.findAllByIdIn(ids);
}
public List<Excel> findAllByJobId(long jid) {
public List<Template> findAllByJobId(long jid) {
return excelDao.findAllByJobId(jid);
}
public void saveAll(List<Excel> excelList) {
excelDao.saveAll(excelList);
public void saveAll(List<Template> templateList) {
excelDao.saveAll(templateList);
}
}
......@@ -2,8 +2,8 @@ package com.keymobile.rest.service;
import com.keymobile.activiti.utils.DateUtil;
import com.keymobile.rest.dao.*;
import com.keymobile.rest.model.Excel;
import com.keymobile.rest.model.JobInfo;
import com.keymobile.rest.model.Template;
import com.keymobile.rest.model.ProcessInfo;
import com.keymobile.rest.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -17,9 +17,9 @@ public class JobInfoService {
@Autowired
private JobInfoDao jobInfoDao;
public JobInfo save(User user, Excel excel) {
JobInfo info = new JobInfo();
info.setExcel(excel);
public ProcessInfo save(User user, Template template) {
ProcessInfo info = new ProcessInfo();
info.setTemplate(template);
info.setUser(user);
Timestamp now = Timestamp.valueOf(DateUtil.getDateTime());
info.setCreateAt(now);
......@@ -27,15 +27,15 @@ public class JobInfoService {
return info;
}
public List<JobInfo> findAllByExcelId(long eid) {
public List<ProcessInfo> findAllByExcelId(long eid) {
return jobInfoDao.findAllByExcelId(eid);
}
public JobInfo findByExcelIdAndUserId(long eid, long uid) {
public ProcessInfo findByExcelIdAndUserId(long eid, long uid) {
return jobInfoDao.findByExcelIdAndUserId(eid, uid);
}
public List<JobInfo> findByUserId(long uid) {
public List<ProcessInfo> findByUserId(long uid) {
return jobInfoDao.findAllByUserId(uid);
}
......
......@@ -2,7 +2,7 @@ package com.keymobile.rest.service;
import com.keymobile.activiti.utils.DateUtil;
import com.keymobile.rest.dao.JobDao;
import com.keymobile.rest.model.Job;
import com.keymobile.rest.model.Assignment;
import com.keymobile.rest.vo.JobForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
......@@ -13,7 +13,6 @@ import org.springframework.stereotype.Service;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
@Service
public class JobService {
......@@ -21,56 +20,60 @@ public class JobService {
@Autowired
private JobDao jobDao;
public Job get(long id) {
public Assignment get(long id) {
return jobDao.getOne(id);
}
public Job update(Job job) {
return jobDao.save(job);
public Assignment update(Assignment assignment) {
return jobDao.save(assignment);
}
public Job save(JobForm form) {
Job job = new Job();
public Assignment save(Assignment assignment) {
return jobDao.save(assignment);
}
public Assignment save(JobForm form) {
Assignment assignment = new Assignment();
Timestamp now = Timestamp.valueOf(DateUtil.getDateTime());
job.setCreateAt(now);
job.setStatus(Job.STATUS_UNRELEASED);
job.setAudit(Job.AUDIT_NEED);
job.setName(form.getName());
job.setType(form.getType());
if (form.getType() == Job.TYPE_AUTO) {
assignment.setCreateAt(now);
assignment.setStatus(Assignment.STATUS_UNRELEASED);
assignment.setAudit(Assignment.AUDIT_NEED);
assignment.setName(form.getName());
assignment.setType(form.getType());
if (form.getType() == Assignment.TYPE_AUTO) {
Timestamp startAt;
try {
startAt = Timestamp.valueOf(form.getStartAt());
} catch (Exception e) {
startAt = Timestamp.valueOf(LocalDateTime.now());
}
job.setStartAt(startAt);
assignment.setStartAt(startAt);
}
job.setUser(form.getUser());
job = jobDao.save(job);
return job;
assignment.setUser(form.getUser());
assignment = jobDao.save(assignment);
return assignment;
}
public Job findByProcessId(String pid) {
public Assignment findByProcessId(String pid) {
return jobDao.findByProcessId(pid);
}
public Page<Job> findAll(int pageNo, int pageSize) {
public Page<Assignment> findAll(int pageNo, int pageSize) {
Pageable pageable = convert(pageNo, pageSize);
return jobDao.findAll(pageable);
}
public Page<Job> findAllByName(String name, int pageNo, int pageSize) {
public Page<Assignment> findAllByName(String name, int pageNo, int pageSize) {
Pageable pageable = convert(pageNo, pageSize);
return jobDao.findAllByNameLike(("%" + name + "%"), pageable);
}
public Page<Job> findAll(int pageNo, int pageSize, String orderBy, String propBy) {
public Page<Assignment> findAll(int pageNo, int pageSize, String orderBy, String propBy) {
Pageable pageable = convert(pageNo, pageSize, orderBy, propBy);
return jobDao.findAll(pageable);
}
public Page<Job> findAllByName(String name, int pageNo, int pageSize, String orderBy, String propBy) {
public Page<Assignment> findAllByName(String name, int pageNo, int pageSize, String orderBy, String propBy) {
Pageable pageable = convert(pageNo, pageSize, orderBy, propBy);
return jobDao.findAllByNameLike(("%" + name + "%"), pageable);
}
......
......@@ -2,7 +2,7 @@ package com.keymobile.rest.service;
import com.keymobile.activiti.utils.DateUtil;
import com.keymobile.rest.dao.*;
import com.keymobile.rest.model.RecordData;
import com.keymobile.rest.model.DataInfo;
import com.keymobile.rest.vo.RecordDataForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -15,22 +15,22 @@ public class RecordDataService {
@Autowired
private RecordDataDao recordDataDao;
public RecordData get(long id) {
public DataInfo get(long id) {
return recordDataDao.getOne(id);
}
public RecordData save(RecordDataForm form) {
RecordData data = new RecordData();
public DataInfo save(RecordDataForm form) {
DataInfo data = new DataInfo();
data.setDatas(form.getDataStr());
data.setJobInfo(form.getJobInfo());
data.setProcessInfo(form.getProcessInfo());
Timestamp now = Timestamp.valueOf(DateUtil.getDateTime());
data.setCreateAt(now);
data = recordDataDao.save(data);
return data;
}
public RecordData update(RecordDataForm form) {
RecordData data = this.get(form.getDataId());
public DataInfo update(RecordDataForm form) {
DataInfo data = this.get(form.getDataId());
data = recordDataDao.save(data);
return data;
}
......
......@@ -13,6 +13,10 @@ public class UserService {
@Autowired
private UserDao userDao;
public List<User> findAllByIdIn(List<Long> ids) {
return userDao.findAllByIdIn(ids);
}
public List<User> findAllByRole(int role) {
return userDao.findAllByRole(role);
}
......@@ -35,7 +39,5 @@ public class UserService {
return user;
}
public List<User> findAllByIdIn(List<Long> ids) {
return userDao.findAllByIdIn(ids);
}
}
package com.keymobile.rest.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.keymobile.rest.model.Job;
import com.keymobile.rest.model.Assignment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.sql.Timestamp;
import java.util.List;
@Data
......@@ -39,5 +34,5 @@ public class ExcelForm {
private Integer dataAt;
@JsonIgnore
private Job job;
private Assignment assignment;
}
package com.keymobile.rest.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.keymobile.rest.model.JobInfo;
import com.keymobile.rest.model.ProcessInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -27,7 +27,7 @@ public class RecordDataForm {
private List<Object> dataList;
@JsonIgnore
private JobInfo jobInfo;
private ProcessInfo processInfo;
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1583335449426" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="CompDataStandardProcess" isClosed="false" isExecutable="true" name="专业公司数据标准流程" processType="None">
<startEvent id="startevent1" name="Start"/>
<userTask activiti:assignee="${inputUser}" activiti:exclusive="true" id="dataStandardMake" name="提出数据标准编制需求"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group1&quot;)}" activiti:exclusive="true" id="applyTask1" name="审批(报表中心1)"/>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway1" name="Exclusive Gateway"/>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="dataStandardMake"/>
<sequenceFlow id="flow4" name="N" skipExpression="${sign=='false'}" sourceRef="exclusivegateway1" targetRef="dataStandardMake"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group2&quot;)}" activiti:exclusive="true" id="selectStandardApartment" name="确定数据标准责任部门"/>
<userTask activiti:exclusive="true" id="writeStandardAttr" name="填写数据标准属性">
<extensionElements>
<activiti:taskListener class="com.keymobile.activiti.listener.WirteStandardAttrListener" event="create"/>
</extensionElements>
</userTask>
<sequenceFlow id="flow5" name="Y" skipExpression="${sign=='true'}" sourceRef="exclusivegateway1" targetRef="selectStandardApartment"/>
<sequenceFlow id="flow6" sourceRef="selectStandardApartment" targetRef="writeStandardAttr"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group3&quot;)}" activiti:exclusive="true" id="applyTask2" name="审批(报表中心2)"/>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway2" name="Exclusive Gateway"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group4&quot;)}" activiti:exclusive="true" id="applyTask3" name="审批(科技运营部)"/>
<sequenceFlow id="flow11" name="Y" skipExpression="${sign=='true'}" sourceRef="exclusivegateway2" targetRef="applyTask3"/>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway3" name="Exclusive Gateway"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group5&quot;)}" activiti:exclusive="true" id="applyTask4" name="审批(报表中心4)"/>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway4" name="Exclusive Gateway"/>
<endEvent id="endevent1" name="End"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group6&quot;)}" activiti:exclusive="true" id="publishStandard" name="发布数据标准终版"/>
<sequenceFlow id="flow13" sourceRef="applyTask3" targetRef="exclusivegateway3"/>
<sequenceFlow id="flow15" sourceRef="applyTask4" targetRef="exclusivegateway4"/>
<sequenceFlow id="flow16" name="N" skipExpression="${sign=='false'}" sourceRef="exclusivegateway3" targetRef="applyTask4"/>
<sequenceFlow id="flow17" name="Y" skipExpression="${sign=='true'}" sourceRef="exclusivegateway4" targetRef="endevent1"/>
<sequenceFlow id="flow18" name="Y" skipExpression="${sign=='true'}" sourceRef="exclusivegateway3" targetRef="publishStandard"/>
<sequenceFlow id="flow19" sourceRef="publishStandard" targetRef="endevent1"/>
<sequenceFlow id="flow24" name="N" skipExpression="${sign=='false'}" sourceRef="exclusivegateway4" targetRef="writeStandardAttr"/>
<sequenceFlow id="flow25" name="N" skipExpression="${sign=='true'}" sourceRef="exclusivegateway2" targetRef="writeStandardAttr"/>
<sequenceFlow id="flow29" sourceRef="dataStandardMake" targetRef="applyTask1"/>
<sequenceFlow id="flow30" sourceRef="applyTask1" targetRef="exclusivegateway1"/>
<sequenceFlow id="flow31" sourceRef="applyTask2" targetRef="exclusivegateway2"/>
<userTask activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group8&quot;)}" activiti:exclusive="true" id="commentCollction" name="意见征集"/>
<userTask activiti:assignee="${assignee}" activiti:exclusive="true" id="askComment" name="意见询问">
<multiInstanceLoopCharacteristics activiti:collection="commentUsers" activiti:elementVariable="assignee" isSequential="false"/>
</userTask>
<sequenceFlow id="flow32" sourceRef="writeStandardAttr" targetRef="commentCollction"/>
<sequenceFlow id="flow33" sourceRef="commentCollction" targetRef="askComment"/>
<sequenceFlow id="flow34" sourceRef="askComment" targetRef="applyTask2"/>
</process>
<bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNPlane bpmnElement="CompDataStandardProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="Shape-startevent1">
<omgdc:Bounds height="32.0" width="32.0" x="185.0" y="380.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="dataStandardMake" id="Shape-dataStandardMake">
<omgdc:Bounds height="75.0" width="85.0" x="195.0" y="195.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="75.0" width="85.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask1" id="Shape-applyTask1">
<omgdc:Bounds height="55.0" width="105.0" x="105.0" y="15.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="Shape-exclusivegateway1" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="305.0" y="65.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="selectStandardApartment" id="Shape-selectStandardApartment">
<omgdc:Bounds height="63.0" width="105.0" x="600.0" y="270.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="63.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="writeStandardAttr" id="Shape-writeStandardAttr">
<omgdc:Bounds height="55.0" width="105.0" x="745.0" y="370.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask2" id="Shape-applyTask2">
<omgdc:Bounds height="55.0" width="105.0" x="875.0" y="540.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="Shape-exclusivegateway2" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="803.0" y="547.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask3" id="Shape-applyTask3">
<omgdc:Bounds height="55.0" width="105.0" x="635.0" y="540.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="Shape-exclusivegateway3" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="574.0" y="547.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask4" id="Shape-applyTask4">
<omgdc:Bounds height="55.0" width="105.0" x="429.0" y="540.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway4" id="Shape-exclusivegateway4" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="330.0" y="547.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="Shape-endevent1">
<omgdc:Bounds height="32.0" width="32.0" x="185.0" y="550.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="publishStandard" id="Shape-publishStandard">
<omgdc:Bounds height="55.0" width="105.0" x="247.0" y="594.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="commentCollction" id="Shape-commentCollction">
<omgdc:Bounds height="55.0" width="105.0" x="875.0" y="370.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="askComment" id="Shape-askComment">
<omgdc:Bounds height="55.0" width="105.0" x="875.0" y="450.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29" sourceElement="dataStandardMake" targetElement="applyTask1">
<omgdi:waypoint x="202.5" y="195.0"/>
<omgdi:waypoint x="202.5" y="70.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow24" id="BPMNEdge_flow24" sourceElement="exclusivegateway4" targetElement="writeStandardAttr">
<omgdi:waypoint x="350.0" y="551.0"/>
<omgdi:waypoint x="350.0" y="470.0"/>
<omgdi:waypoint x="541.0" y="470.0"/>
<omgdi:waypoint x="650.0" y="470.0"/>
<omgdi:waypoint x="797.0" y="470.0"/>
<omgdi:waypoint x="745.0" y="397.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="185.0" y="237.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25" sourceElement="exclusivegateway2" targetElement="writeStandardAttr">
<omgdi:waypoint x="822.0" y="550.0"/>
<omgdi:waypoint x="822.0" y="483.0"/>
<omgdi:waypoint x="822.0" y="466.0"/>
<omgdi:waypoint x="822.0" y="466.0"/>
<omgdi:waypoint x="797.0" y="466.0"/>
<omgdi:waypoint x="797.0" y="466.0"/>
<omgdi:waypoint x="822.0" y="425.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="658.0" y="237.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1" sourceElement="startevent1" targetElement="dataStandardMake">
<omgdi:waypoint x="206.0" y="380.80131584642936"/>
<omgdi:waypoint x="206.0" y="270.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4" sourceElement="exclusivegateway1" targetElement="dataStandardMake">
<omgdi:waypoint x="337.0" y="81.0"/>
<omgdi:waypoint x="545.0" y="458.0"/>
<omgdi:waypoint x="416.0" y="458.0"/>
<omgdi:waypoint x="298.0" y="458.0"/>
<omgdi:waypoint x="280.0" y="232.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="381.0" y="107.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5" sourceElement="exclusivegateway1" targetElement="selectStandardApartment">
<omgdi:waypoint x="337.0" y="81.0"/>
<omgdi:waypoint x="650.0" y="180.0"/>
<omgdi:waypoint x="650.0" y="270.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="401.0" y="87.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6" sourceElement="selectStandardApartment" targetElement="writeStandardAttr">
<omgdi:waypoint x="705.0" y="301.5"/>
<omgdi:waypoint x="745.0" y="397.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow17" id="BPMNEdge_flow17" sourceElement="exclusivegateway4" targetElement="endevent1">
<omgdi:waypoint x="330.0" y="563.0"/>
<omgdi:waypoint x="217.0" y="566.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="165.0" y="257.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow18" id="BPMNEdge_flow18" sourceElement="exclusivegateway3" targetElement="publishStandard">
<omgdi:waypoint x="593.0" y="576.0"/>
<omgdi:waypoint x="593.0" y="621.0"/>
<omgdi:waypoint x="352.0" y="621.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="429.0" y="277.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow19" id="BPMNEdge_flow19" sourceElement="publishStandard" targetElement="endevent1">
<omgdi:waypoint x="247.0" y="620.0"/>
<omgdi:waypoint x="202.0" y="620.0"/>
<omgdi:waypoint x="202.0" y="581.9687194226713"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13" sourceElement="applyTask3" targetElement="exclusivegateway3">
<omgdi:waypoint x="635.0" y="567.5"/>
<omgdi:waypoint x="606.0" y="563.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15" sourceElement="applyTask4" targetElement="exclusivegateway4">
<omgdi:waypoint x="429.0" y="567.5"/>
<omgdi:waypoint x="362.0" y="563.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16" sourceElement="exclusivegateway3" targetElement="applyTask4">
<omgdi:waypoint x="574.0" y="563.0"/>
<omgdi:waypoint x="534.0" y="567.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="409.0" y="257.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow31" id="BPMNEdge_flow31" sourceElement="applyTask2" targetElement="exclusivegateway2">
<omgdi:waypoint x="875.0" y="567.5"/>
<omgdi:waypoint x="835.0" y="563.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow32" id="BPMNEdge_flow32" sourceElement="writeStandardAttr" targetElement="commentCollction">
<omgdi:waypoint x="850.0" y="397.5"/>
<omgdi:waypoint x="875.0" y="397.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11" sourceElement="exclusivegateway2" targetElement="applyTask3">
<omgdi:waypoint x="803.0" y="563.0"/>
<omgdi:waypoint x="740.0" y="567.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="638.0" y="257.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow33" id="BPMNEdge_flow33" sourceElement="commentCollction" targetElement="askComment">
<omgdi:waypoint x="927.5" y="425.0"/>
<omgdi:waypoint x="927.5" y="450.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow34" id="BPMNEdge_flow34" sourceElement="askComment" targetElement="applyTask2">
<omgdi:waypoint x="927.5" y="505.0"/>
<omgdi:waypoint x="927.5" y="540.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow30" id="BPMNEdge_flow30" sourceElement="applyTask1" targetElement="exclusivegateway1">
<omgdi:waypoint x="210.0" y="42.5"/>
<omgdi:waypoint x="305.0" y="81.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
<?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://www.activiti.org/test">
<process id="CompDataStandardProcess" name="专业公司数据标准流程" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="dataStandardMake" name="提出数据标准编制需求" activiti:assignee="${inputUser}"></userTask>
<userTask id="applyTask1" name="审批(报表中心1)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group1&quot;)}"></userTask>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="dataStandardMake"></sequenceFlow>
<sequenceFlow id="flow4" name="N" sourceRef="exclusivegateway1" targetRef="dataStandardMake" skipExpression="${sign=='false'}"></sequenceFlow>
<userTask id="selectStandardApartment" name="确定数据标准责任部门" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group2&quot;)}"></userTask>
<userTask id="writeStandardAttr" name="填写数据标准属性">
<extensionElements>
<activiti:taskListener event="create" class="com.keymobile.activiti.listener.WirteStandardAttrListener"></activiti:taskListener>
</extensionElements>
</userTask>
<sequenceFlow id="flow5" name="Y" sourceRef="exclusivegateway1" targetRef="selectStandardApartment" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow6" sourceRef="selectStandardApartment" targetRef="writeStandardAttr"></sequenceFlow>
<userTask id="applyTask2" name="审批(报表中心2)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group3&quot;)}"></userTask>
<exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway>
<userTask id="applyTask3" name="审批(科技运营部)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group4&quot;)}"></userTask>
<sequenceFlow id="flow11" name="Y" sourceRef="exclusivegateway2" targetRef="applyTask3" skipExpression="${sign=='true'}"></sequenceFlow>
<exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway"></exclusiveGateway>
<userTask id="applyTask4" name="审批(报表中心4)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group5&quot;)}"></userTask>
<exclusiveGateway id="exclusivegateway4" name="Exclusive Gateway"></exclusiveGateway>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="publishStandard" name="发布数据标准终版" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group6&quot;)}"></userTask>
<sequenceFlow id="flow13" sourceRef="applyTask3" targetRef="exclusivegateway3"></sequenceFlow>
<sequenceFlow id="flow15" sourceRef="applyTask4" targetRef="exclusivegateway4"></sequenceFlow>
<sequenceFlow id="flow16" name="N" sourceRef="exclusivegateway3" targetRef="applyTask4" skipExpression="${sign=='false'}"></sequenceFlow>
<sequenceFlow id="flow17" name="Y" sourceRef="exclusivegateway4" targetRef="endevent1" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow18" name="Y" sourceRef="exclusivegateway3" targetRef="publishStandard" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow19" sourceRef="publishStandard" targetRef="endevent1"></sequenceFlow>
<sequenceFlow id="flow24" name="N" sourceRef="exclusivegateway4" targetRef="writeStandardAttr" skipExpression="${sign=='false'}"></sequenceFlow>
<sequenceFlow id="flow25" name="N" sourceRef="exclusivegateway2" targetRef="writeStandardAttr" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow28" sourceRef="writeStandardAttr" targetRef="applyTask2"></sequenceFlow>
<sequenceFlow id="flow29" sourceRef="dataStandardMake" targetRef="applyTask1"></sequenceFlow>
<sequenceFlow id="flow30" sourceRef="applyTask1" targetRef="exclusivegateway1"></sequenceFlow>
<sequenceFlow id="flow31" sourceRef="applyTask2" targetRef="exclusivegateway2"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_CompDataStandardProcess">
<bpmndi:BPMNPlane bpmnElement="CompDataStandardProcess" id="BPMNPlane_CompDataStandardProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="20.0" y="70.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="dataStandardMake" id="BPMNShape_dataStandardMake">
<omgdc:Bounds height="71.0" width="105.0" x="82.0" y="52.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask1" id="BPMNShape_applyTask1">
<omgdc:Bounds height="55.0" width="105.0" x="210.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
<omgdc:Bounds height="40.0" width="40.0" x="361.0" y="67.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="selectStandardApartment" id="BPMNShape_selectStandardApartment">
<omgdc:Bounds height="63.0" width="105.0" x="450.0" y="56.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="writeStandardAttr" id="BPMNShape_writeStandardAttr">
<omgdc:Bounds height="55.0" width="105.0" x="580.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask2" id="BPMNShape_applyTask2">
<omgdc:Bounds height="55.0" width="105.0" x="710.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
<omgdc:Bounds height="40.0" width="40.0" x="638.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask3" id="BPMNShape_applyTask3">
<omgdc:Bounds height="55.0" width="105.0" x="470.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="BPMNShape_exclusivegateway3">
<omgdc:Bounds height="40.0" width="40.0" x="409.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask4" id="BPMNShape_applyTask4">
<omgdc:Bounds height="55.0" width="105.0" x="264.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway4" id="BPMNShape_exclusivegateway4">
<omgdc:Bounds height="40.0" width="40.0" x="165.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="20.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="publishStandard" id="BPMNShape_publishStandard">
<omgdc:Bounds height="55.0" width="105.0" x="82.0" y="284.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="55.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="82.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="381.0" y="107.0"></omgdi:waypoint>
<omgdi:waypoint x="380.0" y="148.0"></omgdi:waypoint>
<omgdi:waypoint x="251.0" y="148.0"></omgdi:waypoint>
<omgdi:waypoint x="133.0" y="148.0"></omgdi:waypoint>
<omgdi:waypoint x="134.0" y="123.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="381.0" y="107.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="401.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="87.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="401.0" y="87.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
<omgdi:waypoint x="555.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="580.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
<omgdi:waypoint x="638.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="575.0" y="257.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="638.0" y="257.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13">
<omgdi:waypoint x="470.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="449.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15">
<omgdi:waypoint x="264.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="205.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16">
<omgdi:waypoint x="409.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="369.0" y="257.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="409.0" y="257.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow17" id="BPMNEdge_flow17">
<omgdi:waypoint x="165.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="55.0" y="257.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="165.0" y="257.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow18" id="BPMNEdge_flow18">
<omgdi:waypoint x="429.0" y="277.0"></omgdi:waypoint>
<omgdi:waypoint x="428.0" y="311.0"></omgdi:waypoint>
<omgdi:waypoint x="187.0" y="311.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="429.0" y="277.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow19" id="BPMNEdge_flow19">
<omgdi:waypoint x="82.0" y="311.0"></omgdi:waypoint>
<omgdi:waypoint x="37.0" y="310.0"></omgdi:waypoint>
<omgdi:waypoint x="37.0" y="275.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow24" id="BPMNEdge_flow24">
<omgdi:waypoint x="185.0" y="237.0"></omgdi:waypoint>
<omgdi:waypoint x="185.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="376.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="485.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="115.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="185.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25">
<omgdi:waypoint x="658.0" y="237.0"></omgdi:waypoint>
<omgdi:waypoint x="657.0" y="173.0"></omgdi:waypoint>
<omgdi:waypoint x="657.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="657.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="115.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="658.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28">
<omgdi:waypoint x="685.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="762.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="762.0" y="230.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29">
<omgdi:waypoint x="187.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="210.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow30" id="BPMNEdge_flow30">
<omgdi:waypoint x="315.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="361.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow31" id="BPMNEdge_flow31">
<omgdi:waypoint x="710.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="678.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
\ No newline at end of file
<?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://www.activiti.org/test">
<process id="groupDataStandardProcess" name="集团数据标准流程" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="dataStandardMake" name="提出数据标准编制需求" activiti:assignee="${inputUser}"></userTask>
<userTask id="applyTask1" name="审批(报表中心1)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group1&quot;)}"></userTask>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="dataStandardMake"></sequenceFlow>
<sequenceFlow id="flow4" name="N" sourceRef="exclusivegateway1" targetRef="dataStandardMake" skipExpression="${sign=='false'}"></sequenceFlow>
<userTask id="selectStandardApartment" name="确定数据标准责任部门" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group2&quot;)}"></userTask>
<userTask id="writeStandardAttr" name="填写数据标准属性">
<extensionElements>
<activiti:taskListener event="create" class="com.keymobile.activiti.listener.WirteStandardAttrListener"></activiti:taskListener>
</extensionElements>
</userTask>
<sequenceFlow id="flow5" name="Y" sourceRef="exclusivegateway1" targetRef="selectStandardApartment" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow6" sourceRef="selectStandardApartment" targetRef="writeStandardAttr"></sequenceFlow>
<userTask id="applyTask2" name="审批(报表中心2)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group3&quot;)}"></userTask>
<exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway>
<userTask id="applyTask3" name="审批(科技运营部)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group4&quot;)}"></userTask>
<sequenceFlow id="flow11" name="Y" sourceRef="exclusivegateway2" targetRef="applyTask3" skipExpression="${sign=='true'}"></sequenceFlow>
<exclusiveGateway id="exclusivegateway3" name="Exclusive Gateway"></exclusiveGateway>
<userTask id="applyTask4" name="审批(报表中心4)" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group5&quot;)}"></userTask>
<exclusiveGateway id="exclusivegateway4" name="Exclusive Gateway"></exclusiveGateway>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="publishStandard" name="发布数据标准终版" activiti:candidateUsers="${groupDataStandardServiceImpl.findAssigneesForProcess(execution,&quot;group6&quot;)}"></userTask>
<sequenceFlow id="flow13" sourceRef="applyTask3" targetRef="exclusivegateway3"></sequenceFlow>
<sequenceFlow id="flow15" sourceRef="applyTask4" targetRef="exclusivegateway4"></sequenceFlow>
<sequenceFlow id="flow16" name="N" sourceRef="exclusivegateway3" targetRef="applyTask4" skipExpression="${sign=='false'}"></sequenceFlow>
<sequenceFlow id="flow17" name="Y" sourceRef="exclusivegateway4" targetRef="endevent1" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow18" name="Y" sourceRef="exclusivegateway3" targetRef="publishStandard" skipExpression="${sign=='true'}"></sequenceFlow>
<sequenceFlow id="flow19" sourceRef="publishStandard" targetRef="endevent1"></sequenceFlow>
<sequenceFlow id="flow24" name="N" sourceRef="exclusivegateway4" targetRef="writeStandardAttr" skipExpression="${sign=='false'}"></sequenceFlow>
<sequenceFlow id="flow25" name="N" sourceRef="exclusivegateway2" targetRef="writeStandardAttr" skipExpression="${sign=='false'}"></sequenceFlow>
<sequenceFlow id="flow28" sourceRef="writeStandardAttr" targetRef="applyTask2"></sequenceFlow>
<sequenceFlow id="flow29" sourceRef="dataStandardMake" targetRef="applyTask1"></sequenceFlow>
<sequenceFlow id="flow30" sourceRef="applyTask1" targetRef="exclusivegateway1"></sequenceFlow>
<sequenceFlow id="flow31" sourceRef="applyTask2" targetRef="exclusivegateway2"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_groupDataStandardProcess">
<bpmndi:BPMNPlane bpmnElement="groupDataStandardProcess" id="BPMNPlane_groupDataStandardProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="20.0" y="70.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="dataStandardMake" id="BPMNShape_dataStandardMake">
<omgdc:Bounds height="71.0" width="105.0" x="82.0" y="52.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask1" id="BPMNShape_applyTask1">
<omgdc:Bounds height="55.0" width="105.0" x="210.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
<omgdc:Bounds height="40.0" width="40.0" x="361.0" y="67.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="selectStandardApartment" id="BPMNShape_selectStandardApartment">
<omgdc:Bounds height="63.0" width="105.0" x="450.0" y="56.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="writeStandardAttr" id="BPMNShape_writeStandardAttr">
<omgdc:Bounds height="55.0" width="105.0" x="580.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask2" id="BPMNShape_applyTask2">
<omgdc:Bounds height="55.0" width="105.0" x="710.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
<omgdc:Bounds height="40.0" width="40.0" x="638.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask3" id="BPMNShape_applyTask3">
<omgdc:Bounds height="55.0" width="105.0" x="470.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="BPMNShape_exclusivegateway3">
<omgdc:Bounds height="40.0" width="40.0" x="409.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="applyTask4" id="BPMNShape_applyTask4">
<omgdc:Bounds height="55.0" width="105.0" x="264.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway4" id="BPMNShape_exclusivegateway4">
<omgdc:Bounds height="40.0" width="40.0" x="165.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="20.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="publishStandard" id="BPMNShape_publishStandard">
<omgdc:Bounds height="55.0" width="105.0" x="82.0" y="284.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="55.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="82.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="381.0" y="107.0"></omgdi:waypoint>
<omgdi:waypoint x="380.0" y="148.0"></omgdi:waypoint>
<omgdi:waypoint x="251.0" y="148.0"></omgdi:waypoint>
<omgdi:waypoint x="133.0" y="148.0"></omgdi:waypoint>
<omgdi:waypoint x="134.0" y="123.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="381.0" y="107.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="401.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="87.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="401.0" y="87.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
<omgdi:waypoint x="555.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="580.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
<omgdi:waypoint x="638.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="575.0" y="257.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="638.0" y="257.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13">
<omgdi:waypoint x="470.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="449.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15">
<omgdi:waypoint x="264.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="205.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16">
<omgdi:waypoint x="409.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="369.0" y="257.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="7.0" x="409.0" y="257.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow17" id="BPMNEdge_flow17">
<omgdi:waypoint x="165.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="55.0" y="257.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="165.0" y="257.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow18" id="BPMNEdge_flow18">
<omgdi:waypoint x="429.0" y="277.0"></omgdi:waypoint>
<omgdi:waypoint x="428.0" y="311.0"></omgdi:waypoint>
<omgdi:waypoint x="187.0" y="311.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="8.0" x="429.0" y="277.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow19" id="BPMNEdge_flow19">
<omgdi:waypoint x="82.0" y="311.0"></omgdi:waypoint>
<omgdi:waypoint x="37.0" y="310.0"></omgdi:waypoint>
<omgdi:waypoint x="37.0" y="275.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow24" id="BPMNEdge_flow24">
<omgdi:waypoint x="185.0" y="237.0"></omgdi:waypoint>
<omgdi:waypoint x="185.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="376.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="485.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="115.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="185.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25">
<omgdi:waypoint x="658.0" y="237.0"></omgdi:waypoint>
<omgdi:waypoint x="657.0" y="173.0"></omgdi:waypoint>
<omgdi:waypoint x="657.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="657.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="156.0"></omgdi:waypoint>
<omgdi:waypoint x="632.0" y="115.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="100.0" x="658.0" y="237.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28">
<omgdi:waypoint x="685.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="762.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="762.0" y="230.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29">
<omgdi:waypoint x="187.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="210.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow30" id="BPMNEdge_flow30">
<omgdi:waypoint x="315.0" y="87.0"></omgdi:waypoint>
<omgdi:waypoint x="361.0" y="87.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow31" id="BPMNEdge_flow31">
<omgdi:waypoint x="710.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="678.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1583334145142" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="RecordProcess" isClosed="false" isExecutable="true" name="RecordProcess" processType="None">
<startEvent id="startEvent" name="流程开始">
<extensionElements>
<activiti:executionListener event="start"/>
</extensionElements>
</startEvent>
<endEvent id="endEvent" name="End"/>
<userTask activiti:assignee="chenws" activiti:candidateUsers="${activityDemoServiceImpl.findUsersForSP(execution)}" activiti:exclusive="true" id="checkData" name="审批数据"/>
<exclusiveGateway gatewayDirection="Unspecified" id="isDataPass" name="数据是否正确通过">
<extensionElements>
<activiti:executionListener event="start">
<activiti:field>
<activiti:string/>
</activiti:field>
</activiti:executionListener>
</extensionElements>
</exclusiveGateway>
<sequenceFlow id="flow5" sourceRef="checkData" targetRef="isDataPass"/>
<userTask activiti:assignee="管理" activiti:exclusive="true" id="addExcel" name="添加补录模板">
<extensionElements>
<activiti:taskListener event="create"/>
</extensionElements>
</userTask>
<userTask activiti:assignee="chenws" activiti:candidateUsers="${userIds}" activiti:exclusive="true" id="addData" name="补录人员填写模板"/>
<sequenceFlow id="_7" sourceRef="addExcel" targetRef="addData"/>
<sequenceFlow id="_8" sourceRef="addData" targetRef="checkData"/>
<sequenceFlow id="_10" sourceRef="startEvent" targetRef="addExcel"/>
<sequenceFlow id="_12" skipExpression="${sign=='false'}" sourceRef="isDataPass" targetRef="addData">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[
]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="_13" sourceRef="isDataPass" targetRef="endEvent">
<extensionElements>
<activiti:executionListener event="start"/>
</extensionElements>
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[
]]>
</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNPlane bpmnElement="RecordProcess">
<bpmndi:BPMNShape bpmnElement="startEvent" id="Shape-startEvent">
<omgdc:Bounds height="32.0" width="32.0" x="450.0" y="45.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endEvent" id="Shape-endEvent">
<omgdc:Bounds height="32.0" width="32.0" x="455.0" y="675.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="checkData" id="Shape-checkData">
<omgdc:Bounds height="55.0" width="105.0" x="410.0" y="445.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="isDataPass" id="Shape-isDataPass" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="455.0" y="545.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="addExcel" id="Shape-addExcel">
<omgdc:Bounds height="55.0" width="105.0" x="415.0" y="205.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="addData" id="Shape-addData">
<omgdc:Bounds height="70.0" width="105.0" x="400.0" y="315.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="70.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="_13" id="BPMNEdge__13" sourceElement="isDataPass" targetElement="endEvent">
<omgdi:waypoint x="471.0" y="577.0"/>
<omgdi:waypoint x="471.0" y="675.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_12" id="BPMNEdge__12" sourceElement="isDataPass" targetElement="addData">
<omgdi:waypoint x="458.0" y="558.0"/>
<omgdi:waypoint x="350.0" y="558.0"/>
<omgdi:waypoint x="400.0" y="350.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5" sourceElement="checkData" targetElement="isDataPass">
<omgdi:waypoint x="471.0" y="500.0"/>
<omgdi:waypoint x="471.0" y="545.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_7" id="BPMNEdge__7" sourceElement="addExcel" targetElement="addData">
<omgdi:waypoint x="460.0" y="260.0"/>
<omgdi:waypoint x="460.0" y="315.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="addData" targetElement="checkData">
<omgdi:waypoint x="457.5" y="385.0"/>
<omgdi:waypoint x="457.5" y="445.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="startEvent" targetElement="addExcel">
<omgdi:waypoint x="466.0" y="77.0"/>
<omgdi:waypoint x="466.0" y="205.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/testm1583600477586" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1583600477586" name="" targetNamespace="http://www.activiti.org/testm1583600477586" typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="RecordStandardProcess" isClosed="false" isExecutable="true" name="RecordStandardProcess" processType="None">
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/testm1583600477586"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
expressionLanguage="http://www.w3.org/1999/XPath" id="m1583600477586" name=""
targetNamespace="http://www.activiti.org/testm1583600477586"
typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="RecordStandardProcess" isClosed="false" isExecutable="true" name="RecordStandardProcess"
processType="None">
<startEvent id="RecordStartEvent" name="StartEvent"/>
<userTask activiti:assignee="${userId}" activiti:exclusive="true" id="addData" name="填写补录报表"/>
<userTask activiti:assignee="${managerId}" activiti:exclusive="true" id="addExcel" name="发起流程添加模板"/>
......@@ -22,7 +29,9 @@
</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNDiagram
documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0"
id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNPlane bpmnElement="RecordStandardProcess">
<bpmndi:BPMNShape bpmnElement="RecordStartEvent" id="Shape-RecordStartEvent">
<dc:Bounds height="32.0" width="32.0" x="625.0" y="35.0"/>
......
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1583334145142" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="testProcess" isClosed="false" isExecutable="true" name="Test process" processType="None">
<startEvent id="startevent1" name="Start"/>
<endEvent id="endevent1" name="End"/>
<serviceTask activiti:exclusive="true" activiti:expression="#{activityDemoServiceImpl.updateBizStatus(execution,&quot;tj&quot;)}" id="servicetask1" name="用户提交"/>
<userTask activiti:candidateUsers="${activityDemoServiceImpl.findUsersForSL(execution)}" activiti:exclusive="true" id="usertask1" name="受理"/>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway1" name="Exclusive Gateway"/>
<userTask activiti:candidateUsers="${activityDemoServiceImpl.findUsersForSP(execution)}" activiti:exclusive="true" id="usertask2" name="审批"/>
<exclusiveGateway gatewayDirection="Unspecified" id="exclusivegateway3" name="Exclusive Gateway"/>
<serviceTask activiti:exclusive="true" activiti:expression="#{activityDemoServiceImpl.updateBizStatus(execution,&quot;qf&quot;)}" id="servicetask2" name="已签发"/>
<serviceTask activiti:exclusive="true" activiti:expression="#{activityDemoServiceImpl.updateBizStatus(execution,&quot;bq&quot;)}" id="servicetask3" name="资料不全"/>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="servicetask1"/>
<sequenceFlow id="flow2" sourceRef="servicetask1" targetRef="usertask1"/>
<sequenceFlow id="flow3" sourceRef="usertask1" targetRef="exclusivegateway1"/>
<sequenceFlow id="flow4" skipExpression="${sign=='true'}" sourceRef="exclusivegateway1" targetRef="usertask2"/>
<sequenceFlow id="flow5" sourceRef="usertask2" targetRef="exclusivegateway3"/>
<sequenceFlow id="flow6" skipExpression="${sign=='true'}" sourceRef="exclusivegateway3" targetRef="servicetask2"/>
<sequenceFlow id="flow7" sourceRef="servicetask2" targetRef="endevent1"/>
<sequenceFlow id="flow8" skipExpression="${sign=='false'}" sourceRef="exclusivegateway3" targetRef="servicetask3"/>
<sequenceFlow id="flow9" skipExpression="${sign=='false'}" sourceRef="exclusivegateway1" targetRef="servicetask3"/>
<sequenceFlow id="flow10" sourceRef="servicetask3" targetRef="endevent1"/>
</process>
<bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNPlane bpmnElement="testProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="Shape-startevent1">
<omgdc:Bounds height="32.0" width="32.0" x="20.0" y="140.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="Shape-endevent1">
<omgdc:Bounds height="32.0" width="32.0" x="860.0" y="140.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="servicetask1" id="Shape-servicetask1">
<omgdc:Bounds height="55.0" width="105.0" x="90.0" y="130.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="Shape-usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="230.0" y="130.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="Shape-exclusivegateway1" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="380.0" y="137.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="Shape-usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="460.0" y="130.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="exclusivegateway3" id="Shape-exclusivegateway3" isMarkerVisible="false">
<omgdc:Bounds height="32.0" width="32.0" x="608.0" y="137.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="servicetask2" id="Shape-servicetask2">
<omgdc:Bounds height="55.0" width="105.0" x="680.0" y="130.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="servicetask3" id="Shape-servicetask3">
<omgdc:Bounds height="55.0" width="105.0" x="576.0" y="20.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="105.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1" sourceElement="startevent1" targetElement="servicetask1">
<omgdi:waypoint x="52.0" y="156.0"/>
<omgdi:waypoint x="90.0" y="157.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2" sourceElement="servicetask1" targetElement="usertask1">
<omgdi:waypoint x="195.0" y="157.5"/>
<omgdi:waypoint x="230.0" y="157.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3" sourceElement="usertask1" targetElement="exclusivegateway1">
<omgdi:waypoint x="335.0" y="157.5"/>
<omgdi:waypoint x="380.0" y="153.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4" sourceElement="exclusivegateway1" targetElement="usertask2">
<omgdi:waypoint x="412.0" y="153.0"/>
<omgdi:waypoint x="460.0" y="157.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5" sourceElement="usertask2" targetElement="exclusivegateway3">
<omgdi:waypoint x="565.0" y="157.5"/>
<omgdi:waypoint x="608.0" y="153.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6" sourceElement="exclusivegateway3" targetElement="servicetask2">
<omgdi:waypoint x="640.0" y="153.0"/>
<omgdi:waypoint x="680.0" y="157.5"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7" sourceElement="servicetask2" targetElement="endevent1">
<omgdi:waypoint x="785.0" y="157.5"/>
<omgdi:waypoint x="860.0" y="156.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10" sourceElement="servicetask3" targetElement="endevent1">
<omgdi:waypoint x="681.0" y="47.0"/>
<omgdi:waypoint x="877.0" y="47.0"/>
<omgdi:waypoint x="877.0" y="140.0312805773287"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8" sourceElement="exclusivegateway3" targetElement="servicetask3">
<omgdi:waypoint x="624.0" y="137.0"/>
<omgdi:waypoint x="624.0" y="75.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9" sourceElement="exclusivegateway1" targetElement="servicetask3">
<omgdi:waypoint x="400.0" y="141.0"/>
<omgdi:waypoint x="400.0" y="47.0"/>
<omgdi:waypoint x="576.0" y="47.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="-1.0" width="-1.0" x="-1.0" y="-1.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
......@@ -52,8 +52,8 @@ app:
active-process: RecordStandardProcess.bpmn
swagger2:
# host: localhost:8110
host: 47.105.236.43/activiti
host: localhost:8110
# host: 47.105.236.43/activiti
......
package com.keymobile;
import com.keymobile.rest.common.exception.TwinkleException;
import com.keymobile.rest.common.validator.TwinkleValidator;
import com.keymobile.rest.model.Job;
import com.keymobile.rest.service.JobService;
import javafx.application.Application;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@RunWith(SpringRunner.class)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment