Browse Source

遗漏了测试类

jason 3 years ago
parent
commit
1c266988c5

+ 39 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/BaseDbUnitTest.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.adminserver;
+
+import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
+import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
+import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+
+/**
+ * 依赖内存 DB 的单元测试
+ *
+ * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法
+ *
+ * @author 芋道源码
+ */
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
+@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
+@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
+public class BaseDbUnitTest {
+
+    @Import({
+            // DB 配置类
+            YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类
+            DataSourceAutoConfiguration.class, // Spring DB 自动配置类
+            DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
+            DruidDataSourceAutoConfigure.class, // Druid 自动配置类
+            // MyBatis 配置类
+            YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
+            MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
+    })
+    public static class Application {
+    }
+
+}

+ 146 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmFormServiceTest.java

@@ -0,0 +1,146 @@
+package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormCreateReqVO;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormPageReqVO;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.form.BpmFormUpdateReqVO;
+import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmFormMapper;
+import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmFormFieldRespDTO;
+import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmFormServiceImpl;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.FORM_NOT_EXISTS;
+import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link BpmFormServiceImpl} 的单元测试类
+ *
+ * @author 芋道源码
+ */
+@Import(BpmFormServiceImpl.class)
+public class BpmFormServiceTest extends BaseDbUnitTest {
+
+    @Resource
+    private BpmFormServiceImpl formService;
+
+    @Resource
+    private BpmFormMapper formMapper;
+
+    @Test
+    public void testCreateForm_success() {
+        // 准备参数
+        BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> {
+            o.setConf("{}");
+            o.setFields(randomFields());
+        });
+
+        // 调用
+        Long formId = formService.createForm(reqVO);
+        // 断言
+        assertNotNull(formId);
+        // 校验记录的属性是否正确
+        BpmFormDO form = formMapper.selectById(formId);
+        assertPojoEquals(reqVO, form);
+    }
+
+    @Test
+    public void testUpdateForm_success() {
+        // mock 数据
+        BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> {
+            o.setConf("{}");
+            o.setFields(randomFields());
+        });
+        formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> {
+            o.setId(dbForm.getId()); // 设置更新的 ID
+            o.setConf("{'yudao': 'yuanma'}");
+            o.setFields(randomFields());
+        });
+
+        // 调用
+        formService.updateForm(reqVO);
+        // 校验是否更新正确
+        BpmFormDO form = formMapper.selectById(reqVO.getId()); // 获取最新的
+        assertPojoEquals(reqVO, form);
+    }
+
+    @Test
+    public void testUpdateForm_notExists() {
+        // 准备参数
+        BpmFormUpdateReqVO reqVO = randomPojo(BpmFormUpdateReqVO.class, o -> {
+            o.setConf("{'yudao': 'yuanma'}");
+            o.setFields(randomFields());
+        });
+
+        // 调用, 并断言异常
+        assertServiceException(() -> formService.updateForm(reqVO), FORM_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteForm_success() {
+        // mock 数据
+        BpmFormDO dbForm = randomPojo(BpmFormDO.class);
+        formMapper.insert(dbForm);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbForm.getId();
+
+        // 调用
+        formService.deleteForm(id);
+        // 校验数据不存在了
+        assertNull(formMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteForm_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> formService.deleteForm(id), FORM_NOT_EXISTS);
+    }
+
+    @Test
+    public void testGetFormPage() {
+        // mock 数据
+        BpmFormDO dbForm = randomPojo(BpmFormDO.class, o -> { // 等会查询到
+            o.setName("芋道源码");
+        });
+        formMapper.insert(dbForm);
+        // 测试 name 不匹配
+        formMapper.insert(cloneIgnoreId(dbForm, o -> o.setName("源码")));
+        // 准备参数
+        BpmFormPageReqVO reqVO = new BpmFormPageReqVO();
+        reqVO.setName("芋道");
+
+        // 调用
+        PageResult<BpmFormDO> pageResult = formService.getFormPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbForm, pageResult.getList().get(0));
+    }
+
+    private List<String> randomFields() {
+        int size = RandomUtil.randomInt(1, 3);
+        return Stream.iterate(0, i -> i).limit(size)
+                .map(i -> JsonUtils.toJsonString(randomPojo(BpmFormFieldRespDTO.class)))
+                .collect(Collectors.toList());
+    }
+
+}

+ 134 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmUserGroupServiceTest.java

@@ -0,0 +1,134 @@
+package cn.iocoder.yudao.adminserver.modules.bpm.service.definition;
+
+import cn.hutool.core.date.DateUtil;
+import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO;
+import cn.iocoder.yudao.adminserver.modules.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO;
+import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmUserGroupDO;
+import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmUserGroupMapper;
+import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.impl.BpmUserGroupServiceImpl;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.date.DateUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.USER_GROUP_NOT_EXISTS;
+import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+* {@link BpmUserGroupServiceImpl} 的单元测试类
+*
+* @author 芋道源码
+*/
+@Import(BpmUserGroupServiceImpl.class)
+public class BpmUserGroupServiceTest extends BaseDbUnitTest {
+
+    @Resource
+    private BpmUserGroupServiceImpl userGroupService;
+
+    @Resource
+    private BpmUserGroupMapper userGroupMapper;
+
+    @Test
+    public void testCreateUserGroup_success() {
+        // 准备参数
+        BpmUserGroupCreateReqVO reqVO = randomPojo(BpmUserGroupCreateReqVO.class);
+
+        // 调用
+        Long userGroupId = userGroupService.createUserGroup(reqVO);
+        // 断言
+        assertNotNull(userGroupId);
+        // 校验记录的属性是否正确
+        BpmUserGroupDO userGroup = userGroupMapper.selectById(userGroupId);
+        assertPojoEquals(reqVO, userGroup);
+    }
+
+    @Test
+    public void testUpdateUserGroup_success() {
+        // mock 数据
+        BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class);
+        userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class, o -> {
+            o.setId(dbUserGroup.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        userGroupService.updateUserGroup(reqVO);
+        // 校验是否更新正确
+        BpmUserGroupDO userGroup = userGroupMapper.selectById(reqVO.getId()); // 获取最新的
+        assertPojoEquals(reqVO, userGroup);
+    }
+
+    @Test
+    public void testUpdateUserGroup_notExists() {
+        // 准备参数
+        BpmUserGroupUpdateReqVO reqVO = randomPojo(BpmUserGroupUpdateReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteUserGroup_success() {
+        // mock 数据
+        BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class);
+        userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbUserGroup.getId();
+
+        // 调用
+        userGroupService.deleteUserGroup(id);
+       // 校验数据不存在了
+       assertNull(userGroupMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteUserGroup_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userGroupService.deleteUserGroup(id), USER_GROUP_NOT_EXISTS);
+    }
+
+    @Test
+    public void testGetUserGroupPage() {
+       // mock 数据
+       BpmUserGroupDO dbUserGroup = randomPojo(BpmUserGroupDO.class, o -> { // 等会查询到
+           o.setName("芋道源码");
+           o.setStatus(CommonStatusEnum.ENABLE.getStatus());
+           o.setCreateTime(DateUtils.buildTime(2021, 11, 11));
+       });
+       userGroupMapper.insert(dbUserGroup);
+       // 测试 name 不匹配
+       userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setName("芋道")));
+       // 测试 status 不匹配
+       userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
+       // 测试 createTime 不匹配
+       userGroupMapper.insert(cloneIgnoreId(dbUserGroup, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12))));
+       // 准备参数
+       BpmUserGroupPageReqVO reqVO = new BpmUserGroupPageReqVO();
+       reqVO.setName("源码");
+       reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
+       reqVO.setBeginCreateTime(DateUtils.buildTime(2021, 11, 10));
+       reqVO.setEndCreateTime(DateUtils.buildTime(2021, 11, 12));
+
+       // 调用
+       PageResult<BpmUserGroupDO> pageResult = userGroupService.getUserGroupPage(reqVO);
+       // 断言
+       assertEquals(1, pageResult.getTotal());
+       assertEquals(1, pageResult.getList().size());
+       assertPojoEquals(dbUserGroup, pageResult.getList().get(0));
+    }
+
+}

+ 38 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application-unit-test.yaml

@@ -0,0 +1,38 @@
+spring:
+  main:
+    lazy-initialization: true # 开启懒加载,加快速度
+    banner-mode: off # 单元测试,禁用 Banner
+
+--- #################### 数据库相关配置 ####################
+
+spring:
+  # 数据源配置项
+  datasource:
+    name: ruoyi-vue-pro
+    url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
+    driver-class-name: org.h2.Driver
+    username: sa
+    password:
+    schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具
+    druid:
+      async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
+      initial-size: 1 # 单元测试,配置为 1,提升启动速度
+
+mybatis:
+  lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
+
+--- #################### 定时任务相关配置 ####################
+
+--- #################### 配置中心相关配置 ####################
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项(单元测试,禁用 Lock4j)
+
+# Resilience4j 配置项
+
+--- #################### 监控相关配置 ####################
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置

+ 35 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/application.yaml

@@ -0,0 +1,35 @@
+spring:
+  application:
+    name: yudao-module-bpm-service
+
+  # Jackson 配置项
+  jackson:
+    serialization:
+      write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
+      write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
+      write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
+      fail-on-empty-beans: false # 允许序列化无属性的 Bean
+
+# MyBatis Plus 的配置项
+mybatis-plus:
+  configuration:
+    map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志
+  global-config:
+    db-config:
+      id-type: AUTO # 自增 ID
+      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+  mapper-locations: classpath*:mapper/*.xml
+  type-aliases-package: ${yudao.core-service.base-package}.modules.*.dal.dataobject
+
+--- #################### 芋道相关配置 ####################
+
+yudao:
+  info:
+    version: 1.0.0
+    base-package: cn.iocoder.yudao.adminserver
+  core-service:
+    base-package: cn.iocoder.yudao.coreservice
+
+debug: false

+ 4 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/logback-spring.xml

@@ -0,0 +1,4 @@
+<configuration>
+    <!-- 引用 Spring Boot 的 logback 基础配置 -->
+    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
+</configuration>

+ 38 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/clean.sql

@@ -0,0 +1,38 @@
+-- inf 开头的 DB
+DELETE FROM "inf_config";
+DELETE FROM "inf_file";
+DELETE FROM "inf_job";
+DELETE FROM "inf_job_log";
+DELETE FROM "inf_api_access_log";
+DELETE FROM "inf_api_error_log";
+
+-- sys 开头的 DB
+DELETE FROM "sys_dept";
+DELETE FROM "sys_dict_data";
+DELETE FROM "sys_role";
+DELETE FROM "sys_role_menu";
+DELETE FROM "sys_menu";
+DELETE FROM "sys_user_role";
+DELETE FROM "sys_dict_type";
+DELETE FROM "sys_user_session";
+DELETE FROM "sys_post";
+DELETE FROM "sys_login_log";
+DELETE FROM "sys_operate_log";
+DELETE FROM "sys_user";
+DELETE FROM "sys_sms_channel";
+DELETE FROM "sys_sms_template";
+DELETE FROM "sys_sms_log";
+DELETE FROM "sys_error_code";
+DELETE FROM "sys_social_user";
+DELETE FROM "sys_tenant";
+
+-- pay 开头的 DB
+DELETE FROM pay_merchant;
+DELETE FROM pay_app;
+DELETE FROM pay_channel;
+DELETE FROM pay_order;
+DELETE FROM pay_refund;
+
+-- bpm 开头的 DB
+DELETE FROM "bpm_form";
+DELETE FROM "bpm_user_group";

+ 624 - 0
yudao-module-bpm/yudao-module-bpm-activiti/src/test/resources/sql/create_tables.sql

@@ -0,0 +1,624 @@
+-- inf 开头的 DB
+
+CREATE TABLE IF NOT EXISTS "inf_config" (
+    "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "group" varchar(50) NOT NULL,
+    "type" tinyint NOT NULL,
+    "name" varchar(100) NOT NULL DEFAULT '',
+    "key" varchar(100) NOT NULL DEFAULT '',
+    "value" varchar(500) NOT NULL DEFAULT '',
+    "sensitive" bit NOT NULL,
+    "remark" varchar(500) DEFAULT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '参数配置表';
+
+CREATE TABLE IF NOT EXISTS "inf_file" (
+    "id" varchar(188) NOT NULL,
+    "type" varchar(63) DEFAULT NULL,
+    "content" blob NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint not null default  '0',
+    PRIMARY KEY ("id")
+) COMMENT '文件表';
+
+CREATE TABLE IF NOT EXISTS "inf_job" (
+    "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号',
+    "name" varchar(32) NOT NULL COMMENT '任务名称',
+    "status" tinyint(4) NOT NULL COMMENT '任务状态',
+    "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
+    "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数',
+    "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式',
+    "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数',
+    "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔',
+    "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间',
+    "creator" varchar(64) DEFAULT '' COMMENT '创建者',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    "updater" varchar(64) DEFAULT '' COMMENT '更新者',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除',
+    PRIMARY KEY ("id")
+) COMMENT='定时任务表';
+
+CREATE TABLE IF NOT EXISTS "inf_job_log" (
+    "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号',
+    "job_id" bigint(20) NOT NULL COMMENT '任务编号',
+    "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
+    "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数',
+    "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行',
+    "begin_time" datetime NOT NULL COMMENT '开始执行时间',
+    "end_time" datetime DEFAULT NULL COMMENT '结束执行时间',
+    "duration" int(11) DEFAULT NULL COMMENT '执行时长',
+    "status" tinyint(4) NOT NULL COMMENT '任务状态',
+    "result" varchar(4000) DEFAULT '' COMMENT '结果数据',
+    "creator" varchar(64) DEFAULT '' COMMENT '创建者',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    "updater" varchar(64) DEFAULT '' COMMENT '更新者',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除',
+    PRIMARY KEY ("id")
+)COMMENT='定时任务日志表';
+
+-- sys 开头的 DB
+
+CREATE TABLE IF NOT EXISTS "sys_dept" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(30) NOT NULL DEFAULT '',
+    "parent_id" bigint NOT NULL DEFAULT '0',
+    "sort" int NOT NULL DEFAULT '0',
+    "leader_user_id" bigint DEFAULT NULL,
+    "phone" varchar(11) DEFAULT NULL,
+    "email" varchar(50) DEFAULT NULL,
+    "status" tinyint NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint not null default  '0',
+    PRIMARY KEY ("id")
+) COMMENT '部门表';
+
+CREATE TABLE IF NOT EXISTS "sys_dict_data" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "sort" int NOT NULL DEFAULT '0',
+    "label" varchar(100) NOT NULL DEFAULT '',
+    "value" varchar(100) NOT NULL DEFAULT '',
+    "dict_type" varchar(100) NOT NULL DEFAULT '',
+    "status" tinyint NOT NULL DEFAULT '0',
+    "remark" varchar(500) DEFAULT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '字典数据表';
+
+CREATE TABLE IF NOT EXISTS "sys_role" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(30) NOT NULL,
+    "code" varchar(100) NOT NULL,
+    "sort" int NOT NULL,
+    "data_scope" tinyint NOT NULL DEFAULT '1',
+    "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '',
+    "status" tinyint NOT NULL,
+    "type" tinyint NOT NULL,
+    "remark" varchar(500) DEFAULT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '角色信息表';
+
+CREATE TABLE IF NOT EXISTS "sys_role_menu" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "role_id" bigint NOT NULL,
+    "menu_id" bigint NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '角色和菜单关联表';
+
+CREATE TABLE IF NOT EXISTS "sys_menu" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(50) NOT NULL,
+    "permission" varchar(100) NOT NULL DEFAULT '',
+    "menu_type" tinyint NOT NULL,
+    "sort" int NOT NULL DEFAULT '0',
+    "parent_id" bigint NOT NULL DEFAULT '0',
+    "path" varchar(200) DEFAULT '',
+    "icon" varchar(100) DEFAULT '#',
+    "component" varchar(255) DEFAULT NULL,
+    "status" tinyint NOT NULL DEFAULT '0',
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '菜单权限表';
+
+CREATE TABLE IF NOT EXISTS "sys_user_role" (
+     "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+     "user_id" bigint NOT NULL,
+     "role_id" bigint NOT NULL,
+     "creator" varchar(64) DEFAULT '',
+     "create_time" timestamp DEFAULT NULL,
+     "updater" varchar(64) DEFAULT '',
+     "update_time" timestamp DEFAULT NULL,
+     "deleted" bit DEFAULT FALSE,
+     PRIMARY KEY ("id")
+) COMMENT '用户和角色关联表';
+
+CREATE TABLE IF NOT EXISTS "sys_dict_type" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(100) NOT NULL DEFAULT '',
+    "type" varchar(100) NOT NULL DEFAULT '',
+    "status" tinyint NOT NULL DEFAULT '0',
+    "remark" varchar(500) DEFAULT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '字典类型表';
+
+CREATE TABLE IF NOT EXISTS `sys_user_session` (
+    `id` varchar(32) NOT NULL,
+    `user_id` bigint DEFAULT NULL,
+    "user_type" tinyint NOT NULL,
+    `username` varchar(50) NOT NULL DEFAULT '',
+    `user_ip` varchar(50) DEFAULT NULL,
+    `user_agent` varchar(512) DEFAULT NULL,
+    `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `updater` varchar(64) DEFAULT '' ,
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint not null default  '0',
+    PRIMARY KEY (`id`)
+) COMMENT '用户在线 Session';
+
+CREATE TABLE IF NOT EXISTS "sys_post" (
+    "id"          bigint      NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "code"        varchar(64) NOT NULL,
+    "name"        varchar(50) NOT NULL,
+    "sort"        integer     NOT NULL,
+    "status"      tinyint     NOT NULL,
+    "remark"      varchar(500)         DEFAULT NULL,
+    "creator"     varchar(64)          DEFAULT '',
+    "create_time" timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater"     varchar(64)          DEFAULT '',
+    "update_time" timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted"     bit         NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint not null default  '0',
+    PRIMARY KEY ("id")
+) COMMENT '岗位信息表';
+
+CREATE TABLE IF NOT EXISTS "sys_notice" (
+	"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+	"title" varchar(50) NOT NULL COMMENT '公告标题',
+	"content" text NOT NULL COMMENT '公告内容',
+	"notice_type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)',
+	"status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
+	"creator" varchar(64) DEFAULT '' COMMENT '创建者',
+	"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+	"updater" varchar(64) DEFAULT '' COMMENT '更新者',
+	"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+	"deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除',
+    "tenant_id" bigint not null default  '0',
+    PRIMARY KEY("id")
+) COMMENT '通知公告表';
+
+CREATE TABLE IF NOT EXISTS `sys_login_log` (
+    `id`          bigint(20)   NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    `log_type`    bigint(4)    NOT NULL,
+    "user_id" bigint not null default '0',
+    "user_type" tinyint NOT NULL,
+    `trace_id`    varchar(64)  NOT NULL DEFAULT '',
+    `username`    varchar(50)  NOT NULL DEFAULT '',
+    `result`      tinyint(4)   NOT NULL,
+    `user_ip`     varchar(50)  NOT NULL,
+    `user_agent`  varchar(512) NOT NULL,
+    `creator`   varchar(64)           DEFAULT '',
+    `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `updater`   varchar(64)           DEFAULT '',
+    `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `deleted`     bit(1)       NOT NULL DEFAULT '0',
+    PRIMARY KEY (`id`)
+) COMMENT ='系统访问记录';
+
+CREATE TABLE IF NOT EXISTS `sys_operate_log` (
+    `id`               bigint(20)    NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    `trace_id`         varchar(64)   NOT NULL DEFAULT '',
+    `user_id`          bigint(20)    NOT NULL,
+    `module`           varchar(50)   NOT NULL,
+    `name`             varchar(50)   NOT NULL,
+    `operate_type`     bigint(4)     NOT NULL DEFAULT '0',
+    `content`          varchar(2000) NOT NULL DEFAULT '',
+    `exts`             varchar(512)  NOT NULL DEFAULT '',
+    `request_method`   varchar(16)            DEFAULT '',
+    `request_url`      varchar(255)           DEFAULT '',
+    `user_ip`          varchar(50)            DEFAULT NULL,
+    `user_agent`       varchar(200)           DEFAULT NULL,
+    `java_method`      varchar(512)  NOT NULL DEFAULT '',
+    `java_method_args` varchar(8000)          DEFAULT '',
+    `start_time`       datetime      NOT NULL,
+    `duration`         int(11)       NOT NULL,
+    `result_code`      int(11)       NOT NULL DEFAULT '0',
+    `result_msg`       varchar(512)           DEFAULT '',
+    `result_data`      varchar(4000)          DEFAULT '',
+    `creator`        varchar(64)            DEFAULT '',
+    `create_time`      datetime      NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `updater`        varchar(64)            DEFAULT '',
+    `update_time`      datetime      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `deleted`          bit(1)        NOT NULL DEFAULT '0',
+    "tenant_id"         bigint not null default  '0',
+    PRIMARY KEY (`id`)
+) COMMENT ='操作日志记录';
+
+CREATE TABLE IF NOT EXISTS "sys_user" (
+    "id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
+    "username" varchar(30) not null,
+    "password" varchar(100) not null default '',
+    "nickname" varchar(30) not null,
+    "remark" varchar(500) default null,
+    "dept_id" bigint default null,
+    "post_ids" varchar(255) default null,
+    "email" varchar(50) default '',
+    "mobile" varchar(11) default '',
+    "sex" tinyint default '0',
+    "avatar" varchar(100) default '',
+    "status" tinyint not null default '0',
+    "login_ip" varchar(50) default '',
+    "login_date" timestamp default null,
+    "creator" varchar(64) default '',
+    "create_time" timestamp not null default current_timestamp,
+    "updater" varchar(64) default '',
+    "update_time" timestamp not null default current_timestamp,
+    "deleted" bit not null default false,
+    "tenant_id" bigint not null default  '0',
+    primary key ("id")
+) comment '用户信息表';
+
+CREATE TABLE IF NOT EXISTS "inf_api_access_log" (
+  "id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
+  "trace_id" varchar(64) not null default '',
+  "user_id" bigint not null default '0',
+  "user_type" tinyint not null default '0',
+  "application_name" varchar(50) not null,
+  "request_method" varchar(16) not null default '',
+  "request_url" varchar(255) not null default '',
+  "request_params" varchar(8000) not null default '',
+  "user_ip" varchar(50) not null,
+  "user_agent" varchar(512) not null,
+  "begin_time" timestamp not null,
+  "end_time" timestamp not null,
+  "duration" integer not null,
+  "result_code" integer not null default '0',
+  "result_msg" varchar(512) default '',
+  "creator" varchar(64) default '',
+  "create_time" timestamp not null default current_timestamp,
+  "updater" varchar(64) default '',
+  "update_time" timestamp not null default current_timestamp,
+  "deleted" bit not null default false,
+  "tenant_id" bigint not null default  '0',
+  primary key ("id")
+) COMMENT 'API 访问日志表';
+
+CREATE TABLE IF NOT EXISTS "inf_api_error_log" (
+ "id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
+ "trace_id" varchar(64) not null,
+ "user_id" bigint not null default '0',
+ "user_type" tinyint not null default '0',
+ "application_name" varchar(50) not null,
+ "request_method" varchar(16) not null,
+ "request_url" varchar(255) not null,
+ "request_params" varchar(8000) not null,
+ "user_ip" varchar(50) not null,
+ "user_agent" varchar(512) not null,
+ "exception_time" timestamp not null,
+ "exception_name" varchar(128) not null default '',
+ "exception_message" clob not null,
+ "exception_root_cause_message" clob not null,
+ "exception_stack_trace" clob not null,
+ "exception_class_name" varchar(512) not null,
+ "exception_file_name" varchar(512) not null,
+ "exception_method_name" varchar(512) not null,
+ "exception_line_number" integer not null,
+ "process_status" tinyint not null,
+ "process_time" timestamp default null,
+ "process_user_id" bigint default '0',
+ "creator" varchar(64) default '',
+ "create_time" timestamp not null default current_timestamp,
+ "updater" varchar(64) default '',
+ "update_time" timestamp not null default current_timestamp,
+ "deleted" bit not null default false,
+ "tenant_id" bigint not null default  '0',
+ primary key ("id")
+) COMMENT '系统异常日志';
+
+CREATE TABLE IF NOT EXISTS "sys_sms_channel" (
+   "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+   "signature" varchar(10) NOT NULL,
+   "code" varchar(63) NOT NULL,
+   "status" tinyint NOT NULL,
+   "remark" varchar(255) DEFAULT NULL,
+   "api_key" varchar(63) NOT NULL,
+   "api_secret" varchar(63) DEFAULT NULL,
+   "callback_url" varchar(255) DEFAULT NULL,
+   "creator" varchar(64) DEFAULT '',
+   "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+   "updater" varchar(64) DEFAULT '',
+   "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+   "deleted" bit NOT NULL DEFAULT FALSE,
+   PRIMARY KEY ("id")
+) COMMENT '短信渠道';
+
+CREATE TABLE IF NOT EXISTS "sys_sms_template" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "type" tinyint NOT NULL,
+    "status" tinyint NOT NULL,
+    "code" varchar(63) NOT NULL,
+    "name" varchar(63) NOT NULL,
+    "content" varchar(255) NOT NULL,
+    "params" varchar(255) NOT NULL,
+    "remark" varchar(255) DEFAULT NULL,
+    "api_template_id" varchar(63) NOT NULL,
+    "channel_id" bigint NOT NULL,
+    "channel_code" varchar(63) NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '短信模板';
+
+CREATE TABLE IF NOT EXISTS "sys_sms_log" (
+   "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+   "channel_id" bigint NOT NULL,
+   "channel_code" varchar(63) NOT NULL,
+   "template_id" bigint NOT NULL,
+   "template_code" varchar(63) NOT NULL,
+   "template_type" tinyint NOT NULL,
+   "template_content" varchar(255) NOT NULL,
+   "template_params" varchar(255) NOT NULL,
+   "api_template_id" varchar(63) NOT NULL,
+   "mobile" varchar(11) NOT NULL,
+   "user_id" bigint DEFAULT '0',
+   "user_type" tinyint DEFAULT '0',
+   "send_status" tinyint NOT NULL DEFAULT '0',
+   "send_time" timestamp DEFAULT NULL,
+   "send_code" int DEFAULT NULL,
+   "send_msg" varchar(255) DEFAULT NULL,
+   "api_send_code" varchar(63) DEFAULT NULL,
+   "api_send_msg" varchar(255) DEFAULT NULL,
+   "api_request_id" varchar(255) DEFAULT NULL,
+   "api_serial_no" varchar(255) DEFAULT NULL,
+   "receive_status" tinyint NOT NULL DEFAULT '0',
+   "receive_time" timestamp DEFAULT NULL,
+   "api_receive_code" varchar(63) DEFAULT NULL,
+   "api_receive_msg" varchar(255) DEFAULT NULL,
+   "creator" varchar(64) DEFAULT '',
+   "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+   "updater" varchar(64) DEFAULT '',
+   "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+   "deleted" bit NOT NULL DEFAULT FALSE,
+   PRIMARY KEY ("id")
+) COMMENT '短信日志';
+
+CREATE TABLE IF NOT EXISTS "sys_error_code" (
+  "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+  "type" tinyint NOT NULL DEFAULT '0',
+  "application_name" varchar(50) NOT NULL,
+  "code" int NOT NULL DEFAULT '0',
+  "message" varchar(512) NOT NULL DEFAULT '',
+  "memo" varchar(512) DEFAULT '',
+  "creator" varchar(64) DEFAULT '',
+  "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  "updater" varchar(64) DEFAULT '',
+  "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  "deleted" bit NOT NULL DEFAULT FALSE,
+  PRIMARY KEY ("id")
+) COMMENT '错误码表';
+
+CREATE TABLE IF NOT EXISTS "sys_social_user" (
+   "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+   "user_id" bigint NOT NULL,
+   "user_type" tinyint NOT NULL DEFAULT '0',
+   "type" tinyint NOT NULL,
+   "openid" varchar(32) NOT NULL,
+   "token" varchar(256) DEFAULT NULL,
+   "union_id" varchar(32) NOT NULL,
+   "raw_token_info" varchar(1024) NOT NULL,
+   "nickname" varchar(32) NOT NULL,
+   "avatar" varchar(255) DEFAULT NULL,
+   "raw_user_info" varchar(1024) NOT NULL,
+   "creator" varchar(64) DEFAULT '',
+   "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+   "updater" varchar(64) DEFAULT '',
+   "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+   "deleted" bit NOT NULL DEFAULT FALSE,
+   PRIMARY KEY ("id")
+) COMMENT '社交用户';
+
+CREATE TABLE IF NOT EXISTS "sys_tenant" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(63) NOT NULL,
+    "contact_name" varchar(255) NOT NULL,
+    "contact_mobile" varchar(255),
+    "status" tinyint NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '租户';
+
+
+CREATE TABLE IF NOT EXISTS "pay_merchant"
+(
+    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "no"          varchar(32) NOT NULL,
+    "name"        varchar(64) NOT NULL,
+    "short_name"  varchar(64) NOT NULL,
+    "status"      tinyint     NOT NULL,
+    "remark"      varchar(255)         DEFAULT NULL,
+    "creator"     varchar(64)          DEFAULT '',
+    "create_time" datetime    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater"     varchar(64)          DEFAULT '',
+    "update_time" datetime    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted"     bit(1)      NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '支付商户信息';
+
+-- bpm 开头的 DB
+
+CREATE TABLE IF NOT EXISTS "pay_app" (
+    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name"              varchar(64)   NOT NULL,
+    "status"            tinyint       NOT NULL,
+    "remark"            varchar(255)           DEFAULT NULL,
+    `pay_notify_url`    varchar(1024) NOT NULL,
+    `refund_notify_url` varchar(1024) NOT NULL,
+    `merchant_id`       bigint(20)    NOT NULL,
+    "creator"           varchar(64)            DEFAULT '',
+    "create_time"       datetime      NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater"           varchar(64)            DEFAULT '',
+    "update_time"       datetime      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted"           bit(1)        NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT = '支付应用信息';
+
+CREATE TABLE IF NOT EXISTS "pay_channel" (
+    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "code"        varchar(32)    NOT NULL,
+    "status"      tinyint(4)     NOT NULL,
+    "remark"      varchar(255)            DEFAULT NULL,
+    "fee_rate"    double         NOT NULL DEFAULT 0,
+    "merchant_id" bigint(20)     NOT NULL,
+    "app_id"      bigint(20)     NOT NULL,
+    "config"      varchar(10240) NOT NULL,
+    "creator"     varchar(64)    NULL     DEFAULT '',
+    "create_time" datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater"     varchar(64)    NULL     DEFAULT '',
+    "update_time" datetime       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted"     bit(1)         NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT = '支付渠道';
+
+CREATE TABLE IF NOT EXISTS `pay_order` (
+    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    `merchant_id`          bigint(20)    NOT NULL,
+    `app_id`               bigint(20)    NOT NULL,
+    `channel_id`           bigint(20)             DEFAULT NULL,
+    `channel_code`         varchar(32)            DEFAULT NULL,
+    `merchant_order_id`    varchar(64)   NOT NULL,
+    `subject`              varchar(32)   NOT NULL,
+    `body`                 varchar(128)  NOT NULL,
+    `notify_url`           varchar(1024) NOT NULL,
+    `notify_status`        tinyint(4)    NOT NULL,
+    `amount`               bigint(20)    NOT NULL,
+    `channel_fee_rate`     double                 DEFAULT 0,
+    `channel_fee_amount`   bigint(20)             DEFAULT 0,
+    `status`               tinyint(4)    NOT NULL,
+    `user_ip`              varchar(50)   NOT NULL,
+    `expire_time`          datetime(0)   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `success_time`         datetime(0)            DEFAULT CURRENT_TIMESTAMP,
+    `notify_time`          datetime(0)            DEFAULT CURRENT_TIMESTAMP,
+    `success_extension_id` bigint(20)             DEFAULT NULL COMMENT '支付成功的订单拓展单编号',
+    `refund_status`        tinyint(4)    NOT NULL,
+    `refund_times`         tinyint(4)    NOT NULL,
+    `refund_amount`        bigint(20)    NOT NULL,
+    `channel_user_id`      varchar(255)           DEFAULT NULL,
+    `channel_order_no`     varchar(64)            DEFAULT NULL,
+    `creator`              varchar(64)            DEFAULT '',
+    `create_time`          datetime(0)   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `updater`              varchar(64)            DEFAULT '',
+    `update_time`          datetime(0)   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `deleted`              bit(1)        NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT = '支付订单';
+
+CREATE TABLE IF NOT EXISTS `pay_refund` (
+    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    `merchant_id`        bigint(20)    NOT NULL,
+    `app_id`             bigint(20)    NOT NULL,
+    `channel_id`         bigint(20)    NOT NULL,
+    `channel_code`       varchar(32)   NOT NULL,
+    `order_id`           bigint(20)    NOT NULL,
+    `trade_no`           varchar(64)   NOT NULL,
+    `merchant_order_id`  varchar(64)   NOT NULL,
+    `merchant_refund_no` varchar(64)   NOT NULL,
+    `notify_url`         varchar(1024) NOT NULL,
+    `notify_status`      tinyint(4)    NOT NULL,
+    `status`             tinyint(4)    NOT NULL,
+    `type`               tinyint(4)    NOT NULL,
+    `pay_amount`         bigint(20)    NOT NULL,
+    `refund_amount`      bigint(20)    NOT NULL,
+    `reason`             varchar(256)  NOT NULL,
+    `user_ip`            varchar(50)   NULL     DEFAULT NULL,
+    `channel_order_no`   varchar(64)   NOT NULL,
+    `channel_refund_no`  varchar(64)   NULL     DEFAULT NULL,
+    `channel_error_code` varchar(128)  NULL     DEFAULT NULL,
+    `channel_error_msg`  varchar(256)  NULL     DEFAULT NULL,
+    `channel_extras`     varchar(1024) NULL     DEFAULT NULL,
+    `expire_time`        datetime(0)   NULL     DEFAULT NULL,
+    `success_time`       datetime(0)   NULL     DEFAULT NULL,
+    `notify_time`        datetime(0)   NULL     DEFAULT NULL,
+    `creator`            varchar(64)   NULL     DEFAULT '',
+    `create_time`        datetime(0)   NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `updater`            varchar(64)   NULL     DEFAULT '',
+    `update_time`        datetime(0)   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `deleted`            bit(1)        NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT = '退款订单';
+
+-- bpm 开头的 DB
+
+CREATE TABLE IF NOT EXISTS "bpm_form" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(63) NOT NULL,
+    "status" tinyint NOT NULL,
+    "fields" varchar(255) NOT NULL,
+    "conf" varchar(255) NOT NULL,
+    "remark" varchar(255),
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '动态表单';
+
+CREATE TABLE IF NOT EXISTS "bpm_user_group" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar(63) NOT NULL,
+    "description" varchar(255) NOT NULL,
+    "status" tinyint NOT NULL,
+    "member_user_ids" varchar(255) NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+    ) COMMENT '用户组';