You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@seatunnel.apache.org by ty...@apache.org on 2023/03/07 06:25:31 UTC

[incubator-seatunnel-web] branch main updated: [Hotfix] Bugfix 2 (#42)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 6896be4d [Hotfix] Bugfix 2 (#42)
6896be4d is described below

commit 6896be4d10bf4c1bc9cac416a1082f334804a761
Author: dijie <nj...@gmail.com>
AuthorDate: Tue Mar 7 14:25:25 2023 +0800

    [Hotfix] Bugfix 2 (#42)
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design (#12)
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    ---------
    
    Co-authored-by: dijie <di...@clickzetta.com>
    
    * [Improve][seatunnel-server] Bugfix
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Update api style follow front-end & product-design
    
    * [Improve][seatunnel-server] Bug fix
    
    * [Improve][seatunnel-server] Bugfix
    
    * [Improve][seatunnel-server] merge conflicts
    
    * [Improve][seatunnel-server] bug fix
    
    * [Improve][seatunnel-server] bug fix
    
    * [Improve][seatunnel-server] bug fix
    
    ---------
    
    Co-authored-by: dijie <di...@clickzetta.com>
---
 seatunnel-server/pom.xml                           |   1 +
 seatunnel-server/seatunnel-app/pom.xml             |   7 ++
 .../{ScriptStatusEnum.java => ObjectTypeEnum.java} |  34 +++---
 .../seatunnel/app/common/ScriptStatusEnum.java     |  12 ++
 .../seatunnel/app/controller/ScriptController.java |  30 +++--
 .../seatunnel/app/controller/TaskController.java   |  16 +--
 .../seatunnel/app/controller/UserController.java   |   2 +-
 .../apache/seatunnel/app/dal/dao/IScriptDao.java   |   6 +-
 .../seatunnel/app/dal/dao/IScriptJobApplyDao.java  |   7 ++
 .../seatunnel/app/dal/dao/impl/ScriptDaoImpl.java  |  11 +-
 .../app/dal/dao/impl/ScriptJobApplyDaoImpl.java    |  12 ++
 .../seatunnel/app/dal/entity/JobDefine.java}       |  29 +++--
 .../app/dal/mapper/ScriptJobApplyMapper.java       |   7 ++
 ...AddEmptyScriptDto.java => CreateScriptDto.java} |   3 +-
 ...AddEmptyScriptReq.java => CreateScriptReq.java} |   4 +-
 .../app/domain/request/script/ScriptListReq.java   |   2 -
 .../app/domain/request/task/ExecuteReq.java        |   4 +-
 .../app/domain/request/task/RecycleScriptReq.java  |   2 +-
 .../app/domain/request/user/BaseUserReq.java       |   4 +-
 .../seatunnel/app/domain/response/PageInfo.java    |   3 +-
 .../domain/response/script/BaseScriptInfoRes.java  |   4 +-
 ...AddEmptyScriptRes.java => CreateScriptRes.java} |   2 +-
 ...dEmptyScriptRes.java => ScriptFullInfoRes.java} |   8 +-
 .../response/task/InstanceSimpleInfoRes.java       |   4 +
 .../app/domain/response/task/JobSimpleInfoRes.java |  12 +-
 .../domain/response/user/UserSimpleInfoRes.java    |   7 +-
 .../seatunnel/app/service/IScriptService.java      |   9 +-
 .../app/service/impl/ScriptServiceImpl.java        |  55 ++++++---
 .../app/service/impl/TaskServiceImpl.java          | 126 +++++++++++++++++++--
 .../app/utils/GlobalExceptionHandler.java          |   9 +-
 .../app/dal/mapper/ScriptJobApplyMapper.xml        |  49 ++++++++
 .../seatunnel/app/dal/mapper/ScriptMapper.xml      |  13 +--
 .../apache/seatunnel/app/dal/mapper/UserMapper.xml |   2 +-
 .../dolphinscheduler/IDolphinschedulerService.java |   2 +
 .../constants/DolphinschedulerConstants.java       |   1 +
 .../dolphinscheduler/dto/ProcessDefinitionDto.java |   2 +-
 .../dolphinscheduler/enums/ReleaseStateEnum.java}  |  33 +++---
 .../dolphinscheduler/enums/RunFrequencyEnum.java}  |  18 ++-
 .../impl/DolphinschedulerServiceImpl.java          |   8 +-
 .../dolphinscheduler/impl/InstanceServiceImpl.java |   5 +-
 .../dolphinscheduler/impl/JobServiceImpl.java      |  16 ++-
 .../dolphinscheduler/utils/StatusUtils.java}       |  36 +++---
 .../server/common/SeatunnelErrorEnum.java          |   1 +
 .../seatunnel/spi/scheduler/dto/InstanceDto.java   |   1 +
 .../spi/scheduler/dto/JobSimpleInfoDto.java        |   2 +
 .../spi/scheduler/enums/InstanceStatusEnum.java}   |  14 ++-
 tools/dependencies/known-dependencies.txt          |   3 +
 47 files changed, 480 insertions(+), 158 deletions(-)

diff --git a/seatunnel-server/pom.xml b/seatunnel-server/pom.xml
index 6e3b7022..79ef3a31 100644
--- a/seatunnel-server/pom.xml
+++ b/seatunnel-server/pom.xml
@@ -43,6 +43,7 @@
         <javax.annotation-api.version>1.3.2</javax.annotation-api.version>
         <jsoup.version>1.14.3</jsoup.version>
         <jwt.version>0.10.7</jwt.version>
+        <cron-utils.version>9.1.6</cron-utils.version>
     </properties>
 
     <dependencyManagement>
diff --git a/seatunnel-server/seatunnel-app/pom.xml b/seatunnel-server/seatunnel-app/pom.xml
index 3a5acfe6..8b1dddf1 100644
--- a/seatunnel-server/seatunnel-app/pom.xml
+++ b/seatunnel-server/seatunnel-app/pom.xml
@@ -167,6 +167,13 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.cronutils/cron-utils -->
+        <dependency>
+            <groupId>com.cronutils</groupId>
+            <artifactId>cron-utils</artifactId>
+            <version>${cron-utils.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ObjectTypeEnum.java
similarity index 60%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ObjectTypeEnum.java
index 17704a21..9bfdf720 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ObjectTypeEnum.java
@@ -17,25 +17,25 @@
 
 package org.apache.seatunnel.app.common;
 
-public enum ScriptStatusEnum {
-    UNPUBLISHED(0, "unpublished"),
-    PUBLISHED(1, "published"),
-    DELETED(2, "deleted"),
-    ;
-
-    private final int code;
-    private final String  description;
+import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
+import org.apache.seatunnel.server.common.SeatunnelException;
 
-    ScriptStatusEnum(int code, String description) {
-        this.code = code;
-        this.description = description;
-    }
+import java.util.Objects;
 
-    public int getCode() {
-        return code;
-    }
+public enum ObjectTypeEnum {
+    SCRIPT,
+    JOB,
+    INSTANCE,
+    ;
 
-    public String getDescription() {
-        return description;
+    public static ObjectTypeEnum parse(Integer type) {
+        if (Objects.nonNull(type)) {
+            for (ObjectTypeEnum value : ObjectTypeEnum.values()) {
+                if (value.ordinal() == type) {
+                    return value;
+                }
+            }
+        }
+        throw new SeatunnelException(SeatunnelErrorEnum.NO_SUCH_ELEMENT);
     }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
index 17704a21..0a4144e0 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
@@ -31,6 +31,18 @@ public enum ScriptStatusEnum {
         this.description = description;
     }
 
+    public static String parse(Byte status) {
+        if (status == null) {
+            throw new IllegalArgumentException("status is null");
+        }
+        for (ScriptStatusEnum scriptStatusEnum : ScriptStatusEnum.values()) {
+            if (scriptStatusEnum.getCode() == status) {
+                return scriptStatusEnum.getDescription();
+            }
+        }
+        throw new IllegalArgumentException("status is illegal");
+    }
+
     public int getCode() {
         return code;
     }
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 62367953..ff094d43 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,19 +19,18 @@ package org.apache.seatunnel.app.controller;
 
 import org.apache.seatunnel.app.aspect.UserId;
 import org.apache.seatunnel.app.common.Result;
-import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.CreateScriptReq;
 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;
 import org.apache.seatunnel.app.domain.response.PageInfo;
-import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
+import org.apache.seatunnel.app.domain.response.script.CreateScriptRes;
+import org.apache.seatunnel.app.domain.response.script.ScriptFullInfoRes;
 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 io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -58,21 +57,19 @@ public class ScriptController {
     private IScriptService iScriptService;
 
     @PostMapping
-    @ApiOperation(value = "add an empty script", httpMethod = "POST")
-    public Result<AddEmptyScriptRes> addEmptyScript(@RequestBody @NotNull AddEmptyScriptReq addEmptyScriptReq,
-                                                    @ApiIgnore @UserId Integer operatorId) {
-        addEmptyScriptReq.setCreatorId(operatorId);
-        return Result.success(iScriptService.addEmptyScript(addEmptyScriptReq));
+    @ApiOperation(value = "add an script with content", httpMethod = "POST")
+    public Result<CreateScriptRes> createScript(@RequestBody @NotNull CreateScriptReq createScriptReq,
+                                                  @ApiIgnore @UserId Integer operatorId) {
+        createScriptReq.setCreatorId(operatorId);
+        return Result.success(iScriptService.createScript(createScriptReq));
     }
 
     @PutMapping("/{scriptId}/content")
     @ApiOperation(value = "update script", httpMethod = "PUT")
     public Result<Void> updateScriptContent(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId,
-                                            @RequestBody @NotNull String content,
+                                            @RequestBody @NotNull UpdateScriptContentReq req,
                                             @ApiIgnore @UserId Integer operatorId) {
-        final UpdateScriptContentReq req = new UpdateScriptContentReq();
         req.setScriptId(scriptId);
-        req.setContent(content);
         req.setMenderId(operatorId);
 
         iScriptService.updateScriptContent(req);
@@ -95,7 +92,6 @@ public class ScriptController {
 
         final ScriptListReq req = new ScriptListReq();
         req.setName(name);
-        req.setStatus(status);
         req.setPageNo(pageNo);
         req.setPageSize(pageSize);
 
@@ -108,6 +104,11 @@ public class ScriptController {
         return Result.success(iScriptService.fetchScriptContent(scriptId));
     }
 
+    @GetMapping("/{scriptId}")
+    public Result<ScriptFullInfoRes> detail(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId) {
+        return Result.success(iScriptService.detail(scriptId));
+    }
+
     @PutMapping("/{scriptId}/param")
     @ApiOperation(value = "update script param", httpMethod = "PUT")
     public Result<Void> updateScriptParam(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId,
@@ -119,9 +120,6 @@ public class ScriptController {
 
     @GetMapping("/{scriptId}/param")
     @ApiOperation(value = "fetch script param", httpMethod = "GET")
-    @ApiImplicitParams({
-        @ApiImplicitParam(name = "id", value = "script id", dataType = "Integer"),
-    })
     public Result<List<ScriptParamRes>> fetchScriptParam(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId) {
         return Result.success(iScriptService.fetchScriptParam(scriptId));
     }
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
index 5ca3ace8..43f141d7 100644
--- 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
@@ -51,12 +51,12 @@ public class TaskController {
     @Resource
     private ITaskService iTaskService;
 
-    @PatchMapping("/{scriptId}/recycle")
-    @ApiOperation(value = "recycle script", httpMethod = "PATCH")
-    Result<Void> recycle(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId,
+    @PatchMapping("/{jobId}/recycle")
+    @ApiOperation(value = "recycle job", httpMethod = "PATCH")
+    Result<Void> recycle(@ApiParam(value = "job id", required = true) @PathVariable(value = "jobId") Long jobId,
                          @ApiIgnore @UserId Integer operatorId) {
         final RecycleScriptReq req = new RecycleScriptReq();
-        req.setScriptId(scriptId);
+        req.setJobId(jobId);
         req.setOperatorId(operatorId);
 
         iTaskService.recycleScriptFromScheduler(req);
@@ -78,7 +78,7 @@ public class TaskController {
 
     @GetMapping("/instance")
     @ApiOperation(value = "list instance", httpMethod = "GET")
-    Result<PageInfo<InstanceSimpleInfoRes>> listInstance(@ApiParam(value = "job name") @RequestParam(required = false) String name,
+    Result<PageInfo<InstanceSimpleInfoRes>> listInstance(@ApiParam(value = "job name", required = false) @RequestParam(required = false) String name,
                                                          @ApiParam(value = "page num", required = true) @RequestParam Integer pageNo,
                                                          @ApiParam(value = "page size", required = true) @RequestParam Integer pageSize) {
         final InstanceListReq req = new InstanceListReq();
@@ -89,12 +89,12 @@ public class TaskController {
         return Result.success(iTaskService.listInstance(req));
     }
 
-    @PostMapping("/{scriptId}/execute")
+    @PostMapping("/{objectId}/execute")
     @ApiOperation(value = "execute script temporary", httpMethod = "POST")
-    Result<InstanceSimpleInfoRes> tmpExecute(@ApiParam(value = "script id", required = true) @PathVariable(value = "scriptId") Integer scriptId,
+    Result<InstanceSimpleInfoRes> tmpExecute(@ApiParam(value = "object id", required = true) @PathVariable(value = "objectId") Long objectId,
                                              @RequestBody @NotNull ExecuteReq req,
                                              @ApiIgnore @UserId Integer operatorId) {
-        req.setScriptId(scriptId);
+        req.setObjectId(objectId);
         req.setOperatorId(operatorId);
 
         return Result.success(iTaskService.tmpExecute(req));
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
index 59a59ee8..08cd9072 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/UserController.java
@@ -75,7 +75,7 @@ public class UserController {
 
     @GetMapping
     @ApiOperation(value = "user list", httpMethod = "GET")
-    public Result<PageInfo<UserSimpleInfoRes>> list(@ApiParam(value = "job name") @RequestParam(required = false) String name,
+    public Result<PageInfo<UserSimpleInfoRes>> list(@ApiParam(value = "user name") @RequestParam(required = false) String name,
                                                     @ApiParam(value = "page num", required = true) @RequestParam Integer pageNo,
                                                     @ApiParam(value = "page size", required = true) @RequestParam Integer pageSize) {
         final UserListReq req = new UserListReq();
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java
index 0178b58b..d01114f8 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptDao.java
@@ -18,8 +18,8 @@
 package org.apache.seatunnel.app.dal.dao;
 
 import org.apache.seatunnel.app.dal.entity.Script;
-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.CreateScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.ListScriptsDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptContentDto;
 import org.apache.seatunnel.server.common.PageData;
@@ -27,7 +27,7 @@ import org.apache.seatunnel.server.common.PageData;
 public interface IScriptDao {
     void checkScriptDuplicate(CheckScriptDuplicateDto dto);
 
-    int addEmptyScript(AddEmptyScriptDto dto);
+    int createScript(CreateScriptDto dto);
 
     Script getScript(Integer id);
 
@@ -36,4 +36,6 @@ public interface IScriptDao {
     void deleteScript(int id);
 
     PageData<Script> list(ListScriptsDto dto, Integer pageNo, Integer pageSize);
+
+    void updateStatus(Script script);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
index 0efdae26..7d571b71 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
@@ -17,11 +17,18 @@
 
 package org.apache.seatunnel.app.dal.dao;
 
+import org.apache.seatunnel.app.dal.entity.JobDefine;
 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);
 
     ScriptJobApply getByScriptId(Integer id);
+
+    List<JobDefine> selectJobDefineByJobIds(List<Long> jobIds);
+
+    ScriptJobApply getByJobId(long jobId);
 }
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 0f2c7357..7f18048d 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
@@ -24,8 +24,8 @@ import org.apache.seatunnel.app.common.ScriptStatusEnum;
 import org.apache.seatunnel.app.dal.dao.IScriptDao;
 import org.apache.seatunnel.app.dal.entity.Script;
 import org.apache.seatunnel.app.dal.mapper.ScriptMapper;
-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.CreateScriptDto;
 import org.apache.seatunnel.app.domain.dto.script.ListScriptsDto;
 import org.apache.seatunnel.app.domain.dto.script.UpdateScriptContentDto;
 import org.apache.seatunnel.server.common.PageData;
@@ -50,13 +50,14 @@ public class ScriptDaoImpl implements IScriptDao {
     }
 
     @Override
-    public int addEmptyScript(AddEmptyScriptDto dto) {
+    public int createScript(CreateScriptDto dto) {
         final Script script = new Script();
         script.setName(dto.getName());
         script.setType(dto.getType());
         script.setStatus(dto.getStatus());
         script.setCreatorId(dto.getCreatorId());
         script.setMenderId(dto.getMenderId());
+        script.setContent(dto.getContent());
         scriptMapper.insert(script);
         return script.getId();
     }
@@ -80,11 +81,15 @@ public class ScriptDaoImpl implements IScriptDao {
     public PageData<Script> list(ListScriptsDto dto, Integer pageNo, Integer pageSize) {
         final Script script = new Script();
         script.setName(dto.getName());
-        script.setStatus(dto.getStatus());
 
         final List<Script> scripts = scriptMapper.selectBySelectiveAndPage(script, pageNo * pageSize, pageSize);
         int count = scriptMapper.countBySelectiveAndPage(script);
 
         return new PageData<Script>(count, scripts);
     }
+
+    @Override
+    public void updateStatus(Script script) {
+        scriptMapper.updateStatus(script.getId(), script.getStatus());
+    }
 }
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
index 1b5b1d50..0aab6d50 100644
--- 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
@@ -18,6 +18,7 @@
 package org.apache.seatunnel.app.dal.dao.impl;
 
 import org.apache.seatunnel.app.dal.dao.IScriptJobApplyDao;
+import org.apache.seatunnel.app.dal.entity.JobDefine;
 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;
@@ -26,6 +27,7 @@ import org.springframework.stereotype.Repository;
 
 import javax.annotation.Resource;
 
+import java.util.List;
 import java.util.Objects;
 
 @Repository
@@ -56,4 +58,14 @@ public class ScriptJobApplyDaoImpl implements IScriptJobApplyDao {
     public ScriptJobApply getByScriptId(Integer id) {
         return scriptJobApplyMapper.selectByScriptId(id);
     }
+
+    @Override
+    public List<JobDefine> selectJobDefineByJobIds(List<Long> jobIds) {
+        return scriptJobApplyMapper.selectJobDefineByJobIds(jobIds);
+    }
+
+    @Override
+    public ScriptJobApply getByJobId(long jobId) {
+        return scriptJobApplyMapper.selectByJobId(jobId);
+    }
 }
diff --git a/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/JobDefine.java
similarity index 70%
copy from seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/JobDefine.java
index 28e88e9c..9befbe97 100644
--- a/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/entity/JobDefine.java
@@ -15,20 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.spi.scheduler.dto;
+package org.apache.seatunnel.app.dal.entity;
 
-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;
+public class JobDefine {
+    private Integer scriptId;
+
+    private Integer schedulerConfigId;
+
+    private Long jobId;
+
+    private Integer operatorId;
+
     private Date createTime;
+
     private Date updateTime;
+
+    private String triggerExpression;
+
+    private Integer retryTimes;
+
+    private Integer retryInterval;
+
+    private Date activeStartTime;
+
+    private Date activeEndTime;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java
index 4115fd9c..5dddcfc6 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/ScriptJobApplyMapper.java
@@ -17,10 +17,13 @@
 
 package org.apache.seatunnel.app.dal.mapper;
 
+import org.apache.seatunnel.app.dal.entity.JobDefine;
 import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
 
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface ScriptJobApplyMapper {
     int deleteByPrimaryKey(Integer id);
 
@@ -31,4 +34,8 @@ public interface ScriptJobApplyMapper {
     void update(ScriptJobApply record);
 
     ScriptJobApply selectByScriptId(@Param("scriptId") int scriptId);
+
+    List<JobDefine> selectJobDefineByJobIds(@Param("jobIds") List<Long> jobIds);
+
+    ScriptJobApply selectByJobId(@Param("jobId") long jobId);
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/AddEmptyScriptDto.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/CreateScriptDto.java
similarity index 94%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/AddEmptyScriptDto.java
rename to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/CreateScriptDto.java
index f2245c4a..35121c5b 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/AddEmptyScriptDto.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/dto/script/CreateScriptDto.java
@@ -22,10 +22,11 @@ import lombok.Data;
 
 @Builder
 @Data
-public class AddEmptyScriptDto {
+public class CreateScriptDto {
     private String name;
     private byte type;
     private int creatorId;
     private int menderId;
     private byte status;
+    private String content;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/AddEmptyScriptReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/CreateScriptReq.java
similarity index 91%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/AddEmptyScriptReq.java
rename to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/CreateScriptReq.java
index 4bd650d6..a5511321 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/AddEmptyScriptReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/CreateScriptReq.java
@@ -25,7 +25,7 @@ import javax.validation.constraints.NotNull;
 
 @Data
 @ApiModel(value = "addEmptyScriptReq", description = "add a new empty script")
-public class AddEmptyScriptReq {
+public class CreateScriptReq {
     @ApiModelProperty(value = "script name", required = true, dataType = "String")
     private String name;
     @ApiModelProperty(value = "script type", required = true, dataType = "Byte")
@@ -34,4 +34,6 @@ public class AddEmptyScriptReq {
     @ApiModelProperty(value = "script creator id", required = true, dataType = "Integer", hidden = true)
     @NotNull
     private Integer creatorId;
+    @ApiModelProperty(value = "script content", required = true, dataType = "String")
+    private String content;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java
index 3ac64ba1..30cf4eb7 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/script/ScriptListReq.java
@@ -28,6 +28,4 @@ import lombok.Data;
 public class ScriptListReq extends BasePageReq {
     @ApiModelProperty(value = "script name", required = false, dataType = "String")
     private String name;
-    @ApiModelProperty(value = "script status", required = false, dataType = "Integer")
-    private Byte status;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/ExecuteReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/ExecuteReq.java
index fd853d43..4f77ca79 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/ExecuteReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/ExecuteReq.java
@@ -28,7 +28,9 @@ import java.util.Map;
 @Data
 public class ExecuteReq {
     @ApiModelProperty(value = "script id", required = true, dataType = "Integer", hidden = true)
-    private Integer scriptId;
+    private Long objectId;
+    @ApiModelProperty(value = "object type", required = true, dataType = "Integer")
+    private Integer objectType;
     @ApiModelProperty(value = "execute content", required = true, dataType = "String")
     private String content;
     @ApiModelProperty(value = "operator id", required = true, dataType = "Integer", hidden = true)
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java
index 5ee65d63..754949da 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/task/RecycleScriptReq.java
@@ -28,7 +28,7 @@ import javax.validation.constraints.NotNull;
 public class RecycleScriptReq {
     @ApiModelProperty(value = "script id", required = true, dataType = "Integer")
     @NotNull
-    private int scriptId;
+    private long jobId;
     @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/request/user/BaseUserReq.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/user/BaseUserReq.java
index 8ee3b671..87e44887 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/user/BaseUserReq.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/request/user/BaseUserReq.java
@@ -28,10 +28,10 @@ public class BaseUserReq {
     private String username;
     @ApiModelProperty(value = "user password", required = true, dataType = "String")
     private String password;
-    @ApiModelProperty(value = "user status", required = true, dataType = "Byte")
+    @ApiModelProperty(value = "user status", required = true, dataType = "Integer")
     @NotNull
     private Byte status;
-    @ApiModelProperty(value = "user type", required = true, dataType = "Byte")
+    @ApiModelProperty(value = "user type", required = true, dataType = "Integer")
     @NotNull
     private Byte type;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/PageInfo.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/PageInfo.java
index f4ced6e8..fb757c1e 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/PageInfo.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/PageInfo.java
@@ -19,12 +19,13 @@ package org.apache.seatunnel.app.domain.response;
 
 import io.swagger.annotations.ApiModel;
 
+import java.util.Collections;
 import java.util.List;
 
 @ApiModel(value = "pageInfo", description = "page info")
 @SuppressWarnings("MagicNumber")
 public class PageInfo<T> {
-    private List<T> data;
+    private List<T> data = Collections.emptyList();
     private Integer totalCount = 0;
     private Integer totalPage = 0;
     private Integer pageNo = 1;
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java
index 43580582..d8c5032a 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/BaseScriptInfoRes.java
@@ -28,8 +28,8 @@ public class BaseScriptInfoRes {
     private int id;
     @ApiModelProperty(value = "script name", dataType = "String")
     private String name;
-    @ApiModelProperty(value = "script status", dataType = "type")
-    private byte status;
+    @ApiModelProperty(value = "script status", dataType = "String")
+    private String status;
     @ApiModelProperty(value = "script type", dataType = "type")
     private byte type;
     @ApiModelProperty(value = "script creator id", required = true, dataType = "Integer")
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/CreateScriptRes.java
similarity index 96%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/CreateScriptRes.java
index 1037f9f8..9874abfd 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/CreateScriptRes.java
@@ -20,6 +20,6 @@ package org.apache.seatunnel.app.domain.response.script;
 import lombok.Data;
 
 @Data
-public class AddEmptyScriptRes {
+public class CreateScriptRes {
     private int id;
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/ScriptFullInfoRes.java
similarity index 73%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
copy to seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/ScriptFullInfoRes.java
index 1037f9f8..5253da02 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/ScriptFullInfoRes.java
@@ -17,9 +17,13 @@
 
 package org.apache.seatunnel.app.domain.response.script;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
-public class AddEmptyScriptRes {
-    private int id;
+@ApiModel(value = "scriptFullInfoRes", description = "script full info")
+public class ScriptFullInfoRes extends BaseScriptInfoRes{
+    @ApiModelProperty(value = "script content", dataType = "String")
+    private String content;
 }
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
index 2a681574..1bf4038a 100644
--- 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
@@ -40,10 +40,14 @@ public class InstanceSimpleInfoRes {
     private Date startTime;
     @ApiModelProperty(value = "end time", dataType = "Date")
     private Date endTime;
+    @ApiModelProperty(value = "next execution time", dataType = "Date")
+    private Date nextExecutionTime;
     @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;
+    @ApiModelProperty(value = "run frequency", dataType = "String")
+    private String runFrequency;
 }
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
index 40b003be..90e8a4f5 100644
--- 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
@@ -17,6 +17,7 @@
 
 package org.apache.seatunnel.app.domain.response.task;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Builder;
@@ -29,9 +30,18 @@ import java.util.Date;
 @Builder
 public class JobSimpleInfoRes {
     @ApiModelProperty(value = "job id", dataType = "Long")
-    private long jobId;
+    private Long jobId;
+    @ApiModelProperty(value = "script id", dataType = "Long")
+    private Integer scriptId;
+    @ApiModelProperty(value = "job name", dataType = "String")
+    @JsonProperty("datapipeName")
+    private String jobName;
     @ApiModelProperty(value = "job status", dataType = "String")
     private String jobStatus;
+    @ApiModelProperty(value = "job plan", dataType = "String")
+    private String jobPlan;
+    @ApiModelProperty(value = "job is publish", dataType = "Boolean")
+    private Boolean publish;
     @ApiModelProperty(value = "job creator", dataType = "String")
     private String creatorName;
     @ApiModelProperty(value = "job mender", dataType = "String")
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java
index b1c6af20..19f05221 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java
@@ -19,15 +19,18 @@ package org.apache.seatunnel.app.domain.response.user;
 
 import com.google.common.collect.Maps;
 import io.swagger.annotations.ApiModel;
+import lombok.Data;
 
-import java.util.HashMap;
 import java.util.Map;
 
 @ApiModel(value = "userSimpleInfoRes", description = "user simple information")
+@Data
 public class UserSimpleInfoRes extends BaseUserInfoRes {
 
+    private String token;
+
     public Map<String, Object> toMap() {
-        final HashMap<String, Object> userMap = Maps.newHashMap();
+        final Map<String, Object> userMap = Maps.newHashMap();
         userMap.put("id", getId());
         userMap.put("name", getName());
         userMap.put("status", getStatus());
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 4e9a9ebb..ad061cbe 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
@@ -17,20 +17,21 @@
 
 package org.apache.seatunnel.app.service;
 
-import org.apache.seatunnel.app.domain.request.script.AddEmptyScriptReq;
+import org.apache.seatunnel.app.domain.request.script.CreateScriptReq;
 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;
 import org.apache.seatunnel.app.domain.response.PageInfo;
-import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
+import org.apache.seatunnel.app.domain.response.script.CreateScriptRes;
+import org.apache.seatunnel.app.domain.response.script.ScriptFullInfoRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptParamRes;
 import org.apache.seatunnel.app.domain.response.script.ScriptSimpleInfoRes;
 
 import java.util.List;
 
 public interface IScriptService {
-    AddEmptyScriptRes addEmptyScript(AddEmptyScriptReq addEmptyScriptReq);
+    CreateScriptRes createScript(CreateScriptReq createScriptReq);
 
     void updateScriptContent(UpdateScriptContentReq updateScriptContentReq);
 
@@ -45,4 +46,6 @@ public interface IScriptService {
     void updateScriptParam(UpdateScriptParamReq updateScriptParamReq);
 
     void publishScript(PublishScriptReq req);
+
+    ScriptFullInfoRes detail(Integer scriptId);
 }
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 6d654c97..e0c274ad 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
@@ -28,18 +28,19 @@ 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.CreateScriptDto;
 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.CreateScriptReq;
 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;
 import org.apache.seatunnel.app.domain.response.PageInfo;
-import org.apache.seatunnel.app.domain.response.script.AddEmptyScriptRes;
+import org.apache.seatunnel.app.domain.response.script.CreateScriptRes;
+import org.apache.seatunnel.app.domain.response.script.ScriptFullInfoRes;
 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;
@@ -79,26 +80,27 @@ public class ScriptServiceImpl implements IScriptService {
     private ITaskService iTaskService;
 
     @Override
-    public AddEmptyScriptRes addEmptyScript(AddEmptyScriptReq addEmptyScriptReq) {
+    public CreateScriptRes createScript(CreateScriptReq createScriptReq) {
         // 1. check script name.
-        checkDuplicate(addEmptyScriptReq.getName(), addEmptyScriptReq.getCreatorId());
-        // 2. create an empty script
-        int scriptId = addEmptyScript(addEmptyScriptReq.getName(), addEmptyScriptReq.getCreatorId(), addEmptyScriptReq.getCreatorId(), addEmptyScriptReq.getType());
+        checkDuplicate(createScriptReq.getName(), createScriptReq.getCreatorId());
+        // 2. create  script
+        int scriptId = translate(createScriptReq.getName(), createScriptReq.getCreatorId(), createScriptReq.getCreatorId(), createScriptReq.getType(), createScriptReq.getContent());
 
-        final AddEmptyScriptRes res = new AddEmptyScriptRes();
+        final CreateScriptRes res = new CreateScriptRes();
         res.setId(scriptId);
         return res;
     }
 
-    private int addEmptyScript(String name, Integer creatorId, Integer menderId, Byte type) {
-        final AddEmptyScriptDto dto = AddEmptyScriptDto.builder()
+    private int translate(String name, Integer creatorId, Integer menderId, Byte type, String content) {
+        final CreateScriptDto dto = CreateScriptDto.builder()
                 .name(name)
                 .menderId(creatorId)
                 .creatorId(menderId)
                 .type(type)
                 .status((byte) ScriptStatusEnum.UNPUBLISHED.getCode())
+                .content(content)
                 .build();
-        return scriptDaoImpl.addEmptyScript(dto);
+        return scriptDaoImpl.createScript(dto);
     }
 
     private void checkDuplicate(String name, Integer creatorId) {
@@ -118,7 +120,7 @@ public class ScriptServiceImpl implements IScriptService {
 
         final boolean needSave = checkIfNeedSave(updateScriptContentReq.getScriptId(), contentMd5);
 
-        if (needSave){
+        if (needSave) {
             final UpdateScriptContentDto dto = UpdateScriptContentDto.builder()
                     .id(updateScriptContentReq.getScriptId())
                     .content(content)
@@ -149,7 +151,6 @@ public class ScriptServiceImpl implements IScriptService {
 
         final ListScriptsDto dto = ListScriptsDto.builder()
                 .name(scriptListReq.getName())
-                .status(scriptListReq.getStatus())
                 .build();
 
         PageData<Script> scriptPageData = scriptDaoImpl.list(dto, scriptListReq.getRealPageNo(), scriptListReq.getPageSize());
@@ -173,7 +174,7 @@ public class ScriptServiceImpl implements IScriptService {
     @Override
     public List<ScriptParamRes> fetchScriptParam(Integer id) {
         List<ScriptParam> scriptParamRes = scriptParamDaoImpl.getParamsByScriptId(id);
-        if (CollectionUtils.isEmpty(scriptParamRes)){
+        if (CollectionUtils.isEmpty(scriptParamRes)) {
             return Collections.emptyList();
         }
         return scriptParamRes.stream().map(this::translate).collect(Collectors.toList());
@@ -195,7 +196,7 @@ public class ScriptServiceImpl implements IScriptService {
     }
 
     @Override
-    public void publishScript(PublishScriptReq req){
+    public void publishScript(PublishScriptReq req) {
         final PushScriptDto dto = PushScriptDto.builder()
                 .scriptId(req.getScriptId())
                 .userId(req.getOperatorId())
@@ -203,6 +204,14 @@ public class ScriptServiceImpl implements IScriptService {
         iTaskService.pushScriptToScheduler(dto);
     }
 
+    @Override
+    public ScriptFullInfoRes detail(Integer scriptId) {
+        final Script script = scriptDaoImpl.getScript(scriptId);
+
+        checkState(Objects.nonNull(script), NO_SUCH_SCRIPT.getTemplate());
+        return translateToFull(script);
+    }
+
     private ScriptParamRes translate(ScriptParam scriptParam) {
         final ScriptParamRes res = new ScriptParamRes();
         res.setId(scriptParam.getId());
@@ -215,12 +224,26 @@ public class ScriptServiceImpl implements IScriptService {
         final ScriptSimpleInfoRes res = new ScriptSimpleInfoRes();
         res.setId(script.getId());
         res.setName(script.getName());
-        res.setStatus(script.getStatus());
+        res.setStatus(ScriptStatusEnum.parse(script.getStatus()));
+        res.setType(script.getType());
+        res.setCreatorId(script.getCreatorId());
+        res.setMenderId(script.getMenderId());
+        res.setCreateTime(script.getCreateTime());
+        res.setUpdateTime(script.getUpdateTime());
+        return res;
+    }
+
+    private ScriptFullInfoRes translateToFull(Script script) {
+        final ScriptFullInfoRes res = new ScriptFullInfoRes();
+        res.setId(script.getId());
+        res.setName(script.getName());
+        res.setStatus(ScriptStatusEnum.parse(script.getStatus()));
         res.setType(script.getType());
         res.setCreatorId(script.getCreatorId());
         res.setMenderId(script.getMenderId());
         res.setCreateTime(script.getCreateTime());
         res.setUpdateTime(script.getUpdateTime());
+        res.setContent(script.getContent());
         return res;
     }
 }
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
index c687c93d..04c88f41 100644
--- 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
@@ -17,17 +17,27 @@
 
 package org.apache.seatunnel.app.service.impl;
 
+import static org.apache.seatunnel.app.common.ObjectTypeEnum.INSTANCE;
+import static org.apache.seatunnel.app.common.ObjectTypeEnum.JOB;
+import static org.apache.seatunnel.app.common.ObjectTypeEnum.SCRIPT;
 import static org.apache.seatunnel.server.common.Constants.UNDERLINE;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_SUCH_ELEMENT;
+import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_SUCH_JOB;
 import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.NO_SUCH_SCRIPT;
 import static org.apache.seatunnel.server.common.SeatunnelErrorEnum.SCHEDULER_CONFIG_NOT_EXIST;
 import static org.apache.seatunnel.spi.scheduler.constants.SchedulerConstant.NEVER_TRIGGER_EXPRESSION;
 import static org.apache.seatunnel.spi.scheduler.constants.SchedulerConstant.RETRY_INTERVAL_DEFAULT;
 import static org.apache.seatunnel.spi.scheduler.constants.SchedulerConstant.RETRY_TIMES_DEFAULT;
+import static com.cronutils.model.CronType.QUARTZ;
+import static java.util.Objects.requireNonNull;
 
+import org.apache.seatunnel.app.common.ObjectTypeEnum;
+import org.apache.seatunnel.app.common.ScriptStatusEnum;
 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.JobDefine;
 import org.apache.seatunnel.app.dal.entity.SchedulerConfig;
 import org.apache.seatunnel.app.dal.entity.Script;
 import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
@@ -57,18 +67,26 @@ import org.apache.seatunnel.spi.scheduler.dto.JobSimpleInfoDto;
 import org.apache.seatunnel.spi.scheduler.dto.SchedulerConfigDto;
 import org.apache.seatunnel.spi.scheduler.enums.ExecuteTypeEnum;
 
+import com.cronutils.model.definition.CronDefinition;
+import com.cronutils.model.definition.CronDefinitionBuilder;
+import com.cronutils.model.time.ExecutionTime;
+import com.cronutils.parser.CronParser;
 import com.google.common.collect.Maps;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 
+import java.time.ZonedDateTime;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Component
@@ -93,6 +111,17 @@ public class TaskServiceImpl implements ITaskService {
     @Resource
     private IScriptJobApplyDao scriptJobApplyDaoImpl;
 
+    private Map<ObjectTypeEnum, Function<ExecuteReq, ExecuteDto>> executeFuncMap = Maps.newHashMapWithExpectedSize(ObjectTypeEnum.values().length);
+
+    private static final CronDefinition CRON_DEFINITION = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
+
+    @PostConstruct
+    public void initFuncMap(){
+        executeFuncMap.put(SCRIPT, this::getExecuteDtoByScriptId);
+        executeFuncMap.put(JOB, this::getExecuteDtoByJobId);
+        executeFuncMap.put(INSTANCE, this::getExecuteDtoByInstanceId);
+    }
+
     @Override
     public Long pushScriptToScheduler(PushScriptDto pushScriptDto) {
         final int scriptId = pushScriptDto.getScriptId();
@@ -137,13 +166,18 @@ public class TaskServiceImpl implements ITaskService {
 
         // Use future to ensure that the page does not show exceptions due to database errors.
         syncScriptJobMapping(scriptId, userId, config.getId(), jobId);
+
+        // Update script status
+        script.setStatus((byte) ScriptStatusEnum.PUBLISHED.getCode());
+        scriptDaoImpl.updateStatus(script);
         return jobId;
     }
 
     @Override
     public void recycleScriptFromScheduler(RecycleScriptReq req) {
-        final Script script = checkAndGetScript(req.getScriptId());
-        ScriptJobApply apply = scriptJobApplyDaoImpl.getByScriptId(script.getId());
+        final ScriptJobApply apply = requireNonNull(scriptJobApplyDaoImpl.getByJobId(req.getJobId()), NO_SUCH_JOB::getTemplate);
+
+        final Script script = requireNonNull(scriptDaoImpl.getScript(apply.getScriptId()), NO_SUCH_JOB::getTemplate);
 
         final JobDto jobDto = JobDto.builder()
                 .jobId(apply.getJobId())
@@ -166,11 +200,24 @@ public class TaskServiceImpl implements ITaskService {
                 .build();
         final PageData<JobSimpleInfoDto> jobPageData = iJobService.list(dto);
         final List<JobSimpleInfoRes> data = jobPageData.getData().stream().map(this::translate).collect(Collectors.toList());
+
         final PageInfo<JobSimpleInfoRes> pageInfo = new PageInfo<>();
-        pageInfo.setData(data);
-        pageInfo.setTotalCount(jobPageData.getTotalCount());
-        pageInfo.setPageNo(req.getPageNo());
-        pageInfo.setPageSize(req.getPageSize());
+
+        if (!CollectionUtils.isEmpty(data)) {
+            final List<JobDefine> jobDefines = scriptJobApplyDaoImpl.selectJobDefineByJobIds(data.stream().map(JobSimpleInfoRes::getJobId).collect(Collectors.toList()));
+            final Map<Long, JobDefine> mapping = jobDefines.stream().collect(Collectors.toMap(JobDefine::getJobId, Function.identity()));
+
+            data.forEach(d -> {
+                final JobDefine jf = mapping.getOrDefault(d.getJobId(), new JobDefine());
+                d.setJobPlan(jf.getTriggerExpression());
+                d.setScriptId(jf.getScriptId());
+            });
+
+            pageInfo.setData(data);
+            pageInfo.setPageNo(req.getPageNo());
+            pageInfo.setPageSize(req.getPageSize());
+            pageInfo.setTotalCount(jobPageData.getTotalCount());
+        }
 
         return pageInfo;
     }
@@ -185,18 +232,72 @@ public class TaskServiceImpl implements ITaskService {
                 .build();
         final PageData<InstanceDto> instancePageData = iInstanceService.list(dto);
         final List<InstanceSimpleInfoRes> data = instancePageData.getData().stream().map(this::translate).collect(Collectors.toList());
+
+        if (!CollectionUtils.isEmpty(data)) {
+            final List<JobDefine> jobDefines = scriptJobApplyDaoImpl.selectJobDefineByJobIds(data.stream().map(InstanceSimpleInfoRes::getJobId).collect(Collectors.toList()));
+            final Map<Long, JobDefine> mapping = jobDefines.stream().collect(Collectors.toMap(JobDefine::getJobId, Function.identity()));
+
+            data.forEach(d -> {
+                final JobDefine jobDefine = mapping.get(d.getJobId());
+                CronParser parser = new CronParser(CRON_DEFINITION);
+
+                if (Objects.nonNull(jobDefine)) {
+                    ExecutionTime executionTime = ExecutionTime.forCron(parser.parse(jobDefine.getTriggerExpression()));
+                    Optional<ZonedDateTime> nextExecution = executionTime.nextExecution(ZonedDateTime.now());
+
+                    if (nextExecution.isPresent()) {
+                        final ZonedDateTime next = nextExecution.get();
+                        d.setNextExecutionTime(Date.from(next.toInstant()));
+                    }
+                }
+            });
+        }
+
         final PageInfo<InstanceSimpleInfoRes> pageInfo = new PageInfo<>();
         pageInfo.setData(data);
-        pageInfo.setTotalCount(instancePageData.getTotalCount());
         pageInfo.setPageNo(req.getPageNo());
         pageInfo.setPageSize(req.getPageSize());
+        pageInfo.setTotalCount(instancePageData.getTotalCount());
 
         return pageInfo;
     }
 
     @Override
     public InstanceSimpleInfoRes tmpExecute(ExecuteReq req) {
-        final Script script = checkAndGetScript(req.getScriptId());
+
+        final Integer objectType = req.getObjectType();
+
+        final ObjectTypeEnum parse = ObjectTypeEnum.parse(objectType);
+
+        final Function<ExecuteReq, ExecuteDto> executeFunc =
+                Optional.ofNullable(executeFuncMap.get(parse)).orElseThrow(() -> new SeatunnelException(NO_SUCH_ELEMENT));
+
+        final ExecuteDto dto = executeFunc.apply(req);
+
+        return this.translate(iJobService.execute(dto));
+    }
+
+    private ExecuteDto getExecuteDtoByInstanceId(ExecuteReq req) {
+        // objectId of instance is jobId
+        return ExecuteDto.builder()
+                .jobDto(JobDto.builder()
+                        .jobId(req.getObjectId())
+                        .build())
+                .executeTypeEnum(ExecuteTypeEnum.RERUN)
+                .build();
+    }
+
+    private ExecuteDto getExecuteDtoByJobId(ExecuteReq req) {
+        return ExecuteDto.builder()
+                .jobDto(JobDto.builder()
+                        .jobId(req.getObjectId())
+                        .build())
+                .executeTypeEnum(ExecuteTypeEnum.parse(req.getExecuteType()))
+                .build();
+    }
+
+    private ExecuteDto getExecuteDtoByScriptId(ExecuteReq req) {
+        final Script script = checkAndGetScript(Math.toIntExact(req.getObjectId()));
 
         final SchedulerConfigDto schedulerConfigDto = SchedulerConfigDto.builder()
                 .retryInterval(RETRY_INTERVAL_DEFAULT)
@@ -222,8 +323,7 @@ public class TaskServiceImpl implements ITaskService {
                 .executeTypeEnum(ExecuteTypeEnum.parse(req.getExecuteType()))
                 .complementDataDto(null)
                 .build();
-
-        return this.translate(iJobService.execute(dto));
+        return dto;
     }
 
     @Override
@@ -244,7 +344,9 @@ public class TaskServiceImpl implements ITaskService {
     private JobSimpleInfoRes translate(JobSimpleInfoDto dto) {
         return JobSimpleInfoRes.builder()
                 .jobId(dto.getJobId())
+                .jobName(dto.getJobName())
                 .jobStatus(dto.getJobStatus())
+                .publish(dto.getPublish())
                 .creatorName(dto.getCreatorName())
                 .menderName(dto.getMenderName())
                 .createTime(dto.getCreateTime())
@@ -253,6 +355,9 @@ public class TaskServiceImpl implements ITaskService {
     }
 
     private InstanceSimpleInfoRes translate(InstanceDto dto) {
+        if (Objects.isNull(dto)) {
+            return null;
+        }
         return InstanceSimpleInfoRes.builder()
                 .instanceId(dto.getInstanceId())
                 .jobId(dto.getJobId())
@@ -263,6 +368,7 @@ public class TaskServiceImpl implements ITaskService {
                 .status(dto.getStatus())
                 .executionDuration(dto.getExecutionDuration())
                 .retryTimes(dto.getRetryTimes())
+                .runFrequency(dto.getRunFrequency())
                 .build();
     }
 
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/utils/GlobalExceptionHandler.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/utils/GlobalExceptionHandler.java
index 307ea957..8fcd6a1d 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/utils/GlobalExceptionHandler.java
+++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/utils/GlobalExceptionHandler.java
@@ -21,6 +21,7 @@ import org.apache.seatunnel.app.common.Result;
 import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
 import org.apache.seatunnel.server.common.SeatunnelException;
 
+import io.jsonwebtoken.ExpiredJwtException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
@@ -44,11 +45,17 @@ public class GlobalExceptionHandler {
     }
 
     @ExceptionHandler(value = IllegalStateException.class)
-    private Result<String> exceptionHandler(IllegalStateException e) {
+    private Result<String> illegalStateExceptionHandler(IllegalStateException e) {
         logError(e);
         return Result.failure(SeatunnelErrorEnum.ILLEGAL_STATE, e.getMessage());
     }
 
+    @ExceptionHandler(value = ExpiredJwtException.class)
+    private Result<String> expiredJwtException(ExpiredJwtException e) {
+        logError(e);
+        return Result.failure(SeatunnelErrorEnum.TOKEN_ILLEGAL, e.getMessage());
+    }
+
     @ExceptionHandler(value = Exception.class)
     private Result<String> exceptionHandler(Exception e) {
         logError(e);
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
index c5e28ed6..31090156 100644
--- 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
@@ -24,6 +24,19 @@
         <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
         <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
     </resultMap>
+    <resultMap id="JobDefineMap" type="org.apache.seatunnel.app.dal.entity.JobDefine">
+        <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"/>
+        <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"/>
+    </resultMap>
     <sql id="Base_Column_List">
         id,
         script_id,
@@ -33,6 +46,19 @@
         create_time,
         update_time
     </sql>
+    <sql id="Job_Define_Column_List">
+        a.script_id,
+        a.scheduler_config_id,
+        a.job_id,
+        a.operator_id,
+        a.create_time,
+        a.update_time,
+        b.trigger_expression,
+        b.retry_times,
+        b.retry_interval,
+        b.active_start_time,
+        b.active_end_time
+    </sql>
     <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List"/>
@@ -63,4 +89,27 @@
         from script_job_apply
         where script_id = #{scriptId,jdbcType=INTEGER}
     </select>
+    <select id="selectJobDefineByJobIds" resultMap="JobDefineMap">
+        select
+        <include refid="Job_Define_Column_List"/>
+        from
+            (select
+                <include refid="Base_Column_List"/>
+                from script_job_apply
+                where job_id in
+                <foreach collection="jobIds" item="item" separator="," open="(" close=")">
+                    #{item,jdbcType=BIGINT}
+                </foreach>
+            ) a
+        left join
+        scheduler_config b on
+        a.script_id = b.script_id
+    </select>
+
+    <select id="selectByJobId" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from script_job_apply
+        where job_id = #{jobId,jdbcType=BIGINT}
+    </select>
 </mapper>
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml
index c74563b9..a481b3a8 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/ScriptMapper.xml
@@ -41,10 +41,11 @@
     </sql>
     <insert id="insert" keyColumn="id" keyProperty="id" parameterType="org.apache.seatunnel.app.dal.entity.Script"
             useGeneratedKeys="true">
-        insert into `script` (name, type, status, creator_id, mender_id)
+        insert into `script` (name, type, status, creator_id, mender_id, content)
         VALUES (#{name,jdbcType=VARCHAR}, #{type,jdbcType=TINYINT}, #{status,jdbcType=TINYINT},
                 #{creatorId,jdbcType=INTEGER},
-                #{menderId,jdbcType=INTEGER})
+                #{menderId,jdbcType=INTEGER},
+                #{content,jdbcType=VARCHAR})
     </insert>
     <update id="updateContentByPrimaryKey">
         update `script`
@@ -69,12 +70,10 @@
         <include refid="Base_Column_List"/>
         from script
         <where>
+            `status` != 2
             <if test="script.name != null and script.name != ''">
                 and `name` = #{script.name,jdbcType=VARCHAR}
             </if>
-            <if test="script.status != null">
-                and `status` = #{script.status,jdbcType=TINYINT}
-            </if>
         </where>
         limit #{start,jdbcType=INTEGER}, #{offset,jdbcType=INTEGER}
     </select>
@@ -91,12 +90,10 @@
         count(1)
         from script
         <where>
+            `status` != 2
             <if test="script.name != null and script.name != ''">
                 and `name` = #{script.name,jdbcType=VARCHAR}
             </if>
-            <if test="script.status != null">
-                and `status` = #{script.status,jdbcType=TINYINT}
-            </if>
         </where>
     </select>
 </mapper>
diff --git a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
index 1c22238b..dea9f6ae 100644
--- a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
+++ b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
@@ -63,7 +63,7 @@
         from `user`
         where id = #{id,jdbcType=INTEGER}
     </select>
-    <select id="selectBySelectiveAndPage" resultType="org.apache.seatunnel.app.dal.entity.User">
+    <select id="selectBySelectiveAndPage" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List"/>
         from `user`
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
index a460ec27..5454b6ba 100644
--- 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
@@ -66,4 +66,6 @@ public interface IDolphinschedulerService {
     InstanceLogDto queryInstanceLog(long instanceId);
 
     void killProcessInstance(long processInstanceId);
+
+    void execute(long processInstanceId, ExecuteTypeEnum executeType);
 }
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
index e8f886f1..4a01e602 100644
--- 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
@@ -173,6 +173,7 @@ public class DolphinschedulerConstants {
     public static final String EXECUTE_TYPE = "executeType";
     public static final int LOG_SKIP_LINE_NUM_DEFAULT = 0;
     public static final int LOG_LIMIT_NUM_DEFAULT = Integer.MAX_VALUE;
+    public static final String STATE_TYPE = "stateType";
 
     /**
      * response param
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
index 58be7eb0..68504d43 100644
--- 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
@@ -38,7 +38,7 @@ public class ProcessDefinitionDto {
     private Date createTime;
     @JsonFormat(pattern = DEFAULT_DATETIME_FORMAT)
     private Date updateTime;
-    private String username;
+    private String userName;
     private String projectName;
     private String locations;
     private String scheduleReleaseState;
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/enums/ReleaseStateEnum.java
similarity index 54%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/enums/ReleaseStateEnum.java
index 17704a21..03e53c28 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/common/ScriptStatusEnum.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/enums/ReleaseStateEnum.java
@@ -15,27 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.common;
+package org.apache.seatunnel.scheduler.dolphinscheduler.enums;
 
-public enum ScriptStatusEnum {
-    UNPUBLISHED(0, "unpublished"),
-    PUBLISHED(1, "published"),
-    DELETED(2, "deleted"),
+import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
+import org.apache.seatunnel.server.common.SeatunnelException;
+
+public enum ReleaseStateEnum {
+    ONLINE(true),
+    OFFLINE(false),
     ;
 
-    private final int code;
-    private final String  description;
+    private final boolean publish;
 
-    ScriptStatusEnum(int code, String description) {
-        this.code = code;
-        this.description = description;
+    ReleaseStateEnum(boolean publish) {
+        this.publish = publish;
     }
 
-    public int getCode() {
-        return code;
+    public static ReleaseStateEnum parse(String name) {
+        for (ReleaseStateEnum value : values()) {
+            if (value.name().equalsIgnoreCase(name)){
+                return value;
+            }
+        }
+        throw new SeatunnelException(SeatunnelErrorEnum.NO_SUCH_ELEMENT);
     }
 
-    public String getDescription() {
-        return description;
+    public boolean isPublish() {
+        return publish;
     }
 }
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/enums/RunFrequencyEnum.java
similarity index 69%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/enums/RunFrequencyEnum.java
index 0efdae26..f0bf5822 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IScriptJobApplyDao.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/enums/RunFrequencyEnum.java
@@ -15,13 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.dal.dao;
+package org.apache.seatunnel.scheduler.dolphinscheduler.enums;
 
-import org.apache.seatunnel.app.dal.entity.ScriptJobApply;
-import org.apache.seatunnel.app.domain.dto.job.ScriptJobApplyDto;
+public enum RunFrequencyEnum {
+    SCHEDULER,
+    ONCE,
+    ;
 
-public interface IScriptJobApplyDao {
-    void insertOrUpdate(ScriptJobApplyDto dto);
+    public static final String SCHEDULER_TYPE = "SCHEDULER";
 
-    ScriptJobApply getByScriptId(Integer id);
+    public static RunFrequencyEnum parse(String name) {
+        if (SCHEDULER_TYPE.equalsIgnoreCase(name)) {
+            return SCHEDULER;
+        }
+        return ONCE;
+    }
 }
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
index 3cca66fe..f658dc36 100644
--- 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
@@ -153,6 +153,7 @@ 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.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -190,6 +191,10 @@ public class DolphinschedulerServiceImpl implements IDolphinschedulerService, In
 
     private static final ObjectMapper MAPPER = new ObjectMapper();
 
+    static {
+        MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+    }
+
     @Override
     public void afterPropertiesSet() throws Exception {
         final ProjectDto projectDto = queryProjectCodeByName(defaultProjectName);
@@ -513,7 +518,8 @@ public class DolphinschedulerServiceImpl implements IDolphinschedulerService, In
         return projectDto;
     }
 
-    private void execute(long processInstanceId, ExecuteTypeEnum executeType) {
+    @Override
+    public void execute(long processInstanceId, ExecuteTypeEnum executeType) {
         final Map result = HttpUtils.builder()
             .withUrl(apiPrefix.concat(String.format(EXECUTE, defaultProjectCode)))
             .withMethod(Connection.Method.POST)
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
index 42a27efb..d10fa4f0 100644
--- 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
@@ -20,6 +20,8 @@ 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.ProcessInstanceDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.enums.RunFrequencyEnum;
+import org.apache.seatunnel.scheduler.dolphinscheduler.utils.StatusUtils;
 import org.apache.seatunnel.server.common.PageData;
 import org.apache.seatunnel.spi.scheduler.IInstanceService;
 import org.apache.seatunnel.spi.scheduler.dto.InstanceDto;
@@ -56,12 +58,13 @@ public class InstanceServiceImpl implements IInstanceService {
                 .instanceId(t.getId())
                 .jobId(t.getProcessDefinitionCode())
                 .instanceName(t.getName())
-                .status(t.getState())
+                .status(StatusUtils.getDolphinSchedulerStatus(t.getState()).name())
                 .startTime(t.getStartTime())
                 .endTime(t.getEndTime())
                 .submitTime(t.getScheduleTime())
                 .executionDuration(t.getDuration())
                 .retryTimes(t.getRunTimes())
+                .runFrequency(RunFrequencyEnum.parse(t.getCommandType()).name())
                 .build()).collect(Collectors.toList());
         return new PageData<>(instancePageData.getTotalCount(), data);
     }
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
index 5cdab9b0..0a87db2d 100644
--- 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
@@ -43,6 +43,7 @@ import org.apache.seatunnel.scheduler.dolphinscheduler.dto.SchedulerDto;
 import org.apache.seatunnel.scheduler.dolphinscheduler.dto.StartProcessDefinitionDto;
 import org.apache.seatunnel.scheduler.dolphinscheduler.dto.TaskDescriptionDto;
 import org.apache.seatunnel.scheduler.dolphinscheduler.dto.UpdateProcessDefinitionDto;
+import org.apache.seatunnel.scheduler.dolphinscheduler.enums.ReleaseStateEnum;
 import org.apache.seatunnel.server.common.DateUtils;
 import org.apache.seatunnel.server.common.PageData;
 import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
@@ -56,6 +57,7 @@ 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.enums.ExecuteTypeEnum;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -113,11 +115,13 @@ public class JobServiceImpl implements IJobService {
         final PageData<ProcessDefinitionDto> processPageData = iDolphinschedulerService.listProcessDefinition(listDto);
         final List<JobSimpleInfoDto> data = processPageData.getData().stream().map(p -> JobSimpleInfoDto.builder()
                 .jobId(p.getCode())
+                .jobName(p.getName())
                 .jobStatus(p.getReleaseState())
+                .publish(ReleaseStateEnum.parse(p.getReleaseState()).isPublish())
                 .createTime(p.getCreateTime())
                 .updateTime(p.getUpdateTime())
-                .creatorName(p.getUsername())
-                .menderName(p.getUsername())
+                .creatorName(p.getUserName())
+                .menderName(p.getModifyBy())
                 .build())
                 .collect(Collectors.toList());
         return new PageData<>(processPageData.getTotalCount(), data);
@@ -126,6 +130,12 @@ public class JobServiceImpl implements IJobService {
     @Override
     @SuppressWarnings("magicnumber")
     public InstanceDto execute(ExecuteDto dto) {
+
+        if (dto.getExecuteTypeEnum() == ExecuteTypeEnum.RERUN) {
+            iDolphinschedulerService.execute(dto.getJobDto().getJobId(), org.apache.seatunnel.scheduler.dolphinscheduler.ExecuteTypeEnum.REPEAT_RUNNING);
+            return null;
+        }
+
         ProcessDefinitionDto processDefinition = null;
         final JobDto jobDto = dto.getJobDto();
         if (Objects.isNull(jobDto.getJobId())) {
@@ -199,7 +209,7 @@ public class JobServiceImpl implements IJobService {
             }
 
             CompletableFuture.runAsync(() -> {
-                // clear temporary process definition
+                // offline temporary process definition
                 iDolphinschedulerService.updateProcessDefinitionState(code, name, RELEASE_STATE_OFFLINE);
             }).whenComplete((_return, e) -> {
                 if (Objects.nonNull(e)) {
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/StatusUtils.java
similarity index 50%
copy from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java
copy to seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/StatusUtils.java
index b1c6af20..fdfa32b3 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/user/UserSimpleInfoRes.java
+++ b/seatunnel-server/seatunnel-scheduler/seatunnel-scheduler-dolphinscheduler/src/main/java/org/apache/seatunnel/scheduler/dolphinscheduler/utils/StatusUtils.java
@@ -15,23 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.domain.response.user;
+package org.apache.seatunnel.scheduler.dolphinscheduler.utils;
 
-import com.google.common.collect.Maps;
-import io.swagger.annotations.ApiModel;
+import org.apache.seatunnel.spi.scheduler.enums.InstanceStatusEnum;
 
-import java.util.HashMap;
-import java.util.Map;
+public class StatusUtils {
 
-@ApiModel(value = "userSimpleInfoRes", description = "user simple information")
-public class UserSimpleInfoRes extends BaseUserInfoRes {
-
-    public Map<String, Object> toMap() {
-        final HashMap<String, Object> userMap = Maps.newHashMap();
-        userMap.put("id", getId());
-        userMap.put("name", getName());
-        userMap.put("status", getStatus());
-        userMap.put("type", getType());
-        return userMap;
+    public static InstanceStatusEnum getDolphinSchedulerStatus(String status) {
+        switch (status) {
+            case "SUBMITTED_SUCCESS":
+            case "RUNNING_EXECUTION":
+            case "DISPATCH":
+                return InstanceStatusEnum.RUNNING;
+            case "STOP":
+            case "KILL":
+                return InstanceStatusEnum.STOPPED;
+            case "FAILURE":
+                return InstanceStatusEnum.FAILED;
+            case "FORCED_SUCCESS":
+            case "SUCCESS":
+                return InstanceStatusEnum.SUCCESS;
+            default:
+                return InstanceStatusEnum.UNKNOWN;
+        }
     }
+
 }
diff --git a/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java
index 9e9f494e..e8973764 100644
--- a/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java
+++ b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java
@@ -29,6 +29,7 @@ public enum SeatunnelErrorEnum {
     USERNAME_PASSWORD_NO_MATCHED(10007, "username and password no matched", "The user name and password do not match, please check your input"),
 
     TOKEN_ILLEGAL(10008, "token illegal", "The token is expired or invalid, please login again."),
+    NO_SUCH_JOB(10009, "no such job", "No such job. Maybe deleted by others."),
 
     /**
      * request dolphinscheduler failed
diff --git a/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java
index 2b71dcf7..56deb9de 100644
--- a/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/InstanceDto.java
@@ -34,4 +34,5 @@ public class InstanceDto {
     private String status;
     private String executionDuration;
     private long retryTimes;
+    private String runFrequency;
 }
diff --git a/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
index 28e88e9c..85e0bccd 100644
--- a/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/dto/JobSimpleInfoDto.java
@@ -26,7 +26,9 @@ import java.util.Date;
 @Data
 public class JobSimpleInfoDto {
     private long jobId;
+    private String jobName;
     private String jobStatus;
+    private Boolean publish;
     private String creatorName;
     private String menderName;
     private Date createTime;
diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/enums/InstanceStatusEnum.java
similarity index 84%
rename from seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
rename to seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/enums/InstanceStatusEnum.java
index 1037f9f8..10fd24c5 100644
--- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/domain/response/script/AddEmptyScriptRes.java
+++ b/seatunnel-server/seatunnel-spi/src/main/java/org/apache/seatunnel/spi/scheduler/enums/InstanceStatusEnum.java
@@ -15,11 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.seatunnel.app.domain.response.script;
+package org.apache.seatunnel.spi.scheduler.enums;
 
-import lombok.Data;
-
-@Data
-public class AddEmptyScriptRes {
-    private int id;
+public enum InstanceStatusEnum {
+    RUNNING,
+    STOPPED,
+    FAILED,
+    SUCCESS,
+    UNKNOWN,
+    ;
 }
diff --git a/tools/dependencies/known-dependencies.txt b/tools/dependencies/known-dependencies.txt
index 861fe7f4..53d49110 100644
--- a/tools/dependencies/known-dependencies.txt
+++ b/tools/dependencies/known-dependencies.txt
@@ -5,6 +5,7 @@ commons-collections4-4.4.jar
 commons-codec-1.13.jar
 commons-lang3-3.4.jar
 config-1.3.3.jar
+cron-utils-9.1.6.jar
 guava-19.0.jar
 hibernate-validator-6.2.2.Final.jar
 jackson-annotations-2.12.7.jar
@@ -17,7 +18,9 @@ jakarta.annotation-api-1.3.5.jar
 jakarta.servlet-api-4.0.4.jar
 jakarta.validation-api-2.0.2.jar
 jakarta.websocket-api-1.1.2.jar
+javassist-3.27.0-GA.jar
 javax.annotation-api-1.3.2.jar
+javax.el-3.0.0.jar
 jboss-logging-3.4.1.Final.jar
 jetty-continuation-9.4.46.v20220331.jar
 jetty-http-9.4.46.v20220331.jar