提交 226e0fae authored 作者: 1239068511@qq.com's avatar 1239068511@qq.com

从另外一个项目把工作流的代码搬过来了

上级 fbb36ba4
......@@ -110,7 +110,47 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/resources/lib/oscarJDBC16.jar</systemPath>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>dialect</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/resources/lib/oscarHibernate54.jar</systemPath>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.programmaticallyspeaking.aptdemo</groupId>
<artifactId>generateAnnotation</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/resources/lib/generateAnnotation-1.0-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
<build>
......
package com.tykj.workflowcore.base.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* @author huangjiafu
* @version V1.0
* @data 2021/7/15 10:46
**/
@Component
public class BeanFactory {
@Bean
ClassLoader initClassLoader(){
return getClass().getClassLoader();
}
}
package com.tykj.workflowcore.base.config;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.stereotype.Component;
/**
* @author huangjiafu
* @version V1.0
* @data 2021/7/15 9:49
**/
@Component
public class ToUpperCase extends PhysicalNamingStrategyStandardImpl {
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
return Identifier.toIdentifier(name.getText().toUpperCase());
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return Identifier.toIdentifier(name.getText().toUpperCase());
}
}
package com.tykj.workflowcore.base.config;
import com.tykj.workflowcore.model_layer.service.ModelService;
import com.tykj.workflowcore.workflow_editer.listener.ProcessEndListener;
import org.flowable.engine.RuntimeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
......@@ -11,13 +9,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import static com.tykj.workflowcore.base.util.ClassUtil.loadClassByLoader;
/**
* @author HuangXiahao
......@@ -30,29 +21,20 @@ import static com.tykj.workflowcore.base.util.ClassUtil.loadClassByLoader;
basePackages = {"com.tykj.workflowcore"}
)
@EnableJpaRepositories(basePackages = {
"com.tykj.workflowcore.model_layer.dao",
"com.tykj.workflowcore.model.repository",
"com.tykj.workflowcore.workflow_editer.dao"
})
public class WorkflowCoreRunner implements CommandLineRunner {
@Autowired
ModelService modelService;
@Autowired
RuntimeService runtimeService;
@Bean
ClassLoader initClassLoader(){
return getClass().getClassLoader();
}
@Override
public void run(String... args) {
System.out.println("核心成功启动");
//创建xml文件夹 如果不存在的话
createXmlMkdir();
modelService.swaggerScan(loadClassByLoader(this.getClass().getClassLoader()));
}
......
package com.tykj.workflowcore.base.entity;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.SequenceGenerator;
import java.io.Serializable;
import java.util.HashMap;
/**
* @author HuangXiahao
* @version V1.0
* @class UUIDHexGenerator
* @packageName com.tykj.base.entity
**/
public class XMQGenerator extends SequenceGenerator {
public XMQGenerator() {
super();
}
@Override
public Serializable generate(SharedSessionContractImplementor s, Object obj) {
if (obj instanceof HashMap){
HashMap hashMap = (HashMap) obj;
if (hashMap.containsKey("id")){
return (Serializable) hashMap.get("id");
};
}
return super.generate(s, obj);
}
}
package com.tykj.workflowcore.base.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Locale;
import static java.util.Objects.isNull;
@Component
public class SpringBeanService implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(isNull(this.applicationContext)) {
this.applicationContext = applicationContext;
}
}
/**
* 获取applicationContext
*/
public ApplicationContext getApplicationContext() {
return this.applicationContext;
}
/**
* 通过name获取 Bean.
*/
public Object getBeanByClassName(String className){
if (StringUtils.isEmpty(className)){
return null;
}
int lastPoint = className.lastIndexOf(".");
className = className.substring(lastPoint+1);
className = className.substring(0,1).toLowerCase(Locale.ROOT)+className.substring(1);
return getApplicationContext().getBean(className);
}
/**
* 通过name获取 Bean.
*/
public Object getBean(String name){
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
*/
public <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
*/
public <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
\ No newline at end of file
package com.tykj.workflowcore.workflow_editer.config;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;
/**
* 为解决flowable图片中的中文乱码
* @author zhoushaopan
*/
@Configuration
public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> {
@Override
public void configure(SpringProcessEngineConfiguration engineConfiguration) {
engineConfiguration.setActivityFontName("宋体");
engineConfiguration.setLabelFontName("宋体");
engineConfiguration.setAnnotationFontName("宋体");
}
}
package com.tykj.workflowcore.workflow_editer.controller;
import com.tykj.workflowcore.workflow_editer.entity.DataHistory;
import com.tykj.workflowcore.workflow_editer.entity.vo.*;
import com.tykj.workflowcore.workflow_editer.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* ClassName: FlowsInfoController
* Package: com.tykj.controller
* Description:
* Datetime: 2021/2/24 10:13
* @Author: zsp
*/
@RestController
@Api(tags = "历史数据接口")
@RequestMapping("/dataHistory")
public class DataHistoryController {
@Autowired
private FlowInfoService flowInfoService;
@Autowired
private WorkFlowService workFlowService;
@Autowired
private NodeInfoService nodeInfoService;
@Autowired
private DataHistoryService dataHistoryService;
@PostMapping("/saveDataHistory")
@ApiOperation(value = "保存历史数据")
public void saveDataHistory(@RequestBody DataHistory dataHistory){
dataHistoryService.saveData(dataHistory);
}
// @GetMapping("/findByTaskId")
// @ApiOperation(value = "通过任务id查询数据")
// public Map<String,Object> findByTaskId(String taskId){
//
// DataHistory byTaskId = dataHistoryService.findByTaskId(taskId);
// String datas = byTaskId.getDatas();
// Map map = (Map) JSON.parse(datas);
// return map;
// }
}
package com.tykj.workflowcore.workflow_editer.controller;
import com.tykj.workflowcore.base.result.ResultUtil;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import com.tykj.workflowcore.workflow_editer.entity.VariableStorage;
import com.tykj.workflowcore.workflow_editer.entity.vo.*;
import com.tykj.workflowcore.workflow_editer.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.xml.stream.XMLStreamException;
import java.io.IOException;
/**
* ClassName: FlowsInfoController
* Package: com.tykj.controller
* Description:
* Datetime: 2021/2/24 10:13
* @Author: zsp
*/
@RestController
@Api(tags = "流程管理接口")
@RequestMapping("/flowsInfo")
public class FlowsInfoController {
@Autowired
private FlowInfoService flowInfoService;
@Autowired
private WorkFlowService workFlowService;
@PostMapping("/searchAllFlowInfo")
@ApiOperation(value = "查询所有流程信息")
public Page<FlowsInfo> searchAllFlowInfo(@RequestBody SearchAllFlowInfoVo searchAllFlowInfoVo){
return flowInfoService.searchAllFlowInfo(searchAllFlowInfoVo);
}
@PostMapping("/searchFlowInfo")
@ApiOperation(value = "查询可发起流程信息")
public Page<FlowsInfo> searchFlowInfo(@RequestBody SearchFlowInfoVo searchFlowInfoVo){
return flowInfoService.searchFlowInfo(searchFlowInfoVo);
}
@PostMapping("/upLoadFile")
@ApiOperation(value = "上传文件")
public String upLoadFile(@RequestParam("file") MultipartFile file){
return workFlowService.upLoadFile(file);
}
@GetMapping("editFlow")
@ApiOperation(value = "编辑流程")
public ResponseEntity editFlow(Integer id){
return ResultUtil.success(flowInfoService.editFlow(id),"查询成功");
}
@PostMapping("/saveXml")
@ApiOperation(value = "保存xml以及其他流程信息")
public ResponseEntity saveXml(@RequestBody FlowsInfoVo flowsInfoVo) throws IOException, XMLStreamException {
//保存节点信息
// nodeInfoService.saveNodeInfoList(flowsInfoVo.getNodeInfoList());
//保存xml信息
workFlowService.flowXml(flowsInfoVo);
return ResultUtil.success("文件保存成功");
}
@PostMapping("/updateByProcessName")
@ApiOperation(value = "通过流程名称修改")
public ResponseEntity updateByProcessName(@RequestBody FlowsInfoVo flowsInfoVo) {
FlowsInfo flowsInfo = flowInfoService.findByFlowName(flowsInfoVo);
return ResultUtil.success(flowsInfo.getFlowName(),"流程修改成功");
}
@PostMapping("/updateByDesc")
@ApiOperation(value = "通过流程描述修改")
public ResponseEntity updateByDesc(@RequestBody FlowsInfoVo flowsInfoVo) {
FlowsInfo flowsInfo = flowInfoService.findByDesc(flowsInfoVo);
return ResultUtil.success(flowsInfo.getFlowDescribe(),"流程修改成功");
}
@PostMapping("/createFlow")
@ApiOperation("创建流程")
public ResponseEntity createFlow(@RequestBody FlowsInfoVo flowsInfovo){
return ResultUtil.success(workFlowService.createFlow(flowsInfovo.toEntity()),"流程创建成功");
}
}
package com.tykj.workflowcore.workflow_editer.controller;
import com.tykj.workflowcore.base.result.ResultUtil;
import com.tykj.workflowcore.workflow_editer.entity.FormPage;
import com.tykj.workflowcore.workflow_editer.entity.vo.FormPageVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.PageFormPageVo;
import com.tykj.workflowcore.workflow_editer.service.FormPageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
/**
* ClassName: FormPageController
* Package: com.tykj.controller
* Description:
* Datetime: 2021/3/3 13:40
*
* @Author: zsp
*/
@RestController()
@RequestMapping("/formPage")
@Api(tags = "页面管理接口")
public class FormPageController {
@Autowired
private FormPageService formPageService;
@ApiOperation("保存页面")
@PostMapping("/savePage")
public ResponseEntity savePage(@RequestBody FormPageVo inFormPageVo){
if (inFormPageVo.getId() == null){
Integer pageId = formPageService.savePage(inFormPageVo);
return ResultUtil.success(pageId,"页面保存成功");
}else {
//修改
FormPage formPage = inFormPageVo.toEntity();
formPageService.update(formPage);
return ResultUtil.success(inFormPageVo.getId(),"页面保存成功");
}
}
@ApiOperation("回显页面")
@GetMapping("/EchoPage")
public FormPage EchoPage(Integer id){
return formPageService.getPage(id);
}
@ApiOperation("查看页面")
@PostMapping("/findPages")
public ResponseEntity findPages(@RequestBody PageFormPageVo pageFormPageVo){
return ResultUtil.success(formPageService.getAllPages(pageFormPageVo),"查询成功");
}
@ApiOperation("删除页面")
@DeleteMapping("deletePage")
public ResponseEntity deletePage(Integer id){
formPageService.deletePage(id);
return ResultUtil.success("删除页面成功");
}
}
package com.tykj.workflowcore.workflow_editer.controller;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowRole;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowRoleType;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowUser;
import com.tykj.workflowcore.workflow_editer.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* ClassName: UserController
* Package: com.tykj.workflowcore.workflow_editer.controller
* Description:
* Datetime: 2021/3/24 18:56
*
* @Author: zsp
*/
@RestController
@Api(tags = "人员管理接口")
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getAllUsers")
@ApiOperation(value = "查询所有用户")
public List<WorkFlowUser> getAllUsers(){
List<WorkFlowUser> allUser = userService.getAllUser();
return allUser;
}
@GetMapping("/getAllRoles")
@ApiOperation(value = "查询所有的角色类型")
public List<WorkFlowRoleType> getAllRoles(){
List<WorkFlowRoleType> roleType = userService.getRoleType();
return roleType;
}
@GetMapping("/getAllUserByRole")
@ApiOperation(value = "查询所有的角色类型下的所有角色")
public List<WorkFlowRole> getAllUserByRole(String roleType){
List<WorkFlowRole> allRole = userService.getAllRole(roleType);
return allRole;
}
}
package com.tykj.workflowcore.workflow_editer.controller;
import com.tykj.workflowcore.base.result.ResultUtil;
import com.tykj.workflowcore.workflow_editer.entity.vo.*;
import com.tykj.workflowcore.workflow_editer.service.WorkFlowService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* ClassName: WorkFlowController
* Package: com.tykj.controller
* Description:
* Datetime: 2021/3/2 9:48
*
* @Author: zsp
*/
@Api(tags = "工作流管理接口")
@RestController
@RequestMapping("/workFlow")
public class WorkFlowController {
@Autowired
private WorkFlowService workFlowService;
@PostMapping("/startFlow")
@ApiOperation("开启流程")
public ResponseEntity startFlow(@RequestBody StartFlowVo startFlowVo){
workFlowService.startFlow(startFlowVo);
return ResultUtil.success("流程开启成功");
}
@GetMapping("/deployFlow")
@ApiOperation("部署流程")
public ResponseEntity deployFlow(Integer id) throws FileNotFoundException {
workFlowService.deployXml(id);
return ResultUtil.success("流程部署成功");
}
@PostMapping("/findUserTask")
@ApiOperation("任务个人待办列表")
public List<Map<String,Object>> findUserTask(@RequestBody NextTaskVo nextTaskVo){
return workFlowService.findTaskByUserId(nextTaskVo);
}
@GetMapping("/findTaskDetail")
@ApiOperation("任务个人待办任务详情")
public Map<String, Object> findTaskDetail(String taskId){
return workFlowService.findTaskDetail(taskId);
}
@PostMapping("/completeTask")
@ApiOperation("完成任务")
public ResponseEntity completeTask(@RequestBody TaskVo taskVo){
workFlowService.completeTask(taskVo);
return ResultUtil.success("任务已完成");
}
@PostMapping("/isTransferTask")
@ApiOperation("是否转交任务")
public ResponseEntity isTransferTask(@RequestBody TransferTask transferTask){
workFlowService.transferTask(transferTask);
return ResultUtil.success("该任务转交成功");
}
@GetMapping("/isSuspension")
@ApiOperation("是否挂起")
public ResponseEntity isSuspension(Integer id){
workFlowService.suspendOrActivateProcessDefinitionByKey(id);
return ResultUtil.success("该流程已经成功"+(id==0?"启用":"禁用"));
}
@DeleteMapping("/deleteFlow")
@ApiOperation("是否删除")
public ResponseEntity deleteFlow(Integer id){
workFlowService.deleteFlow(id);
return ResultUtil.success("该流程删除成功");
}
@PostMapping("/flowProgress")
@ApiOperation("流程进度")
public void flowProgress(@RequestBody FlowProcessVo flowProcessVo) throws IOException {
workFlowService.flowProgress(flowProcessVo.getResponse(),flowProcessVo.getProcessInstanceId());
}
@GetMapping("/findHistoryTask")
@ApiOperation("已办任务")
public List findHistoryTask() {
return workFlowService.findHistoryTask();
}
@GetMapping("/findStartByUser")
@ApiOperation("查询我发起的流程")
public List<HistoricProcessInstance> findStartByUser(String userId) {
List<HistoricProcessInstance> startByUser = workFlowService.findStartByUser(userId);
return startByUser;
}
}
package com.tykj.workflowcore.workflow_editer.dao;
import com.tykj.workflowcore.workflow_editer.entity.DataHistory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* ClassName: FlowsInfoMapper
* Package: com.tykj.mapper
* Datetime: 2021/2/23 14:06
* @Author: zsp
*/
public interface DataHistoryMapper extends JpaRepository<DataHistory,Integer>, JpaSpecificationExecutor<DataHistory> {
/**
* 根据任务id查询
* @param taskId 任务id
* @return
*/
// DataHistory findByTaskId(String taskId);
}
package com.tykj.workflowcore.workflow_editer.dao;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* ClassName: FlowsInfoMapper
* Package: com.tykj.mapper
* Datetime: 2021/2/23 14:06
* @Author: zsp
*/
public interface FlowsInfoMapper extends JpaRepository<FlowsInfo,Integer>, JpaSpecificationExecutor<FlowsInfo> {
/**
* 根据流程主键查询
* @param flowKey 流程主键
* @return FlowsInfo
*/
FlowsInfo findByFlowKey(String flowKey);
/**
* 根据部署流程id查询
* @param deployId 部署id
* @return FlowsInfo
*/
FlowsInfo findByDeployId(String deployId);
/**
* 根据流程实例id查询
* @param processInstanceId 流程实例id
* @return
*/
FlowsInfo findByProcessInstanceId(String processInstanceId);
}
package com.tykj.workflowcore.workflow_editer.dao;
import com.tykj.workflowcore.workflow_editer.entity.FormPage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* ClassName: PageEntityMapper
* Package: com.tykj.mapper
* Description:
* Datetime: 2021/3/3 13:12
*
* @Author: zsp
*/
public interface FormPageMapper extends JpaRepository<FormPage,Integer> , JpaSpecificationExecutor<FormPage> {
//根据PROCESS 查询最新版本的页面
@Query(value = "SELECT f1.* FROM FORMPAGE as f1 RIGHT JOIN (SELECT PAGEIDENTIFICATION,MAX(VERSION) as VERSION FROM FORMPAGE GROUP BY PAGEIDENTIFICATION ) as f2 on f2.PAGEIDENTIFICATION = f1.PAGEIDENTIFICATION and f2.VERSION = f1.VERSION WHERE PROCESSKEY = ?1",nativeQuery = true)
List<FormPage> findNewFromPageByProcessKey(String processKey);
}
package com.tykj.workflowcore.workflow_editer.dao;
import com.tykj.workflowcore.workflow_editer.entity.NodeInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* ClassName: NodePage
* Package: com.tykj.mapper
* Description:
* Datetime: 2021/3/4 15:31
*
* @Author: zsp
*/
public interface NodePageMapper extends JpaRepository<NodeInfo,Integer>, JpaSpecificationExecutor<NodeInfo> {
/**
* 通过节点id得到pageId
* @param nodeId 节点id
* @return 返回页面id
*/
Integer findByNodeId(String nodeId);
}
package com.tykj.workflowcore.workflow_editer.dao;
import com.tykj.workflowcore.workflow_editer.entity.VariableStorage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* ClassName: VariableStorageMapper
* Package: com.tykj.mapper
* Description:
* Datetime: 2021/3/3 10:08
*
* @Author: zsp
*/
public interface VariableStorageMapper extends JpaRepository<VariableStorage,Integer>, JpaSpecificationExecutor<VariableStorage> {
/**
* 通过流程主键获取变量池
* @param flowKey 流程主键
* @return
*/
List<VariableStorage> findAllByFlowKey(String flowKey);
}
package com.tykj.workflowcore.workflow_editer.entity;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager;
import org.flowable.engine.impl.util.CommandContextUtil;
/**
* @author HuangXiahao
* @version V1.0
* @class Test
* @packageName com.example.flowable.expense.controller
**/
public class CommandGetValue implements Command<Object> {
private String processInstanceId;
private Expression expression;
public CommandGetValue(String processInstanceId, Expression expression) {
this.processInstanceId = processInstanceId;
this.expression = expression;
}
@Override
public Object execute(CommandContext commandContext) {
ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();
ExecutionEntity executionEntity = executionEntityManager.findChildExecutionsByProcessInstanceId(processInstanceId).get(0);
return expression.getValue(executionEntity);
}
}
package com.tykj.workflowcore.workflow_editer.entity;
import com.tykj.workflowcore.base.entity.BaseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.Entity;
import javax.persistence.Lob;
/**
* ClassName: DataHistory
* Package: com.tykj.workflowcore.workflow_editer.entity
* Description:
* Datetime: 2021/4/16 15:21
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@SQLDelete(sql = "update flows_info set deleted = 1 where id = ?")
@Where(clause = "deleted = 0")
@Api("历史数据展示页面")
public class DataHistory extends BaseEntity {
@ApiModelProperty("流程主键id")
private String flowKey;
@ApiModelProperty("流程实例id")
private String processInstanceId;
@ApiModelProperty("页面id")
private String pageId;
@ApiModelProperty("变量数据")
@Lob
private String datas;
@ApiModelProperty("用户id")
private Integer userId;
}
package com.tykj.workflowcore.workflow_editer.entity;
import com.tykj.workflowcore.base.entity.BaseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.Entity;
/**
* ClassName: FlowsInfo
* Package: com.tykj.entity
* Description:
* Datetime: 2021/2/23 10:12
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@SQLDelete(sql = "update flows_info set deleted = 1 where id = ?")
@Where(clause = "deleted = 0")
@Api("流程表")
public class FlowsInfo extends BaseEntity {
@ApiModelProperty("发起人的Id")
private Integer userId;
@ApiModelProperty("发起人的名字")
private String userName;
@ApiModelProperty("流程名称")
private String flowName;
@ApiModelProperty("资源名称")
private String resourceName;
@ApiModelProperty("流程主键")
private String flowKey;
@ApiModelProperty(value = "部署状态",notes = "0 已启用,1 未启用")
private Integer state;
@ApiModelProperty("文件路径")
private String filePath;
@ApiModelProperty("自定义格式XML路径")
private String fileCustomPath;
@ApiModelProperty("流程描述")
private String flowDescribe;
// @ApiModelProperty("开始节点的id")
// private String startId;
@ApiModelProperty("开始节点页面的id")
private Integer startPageId;
@ApiModelProperty("流程实例id")
private String processInstanceId;
@ApiModelProperty("是否和之前一样 0是一样 1不一样")
private Integer isOld;
/**
* @Description:
* @params: 部署id
*/
private String deployId;
@ApiModelProperty("流程所拥有的模型")
private String tableInfoIds;
}
package com.tykj.workflowcore.workflow_editer.entity;
import com.tykj.workflowcore.base.entity.BaseEntity;
import com.tykj.workflowcore.workflow_editer.entity.vo.FormPageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.beans.BeanUtils;
import javax.persistence.Entity;
import javax.persistence.Lob;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* ClassName: FormPage
* Package: com.tykj.entity
* Description:
* Datetime: 2021/3/3 10:32
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@SQLDelete(sql = "update flows_info set deleted = 1 where id = ?")
@Where(clause = "deleted = 0")
@Api("表单页面")
public class FormPage extends BaseEntity {
@ApiModelProperty("页面标识,区别与数据库ID 该标识用于区分是否为同一张页面的不同版本")
private String pageIdentification;
@ApiModelProperty("版本号")
private Integer version;
@ApiModelProperty("页面名称")
private String pageName;
@ApiModelProperty("页面描述")
private String pageDesc;
@ApiModelProperty("模板")
@Lob
private String template;
@ApiModelProperty("页面js")
@Lob
private String js;
@ApiModelProperty("页面css")
@Lob
private String css;
@ApiModelProperty("json描述文件")
@Lob
private String descFile;
@ApiModelProperty("实体类id")
private String entityId;
@ApiModelProperty("所属流程key")
private String processKey;
public FormPageVo toEntityVo(){
FormPageVo inFormPageVo = new FormPageVo();
BeanUtils.copyProperties(this,inFormPageVo);
//将string还原成list
String entityId = this.getEntityId();
String str[] = entityId.split(",");
List<String> entityIds = Arrays.asList(str);
//去重
List<String> collectIds = entityIds.stream().distinct().collect(Collectors.toList());
inFormPageVo.setEntityIds(collectIds);
return inFormPageVo;
}
}
package com.tykj.workflowcore.workflow_editer.entity;
import com.tykj.workflowcore.base.entity.BaseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
/**
* ClassName: NodePage
* Package: com.tykj.entity
* Description:
* Datetime: 2021/3/3 13:08
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Api("节点信息")
public class NodeInfo extends BaseEntity {
@ApiModelProperty("节点id")
private String nodeId;
@ApiModelProperty("页面id")
private Integer pageId;
@ApiModelProperty("流程key")
private String flowKey;
@ApiModelProperty("流程名")
private String flowName;
// @ApiModelProperty("候选人类型")
// private String candidateType;
//
// @ApiModelProperty("候选人显示值")
// private String candidateLabel;
//
// @ApiModelProperty("候选人显示值")
// private String candidateValue;
//
// @ApiModelProperty("0为默认,1为可视,2为公式")
// private Integer expressionType;
//
// @ApiModelProperty("输入框中的值 例如: 同意,不同意")
// private Integer expressionValue;
//
// @ApiModelProperty("连接条件")
// private String expressionConnectionConditions;
@ApiModelProperty("判断条件拼接字段 例如:[{'resource':'${people.id}','comparator':'>=','value':'10'}]")
private String expressionCondition;
}
package com.tykj.workflowcore.workflow_editer.entity;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.tykj.workflowcore.base.entity.BaseEntity;
import com.tykj.workflowcore.workflow_editer.entity.vo.ParameterVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Lob;
import java.util.List;
/**
* ClassName: VariableStorage
* Package: com.tykj.entity
* Description:
* Datetime: 2021/3/3 10:03
*
* @Author: zsp
*/
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Data
public class VariableStorage extends BaseEntity {
@ApiModelProperty("流程主键")
private String flowKey;
@ApiModelProperty("流程主键")
private String activityId;
@ApiModelProperty("调用类名")
private String className;
@ApiModelProperty("调用方法")
private String name;
@ApiModelProperty("方法描述")
private String description;
@Lob
@ApiModelProperty("详情json")
private String params;
public List<ParameterVo> getParams() {
return JSON.parseObject(params,new TypeReference<List<ParameterVo>>(){});
}
}
package com.tykj.workflowcore.workflow_editer.entity;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager;
import org.flowable.engine.impl.util.CommandContextUtil;
/**
* ClassName: VariablesMap
* Package: com.example.flowable.expense.controller
* Description:
* Datetime: 2021/3/10 19:08
*
* @Author: zsp
*/
public class VariablesMap implements Command<Object> {
private String processInstanceId;
private Expression expression;
public VariablesMap(String processInstanceId, Expression expression) {
this.processInstanceId = processInstanceId;
this.expression = expression;
}
@Override
public Object execute(CommandContext commandContext) {
ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();
ExecutionEntity executionEntity =
executionEntityManager.findChildExecutionsByProcessInstanceId(processInstanceId).get(0);
return expression.getValue(executionEntity);
}
}
package com.tykj.workflowcore.workflow_editer.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* ClassName: Role
* Package: com.tykj.entity
* Description:
* Datetime: 2021/2/23 15:05
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorkFlowRole {
/**
* 例如研发部、管理员等
*/
private String name;
/**
* 例如: department,subject 等
*/
private String roleType;
/**
* 权限在数据库中的ID
*/
private String roleId;
}
package com.tykj.workflowcore.workflow_editer.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* ClassName: Role
* Package: com.tykj.entity
* Description:
* Datetime: 2021/2/23 15:05
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorkFlowRoleType {
//例如:部门、角色
private String name;
/**
* 例如: department,subject 等
*/
private String type;
}
package com.tykj.workflowcore.workflow_editer.entity;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* ClassName: User
* Package: com.tykj.entity
* Description:
* Datetime: 2021/2/23 14:47
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Api("用户表")
public class WorkFlowUser implements Serializable {
private String id;
private String userName;
}
package com.tykj.workflowcore.workflow_editer.entity.enums;
/**
* @author HuangXiahao
* @version V1.0
* @class JavaTypeEnum
* @packageName com.tykj.workflowcore.workflow_editer.entity
**/
public enum JavaTypeEnum {
INTEGER(Integer.class.getName()),
STRING(String.class.getName()),
CHARACTER(Character.class.getName()),
BYTE(Byte.class.getName()),
SHORT(Short.class.getName()),
LONG(Long.class.getName()),
FLOAT(Float.class.getName()),
DOUBLE(Double.class.getName());
private final String name;
JavaTypeEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* ClassName: DeployedVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/4 14:18
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeployedVo {
private FlowsInfoVo flowsInfoVo;
@ApiModelProperty("节点的第一个绑定的页面id")
private Integer pageId;
@ApiModelProperty("流程主键")
private String flowKey;
@ApiModelProperty("流程名称")
private String flowName;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.servlet.http.HttpServletResponse;
/**
* ClassName: FlowProcessVo
* Package: com.tykj.workflowcore.workflow_editer.vo
* Description:
* Datetime: 2021/3/10 9:59
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Api("流程进度")
public class FlowProcessVo {
@ApiModelProperty
private HttpServletResponse response;
@ApiModelProperty("流程实例Id")
private String processInstanceId;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
/**
* ClassName: FlowInfoVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/1 9:54
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FlowsInfoVo {
@ApiModelProperty("主键id")
private Integer id;
@ApiModelProperty("流程名称")
private String flowName;
@ApiModelProperty("流程主键")
private String flowKey;
@ApiModelProperty(value = "部署状态",notes = "0 已部署,1 未部署")
private Integer state = 1;
@ApiModelProperty("流程描述")
private String flowDescribe;
@ApiModelProperty
private String fileXml;
public FlowsInfo toEntity(){
FlowsInfo flowsInfo = new FlowsInfo();
BeanUtils.copyProperties(this,flowsInfo);
return flowsInfo;
}
public FlowsInfo toEntity(FlowsInfo oldFlowsInfo){
if (!StringUtils.isEmpty(flowName)){
oldFlowsInfo.setFlowName(flowName);
}
if (!StringUtils.isEmpty(flowDescribe)){
oldFlowsInfo.setFlowDescribe(flowDescribe);
}
return oldFlowsInfo;
}
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.workflow_editer.entity.FormPage;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import javax.persistence.Lob;
import java.util.Date;
import java.util.List;
/**
* ClassName: FormPageVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/3 13:32
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FormPageVo {
@ApiModelProperty("页面id")
private Integer id;
@ApiModelProperty("页面名称")
private String pageName;
@ApiModelProperty("页面描述")
private String pageDesc;
@ApiModelProperty("模板")
@Lob
private String template;
@ApiModelProperty("页面js")
@Lob
private String js;
@ApiModelProperty("页面css")
@Lob
private String css;
@ApiModelProperty("创建的时间")
private Date createTime;
@ApiModelProperty("修改的时间")
private Date updateTime;
@ApiModelProperty("json描述文件")
@Lob
private String descFile;
@ApiModelProperty("实体类")
private List<String> entityIds;
public FormPage toEntity(){
FormPage formPage = new FormPage();
StringBuffer idStr = new StringBuffer();
for (int i = 0; i < entityIds.size(); i++) {
idStr.append(entityIds.get(i));
idStr.append(",");
if (i == entityIds.size()-1){
idStr.deleteCharAt(idStr.length()-1);
}
}
formPage.setEntityId(idStr.toString());
BeanUtils.copyProperties(this,formPage);
return formPage;
}
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* ClassName: NextTaskVo
* Package: com.tykj.workflowcore.workflow_editer.vo
* Description:
* Datetime: 2021/3/5 17:47
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class NextTaskVo {
private String userId;
private List<String> roleId;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HuangXiahao
* @version V1.0
* @class NodeInfoVo
* @packageName com.tykj.workflowcore.workflow_editer.entity.vo
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class NodeInfoVo {
@ApiModelProperty("主键id")
private Integer id;
@ApiModelProperty("节点id")
private String nodeId;
@ApiModelProperty("页面id")
private long pageId;
@ApiModelProperty("流程key")
private String flowKey;
@ApiModelProperty("流程名")
private String flowName;
@ApiModelProperty("0为默认,1为可视,2为公式")
private Integer type;
@ApiModelProperty("输入框中的值 例如: 同意,不同意")
private Integer value;
@ApiModelProperty("连接条件")
private String connectionConditions;
@ApiModelProperty("判断条件拼接字段 例如:[{'resource':'${people.id}','comparator':'>=','value':'10'}]")
private String expressionCondition;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.workflow_editer.entity.FormPage;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;
import java.util.Date;
/**
* ClassName: FormPageVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/3 13:32
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OutFormPageVo {
@ApiModelProperty("主键id")
private Integer id;
@ApiModelProperty("页面名称")
private String pageName;
@ApiModelProperty("页面描述")
private String pageDesc;
@ApiModelProperty("创建的时间")
private Date createTime;
@ApiModelProperty("修改的时间")
private Date updateTime;
public FormPage toEntity(){
FormPage formPage = new FormPage();
BeanUtils.copyProperties(this,formPage);
return formPage;
}
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* ClassName: PageEntityVo
* Package: com.tykj.workflowcore.workflow_editer.entity
* Description:
* Datetime: 2021/3/9 10:32
*
* @Author: zsp
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class PageEntityVo {
private Integer pageId;
private List<String> entityIds;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.base.page.JpaCustomPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* ClassName: PageFormPageVo
* Package: com.tykj.workflowcore.workflow_editer.vo
* Description:
* Datetime: 2021/3/11 15:33
*
* @Author: zsp
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@Api(tags = "分页查询页面")
public class PageFormPageVo extends JpaCustomPage {
@ApiModelProperty("页面名称")
private String pageName;
@ApiModelProperty("页面描述")
private String pageDesc;
@ApiModelProperty("页面创建时间")
private Date createTime;
@ApiModelProperty("页面标识,区别与数据库ID 该标识用于区分是否为同一张页面的不同版本")
private String pageIdentification;
@ApiModelProperty("版本号")
private Integer version;
@ApiModelProperty("所属流程key")
private String processKey;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* ClassName: PageVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/2 20:42
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageVo {
@ApiModelProperty("用户id")
private Integer userId;
@ApiModelProperty("list集合")
private List list;
@ApiModelProperty("当前页码")
private int pageNum;
@ApiModelProperty("当前页的大小")
private int pageSize = 5;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 回调接口配置Vo
* @author HuangXiahao
* @version V1.0
* @class parameterVo
* @packageName com.tykj.workflowcore.workflow_editer.entity.vo
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ParameterVo {
private String className;
private String exp;
private String name;
private List<ParameterVo> fields;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HuangXiahao
* @version V1.0
* @class SearchFlowInfoVo
* @packageName com.tykj.workflowcore.workflow_editer.entity.vo
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SearchAllFlowInfoVo extends JpaCustomPage {
@ApiModelProperty(value = "状态",notes = "0 可用,1 暂停")
private Integer state ;
@ApiModelProperty("流程名称")
private String flowName;
@ApiModelProperty("流程主键")
private String flowKey;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HuangXiahao
* @version V1.0
* @class SearchFlowInfoVo
* @packageName com.tykj.workflowcore.workflow_editer.entity.vo
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SearchFlowInfoVo extends JpaCustomPage {
@ApiModelProperty(value = "状态",notes = "0 可用,1 暂停")
private Integer state = 0;
@ApiModelProperty("流程名称")
private String flowName;
@ApiModelProperty("流程主键")
private String flowKey;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author HuangXiahao
* @version V1.0
* @class SearchPageEntityVo
* @packageName com.tykj.workflowcore.workflow_editer.entity.vo
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SearchPageEntityVo {
List<Integer> pageIds;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import com.tykj.workflowcore.base.page.JpaCustomPage;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HuangXiahao
* @version V1.0
* @class searchVariableStorageVo
* @packageName com.tykj.workflowcore.workflow_editer.entity.vo
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SearchVariableStorageVo extends JpaCustomPage {
private Integer id;
private String flowKey;
private String activityId;
public SearchVariableStorageVo(String flowKey,String activityId) {
this.flowKey = flowKey;
this.activityId = activityId;
}
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* ClassName: StartFlowVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/3 9:30
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Api("开启流程")
public class StartFlowVo {
@ApiModelProperty("流程主键")
private String flowKey;
@ApiModelProperty("变量池")
private Map<String,Object> map;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* ClassName: suspendVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/5 10:00
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SuspendVo {
/**
* 流程id
*/
private Integer id;
/**
* 是否可用 0 挂起 1 激活
*/
private int state;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* ClassName: TaskVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/2 16:14
*
* @Author: zsp
*/
@Api("任务待办")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TaskVo {
@ApiModelProperty("任务id")
private String taskId;
@ApiModelProperty("添加评论")
private String comments;
// @ApiModelProperty("用户id")
// private Integer userId;
@ApiModelProperty(value = "是否同意",notes = "0 同意, 1拒绝 ")
private Integer handlingOpinion;
@ApiModelProperty("转交人的id")
private Integer toUserId;
private Map<String,Object> map;
// @ApiModelProperty("条件表达式")
// private String conditionalExpression;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* ClassName: TransferTask
* Package: com.tykj.workflowcore.workflow_editer.vo
* Description:
* Datetime: 2021/3/8 13:56
*
* @Author: zsp
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class TransferTask {
@ApiModelProperty("转交人的id")
private String userId;
@ApiModelProperty("任务ID")
private String taskId;
}
package com.tykj.workflowcore.workflow_editer.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* ClassName: WorkFlowVo
* Package: com.tykj.vo
* Description:
* Datetime: 2021/3/2 10:35
*
* @Author: zsp
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorkFlowVo {
@ApiModelProperty("流程定义主键")
private String processDefinitionKey;
@ApiModelProperty("变量池")
private Map<String, Map<String,Object>> maxMap;
}
package com.tykj.workflowcore.workflow_editer.listener;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.stereotype.Component;
/**
* ClassName: AssigneeListener
* Package: com.tykj.listener
* Description:
* Datetime: 2021/2/23 16:02
*
* @Author: zsp
*/
@Component
public class AssigneeListener implements TaskListener{
@Override
public void notify(DelegateTask delegateTask) {
//指定流程的发起人
//获取当前登录到用户
String userId = "";
delegateTask.setAssignee(userId);
}
}
package com.tykj.workflowcore.workflow_editer.listener;
import com.tykj.workflowcore.base.result.ApiException;
import com.tykj.workflowcore.workflow_editer.entity.VariableStorage;
import com.tykj.workflowcore.workflow_editer.entity.enums.JavaTypeEnum;
import com.tykj.workflowcore.workflow_editer.entity.vo.ParameterVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.SearchVariableStorageVo;
import com.tykj.workflowcore.workflow_editer.service.DataHistoryService;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.UserTask;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.*;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
import org.flowable.engine.delegate.event.FlowableActivityEvent;
import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.*;
/**
* @author HuangXiahao
* @version V1.0
* @class ProcessEndListener
* @packageName com.tykj.workflowcore.workflow_editer.listener
**/
@Component
public class ProcessEndListener extends AbstractFlowableEngineEventListener {
@Autowired
RuntimeService runtimeService;
@Autowired
RepositoryService repositoryService;
@Autowired
FormService formService;
@Autowired
ProcessEngineConfigurationImpl processEngineConfiguration;
@Autowired
TaskService taskService;
@Autowired
DataHistoryService dataHistoryService;
@Override
protected void processCompleted(FlowableEngineEntityEvent event) {
}
@Override
protected void taskCompleted(FlowableEngineEntityEvent event) {
super.taskCompleted(event);
}
@Override
public void onEvent(FlowableEvent flowableEvent) {
super.onEvent(flowableEvent);
}
@Override
protected void activityCompleted(FlowableActivityEvent event) {
super.activityCompleted(event);
if (event instanceof FlowableActivityEventImpl){
DelegateExecution execution = ((FlowableActivityEventImpl) event).getExecution();
if (execution.getCurrentFlowElement() instanceof EndEvent || execution.getCurrentFlowElement() instanceof UserTask){
System.out.println("流程结束了");
//拿到流程定义ID
String processDefinitionId = execution.getProcessDefinitionId();
//通过定义Id取到flowKey
String flowKey = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).list().get(0).getKey();
}
// //开始节点
// if (execution.getCurrentFlowElement() instanceof StartEvent){
// DataHistory dataHistory = new DataHistory();
// StartEvent startEvent = (StartEvent) execution.getCurrentFlowElement();
// //流程id 实例id pageId datas userId
// String processInstanceBusinessKey = execution.getProcessInstanceBusinessKey();
// dataHistory.setFlowKey(processInstanceBusinessKey);
// dataHistory.setProcessInstanceId(execution.getProcessInstanceId());
// dataHistory.setPageId(startEvent.getFormKey());
//// dataHistory.setUserId();
//// dataHistory.setDatas();
// System.out.println(processInstanceBusinessKey);
//
// String formKey = startEvent.getFormKey();
// //通过formKey查询出页面
//
// }
// if (execution.getCurrentFlowElement() instanceof UserTask){
// //查询任务
// Task task = taskService.createTaskQuery().singleResult();
// Map<String, Object> variables = taskService.getVariables(task.getId());
// DataHistory dataHistory = new DataHistory();
// String datas = JSON.toJSONString(variables);
// //流程实例id
// String processInstanceId = task.getProcessInstanceId();
// //当前节点id
// String processInstanceBusinessKey = execution.getProcessInstanceBusinessKey();
//
//// dataHistory.setTaskId(taskId);
// dataHistory.setDatas(datas);
// dataHistory.setProcessInstanceId(processInstanceId);
// dataHistoryService.saveData(dataHistory);
// }
}
}
public Map<String, Object> FillParameter(Map<String, Object> instance,ParameterVo parameterVo,DelegateExecution execution) {
if (!StringUtils.isEmpty(parameterVo.getExp())) {
//如果是表示式 如:${people}
instance.put(parameterVo.getName(),getProcessValue(execution, parameterVo.getExp()));
}else {
if (instance.get(parameterVo.getName())==null){
//判断基础类型 为基础类型
Class<?> aClass = null;
try {
aClass = Class.forName(parameterVo.getClassName());
}catch (ClassNotFoundException e){
throw new ApiException("填充参数时类型转换失败,className:"+parameterVo.getClassName());
}
if (checkIn(parameterVo.getClassName())){
instance.put(parameterVo.getName(),null);
}else
if (Collection.class.isAssignableFrom(aClass)){
if (List.class.isAssignableFrom(aClass)){
instance.put(parameterVo.getName(),new ArrayList<>());
}else {
instance.put(parameterVo.getName(),new HashSet<>());
}
}else {
instance.put(parameterVo.getName(),new HashMap<>());
}
}
}
List<ParameterVo> parameterVoList = parameterVo.getFields();
if (parameterVoList!=null&&parameterVoList.size()>0){
for (int i = 0; i < parameterVoList.size() ; i++) {
if (instance.get(parameterVo.getName()) instanceof Map){
FillParameter((Map<String, Object>) instance.get(parameterVo.getName()),parameterVoList.get(i),execution);
}
}
}
return instance;
}
public Object getProcessValue(DelegateExecution execution, String exp) {
// processInstance -> ExecutionEntity
Expression expression = processEngineConfiguration.getExpressionManager().createExpression(exp);
return expression.getValue(execution);
}
public Boolean checkIn(String className){
JavaTypeEnum[] values = JavaTypeEnum.values();
for (int i = 0; i < values.length ; i++) {
if (className.equals(values[i].getName())){
return true;
};
}
return false;
}
}
package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.workflow_editer.entity.DataHistory;
/**
* ClassName: FlowInfoService
* Package: com.tykj.service
* Description: 流程
* Datetime: 2021/2/24 10:02
*
* @Author: zsp
*/
public interface DataHistoryService {
/**
* 保存
* @param dataHistory 历史数据对象
* @return flowsInfo
*/
DataHistory saveData(DataHistory dataHistory);
/**
* 根据任务id查询
* @param taskId 任务id
* @return flowsInfo 对象
*/
// DataHistory findByTaskId(String taskId);
}
package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import com.tykj.workflowcore.workflow_editer.entity.vo.FlowsInfoVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.SearchAllFlowInfoVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.SearchFlowInfoVo;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestBody;
/**
* ClassName: FlowInfoService
* Package: com.tykj.service
* Description: 流程
* Datetime: 2021/2/24 10:02
*
* @Author: zsp
*/
public interface FlowInfoService {
/**
* 根据id查询出一个flowsInfo对象
* @param id flowInfo Id
* @return FlowInfo对象
*/
FlowsInfo findById(Integer id);
/**
* 根据流程主键修改
* @param flowsInfoVo flowsInfo
* @return flowsInfoVo
*/
FlowsInfo findByFlowName(@RequestBody FlowsInfoVo flowsInfoVo);
/**
* 根据流程描述修改
* @param flowsInfoVo flowsInfo
* @return flowsInfoVo
*/
FlowsInfo findByDesc(@RequestBody FlowsInfoVo flowsInfoVo);
/**
* 根据流程部署id查询
* @param deployId 部署id
* @return flowsInfo
*/
FlowsInfo findByDeployId(String deployId);
/**
* 根据流程主键查询
* @param flowKey 流程主键
* @return flowsInfo 对象
*/
FlowsInfo findByFlowKey(String flowKey);
/**
* 停用流程
* @param flowInfoId
* @return
*/
FlowsInfo disableFlow(Integer flowInfoId);
/**
* 有条件的查询flowInfo
* @param searchAllFlowInfoVo
* @return
*/
Page<FlowsInfo> searchAllFlowInfo(SearchAllFlowInfoVo searchAllFlowInfoVo);
/**
* 有条件的查询flowInfo
* @param searchFlowInfoVo
* @return
*/
Page<FlowsInfo> searchFlowInfo(SearchFlowInfoVo searchFlowInfoVo);
/**
* 编辑流程
* @param id 流程id
* @return
*/
FlowsInfo editFlow(Integer id);
}
package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.model.entity.TableInfo;
import com.tykj.workflowcore.workflow_editer.entity.FormPage;
import com.tykj.workflowcore.workflow_editer.entity.vo.FormPageVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.PageFormPageVo;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* ClassName: PageEntityService
* Package: com.tykj.service
* Description:
* Datetime: 2021/3/3 13:14
*
* @Author: zsp
*/
public interface FormPageService {
/**
* 保存页面
* @param inFormPageVo 页面实体
* @return 主键id
*/
Integer savePage(@RequestBody FormPageVo inFormPageVo);
/**
* 更新页面
* @param formPage 页面实体
* @return 主键id
*/
void update(FormPage formPage);
/**
* 根据页面id来进行回显
* @param id 页面id
* @return 页面信息
*/
FormPage getPage(Integer id);
/**
* 根据流程Id来进行回显 返回最新的一个版本的列表
* @param processKey 页面id
* @return 页面信息
*/
List<FormPage> getPageNewByProcessKey(String processKey);
/**
* 根据页面标识来进行回显 返回最新的一个版本的列表
* @param pageIdentification 页面标识
* @return 页面信息
*/
List<FormPage> getPageNewByPageIdentification(String pageIdentification);
/**
* 根据页面id删除页面
* @param id 页面id
*/
void deletePage(Integer id);
/**
* 查询全部页面
* @param pageFormPageVo 分页
* @return 全部集合
*/
Page<FormPage> getAllPages(PageFormPageVo pageFormPageVo);
}
package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.workflow_editer.entity.NodeInfo;
import java.util.List;
/**
* ClassName: NodePageService
* Package: com.tykj.service
* Description:
* Datetime: 2021/3/4 15:33
*
* @Author: zsp
*/
public interface NodeInfoService {
/**
* 通过节点id得到pageId
* @param nodeId 节点id
* @return 返回页面id
*/
Integer findByNodeId(String nodeId);
/**
* 保存节点和页面的关系
* @param nodeInfo
*/
void saveNodePage(NodeInfo nodeInfo);
/**
* 保存nodeInfo集合 至数据库中
* @param nodeInfoList 集合
*/
void saveNodeInfoList(List<NodeInfo> nodeInfoList);
}
package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowRole;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowRoleType;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowUser;
import java.util.List;
/**
* ClassName: UserService
* Package: com.tykj.service
* Description:
* Datetime: 2021/2/25 13:53
*
* @Author: zsp
*/
public interface UserService {
/**
* 获取当前登录人的id
* @return User对象
*/
WorkFlowUser getCurrentUser();
/**
* 获取所有用户
* @return 所有用户
*/
List<WorkFlowUser> getAllUser();
/**
* 获取当前系统中的用户以及用户分组
* @return
*/
List<WorkFlowRole> getAllRole(String roleType);
/**
* 获取当前系统中的用户分组类别
* @return
*/
List<WorkFlowRoleType> getRoleType();
}
package com.tykj.workflowcore.workflow_editer.service;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import com.tykj.workflowcore.workflow_editer.entity.vo.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.xml.stream.XMLStreamException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* ClassName: FlowableService
* Package: com.tykj.service
* Description:工作流服务接口
* Datetime: 2021/2/23 9:49
*
* @Author: zsp
*/
public interface WorkFlowService {
/**
* 保存流程文件
* @param file file文件
* @return 路径名称
*/
String upLoadFile(@RequestParam("file") MultipartFile file);
/**
* 接收前端的流程文件
* @param flowsInfoVo
*/
void flowXml(@RequestBody FlowsInfoVo flowsInfoVo) throws XMLStreamException, IOException;
/**
* 创建流程
* @param flowsInfo
* @return 主键id
*/
Integer createFlow(@RequestBody FlowsInfo flowsInfo);
// /**
// * 部署xml流程文件
// * @param flowsInfo
// * @throws FileNotFoundException
// */
// void deployXml(FlowsInfo flowsInfo) throws FileNotFoundException;
/**
* 部署xml流程文件
* @param id
* @throws FileNotFoundException
*/
void deployXml(Integer id) throws FileNotFoundException;
/**
* 存储变量池 选择变量条件
* @param map
* @return map
*/
Map<String,Object> setVariables(@RequestBody Map<String, Object> map);
/**
* 开启流程
* @param startFlowVo 流程开启vo
*/
void startFlow(@RequestBody StartFlowVo startFlowVo);
/**
* 根据用户id进行任务待办查询
* @param nextTaskVo
* @return 任务列表
*/
List<Map<String,Object>> findTaskByUserId(NextTaskVo nextTaskVo);
/**
* 查看具体的任务详情
// * @param detailTaskVo 任务详情
* @return 任务列表
*/
// Map<String,Object> findTaskDetail(DetailTaskVo detailTaskVo);
/**
* 查看具体的任务详情
* @param taskId 任务id
* @return 任务列表
*/
Map<String,Object> findTaskDetail(String taskId);
/**
* 任务完成
* @param taskVo taskVo
*/
void completeTask(@RequestBody TaskVo taskVo);
/**
* 任务的拾取 相当变成了任务的执行人 只有执行人才可以完成任务
* @param taskId 任务Id
*/
void claimTask(String taskId);
//历史查询
/**
* 任务的转交
* @param transferTask
*/
void transferTask(TransferTask transferTask);
/**
* 是否挂起
* @param id 流程id
*/
void suspendOrActivateProcessDefinitionByKey(Integer id);
/**
* 删除流程
* @param id 流程id
*/
void deleteFlow(Integer id);
/**
* 流程的进度
* @param httpServletResponse
* @param processId 流程实例id
*/
void flowProgress (HttpServletResponse httpServletResponse, String processId) throws IOException;
/**
* 查已办任务
* @return 任务已办列表
*/
List<Object> findHistoryTask();
/**
* 获取当前任务节点ID
* @param taskId
* @return
*/
String getCurrentNodeId(String taskId);
/**
* 获取procID
* @param taskId
* @return
*/
String getCurrentProcId(String taskId);
List<HistoricProcessInstance> findStartByUser(String userId);
}
package com.tykj.workflowcore.workflow_editer.service.impl;
import com.tykj.workflowcore.workflow_editer.dao.DataHistoryMapper;
import com.tykj.workflowcore.workflow_editer.entity.DataHistory;
import com.tykj.workflowcore.workflow_editer.service.DataHistoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* ClassName: DataHistoryServiceImpl
* Package: com.tykj.workflowcore.workflow_editer.service.impl
* Description:
* Datetime: 2021/4/16 15:27
*
* @Author: zsp
*/
@Service
public class DataHistoryServiceImpl implements DataHistoryService {
@Autowired
private DataHistoryMapper dataHistoryMapper;
@Override
public DataHistory saveData(DataHistory dataHistory) {
return dataHistoryMapper.save(dataHistory);
}
// @Override
// public DataHistory findByTaskId(String taskId) {
// return dataHistoryMapper.findByTaskId(taskId);
// }
}
package com.tykj.workflowcore.workflow_editer.service.impl;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowRole;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowRoleType;
import com.tykj.workflowcore.workflow_editer.entity.WorkFlowUser;
import com.tykj.workflowcore.workflow_editer.service.UserService;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author HuangXiahao
* @version V1.0
* @class DefaultUserSerbiveImpl
* @packageName com.tykj.workflowcore.workflow_editer.service.impl
**/
@Service
@Order
public class DefaultUserServiceImpl implements UserService {
@Override
public WorkFlowUser getCurrentUser() {
WorkFlowUser workFlowUser = new WorkFlowUser();
workFlowUser.setId("0");
workFlowUser.setUserName("张0");
return workFlowUser;
}
@Override
public List<WorkFlowUser> getAllUser() {
List<WorkFlowUser> workFlowUsers = new ArrayList<>();
for (int i = 0; i < 10; i++) {
WorkFlowUser workFlowUser = new WorkFlowUser();
workFlowUser.setUserName("张"+i);
workFlowUser.setId("i"+i);
workFlowUsers.add(workFlowUser);
}
return workFlowUsers;
}
@Override
public List<WorkFlowRole> getAllRole(String roleType) {
List<WorkFlowRole> workFlowUsers = new ArrayList<>();
if (roleType.equals("department")){
workFlowUsers.add(new WorkFlowRole("开发部","department","1"));
workFlowUsers.add(new WorkFlowRole("运营部","department","2"));
workFlowUsers.add(new WorkFlowRole("测试部","department","3"));
}else {
workFlowUsers.add(new WorkFlowRole("管理员","role","1"));
workFlowUsers.add(new WorkFlowRole("普通用户","role","2"));
workFlowUsers.add(new WorkFlowRole("运维人员","role","3"));
}
return workFlowUsers;
}
@Override
public List<WorkFlowRoleType> getRoleType() {
List<WorkFlowRoleType> workFlowRoleTypes = new ArrayList<>();
workFlowRoleTypes.add(new WorkFlowRoleType("部门","department"));
workFlowRoleTypes.add(new WorkFlowRoleType("角色","role"));
return workFlowRoleTypes;
}
}
package com.tykj.workflowcore.workflow_editer.service.impl;
import com.github.wenhao.jpa.PredicateBuilder;
import com.github.wenhao.jpa.Specifications;
import com.tykj.workflowcore.base.result.ApiException;
import com.tykj.workflowcore.workflow_editer.dao.FlowsInfoMapper;
import com.tykj.workflowcore.workflow_editer.entity.FlowsInfo;
import com.tykj.workflowcore.workflow_editer.entity.vo.FlowsInfoVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.SearchAllFlowInfoVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.SearchFlowInfoVo;
import com.tykj.workflowcore.workflow_editer.service.FlowInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Optional;
/**
* ClassName: FlowInfoServiceImpl
* Package: com.tykj.service
* Description:
* Datetime: 2021/2/24 10:15
*
* @Author: zsp
*/
@Service
public class FlowInfoServiceImpl implements FlowInfoService {
@Autowired
private FlowsInfoMapper flowsInfoMapper;
@Override
public FlowsInfo findById(Integer id) {
return flowsInfoMapper.findById(id).get();
}
@Override
public FlowsInfo findByFlowName(@RequestBody FlowsInfoVo flowsInfoVo) {
String flowKey = flowsInfoVo.getFlowKey();
String flowName = flowsInfoVo.getFlowName();
FlowsInfo flowsInfo = flowsInfoMapper.findByFlowKey(flowKey);
flowsInfo.setFlowName(flowName);
//进行更新
FlowsInfo newFlowsInfo = flowsInfoMapper.save(flowsInfo);
return newFlowsInfo;
}
@Override
public FlowsInfo findByDesc(@RequestBody FlowsInfoVo flowsInfoVo) {
String flowKey = flowsInfoVo.getFlowKey();
String describe = flowsInfoVo.getFlowDescribe();
FlowsInfo byDesc = flowsInfoMapper.findByFlowKey(flowKey);
byDesc.setFlowDescribe(describe);
// //进行更新
return flowsInfoMapper.save(byDesc);
}
@Override
public FlowsInfo findByDeployId(String deployId) {
return flowsInfoMapper.findByDeployId(deployId);
}
@Override
public FlowsInfo findByFlowKey(String flowKey) {
return flowsInfoMapper.findByFlowKey(flowKey);
}
@Override
public FlowsInfo disableFlow(Integer flowInfoId) {
Optional<FlowsInfo> byId = flowsInfoMapper.findById(flowInfoId);
if (byId.isPresent()){
FlowsInfo flowsInfo = byId.get();
flowsInfo.setState(1);
flowsInfoMapper.save(flowsInfo);
}else {
throw new ApiException("要禁用的流程不存在");
}
return null;
}
@Override
public Page<FlowsInfo> searchAllFlowInfo(SearchAllFlowInfoVo searchAllFlowInfoVo) {
PredicateBuilder<FlowsInfo> and = Specifications.and();
and.eq(searchAllFlowInfoVo.getState()!=null,"state",searchAllFlowInfoVo.getState());
and.eq(searchAllFlowInfoVo.getFlowKey()!=null,"flowKey",searchAllFlowInfoVo.getFlowKey());
and.like(searchAllFlowInfoVo.getFlowName()!=null,"flowName","%"+searchAllFlowInfoVo.getFlowName()+"%");
return flowsInfoMapper.findAll(and.build(), searchAllFlowInfoVo.getPageable());
}
@Override
public Page<FlowsInfo> searchFlowInfo(SearchFlowInfoVo searchFlowInfoVo) {
PredicateBuilder<FlowsInfo> and = Specifications.and();
and.eq(searchFlowInfoVo.getState()!=null,"state",searchFlowInfoVo.getState());
and.eq(searchFlowInfoVo.getFlowKey()!=null,"flowKey",searchFlowInfoVo.getFlowKey());
and.like(searchFlowInfoVo.getFlowName()!=null,"flowName","%"+searchFlowInfoVo.getFlowName()+"%");
return flowsInfoMapper.findAll(and.build(), searchFlowInfoVo.getPageable());
}
@Override
public FlowsInfo editFlow(Integer id) {
return flowsInfoMapper.findById(id).get();
}
}
package com.tykj.workflowcore.workflow_editer.service.impl;
import com.github.wenhao.jpa.PredicateBuilder;
import com.github.wenhao.jpa.Specifications;
import com.tykj.workflowcore.model.entity.TableInfo;
import com.tykj.workflowcore.workflow_editer.dao.FormPageMapper;
import com.tykj.workflowcore.workflow_editer.entity.FormPage;
import com.tykj.workflowcore.workflow_editer.entity.vo.FormPageVo;
import com.tykj.workflowcore.workflow_editer.entity.vo.PageFormPageVo;
import com.tykj.workflowcore.workflow_editer.service.FormPageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.*;
/**
* ClassName: PageEntityServiceImpl
* Package: com.tykj.service.impl
* Description:
* Datetime: 2021/3/3 13:16
*
* @Author: zsp
*/
@Service
public class FormPageServiceImpl implements FormPageService {
@Autowired
private FormPageMapper formPageMapper;
@Override
public Integer savePage(@RequestBody FormPageVo inFormPageVo) {
inFormPageVo.setCreateTime(new Date());
FormPage formPage = inFormPageVo.toEntity();
formPage.setPageIdentification(UUID.randomUUID().toString());
FormPage formPage1 = formPageMapper.save(formPage);
Integer id = formPage1.getId();
return id;
}
@Override
public void update(FormPage formPage) {
formPageMapper.save(formPage);
}
@Override
public FormPage getPage(Integer id) {
FormPage formPage = formPageMapper.findById(id).get();
return formPage;
}
@Override
public List<FormPage> getPageNewByProcessKey(String processKey) {
//构建查询Vo
return formPageMapper.findNewFromPageByProcessKey(processKey);
}
@Override
public List<FormPage> getPageNewByPageIdentification(String pageIdentification) {
return null;
}
@Override
public void deletePage(Integer id) {
FormPage formPage = formPageMapper.findById(id).get();
formPageMapper.delete(formPage);
}
@Override
public Page<FormPage> getAllPages(PageFormPageVo pageFormPageVo) {
PredicateBuilder<FormPage> and = Specifications.and();
and.eq(pageFormPageVo.getPageName()!=null,"pageName",pageFormPageVo.getPageName());
and.eq(pageFormPageVo.getPageDesc()!=null,"pageDesc",pageFormPageVo.getPageDesc());
and.eq(pageFormPageVo.getCreateTime()!=null,"createTime",pageFormPageVo.getCreateTime());
and.eq(pageFormPageVo.getCreateTime()!=null,"processKey",pageFormPageVo.getProcessKey());
and.eq(pageFormPageVo.getCreateTime()!=null,"version",pageFormPageVo.getVersion());
and.eq(pageFormPageVo.getCreateTime()!=null,"pageIdentification",pageFormPageVo.getPageIdentification());
Page<FormPage> formPagePage = formPageMapper.findAll(and.build(), pageFormPageVo.getPageable());
return formPagePage;
}
}
package com.tykj.workflowcore.workflow_editer.service.impl;
import com.tykj.workflowcore.workflow_editer.dao.NodePageMapper;
import com.tykj.workflowcore.workflow_editer.entity.NodeInfo;
import com.tykj.workflowcore.workflow_editer.service.NodeInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* ClassName: NodePageServiceImpl
* Package: com.tykj.service.impl
* Description:
* Datetime: 2021/3/4 15:34
*
* @Author: zsp
*/
@Service
public class NodeInfoServiceImpl implements NodeInfoService {
@Autowired
private NodePageMapper nodePageMapper;
@Override
public Integer findByNodeId(String nodeId) {
return nodePageMapper.findByNodeId(nodeId);
}
@Override
public void saveNodePage(NodeInfo nodeInfo) {
nodePageMapper.save(nodeInfo);
}
@Override
public void saveNodeInfoList(List<NodeInfo> nodeInfos) {
if (nodeInfos!=null){
nodePageMapper.saveAll(nodeInfos);
}
}
}
package com.tykj.workflowcore.workflow_editer.util;
import org.springframework.util.StringUtils;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* ClassName: MapUtils
* Package: com.tykj.workflowcore.workflow_editer.util
* Description:
* Datetime: 2021/3/30 16:15
*
* @Author: zsp
*/
public class MapUtils {
public static void main(String[] args) {
ConcurrentHashMap concurrentHashMap1 = new ConcurrentHashMap();
ConcurrentHashMap concurrentHashMap2 = new ConcurrentHashMap();
LinkedHashMap linkedHashMapa = new LinkedHashMap();
LinkedHashMap linkedHashMapb = new LinkedHashMap();
linkedHashMapa.put("b","a");
linkedHashMapb.put("c","a");
concurrentHashMap1.put("a",linkedHashMapa);
concurrentHashMap2.put("a",linkedHashMapb);
loopMap(concurrentHashMap1,"",concurrentHashMap2);
System.out.println("1");
}
public static void loopMap(Map m1, String p, Map m2) {
m1.forEach((key, value) -> {
Set mapKeySetByPath = getMapKeySetByPath(m2, p + "." + key);
System.out.println(p + "." + key);
System.out.println(mapKeySetByPath);
if (mapKeySetByPath!=null){
mapKeySetByPath.forEach( (keyStr)->{
if (!m1.containsKey(keyStr)){
m1.put(keyStr,getMapByPath(m2,p + "." + keyStr));
}
});
}
if (value instanceof Map) {
//转为ConcurrentMap不然合并的时候回出错
if (!(value instanceof ConcurrentHashMap)){
ConcurrentHashMap concurrentHashMapValue = new ConcurrentHashMap();
concurrentHashMapValue.putAll((Map) value);
value = concurrentHashMapValue;
m1.put(key,value);
}
String path;
if (StringUtils.isEmpty(p)) {
path = (String) key;
} else {
path = p + "." + key;
}
loopMap((Map) value, path, m2);
} else {
if (!StringUtils.isEmpty(p)) {
String path = p + "." + key;
Object result = getMapByPath(m2, path);
if (result != null) {
m1.put(key, result);
}
}
}
});
}
public static Object getMapByPath(Map m2, String path) {
int point = path.indexOf(".");
if (point==0){
//第一层
Object r = m2.get(path.substring(1));
return r;
}
if (point == -1) {
//已经递归到最后一层了
Object r = m2.get(path);
return r;
}
String key = path.substring(0, point);
String last = path.substring(point + 1);
Object result = m2.get(key);
if (result == null) {
return null;
} else {
try {
return getMapByPath((Map) result, last);
} catch (Exception e) {
return null;
}
}
}
public static Set getMapKeySetByPath(Map m2, String path) {
int point = path.indexOf(".");
if (point <= 0) {
Set r = m2.keySet();
return r;
}
String key = path.substring(0, point);
String last = path.substring(point + 1);
Object result = m2.get(key);
if (result == null) {
return null;
} else {
try {
return getMapKeySetByPath((Map) result, last);
} catch (Exception e) {
return null;
}
}
}
}
package com.tykj.workflowcore.workflow_editer.util;
import com.tykj.workflowcore.base.util.SpringBeanService;
import com.tykj.workflowcore.workflow_editer.service.UserService;
import java.util.Map;
import java.util.Set;
/**
* @author HuangXiahao
* @version V1.0
* @class UserServiceBeanUtil
* @packageName com.tykj.workflowcore.workflow_editer.util
**/
public class UserServiceBeanUtil {
public static UserService getUserService(SpringBeanService springBeanService) {
Map<String, UserService> beansOfType = springBeanService.getApplicationContext().getBeansOfType(UserService.class);
Set<String> strings = beansOfType.keySet();
if (strings.size()>1){
for (String key : strings) {
if (!key.equals("defaultUserServiceImpl")){
return beansOfType.get(key);
}
}
}
return beansOfType.get("defaultUserServiceImpl");
}
}
package com.tykj.workflowcore.workflow_editer.validate;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.validation.ValidationError;
import org.flowable.validation.validator.ProcessLevelValidator;
import java.util.List;
/**
* ClassName: UserTaskValidator
* Package: com.example.config
* Description:
* Datetime: 2021/3/26 13:49
*
* @Author: zsp
*/
public class FlowEventValidator extends ProcessLevelValidator {
@Override
protected void executeValidation(BpmnModel bpmnModel, Process process, List<ValidationError> errors) {
//判断用户节点
List<UserTask> userTaskList = process.findFlowElementsOfType(UserTask.class);
//判断结束节点
List<EndEvent> endEvents = process.findFlowElementsOfType(EndEvent.class);
//判断开始节点
List<StartEvent> startEvents = process.findFlowElementsOfType(StartEvent.class);
if (userTaskList.size() > 0) {
for (UserTask userTask : userTaskList) {
if (userTask.getName() == null || userTask.getName().equals("")) {
errors.add(createValidationErrorProblem("用户名称为空,请填写"));
}
List<SequenceFlow> incomingFlows = userTask.getIncomingFlows();
if (incomingFlows.size() == 0 || incomingFlows.equals("")) {
errors.add(createValidationErrorProblem("缺少连接用户任务的输入流"));
}
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
if (outgoingFlows.size() == 0 || outgoingFlows.equals("")) {
errors.add(createValidationErrorProblem("缺少连接用户任务的输出流"));
}
List<String> candidateUsers = userTask.getCandidateUsers();
List<String> candidateGroups = userTask.getCandidateGroups();
if ((candidateUsers.size() == 0 || candidateUsers.equals("")) && (candidateGroups.size() == 0 || candidateGroups.equals(""))) {
errors.add(createValidationErrorProblem("用户节点未设置用户或者未设置用户组"));
}
if (userTask.getFormKey() == null){
errors.add(createValidationErrorProblem("用户节点未设置表单"));
}
}
}
if (startEvents!=null&&startEvents.size()<=0){
errors.add(createValidationErrorProblem("开始节点不存在"));
}else {
for (StartEvent startEvent : startEvents) {
List<SequenceFlow> outgoingFlows = startEvent.getOutgoingFlows();
if (outgoingFlows.size() == 0 || outgoingFlows.equals("")){
errors.add(createValidationErrorProblem("开始节点未连接"));
}
if (startEvent.getFormKey() == null){
errors.add(createValidationErrorProblem("开始节点未设置表单"));
}
}
}
if (endEvents!=null&&endEvents.size()<=0){
errors.add(createValidationErrorProblem("结束节点不存在"));
}else {
for (EndEvent endEvent : endEvents) {
List<SequenceFlow> incomingFlows = endEvent.getIncomingFlows();
if (incomingFlows.size() == 0 || incomingFlows.equals("")){
errors.add(createValidationErrorProblem("结束节点未连接"));
}
}
}
//判断网关
List<ExclusiveGateway> exclusiveGateways = process.findFlowElementsOfType(ExclusiveGateway.class);
for (ExclusiveGateway exclusiveGateway : exclusiveGateways) {
//输出流
List<SequenceFlow> outgoingFlows = exclusiveGateway.getOutgoingFlows();
if (outgoingFlows.size() == 0 || outgoingFlows.equals("")){
errors.add(createValidationErrorProblem("缺少连接网关的输入流"));
}
//输入流
List<SequenceFlow> incomingFlows = exclusiveGateway.getIncomingFlows();
if (incomingFlows.size() == 0 || incomingFlows.equals("")){
errors.add(createValidationErrorProblem("缺少连接网关的输出流"));
}
}
}
public ValidationError createValidationErrorProblem(String message){
ValidationError validationError = new ValidationError();
validationError.setProblem(message);
validationError.setWarning(true);
return validationError;
}
}
\ No newline at end of file
package com.tykj.workflowcore.workflow_editer.validate;
import org.flowable.validation.ProcessValidator;
import org.flowable.validation.ProcessValidatorFactory;
import org.flowable.validation.validator.ValidatorSet;
import org.springframework.stereotype.Component;
/**
* ClassName: ProcessValidatorFactoryExt
* Package: com.example.config
* Description:
* Datetime: 2021/3/26 14:04
*
* @Author: zsp
*/
@Component
public class ProcessValidatorFactoryExt extends ProcessValidatorFactory {
@Override
public ProcessValidator createDefaultProcessValidator() {
ProcessValidator defaultProcessValidator = super.createDefaultProcessValidator();
//将自定义校验器添加进去
ValidatorSet validatorSet = new ValidatorSet("Validate BPMN");
validatorSet.addValidator(new FlowEventValidator());
defaultProcessValidator.getValidatorSets().add(validatorSet);
return defaultProcessValidator;
}
}
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
username: root
password: Huang123+
url: jdbc:mysql://47.106.142.73:3306/www2?useSSL=true&verifyServerCertificate=false&useUnicode=true&autoReconnect=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
read-only: false
connection-timeout: 60000
idle-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
maximum-pool-size: 60
minimum-idle: 10
jpa:
show-sql: true
hibernate:
naming:
physical-strategy: com.tykj.workflow2.base.config.ToUpperCase
ddl-auto: update
database-platform: org.hibernate.dialect.MySQL8Dialect
server:
port: 8088
\ No newline at end of file
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
username: PUNISH
password: 123456
url: jdbc:oscar://192.168.102.200:2003/OSRDB
driver-class-name: com.oscar.Driver
hikari:
read-only: false
connection-timeout: 60000
idle-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
maximum-pool-size: 60
minimum-idle: 10
jpa:
show-sql: true
hibernate:
ddl-auto: update
database-platform: org.hibernate.dialect.OscarDialect
server:
port: 8088
\ No newline at end of file
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/workflow?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf-8&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
profiles:
active: mysql
jpa:
show-sql: true
hibernate:
ddl-auto: update
server:
port: 8800
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论