集成flowable的单测
package com.insgeek.platform.flow.service.test; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.insgeek.boot.web.vo.ResponseVO; import com.insgeek.platform.flow.pojo.dto.*; import com.insgeek.platform.flow.redis.RedisService; import com.insgeek.platform.flow.test.config.FlowTestContextConfiguration; import com.insgeek.platform.flow.utils.test.FlowTestUtils; import com.insgeek.protocol.platform.data.client.ConditionClient; import com.insgeek.protocol.platform.data.client.DataClient; import com.insgeek.protocol.platform.data.dto.ComputedDto; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatcher; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import com.insgeek.boot.web.auth.dto.IdentityDto; import com.insgeek.boot.web.context.IdentityContext; import com.insgeek.platform.flow.aggservice.ExtensionAggService; import com.insgeek.platform.flow.aggservice.FlowDataAggService; import com.insgeek.platform.flow.aggservice.FlowMetadataAggService; import com.insgeek.platform.flow.enums.ElementTypeEnum; import com.insgeek.platform.flow.service.ExtensionService; import com.insgeek.platform.flow.service.ProcessModelService; import com.insgeek.platform.flow.service.ProcessService; import com.insgeek.protocol.flow.dto.TaskActionEnum; import com.insgeek.protocol.flow.dto.TaskActionRequestDto; import org.springframework.boot.test.mock.mockito.MockBean; import javax.annotation.Resource; import javax.sql.DataSource; @Slf4j @FlowTestContextConfiguration public class FlowTest { @Autowired private ProcessService processService; @Autowired private ProcessModelService processModelService; @Autowired private ExtensionAggService extensionAggService; @Autowired private ExtensionService extensionService; @Autowired private FlowMetadataAggService flowMetadataAggService; @Autowired private FlowDataAggService flowDataAggService; @MockBean private RedisService redisService; @Resource private ConditionClient conditionClient; @Resource private DataClient dataClient; @Resource private DataSource dataSource; public static final String BUSINESS_TYPE = "vipCase"; private static final String DESCRIPTION = "测试流程_Holley"; private static final String ENTITY_KEY = "ig_claim_list"; private static final String NAME = "name:test_holley"; private static final int PROCESS_TYPE = 0; private static final int SEQ_NO = 0; public static final Long DATA_ID = 8000002L; @BeforeEach public void beforeClass() throws Exception { // Connection connection = dataSource.getConnection(); // try { // ClassPathResource classPathResource = new ClassPathResource("ig_platform_flow.sql"); // connection = dataSource.getConnection(); // ScriptRunner runner = new ScriptRunner(connection); // runner.setErrorLogWriter(null); // runner.setLogWriter(null); // // 执行SQL脚本 // runner.runScript(new InputStreamReader(classPathResource.getInputStream(), "utf-8")); // // 关闭连接 // connection.close(); // // 若成功,打印提示信息 // System.out.println("====== SUCCESS ======"); // } catch (Exception e) { // log.error(e.getMessage()); // } finally { // if (connection != null) { // connection.close(); // } // } IdentityDto identity = new IdentityDto(); identity.setUserId(1997l); identity.setTenantId(2014l); IdentityContext.setIdentity(identity); } @Test public void testCreateProcessAndModel() { ResponseVO<Map<String, Object>> response2VO = new ResponseVO<Map<String, Object>>(); response2VO.setData(new HashMap<String,Object>()); response2VO.getData().put("id", FlowTest.DATA_ID); response2VO.getData().put("business_type", FlowTest.BUSINESS_TYPE); response2VO.getData().put("tenant_id", ProcessServiceTest.TENANT_ID); Mockito.when(dataClient.getDataById(Mockito.any(), Mockito.argThat(new DataIdMatcher()))).thenReturn(response2VO); Mockito.when(redisService.setNx(Mockito.anyString(), Mockito.any(), Mockito.anyLong())).thenReturn(true); //创建process Long processId = createProcessTest(); System.out.println("流程头信息id===" + processId); //创建流程实体 Long modelId = createModelTest(processId); System.out.println("流程实体id===" + modelId); // 发布流程 boolean deploymentTest = deploymentTest(modelId); System.out.println("是否发布成功:" + deploymentTest); Assert.assertTrue(deploymentTest); // 计算条件 ResponseVO<List<ComputedDto>> computedResultVo = new ResponseVO<>(); List<ComputedDto> computedResult = new ArrayList<>(); ComputedDto computedDto = new ComputedDto(); // 非重开 computedDto.setId(839L); computedDto.setValue(Boolean.TRUE); computedResult.add(computedDto); ComputedDto computedDto2 = new ComputedDto(); // 重开 computedDto2.setId(840L); computedDto2.setValue(Boolean.FALSE); computedResult.add(computedDto2); // 审核通过 (TPA后网关) ComputedDto computedDto3 = new ComputedDto(); computedDto3.setId(876L); computedDto3.setValue(Boolean.TRUE); computedResult.add(computedDto3); // 【审核通过】垫付-非转化 (初审+理算后网关) ComputedDto computedDto4 = new ComputedDto(); computedDto4.setId(866L); computedDto4.setValue(Boolean.TRUE); computedResult.add(computedDto4); computedResultVo.setData(computedResult); Mockito.when(conditionClient.batchComputeByConditionIds(Mockito.argThat(new DataIdMatcher()),Mockito.any())).thenReturn(computedResultVo); // 提交流程 ProcessModelDto findProcessModel = processModelService.findProcessModel(modelId); System.out.println(findProcessModel.getDefinitionId()); submitTest(); // 获取下一节点信息 // TaskWithCandidateUserDto nextTask = extensionAggService.getNextTask(modelId, "a8daed57-3a95-11eb-9388-5405db0ee29c", "", DATA_ID); // System.out.println(nextTask); // 推进节点 TaskActionRequestDto taskActionRequestDto = new TaskActionRequestDto(); taskActionRequestDto.setDataId(DATA_ID); taskActionRequestDto.setEntityKey(ENTITY_KEY); taskActionRequestDto.setAssigner(1l); forwordTest(taskActionRequestDto); // 撤回 withdrawTest(); } /** * 创建流程 */ public Long createProcessTest() { ProcessDto processDto = new ProcessDto(); processDto.setBusinessType(BUSINESS_TYPE); processDto.setDescription(DESCRIPTION); processDto.setEntityKey(ENTITY_KEY); processDto.setName(NAME); processDto.setProcessType(PROCESS_TYPE); processDto.setSeqNo(SEQ_NO); Long processId = processService.createProcess(processDto); return processId; } /** * 创建流程实体 */ public Long createModelTest(Long processId) { ProcessModelDto processModelDto = new ProcessModelDto(); processModelDto.setProcessId(processId); processModelDto.setName(NAME); processModelDto.setBusinessType(BUSINESS_TYPE); processModelDto.setDescription(DESCRIPTION); processModelDto.setEntityKey(ENTITY_KEY); String json = FlowTestUtils.readJsonFile(FlowTestUtils.VIP_CASE_JSON_PATH); FlowConfigDto flowConfig = FlowTestUtils.getFlowConfigDto(json); processModelDto.setModelEditorJson(flowConfig.getBpmnJson().toString()); Long modelId = processModelService.createProcessModel(processModelDto); //更新流程实例 boolean res = flowMetadataAggService.updateModel(modelId, flowConfig); Assert.assertTrue(res); return modelId; } /** * 创建配置信息 */ public void createModelConfig(Long modelId) { // 创建扩展信息 ExtensionConfigDto extensionConfig = new ExtensionConfigDto(); // 顺序流配置 List<ExtensionSequenceFlowDto> sequenceFlows = new ArrayList<ExtensionSequenceFlowDto>(); ExtensionSequenceFlowDto extensionSequenceFlowDto1 = new ExtensionSequenceFlowDto(); extensionSequenceFlowDto1.setConditionId(1l); extensionSequenceFlowDto1.setElementId("element_id"); extensionSequenceFlowDto1.setElementType(ElementTypeEnum.EXCLUSIVE_GATEWAY.getValue()); extensionSequenceFlowDto1.extensionElementModel(modelId); sequenceFlows.add(extensionSequenceFlowDto1); extensionConfig.setSequenceFlows(sequenceFlows); // 用户任务配置 List<ExtensionUserTaskDto> userTasks = new ArrayList<ExtensionUserTaskDto>(); extensionConfig.setUserTasks(userTasks); // 服务任务配置 List<ExtensionServiceTaskDto> serviceTasks = new ArrayList<ExtensionServiceTaskDto>(); extensionConfig.setServiceTasks(serviceTasks); // 事件配置 ExtensionModelConfigDto modelConfig = new ExtensionModelConfigDto(); extensionConfig.setModelConfig(modelConfig); extensionService.upsertExtensionConfig(modelId, extensionConfig); } /** * 发布测试 */ public boolean deploymentTest(Long modelId) { return flowMetadataAggService.enableModel(modelId); } /** * 创建流程实例 提交阶段没有流程实例,根据dataId及entityKey启动流程实例 */ public void submitTest() { TaskActionRequestDto taskAction = new TaskActionRequestDto(); taskAction.setDataId(DATA_ID); taskAction.setEntityKey(ENTITY_KEY); // 提交 TaskActionMappingEnum.valueOf(0) == SUBMIT taskAction.setActionType(TaskActionEnum.SUBMIT.getValue()); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("days", 4); taskAction.setVariables(variables); flowDataAggService.complete(taskAction); } /** * 审批测试:提交下一节点 */ public void forwordTest(TaskActionRequestDto taskAction) { // TaskActionMappingEnum.valueOf(1) == AGREE taskAction.setActionType(TaskActionEnum.AGREE.getValue()); flowDataAggService.complete(taskAction); } /** * 回退测试 */ public void taskRejectTest(TaskActionRequestDto taskAction) { taskAction.setActionType(TaskActionEnum.REJECT.getValue());// TaskActionMappingEnum.valueOf(2) == REJECT flowDataAggService.complete(taskAction); } /** * 撤回测试 */ public void withdrawTest() { TaskActionRequestDto taskAction = new TaskActionRequestDto(); taskAction.setDataId(DATA_ID); taskAction.setEntityKey(ENTITY_KEY); taskAction.setActionType(TaskActionEnum.WITHDRAW.getValue()); // WITHDRAW flowDataAggService.complete(taskAction); } /** * 单步撤回测试 */ public void withdrawStepTest(String definitionId) { TaskActionRequestDto taskAction = new TaskActionRequestDto(); taskAction.setDataId(DATA_ID); // taskAction.setDefinitionId(definitionId); taskAction.setEntityKey(ENTITY_KEY); taskAction.setActionType(4);// TaskActionMappingEnum.valueOf(4) == // WITHDRAW_STEP flowDataAggService.complete(taskAction); } /** * 挂起测试 */ public void suspendTest(TaskActionRequestDto taskAction) { taskAction.setActionType(TaskActionEnum.SUSPEND.getValue());// TaskActionMappingEnum.valueOf(5) == // SUSPEND flowDataAggService.complete(taskAction); } /** * 激活测试 */ public void activeTest(TaskActionRequestDto taskAction) { taskAction.setActionType(TaskActionEnum.ACTIVE.getValue());// TaskActionMappingEnum.valueOf(6) == // ACTIVE flowDataAggService.complete(taskAction); } /** * 转办/委托测试DELEGATE */ public void delegateTest(TaskActionRequestDto taskAction) { taskAction.setActionType(TaskActionEnum.DELEGATE.getValue());// TaskActionMappingEnum.valueOf(7) == // ACTIVE flowDataAggService.complete(taskAction); } /** * 加签PLUS_SIGN */ public void plussignTest(TaskActionRequestDto taskAction) { taskAction.setActionType(TaskActionEnum.PLUS_SIGN.getValue());// TaskActionMappingEnum.valueOf(8) == // PLUS_SIGN flowDataAggService.complete(taskAction); } /** * 终止TERMINATE */ public void terminalTest(TaskActionRequestDto taskAction) { taskAction.setActionType(TaskActionEnum.TERMINATE.getValue());// TaskActionMappingEnum.valueOf(9) == // TERMINATE flowDataAggService.complete(taskAction); } // 匹配对应的dataId class DataIdMatcher implements ArgumentMatcher<Long> { @Override public boolean matches(Long arg0) { return DATA_ID.equals(arg0); } } /** * 单测执行成功后清除数据库 **/ @AfterEach public void cleanH2() { try{ Connection connection = dataSource.getConnection();//获取连接 //获取表名 // ResultSet tables = connection.getMetaData().getTables(null, null, null, new String[]{"TABLE"}); // while(tables.next()){ // //若是测试类的测试方法超过7,java.sql.Connection无法获取连接导致死循环 // PreparedStatement preparedStatement = connection.prepareStatement("Drop Table " + tables.getObject("TABLE_NAME")); // preparedStatement.execute(); // } connection.prepareStatement("SHUTDOWN ").execute(); log.info("关闭数据库"); //记得关闭连接,或者使用连接池 connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
集成flowable时,数据表分为两种:
1.flowable自身需要的表结构
2.自定义表结构
使用内存式数据库进行单测时,设置flowable自动创建自身需要的表结构,通过执行sql初始化自定义的表结构
flowable的配置
flowable: idm.enabled: false form.enabled: false cmmn.enabled: false dmn.enabled: false database-schema-update: create-drop db-history-used: true database-schema: PUBLIC rest-api-enabled: false async-executor-activate: false
自定义表结构的sql
/******************************************/ /* 流程定义 */ /******************************************/ DROP TABLE IF EXISTS `p_process`; CREATE TABLE `p_process` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(256) NOT NULL COMMENT '名称', `entity_key` varchar(128) NOT NULL COMMENT '关联的实体apiKey', `business_type` VARCHAR(50) DEFAULT '' COMMENT '业务类型', `description` VARCHAR(4000) DEFAULT '' COMMENT '描述', `seq_no` tinyint(2) DEFAULT '1' COMMENT '顺序号', `process_type` tinyint(2) DEFAULT '1' COMMENT '流程类型, 1-工作流 2-审批流', `tenant_id` bigint(20) NOT NULL COMMENT '租户主键', `created_by` bigint(20) NOT NULL COMMENT '创建⼈', `updated_by` bigint(20) COMMENT '更新⼈', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp COMMENT '更新时间' ); /******************************************/ /* 流程版本 */ /******************************************/ DROP TABLE IF EXISTS `p_process_model`; CREATE TABLE `p_process_model` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(256) NOT NULL COMMENT '名称', `process_id` bigint(20) NOT NULL COMMENT '关联的流程定义主键', `entity_key` varchar(128) NOT NULL COMMENT '关联的实体apiKey', `business_type` VARCHAR(50) DEFAULT '' COMMENT '业务类型', `definition_id` VARCHAR(100) DEFAULT '' COMMENT 'flowable中流程定义的主键', `deployment_id` VARCHAR(100) DEFAULT '' COMMENT 'flowable中流程部署的主键', `definition_key` VARCHAR(100) DEFAULT '' COMMENT 'flowable中流程定义的key', `description` VARCHAR(4000) DEFAULT '' COMMENT '描述', `model_editor_json` LONGTEXT COMMENT '模型设计json', `thumbnail` LONGBLOB COMMENT '', `status` tinyint(2) DEFAULT '0' COMMENT '状态, 0-设计中 1-启用 2-禁用', `version` tinyint(4) DEFAULT '1' COMMENT '版本', `withdraw_type` tinyint(1) DEFAULT '1' COMMENT '撤回类型, 0-不支持 1-支持 2-支持单步', `tenant_id` bigint(20) NOT NULL COMMENT '租户主键', `created_by` bigint(20) NOT NULL COMMENT '创建⼈', `updated_by` bigint(20) COMMENT '更新⼈', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp COMMENT '更新时间' ); /******************************************/ /* 事件映射 */ /******************************************/ DROP TABLE IF EXISTS `p_extension_event`; CREATE TABLE `p_extension_event` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `element_id` varchar(256) NOT NULL COMMENT '节点id', `model_id` bigint(20) NOT NULL COMMENT '关联的流程版本主键', `event_id` bigint(20) NOT NULL COMMENT '关联的事件主键', `condition_id` bigint(20) DEFAULT NULL COMMENT '关联的条件主键', `button_id` bigint(20) DEFAULT NULL COMMENT '关联的按钮主键', `action_type` tinyint(2) DEFAULT '0' COMMENT '动作类型', `timing_type` tinyint(2) DEFAULT '0' COMMENT '时机类型 0-前事件 1-后事件', `tenant_id` bigint(20) NOT NULL COMMENT '租户主键', `created_by` bigint(20) NOT NULL COMMENT '创建⼈', `updated_by` bigint(20) COMMENT '更新⼈', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp COMMENT '更新时间' ); /******************************************/ /* 任务按钮 */ /******************************************/ DROP TABLE IF EXISTS `p_extension_button`; CREATE TABLE `p_extension_button` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(256) NOT NULL COMMENT '按钮名称', `element_id` varchar(256) NOT NULL COMMENT '节点id', `model_id` bigint(20) NOT NULL COMMENT '关联的流程版本主键', `action_type` tinyint(2) DEFAULT '0' COMMENT '动作类型', `reject_action` tinyint(2) DEFAULT '0' COMMENT '拒绝后动作', `reject_task_definition_key` varchar(256) DEFAULT NULL COMMENT '拒绝后目标节点id', `definition_id` varchar(256) DEFAULT NULL COMMENT '流程定义id', `tenant_id` bigint(20) NOT NULL COMMENT '租户主键', `created_by` bigint(20) NOT NULL COMMENT '创建⼈', `updated_by` bigint(20) COMMENT '更新⼈', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp COMMENT '更新时间' ); /******************************************/ /* 选人策略 */ /******************************************/ DROP TABLE IF EXISTS `p_extension_assignment`; CREATE TABLE `p_extension_assignment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `element_id` varchar(256) NOT NULL COMMENT '节点id', `model_id` bigint(20) NOT NULL COMMENT '关联的流程版本主键', `candidate_type` tinyint(2) DEFAULT '0' COMMENT '选人类型', `candidate_detail` varchar(256) DEFAULT NULL COMMENT '选人详情', `tenant_id` bigint(20) NOT NULL COMMENT '租户主键', `created_by` bigint(20) NOT NULL COMMENT '创建⼈', `updated_by` bigint(20) COMMENT '更新⼈', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp COMMENT '更新时间' ); /******************************************/ /* 扩展元素 */ /******************************************/ DROP TABLE IF EXISTS `p_extension_element`; CREATE TABLE `p_extension_element` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `element_id` varchar(256) NOT NULL COMMENT '节点id', `model_id` bigint(20) NOT NULL COMMENT '关联的流程版本主键', `element_type` tinyint(2) DEFAULT '0' COMMENT '节点元素类型', `extension_json` varchar(2000) NOT NULL COMMENT '扩展属性', `tenant_id` bigint(20) NOT NULL COMMENT '租户主键', `created_by` bigint(20) NOT NULL COMMENT '创建⼈', `updated_by` bigint(20) COMMENT '更新⼈', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` timestamp COMMENT '更新时间' ); -- 1.事件表 DROP TABLE IF EXISTS `p_event`; CREATE TABLE `p_event` ( `id` bigint(20) NOT NULL COMMENT '主键', `name` varchar(50) NOT NULL COMMENT '事件名称', `type` tinyint(5) NOT NULL COMMENT '事件类型 1-短信,2-微信,3-邮件,4-业务', `type_mapping_id` bigint(20) DEFAULT NULL COMMENT '消息id/交互业务id', `tenant_id` bigint(20) NOT NULL COMMENT '组织id', `entity_key` varchar(128) NOT NULL COMMENT '业务对象主键', `business_type` varchar(128) NOT NULL COMMENT '业务对象类型', `delete_flg` tinyint(5) NOT NULL COMMENT '删除标识', `description` varchar(200) NOT NULL COMMENT '说明', `created_by` bigint(20) NOT NULL COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) DEFAULT NULL COMMENT '更新人', `updated_at` timestamp COMMENT '更新时间' ); -- 2.消息接收人表 DROP TABLE IF EXISTS `p_message_receiver`; CREATE TABLE `p_message_receiver` ( `id` bigint(20) NOT NULL COMMENT '主键', `tenant_id` bigint(20) NOT NULL COMMENT '组织id', `event_id` bigint(20) NOT NULL COMMENT '事件id', `type` tinyint(5) NOT NULL COMMENT '接受人类型 1-对象字段指定,2-流程相关用户,3-指定用户', `expression` varchar(200) NOT NULL COMMENT '取值表达式', `created_by` bigint(20) NOT NULL COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) COMMENT '更新人', `updated_at` timestamp DEFAULT NULL COMMENT '更新时间' ); -- 3.消息字段映射表 改为字段映射表 DROP TABLE IF EXISTS `p_item_mapping`; CREATE TABLE `p_item_mapping` ( `id` bigint(20) NOT NULL COMMENT '主键', `tenant_id` bigint(20) NOT NULL COMMENT '组织id', `event_id` bigint(20) NOT NULL COMMENT '事件id', `item_name` varchar(200) NOT NULL COMMENT '字段名', `item_value` varchar(200) NOT NULL COMMENT '字段值', `type` tinyint(5) NOT NULL COMMENT '字段值类型:1-实际值、2-数据中心表达式、3-流程中心表达式', `created_by` bigint(20) NOT NULL COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) COMMENT '更新人', `updated_at` timestamp DEFAULT NULL COMMENT '更新时间' ); -- 4.执行事件日志表 DROP TABLE IF EXISTS `p_event_log`; CREATE TABLE `p_event_log` ( `id` bigint(20) NOT NULL COMMENT '主键', `tenant_id` bigint(20) NOT NULL COMMENT '组织id', `event_id` bigint(20) NOT NULL COMMENT '事件id', `data_id` bigint(20) NOT NULL COMMENT '数据id', `request` text NOT NULL COMMENT '传入参数', `response` text NOT NULL COMMENT '传出参数', `failure_reason` varchar(250) NOT NULL COMMENT '失败原因', `result` boolean NOT NULL COMMENT '执行结果', `request_time` timestamp NOT NULL COMMENT '请求时间', `created_by` bigint(20) NOT NULL COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) COMMENT '更新人', `updated_at` timestamp DEFAULT NULL COMMENT '更新时间' ); -- 5.交互业务表 DROP TABLE IF EXISTS `p_interact_business`; CREATE TABLE `p_interact_business` ( `id` bigint(20) NOT NULL COMMENT '主键', `name` varchar(100) NOT NULL COMMENT '交互业务名称', `type` tinyint(5) NOT NULL COMMENT '交互业务类型1-事件', `schema` tinyint(5) NOT NULL COMMENT '协议1-http,2-https', `domain` varchar(100) NOT NULL COMMENT '域', `path` varchar(200) NOT NULL COMMENT '路径', `method` varchar(50) NOT NULL COMMENT '请求方式', `request_schema` varchar(50) COMMENT '请求协议(暂无处理)', `response_schema` varchar(50) COMMENT '响应协议(暂无处理)', `tenant_id` bigint(20) NOT NULL COMMENT '所属租户', `created_by` bigint(20) NOT NULL COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) COMMENT '更新人', `updated_at` timestamp DEFAULT NULL COMMENT '更新时间' ); /** 添加事件执行流水记录表 */ DROP TABLE IF EXISTS `p_event_record`; CREATE TABLE `p_event_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint(20) NOT NULL COMMENT '组织id', `action_type` tinyint(2) NOT NULL COMMENT '操作类型', `event_id` bigint(20) NOT NULL COMMENT '事件id', `event_type` tinyint(5) NOT NULL COMMENT '事件类型', `event_name` varchar(50) COMMENT '事件名称', `timing_type` tinyint(5) COMMENT '事件执行边界', `execute_type` tinyint(5) COMMENT '事件执行方式,异步/同步', `retry_count` int(11) COMMENT '事件重试次数', `entity_key` varchar(50) COMMENT '实体id', `data_id` bigint(20) COMMENT '数据id', `condition_id` bigint(20) COMMENT '事件执行条件id', `condition_result` tinyint(1) DEFAULT '0' COMMENT '事件条件执行结果', `condition_status` tinyint(5) DEFAULT NULL COMMENT '条件执行状态', `process_instance_id` varchar(100) COMMENT '流程实例id', `process_definition_id` varchar(100) COMMENT '流程定义Id', `task_definition_key` varchar(100) COMMENT '任务节点id', `next_task_definition_key` varchar(100) DEFAULT NULL COMMENT '下一节点taskKey', `task_name` varchar(50) DEFAULT NULL COMMENT '任务节点名称', `mq_message_tag` varchar(50) COMMENT '事件报文在mq上的messageTag', `send_message_status` tinyint(5) DEFAULT '2' COMMENT '事件报文发送状态', `mq_message_id` varchar(50) DEFAULT NULL COMMENT '事件消息在mq上的id', `event_execute_status` tinyint(5) DEFAULT '0' COMMENT '事件执行状态', `result` varchar(200) DEFAULT NULL COMMENT '事件执行结果', `created_by` bigint(20) COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) DEFAULT NULL COMMENT '更新人', `updated_at` timestamp DEFAULT NULL COMMENT '更新时间' ); DROP TABLE IF EXISTS `p_event_record_detail`; CREATE TABLE `p_event_record_detail` ( `id` bigint(20) NOT NULL COMMENT '主键', `tenant_id` bigint(20) NOT NULL COMMENT '组织id', `record_id` bigint(20) NOT NULL COMMENT '流水记录id:p_event_record:id', `event_id` bigint(20) NOT NULL COMMENT '事件id', `event_type` tinyint(5) NOT NULL COMMENT '事件类型', `event_name` varchar(50) COMMENT '事件名称', `timing_type` tinyint(5) DEFAULT NULL COMMENT '事件执行边界', `execute_type` tinyint(5) COMMENT '事件执行方式,异步/同步', `fail_rollback` tinyint(5) NOT NULL DEFAULT 1 COMMENT '同步事件回滚标记:0:回滚;1:不回滚', `retry_count` int(11) COMMENT '事件重试次数', `condition_id` bigint(20) COMMENT '事件执行条件id', `condition_status` tinyint(5) DEFAULT NULL COMMENT '条件执行状态 0:未执行;1:执行异常;2:执行成功', `mq_message_tag` varchar(50) COMMENT '异步事件报文在mq上的messageTag', `mq_message_id` varchar(64) DEFAULT NULL COMMENT '事件消息在mq上的id', `execute_required` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否需要执行该事件', `event_execute_status` tinyint(5) DEFAULT '0' COMMENT '事件执行状态', `event_execute_result` varchar(1000) DEFAULT NULL COMMENT '事件执行结果', `created_by` bigint(20) COMMENT '创建人', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` bigint(20) DEFAULT NULL COMMENT '更新人', `updated_at` timestamp DEFAULT NULL COMMENT '更新时间' ); --添加事件执行方式 ALTER TABLE `p_event` ADD ( execute_type tinyint(1) NOT NULL DEFAULT 2 COMMENT '事件执行方式:1:异步执行;2同步执行', fail_rollback tinyint(1) NOT NULL DEFAULT 1 COMMENT '同步事件失败回滚标记:0:回滚;1:不回滚', delay_delivery_time int(11) NOT NULL DEFAULT 0 COMMENT '事件延迟执行时间(单位秒)' ); ALTER TABLE `p_event` ADD (request_source tinyint(5) NOT NULL DEFAULT 0 COMMENT '事件请求来源:0.普通事件,1.流程事件',execute_order int(3) NOT NULL DEFAULT 0 COMMENT '执行顺序:数字越小,优先级越高'); ALTER TABLE `p_event_log` ADD request_source tinyint(5) NOT NULL DEFAULT 0 COMMENT '事件请求来源:0.普通事件,1.流程事件'; ALTER TABLE `p_event_record` ADD request varchar(1000) NOT NULL DEFAULT '' COMMENT '普通事件的参数'; ALTER TABLE `p_event_record_detail` ADD request_source tinyint(5) NOT NULL DEFAULT 0 COMMENT '事件请求来源:0.普通事件,1.流程事件';
配置内存数据库H2
import javax.sql.DataSource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; /** * @author jiangliangyou * @date 2020-07-08 */ @Slf4j @Configuration @Profile("test") public class TestBeanConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setName("ig_platform_flow;MODE=MySQL;DATABASE_TO_UPPER=true;") .setType(EmbeddedDatabaseType.H2) .addScript("classpath:custom_flow.sql") .build(); } }
注意:当有多个单测时,每测试一个类就会重新初始化数据库及配置,此时需要在单测中,添加执行后方法,用来关闭内存数据库,不然在执行下一个单测的初始化时,会报错(表结构xxxx已存在,不能创建xxxx)