You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@seatunnel.apache.org by ki...@apache.org on 2022/07/27 14:45:11 UTC

[incubator-seatunnel] branch dev updated: [seatunnel-1947][seatunnel-server] add scheduler spi & integration with dolphinscheduler. (#2190)

This is an automated email from the ASF dual-hosted git repository.

kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new 31e0a7318 [seatunnel-1947][seatunnel-server] add scheduler spi & integration with dolphinscheduler. (#2190)
31e0a7318 is described below

commit 31e0a73186d2b053101f404b20b48695d4dbd159
Author: dijie <nj...@gmail.com>
AuthorDate: Wed Jul 27 22:45:05 2022 +0800

    [seatunnel-1947][seatunnel-server] add scheduler spi & integration with dolphinscheduler. (#2190)
---
 pom.xml                                            |  11 +
 seatunnel-dist/release-docs/LICENSE                |   1 +
 .../release-docs/licenses/LICENSE-jsoup.txt        |  21 +
 seatunnel-server/pom.xml                           |  11 +
 seatunnel-server/seatunnel-app/pom.xml             |  12 +
 .../apache/seatunnel/app/SeatunnelApplication.java |   2 +-
 .../org/apache/seatunnel/app/common/Result.java    |   2 +
 .../seatunnel/app/controller/ScriptController.java |   8 +
 .../seatunnel/app/controller/TaskController.java   |  65 +++
 .../{IUserDao.java => ISchedulerConfigDao.java}    |  22 +-
 .../dao/{IUserDao.java => IScriptJobApplyDao.java} |  23 +-
 .../org/apache/seatunnel/app/dal/dao/IUserDao.java |   2 +
 .../dao/impl/SchedulerConfigDaoImpl.java}          |  39 +-
 .../seatunnel/app/dal/dao/impl/ScriptDaoImpl.java  |   2 +-
 .../app/dal/dao/impl/ScriptJobApplyDaoImpl.java    |  59 ++
 .../seatunnel/app/dal/dao/impl/UserDaoImpl.java    |   9 +-
 .../IUserDao.java => entity/SchedulerConfig.java}  |  33 +-
 .../IUserDao.java => entity/ScriptJobApply.java}   |  25 +-
 .../SchedulerConfigMapper.java}                    |  24 +-
 .../ScriptJobApplyMapper.java}                     |  24 +-
 .../dto/job/PushScriptDto.java}                    |  28 +-
 .../dto/job/RecycleScriptDto.java}                 |  28 +-
 .../dto/job/ScriptJobApplyDto.java}                |  34 +-
 .../request/script/PublishScriptReq.java}          |  39 +-
 .../request/task/InstanceListReq.java}             |  37 +-
 .../request/task/JobListReq.java}                  |  37 +-
 .../request/task/RecycleScriptReq.java}            |  39 +-
 .../response/task/InstanceSimpleInfoRes.java       |  49 ++
 .../app/domain/response/task/JobSimpleInfoRes.java |  43 ++
 .../seatunnel/app/service/IScriptService.java      |   3 +
 .../IUserDao.java => service/ITaskService.java}    |  27 +-
 .../app/service/impl/ScriptServiceImpl.java        |  25 +-
 .../app/service/impl/TaskServiceImpl.java          | 225 ++++++++
 .../seatunnel/app/util/GlobalExceptionHandler.java |   4 +-
 .../app/dal/mapper/SchedulerConfigMapper.xml       |  71 +++
 .../app/dal/mapper/ScriptJobApplyMapper.xml        |  66 +++
 seatunnel-server/{ => seatunnel-scheduler}/pom.xml |  14 +-
 .../seatunnel-scheduler-dolphinscheduler/pom.xml   |  66 +++
 .../dolphinscheduler/IDolphinschedulerService.java |  56 ++
 .../constants/DolphinschedulerConstants.java       | 173 ++++++
 .../dolphinscheduler/dto/ConditionResult.java}     |  26 +-
 .../dto/ListProcessDefinitionDto.java}             |  29 +-
 .../dto/ListProcessInstanceDto.java}               |  29 +-
 .../dolphinscheduler/dto/LocalParam.java}          |  34 +-
 .../dolphinscheduler/dto/LocationDto.java}         |  29 +-
 .../dto/OnlineCreateResourceDto.java}              |  50 +-
 .../dolphinscheduler/dto/ProcessDefinitionDto.java |  50 ++
 .../dolphinscheduler/dto/ProjectDto.java}          |  28 +-
 .../dolphinscheduler/dto/ResourceDto.java}         |  28 +-
 .../dolphinscheduler/dto/SchedulerDto.java         |  53 ++
 .../dto/StartProcessDefinitionDto.java}            |  39 +-
 .../dolphinscheduler/dto/TaskDefinitionDto.java}   |  46 +-
 .../dolphinscheduler/dto/TaskDescriptionDto.java}  |  38 +-
 .../dolphinscheduler/dto/TaskInstanceDto.java      |  64 +++
 .../dolphinscheduler/dto/TaskParamDto.java}        |  34 +-
 .../dolphinscheduler/dto/TaskRelationDto.java}     |  37 +-
 .../dto/UpdateProcessDefinitionDto.java}           |  38 +-
 .../impl/DolphinschedulerServiceImpl.java          | 621 +++++++++++++++++++++
 .../dolphinscheduler/impl/InstanceServiceImpl.java |  64 +++
 .../dolphinscheduler/impl/JobServiceImpl.java      | 102 ++++
 .../dolphinscheduler/utils/HttpUtils.java          | 173 ++++++
 .../{ => seatunnel-server-common}/pom.xml          |  15 +-
 .../apache/seatunnel/server/common/Constants.java} |  24 +-
 .../apache/seatunnel/server/common/DateUtils.java  |  69 +++
 .../server}/common/SeatunnelErrorEnum.java         |  17 +-
 .../server}/common/SeatunnelException.java         |  10 +-
 seatunnel-server/{ => seatunnel-spi}/pom.xml       |  16 +-
 .../seatunnel/spi/scheduler/IInstanceService.java} |  23 +-
 .../seatunnel/spi/scheduler/IJobService.java}      |  22 +-
 .../seatunnel/spi/scheduler/dto/InstanceDto.java}  |  41 +-
 .../spi/scheduler/dto/InstanceListDto.java}        |  29 +-
 .../spi/scheduler/dto/InstanceLogDto.java}         |  34 +-
 .../seatunnel/spi/scheduler/dto/JobDto.java}       |  39 +-
 .../seatunnel/spi/scheduler/dto/JobListDto.java}   |  29 +-
 .../spi/scheduler/dto/JobSimpleInfoDto.java}       |  38 +-
 .../spi/scheduler/dto/SchedulerConfigDto.java}     |  31 +-
 tools/dependencies/known-dependencies.txt          |   1 +
 77 files changed, 2709 insertions(+), 800 deletions(-)

diff --git a/pom.xml b/pom.xml
index 6f4eac234..693c6db83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -214,11 +214,14 @@
         <jmockdata.version>4.3.0</jmockdata.version>
         <snappy-java.version>1.1.8.3</snappy-java.version>
         <spring-boot.version>2.6.8</spring-boot.version>
+        <spring.version>5.3.20</spring.version>
         <mybatis-spring-boot-starter.version>2.2.2</mybatis-spring-boot-starter.version>
         <druid-spring-boot-starter.version>1.2.9</druid-spring-boot-starter.version>
         <springfox-swagger.version>2.6.1</springfox-swagger.version>
         <swagger-annotations.version>1.5.10</swagger-annotations.version>
         <hibernate.validator.version>6.2.2.Final</hibernate.validator.version>
+        <jsoup.version>1.14.3</jsoup.version>
+        <javax.annotation-api.version>1.3.2</javax.annotation-api.version>
     </properties>
 
     <dependencyManagement>
@@ -922,6 +925,14 @@
                 <artifactId>hibernate-validator</artifactId>
                 <version>${hibernate.validator.version}</version>
             </dependency>
+
+            <!--      http      -->
+            <dependency>
+                <groupId>org.jsoup</groupId>
+                <artifactId>jsoup</artifactId>
+                <version>${jsoup.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
diff --git a/seatunnel-dist/release-docs/LICENSE b/seatunnel-dist/release-docs/LICENSE
index 8191c55a0..8e3f37ff1 100644
--- a/seatunnel-dist/release-docs/LICENSE
+++ b/seatunnel-dist/release-docs/LICENSE
@@ -968,6 +968,7 @@ The text of each license is also included at licenses/LICENSE-[project].txt.
      (MIT License) SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.10 - http://www.slf4j.org)
      (MIT License) SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.15 - http://www.slf4j.org)
      (MIT License) SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.16 - http://www.slf4j.org)
+     (MIT License) jsoup (org.jsoup:jsoup:1.14.3 - https://github.com/jhy/jsoup)
      (MIT) Jedis (redis.clients:jedis:3.2.0 - https://github.com/xetorthio/jedis)
      (MIT-License) spoiwo (com.norbitltd:spoiwo_2.11:1.8.0 - https://github.com/norbert-radyk/spoiwo/)
      (The MIT License (MIT)) influxdb java bindings (org.influxdb:influxdb-java:2.22 - http://www.influxdb.org)
diff --git a/seatunnel-dist/release-docs/licenses/LICENSE-jsoup.txt b/seatunnel-dist/release-docs/licenses/LICENSE-jsoup.txt
new file mode 100644
index 000000000..7a3ed027a
--- /dev/null
+++ b/seatunnel-dist/release-docs/licenses/LICENSE-jsoup.txt
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2009-2022 Jonathan Hedley <https://jsoup.org/>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/seatunnel-server/pom.xml b/seatunnel-server/pom.xml
index dc9361510..36dc537a0 100644
--- a/seatunnel-server/pom.xml
+++ b/seatunnel-server/pom.xml
@@ -27,6 +27,17 @@
     <packaging>pom</packaging>
     <modules>
         <module>seatunnel-app</module>
+        <module>seatunnel-spi</module>
+        <module>seatunnel-scheduler</module>
+        <module>seatunnel-server-common</module>
     </modules>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
 </project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/pom.xml b/seatunnel-server/seatunnel-app/pom.xml
index eeb6b7ced..b9d4c84fd 100644
--- a/seatunnel-server/seatunnel-app/pom.xml
+++ b/seatunnel-server/seatunnel-app/pom.xml
@@ -141,6 +141,18 @@
             <artifactId>scala-library</artifactId>
             <scope>provided</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.seatunnel</groupId>
+            <artifactId>seatunnel-spi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.seatunnel</groupId>
+            <artifactId>seatunnel-scheduler-dolphinscheduler</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/SeatunnelApplication.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/SeatunnelApplication.java
index 757e863fd..4947195fe 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/SeatunnelApplication.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/SeatunnelApplication.java
@@ -25,7 +25,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = {"org.apache.seatunnel.app", "org.apache.seatunnel.scheduler"})
 @EnableTransactionManagement
 @EnableConfigurationProperties
 @EnableScheduling
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/Result.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/Result.java
index 79d7ae12b..e08323ffc 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/Result.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/Result.java
@@ -17,6 +17,8 @@
 
 package org.apache.seatunnel.app.common;
 
+import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
+
 public class Result<T> {
 
     private static final Result<Void> OK = success();
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
index a17d0fc12..bf4133de8 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ScriptController.java
@@ -19,6 +19,7 @@ package org.apache.seatunnel.app.controller;
 
 import org.apache.seatunnel.app.common.Result;
 import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.PublishScriptReq;
 import org.apache.seatunnel.app.domain.request.script.ScriptListReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptContentReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptParamReq;
@@ -103,4 +104,11 @@ public class ScriptController {
     public Result<List<ScriptParamRes>> fetchScriptParam(@RequestParam @NotNull Integer id) {
         return Result.success(iScriptService.fetchScriptParam(id));
     }
+
+    @PutMapping("/publish")
+    @ApiOperation(value = "publish script", httpMethod = "PUT")
+    public Result<Void> publish(@RequestBody @NotNull PublishScriptReq req) {
+        iScriptService.publishScript(req);
+        return Result.success();
+    }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java
new file mode 100644
index 000000000..3a4934c52
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/TaskController.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.app.controller;
+
+import org.apache.seatunnel.app.common.Result;
+import org.apache.seatunnel.app.domain.request.task.InstanceListReq;
+import org.apache.seatunnel.app.domain.request.task.JobListReq;
+import org.apache.seatunnel.app.domain.request.task.RecycleScriptReq;
+import org.apache.seatunnel.app.domain.response.task.InstanceSimpleInfoRes;
+import org.apache.seatunnel.app.domain.response.task.JobSimpleInfoRes;
+import org.apache.seatunnel.app.service.ITaskService;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+
+import java.util.List;
+
+@RequestMapping("/api/v1/task")
+@RestController
+public class TaskController {
+
+    @Resource
+    private ITaskService iTaskService;
+
+    @PutMapping("/recycle")
+    @ApiOperation(value = "recycle script", httpMethod = "PUT")
+    Result<Void> recycle(@RequestBody @NotNull RecycleScriptReq req) {
+        iTaskService.recycleScriptFromScheduler(req);
+        return Result.success();
+    }
+
+    @GetMapping("/listJob")
+    @ApiOperation(value = "list job", httpMethod = "GET")
+    Result<List<JobSimpleInfoRes>> listJob(@RequestBody @NotNull JobListReq req) {
+        return Result.success(iTaskService.listJob(req));
+    }
+
+    @GetMapping("/listInstance")
+    @ApiOperation(value = "list instance", httpMethod = "GET")
+    Result<List<InstanceSimpleInfoRes>> listInstance(@RequestBody @NotNull InstanceListReq req) {
+        return Result.success(iTaskService.listInstance(req));
+    }
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/ISchedulerConfigDao.java
similarity index 63%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/ISchedulerConfigDao.java
index 146771460..1844db15f 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/ISchedulerConfigDao.java
@@ -17,24 +17,10 @@
 
 package org.apache.seatunnel.app.dal.dao;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.app.dal.entity.SchedulerConfig;
 
-import java.util.List;
+public interface ISchedulerConfigDao {
+    boolean exists(int scriptId);
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    SchedulerConfig getSchedulerConfig(int scriptId);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
similarity index 63%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
index 146771460..0efdae262 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
@@ -17,24 +17,11 @@
 
 package org.apache.seatunnel.app.dal.dao;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
+import org.apache.seatunnel.app.domain.dto.job.ScriptJobApplyDto;
 
-import java.util.List;
+public interface IScriptJobApplyDao {
+    void insertOrUpdate(ScriptJobApplyDto dto);
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    ScriptJobApply getByScriptId(Integer id);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
index 146771460..2572efe97 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
@@ -37,4 +37,6 @@ public interface IUserDao {
     void disable(int id);
 
     List<User> list(ListUserDto dto, int pageNo, int pageSize);
+
+    User getById(int operatorId);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelException.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/SchedulerConfigDaoImpl.java
similarity index 50%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelException.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/SchedulerConfigDaoImpl.java
index e68329631..fa78042bd 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelException.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/SchedulerConfigDaoImpl.java
@@ -15,34 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.common;
+package org.apache.seatunnel.app.dal.dao.impl;
 
-import java.util.Arrays;
+import org.apache.seatunnel.app.dal.dao.ISchedulerConfigDao;
+import org.apache.seatunnel.app.dal.entity.SchedulerConfig;
+import org.apache.seatunnel.app.dal.mapper.SchedulerConfigMapper;
 
-public class SeatunnelException extends RuntimeException{
-    private SeatunnelErrorEnum errorEnum;
+import org.springframework.stereotype.Repository;
 
-    public SeatunnelException(SeatunnelErrorEnum e) {
-        super(e.getMsg());
-        this.errorEnum = e;
-    }
-
-    public SeatunnelException(SeatunnelErrorEnum e, String... msg) {
-        super(e.getMsg().concat(" ").concat(Arrays.toString(msg)));
-        this.errorEnum = e;
-    }
+import javax.annotation.Resource;
 
-    public static SeatunnelException newInstance(SeatunnelErrorEnum e, String... msg) {
-        return new SeatunnelException(e, msg);
-
-    }
+import java.util.Objects;
 
-    public static SeatunnelException newInstance(SeatunnelErrorEnum e) {
-        return new SeatunnelException(e);
+@Repository
+public class SchedulerConfigDaoImpl implements ISchedulerConfigDao {
+    @Resource
+    private SchedulerConfigMapper schedulerConfigMapper;
 
+    @Override
+    public boolean exists(int scriptId) {
+        SchedulerConfig config = schedulerConfigMapper.selectByScriptId(scriptId);
+        return Objects.nonNull(config);
     }
 
-    public SeatunnelErrorEnum getErrorEnum() {
-        return errorEnum;
+    @Override
+    public SchedulerConfig getSchedulerConfig(int scriptId) {
+        return schedulerConfigMapper.selectByScriptId(scriptId);
     }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java
index 1a485bec7..d3df27b8f 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptDaoImpl.java
@@ -17,7 +17,7 @@
 
 package org.apache.seatunnel.app.dal.dao.impl;
 
-import static org.apache.seatunnel.app.common.SeatunnelErrorEnum.SCRIPT_ALREADY_EXIST;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.SCRIPT_ALREADY_EXIST;
 import static com.google.common.base.Preconditions.checkState;
 
 import org.apache.seatunnel.app.common.ScriptStatusEnum;
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptJobApplyDaoImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptJobApplyDaoImpl.java
new file mode 100644
index 000000000..1b5b1d50c
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/ScriptJobApplyDaoImpl.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.app.dal.dao.impl;
+
+import org.apache.seatunnel.app.dal.dao.IScriptJobApplyDao;
+import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
+import org.apache.seatunnel.app.dal.mapper.ScriptJobApplyMapper;
+import org.apache.seatunnel.app.domain.dto.job.ScriptJobApplyDto;
+
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+
+import java.util.Objects;
+
+@Repository
+public class ScriptJobApplyDaoImpl implements IScriptJobApplyDao {
+
+    @Resource
+    private ScriptJobApplyMapper scriptJobApplyMapper;
+
+    @Override
+    public void insertOrUpdate(ScriptJobApplyDto dto) {
+        ScriptJobApply apply = scriptJobApplyMapper.selectByScriptId(dto.getScriptId());
+        if (Objects.isNull(apply)) {
+            apply = new ScriptJobApply();
+            apply.setScriptId(dto.getScriptId());
+            apply.setJobId(dto.getJobId());
+            apply.setOperatorId(dto.getUserId());
+            apply.setSchedulerConfigId(dto.getSchedulerConfigId());
+            scriptJobApplyMapper.insert(apply);
+        } else {
+            apply.setJobId(dto.getJobId());
+            apply.setOperatorId(dto.getUserId());
+            apply.setSchedulerConfigId(dto.getSchedulerConfigId());
+            scriptJobApplyMapper.update(apply);
+        }
+    }
+
+    @Override
+    public ScriptJobApply getByScriptId(Integer id) {
+        return scriptJobApplyMapper.selectByScriptId(id);
+    }
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
index 0affd510f..bea735acc 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
@@ -17,8 +17,8 @@
 
 package org.apache.seatunnel.app.dal.dao.impl;
 
-import static org.apache.seatunnel.app.common.SeatunnelErrorEnum.NO_SUCH_USER;
-import static org.apache.seatunnel.app.common.SeatunnelErrorEnum.USER_ALREADY_EXISTS;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_SUCH_USER;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.USER_ALREADY_EXISTS;
 import static com.google.common.base.Preconditions.checkState;
 
 import org.apache.seatunnel.app.common.UserStatusEnum;
@@ -92,4 +92,9 @@ public class UserDaoImpl implements IUserDao {
         user.setUsername(dto.getName());
         return userMapper.selectBySelectiveAndPage(user, pageNo * pageSize, pageSize);
     }
+
+    @Override
+    public User getById(int operatorId) {
+        return userMapper.selectByPrimaryKey(operatorId);
+    }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/SchedulerConfig.java
similarity index 61%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/SchedulerConfig.java
index 146771460..b529c3030 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/SchedulerConfig.java
@@ -15,26 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.dal.entity;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Data;
 
-import java.util.List;
+import java.util.Date;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
+@Data
+public class SchedulerConfig {
+    private Integer id;
 
-    void checkUserExists(String username);
+    private Integer scriptId;
 
-    void update(UpdateUserDto dto);
+    private String triggerExpression;
 
-    void delete(int id);
+    private Integer retryTimes;
 
-    void enable(int id);
+    private Integer retryInterval;
 
-    void disable(int id);
+    private Date activeStartTime;
 
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    private Date activeEndTime;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private Integer creatorId;
+
+    private Integer updateId;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/ScriptJobApply.java
similarity index 61%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/ScriptJobApply.java
index 146771460..d986bc5c3 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/ScriptJobApply.java
@@ -15,26 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.dal.entity;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Data;
 
-import java.util.List;
+import java.util.Date;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
+@Data
+public class ScriptJobApply {
+    private Integer id;
 
-    void checkUserExists(String username);
+    private Integer scriptId;
 
-    void update(UpdateUserDto dto);
+    private Integer schedulerConfigId;
 
-    void delete(int id);
+    private Long jobId;
 
-    void enable(int id);
+    private Integer operatorId;
 
-    void disable(int id);
+    private Date createTime;
 
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    private Date updateTime;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/SchedulerConfigMapper.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/SchedulerConfigMapper.java
index 146771460..ab4ee6cec 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/SchedulerConfigMapper.java
@@ -15,26 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.dal.mapper;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.app.dal.entity.SchedulerConfig;
 
-import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
+public interface SchedulerConfigMapper {
+    int deleteByPrimaryKey(Integer id);
 
-    void checkUserExists(String username);
+    int insert(SchedulerConfig record);
 
-    void update(UpdateUserDto dto);
+    SchedulerConfig selectByPrimaryKey(Integer id);
 
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    SchedulerConfig selectByScriptId(@Param("scriptId") int scriptId);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java
index 146771460..4115fd9ca 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.dal.mapper;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
 
-import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
+public interface ScriptJobApplyMapper {
+    int deleteByPrimaryKey(Integer id);
 
-    void checkUserExists(String username);
+    int insert(ScriptJobApply record);
 
-    void update(UpdateUserDto dto);
+    ScriptJobApply selectByPrimaryKey(Integer id);
 
-    void delete(int id);
+    void update(ScriptJobApply record);
 
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    ScriptJobApply selectByScriptId(@Param("scriptId") int scriptId);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/PushScriptDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/PushScriptDto.java
index 146771460..c17a22bd4 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/PushScriptDto.java
@@ -15,26 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.domain.dto.job;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@Builder
+public class PushScriptDto {
+    private int scriptId;
+    private int userId;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/RecycleScriptDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/RecycleScriptDto.java
index 146771460..b8480a351 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/RecycleScriptDto.java
@@ -15,26 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.domain.dto.job;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Builder
+@Data
+public class RecycleScriptDto {
+    private int scriptId;
+    private int operatorId;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/ScriptJobApplyDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/ScriptJobApplyDto.java
index 146771460..2b1ffe9c3 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/job/ScriptJobApplyDto.java
@@ -15,26 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.app.domain.dto.job;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class ScriptJobApplyDto {
+    private int scriptId;
+    private int schedulerConfigId;
+    private long jobId;
+    private int userId;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/PublishScriptReq.java
similarity index 58%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/PublishScriptReq.java
index 146771460..1b1352f4c 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/PublishScriptReq.java
@@ -15,26 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.app.domain.request.script;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "publishScriptReq", description = "publish script")
+public class PublishScriptReq {
+    @ApiModelProperty(value = "script id", required = true, dataType = "Integer")
+    @NotNull
+    private int scriptId;
+    @ApiModelProperty(value = "operator id", required = true, dataType = "Integer")
+    @NotNull
+    private int operatorId;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/InstanceListReq.java
similarity index 57%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/InstanceListReq.java
index 146771460..461a4f8fd 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/InstanceListReq.java
@@ -15,26 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.app.domain.request.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "listInstanceReq", description = "list instance")
+public class InstanceListReq {
+    @ApiModelProperty(value = "instance name", required = true, dataType = "String")
+    private String name;
+    @ApiModelProperty(value = "page number", required = true, dataType = "Integer")
+    private Integer pageNo;
+    @ApiModelProperty(value = "page size", required = true, dataType = "Integer")
+    private Integer pageSize;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/JobListReq.java
similarity index 58%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/JobListReq.java
index 146771460..544352178 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/JobListReq.java
@@ -15,26 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.app.domain.request.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "listJobReq", description = "list job")
+public class JobListReq {
+    @ApiModelProperty(value = "job name", required = true, dataType = "String")
+    private String name;
+    @ApiModelProperty(value = "page number", required = true, dataType = "Integer")
+    private Integer pageNo;
+    @ApiModelProperty(value = "page size", required = true, dataType = "Integer")
+    private Integer pageSize;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java
similarity index 58%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java
index 146771460..5ee65d637 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java
@@ -15,26 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.app.domain.request.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "recycleScriptReq", description = "recycle script")
+public class RecycleScriptReq {
+    @ApiModelProperty(value = "script id", required = true, dataType = "Integer")
+    @NotNull
+    private int scriptId;
+    @ApiModelProperty(value = "operator id", required = true, dataType = "Integer")
+    @NotNull
+    private int operatorId;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/task/InstanceSimpleInfoRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/task/InstanceSimpleInfoRes.java
new file mode 100644
index 000000000..b47d8b54b
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/task/InstanceSimpleInfoRes.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.app.domain.response.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Builder
+@ApiModel(value = "instanceSimpleInfoRes", description = "instance simple information")
+public class InstanceSimpleInfoRes {
+    @ApiModelProperty(value = "instance id", dataType = "Long")
+    private long instanceId;
+    @ApiModelProperty(value = "instance code", dataType = "Long")
+    private long instanceCode;
+    @ApiModelProperty(value = "instance name", dataType = "String")
+    private String instanceName;
+    @ApiModelProperty(value = "submit time", dataType = "Date")
+    private Date submitTime;
+    @ApiModelProperty(value = "start time", dataType = "Date")
+    private Date startTime;
+    @ApiModelProperty(value = "end time", dataType = "Date")
+    private Date endTime;
+    @ApiModelProperty(value = "task status", dataType = "String")
+    private String status;
+    @ApiModelProperty(value = "execution duration", dataType = "String")
+    private String executionDuration;
+    @ApiModelProperty(value = "retry times", dataType = "Long")
+    private long retryTimes;
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/task/JobSimpleInfoRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/task/JobSimpleInfoRes.java
new file mode 100644
index 000000000..40b003bee
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/task/JobSimpleInfoRes.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.app.domain.response.task;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+@ApiModel(value = "jobSimpleInfoRes", description = "job simple information")
+@Data
+@Builder
+public class JobSimpleInfoRes {
+    @ApiModelProperty(value = "job id", dataType = "Long")
+    private long jobId;
+    @ApiModelProperty(value = "job status", dataType = "String")
+    private String jobStatus;
+    @ApiModelProperty(value = "job creator", dataType = "String")
+    private String creatorName;
+    @ApiModelProperty(value = "job mender", dataType = "String")
+    private String menderName;
+    @ApiModelProperty(value = "job create time", dataType = "String")
+    private Date createTime;
+    @ApiModelProperty(value = "job update time", dataType = "String")
+    private Date updateTime;
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java
index 7aee7de45..99b993ad7 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IScriptService.java
@@ -18,6 +18,7 @@
 package org.apache.seatunnel.app.service;
 
 import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.PublishScriptReq;
 import org.apache.seatunnel.app.domain.request.script.ScriptListReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptContentReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptParamReq;
@@ -41,4 +42,6 @@ public interface IScriptService {
     List<ScriptParamRes> fetchScriptParam(Integer id);
 
     void updateScriptParam(UpdateScriptParamReq updateScriptParamReq);
+
+    void publishScript(PublishScriptReq req);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/ITaskService.java
similarity index 53%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/ITaskService.java
index 146771460..93b423c41 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/ITaskService.java
@@ -15,26 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.app.service;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.app.domain.dto.job.PushScriptDto;
+import org.apache.seatunnel.app.domain.request.task.InstanceListReq;
+import org.apache.seatunnel.app.domain.request.task.JobListReq;
+import org.apache.seatunnel.app.domain.request.task.RecycleScriptReq;
+import org.apache.seatunnel.app.domain.response.task.InstanceSimpleInfoRes;
+import org.apache.seatunnel.app.domain.response.task.JobSimpleInfoRes;
 
 import java.util.List;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
+public interface ITaskService {
+    Long pushScriptToScheduler(PushScriptDto pushScriptDto);
 
-    void checkUserExists(String username);
+    void recycleScriptFromScheduler(RecycleScriptReq req);
 
-    void update(UpdateUserDto dto);
+    List<JobSimpleInfoRes> listJob(JobListReq req);
 
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+    List<InstanceSimpleInfoRes> listInstance(InstanceListReq dto);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java
index 13f41af71..3d6d2f139 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/ScriptServiceImpl.java
@@ -17,21 +17,24 @@
 
 package org.apache.seatunnel.app.service.impl;
 
-import static org.apache.seatunnel.app.common.SeatunnelErrorEnum.NO_SUCH_SCRIPT;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_SUCH_SCRIPT;
 import static com.google.common.base.Preconditions.checkState;
 
 import org.apache.seatunnel.app.common.ScriptParamStatusEnum;
 import org.apache.seatunnel.app.common.ScriptStatusEnum;
 import org.apache.seatunnel.app.dal.dao.IScriptDao;
 import org.apache.seatunnel.app.dal.dao.IScriptParamDao;
+import org.apache.seatunnel.app.dal.dao.IUserDao;
 import org.apache.seatunnel.app.dal.entity.Script;
 import org.apache.seatunnel.app.dal.entity.ScriptParam;
+import org.apache.seatunnel.app.domain.dto.job.PushScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.AddEmptyScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.CheckScriptDuplicateDto;
 import org.apache.seatunnel.app.domain.dto.script.ListScriptsDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptContentDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptParamDto;
 import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.PublishScriptReq;
 import org.apache.seatunnel.app.domain.request.script.ScriptListReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptContentReq;
 import org.apache.seatunnel.app.domain.request.script.UpdateScriptParamReq;
@@ -39,7 +42,9 @@ import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptParamRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptSimpleInfoRes;
 import org.apache.seatunnel.app.service.IScriptService;
+import org.apache.seatunnel.app.service.ITaskService;
 import org.apache.seatunnel.app.util.Md5Utils;
+import org.apache.seatunnel.scheduler.dolphinscheduler.impl.InstanceServiceImpl;
 
 import com.google.common.base.Strings;
 import org.springframework.stereotype.Component;
@@ -62,6 +67,15 @@ public class ScriptServiceImpl implements IScriptService {
     @Resource
     private IScriptParamDao scriptParamDaoImpl;
 
+    @Resource
+    private InstanceServiceImpl instanceService;
+
+    @Resource
+    private IUserDao userDaoImpl;
+
+    @Resource
+    private ITaskService iTaskService;
+
     @Override
     public AddEmptyScriptRes addEmptyScript(AddEmptyScriptReq addEmptyScriptReq) {
         // 1. check script name.
@@ -171,6 +185,15 @@ public class ScriptServiceImpl implements IScriptService {
         scriptParamDaoImpl.batchInsert(dto);
     }
 
+    @Override
+    public void publishScript(PublishScriptReq req){
+        final PushScriptDto dto = PushScriptDto.builder()
+                .scriptId(req.getScriptId())
+                .userId(req.getOperatorId())
+                .build();
+        iTaskService.pushScriptToScheduler(dto);
+    }
+
     private ScriptParamRes translate(ScriptParam scriptParam) {
         final ScriptParamRes res = new ScriptParamRes();
         res.setId(scriptParam.getId());
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java
new file mode 100644
index 000000000..237554401
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/TaskServiceImpl.java
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.app.service.impl;
+
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_SUCH_SCRIPT;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.SCHEDULER_CONFIG_NOT_EXIST;
+
+import org.apache.seatunnel.app.dal.dao.ISchedulerConfigDao;
+import org.apache.seatunnel.app.dal.dao.IScriptDao;
+import org.apache.seatunnel.app.dal.dao.IScriptJobApplyDao;
+import org.apache.seatunnel.app.dal.dao.IScriptParamDao;
+import org.apache.seatunnel.app.dal.entity.SchedulerConfig;
+import org.apache.seatunnel.app.dal.entity.Script;
+import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
+import org.apache.seatunnel.app.dal.entity.ScriptParam;
+import org.apache.seatunnel.app.domain.dto.job.PushScriptDto;
+import org.apache.seatunnel.app.domain.dto.job.ScriptJobApplyDto;
+import org.apache.seatunnel.app.domain.request.task.InstanceListReq;
+import org.apache.seatunnel.app.domain.request.task.JobListReq;
+import org.apache.seatunnel.app.domain.request.task.RecycleScriptReq;
+import org.apache.seatunnel.app.domain.response.task.InstanceSimpleInfoRes;
+import org.apache.seatunnel.app.domain.response.task.JobSimpleInfoRes;
+import org.apache.seatunnel.app.service.ITaskService;
+import org.apache.seatunnel.server.common.SeatunnelException;
+import org.apache.seatunnel.spi.scheduler.IInstanceService;
+import org.apache.seatunnel.spi.scheduler.IJobService;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceDto;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceListDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobListDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobSimpleInfoDto;
+import org.apache.seatunnel.spi.scheduler.dto.SchedulerConfigDto;
+
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class TaskServiceImpl implements ITaskService {
+
+    @Resource
+    private IJobService iJobService;
+
+    @Resource
+    private IInstanceService iInstanceService;
+
+    @Resource
+    private IScriptDao scriptDaoImpl;
+
+    @Resource
+    private IScriptParamDao scriptParamDaoImpl;
+
+    @Resource
+    private ISchedulerConfigDao schedulerConfigDaoImpl;
+
+    @Resource
+    private IScriptJobApplyDao scriptJobApplyDaoImpl;
+
+    @Override
+    public Long pushScriptToScheduler(PushScriptDto pushScriptDto) {
+        final int scriptId = pushScriptDto.getScriptId();
+        final int userId = pushScriptDto.getUserId();
+
+        // check scheduler param
+        SchedulerConfig config = schedulerConfigDaoImpl.getSchedulerConfig(scriptId);
+        if (Objects.isNull(config)) {
+            throw new SeatunnelException(SCHEDULER_CONFIG_NOT_EXIST);
+        }
+
+        final Script script = checkAndGetScript(scriptId);
+        final List<ScriptParam> scriptParams = scriptParamDaoImpl.getParamsByScriptId(scriptId);
+        Map<String, Object> params = Maps.newHashMap();
+
+        if (!CollectionUtils.isEmpty(params)) {
+            scriptParams.forEach(scriptParam -> params.put(scriptParam.getKey(), scriptParam.getValue()));
+        }
+
+        final SchedulerConfigDto schedulerConfigDto = SchedulerConfigDto.builder()
+                .retryInterval(config.getRetryInterval())
+                .retryTimes(config.getRetryTimes())
+                .startTime(config.getActiveStartTime())
+                .endTime(config.getActiveEndTime())
+                .triggerExpression(config.getTriggerExpression())
+                .build();
+
+        final JobDto jobDto = JobDto.builder()
+                .jobName(script.getName())
+                .jobContent(script.getContent())
+                .params(params)
+                .operatorId(userId)
+                .schedulerConfigDto(schedulerConfigDto)
+                //todo fix to real execute script
+                .executorScript(script.getContent())
+                .jobId(null)
+                .build();
+
+        ScriptJobApply apply = scriptJobApplyDaoImpl.getByScriptId(script.getId());
+        if (Objects.nonNull(apply)) {
+            jobDto.setJobId(apply.getJobId());
+        }
+
+        // push script
+        final long jobId = iJobService.submitJob(jobDto);
+
+        // Use future to ensure that the page does not show exceptions due to database errors.
+        syncScriptJobMapping(scriptId, userId, config.getId(), jobId);
+        return jobId;
+    }
+
+    @Override
+    public void recycleScriptFromScheduler(RecycleScriptReq req) {
+        final Script script = checkAndGetScript(req.getScriptId());
+        ScriptJobApply apply = scriptJobApplyDaoImpl.getByScriptId(script.getId());
+
+        final JobDto jobDto = JobDto.builder()
+                .jobId(apply.getJobId())
+                .jobName(script.getName())
+                .operatorId(req.getOperatorId())
+                .build();
+
+        iJobService.offlineJob(jobDto);
+
+        syncScriptJobMapping(script.getId(), req.getOperatorId(), apply.getSchedulerConfigId(), apply.getJobId());
+    }
+
+    @Override
+    public List<JobSimpleInfoRes> listJob(JobListReq req) {
+        // Search from scheduler.
+        final JobListDto dto = JobListDto.builder()
+                .name(req.getName())
+                .pageNo(req.getPageNo())
+                .pageSize(req.getPageSize())
+                .build();
+        final List<JobSimpleInfoDto> list = iJobService.list(dto);
+        return list.stream().map(this::translate).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<InstanceSimpleInfoRes> listInstance(InstanceListReq req) {
+        // Search from scheduler.
+        final InstanceListDto dto = InstanceListDto.builder()
+                .name(req.getName())
+                .pageNo(req.getPageNo())
+                .pageSize(req.getPageSize())
+                .build();
+        final List<InstanceDto> list = iInstanceService.list(dto);
+        return list.stream().map(this::translate).collect(Collectors.toList());
+    }
+
+    private JobSimpleInfoRes translate(JobSimpleInfoDto dto) {
+        return JobSimpleInfoRes.builder()
+                .jobId(dto.getJobId())
+                .jobStatus(dto.getJobStatus())
+                .creatorName(dto.getCreatorName())
+                .menderName(dto.getMenderName())
+                .createTime(dto.getCreateTime())
+                .updateTime(dto.getUpdateTime())
+                .build();
+    }
+
+    private InstanceSimpleInfoRes translate(InstanceDto dto) {
+        return InstanceSimpleInfoRes.builder()
+                .instanceId(dto.getInstanceId())
+                .instanceCode(dto.getInstanceCode())
+                .instanceName(dto.getInstanceName())
+                .submitTime(dto.getSubmitTime())
+                .startTime(dto.getStartTime())
+                .endTime(dto.getEndTime())
+                .status(dto.getStatus())
+                .executionDuration(dto.getExecutionDuration())
+                .retryTimes(dto.getRetryTimes())
+                .build();
+    }
+
+    private Script checkAndGetScript(int scriptId) {
+        final Script script = scriptDaoImpl.getScript(scriptId);
+        if (Objects.isNull(script)) {
+            throw new SeatunnelException(NO_SUCH_SCRIPT);
+        }
+        return script;
+    }
+
+    private void syncScriptJobMapping(int scriptId, int userId, int schedulerConfigId, long jobId) {
+        CompletableFuture.runAsync(() -> {
+            // store script and job mapping
+            final ScriptJobApplyDto dto = ScriptJobApplyDto.builder()
+                    .scriptId(scriptId)
+                    .schedulerConfigId(schedulerConfigId)
+                    .jobId(jobId)
+                    .userId(userId)
+                    .build();
+            scriptJobApplyDaoImpl.insertOrUpdate(dto);
+        }).whenComplete((_return, e) -> {
+            if (Objects.nonNull(e)) {
+                log.error("Store script and job mapping failed, please maintain this mapping manually. \n" +
+                        "scriptId [{}], schedulerConfigId [{}], jobId [{}], userId [{}]", scriptId, schedulerConfigId, jobId, userId, e);
+            }
+        });
+    }
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/util/GlobalExceptionHandler.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/util/GlobalExceptionHandler.java
index 511dbe597..306adbbc0 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/util/GlobalExceptionHandler.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/util/GlobalExceptionHandler.java
@@ -18,8 +18,8 @@
 package org.apache.seatunnel.app.util;
 
 import org.apache.seatunnel.app.common.Result;
-import org.apache.seatunnel.app.common.SeatunnelErrorEnum;
-import org.apache.seatunnel.app.common.SeatunnelException;
+import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
+import org.apache.seatunnel.server.common.SeatunnelException;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.ExceptionHandler;
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/SchedulerConfigMapper.xml b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/SchedulerConfigMapper.xml
new file mode 100644
index 000000000..30a6ad933
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/SchedulerConfigMapper.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.seatunnel.app.dal.mapper.SchedulerConfigMapper">
+    <resultMap id="BaseResultMap" type="org.apache.seatunnel.app.dal.entity.SchedulerConfig">
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="script_id" jdbcType="INTEGER" property="scriptId"/>
+        <result column="trigger_expression" jdbcType="VARCHAR" property="triggerExpression"/>
+        <result column="retry_times" jdbcType="INTEGER" property="retryTimes"/>
+        <result column="retry_interval" jdbcType="INTEGER" property="retryInterval"/>
+        <result column="active_start_time" jdbcType="TIMESTAMP" property="activeStartTime"/>
+        <result column="active_end_time" jdbcType="TIMESTAMP" property="activeEndTime"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="creator_id" jdbcType="INTEGER" property="creatorId"/>
+        <result column="update_id" jdbcType="INTEGER" property="updateId"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        id,
+        script_id,
+        trigger_expression,
+        retry_times,
+        retry_interval,
+        active_start_time,
+        active_end_time,
+        create_time,
+        update_time,
+        creator_id,
+        update_id
+    </sql>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from scheduler_config
+        where id = #{id,jdbcType=INTEGER}
+    </select>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+        delete
+        from scheduler_config
+        where id = #{id,jdbcType=INTEGER}
+    </delete>
+    <insert id="insert" keyColumn="id" keyProperty="id"
+            parameterType="org.apache.seatunnel.app.dal.entity.SchedulerConfig" useGeneratedKeys="true">
+        insert into scheduler_config (script_id, trigger_expression, retry_times, retry_interval,
+                                      active_start_time, active_end_time, create_time,
+                                      update_time, creator_id, update_id)
+        values (#{scriptId,jdbcType=INTEGER}, #{retryTimes,jdbcType=INTEGER}, #{retryInterval,jdbcType=INTEGER},
+                #{activeStartTime,jdbcType=TIMESTAMP}, #{activeEndTime,jdbcType=TIMESTAMP},
+                #{createTime,jdbcType=TIMESTAMP},
+                #{updateTime,jdbcType=TIMESTAMP}, #{creatorId,jdbcType=INTEGER}, #{updateId,jdbcType=INTEGER})
+    </insert>
+    <select id="selectByScriptId" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from scheduler_config
+        where script_id = #{scriptId,jdbcType=INTEGER}
+    </select>
+</mapper>
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.xml b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.xml
new file mode 100644
index 000000000..c5e28ed67
--- /dev/null
+++ b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.seatunnel.app.dal.mapper.ScriptJobApplyMapper">
+    <resultMap id="BaseResultMap" type="org.apache.seatunnel.app.dal.entity.ScriptJobApply">
+        <id column="id" jdbcType="INTEGER" property="id"/>
+        <result column="script_id" jdbcType="INTEGER" property="scriptId"/>
+        <result column="scheduler_config_id" jdbcType="INTEGER" property="schedulerConfigId"/>
+        <result column="job_id" jdbcType="BIGINT" property="jobId"/>
+        <result column="operator_id" jdbcType="INTEGER" property="operatorId"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        id,
+        script_id,
+        scheduler_config_id,
+        job_id,
+        operator_id,
+        create_time,
+        update_time
+    </sql>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from script_job_apply
+        where id = #{id,jdbcType=INTEGER}
+    </select>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+        delete
+        from script_job_apply
+        where id = #{id,jdbcType=INTEGER}
+    </delete>
+    <insert id="insert" parameterType="org.apache.seatunnel.app.dal.entity.ScriptJobApply">
+        insert into script_job_apply (script_id, scheduler_config_id,
+                                      job_id, operator_id)
+        values (#{scriptId,jdbcType=INTEGER}, #{schedulerConfigId,jdbcType=INTEGER},
+                #{jobId,jdbcType=BIGINT}, #{operatorId,jdbcType=INTEGER})
+    </insert>
+    <update id="update">
+        update script_job_apply
+        set script_id           = #{scriptId,jdbcType=INTEGER},
+            scheduler_config_id = #{schedulerConfigId,jdbcType=INTEGER},
+            job_id              = #{jobId},
+            operator_id     = #{operatorId,jdbcType=INTEGER}
+    </update>
+    <select id="selectByScriptId" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from script_job_apply
+        where script_id = #{scriptId,jdbcType=INTEGER}
+    </select>
+</mapper>
diff --git a/seatunnel-server/pom.xml b/seatunnel-server/seatunnel-scheduler/pom.xml
similarity index 75%
copy from seatunnel-server/pom.xml
copy to seatunnel-server/seatunnel-scheduler/pom.xml
index dc9361510..682437b8a 100644
--- a/seatunnel-server/pom.xml
+++ b/seatunnel-server/seatunnel-scheduler/pom.xml
@@ -17,16 +17,24 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>seatunnel</artifactId>
+        <artifactId>seatunnel-server</artifactId>
         <groupId>org.apache.seatunnel</groupId>
         <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>seatunnel-server</artifactId>
+    <artifactId>seatunnel-scheduler</artifactId>
     <packaging>pom</packaging>
     <modules>
-        <module>seatunnel-app</module>
+        <module>seatunnel-scheduler-dolphinscheduler</module>
     </modules>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.seatunnel</groupId>
+            <artifactId>seatunnel-spi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
 </project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml
new file mode 100644
index 000000000..1a283d7ea
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>seatunnel-scheduler</artifactId>
+        <groupId>org.apache.seatunnel</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>seatunnel-scheduler-dolphinscheduler</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+            <version>${spring.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <!--      http      -->
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>${javax.annotation-api.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java
new file mode 100644
index 000000000..9abc5e3f6
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/IDolphinschedulerService.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler;
+
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessInstanceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ResourceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.SchedulerDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskInstanceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.UpdateProcessDefinitionDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobDto;
+
+import java.util.List;
+
+public interface IDolphinschedulerService {
+
+    ProcessDefinitionDto createOrUpdateProcessDefinition(UpdateProcessDefinitionDto dto);
+
+    List<ProcessDefinitionDto> listProcessDefinition(ListProcessDefinitionDto dto);
+
+    ProcessDefinitionDto fetchProcessDefinitionByName(String processDefinitionName);
+
+    void startProcessDefinition(long processDefinitionCode);
+
+    void updateProcessDefinitionState(long processDefinitionCode, String processDefinitionName, String state);
+
+    SchedulerDto createOrUpdateSchedule(JobDto dto);
+
+    List<SchedulerDto> listSchedule(long processDefinitionCode);
+
+    void scheduleOnline(int scheduleId);
+
+    void scheduleOffline(int scheduleId);
+
+    List<Long> genTaskCodes(long projectCode, int num);
+
+    ResourceDto createOrUpdateScriptContent(String resourceName, String content);
+
+    List<TaskInstanceDto> listTaskInstance(ListProcessInstanceDto dto);
+}
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java
new file mode 100644
index 000000000..dc67ff535
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/constants/DolphinschedulerConstants.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.constants;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class DolphinschedulerConstants {
+
+    /**
+     * api url
+     */
+    public static final String QUERY_PROJECT_LIST_PAGING = "/projects";
+    public static final String QUERY_LIST_PAGING = "/projects/%s/process-definition";
+    public static final String GEN_TASK_CODE_LIST = "/projects/%s/task-definition/gen-task-codes";
+    public static final String VERIFY_RESOURCE_NAME = "/resources/verify-name";
+    public static final String QUERY_RESOURCE = "/resources/%s";
+    public static final String ONLINE_CREATE_RESOURCE = "/resources/online-create";
+    public static final String UPDATE_CONTENT = "/resources/%s/update-content";
+    public static final String LOG_DETAIL = "/log/detail";
+    public static final String RELEASE = "/projects/%s/process-definition/%s/release";
+    public static final String START_PROCESS_INSTANCE = "/projects/%s/executors/start-process-instance";
+    public static final String QUERY_PROCESS_DEFINITION_BY_NAME = "/projects/%s/process-definition/query-by-name";
+    public static final String QUERY_TASK_LIST_PAGING = "/projects/%s/task-instances";
+    public static final String CREATE_PROCESS_DEFINITION = "/projects/%s/process-definition/";
+    public static final String CREATE_SCHEDULE = "/projects/%s/schedules/";
+    public static final String QUERY_SCHEDULE_LIST_PAGING = "/projects/%s/schedules";
+    public static final String SCHEDULE_ONLINE = "/projects/%s/schedules/%s/online";
+    public static final String SCHEDULE_OFFLINE = "/projects/%s/schedules/%s/offline";
+
+    /**
+     * request param
+     */
+    public static final String TOKEN = "token";
+    public static final String SEARCH_VAL = "searchVal";
+    public static final String PAGE_SIZE = "pageSize";
+    public static final int PAGE_SIZE_DEFAULT = 10;
+    public static final String PAGE_NO = "pageNo";
+    public static final int PAGE_NO_DEFAULT = 1;
+    public static final String GEN_NUM = "genNum";
+    public static final int GEN_NUM_DEFAULT = 1;
+    public static final String RESOURCE_SEPARATOR = "/";
+    public static final String FULL_NAME = "fullName";
+    public static final String RESOURCE_TYPE = "type";
+    public static final String RESOURCE_TYPE_FILE = "FILE";
+    public static final String RESOURCE_TYPE_FILE_SUFFIX = "suffix";
+    public static final String RESOURCE_TYPE_FILE_SUFFIX_DEFAULT = "conf";
+    public static final String RESOURCE_TYPE_FILE_CONTENT = "content";
+    public static final String RESOURCE_TYPE_UDF = "UDF";
+    public static final int RESOURCE_ID_DEFAULT = 0;
+    public static final String RESOURCE_ID = "id";
+    public static final String TASK_INSTANCE_ID = "taskInstanceId";
+    public static final String LOG_SKIP_LINE_NUM = "skipLineNum";
+    public static final String LOG_LIMIT_NUM = "limit";
+    public static final String PROCESS_DEFINITION_NAME = "name";
+    public static final String RELEASE_STATE = "releaseState";
+    public static final String RELEASE_STATE_ONLINE = "ONLINE";
+    public static final String RELEASE_STATE_OFFLINE = "OFFLINE";
+    public static final String FAILURE_STRATEGY = "failureStrategy";
+    public static final String FAILURE_STRATEGY_DEFAULT = "CONTINUE";
+    public static final String WORKER_GROUP = "workerGroup";
+    public static final String WORKER_GROUP_DEFAULT = "default";
+    public static final String WARNING_TYPE = "warningType";
+    public static final String WARNING_TYPE_DEFAULT = "NONE";
+    public static final String WARNING_GROUP_ID = "warningGroupId";
+    public static final int WARNING_GROUP_ID_DEFAULT = 0;
+    public static final String TASK_DEPEND_TYPE_DEFAULT = "TASK_POST";
+    public static final String RUN_MODE_DEFAULT = "RUN_MODE_SERIAL";
+    public static final String PROCESS_INSTANCE_PRIORITY = "processInstancePriority";
+    public static final String PROCESS_INSTANCE_PRIORITY_DEFAULT = "MEDIUM";
+    public static final int DRY_RUN = 0;
+    public static final String PROCESS_DEFINITION = "processDefinition";
+    public static final String PROCESS_INSTANCE_NAME = "processInstanceName";
+    public static final String LOCATIONS = "locations";
+    public static final String LOCATIONS_X = "x";
+    public static final int LOCATIONS_X_DEFAULT = 200;
+    public static final String LOCATIONS_Y = "y";
+    public static final int LOCATIONS_Y_DEFAULT = 200;
+    public static final String TASK_CODE = "taskCode";
+    public static final String TASK_DEFINITION_JSON = "taskDefinitionJson";
+    public static final String TASK_RELATION_JSON = "taskRelationJson";
+    public static final String TENANT_CODE = "tenantCode";
+    public static final String TASK_RELATION_JSON_NAME = "name";
+    public static final String PRE_TASK_CODE = "preTaskCode";
+    public static final long PRE_TASK_CODE_DEFAULT = 0;
+    public static final String PRE_TASK_VERSION = "preTaskVersion";
+    public static final int PRE_TASK_VERSION_DEFAULT = 0;
+    public static final String POST_TASK_CODE = "postTaskCode";
+    public static final String POST_TASK_VERSION = "postTaskVersion";
+    public static final int POST_TASK_VERSION_DEFAULT = 1;
+    public static final String CONDITION_TYPE = "conditionType";
+    public static final int CONDITION_TYPE_DEFAULT = 0;
+    public static final String CONDITION_PARAMS = "conditionParams";
+    public static final String TASK_DEFINITION_JSON_CODE = "code";
+    public static final String TASK_DEFINITION_JSON_NAME = "name";
+    public static final String VERSION = "version";
+    public static final int VERSION_DEFAULT = 1;
+    public static final String DESCRIPTION = "description";
+    public static final String DESCRIPTION_DEFAULT = "";
+    public static final String DELAY_TIME = "delayTime";
+    public static final int DELAY_TIME_DEFAULT = 0;
+    public static final String TASK_TYPE = "taskType";
+    public static final String TASK_TYPE_DEFAULT = "SHELL";
+    public static final String TASK_PARAMS = "taskParams";
+    public static final String RESOURCE_LIST = "resourceList";
+    public static final String LOCAL_PARAMS = "localParams";
+    public static final String LOCAL_PARAMS_PROP = "prop";
+    public static final String LOCAL_PARAMS_DIRECT = "direct";
+    public static final String LOCAL_PARAMS_DIRECT_DEFAULT = "IN";
+    public static final String LOCAL_PARAMS_TYPE = "type";
+    public static final String LOCAL_PARAMS_TYPE_DEFAULT = "VARCHAR";
+    public static final String LOCAL_PARAMS_VALUE = "value";
+    public static final String RAW_SCRIPT = "rawScript";
+    public static final String DEPENDENCE = "dependence";
+    public static final Map<String, Object> DEPENDENCE_DEFAULT = Collections.emptyMap();
+    public static final String CONDITION_RESULT = "conditionResult";
+    public static final String SUCCESS_NODE = "successNode";
+    public static final List<Object> SUCCESS_NODE_DEFAULT = Collections.emptyList();
+    public static final String FAILED_NODE = "failedNode";
+    public static final List<Object> FAILED_NODE_DEFAULT = Collections.emptyList();
+    public static final String WAIT_START_TIMEOUT = "waitStartTimeout";
+    public static final int WAIT_START_TIMEOUT_DEFAULT = 0;
+    public static final String SWITCH_RESULT = "switchResult";
+    public static final int SWITCH_RESULT_DEFAULT = 0;
+    public static final String FLAG = "flag";
+    public static final String FLAG_DEFAULT = "YES";
+    public static final String TASK_PRIORITY = "taskPriority";
+    public static final String TASK_PRIORITY_DEFAULT = "MEDIUM";
+    public static final String FAIL_RETRY_TIMES = "failRetryTimes";
+    public static final String FAIL_RETRY_INTERVAL = "failRetryInterval";
+    public static final String TIMEOUT_FLAG = "timeoutFlag";
+    public static final String TIMEOUT_FLAG_DEFAULT = "CLOSE";
+    public static final String TIMEOUT_NOTIFY_STRATEGY = "timeoutNotifyStrategy";
+    public static final String TIMEOUT_NOTIFY_STRATEGY_DEFAULT = "WARN";
+    public static final String TIMEOUT = "timeout";
+    public static final int TIMEOUT_DEFAULT = 0;
+    public static final String ENVIRONMENT_CODE = "environmentCode";
+    public static final int ENVIRONMENT_CODE_DEFAULT = -1;
+    public static final String PROCESS_DEFINITION_CODE = "processDefinitionCode";
+    public static final String START_TIME = "startTime";
+    public static final String END_TIME = "endTime";
+    public static final String CRONTAB = "crontab";
+    public static final String TIMEZONE_ID = "timezoneId";
+    public static final String TIMEZONE_ID_DEFAULT = "Asia/Shanghai";
+    public static final String SCHEDULE = "schedule";
+    public static final String SCHEDULE_ID = "id";
+    public static final String DEFAULT_FILE_SUFFIX = ".conf";
+
+    /**
+     * response param
+     */
+    public static final String DATA = "data";
+    public static final String DATA_TOTAL_LIST = "totalList";
+    public static final String CODE = "code";
+    public static final int CODE_SUCCESS = 0;
+    public static final String MSG = "msg";
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ConditionResult.java
similarity index 62%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ConditionResult.java
index 146771460..629b2be9d 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ConditionResult.java
@@ -15,26 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
 
 import java.util.List;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ConditionResult {
+    private List<Object> successNode;
+    private List<Object> failedNode;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ListProcessDefinitionDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ListProcessDefinitionDto.java
index 146771460..c6bc80250 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ListProcessDefinitionDto.java
@@ -15,26 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@Builder
+public class ListProcessDefinitionDto {
+    private String name;
+    private int pageNo;
+    private int pageSize;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ListProcessInstanceDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ListProcessInstanceDto.java
index 146771460..b2d428ab5 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ListProcessInstanceDto.java
@@ -15,26 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@Builder
+public class ListProcessInstanceDto {
+    private String processInstanceName;
+    private int pageNo;
+    private int pageSize;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/LocalParam.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/LocalParam.java
index 146771460..4596d02fb 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/LocalParam.java
@@ -15,26 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class LocalParam {
+    private String prop;
+    private String direct;
+    private String type;
+    private Object value;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/LocationDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/LocationDto.java
index 146771460..33fa65389 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/LocationDto.java
@@ -15,26 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class LocationDto {
+    private Long taskCode;
+    private int x;
+    private int y;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/OnlineCreateResourceDto.java
similarity index 52%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/OnlineCreateResourceDto.java
index 146771460..acd909b73 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/OnlineCreateResourceDto.java
@@ -15,26 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import com.google.common.collect.Maps;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Map;
+
+@Builder
+@Data
+public class OnlineCreateResourceDto {
+    private String type;
+    private int pid;
+    private String currentDir;
+    private String fileName;
+    private String suffix;
+    private String content;
+
+    public Map<String, Object> toMap() {
+        final Map<String, Object> map = Maps.newHashMap();
+        map.put("type", type);
+        map.put("pid", pid);
+        map.put("currentDir", currentDir);
+        map.put("fileName", fileName);
+        map.put("suffix", suffix);
+        map.put("content", content);
+        return map;
+    }
 }
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ProcessDefinitionDto.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ProcessDefinitionDto.java
new file mode 100644
index 000000000..68504d432
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ProcessDefinitionDto.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import static org.apache.seatunnel.server.common.DateUtils.DEFAULT_DATETIME_FORMAT;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProcessDefinitionDto {
+    private int id;
+    private long code;
+    private String name;
+    private String releaseState;
+    private long projectCode;
+    private String description;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date createTime;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date updateTime;
+    private String userName;
+    private String projectName;
+    private String locations;
+    private String scheduleReleaseState;
+    private int timeout;
+    private int tenantId;
+    private String tenantCode;
+    private String modifyBy;
+    private int warningGroupId;
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ProjectDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ProjectDto.java
index 146771460..edcf1998b 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ProjectDto.java
@@ -15,26 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProjectDto {
+    private long code;
+    private String name;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ResourceDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ResourceDto.java
index 146771460..995e981c4 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/ResourceDto.java
@@ -15,26 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true, value = {"pid"})
+public class ResourceDto {
+    private int id;
+    private int pid;
 }
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/SchedulerDto.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/SchedulerDto.java
new file mode 100644
index 000000000..acc660072
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/SchedulerDto.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import static org.apache.seatunnel.server.common.DateUtils.DEFAULT_DATETIME_FORMAT;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SchedulerDto {
+    private int id;
+    private long processDefinitionCode;
+    private String processDefinitionName;
+    private String projectName;
+    private String definitionDescription;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date startTime;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date endTime;
+    private String timezoneId;
+    private String crontab;
+    private String failureStrategy;
+    private String warningType;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date createTime;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date updateTime;
+    private int userId;
+    private String userName;
+    private String releaseState;
+    private int warningGroupId;
+    private String processInstancePriority;
+    private String workerGroup;
+    private int environmentCode;
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/StartProcessDefinitionDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/StartProcessDefinitionDto.java
index 146771460..617a3d1a7 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/StartProcessDefinitionDto.java
@@ -15,26 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Builder
+@Data
+public class StartProcessDefinitionDto {
+    private long processDefinitionCode;
+    private String failureStrategy;
+    private String warningType;
+    private int warningGroupId;
+    private String taskDependType;
+    private String runMode;
+    private String processInstancePriority;
+    private String workerGroup;
+    private int dryRun;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskDefinitionDto.java
similarity index 53%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskDefinitionDto.java
index 146771460..c0b02569e 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskDefinitionDto.java
@@ -15,26 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TaskDefinitionDto {
+    private Long code;
+    private String name;
+    private String description;
+    private String taskType;
+    private TaskParamDto taskParams;
+    private String flag;
+    private String taskPriority;
+    private String workerGroup;
+    private int failRetryTimes;
+    private int failRetryInterval;
+    private String timeoutFlag;
+    private String timeoutNotifyStrategy;
+    private int timeout;
+    private int delayTime;
+    private int environmentCode;
+    private int version;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskDescriptionDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskDescriptionDto.java
index 146771460..1dc971611 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskDescriptionDto.java
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+@Builder
+public class TaskDescriptionDto {
+    private String name;
+    private String executeScript;
+    private String content;
+    private Map<String, Object> params;
+    private int retryInterval;
+    private int retryTimes;
 }
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskInstanceDto.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskInstanceDto.java
new file mode 100644
index 000000000..2e49196f6
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskInstanceDto.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import static org.apache.seatunnel.server.common.DateUtils.DEFAULT_DATETIME_FORMAT;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TaskInstanceDto {
+    private boolean taskComplete;
+    private boolean firstRun;
+    private int dryRun;
+    private String flag;
+    private int environmentCode;
+    private String processInstance;
+    private int pid;
+    private String taskParams;
+    private String duration;
+    private String taskType;
+    private long taskCode;
+    private String taskInstancePriority;
+    private String host;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date startTime;
+    private int id;
+    private String state;
+    private String workerGroup;
+    private String processInstancePriority;
+    private int processInstanceId;
+    private int executorId;
+    private String firstSubmitTime;
+    private String resources;
+    private int maxRetryTimes;
+    private int retryTimes;
+    private String executorName;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date submitTime;
+    private String name;
+    private int retryInterval;
+    @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
+    private Date endTime;
+    private String processInstanceName;
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskParamDto.java
similarity index 61%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskParamDto.java
index 146771460..36ab04ee3 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskParamDto.java
@@ -15,26 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
 
 import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+import java.util.Map;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TaskParamDto {
+    private List<ResourceDto> resourceList;
+    private List<LocalParam> localParams;
+    private String rawScript;
+    private Map<String, Object> dependence;
+    private ConditionResult conditionResult;
+    private int waitStartTimeout;
+    private int switchResult;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskRelationDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskRelationDto.java
index 146771460..c0c80b228 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/TaskRelationDto.java
@@ -15,26 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TaskRelationDto {
+    private String name;
+    private long preTaskCode;
+    private int preTaskVersion;
+    private long postTaskCode;
+    private long postTaskVersion;
+    private int conditionType;
+    private String conditionParams;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/UpdateProcessDefinitionDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/UpdateProcessDefinitionDto.java
index 146771460..1486e4464 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/dto/UpdateProcessDefinitionDto.java
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.scheduler.dolphinscheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Builder
+public class UpdateProcessDefinitionDto {
+    private Long processDefinitionCode;
+    private String name;
+    private Date startTime;
+    private Date endTime;
+    private String cronExpression;
+    private TaskDescriptionDto taskDescriptionDto;
 }
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java
new file mode 100644
index 000000000..28726fbf8
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/DolphinschedulerServiceImpl.java
@@ -0,0 +1,621 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.impl;
+
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.CODE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.CODE_SUCCESS;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.CONDITION_TYPE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.CREATE_PROCESS_DEFINITION;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.CREATE_SCHEDULE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.CRONTAB;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DATA;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DATA_TOTAL_LIST;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DEFAULT_FILE_SUFFIX;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DELAY_TIME_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DEPENDENCE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DESCRIPTION_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.DRY_RUN;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.END_TIME;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.ENVIRONMENT_CODE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.ENVIRONMENT_CODE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.FAILED_NODE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.FAILURE_STRATEGY;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.FAILURE_STRATEGY_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.FLAG_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.FULL_NAME;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.GEN_NUM;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.GEN_NUM_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.GEN_TASK_CODE_LIST;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOCAL_PARAMS_DIRECT_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOCAL_PARAMS_TYPE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOCATIONS;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOCATIONS_X_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOCATIONS_Y_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOG_DETAIL;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOG_LIMIT_NUM;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.LOG_SKIP_LINE_NUM;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.MSG;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.ONLINE_CREATE_RESOURCE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PAGE_NO;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PAGE_NO_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PAGE_SIZE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PAGE_SIZE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.POST_TASK_VERSION_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PRE_TASK_CODE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PRE_TASK_VERSION_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PROCESS_DEFINITION;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PROCESS_DEFINITION_CODE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PROCESS_DEFINITION_NAME;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PROCESS_INSTANCE_NAME;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PROCESS_INSTANCE_PRIORITY;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.PROCESS_INSTANCE_PRIORITY_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.QUERY_LIST_PAGING;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.QUERY_PROCESS_DEFINITION_BY_NAME;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.QUERY_PROJECT_LIST_PAGING;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.QUERY_RESOURCE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.QUERY_SCHEDULE_LIST_PAGING;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.QUERY_TASK_LIST_PAGING;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RELEASE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RELEASE_STATE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RELEASE_STATE_OFFLINE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_ID;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_ID_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_SEPARATOR;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_TYPE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_TYPE_FILE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_TYPE_FILE_CONTENT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RESOURCE_TYPE_FILE_SUFFIX_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RUN_MODE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SCHEDULE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SCHEDULE_ID;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SCHEDULE_OFFLINE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SCHEDULE_ONLINE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SEARCH_VAL;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.START_PROCESS_INSTANCE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.START_TIME;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SUCCESS_NODE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.SWITCH_RESULT_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TASK_DEFINITION_JSON;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TASK_DEPEND_TYPE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TASK_INSTANCE_ID;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TASK_PRIORITY_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TASK_RELATION_JSON;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TASK_TYPE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TENANT_CODE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TIMEOUT_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TIMEOUT_FLAG_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TIMEOUT_NOTIFY_STRATEGY_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TIMEZONE_ID;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TIMEZONE_ID_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.TOKEN;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.UPDATE_CONTENT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.VERSION_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WAIT_START_TIMEOUT_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WARNING_GROUP_ID;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WARNING_GROUP_ID_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WARNING_TYPE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WARNING_TYPE_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WORKER_GROUP;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.WORKER_GROUP_DEFAULT;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.utils.HttpUtils.createParamMap;
+import static org.apache.seatunnel.server.common.Constants.BLANK_SPACE;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_MATCHED_PROJECT;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.UNEXPECTED_RETURN_CODE;
+
+import org.apache.seatunnel.scheduler.dolphinscheduler.IDolphinschedulerService;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ConditionResult;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessInstanceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.LocalParam;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.LocationDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.OnlineCreateResourceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ProjectDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ResourceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.SchedulerDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.StartProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskDescriptionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskInstanceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskParamDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskRelationDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.UpdateProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.utils.HttpUtils;
+import org.apache.seatunnel.server.common.DateUtils;
+import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
+import org.apache.seatunnel.server.common.SeatunnelException;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceLogDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobDto;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.jsoup.Connection;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class DolphinschedulerServiceImpl implements IDolphinschedulerService, InitializingBean {
+
+    @Value("${ds.api.prefix}")
+    private String apiPrefix;
+    @Value("${ds.api.token}")
+    private String token;
+    @Value("${ds.tenant.default}")
+    private String defaultTenantName;
+    @Value("${ds.project.default}")
+    private String defaultProjectName;
+    @Value("${ds.script.dir}")
+    private String defaultScriptDir;
+    private long defaultProjectCode;
+
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        final ProjectDto projectDto = queryProjectCodeByName(defaultProjectName);
+        defaultProjectCode = projectDto.getCode();
+    }
+
+    @Override
+    public ProcessDefinitionDto createOrUpdateProcessDefinition(UpdateProcessDefinitionDto dto) {
+        // gen task code
+        final List<Long> taskCodes = genTaskCodes(defaultProjectCode, GEN_NUM_DEFAULT);
+
+        // build taskDefinitionJson and taskRelationJson.
+        final Long taskCode = taskCodes.get(0);
+        List<TaskDefinitionDto> taskDefinitionJson = Collections.singletonList(buildTaskDefinitionJson(taskCode, dto.getTaskDescriptionDto()));
+        List<TaskRelationDto> taskRelationJson = buildTaskRelationJson(taskCode, dto.getTaskDescriptionDto());
+        List<LocationDto> locations = buildLocation(taskCodes);
+
+        String url = apiPrefix.concat(String.format(CREATE_PROCESS_DEFINITION, defaultProjectCode));
+        Connection.Method method = Connection.Method.POST;
+        if (Objects.nonNull(dto.getProcessDefinitionCode())) {
+            method = Connection.Method.PUT;
+            url = url.concat(String.valueOf(dto.getProcessDefinitionCode()));
+            // offline process
+            updateProcessDefinitionState(dto.getProcessDefinitionCode(), dto.getName(), RELEASE_STATE_OFFLINE);
+        }
+
+        final Map<String, String> paramMap = createParamMap(LOCATIONS, locations,
+                TASK_DEFINITION_JSON, this.objectToString(taskDefinitionJson),
+                TASK_RELATION_JSON, this.objectToString(taskRelationJson),
+                TENANT_CODE, defaultTenantName,
+                PROCESS_DEFINITION_NAME, dto.getName());
+
+        final Map result = HttpUtils.builder()
+                .withUrl(url)
+                .withMethod(method)
+                .withData(paramMap)
+                .withRequestBody(this.objectToString(null))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+
+        checkResult(result, false);
+        final Map<String, Object> map = MapUtils.getMap(result, DATA);
+        return mapToPojo(map, ProcessDefinitionDto.class);
+    }
+
+    @Override
+    public List<ProcessDefinitionDto> listProcessDefinition(ListProcessDefinitionDto dto) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(QUERY_LIST_PAGING, defaultProjectCode)))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(SEARCH_VAL, dto.getName(), PAGE_NO, dto.getPageNo(), PAGE_SIZE, dto.getPageSize()))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+
+        final List<Map<String, Object>> processDefinitionList = (List<Map<String, Object>>) MapUtils.getMap(result, DATA).get(DATA_TOTAL_LIST);
+        if (CollectionUtils.isEmpty(processDefinitionList)) {
+            return Collections.emptyList();
+        }
+        return processDefinitionList.stream().map(m -> this.mapToPojo(m, ProcessDefinitionDto.class)).collect(Collectors.toList());
+    }
+
+    @Override
+    public ProcessDefinitionDto fetchProcessDefinitionByName(String processDefinitionName) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(QUERY_PROCESS_DEFINITION_BY_NAME, defaultProjectCode)))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(PROCESS_DEFINITION_NAME, processDefinitionName))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+
+        final Map<String, Object> map = (Map<String, Object>) MapUtils.getMap(result, DATA).get(PROCESS_DEFINITION);
+        return this.mapToPojo(map, ProcessDefinitionDto.class);
+    }
+
+    @Override
+    public void startProcessDefinition(long processDefinitionCode) {
+        final StartProcessDefinitionDto dto = StartProcessDefinitionDto.builder()
+                .processDefinitionCode(processDefinitionCode)
+                .failureStrategy(FAILURE_STRATEGY_DEFAULT)
+                .warningType(WARNING_TYPE_DEFAULT)
+                .warningGroupId(WARNING_GROUP_ID_DEFAULT)
+                .taskDependType(TASK_DEPEND_TYPE_DEFAULT)
+                .runMode(RUN_MODE_DEFAULT)
+                .processInstancePriority(PROCESS_INSTANCE_PRIORITY_DEFAULT)
+                .workerGroup(WORKER_GROUP_DEFAULT)
+                .dryRun(DRY_RUN)
+                .build();
+
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(START_PROCESS_INSTANCE, processDefinitionCode)))
+                .withMethod(Connection.Method.POST)
+                .withRequestBody(this.objectToString(dto))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+    }
+
+    @Override
+    public void updateProcessDefinitionState(long processDefinitionCode, String processDefinitionName, String state) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(RELEASE, defaultProjectCode, processDefinitionCode)))
+                .withMethod(Connection.Method.POST)
+                .withData(createParamMap(PROCESS_DEFINITION_NAME, processDefinitionName, RELEASE_STATE, state))
+                .withRequestBody(this.objectToString(null))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+    }
+
+    @Override
+    public SchedulerDto createOrUpdateSchedule(JobDto dto) {
+        final Map<String, Object> map = Maps.newHashMap();
+        map.put(FAILURE_STRATEGY, FAILURE_STRATEGY_DEFAULT);
+        map.put(WARNING_TYPE, WARNING_TYPE_DEFAULT);
+        map.put(PROCESS_INSTANCE_PRIORITY, PROCESS_INSTANCE_PRIORITY_DEFAULT);
+        map.put(WARNING_GROUP_ID, WARNING_GROUP_ID_DEFAULT);
+        map.put(WORKER_GROUP, WORKER_GROUP_DEFAULT);
+        map.put(ENVIRONMENT_CODE, ENVIRONMENT_CODE_DEFAULT);
+        map.put(PROCESS_DEFINITION_CODE, dto.getJobId());
+
+        final Map<String, Object> schedule = Maps.newHashMap();
+        schedule.put(START_TIME, DateUtils.format(dto.getSchedulerConfigDto().getStartTime()));
+        schedule.put(END_TIME, DateUtils.format(dto.getSchedulerConfigDto().getEndTime()));
+        schedule.put(CRONTAB, dto.getSchedulerConfigDto().getTriggerExpression());
+        schedule.put(TIMEZONE_ID, TIMEZONE_ID_DEFAULT);
+
+        map.put(SCHEDULE, this.objectToString(schedule));
+
+        String url = String.format(CREATE_SCHEDULE, defaultProjectCode);
+
+        final List<SchedulerDto> schedulerDtos = listSchedule(dto.getJobId());
+        boolean flag = false;
+        if (!CollectionUtils.isEmpty(schedulerDtos)) {
+            url = url.concat(String.valueOf(schedulerDtos.get(0).getId()));
+            flag = true;
+        }
+
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(url))
+                .withData(translate(map))
+                .withMethod(flag ? Connection.Method.PUT : Connection.Method.POST)
+                .withRequestBody(this.objectToString(null))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+
+        if (flag){
+            schedulerDtos.clear();
+            schedulerDtos.addAll(listSchedule(dto.getJobId()));
+            return schedulerDtos.get(0);
+        }
+
+        Map<String, Object> resultMap = MapUtils.getMap(result, DATA);
+        return this.mapToPojo(resultMap, SchedulerDto.class);
+    }
+
+    @Override
+    public List<SchedulerDto> listSchedule(long processDefinitionCode) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(QUERY_SCHEDULE_LIST_PAGING, defaultProjectCode)))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(PROCESS_DEFINITION_CODE, processDefinitionCode, PAGE_NO, PAGE_NO_DEFAULT, PAGE_SIZE, PAGE_SIZE_DEFAULT))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+
+        final List<Map<String, Object>> scheduleList = (List<Map<String, Object>>) MapUtils.getMap(result, DATA).get(DATA_TOTAL_LIST);
+        if (CollectionUtils.isEmpty(scheduleList)) {
+            return Collections.emptyList();
+        }
+        return scheduleList.stream().map(m -> this.mapToPojo(m, SchedulerDto.class)).collect(Collectors.toList());
+    }
+
+    @Override
+    public void scheduleOnline(int scheduleId) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(SCHEDULE_ONLINE, defaultProjectCode, scheduleId)))
+                .withMethod(Connection.Method.POST)
+                .withData(createParamMap(SCHEDULE_ID, scheduleId))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+    }
+
+    @Override
+    public void scheduleOffline(int scheduleId) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(SCHEDULE_OFFLINE, defaultProjectCode, scheduleId)))
+                .withMethod(Connection.Method.POST)
+                .withData(createParamMap(SCHEDULE_ID, scheduleId))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+    }
+
+    @Override
+    public List<Long> genTaskCodes(long projectCode, int num) {
+        final String url = String.format(GEN_TASK_CODE_LIST, projectCode);
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(url))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(GEN_NUM, num))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+
+        return (List<Long>) result.get(DATA);
+    }
+
+    @Override
+    public ResourceDto createOrUpdateScriptContent(String resourceName, String content) {
+        // check resource exists
+        final String fullName = defaultScriptDir.concat(RESOURCE_SEPARATOR.concat(resourceName));
+        final ResourceDto parentResourceDto = getResourceDto(defaultScriptDir, RESOURCE_TYPE_FILE);
+        if (Objects.isNull(parentResourceDto)) {
+            throw new SeatunnelException(SeatunnelErrorEnum.NO_MATCHED_SCRIPT_SAVE_DIR, defaultScriptDir);
+        }
+        final ResourceDto dto = getResourceDto(fullName.concat(DEFAULT_FILE_SUFFIX), RESOURCE_TYPE_FILE);
+        if (Objects.isNull(dto)) {
+            final OnlineCreateResourceDto createDto = OnlineCreateResourceDto.builder()
+                    .type(RESOURCE_TYPE_FILE)
+                    .pid(parentResourceDto.getId())
+                    .fileName(resourceName)
+                    .currentDir(defaultScriptDir)
+                    .suffix(RESOURCE_TYPE_FILE_SUFFIX_DEFAULT)
+                    .content(content)
+                    .build();
+            onlineCreateResource(createDto);
+            return getResourceDto(fullName.concat(DEFAULT_FILE_SUFFIX), RESOURCE_TYPE_FILE);
+        } else {
+            updateContent(dto.getId(), content);
+            return dto;
+        }
+    }
+
+    @Override
+    public List<TaskInstanceDto> listTaskInstance(ListProcessInstanceDto dto) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(QUERY_TASK_LIST_PAGING, defaultProjectCode)))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(PROCESS_INSTANCE_NAME, dto.getProcessInstanceName(), PAGE_NO, dto.getPageNo(), PAGE_SIZE, dto.getPageSize()))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+
+        checkResult(result, false);
+        final List<Map<String, Object>> taskInstanceList = (List<Map<String, Object>>) MapUtils.getMap(result, DATA).get(DATA_TOTAL_LIST);
+        if (CollectionUtils.isEmpty(taskInstanceList)) {
+            return Collections.emptyList();
+        }
+
+        return taskInstanceList.stream().map(m -> this.mapToPojo(m, TaskInstanceDto.class)).collect(Collectors.toList());
+    }
+
+    private ProjectDto queryProjectCodeByName(String projectName) throws IOException {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(QUERY_PROJECT_LIST_PAGING))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(SEARCH_VAL, projectName, PAGE_NO, PAGE_NO_DEFAULT, PAGE_SIZE, PAGE_SIZE_DEFAULT))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+
+        final List<Map<String, Object>> projectList = (List<Map<String, Object>>) MapUtils.getMap(result, DATA).get(DATA_TOTAL_LIST);
+        final ProjectDto projectDto = projectList.stream().map(m -> this.mapToPojo(m, ProjectDto.class)).filter(p -> p.getName().equalsIgnoreCase(projectName)).findAny().orElse(null);
+        if (Objects.isNull(projectDto)) {
+            throw new SeatunnelException(NO_MATCHED_PROJECT, projectName);
+        }
+        return projectDto;
+    }
+
+    private TaskDefinitionDto buildTaskDefinitionJson(Long taskCode, TaskDescriptionDto taskDescriptionDto) {
+        final ResourceDto resourceDto = createOrUpdateScriptContent(taskDescriptionDto.getName(), taskDescriptionDto.getContent());
+        final TaskDefinitionDto taskDefinitionDto = new TaskDefinitionDto();
+        taskDefinitionDto.setCode(taskCode);
+        taskDefinitionDto.setName(taskDescriptionDto.getName());
+        taskDefinitionDto.setDescription(DESCRIPTION_DEFAULT);
+        taskDefinitionDto.setTaskType(TASK_TYPE_DEFAULT);
+
+        final TaskParamDto taskParamDto = new TaskParamDto();
+
+        taskParamDto.setResourceList(Collections.singletonList(resourceDto));
+
+        final List<LocalParam> localParams = getLocalParams(taskDescriptionDto);
+        taskParamDto.setLocalParams(localParams);
+        taskParamDto.setRawScript(taskDescriptionDto.getExecuteScript());
+        taskParamDto.setDependence(DEPENDENCE_DEFAULT);
+
+        final ConditionResult conditionResult = new ConditionResult();
+        conditionResult.setSuccessNode(SUCCESS_NODE_DEFAULT);
+        conditionResult.setFailedNode(FAILED_NODE_DEFAULT);
+
+        taskParamDto.setConditionResult(conditionResult);
+        taskParamDto.setWaitStartTimeout(WAIT_START_TIMEOUT_DEFAULT);
+        taskParamDto.setSwitchResult(SWITCH_RESULT_DEFAULT);
+
+        taskDefinitionDto.setTaskParams(taskParamDto);
+        taskDefinitionDto.setFlag(FLAG_DEFAULT);
+        taskDefinitionDto.setTaskPriority(TASK_PRIORITY_DEFAULT);
+        taskDefinitionDto.setWorkerGroup(WORKER_GROUP_DEFAULT);
+        taskDefinitionDto.setFailRetryTimes(taskDescriptionDto.getRetryTimes());
+        taskDefinitionDto.setFailRetryInterval(taskDescriptionDto.getRetryInterval());
+        taskDefinitionDto.setTimeoutFlag(TIMEOUT_FLAG_DEFAULT);
+        taskDefinitionDto.setTimeoutNotifyStrategy(TIMEOUT_NOTIFY_STRATEGY_DEFAULT);
+        taskDefinitionDto.setTimeout(TIMEOUT_DEFAULT);
+        taskDefinitionDto.setDelayTime(DELAY_TIME_DEFAULT);
+        taskDefinitionDto.setEnvironmentCode(ENVIRONMENT_CODE_DEFAULT);
+        taskDefinitionDto.setVersion(VERSION_DEFAULT);
+        return taskDefinitionDto;
+    }
+
+    private List<LocalParam> getLocalParams(TaskDescriptionDto taskDescriptionDto) {
+        final Map<String, Object> params = taskDescriptionDto.getParams();
+        final List<LocalParam> localParams = Lists.newArrayListWithCapacity(params.size());
+        params.forEach((k, v) -> {
+            final LocalParam localParam = new LocalParam();
+            localParam.setProp(k);
+            localParam.setDirect(LOCAL_PARAMS_DIRECT_DEFAULT);
+            localParam.setType(LOCAL_PARAMS_TYPE_DEFAULT);
+            localParam.setValue(v);
+            localParams.add(localParam);
+        });
+        return localParams;
+    }
+
+    private List<TaskRelationDto> buildTaskRelationJson(Long taskCode, TaskDescriptionDto taskDescriptionDto) {
+
+        final TaskRelationDto taskRelationDto = new TaskRelationDto();
+        taskRelationDto.setName(BLANK_SPACE);
+        taskRelationDto.setPreTaskCode(PRE_TASK_CODE_DEFAULT);
+        taskRelationDto.setPreTaskVersion(PRE_TASK_VERSION_DEFAULT);
+        taskRelationDto.setPostTaskCode(taskCode);
+        taskRelationDto.setPostTaskVersion(POST_TASK_VERSION_DEFAULT);
+        taskRelationDto.setConditionType(CONDITION_TYPE_DEFAULT);
+        taskRelationDto.setConditionParams(null);
+        return Collections.singletonList(taskRelationDto);
+    }
+
+    private List<LocationDto> buildLocation(List<Long> taskCode) {
+        final List<LocationDto> locations = Lists.newArrayListWithCapacity(taskCode.size());
+        for (int i = 0; i < taskCode.size(); i++) {
+            final LocationDto locationDto = new LocationDto();
+            locationDto.setTaskCode(taskCode.get(i));
+            locationDto.setX(LOCATIONS_X_DEFAULT * i);
+            locationDto.setY(LOCATIONS_Y_DEFAULT * i);
+            locations.add(locationDto);
+        }
+        return locations;
+    }
+
+    private void updateContent(int id, String content) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(UPDATE_CONTENT, id)))
+                .withMethod(Connection.Method.PUT)
+                .withData(createParamMap(RESOURCE_ID, id, RESOURCE_TYPE_FILE_CONTENT, content))
+                .withRequestBody(this.objectToString(null))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+    }
+
+    private void onlineCreateResource(OnlineCreateResourceDto createDto) {
+        final Map<String, Object> map = createDto.toMap();
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(ONLINE_CREATE_RESOURCE))
+                .withMethod(Connection.Method.POST)
+                .withData(translate(map))
+                .withRequestBody(this.objectToString(null))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+    }
+
+    private ResourceDto getResourceDto(String fullName, String fileType) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(String.format(QUERY_RESOURCE, RESOURCE_ID_DEFAULT)))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(FULL_NAME, fullName, RESOURCE_TYPE, RESOURCE_TYPE_FILE))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        final int code = checkResult(result, true);
+        if (code != CODE_SUCCESS) {
+            return null;
+        }
+        final Map<String, Object> map = MapUtils.getMap(result, DATA);
+        return this.mapToPojo(map, ResourceDto.class);
+    }
+
+    public InstanceLogDto getInstanceLog(long instanceId, int skipNum, int limitNum) {
+        final Map result = HttpUtils.builder()
+                .withUrl(apiPrefix.concat(LOG_DETAIL))
+                .withMethod(Connection.Method.GET)
+                .withData(createParamMap(TASK_INSTANCE_ID, instanceId, LOG_SKIP_LINE_NUM, skipNum, LOG_LIMIT_NUM, limitNum))
+                .withToken(TOKEN, token)
+                .execute(Map.class);
+        checkResult(result, false);
+        final String logContent = MapUtils.getString(result, DATA);
+        return InstanceLogDto.builder()
+                .lastSkipNum(skipNum)
+                .lastLimitNum(limitNum)
+                .instanceId(instanceId)
+                .content(logContent)
+                .build();
+    }
+
+    private int checkResult(Map result, boolean ignore) {
+        final int intValue = MapUtils.getIntValue(result, CODE, -1);
+        if (!ignore && CODE_SUCCESS != intValue) {
+            final String msg = MapUtils.getString(result, MSG);
+            throw new SeatunnelException(UNEXPECTED_RETURN_CODE, intValue, msg);
+        }
+        return intValue;
+    }
+
+    private Map<String, String> translate(Map<String, Object> origin) {
+        final HashMap<String, String> map = Maps.newHashMapWithExpectedSize(origin.size());
+        origin.forEach((k, v) -> map.put(k, String.valueOf(v)));
+        return map;
+    }
+
+    private <T> T mapToPojo(Map map, Class<T> pojo) {
+        try {
+            return MAPPER.readValue(MAPPER.writeValueAsString(map), pojo);
+        } catch (JsonProcessingException e) {
+            log.error("Map translate to Pojo failed.", e);
+            throw new SeatunnelException(SeatunnelErrorEnum.JSON_TRANSFORM_FAILED);
+        }
+    }
+
+    private String objectToString(Object o) {
+        try {
+            return MAPPER.writeValueAsString(o);
+        } catch (JsonProcessingException e) {
+            log.error("Map translate to Pojo failed.", e);
+            throw new SeatunnelException(SeatunnelErrorEnum.JSON_TRANSFORM_FAILED);
+        }
+    }
+}
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java
new file mode 100644
index 000000000..57615943c
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/InstanceServiceImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.impl;
+
+import org.apache.seatunnel.scheduler.dolphinscheduler.IDolphinschedulerService;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessInstanceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskInstanceDto;
+import org.apache.seatunnel.spi.scheduler.IInstanceService;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceDto;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceListDto;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class InstanceServiceImpl implements IInstanceService {
+
+    @Resource
+    private IDolphinschedulerService iDolphinschedulerService;
+
+    @Override
+    public List<InstanceDto> list(InstanceListDto dto) {
+
+        final ListProcessInstanceDto listDto = ListProcessInstanceDto.builder()
+                .processInstanceName(dto.getName())
+                .pageNo(dto.getPageNo())
+                .pageSize(dto.getPageSize())
+                .build();
+        final List<TaskInstanceDto> taskInstanceDtos = iDolphinschedulerService.listTaskInstance(listDto);
+
+        return taskInstanceDtos.stream().map(t -> InstanceDto.builder()
+                .instanceId(t.getId())
+                .instanceCode(t.getProcessInstanceId())
+                .instanceName(t.getProcessInstanceName())
+                .status(t.getState())
+                .startTime(t.getStartTime())
+                .endTime(t.getEndTime())
+                .submitTime(t.getSubmitTime())
+                .executionDuration(t.getDuration())
+                .retryTimes(t.getRetryTimes())
+                .build()).collect(Collectors.toList());
+    }
+}
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java
new file mode 100644
index 000000000..71dc5f1c5
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/impl/JobServiceImpl.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.impl;
+
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RELEASE_STATE_OFFLINE;
+import static org.apache.seatunnel.scheduler.dolphinscheduler.constants.DolphinschedulerConstants.RELEASE_STATE_ONLINE;
+
+import org.apache.seatunnel.scheduler.dolphinscheduler.IDolphinschedulerService;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ListProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.ProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.SchedulerDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskDescriptionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.dto.UpdateProcessDefinitionDto;
+import org.apache.seatunnel.spi.scheduler.IJobService;
+import org.apache.seatunnel.spi.scheduler.dto.JobDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobListDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobSimpleInfoDto;
+
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class JobServiceImpl implements IJobService {
+    @Resource
+    private IDolphinschedulerService iDolphinschedulerService;
+
+    @Override
+    public long submitJob(JobDto dto) {
+        // one process == one seatunnel script == one job
+
+        final TaskDescriptionDto taskDescriptionDto = TaskDescriptionDto.builder()
+                .name(dto.getJobName())
+                .executeScript(dto.getExecutorScript())
+                .content(dto.getJobContent())
+                .params(dto.getParams())
+                .retryInterval(dto.getSchedulerConfigDto().getRetryInterval())
+                .retryTimes(dto.getSchedulerConfigDto().getRetryTimes())
+                .build();
+
+        final UpdateProcessDefinitionDto processDto = UpdateProcessDefinitionDto.builder()
+                .name(dto.getJobName())
+                .startTime(dto.getSchedulerConfigDto().getStartTime())
+                .endTime(dto.getSchedulerConfigDto().getEndTime())
+                .cronExpression(dto.getSchedulerConfigDto().getTriggerExpression())
+                .taskDescriptionDto(taskDescriptionDto)
+                .processDefinitionCode(dto.getJobId())
+                .build();
+
+        final ProcessDefinitionDto processDefinition = iDolphinschedulerService.createOrUpdateProcessDefinition(processDto);
+        dto.setJobId(processDefinition.getCode());
+
+        iDolphinschedulerService.updateProcessDefinitionState(processDefinition.getCode(), processDefinition.getName(), RELEASE_STATE_ONLINE);
+        final SchedulerDto schedulerDto = iDolphinschedulerService.createOrUpdateSchedule(dto);
+        iDolphinschedulerService.scheduleOnline(schedulerDto.getId());
+
+        return processDefinition.getCode();
+    }
+
+    @Override
+    public void offlineJob(JobDto dto) {
+        iDolphinschedulerService.updateProcessDefinitionState(dto.getJobId(), dto.getJobName(), RELEASE_STATE_OFFLINE);
+    }
+
+    @Override
+    public List<JobSimpleInfoDto> list(JobListDto dto) {
+        final ListProcessDefinitionDto listDto = ListProcessDefinitionDto.builder()
+                .name(dto.getName())
+                .pageNo(dto.getPageNo())
+                .pageSize(dto.getPageSize())
+                .build();
+        final List<ProcessDefinitionDto> processDefinitionDtos = iDolphinschedulerService.listProcessDefinition(listDto);
+        return processDefinitionDtos.stream().map(p -> JobSimpleInfoDto.builder()
+                    .jobId(p.getCode())
+                    .jobStatus(p.getReleaseState())
+                    .createTime(p.getCreateTime())
+                    .updateTime(p.getUpdateTime())
+                    .creatorName(p.getUserName())
+                    .menderName(p.getUserName())
+                    .build())
+                .collect(Collectors.toList());
+    }
+
+}
diff --git a/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/HttpUtils.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/HttpUtils.java
new file mode 100644
index 000000000..67512f70c
--- /dev/null
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/HttpUtils.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.scheduler.dolphinscheduler.utils;
+
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.HTTP_REQUEST_FAILED;
+import static com.google.common.base.Preconditions.checkState;
+
+import org.apache.seatunnel.server.common.SeatunnelException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Connection;
+import org.jsoup.Jsoup;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Slf4j
+public class HttpUtils {
+
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    @SuppressWarnings("MagicNumber")
+    public static Map<String, String> createParamMap(Object... elements) {
+        if (elements == null || elements.length == 0 || elements.length % 2 == 1) {
+            throw new IllegalArgumentException("params length must be even!");
+        }
+        Map<String, String> paramMap = Maps.newHashMapWithExpectedSize(elements.length / 2);
+        for (int i = 0; i < elements.length / 2; i++) {
+            Object key = elements[2 * i];
+            Object value = elements[2 * i + 1];
+            if (key == null) {
+                continue;
+            }
+
+            paramMap.put(key.toString(), value == null ? "" : value.toString());
+        }
+
+        return paramMap;
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @SuppressWarnings("MagicNumber")
+    public static class Builder {
+        private Connection connection;
+        private String url;
+        private Optional<Map<String, String>> data = Optional.empty();
+        private Optional<String> requestBody = Optional.empty();
+        private Optional<Integer> maxBodySize = Optional.of(2147483647);
+        private Optional<String> postDataCharset = Optional.of("UTF-8");
+        private Optional<Boolean> ignoreContentType = Optional.of(true);
+        private Optional<Integer> timeout = Optional.of(30000);
+        private Optional<Map<String, String>> headers;
+        private Optional<Connection.Method> method = Optional.empty();
+
+        private Optional<Type> type;
+
+        public Builder() {
+            HashMap<String, String> defaultMap = Maps.newHashMap();
+            defaultMap.put("Content-Type", "application/json; charset=UTF-8");
+            headers = Optional.of(defaultMap);
+        }
+
+        public Builder withUrl(String url) {
+            this.url = url;
+            return this;
+        }
+
+        public Builder withData(Map<String, String> data) {
+            this.data = Optional.ofNullable(data);
+            return this;
+        }
+
+        public Builder withRequestBody(String requestBody) {
+            this.requestBody = Optional.ofNullable(requestBody);
+            return this;
+        }
+
+        public Builder withMaxBodySize(int maxBodySize) {
+            this.maxBodySize = Optional.of(maxBodySize);
+            return this;
+        }
+
+        public Builder withPostDataCharset(String postDataCharset) {
+            this.postDataCharset = Optional.ofNullable(postDataCharset);
+            return this;
+        }
+
+        public Builder withIgnoreContentType(boolean ignoreContentType) {
+            this.ignoreContentType = Optional.of(ignoreContentType);
+            return this;
+        }
+
+        public Builder withTimeout(int timeout) {
+            this.timeout = Optional.of(timeout);
+            return this;
+        }
+
+        public Builder withHeaders(Map<String, String> headers) {
+            this.headers = Optional.ofNullable(headers);
+            return this;
+        }
+
+        public Builder withMethod(Connection.Method method) {
+            this.method = Optional.ofNullable(method);
+            return this;
+        }
+
+        public Builder withToken(String tokenKey, String tokenValue) {
+            this.headers.ifPresent(map -> map.put(tokenKey, tokenValue));
+            return this;
+        }
+
+        private Connection build() {
+            checkState(!Strings.isNullOrEmpty(url), "request url is empty");
+            connection = Jsoup.connect(url);
+            data.ifPresent(connection::data);
+            requestBody.ifPresent(connection::requestBody);
+            maxBodySize.ifPresent(connection::maxBodySize);
+            postDataCharset.ifPresent(connection::postDataCharset);
+            ignoreContentType.ifPresent(connection::ignoreContentType);
+            timeout.ifPresent(connection::timeout);
+            headers.ifPresent(connection::headers);
+            method.ifPresent(connection::method);
+
+            return connection;
+        }
+
+        public <T> T execute(Class<T> type) {
+            this.build();
+            try {
+                Connection.Response response = connection.execute();
+                return MAPPER.readValue(response.body(), type);
+            } catch (IOException e) {
+                log.error("Request url {} failed", this.url, e);
+                throw new SeatunnelException(HTTP_REQUEST_FAILED, this.url);
+            }
+        }
+
+        public void execute() throws IOException {
+            this.build();
+            try {
+                connection.execute();
+            } catch (IOException e) {
+                log.error("Request url {} failed", this.url, e);
+                throw new SeatunnelException(HTTP_REQUEST_FAILED, this.url);
+            }
+        }
+    }
+}
diff --git a/seatunnel-server/pom.xml b/seatunnel-server/seatunnel-server-common/pom.xml
similarity index 78%
copy from seatunnel-server/pom.xml
copy to seatunnel-server/seatunnel-server-common/pom.xml
index dc9361510..e468d6eb4 100644
--- a/seatunnel-server/pom.xml
+++ b/seatunnel-server/seatunnel-server-common/pom.xml
@@ -17,16 +17,19 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>seatunnel</artifactId>
+        <artifactId>seatunnel-server</artifactId>
         <groupId>org.apache.seatunnel</groupId>
         <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>seatunnel-server</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>seatunnel-app</module>
-    </modules>
+    <artifactId>seatunnel-server-common</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
 </project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/Constants.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/Constants.java
index 146771460..d1370583b 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/Constants.java
@@ -15,26 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.server.common;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+public class Constants {
+    public static final String BLANK_SPACE = " ";
 }
diff --git a/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/DateUtils.java b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/DateUtils.java
new file mode 100644
index 000000000..47c016051
--- /dev/null
+++ b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/DateUtils.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.server.common;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+@Slf4j
+public class DateUtils {
+    public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    public static final String DEFAULT_DATETIME_FORMAT_WITH_TIMEZONE = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ";
+
+    /**
+     * parse Date to String Date, use default datetime format 'yyyy-MM-dd HH:mm:ss'
+     * @param date which need been format to String date
+     * @return String date
+     */
+    public static String format(Date date) {
+        return format(date2LocalDateTime(date), DEFAULT_DATETIME_FORMAT);
+    }
+
+    public static String format(LocalDateTime localDateTime, String format) {
+        return localDateTime.format(DateTimeFormatter.ofPattern(format));
+    }
+
+    private static LocalDateTime date2LocalDateTime(Date date) {
+        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
+    }
+
+    /**
+     * parse String date to Date, use default datetime format 'yyyy-MM-dd HH:mm:ss'
+     * @param date which need been parse to Date
+     * @return Date
+     */
+    public static Date parse(String date) {
+        LocalDateTime localDateTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DEFAULT_DATETIME_FORMAT));
+        return localDateTime2Date(localDateTime);
+    }
+
+    public static Date parse(String date, String format) {
+        LocalDateTime localDateTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(format));
+        return localDateTime2Date(localDateTime);
+    }
+
+    private static Date localDateTime2Date(LocalDateTime localDateTime) {
+        Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
+        return Date.from(instant);
+    }
+}
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelErrorEnum.java b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java
similarity index 61%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelErrorEnum.java
rename to seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java
index 5e54ef5fa..9de5b7436 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelErrorEnum.java
+++ b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.common;
+package org.apache.seatunnel.server.common;
 
 public enum SeatunnelErrorEnum {
 
@@ -23,8 +23,21 @@ public enum SeatunnelErrorEnum {
     NO_SUCH_SCRIPT(10002, "no such script", "No such script. Maybe deleted by others."),
     USER_ALREADY_EXISTS(10003, "user already exist", "The same username [%s] is exist."),
     NO_SUCH_USER(10002, "no such user", "No such user. Maybe deleted by others."),
+    SCHEDULER_CONFIG_NOT_EXIST(10003, "scheduler config not exist", "This script's scheduler config not exist, please check your config."),
+    JSON_TRANSFORM_FAILED(10004, "json transform failed", "Json transform failed, it may be a bug."),
+
+    /**
+     * request dolphinscheduler failed
+     */
+    UNEXPECTED_RETURN_CODE(20000, "Unexpected return code", "Unexpected return code : [%s], error msg is [%s]"),
+    QUERY_PROJECT_CODE_FAILED(20001, "query project code failed", "Request ds for querying project code failed"),
+    NO_MATCHED_PROJECT(20002, "no matched project", "No matched project [%s], please check your configuration"),
+    NO_MATCHED_SCRIPT_SAVE_DIR(20003, "no matched script save dir", "No matched script save dir [%s], please check your configuration"),
+
+    UNSUPPORTED_OPERATION(99996, "unsupported operation", "This operation [%s] is not supported now."),
+    HTTP_REQUEST_FAILED(99997, "http request failed", "Http request failed, url is %s"),
     ILLEGAL_STATE(99998, "illegal state", "%s"),
-    UNKNOWN(99999, "unknown exception", "%s")
+    UNKNOWN(99999, "unknown exception", "Unknown exception")
     ;
 
     private final int code;
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelException.java b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelException.java
similarity index 86%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelException.java
rename to seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelException.java
index e68329631..49d5a8c81 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/SeatunnelException.java
+++ b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelException.java
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.common;
-
-import java.util.Arrays;
+package org.apache.seatunnel.server.common;
 
 public class SeatunnelException extends RuntimeException{
     private SeatunnelErrorEnum errorEnum;
@@ -27,12 +25,12 @@ public class SeatunnelException extends RuntimeException{
         this.errorEnum = e;
     }
 
-    public SeatunnelException(SeatunnelErrorEnum e, String... msg) {
-        super(e.getMsg().concat(" ").concat(Arrays.toString(msg)));
+    public SeatunnelException(SeatunnelErrorEnum e, Object... msg) {
+        super(String.format(e.getTemplate(), msg));
         this.errorEnum = e;
     }
 
-    public static SeatunnelException newInstance(SeatunnelErrorEnum e, String... msg) {
+    public static SeatunnelException newInstance(SeatunnelErrorEnum e, Object... msg) {
         return new SeatunnelException(e, msg);
 
     }
diff --git a/seatunnel-server/pom.xml b/seatunnel-server/seatunnel-spi/pom.xml
similarity index 77%
copy from seatunnel-server/pom.xml
copy to seatunnel-server/seatunnel-spi/pom.xml
index dc9361510..8d5920974 100644
--- a/seatunnel-server/pom.xml
+++ b/seatunnel-server/seatunnel-spi/pom.xml
@@ -17,16 +17,20 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>seatunnel</artifactId>
+        <artifactId>seatunnel-server</artifactId>
         <groupId>org.apache.seatunnel</groupId>
         <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>seatunnel-server</artifactId>
-    <packaging>pom</packaging>
-    <modules>
-        <module>seatunnel-app</module>
-    </modules>
+    <artifactId>seatunnel-spi</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.seatunnel</groupId>
+            <artifactId>seatunnel-server-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/IInstanceService.java
similarity index 62%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/IInstanceService.java
index 146771460..80572b1cf 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/IInstanceService.java
@@ -15,26 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.spi.scheduler;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceDto;
+import org.apache.seatunnel.spi.scheduler.dto.InstanceListDto;
 
 import java.util.List;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+public interface IInstanceService {
+    List<InstanceDto> list(InstanceListDto dto);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/IJobService.java
similarity index 62%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/IJobService.java
index 146771460..87b0fb24b 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/IJobService.java
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.spi.scheduler;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobListDto;
+import org.apache.seatunnel.spi.scheduler.dto.JobSimpleInfoDto;
 
 import java.util.List;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
+public interface IJobService {
 
-    void checkUserExists(String username);
+    long submitJob(JobDto dto);
 
-    void update(UpdateUserDto dto);
+    void offlineJob(JobDto dto);
 
-    void delete(int id);
+    List<JobSimpleInfoDto> list(JobListDto dto);
 
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java
index 146771460..dbb06e07f 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java
@@ -15,26 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.spi.scheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Builder
+public class InstanceDto {
+    private long instanceId;
+    private long instanceCode;
+    private String instanceName;
+    private Date submitTime;
+    private Date startTime;
+    private Date endTime;
+    private String status;
+    private String executionDuration;
+    private long retryTimes;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceListDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceListDto.java
index 146771460..0b05302d3 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceListDto.java
@@ -15,26 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.spi.scheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Builder
+@Data
+public class InstanceListDto {
+    private String name;
+    private int pageNo;
+    private int pageSize;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceLogDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceLogDto.java
index 146771460..f2ddc77f5 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceLogDto.java
@@ -15,26 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.spi.scheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Builder
+@Data
+public class InstanceLogDto {
+    private long instanceId;
+    private int lastSkipNum;
+    private int lastLimitNum;
+    private String content;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobDto.java
index 146771460..3f30194b6 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobDto.java
@@ -15,26 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.spi.scheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+@Builder
+public class JobDto {
+    private Long jobId;
+    private String jobName;
+    private String executorScript;
+    private String jobContent;
+    private Integer operatorId;
+    private Map<String, Object> params;
+    private SchedulerConfigDto schedulerConfigDto;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobListDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobListDto.java
index 146771460..5e5b1fcdc 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobListDto.java
@@ -15,26 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.spi.scheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@Builder
+public class JobListDto {
+    private String name;
+    private Integer pageNo;
+    private Integer pageSize;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
index 146771460..28e88e9c6 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
@@ -15,26 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
-
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
-
-import java.util.List;
-
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+package org.apache.seatunnel.spi.scheduler.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+@Builder
+@Data
+public class JobSimpleInfoDto {
+    private long jobId;
+    private String jobStatus;
+    private String creatorName;
+    private String menderName;
+    private Date createTime;
+    private Date updateTime;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/SchedulerConfigDto.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
copy to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/SchedulerConfigDto.java
index 146771460..aa71ac686 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/SchedulerConfigDto.java
@@ -15,26 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.spi.scheduler.dto;
 
-import org.apache.seatunnel.app.dal.entity.User;
-import org.apache.seatunnel.app.domain.dto.user.ListUserDto;
-import org.apache.seatunnel.app.domain.dto.user.UpdateUserDto;
+import lombok.Builder;
+import lombok.Data;
 
-import java.util.List;
+import java.util.Date;
 
-public interface IUserDao {
-    int add(UpdateUserDto dto);
-
-    void checkUserExists(String username);
-
-    void update(UpdateUserDto dto);
-
-    void delete(int id);
-
-    void enable(int id);
-
-    void disable(int id);
-
-    List<User> list(ListUserDto dto, int pageNo, int pageSize);
+@Data
+@Builder
+public class SchedulerConfigDto {
+    private int retryTimes;
+    private int retryInterval;
+    private Date startTime;
+    private Date endTime;
+    private String triggerExpression;
 }
diff --git a/tools/dependencies/known-dependencies.txt b/tools/dependencies/known-dependencies.txt
index 6d80f5ad1..fd6f9ad8a 100755
--- a/tools/dependencies/known-dependencies.txt
+++ b/tools/dependencies/known-dependencies.txt
@@ -428,6 +428,7 @@ jpam-1.1.jar
 jsch-0.1.54.jar
 json-path-2.3.0.jar
 json-smart-2.3.jar
+jsoup-1.14.3.jar
 jsp-api-2.1.jar
 jsr305-1.3.9.jar
 jsr305-2.0.1.jar