diff --git a/README.md b/README.md new file mode 100644 index 0000000..5e77bc2 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# 基础包依赖及框架配置 + +#### 介绍 +基础包,对工具类及框架代码进行封装 + +#### 功能 +1. 封装Shiro权限部分,通过接口继承即可 +2. 对SwaggerUI部分封装,可通过yml文件进行配置 +3. 对Druid连接池部分进行封装,可通过yml文件进行配置 +4. 提供封装VO返回结果 +5. 提供PageHelper方法封装 +6. 将pageNum,pageSize,order,sort封装成对象,并提供是否包含排序校验,提供sql拼装校验 +7. 异常统一封装 +8. 通用mapper封装 +9. 接口参数日志封装,可通过yml文件进行配置 +10. redis工具类封装,可通过yml文件进行配置 +11. Spring上下文工具类封装 +12. 加密工具类封装 +13. 日期工具类封装 + + +#### 安装教程 + +1. git拉去目录 + +2. 发布达梦数据库驱动包 +```bash +mvn install:install-file -Dfile=lib/Dm7JdbcDriver18.jar -DgroupId=com.dm -DartifactId=Dm7JdbcDriver -Dversion=1.8 -Dpackaging=jar +``` +3. 发布oracle数据库驱动包 +```bash +mvn install:install-file -Dfile=lib/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar +``` +4. 刷新maven依赖 +5. 进入基础包目录 +```bash +cd hcframe-parent/hcframe-base/ +``` +6. 执行``mvn install`` +7. 刷新其他项目maven依赖 +8. 进入starter目录 +```bash +cd ../hcframe-starter +``` +9. 执行 ``mvn install`` +10. 刷新maven依赖 diff --git a/hcframe-parent/hcframe-activiti/pom.xml b/hcframe-parent/hcframe-activiti/pom.xml new file mode 100644 index 0000000..838410f --- /dev/null +++ b/hcframe-parent/hcframe-activiti/pom.xml @@ -0,0 +1,35 @@ + + + + parent + com.hcframe + 1.0-SNAPSHOT + + 4.0.0 + + hcframe-activiti + + + 8 + 8 + + + + com.hcframe + hcframe-starter + 1.0-SNAPSHOT + + + com.hcframe + hcframe-base + 1.2.1-SNAPSHOT + + + org.activiti + activiti-spring-boot-starter + 7.1.0.M1 + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/ActivitiApplication.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/ActivitiApplication.java new file mode 100644 index 0000000..f260a0c --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/ActivitiApplication.java @@ -0,0 +1,26 @@ +package com.hcframe.activiti; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +@EnableAspectJAutoProxy(proxyTargetClass = true) +@EnableSwagger2 +@ServletComponentScan +@EnableCaching +//@EnableDiscoveryClient +//@EnableFeignClients +@ComponentScan(basePackages = {"com.hcframe.**"}) +public class ActivitiApplication { + + public static void main(String[] args) { + SpringApplication.run(ActivitiApplication.class, args); + } + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/ServletInitializer.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/ServletInitializer.java new file mode 100644 index 0000000..780ba7c --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.hcframe.activiti; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ActivitiApplication.class); + } + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/ActivitiUtils.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/ActivitiUtils.java new file mode 100644 index 0000000..66af3cb --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/ActivitiUtils.java @@ -0,0 +1,514 @@ +package com.hcframe.activiti.activiti; + +import com.hcframe.base.common.ResultPageInfo; +import com.hcframe.base.common.ServiceException; +import com.hcframe.base.common.WebPageInfo; +import com.hcframe.base.common.utils.EmptyCheckUtils; +import org.activiti.engine.*; +import org.activiti.engine.impl.ProcessInstanceQueryProperty; +import org.activiti.engine.impl.TaskQueryProperty; +import org.activiti.engine.impl.persistence.entity.ExecutionEntity; +import org.activiti.engine.repository.Deployment; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.repository.ProcessDefinitionQuery; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.activiti.engine.task.TaskQuery; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + + +/** + * @author lhc + * @date 2020-07-06 + * @description activiti工具类 + */ +@Component +public class ActivitiUtils { + + private final static Logger logger = LoggerFactory.getLogger(ActivitiUtils.class); + + @Resource + RuntimeService runtimeService; + + @Resource + private RepositoryService repositoryService; + + @Resource + private TaskService taskService; + + @Resource + private HistoryService historyService; + + @Resource + private ManagementService managementService; + + + /** + * 发布流程classpath + * + * @param name 流程名称 + * @param classpath 流程文件地址,在项目classpath路径下的相对路径地址 + * @return 流程信息 + */ + public Deployment deployProcessFormClasspath(String name, String classpath) { + EmptyCheckUtils.checkWithException(name, "name不能为空!"); + EmptyCheckUtils.checkWithException(classpath, "classpath不能为空"); + try { + Deployment deployment = repositoryService.createDeployment() + .addClasspathResource(classpath) + .name(name) + .deploy(); + logger.info("流程ID:" + deployment.getId()); + logger.info("流程名称:" + deployment.getName()); + return deployment; + } catch (Exception e) { + logger.error("流程发布失败", e); + throw new ServiceException("流程发布失败!"); + } + } + + /** + * 发布流程基于InputStream + * + * @param name 流程名称 + * @param is 输入流 + * @return 流程信息 + */ + public Deployment deployProcessFormInputStream(String name, InputStream is, String fileName) { + EmptyCheckUtils.checkWithException(name, "name不能为空!"); + EmptyCheckUtils.checkWithException(fileName, "fileName不能为空!"); + try { + Deployment deployment = repositoryService.createDeployment() + .addInputStream(fileName, is) + .name(name) + .deploy(); + logger.info("流程ID:" + deployment.getId()); + logger.info("流程名称:" + deployment.getName()); + return deployment; + } catch (Exception e) { + logger.error("流程发布失败", e); + throw new ServiceException("流程发布失败!"); + } + } + + /** + * 删除一个process实例 + * + * @param id processId + * @param flag 是否连级删除所有信息 + * @return + */ + public boolean deleteDeploymenet(String id, boolean flag) { + EmptyCheckUtils.checkWithException(id, "id不能为空!"); + try { + repositoryService.deleteDeployment(id, flag); + return true; + } catch (Exception e) { + logger.error("删除失败", e); + throw new ServiceException("删除失败"); + } + } + + /** + * 获取流程列表 + * + * @param commonProcessDefinition 查询参数,可查询内容包括name,key,version + * @param webPageInfo 分页及排序参数 + * @param isLatestVersion 是否只显示最新版本 + * @return 返回结果列表 + */ + public ResultPageInfo getDeployProcessList(CommonProcessDefinition commonProcessDefinition, + WebPageInfo webPageInfo, Boolean isLatestVersion) { + ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); + if (WebPageInfo.hasSort(webPageInfo)) { + ProcessInstanceQueryProperty queryProperty = new ProcessInstanceQueryProperty(webPageInfo.getSortField()); + query = query.orderBy(queryProperty); + if (webPageInfo.getOrder().equals(WebPageInfo.ASC)) { + query = query.asc(); + } else { + query = query.desc(); + } + } + if (StringUtils.isNotEmpty(commonProcessDefinition.getName())) { + query = query.processDefinitionNameLike("%" + commonProcessDefinition.getName() + "%"); + } + if (StringUtils.isNotEmpty(commonProcessDefinition.getKey())) { + query = query.processDefinitionNameLike("%" + commonProcessDefinition.getKey() + "%"); + } + if (!org.springframework.util.StringUtils.isEmpty(commonProcessDefinition.getVersion())) { + query = query.processDefinitionVersion(commonProcessDefinition.getVersion()); + } + if (isLatestVersion) { + query = query.latestVersion(); + } + long total = query.count(); + List list = query.listPage((webPageInfo.getPageNum() - 1) * webPageInfo.getPageSize(), webPageInfo.getPageSize()); + List resultList = new LinkedList<>(); + for (ProcessDefinition processDefinition : list) { + CommonProcessDefinition commonProcessDefinition1 = new CommonProcessDefinition(); + BeanUtils.copyProperties(processDefinition, commonProcessDefinition1); + resultList.add(commonProcessDefinition1); + } + ResultPageInfo resultPageInfo = new ResultPageInfo<>(); + resultPageInfo.setList(resultList); + resultPageInfo.setTotal(total); + return resultPageInfo; + } + + /** + * 获取单个发布流程实例 + * + * @param deploymentId 发布实例 + * @return 返回单个实例结果 + */ + public CommonProcessDefinition getSingleProcessById(String deploymentId) { + EmptyCheckUtils.checkWithException(deploymentId, "deploymentId不能为空!"); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); + CommonProcessDefinition commonProcessDefinition = new CommonProcessDefinition(); + BeanUtils.copyProperties(processDefinition, commonProcessDefinition); + return commonProcessDefinition; + } + + /** + * 通过Key开始一个流程 + * + * @param key 流程key + * @param map 流程变量 + * @return 流程实例 + */ + public Map startProcessInstanceByKey(String key, Map map) { + EmptyCheckUtils.checkWithException(key, "key不能为空!"); + try { + ProcessInstance instance; + if (map == null || map.isEmpty()) { + instance = runtimeService.startProcessInstanceByKey(key); + } else { + instance = runtimeService.startProcessInstanceByKey(key, map); + } + logger.info("流程实例ID:" + instance.getId()); + logger.info("流程定义ID:" + instance.getProcessDefinitionId()); + logger.info("流程发布ID:" + instance.getDeploymentId()); + Map resultMap = new HashMap<>(); + resultMap.put("id", instance.getId()); + resultMap.put("processDefinitionId", instance.getProcessDefinitionId()); + return resultMap; + } catch (Exception e) { + logger.error("流程开始失败:", e); + throw new ServiceException("流程开始失败!"); + } + } + + + /** + * 通过Id开始一个流程 + * + * @param id 流程Id + * @param map 流程变量 + * @return 流程实例 + */ + public Map startProcessInstanceById(String id, Map map) { + EmptyCheckUtils.checkWithException(id, "id不能为空!"); + try { + ProcessInstance instance; + if (map == null || map.isEmpty()) { + instance = runtimeService.startProcessInstanceById(id); + } else { + instance = runtimeService.startProcessInstanceByKey(id, map); + } + + logger.info("流程实例ID:" + instance.getId()); + logger.info("流程定义ID:" + instance.getProcessDefinitionId()); + Map resultMap = new HashMap<>(); + resultMap.put("id", instance.getId()); + resultMap.put("deploymentId", instance.getDeploymentId()); + resultMap.put("processDefinitionId", instance.getProcessDefinitionId()); + return resultMap; + } catch (Exception e) { + logger.error("流程开始失败:", e); + throw new ServiceException("流程开始失败!"); + } + } + + /** + * 执行任务 + * + * @param taskId 任务Id + * @return 是否成功 + */ + public boolean completeTask(String taskId) { + EmptyCheckUtils.checkWithException(taskId, "taskId不能为空!"); + try { + taskService.complete(taskId); + logger.info("完成任务:任务ID:" + taskId); + return true; + } catch (Exception e) { + logger.error("任务执行失败", e); + throw new ServiceException("任务执行失败!"); + } + } + + /** + * 获取任务列表 + * + * @param commonTask + * @param webPageInfo + * @param map + * @return + */ + public ResultPageInfo getTaskList(CommonTask commonTask, WebPageInfo webPageInfo, Map map) { + TaskQuery taskQuery = taskService.createTaskQuery(); + if (WebPageInfo.hasSort(webPageInfo)) { + TaskQueryProperty queryProperty = new TaskQueryProperty(webPageInfo.getSortField()); + taskQuery = taskQuery.orderBy(queryProperty); + if (webPageInfo.getOrder().equals(WebPageInfo.ASC)) { + taskQuery = taskQuery.asc(); + } else { + taskQuery = taskQuery.desc(); + } + } + if (StringUtils.isNotEmpty(commonTask.getAssignee())) { + taskQuery = taskQuery.taskAssignee(commonTask.getAssignee()); + } + if (StringUtils.isNotEmpty(commonTask.getId())) { + taskQuery = taskQuery.taskId(commonTask.getId()); + } + if (StringUtils.isNotEmpty(commonTask.getName())) { + taskQuery = taskQuery.taskName(commonTask.getName()); + } + if (StringUtils.isNotEmpty(commonTask.getTaskDefinitionKey())) { + taskQuery = taskQuery.taskDefinitionKey(commonTask.getTaskDefinitionKey()); + } + if (StringUtils.isNotEmpty(commonTask.getCategory())) { + taskQuery = taskQuery.taskCategory(commonTask.getCategory()); + } + if (StringUtils.isNotEmpty(commonTask.getDescription())) { + taskQuery = taskQuery.taskCategory(commonTask.getCategory()); + } + if (StringUtils.isNotEmpty(commonTask.getExecutionId())) { + taskQuery = taskQuery.taskCategory(commonTask.getExecutionId()); + } + if (map != null && !map.isEmpty()) { + taskQuery = taskQuery.taskVariableValueEquals(map); + } + if (StringUtils.isNotEmpty(commonTask.getOwner())) { + taskQuery = taskQuery.taskOwner(commonTask.getOwner()); + } + if (StringUtils.isNotEmpty(commonTask.getParentTaskId())) { + taskQuery = taskQuery.taskParentTaskId(commonTask.getParentTaskId()); + } + long total = taskQuery.count(); + List taskList = taskQuery.listPage((webPageInfo.getPageNum() - 1) * webPageInfo.getPageSize(), webPageInfo.getPageSize()); + List list = new LinkedList<>(); + for (Task task : taskList) { + CommonTask resultTask = new CommonTask(); + BeanUtils.copyProperties(task, resultTask); + String tableName= (String) taskService.getVariable(task.getId(),"tableName" ); + resultTask.setTableName(tableName); + list.add(resultTask); + } + ResultPageInfo resultPageInfo = new ResultPageInfo<>(); + resultPageInfo.setTotal(total); + resultPageInfo.setList(list); + return resultPageInfo; + } + + /** + * Description: 任务认领(加锁) + * + * @param taskId + * @param userId + */ + public synchronized boolean claimTask(String taskId, String userId) { + EmptyCheckUtils.checkWithException(taskId, "taskId不能为空!"); + EmptyCheckUtils.checkWithException(userId, "userId不能为空!"); + try { + taskService.claim(taskId, userId); + return true; + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new ServiceException("任务不能加锁(taskId:" + taskId + ")"); + } + } + + /** + * Description: 任务解锁 + * + * @param taskId 任务Id + */ + public synchronized boolean unClaimTask(String taskId) { + EmptyCheckUtils.checkWithException(taskId, "taskId不能为空!"); + try { + taskService.claim(taskId, null); + return true; + } catch (Exception e) { + throw new ServiceException("任务解锁失败,任务Id:" + taskId); + } + } + + /** + * 完成任务 + * + * @return + */ + public boolean completeTask(String taskId, Map map) { + EmptyCheckUtils.checkWithException(taskId, "taskId不能为空!"); + try { + if (map == null || map.isEmpty()) { + taskService.complete(taskId); + } else { + taskService.complete(taskId, map); + } + return true; + } catch (Exception e) { + throw new ServiceException("任务提交失败"); + } + } + + /** + * 设置候选人(可设置多个) + * + * @param taskId + * @param userIds + */ + public boolean addCandidateUser(String taskId, String userIds) { + EmptyCheckUtils.checkWithException(taskId, "taskId不能为空!"); + EmptyCheckUtils.checkWithException(userIds, "userIds不能为空!"); + try { + taskService.addCandidateUser(taskId, userIds); + return true; + } catch (Exception e) { + throw new ServiceException("设置候选人失败"); + } + } + + /** + * 更新候选人 + * + * @param taskId + * @param userIds + * @return + */ + public boolean updateCandidateUser(String taskId, String userIds) { + EmptyCheckUtils.checkWithException(taskId, "taskId不能为空!"); + EmptyCheckUtils.checkWithException(userIds, "userIds不能为空!"); + try { + taskService.addCandidateUser(taskId, null); + taskService.addCandidateUser(taskId, userIds); + return true; + } catch (Exception e) { + throw new ServiceException("更新候选人失败"); + } + } + + /** + * 校验名称是否唯一 + * + * @param name name + * @return + */ + public boolean uniqueName(String name) { + List list = repositoryService.createProcessDefinitionQuery().processDefinitionName(name).list(); + return list == null || list.size() == 0; + } + + /** + * 校验key是否唯一 + * + * @param key + * @return + */ + public boolean uniqueKey(String key) { + List list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(key).list(); + return list == null || list.size() == 0; + } + + /** + * 删除未完成实例 + * @param id id主键 + * @param reason 删除原因 + * @param flag 是否删除历史记录 + * @return + */ + public boolean deleteProcessInstance(String id, String reason, boolean flag){ + try { + runtimeService.deleteProcessInstance(id,reason); + if (flag) { + historyService.deleteHistoricProcessInstance(id); + } + return true; + } catch (Exception e) { + logger.error("删除流程失败",e); + throw new ServiceException("删除流程失败",e); + } + } + + public void rollBackToAssignWoekFlow(String processInstanceId, String destTaskkey) { +// // 取得当前任务.当前任务节点 +// destTaskkey ="usertask2"; +// HistoricTaskInstance currTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult(); +// Map variables; + ExecutionEntity entity = (ExecutionEntity) runtimeService.createExecutionQuery().executionId(processInstanceId).singleResult(); +// ProcessDefinitionEntity definition = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService) +// .getDeployedProcessDefinition(entity.getProcessDefinitionId()); +// variables = entity.getProcessVariables(); +// //当前活动环节 +// ActivityImpl currActivityImpl = definition.findActivity(entity.getActivityId()); +// //目标活动节点 +// ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition).findActivity(destTaskkey); +// if(currActivityImpl !=null){ +// //所有的出口集合 +// List pvmTransitions = currActivityImpl.getOutgoingTransitions(); +// List oriPvmTransitions = new ArrayList(); +// for(PvmTransition transition : pvmTransitions){ +// oriPvmTransitions.add(transition); +// } +// //清除所有出口 +// pvmTransitions.clear(); +// //建立新的出口 +// List transitionImpls = new ArrayList(); +// TransitionImpl tImpl = currActivityImpl.createOutgoingTransition(); +// tImpl.setDestination(nextActivityImpl); +// transitionImpls.add(tImpl); +// +// List list = taskService.createTaskQuery().processInstanceId(entity.getProcessInstanceId()) +// .taskDefinitionKey(entity.getActivityId()).list(); +// for(Task task:list){ +// taskService.complete(task.getId(), variables); +// historyService.deleteHistoricTaskInstance(task.getId()); +// } +// +// for(TransitionImpl transitionImpl:transitionImpls){ +// currActivityImpl.getOutgoingTransitions().remove(transitionImpl); +// } +// +// for(PvmTransition pvmTransition:oriPvmTransitions){ +// pvmTransitions.add(pvmTransition); +// } +// } + } + + /** + * 删除一个历史流程 + * @param instansId + * @return + */ + public boolean deleteProcessInstanceHistory(String instansId) { + try { + historyService.deleteHistoricProcessInstance(instansId); + return true; + } catch (Exception e) { + throw new ServiceException("删除流程历史记录失败!", e); + } + } +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/CommonProcessDefinition.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/CommonProcessDefinition.java new file mode 100644 index 0000000..ea07432 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/CommonProcessDefinition.java @@ -0,0 +1,60 @@ +package com.hcframe.activiti.activiti; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author lhc + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +@ApiModel("工具Process") +public class CommonProcessDefinition { + + public static String BPMN = "bpmn"; + + @ApiModelProperty(hidden = true) + private String id; + + @ApiModelProperty(hidden = true) + private String category; + + @ApiModelProperty( + value="流程Process名称" + ) + private String name; + + @ApiModelProperty( + value="流程Process的KEY" + ) + private String key; + + @ApiModelProperty(hidden = true) + private String description; + + @ApiModelProperty( + value="版本" + ) + private Integer version; + + @ApiModelProperty(hidden = true) + private String resourceName; + + @ApiModelProperty(hidden = true) + private String deploymentId; + + @ApiModelProperty(hidden = true) + private String diagramResourceName; + + @ApiModelProperty(hidden = true) + private String tenantId; + + @ApiModelProperty(hidden = true) + private String engineVersion; +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/CommonTask.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/CommonTask.java new file mode 100644 index 0000000..72d8898 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/activiti/CommonTask.java @@ -0,0 +1,79 @@ +package com.hcframe.activiti.activiti; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.Map; + +/** + * @author lhc + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +public class CommonTask { + + private String id; + + @ApiModelProperty( + value="流程名称" + ) + private String name; + + private String description; + + private Integer priority; + + private String owner; + + @ApiModelProperty( + value="流程人" + ) + private String assignee; + + private String processInstanceId; + + private String executionId; + + private String processDefinitionId; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + private String taskDefinitionKey; + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dueDate; + + private String category; + + private String parentTaskId; + + private String tenantId; + + private String formKey; + + private Map taskLocalVariables; + + private Map processVariables; + + private Date claimTime; + + @ApiModelProperty( + value="是否只显示未锁定条目", + allowableValues="true,false" + ) + private Boolean isUnAssignee = false; + + private String tableName; + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/common/ShiroRealmConfig.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/common/ShiroRealmConfig.java new file mode 100644 index 0000000..57b35b8 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/common/ShiroRealmConfig.java @@ -0,0 +1,77 @@ +package com.hcframe.activiti.common; + +import com.hcframe.base.module.auth.dao.FtUserDao; +import com.hcframe.base.module.shiro.service.ShiroType; +import com.hcframe.base.module.shiro.service.SystemRealm; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; + +/** + * @author lhc + * @date 2020-07-28 + * @decription shiro 配置类 + */ +@Component +public class ShiroRealmConfig implements SystemRealm { + + @Resource + FtUserDao ftUserDao; + + /** + * 根据用户信息注入权限 + * @param user 用户信息 + * @return 权限信息 + */ + @Override + public SimpleAuthorizationInfo setAuthoriztion(Object user) { + return new SimpleAuthorizationInfo(); + } + + /** + * 根据用户Id查询用户信息并注入到shiro框架中 + * @param userId 用户id + * @return 用户信息 + */ + @Override + public Object findByUserId(String userId) { + // TODO 需要实现获取用户信息方法 + return null; + } + + /** + * 配置拦截及放行路径 + * @return 返回拦截及放行路径Map + */ + @Override + public LinkedHashMap setShiroUrl() { + LinkedHashMap map = new LinkedHashMap<>(); + // 用户登陆 + map.put("/ftUser/login", ShiroType.ANON); + // Vue静态资源 + map.put("/img/**", ShiroType.ANON); + map.put("/static/**", ShiroType.ANON); + map.put("/tinymce/**", ShiroType.ANON); + map.put("/favicon.ico", ShiroType.ANON); + map.put("/manifest.json", ShiroType.ANON); + map.put("/robots.txt", ShiroType.ANON); + map.put("/precache*", ShiroType.ANON); + map.put("/service-worker.js", ShiroType.ANON); + // swagger UI 静态资源 + map.put("/swagger-ui.html", ShiroType.ANON); + map.put("/doc.html", ShiroType.ANON); + map.put("/swagger-resources/**", ShiroType.ANON); + map.put("/webjars/**", ShiroType.ANON); + map.put("/v2/api-docs", ShiroType.ANON); + map.put("/v2/api-docs-ext", ShiroType.ANON); + map.put("/swagger/**", ShiroType.ANON); + // druid 资源路径 + map.put("/druid/**", ShiroType.ANON); + // 其余路径均拦截 + map.put("/**", ShiroType.ANON); + return map; + } + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/controller/ProcessController.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/controller/ProcessController.java new file mode 100644 index 0000000..ce42de7 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/controller/ProcessController.java @@ -0,0 +1,102 @@ +package com.hcframe.activiti.controller; + +import com.hcframe.activiti.activiti.CommonProcessDefinition; +import com.hcframe.activiti.service.ProcessService; +import com.hcframe.base.common.ResultVO; +import com.hcframe.base.common.WebPageInfo; +import io.lettuce.core.dynamic.annotation.Param; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lhc + */ +@Api(tags = "activiti操作接口") +@RequestMapping("/process") +@RestController +public class ProcessController { + + @Resource + ProcessService processService; + + @ApiOperation(value = "获取工作流Process列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "isLatestVersion", value = "是否只显示最新版", allowableValues = "true,false", defaultValue = "false") + }) + @GetMapping("") + public ResultVO getProcessDefinitionList(CommonProcessDefinition processDefinition, WebPageInfo webPageInfo, + @RequestParam(defaultValue = "true") Boolean isLatestVersion) { + return processService.getProcessDefinitionList(processDefinition, webPageInfo, isLatestVersion); + } + + @ApiOperation(value = "删除工作流列表Process列表") + @DeleteMapping("/{id}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "state", value = "状态,为true则删除全部关联数据,为false则只删除Process", required = true), + @ApiImplicitParam(name = "id", value = "获取流程的deploymentId", required = true) + }) + public ResultVO deleteProcessDefinition(@PathVariable String id, boolean state) { + return processService.deleteProcessDefinitionList(id, state); + } + + @ApiOperation(value = "新增/更新Process,若为更新只需文件名和process名称保持一致即可") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "流程名称"), + @ApiImplicitParam(name = "file", value = "上传的文件") + }) + @PostMapping("") + public ResultVO addProcessDefinition(@Param("file") MultipartFile file, String name) { + return processService.addProccessDefinition(file, name); + } + + @ApiOperation(value = "新增Process,通过xml字符串方式更新") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "流程名称",required = true), + @ApiImplicitParam(name = "file", value = "上传的文件",required = true), + @ApiImplicitParam(name = "fileName", value = "文件名称需要有后缀.bpmn",required = true) + }) + @PostMapping("/byXml") + public ResultVO addProcessDefinitionByXMl(String file, String name,String fileName) { + return processService.addProccessDefinitionByXml(file, name,fileName); + } + + @ApiOperation(value = "修改Process,通过xml字符串方式更新") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "流程名称",required = true), + @ApiImplicitParam(name = "file", value = "上传的文件",required = true), + @ApiImplicitParam(name = "fileName", value = "文件名称需要有后缀.bpmn",required = true), + @ApiImplicitParam(name = "version", value = "当前版本(数字)",required = true) + }) + @PutMapping("/byXml") + public ResultVO updateProcessDefinitionByXml(String file, String name, String fileName,Integer version) { + return processService.updateProcessDefinitionByXml(file, name, fileName,version); + } + + @ApiOperation(value = "获取流程图bpmn流程图并展示") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deploymentId", value = "流程发布Id"), + @ApiImplicitParam(name = "resourceName", value = "流程发布Id") + }) + @GetMapping("bpmn") + public ResultVO getBpmnFile(String deploymentId,String resourceName, HttpServletResponse response) { + return processService.getBpmnFile(deploymentId,resourceName, response); + } + + @ApiOperation(value = "校验key和name是否唯一") + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "名称", required = true), + @ApiImplicitParam(name = "key", value = "标识", required = true) + }) + @PostMapping("unique") + public ResultVO uniqueRecord(String name, String key) { + return processService.uniqueRecord(name, key); + } + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/controller/TaskController.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/controller/TaskController.java new file mode 100644 index 0000000..506447c --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/controller/TaskController.java @@ -0,0 +1,105 @@ +package com.hcframe.activiti.controller; + +import com.alibaba.fastjson.JSON; +import com.hcframe.activiti.activiti.CommonTask; +import com.hcframe.activiti.service.TaskSysService; +import com.hcframe.base.common.ResultVO; +import com.hcframe.base.common.WebPageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +@Api(tags = "获取工作状态") +@RestController +@RequestMapping("/task") +public class TaskController { + + @Resource + TaskSysService taskSysService; + + @ApiOperation(value = "获取任务列表") + @GetMapping("") + public ResultVO getTaskList(CommonTask commonTask, WebPageInfo webPageInfo, String data) { + Map map = JSON.parseObject(data); + return taskSysService.getTaskList(commonTask, webPageInfo, map); + } + + @ApiOperation(value = "开始一个流程,设置流程人员参数等(通过key)") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tableName", value = "表名,与流程绑定", required = true), + @ApiImplicitParam(name = "tableId", value = "表Id,与流程绑定", required = true), + @ApiImplicitParam(name = "key", value = "ProcessInstance的key值", required = true), + @ApiImplicitParam(name = "...", value = "其余参数请根据需求,及设计好的流程图进行设计", required = true) + }) + @PostMapping("/{key}/key") + public ResultVO startTaskByKey(@PathVariable String key, @RequestParam Map map) { + return taskSysService.startTaskByKey(key, map); + } + + @ApiOperation(value = "开始一个流程,设置人员参数等(通过Id)") + @ApiImplicitParams({ + @ApiImplicitParam(name = "tableName", value = "表名,与流程绑定", required = true), + @ApiImplicitParam(name = "tableId", value = "表Id,与流程绑定", required = true), + @ApiImplicitParam(name = "id", value = "ProcessInstance的Id", required = true), + @ApiImplicitParam(name = "...", value = "其余参数请根据需求,及设计好的流程图进行设计", required = true) + }) + @PostMapping("/{id}/id") + public ResultVO startTaskById(@PathVariable String id, Map map) { + return taskSysService.startTaskById(id, map); + } + + @ApiOperation(value = "流程记录加锁") + @PostMapping("/claim") + public ResultVO claimTask(String taskId, String userId) { + return taskSysService.claimTask(taskId, userId); + } + + @ApiOperation(value = "任务解锁") + @PostMapping("/unclaim") + public ResultVO unclaimTask(String taskId) { + return taskSysService.unclaimTask(taskId); + } + + @ApiOperation(value = "完成任务") + @PostMapping("/{taskId}/commit") + public ResultVO commitTask(@PathVariable String taskId, String map,Boolean isBack,String reason) { + return taskSysService.commitTask(taskId, map,isBack,reason); + } + + @ApiOperation(value = "设置候选人(可设置多个候选人,标识符逗号隔开即可)") + @PostMapping("/{taskId}/addCandidateUser") + public ResultVO addCandidateUser(@PathVariable String taskId, String names) { + return taskSysService.addCandidateUser(taskId, names); + } + + @ApiOperation(value = "获取任务高亮json") + @PostMapping("/{taskId}/highLight") + public ResultVO getHighLightInfo(@PathVariable String taskId) { + return taskSysService.getHighLightInfo(taskId); + } + + @ApiOperation(value = "删除一个进行中流程实例") + @DeleteMapping("/{instansId}") + public ResultVO deleteTaskInstans(@PathVariable String instansId,@RequestParam String reason,@RequestParam Boolean flag){ + return taskSysService.deleteTaskIstans(instansId, reason,flag); + } + + @ApiOperation(value = "删除一个历史流程实例") + @DeleteMapping("/{instansId}/history") + public ResultVO deleteTaskHisInstans(@PathVariable String instansId){ + return taskSysService.deleteTaskIstansHitory(instansId); + } + + @ApiOperation(value = "获取退回意见") + @GetMapping("/{taskId}/reason") + public ResultVO getBackReason(@PathVariable String taskId) { + return taskSysService.getBackReason(taskId); + } + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/BackReasonDao.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/BackReasonDao.java new file mode 100644 index 0000000..a91f12a --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/BackReasonDao.java @@ -0,0 +1,15 @@ +package com.hcframe.activiti.dao; + +import com.hcframe.activiti.entity.BackReason; +import com.hcframe.base.common.Mapper; + +/** + * (BackReason)表数据库访问层 + * + * @author lhc + * @since 2020-09-04 09:54:13 + */ +public interface BackReasonDao extends Mapper { + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/CandidateUserDao.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/CandidateUserDao.java new file mode 100644 index 0000000..517e59e --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/CandidateUserDao.java @@ -0,0 +1,16 @@ +package com.hcframe.activiti.dao; + + +import com.hcframe.activiti.entity.CandidateUser; +import com.hcframe.base.common.Mapper; + +/** + * (CandidateUser)表数据库访问层 + * + * @author lhc + * @since 2020-09-04 13:29:17 + */ +public interface CandidateUserDao extends Mapper { + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/DataTaskDao.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/DataTaskDao.java new file mode 100644 index 0000000..5d6fd9f --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/DataTaskDao.java @@ -0,0 +1,16 @@ +package com.hcframe.activiti.dao; + + +import com.hcframe.activiti.entity.DataTask; +import com.hcframe.base.common.Mapper; + +/** + * (DataTask)表数据库访问层 + * + * @author lhc + * @since 2020-09-03 17:39:38 + */ +public interface DataTaskDao extends Mapper { + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/DataTaskHisDao.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/DataTaskHisDao.java new file mode 100644 index 0000000..d497e1c --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/dao/DataTaskHisDao.java @@ -0,0 +1,15 @@ +package com.hcframe.activiti.dao; + +import com.hcframe.activiti.entity.DataTaskHis; +import com.hcframe.base.common.Mapper; + +/** + * (DataTaskHis)表数据库访问层 + * + * @author lhc + * @since 2020-09-04 08:58:42 + */ +public interface DataTaskHisDao extends Mapper { + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/BackReason.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/BackReason.java new file mode 100644 index 0000000..0902a38 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/BackReason.java @@ -0,0 +1,31 @@ +package com.hcframe.activiti.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * (BackReason)实体类 + * + * @author lhc + * @since 2020-09-04 09:54:13 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +public class BackReason implements Serializable { + private static final long serialVersionUID = -15171833204492182L; + + private Integer backId; + + private String taskId; + + private String reason; + + private String title; + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/CandidateUser.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/CandidateUser.java new file mode 100644 index 0000000..e9a0aca --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/CandidateUser.java @@ -0,0 +1,32 @@ +package com.hcframe.activiti.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +/** + * (CandidateUser)实体类 + * + * @author lhc + * @since 2020-09-04 13:29:17 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +public class CandidateUser implements Serializable { + private static final long serialVersionUID = -32069051744595036L; + @Id + @GeneratedValue(generator="JDBC") + private Integer caId; + + private String taskId; + + private String userId; + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/DataTask.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/DataTask.java new file mode 100644 index 0000000..1ffde84 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/DataTask.java @@ -0,0 +1,45 @@ +package com.hcframe.activiti.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +/** + * (DataTask)实体类 + * + * @author lhc + * @since 2020-09-03 17:39:38 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +public class DataTask implements Serializable { + private static final long serialVersionUID = -69233663931357928L; + + @Id + @GeneratedValue(generator="JDBC") + private Integer dataTaskId; + + private String tableName; + + private String tableId; + + private String taskId; + + private String taskKey; + + private String taskName; + + private String processId; + + private Integer isBack; + + private String assignee; + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/DataTaskHis.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/DataTaskHis.java new file mode 100644 index 0000000..c98d6fd --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/entity/DataTaskHis.java @@ -0,0 +1,46 @@ +package com.hcframe.activiti.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.io.Serializable; + +/** + * (DataTaskHis)实体类 + * + * @author lhc + * @since 2020-09-04 08:58:42 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +public class DataTaskHis implements Serializable { + private static final long serialVersionUID = -66890927690522795L; + + @Id + @GeneratedValue(generator="JDBC") + private Integer hisTaskId; + + private String tableName; + + private String tableId; + + private String taskId; + + private String taskKey; + + private String processId; + + private String taskName; + + private Integer isBack; + + private String assignee; + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/ProcessService.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/ProcessService.java new file mode 100644 index 0000000..2ba0eda --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/ProcessService.java @@ -0,0 +1,25 @@ +package com.hcframe.activiti.service; + +import com.hcframe.activiti.activiti.CommonProcessDefinition; +import com.hcframe.base.common.ResultVO; +import com.hcframe.base.common.WebPageInfo; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; + +public interface ProcessService { + + ResultVO getProcessDefinitionList(CommonProcessDefinition processDefinition, WebPageInfo webPageInfo, Boolean isLatestVersion); + + ResultVO deleteProcessDefinitionList(String id, boolean state); + + ResultVO addProccessDefinition(MultipartFile file, String name); + + ResultVO getBpmnFile(String deploymentId, String resourceName, HttpServletResponse response); + + ResultVO addProccessDefinitionByXml(String file, String name,String fileName); + + ResultVO updateProcessDefinitionByXml(String file, String name, String fileName, Integer version); + + ResultVO uniqueRecord(String name, String key); +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/TaskSysService.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/TaskSysService.java new file mode 100644 index 0000000..cc7d5fe --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/TaskSysService.java @@ -0,0 +1,32 @@ +package com.hcframe.activiti.service; + +import com.hcframe.activiti.activiti.CommonTask; +import com.hcframe.base.common.ResultVO; +import com.hcframe.base.common.WebPageInfo; + +import java.util.Map; + +public interface TaskSysService { + + ResultVO getTaskList(CommonTask commonTask, WebPageInfo webPageInfo, Map map); + + ResultVO startTaskByKey(String key, Map map); + + ResultVO startTaskById(String id, Map map); + + ResultVO claimTask(String taskId, String userId); + + ResultVO commitTask(String taskId,String map,Boolean isBack,String reason); + + ResultVO unclaimTask(String taskId); + + ResultVO addCandidateUser(String taskId, String names); + + ResultVO getHighLightInfo(String taskId); + + ResultVO deleteTaskIstans(String instansId, String reason, boolean flag); + + ResultVO deleteTaskIstansHitory(String instansId); + + ResultVO getBackReason(String taskId); +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/impl/ProcessServiceImpl.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/impl/ProcessServiceImpl.java new file mode 100644 index 0000000..8d3fcab --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/impl/ProcessServiceImpl.java @@ -0,0 +1,214 @@ +package com.hcframe.activiti.service.impl; + +import com.hcframe.activiti.activiti.ActivitiUtils; +import com.hcframe.activiti.activiti.CommonProcessDefinition; +import com.hcframe.activiti.service.ProcessService; +import com.hcframe.activiti.utils.FileUtil; +import com.hcframe.base.common.ResultVO; +import com.hcframe.base.common.ServiceException; +import com.hcframe.base.common.WebPageInfo; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Deployment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.ResourceUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.HashMap; +import java.util.Map; + +@Service +public class ProcessServiceImpl implements ProcessService { + + private final static Logger logger = LoggerFactory.getLogger(ProcessServiceImpl.class); + + /** + * 获取编译后的文件路径 + */ + public static String CLASSPATH; + + static { + try { + CLASSPATH = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX + "bpmn").getPath() + "/"; + } catch (FileNotFoundException e) { + throw new ServiceException("获取bpmn文件上传路径出错!"); + } + } + + @Resource + private RepositoryService repositoryService; + + @Resource + ActivitiUtils activitiUtils; + + @Override + public ResultVO getProcessDefinitionList(CommonProcessDefinition commonProcessDefinition, + WebPageInfo webPageInfo, Boolean isLatestVersion) { + return ResultVO.getSuccess(activitiUtils.getDeployProcessList(commonProcessDefinition, webPageInfo, isLatestVersion)); + } + + @Override + public ResultVO deleteProcessDefinitionList(String id, boolean state) { + activitiUtils.deleteDeploymenet(id, true); + return ResultVO.getSuccess("删除成功"); + } + + @Override + public ResultVO addProccessDefinition(MultipartFile file, String name) { + if (file == null || file.isEmpty()) { + throw new ServiceException("bpmn文件为空"); + } + String fileName = file.getOriginalFilename(); + assert fileName != null : "文件名不存在"; + String suffixName = fileName.substring(fileName.lastIndexOf(".")); + assert !suffixName.equals(CommonProcessDefinition.BPMN) : "文件类型错误"; + Map map = new HashMap<>(2); + try { + Deployment deployment = activitiUtils.deployProcessFormInputStream(name, file.getInputStream(), fileName); + map.put("流程名称", deployment.getName()); + map.put("流程ID", deployment.getId()); + } catch (IOException e) { + logger.error("bpmn文件持久化出错", e); + throw new ServiceException("文件持久化出错"); + } + return ResultVO.getSuccess(map); + } + + @Override + public ResultVO getBpmnFile(String deploymentId, String resourceName, HttpServletResponse response) { + response.addHeader("Content-Disposition", "attachment;fileName=" + resourceName); + byte[] buffer = new byte[1024]; + BufferedInputStream bis = null; + InputStream bpmnIs = null; + try { + bpmnIs = repositoryService.getResourceAsStream(deploymentId, resourceName); + bis = new BufferedInputStream(bpmnIs); + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + return null; + } catch (Exception e) { + throw new ServiceException("文件下载失败"); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bpmnIs != null) { + try { + bpmnIs.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + @Override + public ResultVO addProccessDefinitionByXml(String file, String name, String fileName) { + if (file == null || file.isEmpty()) { + throw new ServiceException("bpmn文件为空"); + } + String filePath = CLASSPATH + fileName; + File dest = new File(filePath); + if (dest.exists()) { + dest.delete(); + } + if (!activitiUtils.uniqueName(name)) { + throw new ServiceException("name已存在,请重新命名!"); + } + Map map = new HashMap<>(2); + InputStream is = null; + try { + boolean flag = dest.createNewFile(); + if (!flag) { + throw new ServiceException("创建文件失败!"); + } + FileUtil.replaceContentToFile(file, filePath); + is= new FileInputStream(filePath); + Deployment deployment = activitiUtils.deployProcessFormInputStream(name, is, fileName); + map.put("流程名称", deployment.getName()); + map.put("流程ID", deployment.getId()); + + } catch (IOException e) { + logger.error("bpmn文件持久化出错", e); + throw new ServiceException("文件持久化出错"); + }finally { + if (is != null) { + try { + is.close(); + dest.delete(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return ResultVO.getSuccess(map); + } + + @Override + public ResultVO updateProcessDefinitionByXml(String file, String name, String fileName, Integer version) { + if (file == null || file.isEmpty()) { + throw new ServiceException("bpmn文件为空"); + } + String filePath = CLASSPATH + fileName; + File dest = new File(filePath); + if (dest.exists()) { + dest.delete(); + } + Map map = new HashMap<>(2); + InputStream is = null; + try { + boolean flag = dest.createNewFile(); + if (!flag) { + throw new ServiceException("创建文件失败!"); + } + FileUtil.replaceContentToFile(file, filePath); + is = new FileInputStream(filePath); + Deployment deployment = activitiUtils.deployProcessFormInputStream(name, is, fileName); + map.put("流程名称", deployment.getName()); + map.put("流程ID", deployment.getId()); + } catch (IOException e) { + logger.error("bpmn文件持久化出错", e); + throw new ServiceException("文件持久化出错"); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return ResultVO.getSuccess(map); + } + + @Override + public ResultVO uniqueRecord(String name, String key) { + boolean flag = true; + flag = activitiUtils.uniqueName(name); + if (!flag) { + return ResultVO.getFailed("流程名称已存在!"); + } + flag = activitiUtils.uniqueKey(key); + if (!flag) { + return ResultVO.getFailed("流程标识已存在!"); + } + return ResultVO.getSuccess(); + } + + + public static void main(String[] args) throws FileNotFoundException { + } + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/impl/TaskSysServiceImpl.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/impl/TaskSysServiceImpl.java new file mode 100644 index 0000000..7ec0c14 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/service/impl/TaskSysServiceImpl.java @@ -0,0 +1,197 @@ +package com.hcframe.activiti.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.hcframe.activiti.activiti.ActivitiUtils; +import com.hcframe.activiti.activiti.CommonTask; +import com.hcframe.activiti.dao.BackReasonDao; +import com.hcframe.activiti.dao.CandidateUserDao; +import com.hcframe.activiti.dao.DataTaskDao; +import com.hcframe.activiti.dao.DataTaskHisDao; +import com.hcframe.activiti.entity.BackReason; +import com.hcframe.activiti.entity.CandidateUser; +import com.hcframe.activiti.entity.DataTask; +import com.hcframe.activiti.entity.DataTaskHis; +import com.hcframe.activiti.service.TaskSysService; +import com.hcframe.base.common.ResultVO; +import com.hcframe.base.common.ServiceException; +import com.hcframe.base.common.WebPageInfo; +import com.hcframe.base.common.utils.EmptyCheckUtils; +import org.activiti.engine.*; +import org.activiti.engine.task.Task; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class TaskSysServiceImpl implements TaskSysService { + + @Resource + ActivitiUtils activitiUtils; + + @Resource + private TaskService taskService; + + @Resource + DataTaskDao dataTaskDao; + + @Resource + DataTaskHisDao dataTaskHisDao; + + @Resource + BackReasonDao backReasonDao; + + @Resource + CandidateUserDao candidateUserDao; + + + @Override + public ResultVO getTaskList(CommonTask commonTask, WebPageInfo webPageInfo, Map map) { + return ResultVO.getSuccess(activitiUtils.getTaskList(commonTask, webPageInfo, map)); + } + + @Override + @Transactional + public ResultVO startTaskByKey(String key, Map map) { + EmptyCheckUtils.checkWithException(map, "参数列表不能为空"); + EmptyCheckUtils.checkWithException(map.get("tableName"), "tableName 不能为空!"); + EmptyCheckUtils.checkWithException(map.get("tableId"), "tableId不能为空!"); + Map activitiMap = activitiUtils.startProcessInstanceByKey(key, map); + String processId = activitiMap.get("id").toString(); + Task task = taskService.createTaskQuery().processInstanceId(processId).singleResult(); + System.out.println(task.getAssignee()); + String[] ids = map.get("tableId").toString().split(","); + for (String id : ids) { + DataTask dataTask = DataTask + .builder() + .taskId(task.getId()) + .taskName(task.getName()) + .taskKey(task.getTaskDefinitionKey()) + .tableName(map.get("tableName").toString()) + .tableId(id) + .processId(processId) + .assignee(task.getAssignee()) + .build(); + int i = dataTaskDao.insertSelective(dataTask); + if (i < 1) { + throw new ServiceException("开始流程失败"); + } + } + activitiMap.put("taskId", task.getId()); + return ResultVO.getSuccess(activitiMap); + } + + @Override + public ResultVO startTaskById(String id, Map map) { + EmptyCheckUtils.checkWithException(map, "参数列表不能为空"); + EmptyCheckUtils.checkWithException(map.get("tableName"), "tableName 不能为空!"); + EmptyCheckUtils.checkWithException(map.get("tableId"), "tableId不能为空!"); + return ResultVO.getSuccess(activitiUtils.startProcessInstanceById(id, map)); + } + + @Override + @Transactional + public ResultVO claimTask(String taskId, String userId) { + Example example = new Example(DataTask.class); + example.createCriteria().andEqualTo("taskId",taskId); + dataTaskDao.updateByExampleSelective(DataTask.builder().assignee(userId).build(),example); + return ResultVO.getSuccess(activitiUtils.claimTask(taskId, userId)); + } + + @Override + @Transactional + public ResultVO commitTask(String taskId, String map, Boolean isBack, String reason) { + Map variables = JSONObject.parseObject(map); + if (activitiUtils.completeTask(taskId, variables)) { + DataTask dataTask = dataTaskDao.selectOne(DataTask.builder().taskId(taskId).build()); + DataTaskHis dataTaskHis = new DataTaskHis(); + BeanUtils.copyProperties(dataTask, dataTaskHis); + dataTaskHis.setHisTaskId(null); + int i = dataTaskHisDao.insertSelective(dataTaskHis); + if (i < 1) { + throw new ServiceException("任务提交失败"); + } + List dataTaskList = dataTaskDao.select(DataTask.builder().processId(dataTask.getProcessId()).build()); + List list = new ArrayList<>(); + for (DataTask data : dataTaskList) { + list.add(data.getDataTaskId()); + } + Example dataExample = new Example(DataTask.class); + dataExample.createCriteria().andIn("dataTaskId", list); + dataTaskDao.deleteByExample(dataExample); + List taskList = taskService.createTaskQuery().processInstanceId(dataTask.getProcessId()).list(); + for (Task task : taskList) { + DataTask dataTask1 = DataTask + .builder() + .taskId(task.getId()) + .taskName(task.getName()) + .taskKey(task.getTaskDefinitionKey()) + .tableName((String) taskService.getVariable(task.getId(), "tableName")) + .tableId((String) taskService.getVariable(task.getId(), "tableId")) + .processId(task.getProcessInstanceId()) + .assignee(task.getAssignee()) + .build(); + i = dataTaskDao.insertSelective(dataTask1); + if (i < 1) { + throw new ServiceException("任务提交失败"); + } + } + return ResultVO.getSuccess(); + } else { + return ResultVO.getFailed("完成任务失败"); + } + } + + + @Override + @Transactional + public ResultVO unclaimTask(String taskId) { + Example example = new Example(DataTask.class); + example.createCriteria().andEqualTo("taskId",taskId); + dataTaskDao.updateByExampleSelective(DataTask.builder().assignee("0").build(),example); + return ResultVO.getSuccess(activitiUtils.unClaimTask(taskId)); + } + + @Override + @Transactional + public ResultVO addCandidateUser(String taskId, String names) { + for (String userId : names.split(",")) { + candidateUserDao.insert(CandidateUser.builder().taskId(taskId).userId(userId).build()); + } + return ResultVO.getSuccess(activitiUtils.addCandidateUser(taskId, names)); + } + + @Override + public ResultVO getHighLightInfo(String taskId) { + return null; + } + + @Override + @Transactional + public ResultVO deleteTaskIstans(String instansId, String reason, boolean flag) { + dataTaskDao.delete(DataTask.builder().processId(instansId).build()); + if (flag) { + dataTaskHisDao.delete(DataTaskHis.builder().processId(instansId).build()); + } + activitiUtils.deleteProcessInstance(instansId, reason, flag); + return ResultVO.getSuccess(); + } + + @Override + @Transactional + public ResultVO deleteTaskIstansHitory(String instansId) { + dataTaskHisDao.delete(DataTaskHis.builder().processId(instansId).build()); + return ResultVO.getSuccess(activitiUtils.deleteProcessInstanceHistory(instansId)); + } + + @Override + public ResultVO getBackReason(String taskId) { + BackReason backReason=backReasonDao.selectOne(BackReason.builder().taskId(taskId).build()); + return ResultVO.getSuccess(backReason); + } +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/servicetask/TaskServe.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/servicetask/TaskServe.java new file mode 100644 index 0000000..cdc6f2b --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/servicetask/TaskServe.java @@ -0,0 +1,16 @@ +package com.hcframe.activiti.servicetask; + + + +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.JavaDelegate; + +import java.io.Serializable; + +public class TaskServe implements JavaDelegate, Serializable { + + @Override + public void execute(DelegateExecution delegateExecution) { + + } +} diff --git a/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/utils/FileUtil.java b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/utils/FileUtil.java new file mode 100644 index 0000000..02063ab --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/java/com/hcframe/activiti/utils/FileUtil.java @@ -0,0 +1,74 @@ +package com.hcframe.activiti.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; + +/*** + * @author lhc + * @date 2020.1.2 + */ +public class FileUtil { + + private static Logger logger = LoggerFactory.getLogger(FileUtil.class); + + /** + * 读取文件内容 + * @param filePath 文件地址 + * @return 文件内容 + */ + public static String readFile(String filePath) { + String record = ""; + // 创建文件记录读取数据最后一条的时间戳和id + InputStream is = null; + try { + is= new FileInputStream(filePath); + StringBuilder stringBuilder = new StringBuilder(); + int temp; + //当temp等于-1时,表示已经到了文件结尾,停止读取 + while ((temp = is.read()) != -1) { + stringBuilder.append((char) temp); + } + record = stringBuilder.toString(); + } catch (IOException e) { + logger.error("File read Error!!!",e); + }finally { + try { + assert is != null; + is.close(); + } catch (IOException e) { + logger.error("Cannot close File read Stream!!!",e); + } + } + return record; + } + + /** + * 替换文件内容 + * @param string ---需要替换的内容 + * @return 是否成功 + */ + public static boolean replaceContentToFile(String string,String filePath) { + File file = new File(filePath); + Writer out = null; + boolean flag = true; + try { + out = new FileWriter(file); + out.write(string); + } catch (IOException e) { + flag = false; + logger.error("Write string to file Error!!",e); + }finally { + try { + assert out != null; + out.close(); + } catch (IOException e) { + logger.error("close replaceContentToFile Stream Error",e); + } + } + return flag; + } + + +} diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/activiti7.sql b/hcframe-parent/hcframe-activiti/src/main/resources/activiti7.sql new file mode 100644 index 0000000..0ef790b --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/activiti7.sql @@ -0,0 +1,697 @@ +/* + Navicat Premium Data Transfer + + Source Server : 192.168.4.119 + Source Server Type : MySQL + Source Server Version : 50731 + Source Host : 192.168.4.119:3306 + Source Schema : activiti7 + + Target Server Type : MySQL + Target Server Version : 50731 + File Encoding : 65001 + + Date: 04/09/2020 13:52:31 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for ACT_EVT_LOG +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_EVT_LOG`; +CREATE TABLE `ACT_EVT_LOG` ( + `LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT, + `TYPE_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + `USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `DATA_` longblob, + `LOCK_OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `IS_PROCESSED_` tinyint(4) DEFAULT '0', + PRIMARY KEY (`LOG_NR_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_GE_BYTEARRAY +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_GE_BYTEARRAY`; +CREATE TABLE `ACT_GE_BYTEARRAY` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `BYTES_` longblob, + `GENERATED_` tinyint(4) DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_FK_BYTEARR_DEPL` (`DEPLOYMENT_ID_`), + CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_GE_PROPERTY +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_GE_PROPERTY`; +CREATE TABLE `ACT_GE_PROPERTY` ( + `NAME_` varchar(64) COLLATE utf8_bin NOT NULL, + `VALUE_` varchar(300) COLLATE utf8_bin DEFAULT NULL, + `REV_` int(11) DEFAULT NULL, + PRIMARY KEY (`NAME_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_ACTINST +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_ACTINST`; +CREATE TABLE `ACT_HI_ACTINST` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `ACT_ID_` varchar(255) COLLATE utf8_bin NOT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `CALL_PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `ACT_NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `ACT_TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) DEFAULT NULL, + `DURATION_` bigint(20) DEFAULT NULL, + `DELETE_REASON_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_HI_ACT_INST_START` (`START_TIME_`), + KEY `ACT_IDX_HI_ACT_INST_END` (`END_TIME_`), + KEY `ACT_IDX_HI_ACT_INST_PROCINST` (`PROC_INST_ID_`,`ACT_ID_`), + KEY `ACT_IDX_HI_ACT_INST_EXEC` (`EXECUTION_ID_`,`ACT_ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_ATTACHMENT +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_ATTACHMENT`; +CREATE TABLE `ACT_HI_ATTACHMENT` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `URL_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `CONTENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TIME_` datetime(3) DEFAULT NULL, + PRIMARY KEY (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_COMMENT +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_COMMENT`; +CREATE TABLE `ACT_HI_COMMENT` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TIME_` datetime(3) NOT NULL, + `USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `ACTION_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `MESSAGE_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `FULL_MSG_` longblob, + PRIMARY KEY (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_DETAIL +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_DETAIL`; +CREATE TABLE `ACT_HI_DETAIL` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `ACT_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin NOT NULL, + `VAR_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `REV_` int(11) DEFAULT NULL, + `TIME_` datetime(3) NOT NULL, + `BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `DOUBLE_` double DEFAULT NULL, + `LONG_` bigint(20) DEFAULT NULL, + `TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_HI_DETAIL_PROC_INST` (`PROC_INST_ID_`), + KEY `ACT_IDX_HI_DETAIL_ACT_INST` (`ACT_INST_ID_`), + KEY `ACT_IDX_HI_DETAIL_TIME` (`TIME_`), + KEY `ACT_IDX_HI_DETAIL_NAME` (`NAME_`), + KEY `ACT_IDX_HI_DETAIL_TASK_ID` (`TASK_ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_IDENTITYLINK +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_IDENTITYLINK`; +CREATE TABLE `ACT_HI_IDENTITYLINK` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `GROUP_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_HI_IDENT_LNK_USER` (`USER_ID_`), + KEY `ACT_IDX_HI_IDENT_LNK_TASK` (`TASK_ID_`), + KEY `ACT_IDX_HI_IDENT_LNK_PROCINST` (`PROC_INST_ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_PROCINST +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_PROCINST`; +CREATE TABLE `ACT_HI_PROCINST` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `BUSINESS_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `START_TIME_` datetime(3) NOT NULL, + `END_TIME_` datetime(3) DEFAULT NULL, + `DURATION_` bigint(20) DEFAULT NULL, + `START_USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `START_ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `END_ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `SUPER_PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `DELETE_REASON_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + UNIQUE KEY `PROC_INST_ID_` (`PROC_INST_ID_`), + KEY `ACT_IDX_HI_PRO_INST_END` (`END_TIME_`), + KEY `ACT_IDX_HI_PRO_I_BUSKEY` (`BUSINESS_KEY_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_TASKINST +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_TASKINST`; +CREATE TABLE `ACT_HI_TASKINST` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `START_TIME_` datetime(3) NOT NULL, + `CLAIM_TIME_` datetime(3) DEFAULT NULL, + `END_TIME_` datetime(3) DEFAULT NULL, + `DURATION_` bigint(20) DEFAULT NULL, + `DELETE_REASON_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `PRIORITY_` int(11) DEFAULT NULL, + `DUE_DATE_` datetime(3) DEFAULT NULL, + `FORM_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_HI_TASK_INST_PROCINST` (`PROC_INST_ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_HI_VARINST +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_HI_VARINST`; +CREATE TABLE `ACT_HI_VARINST` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin NOT NULL, + `VAR_TYPE_` varchar(100) COLLATE utf8_bin DEFAULT NULL, + `REV_` int(11) DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `DOUBLE_` double DEFAULT NULL, + `LONG_` bigint(20) DEFAULT NULL, + `TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `CREATE_TIME_` datetime(3) DEFAULT NULL, + `LAST_UPDATED_TIME_` datetime(3) DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_HI_PROCVAR_PROC_INST` (`PROC_INST_ID_`), + KEY `ACT_IDX_HI_PROCVAR_NAME_TYPE` (`NAME_`,`VAR_TYPE_`), + KEY `ACT_IDX_HI_PROCVAR_TASK_ID` (`TASK_ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_PROCDEF_INFO +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_PROCDEF_INFO`; +CREATE TABLE `ACT_PROCDEF_INFO` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `INFO_JSON_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + UNIQUE KEY `ACT_UNIQ_INFO_PROCDEF` (`PROC_DEF_ID_`), + KEY `ACT_IDX_INFO_PROCDEF` (`PROC_DEF_ID_`), + KEY `ACT_FK_INFO_JSON_BA` (`INFO_JSON_ID_`), + CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RE_DEPLOYMENT +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RE_DEPLOYMENT`; +CREATE TABLE `ACT_RE_DEPLOYMENT` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL, + `ENGINE_VERSION_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RE_MODEL +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RE_MODEL`; +CREATE TABLE `ACT_RE_MODEL` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `VERSION_` int(11) DEFAULT NULL, + `META_INFO_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EDITOR_SOURCE_VALUE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_FK_MODEL_SOURCE` (`EDITOR_SOURCE_VALUE_ID_`), + KEY `ACT_FK_MODEL_SOURCE_EXTRA` (`EDITOR_SOURCE_EXTRA_VALUE_ID_`), + KEY `ACT_FK_MODEL_DEPLOYMENT` (`DEPLOYMENT_ID_`), + CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`), + CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RE_PROCDEF +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RE_PROCDEF`; +CREATE TABLE `ACT_RE_PROCDEF` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `KEY_` varchar(255) COLLATE utf8_bin NOT NULL, + `VERSION_` int(11) NOT NULL, + `DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DGRM_RESOURCE_NAME_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `HAS_START_FORM_KEY_` tinyint(4) DEFAULT NULL, + `HAS_GRAPHICAL_NOTATION_` tinyint(4) DEFAULT NULL, + `SUSPENSION_STATE_` int(11) DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + `ENGINE_VERSION_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + UNIQUE KEY `ACT_UNIQ_PROCDEF` (`KEY_`,`VERSION_`,`TENANT_ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_DEADLETTER_JOB +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_DEADLETTER_JOB`; +CREATE TABLE `ACT_RU_DEADLETTER_JOB` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `EXCLUSIVE_` tinyint(1) DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_FK_DEADLETTER_JOB_EXECUTION` (`EXECUTION_ID_`), + KEY `ACT_FK_DEADLETTER_JOB_PROCESS_INSTANCE` (`PROCESS_INSTANCE_ID_`), + KEY `ACT_FK_DEADLETTER_JOB_PROC_DEF` (`PROC_DEF_ID_`), + KEY `ACT_FK_DEADLETTER_JOB_EXCEPTION` (`EXCEPTION_STACK_ID_`), + CONSTRAINT `ACT_FK_DEADLETTER_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_DEADLETTER_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_DEADLETTER_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_DEADLETTER_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_EVENT_SUBSCR +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_EVENT_SUBSCR`; +CREATE TABLE `ACT_RU_EVENT_SUBSCR` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `EVENT_TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `EVENT_NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `ACTIVITY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `CONFIGURATION_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_EVENT_SUBSCR_CONFIG_` (`CONFIGURATION_`), + KEY `ACT_FK_EVENT_EXEC` (`EXECUTION_ID_`), + CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_EXECUTION +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_EXECUTION`; +CREATE TABLE `ACT_RU_EXECUTION` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `BUSINESS_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `PARENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `SUPER_EXEC_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `ROOT_PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `IS_ACTIVE_` tinyint(4) DEFAULT NULL, + `IS_CONCURRENT_` tinyint(4) DEFAULT NULL, + `IS_SCOPE_` tinyint(4) DEFAULT NULL, + `IS_EVENT_SCOPE_` tinyint(4) DEFAULT NULL, + `IS_MI_ROOT_` tinyint(4) DEFAULT NULL, + `SUSPENSION_STATE_` int(11) DEFAULT NULL, + `CACHED_ENT_STATE_` int(11) DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `START_TIME_` datetime(3) DEFAULT NULL, + `START_USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` tinyint(4) DEFAULT NULL, + `EVT_SUBSCR_COUNT_` int(11) DEFAULT NULL, + `TASK_COUNT_` int(11) DEFAULT NULL, + `JOB_COUNT_` int(11) DEFAULT NULL, + `TIMER_JOB_COUNT_` int(11) DEFAULT NULL, + `SUSP_JOB_COUNT_` int(11) DEFAULT NULL, + `DEADLETTER_JOB_COUNT_` int(11) DEFAULT NULL, + `VAR_COUNT_` int(11) DEFAULT NULL, + `ID_LINK_COUNT_` int(11) DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_EXEC_BUSKEY` (`BUSINESS_KEY_`), + KEY `ACT_IDC_EXEC_ROOT` (`ROOT_PROC_INST_ID_`), + KEY `ACT_FK_EXE_PROCINST` (`PROC_INST_ID_`), + KEY `ACT_FK_EXE_PARENT` (`PARENT_ID_`), + KEY `ACT_FK_EXE_SUPER` (`SUPER_EXEC_`), + KEY `ACT_FK_EXE_PROCDEF` (`PROC_DEF_ID_`), + CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE, + CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`), + CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_IDENTITYLINK +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_IDENTITYLINK`; +CREATE TABLE `ACT_RU_IDENTITYLINK` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `GROUP_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `USER_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_IDENT_LNK_USER` (`USER_ID_`), + KEY `ACT_IDX_IDENT_LNK_GROUP` (`GROUP_ID_`), + KEY `ACT_IDX_ATHRZ_PROCEDEF` (`PROC_DEF_ID_`), + KEY `ACT_FK_TSKASS_TASK` (`TASK_ID_`), + KEY `ACT_FK_IDL_PROCINST` (`PROC_INST_ID_`), + CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`), + CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `ACT_RU_TASK` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_INTEGRATION +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_INTEGRATION`; +CREATE TABLE `ACT_RU_INTEGRATION` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `FLOW_NODE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `CREATED_DATE_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`ID_`), + KEY `ACT_FK_INT_EXECUTION` (`EXECUTION_ID_`), + KEY `ACT_FK_INT_PROC_INST` (`PROCESS_INSTANCE_ID_`), + KEY `ACT_FK_INT_PROC_DEF` (`PROC_DEF_ID_`), + CONSTRAINT `ACT_FK_INT_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE, + CONSTRAINT `ACT_FK_INT_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`), + CONSTRAINT `ACT_FK_INT_PROC_INST` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_JOB +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_JOB`; +CREATE TABLE `ACT_RU_JOB` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `RETRIES_` int(11) DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_FK_JOB_EXECUTION` (`EXECUTION_ID_`), + KEY `ACT_FK_JOB_PROCESS_INSTANCE` (`PROCESS_INSTANCE_ID_`), + KEY `ACT_FK_JOB_PROC_DEF` (`PROC_DEF_ID_`), + KEY `ACT_FK_JOB_EXCEPTION` (`EXCEPTION_STACK_ID_`), + CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_SUSPENDED_JOB +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_SUSPENDED_JOB`; +CREATE TABLE `ACT_RU_SUSPENDED_JOB` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `EXCLUSIVE_` tinyint(1) DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `RETRIES_` int(11) DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_FK_SUSPENDED_JOB_EXECUTION` (`EXECUTION_ID_`), + KEY `ACT_FK_SUSPENDED_JOB_PROCESS_INSTANCE` (`PROCESS_INSTANCE_ID_`), + KEY `ACT_FK_SUSPENDED_JOB_PROC_DEF` (`PROC_DEF_ID_`), + KEY `ACT_FK_SUSPENDED_JOB_EXCEPTION` (`EXCEPTION_STACK_ID_`), + CONSTRAINT `ACT_FK_SUSPENDED_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_SUSPENDED_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_SUSPENDED_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_SUSPENDED_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_TASK +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_TASK`; +CREATE TABLE `ACT_RU_TASK` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `DELEGATION_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PRIORITY_` int(11) DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) DEFAULT NULL, + `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `SUSPENSION_STATE_` int(11) DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + `FORM_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `CLAIM_TIME_` datetime(3) DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_TASK_CREATE` (`CREATE_TIME_`), + KEY `ACT_FK_TASK_EXE` (`EXECUTION_ID_`), + KEY `ACT_FK_TASK_PROCINST` (`PROC_INST_ID_`), + KEY `ACT_FK_TASK_PROCDEF` (`PROC_DEF_ID_`), + CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`), + CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_TIMER_JOB +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_TIMER_JOB`; +CREATE TABLE `ACT_RU_TIMER_JOB` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) DEFAULT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `RETRIES_` int(11) DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', + PRIMARY KEY (`ID_`), + KEY `ACT_FK_TIMER_JOB_EXECUTION` (`EXECUTION_ID_`), + KEY `ACT_FK_TIMER_JOB_PROCESS_INSTANCE` (`PROCESS_INSTANCE_ID_`), + KEY `ACT_FK_TIMER_JOB_PROC_DEF` (`PROC_DEF_ID_`), + KEY `ACT_FK_TIMER_JOB_EXCEPTION` (`EXCEPTION_STACK_ID_`), + CONSTRAINT `ACT_FK_TIMER_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_TIMER_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_TIMER_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_TIMER_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for ACT_RU_VARIABLE +-- ---------------------------- +DROP TABLE IF EXISTS `ACT_RU_VARIABLE`; +CREATE TABLE `ACT_RU_VARIABLE` ( + `ID_` varchar(64) COLLATE utf8_bin NOT NULL, + `REV_` int(11) DEFAULT NULL, + `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, + `DOUBLE_` double DEFAULT NULL, + `LONG_` bigint(20) DEFAULT NULL, + `TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + `TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ID_`), + KEY `ACT_IDX_VARIABLE_TASK_ID` (`TASK_ID_`), + KEY `ACT_FK_VAR_EXE` (`EXECUTION_ID_`), + KEY `ACT_FK_VAR_PROCINST` (`PROC_INST_ID_`), + KEY `ACT_FK_VAR_BYTEARRAY` (`BYTEARRAY_ID_`), + CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`), + CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`), + CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for back_reason +-- ---------------------------- +DROP TABLE IF EXISTS `back_reason`; +CREATE TABLE `back_reason` ( + `back_id` int(11) NOT NULL AUTO_INCREMENT, + `task_id` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `reason` text COLLATE utf8_bin, + `title` varchar(2000) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`back_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for candidate_user +-- ---------------------------- +DROP TABLE IF EXISTS `candidate_user`; +CREATE TABLE `candidate_user` ( + `ca_id` int(11) NOT NULL AUTO_INCREMENT, + `task_id` varchar(225) COLLATE utf8_bin DEFAULT NULL, + `user_id` varchar(225) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`ca_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for data_task +-- ---------------------------- +DROP TABLE IF EXISTS `data_task`; +CREATE TABLE `data_task` ( + `data_task_id` int(11) NOT NULL AUTO_INCREMENT, + `table_name` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `table_id` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `task_id` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `task_key` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `process_id` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `task_name` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `is_back` int(11) DEFAULT '0', + `assignee` varchar(255) COLLATE utf8_bin DEFAULT '0', + PRIMARY KEY (`data_task_id`), + KEY `tableid` (`table_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +-- ---------------------------- +-- Table structure for data_task_his +-- ---------------------------- +DROP TABLE IF EXISTS `data_task_his`; +CREATE TABLE `data_task_his` ( + `his_task_id` int(11) NOT NULL AUTO_INCREMENT, + `table_name` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `table_id` varchar(2000) COLLATE utf8_bin DEFAULT NULL, + `task_id` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `task_key` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `process_id` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `task_name` varchar(255) COLLATE utf8_bin DEFAULT NULL, + `is_back` int(11) DEFAULT '0', + `assignee` varchar(255) COLLATE utf8_bin DEFAULT '0', + PRIMARY KEY (`his_task_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/application.yml b/hcframe-parent/hcframe-activiti/src/main/resources/application.yml new file mode 100644 index 0000000..ca64daf --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/application.yml @@ -0,0 +1,92 @@ +spring: + application: + name: activiti-cloud + #Activiti property configuration + activiti: + database-schema-update: true + history-level: full + db-history-used: true +# redis: +# database: 0 +# host: 192.168.100.145 +# port: 6379 +# password: root +# lettuce: +# pool: +# # 连接池中的最大空闲连接 默认8 +# max-idle: 8 +# # 连接池中的最小空闲连接 默认0 +# min-idle: 0 +# # 连接池最大连接数 默认8 ,负数表示没有限制 +# max-active: 8 +# # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1 +# max-wait: -1 +# timeout: 30000 + datasource: + url: jdbc:mysql://192.168.4.119:3306/activiti7?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + initialization-mode: always + initialSize: 5 + minIdle: 5 + maxActive: 20 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: select 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + poolPreparedStatements: true + filters: stat,wall,slf4j + maxPoolPreparedStatementPerConnectionSize: 20 + useGlobalDataSourceStat: true + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + mvc: + view: + prefix: /templates/ + suffix: .html + static-path-pattern: /static/** +mybatis: + mapper-locations: classpath:mapping/** + type-aliases-package: com.hcframe.activiti.entity +logging: + level: + com.hcframe.activiti: debug + pattern: + console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(-%5p) %clr(${PID:- }){magenta} --- %clr([%15.15t]){faint} %highlight(%-80.80logger{300}){cyan} %clr(:) %m %n%wEx" +server: + port: 8080 + servlet: + context-path: /activiti +# 是否开启redis 用户登录,若开启此项,需要配置redis节点及相关配置,若不开启,需要注释掉redis相关配置信息 +isRedisLogin: true +# 用户登陆超时设置,单位为小时,此值不能为0 +login-time-out: 4 +swagger: + # 配置controller包路径 + path: com.hcframe.activiti.controller + # 是否开启权限 + enableAuth: false + # 用户名 + username: admin + # 密码 + password: admin +# Druid连接配置 +druid: + # Druid用户名 + username: test + # Druid密码 + password: test + # Druid 允许访问的IP,默认全部允许 + # allow: 127.0.0.1 + # Druid 拒绝访问的IP,默认不拒绝全部 +# deny: 10.0.0.2 +# 是否开启controller 日志显示 +show-controller-log: true +eureka: + client: + service-url: + defaultZone: http://admin:123456@192.168.4.119:8081/eureka/ diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/banner.txt b/hcframe-parent/hcframe-activiti/src/main/resources/banner.txt new file mode 100644 index 0000000..0b703cf --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/banner.txt @@ -0,0 +1,25 @@ + __ __ ______ ______ +| \ | \ / \ / \ +| $$ | $$| $$$$$$\ | $$$$$$\ ______ ______ ______ ____ ______ +| $$__| $$| $$ \$$ | $$_ \$$/ \ | \ | \ \ / \ +| $$ $$| $$ | $$ \ | $$$$$$\ \$$$$$$\| $$$$$$\$$$$\| $$$$$$\ +| $$$$$$$$| $$ __ | $$$$ | $$ \$$/ $$| $$ | $$ | $$| $$ $$ +| $$ | $$| $$__/ \ | $$ | $$ | $$$$$$$| $$ | $$ | $$| $$$$$$$$ __ +| $$ | $$ \$$ $$ | $$ | $$ \$$ $$| $$ | $$ | $$ \$$ \| \ + \$$ \$$ \$$$$$$ \$$ \$$ \$$$$$$$ \$$ \$$ \$$ \$$$$$$$ \$$ + + + + + __ __ _______ __ __ +| \ | \ | \ | \ | \ +| $$\ | $$ ______ | $$$$$$$\ __ __ ______ | $$ | $$ ______ ______ ______ +| $$$\| $$ / \ | $$__/ $$| \ | \ / \ | $$__| $$ / \ / \ / \ +| $$$$\ $$| $$$$$$\ | $$ $$| $$ | $$| $$$$$$\ | $$ $$| $$$$$$\| $$$$$$\| $$$$$$\ +| $$\$$ $$| $$ | $$ | $$$$$$$\| $$ | $$| $$ | $$ | $$$$$$$$| $$ | $$| $$ | $$| $$ $$ +| $$ \$$$$| $$__/ $$ | $$__/ $$| $$__/ $$| $$__| $$ | $$ | $$| $$__/ $$| $$__/ $$| $$$$$$$$ __ +| $$ \$$$ \$$ $$ | $$ $$ \$$ $$ \$$ $$ | $$ | $$ \$$ $$| $$ $$ \$$ \| \ + \$$ \$$ \$$$$$$ \$$$$$$$ \$$$$$$ _\$$$$$$$ \$$ \$$ \$$$$$$ | $$$$$$$ \$$$$$$$ \$$ + | \__| $$ | $$ + \$$ $$ | $$ + \$$$$$$ \$$ \ No newline at end of file diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/baoxiao.bpmn b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/baoxiao.bpmn new file mode 100644 index 0000000..3d5e69a --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/baoxiao.bpmn @@ -0,0 +1,130 @@ + + + + + + + + SequenceFlow_1tepjd8 + + + + SequenceFlow_16kfu0c + SequenceFlow_08rzzfi + SequenceFlow_16octdj + SequenceFlow_05mw1rb + + + + ${money>5000} + + + ${money>2000} + + + ${money<=2000} + + + SequenceFlow_1tepjd8 + SequenceFlow_16kfu0c + + + SequenceFlow_08rzzfi + SequenceFlow_0fj2awn + + + SequenceFlow_05mw1rb + SequenceFlow_0r5llta + + + SequenceFlow_1isb5u2 + SequenceFlow_0fj2awn + SequenceFlow_0r5llta + + + + + + SequenceFlow_16octdj + SequenceFlow_1isb5u2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/task__111.bpmn b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/task__111.bpmn new file mode 100644 index 0000000..62ba418 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/task__111.bpmn @@ -0,0 +1,47 @@ + + + + + + + + SequenceFlow_09zceg0 + + + + SequenceFlow_09zceg0 + SequenceFlow_13ur3ks + + + SequenceFlow_13ur3ks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/task__111_v1.bpmn b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/task__111_v1.bpmn new file mode 100644 index 0000000..62ba418 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/task__111_v1.bpmn @@ -0,0 +1,47 @@ + + + + + + + + SequenceFlow_09zceg0 + + + + SequenceFlow_09zceg0 + SequenceFlow_13ur3ks + + + SequenceFlow_13ur3ks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/数据采集(数据应用室发起).bpmn b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/数据采集(数据应用室发起).bpmn new file mode 100644 index 0000000..640ed89 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/数据采集(数据应用室发起).bpmn @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/数据采集(数据应用室发起).xml b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/数据采集(数据应用室发起).xml new file mode 100644 index 0000000..77b7692 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/bpmn/数据采集(数据应用室发起).xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/mapping/BackReasonDao.xml b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/BackReasonDao.xml new file mode 100644 index 0000000..653f9ce --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/BackReasonDao.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/mapping/CandidateUserDao.xml b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/CandidateUserDao.xml new file mode 100644 index 0000000..f982368 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/CandidateUserDao.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/mapping/DataTaskDao.xml b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/DataTaskDao.xml new file mode 100644 index 0000000..2d06f60 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/DataTaskDao.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-activiti/src/main/resources/mapping/DataTaskHisDao.xml b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/DataTaskHisDao.xml new file mode 100644 index 0000000..f348388 --- /dev/null +++ b/hcframe-parent/hcframe-activiti/src/main/resources/mapping/DataTaskHisDao.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-es/pom.xml b/hcframe-parent/hcframe-es/pom.xml new file mode 100644 index 0000000..f7143d3 --- /dev/null +++ b/hcframe-parent/hcframe-es/pom.xml @@ -0,0 +1,56 @@ + + + + parent + com.hcframe + 1.0-SNAPSHOT + + 4.0.0 + + hcframe-es + + + 8 + 8 + 7.6.2 + + + + com.hcframe + hcframe-base + 1.2.1-SNAPSHOT + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + ${elasticsearch.version} + + + org.elasticsearch.client + elasticsearch-rest-client + + + org.elasticsearch + elasticsearch + + + + + org.elasticsearch.client + elasticsearch-rest-client + ${elasticsearch.version} + + + org.elasticsearch + elasticsearch + ${elasticsearch.version} + + + com.hcframe + hcframe-starter + 1.0-SNAPSHOT + + + diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/EsApplication.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/EsApplication.java new file mode 100644 index 0000000..7417644 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/EsApplication.java @@ -0,0 +1,27 @@ +package com.hcframe.es; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +@EnableAspectJAutoProxy(proxyTargetClass = true) +@EnableSwagger2 +@ServletComponentScan +@EnableCaching +//@EnableDiscoveryClient +//@EnableFeignClients +@ComponentScan(basePackages = {"com.hcframe.**"}) +public class EsApplication { + + public static void main(String[] args) { + SpringApplication.run(EsApplication.class, args); + } + + +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/ServletInitializer.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/ServletInitializer.java new file mode 100644 index 0000000..933a07a --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.hcframe.es; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(EsApplication.class); + } + +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/annotation/LogAnno.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/annotation/LogAnno.java new file mode 100644 index 0000000..dbf425d --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/annotation/LogAnno.java @@ -0,0 +1,26 @@ +package com.hcframe.es.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 日志注解 + * + * @author lhc + */ +// 方法注解 +@Target(ElementType.METHOD) +// 运行时可见 +@Retention(RetentionPolicy.RUNTIME) +public @interface LogAnno { + // 记录日志的操作类型 + String operateType(); + // 记录日志主键 + String primaryKey() default "id"; + // 记录日志表 + String tableName() default "-"; + + boolean isBefore() default false; +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/config/CommandLineRunnerImpl.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/config/CommandLineRunnerImpl.java new file mode 100644 index 0000000..5659c73 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/config/CommandLineRunnerImpl.java @@ -0,0 +1,36 @@ +package com.hcframe.es.config; + +import com.hcframe.base.module.cache.CacheService; +import com.hcframe.base.module.datasource.utils.DataSourceUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.util.List; + + +/** + * @author lhc + * @date 2020-10-09 + * @description springboot启动执行配置类 + */ +@Component +public class CommandLineRunnerImpl implements CommandLineRunner { + + private static final Logger logger = LoggerFactory.getLogger(CommandLineRunnerImpl.class); + + @Autowired + List cacheServices; + + @Override + public void run(String... args) { +// DataSourceUtil.initDataSource(); + // 初始化缓存 +// for (CacheService cacheService : cacheServices) { +// cacheService.initTableCache(); +// } + logger.info("start success"); + } +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/config/ShiroRealmConfig.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/config/ShiroRealmConfig.java new file mode 100644 index 0000000..f9a0bdf --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/config/ShiroRealmConfig.java @@ -0,0 +1,77 @@ +package com.hcframe.es.config; + +import com.hcframe.base.module.auth.dao.FtUserDao; +import com.hcframe.base.module.auth.entity.FtUser; +import com.hcframe.base.module.shiro.service.ShiroType; +import com.hcframe.base.module.shiro.service.SystemRealm; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; + +/** + * @author lhc + * @date 2020-07-28 + * @decription shiro 配置类 + */ +@Component +public class ShiroRealmConfig implements SystemRealm { + + @Resource + FtUserDao ftUserDao; + + /** + * 根据用户信息注入权限 + * @param user 用户信息 + * @return 权限信息 + */ + @Override + public SimpleAuthorizationInfo setAuthoriztion(Object user) { + return new SimpleAuthorizationInfo(); + } + + /** + * 根据用户Id查询用户信息并注入到shiro框架中 + * @param userId 用户id + * @return 用户信息 + */ + @Override + public Object findByUserId(String userId) { + return ftUserDao.selectOne(FtUser.builder().userId(Integer.parseInt(userId)).build()); + } + + /** + * 配置拦截及放行路径 + * @return 返回拦截及放行路径Map + */ + @Override + public LinkedHashMap setShiroUrl() { + LinkedHashMap map = new LinkedHashMap<>(); +// // 用户登陆 +// map.put("/ftUser/login", ShiroType.ANON); +// // Vue静态资源 +// map.put("/img/**", ShiroType.ANON); +// map.put("/static/**", ShiroType.ANON); +// map.put("/tinymce/**", ShiroType.ANON); +// map.put("/favicon.ico", ShiroType.ANON); +// map.put("/manifest.json", ShiroType.ANON); +// map.put("/robots.txt", ShiroType.ANON); +// map.put("/precache*", ShiroType.ANON); +// map.put("/service-worker.js", ShiroType.ANON); +// // swagger UI 静态资源 +// map.put("/swagger-ui.html",ShiroType.ANON); +// map.put("/doc.html",ShiroType.ANON); +// map.put("/swagger-resources/**",ShiroType.ANON); +// map.put("/webjars/**",ShiroType.ANON); +// map.put("/v2/api-docs",ShiroType.ANON); +// map.put("/v2/api-docs-ext",ShiroType.ANON); +// map.put("/swagger/**",ShiroType.ANON); +// // druid 资源路径 +// map.put("/druid/**",ShiroType.ANON); + // 其余路径均拦截 + map.put("/**", ShiroType.ANON); + return map; + } + +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/controller/SearchController.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/controller/SearchController.java new file mode 100644 index 0000000..ee6ec7a --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/controller/SearchController.java @@ -0,0 +1,48 @@ +package com.hcframe.es.controller; + +import com.hcframe.base.common.ResultVO; +import com.hcframe.es.service.SearchService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +@RestController +@Api(tags = "ES搜索相关接口") +@RequestMapping("/search") +public class SearchController { + + @Resource + SearchService searchService; + + @ApiOperation(value = "全文检索接口样例") + @ApiImplicitParams({ + @ApiImplicitParam(name = "text", value = "关键词", required = true), + @ApiImplicitParam(name = "pageNum", value = "页码", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", required = true), + @ApiImplicitParam(name = "indexType", value = "索引,以逗号隔开", required = true), + }) + @GetMapping("/fulltext") + public ResultVO getFullText(HttpServletRequest request, String text, Integer pageNum, Integer pageSize, String indexType) { + return searchService.getFullText(request, text,pageNum,pageSize,indexType); + } + + @ApiOperation(value = "高级检索接口样例") + @ApiImplicitParams({ + @ApiImplicitParam(name = "data", value = "查询条件,在前端将查询对象通过JSON.toString(obj)方法进行格式化成字符串", required = true), + @ApiImplicitParam(name = "pageNum", value = "页码", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", required = true), + @ApiImplicitParam(name = "index", value = "索引", required = true), + }) + @GetMapping("/expertSearch") + public ResultVO expertSearch(HttpServletRequest request,String data,Integer pageNum,Integer pageSize,String index) { + return searchService.expertSearch(request, data, pageNum, pageSize, index); + } + +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/entity/FtUser.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/entity/FtUser.java new file mode 100644 index 0000000..75d2714 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/entity/FtUser.java @@ -0,0 +1,76 @@ +package com.hcframe.es.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.io.Serializable; +import java.util.Date; + +/** + * (FtUser)实体类 + * + * @author lhc + * @since 2020-02-11 19:29:10 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@Data +public class FtUser implements Serializable { + private static final long serialVersionUID = 115625188750279606L; + /** + * 主键ID + */ + @Id + @GeneratedValue( + strategy = GenerationType.IDENTITY, + generator = "select USER_ID.nextval from dual") + private Integer userId; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 手机号 + */ + private String phone; + /** + * 用户类型 + */ + private Integer userType; + /** + * 启用/禁用 + */ + private Integer enabled; + /** + * 用户信息主键 + */ + private Integer userInfoId; + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** + * 修改时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + private Integer orgId; + + +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/esmapper/EsMapper.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/esmapper/EsMapper.java new file mode 100644 index 0000000..d9db31a --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/esmapper/EsMapper.java @@ -0,0 +1,14 @@ +package com.hcframe.es.esmapper; + +import org.elasticsearch.action.search.SearchResponse; + +import java.util.Map; + +public interface EsMapper { + + + SearchResponse fullTextSearch(String text, Integer pageNum, Integer pageSize, String[] indexArr, String[] includeFields, String[] excludeFields); + + + SearchResponse expertSearch(Map map, Integer pageNum, Integer pageSize, String indexArr, String[] includeFields, String[] excludeFields); +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/esmapper/impl/EsMapperImpl.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/esmapper/impl/EsMapperImpl.java new file mode 100644 index 0000000..60c8780 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/esmapper/impl/EsMapperImpl.java @@ -0,0 +1,80 @@ +package com.hcframe.es.esmapper.impl; + +import com.hcframe.base.common.ServiceException; +import com.hcframe.es.esmapper.EsMapper; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Map; + +@Component +public class EsMapperImpl implements EsMapper { + + @Autowired + private RestHighLevelClient client; + + + @Override + public SearchResponse fullTextSearch(String text, Integer pageNum, + Integer pageSize, String[] indexArr, String[] includeFields, + String[] excludeFields) { + // 设置高亮配置 + HighlightBuilder highlightBuilder = new HighlightBuilder(); + HighlightBuilder.Field highlight = new HighlightBuilder.Field("*"); + highlight.highlighterType("unified"); + highlightBuilder.field(highlight); + // 配置搜索条件 + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder + .highlighter(highlightBuilder) + .query(QueryBuilders.queryStringQuery(text)) + .size(pageSize) + .from((pageNum - 1) * pageSize) + .fetchSource(includeFields,excludeFields); + // 建立搜索Request + SearchRequest searchRequest = new SearchRequest(indexArr); + searchRequest.source(searchSourceBuilder); + try { + // 通过客户端搜索 + return client.search(searchRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + throw new ServiceException("全文检索,全文检索服务器异常"); + } + } + + @Override + public SearchResponse expertSearch(Map map, Integer pageNum, Integer pageSize, String indexArr, String[] includeFields, String[] excludeFields) { + // 建立联合查询对象 + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + // 遍历查询条件map,进行模糊查询 + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + key = key + ".keyword"; + boolQueryBuilder.filter(QueryBuilders.wildcardQuery(key, "*" + entry.getValue() + "*")); + } + // 创建搜索builder对象 + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + searchSourceBuilder + .query(boolQueryBuilder) + .size(pageSize) + .from((pageNum - 1) * pageSize) + .fetchSource(includeFields,excludeFields); + SearchRequest searchRequest = new SearchRequest(indexArr); + searchRequest.source(searchSourceBuilder); + try { + return client.search(searchRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + throw new ServiceException("高级检索,全文检索服务器异常"); + } + } +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/service/SearchService.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/service/SearchService.java new file mode 100644 index 0000000..d4264f8 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/service/SearchService.java @@ -0,0 +1,15 @@ +package com.hcframe.es.service; + + +import com.hcframe.base.common.ResultVO; + +import javax.servlet.http.HttpServletRequest; + +public interface SearchService { + + + ResultVO getFullText(HttpServletRequest request, String text, Integer pageNum, Integer pageSize, String indexType); + + + ResultVO expertSearch(HttpServletRequest request, String data, Integer pageNum, Integer pageSize, String indexType); +} diff --git a/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/service/impl/SearchServiceImpl.java b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/service/impl/SearchServiceImpl.java new file mode 100644 index 0000000..c0033c6 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/java/com/hcframe/es/service/impl/SearchServiceImpl.java @@ -0,0 +1,98 @@ +package com.hcframe.es.service.impl; + +import com.alibaba.fastjson.JSON; +import com.hcframe.base.common.ResultVO; +import com.hcframe.es.esmapper.EsMapper; +import com.hcframe.es.service.SearchService; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.common.text.Text; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +@Service +public class SearchServiceImpl implements SearchService { + + @Resource + EsMapper esMapper; + + @Override + public ResultVO getFullText(HttpServletRequest request, String text, Integer pageNum, + Integer pageSize, String indexType) { + // 获取查询索引数组 + String[] indexArr = indexType.split(","); + // 返回结果包含字段的数组,默认返回全部,需要返回全部时,必须传null + String[] includeFields = null; + // 返回结果排除的字段数组,不排除字段时,必须传null + String[] excludeFields = null; + SearchResponse searchResponse = esMapper + .fullTextSearch(text, pageNum, pageSize, + indexArr, includeFields, excludeFields); + // 返回结果 + Map resultMap = new HashMap<>(4); + // 返回结果列表 + List> list = new LinkedList<>(); + // 返回高亮结果列表 + List> highLight = new LinkedList<>(); + // 返回高亮结果 + SearchHits searchHits = searchResponse.getHits(); + for (SearchHit searchHit : searchHits) { + // 获取搜索结果转换成map + Map dataMap = searchHit.getSourceAsMap(); + // 将map存入返回结果列表 + list.add(dataMap); + // 获取高亮字段 + Map highlightFields = searchHit.getHighlightFields(); + Map highLightMap = new HashMap<>(highlightFields.size()); + for (Map.Entry entry : highlightFields.entrySet()) { + HighlightField highlight = highlightFields.get(entry.getKey()); + Text[] fragments = highlight.fragments(); + String fragmentString = fragments[0].string(); + highLightMap.put(entry.getKey(), fragmentString); + } + // 将高亮字段存入高亮List + highLight.add(highLightMap); + } + // 结果列表 + resultMap.put("list", list); + // 高亮列表 + resultMap.put("highLight", highLight); + // 返回总数 + resultMap.put("total", searchHits.getTotalHits()); + return ResultVO.getSuccess(resultMap); + } + + @Override + public ResultVO expertSearch(HttpServletRequest request, String data, Integer pageNum, + Integer pageSize, String indexType) { + Map map = JSON.parseObject(data); + // 返回结果包含字段的数组,默认返回全部 + String[] includeFields = new String[]{}; + // 返回结果排除的字段数组 + String[] excludeFields = new String[]{}; + // 将查询条件传给es + SearchResponse searchResponse = esMapper.expertSearch(map,pageNum,pageSize,indexType,includeFields,excludeFields); + // 得到返回结果中的查询条件 + SearchHits searchHits = searchResponse.getHits(); + // 返回结果的List + List> list = new LinkedList<>(); + // 遍历返回结果并放入返回结果list中 + for (SearchHit searchHit : searchHits) { + list.add(searchHit.getSourceAsMap()); + } + // 返回结果Map + Map resultMap = new HashMap<>(); + // 将数据放入返回结果Map + resultMap.put("total", searchHits.getTotalHits()); + resultMap.put("list", list); + return ResultVO.getSuccess(resultMap); + } +} diff --git a/hcframe-parent/hcframe-es/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/hcframe-parent/hcframe-es/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..5518005 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,8 @@ +{ + "properties": [ + { + "name": "spring.data.cluster-nodes", + "type": "java.lang.String", + "description": "Description for spring.data.cluster-nodes." + } +] } \ No newline at end of file diff --git a/hcframe-parent/hcframe-es/src/main/resources/application.yml b/hcframe-parent/hcframe-es/src/main/resources/application.yml new file mode 100644 index 0000000..c7cd0d9 --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/resources/application.yml @@ -0,0 +1,115 @@ +server: + port: 8080 + servlet: + context-path: /es +spring: + cache: + # redis缓存 + # type: redis + # redis: + # time-to-live: 1d + # use-key-prefix: true + # cache-null-values: true + # key-prefix: cache. + # ehcache缓存 + type: ehcache + ehcache: + config: classpath:ehcache.xml + application: + name: cloud-elasticsearch + elasticsearch: + rest: + # es 地址,如果有多个地址,则逗号隔开 + uris: http://192.168.4.119:9200 + # 若有用户名密码,在此设置, + username: elastic + password: Y2l70uQ7l3Lu9n2tSIn1Bq39 + # 若不使用redis需要注释掉此类信息 + redis: + database: 0 + host: 192.168.100.145 + port: 6379 + password: root + lettuce: + pool: + # 连接池中的最大空闲连接 默认8 + max-idle: 8 + # 连接池中的最小空闲连接 默认0 + min-idle: 0 + # 连接池最大连接数 默认8 ,负数表示没有限制 + max-active: 8 + # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1 + max-wait: -1 + timeout: 30000 + mvc: + view: + prefix: /templates/ + suffix: .html + static-path-pattern: /static/** + datasource: + type: com.alibaba.druid.pool.DruidDataSource + # url: jdbc:mysql://192.168.100.145:3306/common?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + url: jdbc:mysql://127.0.0.1:3306/common?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + #使用Druid数据源 + initialSize: 5 + # 初始化大小,最小,最大 + minIdle: 5 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + validationQuery: select 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 +mybatis: + mapper-locations: classpath*:mapping/**/*.xml + type-aliases-package: com.common.common.entity +logging: + level: + com.common.common.dao : debug +# 是否开启redis 用户登录,若开启此项,需要配置redis节点及相关配置,若不开启,需要注释掉redis相关配置信息 +isRedisLogin: false +# 用户登陆超时设置,单位为小时,此值不能为0 +login-time-out: 4 +# swagger配置 +swagger: + # 配置controller包路径 + path: com.common.common.controller + # 是否开启权限 + enableAuth: false + # 用户名 + username: admin + # 密码 + password: admin +# Druid连接配置 +druid: + # Druid用户名 + username: test + # Druid密码 + password: test + # Druid 允许访问的IP,默认全部允许 + # allow: 127.0.0.1 + # Druid 拒绝访问的IP,默认不拒绝全部 +# deny: 10.0.0.2 +# 是否开启controller日志监控 +show-controller-log: false +eureka: + client: + service-url: + defaultZone: http://admin:123456@192.168.4.119:8080/eureka/ + + diff --git a/hcframe-parent/hcframe-es/src/main/resources/banner.txt b/hcframe-parent/hcframe-es/src/main/resources/banner.txt new file mode 100644 index 0000000..0b703cf --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/resources/banner.txt @@ -0,0 +1,25 @@ + __ __ ______ ______ +| \ | \ / \ / \ +| $$ | $$| $$$$$$\ | $$$$$$\ ______ ______ ______ ____ ______ +| $$__| $$| $$ \$$ | $$_ \$$/ \ | \ | \ \ / \ +| $$ $$| $$ | $$ \ | $$$$$$\ \$$$$$$\| $$$$$$\$$$$\| $$$$$$\ +| $$$$$$$$| $$ __ | $$$$ | $$ \$$/ $$| $$ | $$ | $$| $$ $$ +| $$ | $$| $$__/ \ | $$ | $$ | $$$$$$$| $$ | $$ | $$| $$$$$$$$ __ +| $$ | $$ \$$ $$ | $$ | $$ \$$ $$| $$ | $$ | $$ \$$ \| \ + \$$ \$$ \$$$$$$ \$$ \$$ \$$$$$$$ \$$ \$$ \$$ \$$$$$$$ \$$ + + + + + __ __ _______ __ __ +| \ | \ | \ | \ | \ +| $$\ | $$ ______ | $$$$$$$\ __ __ ______ | $$ | $$ ______ ______ ______ +| $$$\| $$ / \ | $$__/ $$| \ | \ / \ | $$__| $$ / \ / \ / \ +| $$$$\ $$| $$$$$$\ | $$ $$| $$ | $$| $$$$$$\ | $$ $$| $$$$$$\| $$$$$$\| $$$$$$\ +| $$\$$ $$| $$ | $$ | $$$$$$$\| $$ | $$| $$ | $$ | $$$$$$$$| $$ | $$| $$ | $$| $$ $$ +| $$ \$$$$| $$__/ $$ | $$__/ $$| $$__/ $$| $$__| $$ | $$ | $$| $$__/ $$| $$__/ $$| $$$$$$$$ __ +| $$ \$$$ \$$ $$ | $$ $$ \$$ $$ \$$ $$ | $$ | $$ \$$ $$| $$ $$ \$$ \| \ + \$$ \$$ \$$$$$$ \$$$$$$$ \$$$$$$ _\$$$$$$$ \$$ \$$ \$$$$$$ | $$$$$$$ \$$$$$$$ \$$ + | \__| $$ | $$ + \$$ $$ | $$ + \$$$$$$ \$$ \ No newline at end of file diff --git a/hcframe-parent/hcframe-es/src/main/resources/ehcache.xml b/hcframe-parent/hcframe-es/src/main/resources/ehcache.xml new file mode 100644 index 0000000..1b8b88f --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/resources/ehcache.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hcframe-parent/hcframe-es/src/main/resources/generatorConfig.xml b/hcframe-parent/hcframe-es/src/main/resources/generatorConfig.xml new file mode 100644 index 0000000..6d83fde --- /dev/null +++ b/hcframe-parent/hcframe-es/src/main/resources/generatorConfig.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+
\ No newline at end of file diff --git a/hcframe-parent/hcframe-starter/pom.xml b/hcframe-parent/hcframe-starter/pom.xml new file mode 100644 index 0000000..1dc2edd --- /dev/null +++ b/hcframe-parent/hcframe-starter/pom.xml @@ -0,0 +1,36 @@ + + + + parent + com.hcframe + 1.0-SNAPSHOT + + 4.0.0 + + hcframe-starter + 1.0-SNAPSHOT + + + 8 + 8 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + + + org.junit.vintage + junit-vintage-engine + + + test + + + diff --git a/hcframe-parent/hcframe-user/pom.xml b/hcframe-parent/hcframe-user/pom.xml index 1479bd3..af850e8 100644 --- a/hcframe-parent/hcframe-user/pom.xml +++ b/hcframe-parent/hcframe-user/pom.xml @@ -22,19 +22,9 @@ 1.2.1-SNAPSHOT - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-test - - - org.junit.vintage - junit-vintage-engine - - - test + com.hcframe + hcframe-starter + 1.0-SNAPSHOT diff --git a/hcframe-parent/pom.xml b/hcframe-parent/pom.xml index 5f24293..27a6def 100644 --- a/hcframe-parent/pom.xml +++ b/hcframe-parent/pom.xml @@ -17,6 +17,9 @@ hcframe-base hcframe-user storage + hcframe-activiti + hcframe-es + hcframe-starter 8 @@ -25,15 +28,4 @@ - - - - - - - - - - - diff --git a/lib/Dm7JdbcDriver18.jar b/lib/Dm7JdbcDriver18.jar new file mode 100644 index 0000000..deb4562 Binary files /dev/null and b/lib/Dm7JdbcDriver18.jar differ diff --git a/lib/ojdbc6.jar b/lib/ojdbc6.jar new file mode 100644 index 0000000..767eba7 Binary files /dev/null and b/lib/ojdbc6.jar differ