Browse Source

Merge branch 'master' of http://39.98.38.2:13000/dumingliang/sh-model-platform

ZhuDeKang 5 tháng trước cách đây
mục cha
commit
2e0ffaf7c6

+ 2 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -119,6 +119,8 @@ xss:
   urlPatterns: /system/*,/monitor/*,/tool/*
 
 sys:
+  gateway:
+    url: http://localhost:8080
   report:
     upload:
       path: D:/tmp/report/

+ 65 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/controller/GatewayRoutesController.java

@@ -0,0 +1,65 @@
+package com.ruoyi.interfaces.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.interfaces.domain.GatewayRoutes;
+import com.ruoyi.interfaces.service.GatewayRoutesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author lql
+ * @date 2025-8-19
+ */
+@Api(value = "路由配置", tags = "路由配置")
+@RestController
+@RequestMapping("/gateway/routes")
+public class GatewayRoutesController extends BaseController {
+
+    @Autowired
+    private GatewayRoutesService gatewayRoutesService;
+
+
+    @ApiOperation(value = "新增/修改路由配置")
+    @PostMapping("")
+    public AjaxResult save(@ApiParam(name = "gatewayRoutes", value = "GatewayRoutes", required = true) @RequestBody GatewayRoutes gatewayRoutes) {
+        boolean result = gatewayRoutesService.saveOrUpdate(gatewayRoutes);
+        if (result) {
+            gatewayRoutesService.refreshRoutes();
+        }
+        return AjaxResult.success(result);
+    }
+
+    @ApiOperation(value = "根据ID删除路由配置")
+    @DeleteMapping(value = "/{id}")
+    public AjaxResult delete(@ApiParam(name = "id", value = "id", required = true) @PathVariable String id) {
+        return AjaxResult.success(gatewayRoutesService.removeById(id));
+    }
+
+    @ApiOperation(value = "根据ID获取路由配置(单表)")
+    @GetMapping("/{id}")
+    public AjaxResult get(@ApiParam(name = "id", value = "id", required = true) @PathVariable String id) {
+        return AjaxResult.success(gatewayRoutesService.getById(id));
+    }
+
+
+    @ApiOperation("根据主键获取数据")
+    @GetMapping(value = "/listOfPage")
+    public TableDataInfo listOfPage(GatewayRoutes gatewayRoutes) {
+        startPage();
+        QueryWrapper<GatewayRoutes> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(gatewayRoutes.getStatus()), "status", gatewayRoutes.getStatus())
+                .like(StringUtils.isNotBlank(gatewayRoutes.getServiceName()), "service_name", gatewayRoutes.getServiceName());
+        List<GatewayRoutes> list = gatewayRoutesService.list(queryWrapper);
+        return getDataTable(list);
+    }
+
+}

+ 19 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/domain/GatewayRoutes.java

@@ -0,0 +1,19 @@
+package com.ruoyi.interfaces.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName
+public class GatewayRoutes implements Serializable {
+
+    private String id;
+    private String serviceName;
+    private String uri;
+    private String predicates;
+    private String filters;
+    private String status;
+
+}

+ 9 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/mapper/GatewayRoutesMapper.java

@@ -0,0 +1,9 @@
+package com.ruoyi.interfaces.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.interfaces.domain.GatewayRoutes;
+
+public interface GatewayRoutesMapper extends BaseMapper<GatewayRoutes> {
+
+
+}

+ 10 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/service/GatewayRoutesService.java

@@ -0,0 +1,10 @@
+package com.ruoyi.interfaces.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.interfaces.domain.GatewayRoutes;
+
+public interface GatewayRoutesService extends IService<GatewayRoutes> {
+
+    void refreshRoutes();
+
+}

+ 26 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/service/impl/GatewayRoutesServiceImpl.java

@@ -0,0 +1,26 @@
+package com.ruoyi.interfaces.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.OkHttpUtils;
+import com.ruoyi.interfaces.domain.GatewayRoutes;
+import com.ruoyi.interfaces.mapper.GatewayRoutesMapper;
+import com.ruoyi.interfaces.service.GatewayRoutesService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class GatewayRoutesServiceImpl extends ServiceImpl<GatewayRoutesMapper, GatewayRoutes> implements GatewayRoutesService {
+
+    @Value("${sys.gateway.url}")
+    private String gatewayUrl;
+
+    @Async
+    public void refreshRoutes() {
+        OkHttpUtils.get(gatewayUrl + "/gateway/refresh");
+        log.info("刷新路由");
+    }
+
+}

+ 40 - 0
ruoyi-ui/src/api/gateway/gatewayRouters.js

@@ -0,0 +1,40 @@
+import request from "@/utils/request";
+
+/**
+ * 保存路由
+ * @param data
+ */
+export function saveGatewayRouter(data) {
+    return request({
+        url: `/gateway/routes`,
+        method: "post",
+        data: data,
+    });
+}
+
+
+/**
+ * 删除路由
+ * @param id 路由id
+ */
+export function deleteGatewayRouter(id) {
+    return request({
+        url: `/gateway/routes/${id}`,
+        method: "delete",
+    });
+}
+
+
+/**
+ * 查询选择器列表
+ * @param data
+ */
+export function getGatewayRoutersList(data) {
+    return request({
+        url: `/gateway/routes/listOfPage`,
+        method: "get",
+        params: data,
+    });
+}
+
+

+ 51 - 0
ruoyi-ui/src/api/service/timing.js

@@ -0,0 +1,51 @@
+import request from "@/utils/request";
+
+export function snailList(query) {
+  return request({
+    url: '/snail/job/jobList',
+    method: 'get',
+    params: query
+  })
+}
+export function addSnail(data) {
+  return request({
+    url: "/snail/job",
+    method: 'post',
+    data:data
+  });
+}
+export function snailDe(query) {
+  return request({
+    url: '/snail/job/getJobDetail',
+    method: 'get',
+    params: query
+  })
+}
+export function snailEdit(data) {
+  return request({
+    url: '/snail/job',
+    method: 'put',
+    data: data
+  })
+}
+export function delSnamil(id) {
+  return request({
+    url: '/snail/job/job',
+    method: 'delete',
+    params: id
+  })
+}
+export function snailSta(query) {
+  return request({
+    url: '/snail/job/updateJobStatus',
+    method: 'get',
+    params: query
+  })
+}
+export function snailTri(query) {
+  return request({
+    url: '/snail/job/triggerJob',
+    method: 'get',
+    params: query
+  })
+}

+ 5 - 5
ruoyi-ui/src/views/register/modelData/index.vue

@@ -41,11 +41,11 @@ const data =  ref([
         value:'dataSource',
         id:'1'
     },
-    {
-        label:'元数据',
-        value:'metaData',
-        id:'2'
-    },
+    // {
+    //     label:'元数据',
+    //     value:'metaData',
+    //     id:'2'
+    // },
     {
         label:'数据集(编辑)',
         value:'dataUn',

+ 254 - 416
ruoyi-ui/src/views/service/gateway/index.vue

@@ -1,456 +1,294 @@
 <template>
   <div class="app-container">
     <el-row :gutter="20">
-      <!--选择器数据-->
-      <el-col :span="10" :xs="24">
-        <el-form
-          ref="formRef"
-          :inline="true"
-          size="mini"
-          :model="selectorParam"
-        >
-          <el-form-item>
-            <span>选择器列表</span>
+      <el-col :span="24" :xs="24">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="服务名称" prop="serviceName">
+            <el-input
+                v-model="queryParams.serviceName"
+                placeholder="请输入服务名称"
+                clearable
+                style="width: 240px"
+                @keyup.enter="handleQuery"
+            />
           </el-form-item>
-          <div style="float: right">
-            <el-form-item>
-              <el-input v-model="selectorParam.name">
-                <template #append>
-                  <el-button
-                    type="primary"
-                    icon="el-icon-search"
-                    placeholder="选择器名称"
-                    @click="getSelectorList"
-                  />
-                </template>
-              </el-input>
-            </el-form-item>
-            <el-form-item>
-              <!-- <el-button type="primary" @click="selectorVisible = true">
-                添加选择器
-              </el-button> -->
-            </el-form-item>
-          </div>
-        </el-form>
-        <el-table
-          stripe
-          ref="selectorTable"
-          :data="selectorData"
-          :height="tableHeight"
-          highlight-current-row
-          @current-change="handleCurrentChange"
-          :header-cell-style="{
-            background: '#ebf3fb',
-            color: '#333',
-            padding: '4px 0',
-            'border-right': '1px solid #fff',
-          }"
-        >
-          <el-table-column
-            show-overflow-tooltip
-            header-align="center"
-            align="center"
-            prop="name"
-            label="名称"
-          />
-          <el-table-column
-            show-overflow-tooltip
-            header-align="center"
-            align="center"
-            prop="enabled"
-            label="状态"
-          >
-            <template slot-scope="scope">
-              <el-tag
-                :type="scope.row.enabled ? 'success' : 'warning'"
-                disable-transitions
-              >
-                {{ scope.row.enabled ? "开启" : "关闭" }}
-              </el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column
-            fixed="right"
-            align="center"
-            label="操作"
-            width="220"
-          >
-            <template #default="scope">
-              <!-- <el-button
-                v-hasPermi="['service:info:update']"
-                @click="handleEditSelector(scope.row)"
-                size="mini"
-              >
-                编辑
-              </el-button> -->
-              <el-button
-                type="danger"
-                @click="handleDeleteSelector(scope.row)"
-                v-hasPermi="['service:info:delete']"
-                size="mini"
-              >
-                删除
-              </el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        <pagination
-          v-show="selectorDataTotal > 0"
-          :total="selectorDataTotal"
-          :page.sync="selectorParam.currentPage"
-          :limit.sync="selectorParam.pageSize"
-          @pagination="getSelectorList"
-        />
-      </el-col>
-      <!--选择器规则列表-->
-      <el-col :span="14" :xs="24">
-        <el-form ref="formRef" :inline="true" size="mini" :model="ruleParam">
-          <el-form-item>
-            <span>选择器规则列表</span>
+          <el-form-item label="状态" prop="status">
+            <el-select
+                v-model="queryParams.status"
+                placeholder="服务状态"
+                clearable
+                style="width: 240px"
+            >
+              <el-option
+                  v-for="dict in sys_normal_disable"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+              />
+            </el-select>
           </el-form-item>
           <el-form-item>
-            <el-button
-              type="primary"
-              plain
-              icon="el-icon-refresh-right"
-              @click="syncProxyData"
-            >
-              同步数据
-            </el-button>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
           </el-form-item>
-          <div style="float: right">
-            <el-form-item>
-              <el-input v-model="ruleParam.name">
-                <template #append>
-                  <el-button
-                    type="primary"
-                    icon="el-icon-search"
-                    placeholder="规则名称"
-                    @click="getRuleList"
-                  />
-                </template>
-              </el-input>
-            </el-form-item>
-            <el-form-item>
-              <!-- <el-button type="primary" @click="ruleVisible = true">
-                添加规则
-              </el-button> -->
-            </el-form-item>
-          </div>
         </el-form>
-        <el-table
-          stripe
-          :data="ruleData"
-          :height="tableHeight"
-          :header-cell-style="{
-            background: '#ebf3fb',
-            color: '#333',
-            padding: '4px 0',
-            'border-right': '1px solid #fff',
-          }"
-        >
-          <el-table-column
-            show-overflow-tooltip
-            align="center"
-            prop="name"
-            label="规则名称"
-          />
-          <el-table-column
-            show-overflow-tooltip
-            header-align="center"
-            align="center"
-            width="70"
-            prop="enabled"
-            label="状态"
-          >
-            <template slot-scope="scope">
-              <el-tag
-                :type="scope.row.enabled ? 'success' : 'warning'"
-                disable-transitions
-              >
-                {{ scope.row.enabled ? "开启" : "关闭" }}
-              </el-tag>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+                type="primary"
+                plain
+                icon="Plus"
+                @click="handleAdd"
+                v-hasPermi="['system:user:add']"
+            >新增
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+                type="success"
+                plain
+                icon="Edit"
+                :disabled="single"
+                @click="handleUpdate"
+                v-hasPermi="['system:user:edit']"
+            >修改
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+                type="danger"
+                plain
+                icon="Delete"
+                :disabled="multiple"
+                @click="handleDelete"
+                v-hasPermi="['system:user:remove']"
+            >删除
+            </el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="gatewayList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="50" align="center"/>
+          <el-table-column label="服务名称" align="center" key="serviceName" prop="serviceName"
+                           v-if="columns[0].visible" :show-overflow-tooltip="true"/>
+          <el-table-column label="服务地址" align="center" key="uri" prop="uri" v-if="columns[1].visible"
+                           :show-overflow-tooltip="true"/>
+          <el-table-column label="状态" align="center" key="status" v-if="columns[2].visible">
+            <template #default="scope">
+              <el-switch
+                  v-model="scope.row.status"
+                  active-value="0"
+                  inactive-value="1"
+                  @change="handleStatusChange(scope.row)"
+              ></el-switch>
             </template>
           </el-table-column>
-          <el-table-column
-            show-overflow-tooltip
-            align="center"
-            width="150"
-            prop="dateUpdated"
-            label="更新时间"
-          />
-          <el-table-column
-            fixed="right"
-            align="center"
-            label="操作"
-            width="180"
-          >
+          <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
             <template #default="scope">
-              <!-- <el-button
-                v-hasPermi="['service:info:update']"
-                @click="handleEditRule(scope.row)"
-                size="mini"
-              >
-                编辑
-              </el-button> -->
-              <el-button
-                type="danger"
-                @click="handleDeleteRule(scope.row)"
-                v-hasPermi="['service:info:delete']"
-                size="mini"
-              >
-                删除
-              </el-button>
+              <el-tooltip content="修改" placement="top" v-if="scope.row.id !== 1">
+                <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+                           v-hasPermi="['system:user:edit']"></el-button>
+              </el-tooltip>
+              <el-tooltip content="删除" placement="top" v-if="scope.row.id !== 1">
+                <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+                           v-hasPermi="['system:user:remove']"></el-button>
+              </el-tooltip>
             </template>
           </el-table-column>
         </el-table>
         <pagination
-          v-show="ruleDataTotal > 0"
-          :total="ruleDataTotal"
-          :page.sync="ruleParam.currentPage"
-          :limit.sync="ruleParam.pageSize"
-          @pagination="getRuleList"
+            v-show="total > 0"
+            :total="total"
+            v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize"
+            @pagination="getList"
         />
       </el-col>
     </el-row>
-    <el-dialog :visible.sync="selectorVisible" title="选择器">
-      <el-form ref="selectorForm" :model="selectorForm">
-        <el-form-item label="名称">
-          <el-input v-model="selectorForm.name"></el-input>
+
+    <!-- 添加或修改服务配置对话框 -->
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
+      <el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
+        <el-form-item label="服务名称" prop="serviceName">
+          <el-input v-model="form.serviceName" placeholder="请输入服务名称" maxlength="30"/>
         </el-form-item>
-        <el-form-item label="类型">
-          <el-select v-model="selectorForm.type" placeholder="类型">
-            <el-option label="全流量" value="0"></el-option>
-            <el-option label="自定义" value="1"></el-option>
-          </el-select>
+        <el-form-item label="服务地址" prop="uri">
+          <el-input v-model="form.uri" placeholder="请输入服务地址" maxlength="200"/>
         </el-form-item>
-        <el-form-item v-if="selectorForm.type == '1'" label="类型">
-          <el-select v-model="selectorForm.matchMode" placeholder="类型">
-            <el-option
-              v-for="matchMode in matchModes"
-              :key="matchMode.id"
-              :value="matchMode.dictValue"
-            >{{ matchMode.dictName }}
-            </el-option
-            >
-          </el-select>
+        <el-form-item label="服务匹配" prop="predicates">
+          <el-input v-model="form.predicates" placeholder="请输入服务匹配"/>
         </el-form-item>
-        <el-row :gutter="5">
-          <el-col :span="7">
-            <el-form-item label="继续后续选择器:">
-              <el-switch v-model="selectorForm.continued"></el-switch>
-            </el-form-item>
-          </el-col>
-          <el-col :span="7">
-            <el-form-item label="打印日志:">
-              <el-switch v-model="selectorForm.loged"></el-switch>
-            </el-form-item>
-          </el-col>
-          <el-col :span="7">
-            <el-form-item label="是否开启:">
-              <el-switch v-model="selectorForm.enabled"></el-switch>
+        <el-form-item label="服务拦截" prop="filters">
+          <el-input v-model="form.filters" placeholder="请输入服务拦截"/>
+        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="状态">
+              <el-radio-group v-model="form.status">
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">
+                  {{ dict.label }}
+                </el-radio>
+              </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="处理">
-          <el-row :gutter="5">
-            <el-col
-              :span="6"
-              v-for="handler in pluginHandles"
-              :key="handler.id"
-            >
-              <el-input v-model="selectorForm[handler.field]">
-                <template slot="prepend">{{ handler.label }}</template>
-              </el-input>
-            </el-col>
-          </el-row>
-        </el-form-item>
-        <el-form-item label="执行顺序">
-          <el-input v-model="selectorForm.sort"></el-input>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="selectorVisible = true">
-            确认
-          </el-button>
-        </el-form-item>
       </el-form>
-    </el-dialog>
-    <el-dialog :visible.sync="ruleVisible" title="选择器规则">
-      <!-- @close="closeDialog" -->
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
     </el-dialog>
   </div>
 </template>
 
-<script>
-import "@/assets/styles/common.scss";
-import {
-  getSelectorList,
-  getRuleList,
-  syncProxyData,
-  getShenyuToken,
-  addSelector,
-  deleteSelector,
-  deleteRule,
-  getOperatorList,
-  getMatchModeList,
-  getParamTypeList,
-  getPluginHandleList,
-} from "@/api/gateway/proxy.js";
-import useDictStore from '@/store/modules/dict.js'
-export default {
-  name: "proxy",
-  data() {
-    return {
-      token: undefined,
-      selectorVisible: false,
-      ruleVisible: false,
-      currentRow: undefined,
-      tableHeight: window.innerHeight - 300,
-      selectorData: [],
-      selectorDataTotal: 0,
-      selectorParam: {
-        currentPage: 1,
-        pageSize: 20,
-        pluginId: 5,
-        name: "",
-      },
-      ruleData: [],
-      ruleDataTotal: 0,
-      ruleParam: {
-        currentPage: 1,
-        pageSize: 20,
-        pluginId: 5,
-        name: "",
-        selectorId: "",
-      },
-      selectorForm: {},
-      ruleForm: {},
+<script setup name="User">
+import {deleteGatewayRouter, getGatewayRoutersList, saveGatewayRouter} from "@/api/gateway/gatewayRouters.js";
 
-      operators: undefined,
-      matchModes: undefined,
-      paramTypes: undefined,
-      pluginHandles: undefined,
-    };
-  },
-  mounted() {
-    getShenyuToken().then((r) => {
-      this.token = r.data.token;
-      this.getSelectorList();
-      this.getBaseData();
-    });
+const {proxy} = getCurrentInstance();
+const {sys_normal_disable} = proxy.useDict("sys_normal_disable");
+
+const gatewayList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+// 列显隐信息
+const columns = ref([
+  {key: 0, label: `服务名称`, visible: true},
+  {key: 1, label: `服务地址`, visible: true},
+  {key: 2, label: `状态`, visible: true}
+]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    serviceName: undefined,
+    status: undefined,
   },
-  methods: {
-    // 获取选择器列表
-    getSelectorList() {
-      getSelectorList(this.selectorParam, this.token).then((r) => {
-        this.selectorData = r.data.dataList;
-        this.selectorDataTotal = r.data.page.totalCount;
-        this.setCurrent(this.selectorData[0]);
-      });
-    },
-    // 获取选择器规则列表
-    getRuleList() {
-      this.ruleParam.selectorId = this.currentRow.id;
-      getRuleList(this.ruleParam, this.token).then((r) => {
-        this.ruleData = r.data.dataList;
-        this.ruleDataTotal = r.data.page.totalCount;
-      });
-    },
-    // 同步信息
-    syncProxyData() {
-      syncProxyData(this.token).then((r) => {
-        this.$modal.msgSuccess("同步成功");
-      });
-    },
-    // 设置当前行
-    setCurrent(row) {
-      this.$refs.selectorTable.setCurrentRow(row);
-    },
-    // 选中执行操作
-    handleCurrentChange(val) {
-      this.currentRow = val;
-      this.getRuleList();
-    },
-    // 编辑选择器
-    handleEditSelector(selector) {
-    },
-    // 编辑选择器规则
-    handleEditRule(rule) {
-    },
-    // 删除选择器
-    handleDeleteSelector(selector) {
-      this.$modal
-        .confirm('是否确认删除选择器 "' + selector.name + '" ?')
-        .then(() => deleteSelector([selector.id], this.token))
-        .then(() => {
-          this.getSelectorList();
-          this.$modal.msgSuccess("删除成功");
-        })
-        .catch(() => {
-        });
-    },
-    // 删除选择器规则
-    handleDeleteRule(rule) {
-      this.$modal
-        .confirm('是否确认删除选择器 "' + rule.name + '" ?')
-        .then(() => deleteRule([rule.id], this.token))
-        .then(() => {
-          this.getRuleList();
-          this.$modal.msgSuccess("删除成功");
-        })
-        .catch(() => {
-        });
-    },
-    getBaseData() {
-      getOperatorList(this.token).then((r) => {
-        this.operators = r.data;
-      });
-      getMatchModeList(this.token).then((r) => {
-        this.matchModes = r.data;
-      });
-      getParamTypeList(this.token).then((r) => {
-        this.paramTypes = r.data;
-      });
-      getPluginHandleList(this.token).then((r) => {
-        this.pluginHandles = r.data;
+  rules: {
+    serviceName: [
+      {required: true, message: "服务名称不能为空", trigger: "blur"},
+      {min: 2, max: 20, message: "服务名称长度必须介于 2 和 20 之间", trigger: "blur"}
+    ],
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询服务列表 */
+function getList() {
+  loading.value = true;
+  getGatewayRoutersList(queryParams.value)
+      .then(res => {
+        loading.value = false;
+        gatewayList.value = res.rows;
+        total.value = res.total;
       });
-    },
-  },
-};
-</script>
-<style lang="scss" scoped>
-::v-deep .el-table {
-  border: 1px solid #e6e6e6;
-  border-right: 1px solid #e6e6e6;
-  border-bottom: none;
-  border-radius: 5px;
 }
 
-::v-deep .el-dialog {
-  position: relative;
-  background: #ffffff;
-  border-radius: 2px;
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  queryParams.value.deptId = undefined;
+  proxy.$refs.deptTreeRef.setCurrentKey(null);
+  handleQuery();
+};
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const ids = row.id || ids.value;
+  proxy.$modal.confirm('是否确认删除服务编号为"' + ids + '"的数据项?')
+      .then(() => deleteGatewayRouter(ids))
+      .then(() => {
+        getList();
+        proxy.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+  });
 }
 
-::v-deep .el-dialog__body {
-  // border-top: 1px solid #dcdfe6;
-  overflow-y: auto;
+/** 服务状态修改  */
+function handleStatusChange(row) {
+  let text = row.status === "0" ? "启用" : "停用";
+  proxy.$modal.confirm('确认要"' + text + '""' + row.serviceName + '"服务吗?').then(function () {
+    return saveGatewayRouter({id: row.id, status: row.status});
+  }).then(() => {
+    proxy.$modal.msgSuccess(text + "成功");
+  }).catch(function () {
+    row.status = row.status === "0" ? "1" : "0";
+  });
+};
 
-  &::-webkit-scrollbar {
-    width: 2px;
-    background-color: #ccc;
-  }
+/** 选择条数  */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
 
-  &::-webkit-scrollbar-thumb {
-    background-color: #0ae;
-  }
 
-  &::-webkit-scrollbar-track {
-    background-color: #ccc;
-  }
+/** 重置操作表单 */
+function reset() {
+  form.value = {
+    id: undefined,
+    serviceName: undefined,
+    uri: undefined,
+    predicates: [],
+    filters: [],
+    status: "0"
+  };
+  proxy.resetForm("userRef");
+};
+
+/** 取消按钮 */
+function cancel() {
+  open.value = false;
+  reset();
+};
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加服务";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  form.value = row;
+  open.value = true;
+  title.value = "修改服务";
 }
-</style>
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["userRef"].validate(valid => {
+    if (valid) {
+      saveGatewayRouter(form.value).then(response => {
+        proxy.$modal.msgSuccess("保存成功");
+        open.value = false;
+        getList();
+      });
+    }
+  });
+};
+
+getList();
+</script>

+ 455 - 0
ruoyi-ui/src/views/service/gateway/index2.vue

@@ -0,0 +1,455 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--选择器数据-->
+      <el-col :span="10" :xs="24">
+        <el-form
+            ref="formRef"
+            :inline="true"
+            size="mini"
+            :model="selectorParam"
+        >
+          <el-form-item>
+            <span>选择器列表</span>
+          </el-form-item>
+          <div style="float: right">
+            <el-form-item>
+              <el-input v-model="selectorParam.name">
+                <template #append>
+                  <el-button
+                      type="primary"
+                      icon="el-icon-search"
+                      placeholder="选择器名称"
+                      @click="getSelectorList"
+                  />
+                </template>
+              </el-input>
+            </el-form-item>
+            <el-form-item>
+              <!-- <el-button type="primary" @click="selectorVisible = true">
+                添加选择器
+              </el-button> -->
+            </el-form-item>
+          </div>
+        </el-form>
+        <el-table
+            stripe
+            ref="selectorTable"
+            :data="selectorData"
+            :height="tableHeight"
+            highlight-current-row
+            @current-change="handleCurrentChange"
+            :header-cell-style="{
+            background: '#ebf3fb',
+            color: '#333',
+            padding: '4px 0',
+            'border-right': '1px solid #fff',
+          }"
+        >
+          <el-table-column
+              show-overflow-tooltip
+              header-align="center"
+              align="center"
+              prop="name"
+              label="名称"
+          />
+          <el-table-column
+              show-overflow-tooltip
+              header-align="center"
+              align="center"
+              prop="enabled"
+              label="状态"
+          >
+            <template slot-scope="scope">
+              <el-tag
+                  :type="scope.row.enabled ? 'success' : 'warning'"
+                  disable-transitions
+              >
+                {{ scope.row.enabled ? "开启" : "关闭" }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column
+              fixed="right"
+              align="center"
+              label="操作"
+              width="220"
+          >
+            <template #default="scope">
+              <!-- <el-button
+                v-hasPermi="['service:info:update']"
+                @click="handleEditSelector(scope.row)"
+                size="mini"
+              >
+                编辑
+              </el-button> -->
+              <el-button
+                  type="danger"
+                  @click="handleDeleteSelector(scope.row)"
+                  v-hasPermi="['service:info:delete']"
+                  size="mini"
+              >
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+            v-show="selectorDataTotal > 0"
+            :total="selectorDataTotal"
+            :page.sync="selectorParam.currentPage"
+            :limit.sync="selectorParam.pageSize"
+            @pagination="getSelectorList"
+        />
+      </el-col>
+      <!--选择器规则列表-->
+      <el-col :span="14" :xs="24">
+        <el-form ref="formRef" :inline="true" size="mini" :model="ruleParam">
+          <el-form-item>
+            <span>选择器规则列表</span>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+                type="primary"
+                plain
+                icon="el-icon-refresh-right"
+                @click="syncProxyData"
+            >
+              同步数据
+            </el-button>
+          </el-form-item>
+          <div style="float: right">
+            <el-form-item>
+              <el-input v-model="ruleParam.name">
+                <template #append>
+                  <el-button
+                      type="primary"
+                      icon="el-icon-search"
+                      placeholder="规则名称"
+                      @click="getRuleList"
+                  />
+                </template>
+              </el-input>
+            </el-form-item>
+            <el-form-item>
+              <!-- <el-button type="primary" @click="ruleVisible = true">
+                添加规则
+              </el-button> -->
+            </el-form-item>
+          </div>
+        </el-form>
+        <el-table
+            stripe
+            :data="ruleData"
+            :height="tableHeight"
+            :header-cell-style="{
+            background: '#ebf3fb',
+            color: '#333',
+            padding: '4px 0',
+            'border-right': '1px solid #fff',
+          }"
+        >
+          <el-table-column
+              show-overflow-tooltip
+              align="center"
+              prop="name"
+              label="规则名称"
+          />
+          <el-table-column
+              show-overflow-tooltip
+              header-align="center"
+              align="center"
+              width="70"
+              prop="enabled"
+              label="状态"
+          >
+            <template slot-scope="scope">
+              <el-tag
+                  :type="scope.row.enabled ? 'success' : 'warning'"
+                  disable-transitions
+              >
+                {{ scope.row.enabled ? "开启" : "关闭" }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column
+              show-overflow-tooltip
+              align="center"
+              width="150"
+              prop="dateUpdated"
+              label="更新时间"
+          />
+          <el-table-column
+              fixed="right"
+              align="center"
+              label="操作"
+              width="180"
+          >
+            <template #default="scope">
+              <!-- <el-button
+                v-hasPermi="['service:info:update']"
+                @click="handleEditRule(scope.row)"
+                size="mini"
+              >
+                编辑
+              </el-button> -->
+              <el-button
+                  type="danger"
+                  @click="handleDeleteRule(scope.row)"
+                  v-hasPermi="['service:info:delete']"
+                  size="mini"
+              >
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+            v-show="ruleDataTotal > 0"
+            :total="ruleDataTotal"
+            :page.sync="ruleParam.currentPage"
+            :limit.sync="ruleParam.pageSize"
+            @pagination="getRuleList"
+        />
+      </el-col>
+    </el-row>
+    <el-dialog :visible.sync="selectorVisible" title="选择器">
+      <el-form ref="selectorForm" :model="selectorForm">
+        <el-form-item label="名称">
+          <el-input v-model="selectorForm.name"></el-input>
+        </el-form-item>
+        <el-form-item label="类型">
+          <el-select v-model="selectorForm.type" placeholder="类型">
+            <el-option label="全流量" value="0"></el-option>
+            <el-option label="自定义" value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="selectorForm.type == '1'" label="类型">
+          <el-select v-model="selectorForm.matchMode" placeholder="类型">
+            <el-option
+                v-for="matchMode in matchModes"
+                :key="matchMode.id"
+                :value="matchMode.dictValue"
+            >{{ matchMode.dictName }}
+            </el-option
+            >
+          </el-select>
+        </el-form-item>
+        <el-row :gutter="5">
+          <el-col :span="7">
+            <el-form-item label="继续后续选择器:">
+              <el-switch v-model="selectorForm.continued"></el-switch>
+            </el-form-item>
+          </el-col>
+          <el-col :span="7">
+            <el-form-item label="打印日志:">
+              <el-switch v-model="selectorForm.loged"></el-switch>
+            </el-form-item>
+          </el-col>
+          <el-col :span="7">
+            <el-form-item label="是否开启:">
+              <el-switch v-model="selectorForm.enabled"></el-switch>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="处理">
+          <el-row :gutter="5">
+            <el-col
+                :span="6"
+                v-for="handler in pluginHandles"
+                :key="handler.id"
+            >
+              <el-input v-model="selectorForm[handler.field]">
+                <template slot="prepend">{{ handler.label }}</template>
+              </el-input>
+            </el-col>
+          </el-row>
+        </el-form-item>
+        <el-form-item label="执行顺序">
+          <el-input v-model="selectorForm.sort"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="selectorVisible = true">
+            确认
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+    <el-dialog :visible.sync="ruleVisible" title="选择器规则">
+      <!-- @close="closeDialog" -->
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import "@/assets/styles/common.scss";
+import {
+  deleteRule,
+  deleteSelector,
+  getMatchModeList,
+  getOperatorList,
+  getParamTypeList,
+  getPluginHandleList,
+  getRuleList,
+  getSelectorList,
+  getShenyuToken,
+  syncProxyData,
+} from "@/api/gateway/proxy.js";
+
+export default {
+  name: "proxy",
+  data() {
+    return {
+      token: undefined,
+      selectorVisible: false,
+      ruleVisible: false,
+      currentRow: undefined,
+      tableHeight: window.innerHeight - 300,
+      selectorData: [],
+      selectorDataTotal: 0,
+      selectorParam: {
+        currentPage: 1,
+        pageSize: 20,
+        pluginId: 5,
+        name: "",
+      },
+      ruleData: [],
+      ruleDataTotal: 0,
+      ruleParam: {
+        currentPage: 1,
+        pageSize: 20,
+        pluginId: 5,
+        name: "",
+        selectorId: "",
+      },
+      selectorForm: {},
+      ruleForm: {},
+
+      operators: undefined,
+      matchModes: undefined,
+      paramTypes: undefined,
+      pluginHandles: undefined,
+    };
+  },
+  mounted() {
+    getShenyuToken().then((r) => {
+      this.token = r.data.token;
+      this.getSelectorList();
+      this.getBaseData();
+    });
+  },
+  methods: {
+    // 获取选择器列表
+    getSelectorList() {
+      getSelectorList(this.selectorParam, this.token).then((r) => {
+        this.selectorData = r.data.dataList;
+        this.selectorDataTotal = r.data.page.totalCount;
+        this.setCurrent(this.selectorData[0]);
+      });
+    },
+    // 获取选择器规则列表
+    getRuleList() {
+      this.ruleParam.selectorId = this.currentRow.id;
+      getRuleList(this.ruleParam, this.token).then((r) => {
+        this.ruleData = r.data.dataList;
+        this.ruleDataTotal = r.data.page.totalCount;
+      });
+    },
+    // 同步信息
+    syncProxyData() {
+      syncProxyData(this.token).then((r) => {
+        this.$modal.msgSuccess("同步成功");
+      });
+    },
+    // 设置当前行
+    setCurrent(row) {
+      this.$refs.selectorTable.setCurrentRow(row);
+    },
+    // 选中执行操作
+    handleCurrentChange(val) {
+      this.currentRow = val;
+      this.getRuleList();
+    },
+    // 编辑选择器
+    handleEditSelector(selector) {
+    },
+    // 编辑选择器规则
+    handleEditRule(rule) {
+    },
+    // 删除选择器
+    handleDeleteSelector(selector) {
+      this.$modal
+          .confirm('是否确认删除选择器 "' + selector.name + '" ?')
+          .then(() => deleteSelector([selector.id], this.token))
+          .then(() => {
+            this.getSelectorList();
+            this.$modal.msgSuccess("删除成功");
+          })
+          .catch(() => {
+          });
+    },
+    // 删除选择器规则
+    handleDeleteRule(rule) {
+      this.$modal
+          .confirm('是否确认删除选择器 "' + rule.name + '" ?')
+          .then(() => deleteRule([rule.id], this.token))
+          .then(() => {
+            this.getRuleList();
+            this.$modal.msgSuccess("删除成功");
+          })
+          .catch(() => {
+          });
+    },
+    getBaseData() {
+      getOperatorList(this.token).then((r) => {
+        this.operators = r.data;
+      });
+      getMatchModeList(this.token).then((r) => {
+        this.matchModes = r.data;
+      });
+      getParamTypeList(this.token).then((r) => {
+        this.paramTypes = r.data;
+      });
+      getPluginHandleList(this.token).then((r) => {
+        this.pluginHandles = r.data;
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-table {
+  border: 1px solid #e6e6e6;
+  border-right: 1px solid #e6e6e6;
+  border-bottom: none;
+  border-radius: 5px;
+}
+
+::v-deep .el-dialog {
+  position: relative;
+  background: #ffffff;
+  border-radius: 2px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+::v-deep .el-dialog__body {
+  // border-top: 1px solid #dcdfe6;
+  overflow-y: auto;
+
+  &::-webkit-scrollbar {
+    width: 2px;
+    background-color: #ccc;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    background-color: #0ae;
+  }
+
+  &::-webkit-scrollbar-track {
+    background-color: #ccc;
+  }
+}
+</style>

+ 380 - 256
ruoyi-ui/src/views/service/timing/index.vue

@@ -5,63 +5,40 @@
             <div>
                 组名称
             </div>
-            <el-select
-            v-model="serzu"
-            class="noBorSel"
-            placeholder=""
-            style="width: 10%;margin-left: 1%;"
-            >
-                <el-option
-                v-for="item in optionsShuLei"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-                />
-            </el-select>
+            <el-input size="mini" v-model="groupName" style="width: 10%;margin-left: 1%;" placeholder="" />
             <div style="margin-left: 2%;">
                 任务名称
             </div>
-            <el-input size="mini" v-model="formTree.itemNo" style="width: 10%;margin-left: 1%;" placeholder="" />
+            <el-input size="mini" v-model="jobName" style="width: 10%;margin-left: 1%;" placeholder="" />
             <div style="margin-left: 2%;">
                 执行器名称
             </div>
-            <el-input size="mini" v-model="formTree.itemNo" style="width: 10%;margin-left: 1%;" placeholder="" />
+            <el-input size="mini" v-model="executorInfo" style="width: 10%;margin-left: 1%;" placeholder="" />
             <div style="margin-left: 2%;">
                 状态
             </div>
             <el-select
-            v-model="serzu"
+            v-model="jobStatus"
             class="noBorSel"
             placeholder=""
             style="width: 10%;margin-left: 1%;"
             >
-                <el-option
-                v-for="item in optionsShuLei"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-                />
+                <el-option label="启用" :value="0" />
+                <el-option label="禁用" :value="1" />
             </el-select>
-            <div style="margin-left: 2%;">
-                负责人
-            </div>
-            <el-input size="mini" v-model="formTree.itemNo" style="width: 10%;margin-left: 1%;" placeholder="" />
-            <el-button type="" @click="showAdd" size="mini" style="margin-left:auto;" :icon="RefreshRight">重置 </el-button>
-            <el-button type="primary" @click="showAdd" size="mini" style="margin-left:1%;" :icon="Search">搜索 </el-button>
+            <!-- <el-button type="" @click="" size="mini" style="margin-left:auto;" :icon="RefreshRight">重置 </el-button> -->
+            <el-button type="primary" @click="getTable" size="mini" style="margin-left:auto;" :icon="Search">搜索 </el-button>
         </div>
-        <el-divider/>
-        <div style="width: 98%;margin-left: 1%;">
+        <!-- <el-divider/> -->
+        <div style="width: 99%;margin-left: 1%;margin-top: 1%;">
             <div style="display: flex;justify-content: space-between;width: 100%;align-items: center;">
                 <div style="font-weight: bold;">
                     定时任务列表
                 </div>
                 <div style="display: flex;width: 50%;">
                     <el-button plain type="primary" @click="showAdd" size="mini" style="margin-left:auto;" :icon="Plus">新增 </el-button>
-                    <el-button plain type="primary"  size="mini" style="margin-left:1%;" :icon="Upload">导入</el-button>
-                    <el-button plain type="primary"  size="mini" style="margin-left:1%;" :icon="Download">导出</el-button>
-                    <el-button type="danger" plain size="mini" style="margin-left:1%;" :icon="Delete">批量删除</el-button>
-                    <el-button plain type=""  size="mini" style="margin-left:1%;" :icon="RefreshRight">刷新</el-button>
-                    <el-dropdown trigger="click" v-model="dropdownVisible" @visible-change="handleVisibleChange" style="margin-left:1%;">
+                    <el-button type="danger" @click="delAll" plain size="mini" style="margin-left:1%;" :icon="Delete">删除</el-button>
+                    <!-- <el-dropdown trigger="click" v-model="dropdownVisible" @visible-change="handleVisibleChange" style="margin-left:1%;">
                         <el-button type="primary" plain size="mini" style="margin-left:1%;" :icon="Setting">列设置</el-button>
                         <template #dropdown>
                             <el-dropdown-menu style="width: 150px;">
@@ -106,7 +83,7 @@
                                 </el-dropdown-item>
                             </el-dropdown-menu>
                         </template>
-                    </el-dropdown>
+                    </el-dropdown> -->
                 </div>
             </div>
         </div>
@@ -115,6 +92,7 @@
         style="width: 100%;margin-left: 0%;margin-top:1%;"
         :cell-style="{ paddingTop:'3px',paddingBottom:'3px' }"
         :header-cell-style="{height: heightAll*0.01+'px',}"
+        @selection-change="handleSelectionChange" 
         :row-style="{ fontSize: '16px',textAlign:'center'}"
         border 
         :height="tableheight">
@@ -128,45 +106,45 @@
         <el-table-column prop="groupName" label="组名称" width="160" v-if="showTablepane.zm"/>
         <el-table-column prop="executorInfo" label="执行器名称" width="160" v-if="showTablepane.zx"/>
         <el-table-column prop="ownerName" label="负责人" width="160" v-if="showTablepane.fz"/>
-        <el-table-column prop="labels" label="标签" width="140" v-if="showTablepane.bq">
-            <template #default="scope">
-                <el-tag>测试</el-tag>
-                <div v-for="item in scope.row.labels">
-                  <el-tag></el-tag>
-                </div>
-            </template>
-        </el-table-column>
-        <el-table-column prop="nextTriggerAt" label="触发时间" width="140" v-if="showTablepane.cf">
+        <el-table-column prop="nextTriggerAt" label="触发时间" width="180" v-if="showTablepane.cf">
         </el-table-column>
         <el-table-column prop="jobStatus" label="状态" width="170" v-if="showTablepane.zt">
             <template #default="scope">
-                <el-switch v-model="scope.row.jobStatus"/>
+                <el-switch @change="changejobStatus(scope.row)" v-model="scope.row.jobStatus"/>
             </template>
         </el-table-column>
-        <el-table-column prop="itemNotes" label="任务类型" width="170" v-if="showTablepane.rwl">
+        <el-table-column prop="taskType" label="任务类型" width="170" v-if="showTablepane.rwl">
             <template #default="scope">
-                <el-tag>测试</el-tag>
+                <el-tag v-if="scope.row.taskType==1" type="success">集群</el-tag>
+                <el-tag v-if="scope.row.taskType==2" type="info">广播</el-tag>
+                <el-tag v-if="scope.row.taskType==3" type="warning">Sharding</el-tag>
+                <el-tag v-if="scope.row.taskType==4" type="danger">Map</el-tag>
+                <el-tag v-if="scope.row.taskType==5">MapReduce</el-tag>
             </template>
         </el-table-column>
-        <el-table-column prop="itemNotes" label="触发类型" width="170" v-if="showTablepane.cfl">
+        <el-table-column prop="triggerType" label="触发类型" width="170" v-if="showTablepane.cfl">
             <template #default="scope">
-                <el-tag>测试</el-tag>
+                <el-tag v-if="scope.row.triggerType==2">固定时间</el-tag>
+                <el-tag v-if="scope.row.triggerType==3">CRON 表达式</el-tag>
+                <el-tag v-if="scope.row.triggerType==99">工作流</el-tag>
             </template>
         </el-table-column>
-        <el-table-column prop="itemNotes" label="间隔时长" width="170" v-if="showTablepane.jg"/>
-        <el-table-column prop="itemNotes" label="阻塞策略" width="170" v-if="showTablepane.zs">
+        <el-table-column prop="retryInterval" label="间隔时长" width="170" v-if="showTablepane.jg"/>
+        <el-table-column prop="blockStrategy" label="阻塞策略" width="170" v-if="showTablepane.zs">
             <template #default="scope">
-                <el-tag>测试</el-tag>
+                <el-tag v-if="scope.row.blockStrategy==1">丢弃</el-tag>
+                <el-tag v-if="scope.row.blockStrategy==2">覆盖</el-tag>
+                <el-tag v-if="scope.row.blockStrategy==3">并行</el-tag>
             </template>
         </el-table-column>
-        <el-table-column prop="itemNotes" label="超时时间(秒)" width="170" v-if="showTablepane.cs"/>
-        <el-table-column prop="itemNotes" label="更新时间" width="170" v-if="showTablepane.gx"/>
+        <el-table-column prop="executorTimeout" label="超时时间(秒)" width="170" v-if="showTablepane.cs"/>
+        <el-table-column prop="updateDt" label="更新时间" width="170" v-if="showTablepane.gx"/>
         <el-table-column prop="address" label="操作" width="222" fixed="right">
             <template #default="scope">
                 <div style="display: flex;justify-content: space-between;width: 100%;">
                     <el-button type="primary" @click="showEdit(scope.row)" size="mini" text style="margin-left: 1%;">编辑</el-button>
-                    <el-button @click="showDe(scope.row)" type="primary" text size="mini" style="margin-left: 1%;">执行</el-button>
-                    <el-button @click="delRow(scope.row)" type="danger" text size="mini" style="margin-left: 1%;">更多</el-button>
+                    <el-button @click="snaliTrigger(scope.row)" type="primary" text size="mini" style="margin-left: 1%;">执行</el-button>
+                    <el-button @click="delRow(scope.row)" type="danger" text size="mini" style="margin-left: 1%;">删除</el-button>
                 </div>
             </template>
         </el-table-column>
@@ -197,7 +175,7 @@
                 <el-col :span="8">
                 <el-form-item label="组名称:" prop="groupName" style="">
                     <div style="display: flex;width: 100%;justify-content: space-between;">
-                        <el-input  v-model="formJi.groupName" style="width: 100%;"/>
+                        <el-input :disabled="!isAddTa" v-model="formJi.groupName" style="width: 100%;"/>
                     </div>
                 </el-form-item>
                 </el-col>
@@ -211,7 +189,7 @@
         </el-row>
         <el-row :gutter="48">
             <el-col :span="15">
-            <el-form-item label="标签:" prop="" style="">
+            <!-- <el-form-item label="标签:" prop="" style="">
                  <div 
                     v-if="parTag.length==0"
                     @click='addTag'
@@ -238,15 +216,15 @@
                         <el-icon @click="addTag" style="margin-left: 3%;color: #337ecc;cursor: pointer;"><Plus /></el-icon>
                     </div>
                 </div>
-            </el-form-item>
+            </el-form-item> -->
             </el-col>
         </el-row>
         <el-row :gutter="48">
             <el-col :span="8">
-                <el-form-item label="状态:">
-                    <el-radio-group v-model="formJi.jobStatus" class="custom-radio-group" style="width: 100%;margin-top: -1%;">
-                        <el-radio :label=0 size="large">启用</el-radio>
-                        <el-radio :label=1 size="large">禁用</el-radio>
+                <el-form-item label="状态:" prop="jobStatus">
+                    <el-radio-group :disabled="!isAddTa" v-model="formJi.jobStatus" class="custom-radio-group" style="width: 100%;margin-top: -1%;">
+                        <el-radio :label=1 size="large">启用</el-radio>
+                        <el-radio :label=0 size="large">禁用</el-radio>
                     </el-radio-group>
                 </el-form-item>
             </el-col>
@@ -254,7 +232,7 @@
         </el-row>
         <el-row :gutter="48">
             <el-col :span="8">
-                <el-form-item label="任务类型:">
+                <el-form-item label="任务类型:" prop="taskType">
                     <el-select
                     v-model="formJi.taskType"
                     class="noBorSel"
@@ -271,106 +249,82 @@
                 </el-form-item>
             </el-col>
         </el-row>
-        <el-form-item label="执行器名称:">
-            <div style="display: flex;width: 50%;align-items: center;">
-                <el-radio-group @change="showCode" v-model="formJi.executorInfo" class="custom-radio-group" style="width: 100%;margin-top: -0.5%;">
-                    <el-radio label="自定义执行器" size="large">自定义执行器</el-radio>
-                    <el-radio label="内置执行器" size="large">内置执行器</el-radio>
-                </el-radio-group>
-                <el-select
-                v-if="formJi.executorInfo=='内置执行器'"
-                v-model="serzu"
-                class="noBorSel"
-                placeholder=""
-                style="width: 70%;margin-left: 1%;"
-                >
-                    <el-option
-                    v-for="item in optionsShuLei"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                    />
-                </el-select>
-                <el-input v-if="formJi.executorInfo=='自定义执行器'" v-model="formZu.dcNote" style="width: 75%;" placeholder="请输入自定义执行器名称"/>
+        <el-form-item label="执行器名称:" prop="executorInfo">
+            <div style="display: flex;width: 100%;align-items: center;">
+                <el-input  v-model="formJi.executorInfo" style="width: 75%;" placeholder=""/>
             </div>
         </el-form-item>
-        <div v-if="formJi.executorInfo=='自定义执行器'" style="margin-top: 4%;">
+        <div style="margin-top: 0%;">
             <el-form-item label="方法参数:" >
-                <el-input v-model="formZu.dcNote" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
+                <el-input v-model="formJi.argsStr" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
             </el-form-item>
             <el-row :gutter="48">
                 <el-col :span="8">
-                    <el-form-item label="路由策略:">
+                    <el-form-item label="路由策略:" prop="routeKey">
                         <el-select
-                        v-model="serzu"
+                        v-model="formJi.routeKey"
                         class="noBorSel"
                         placeholder=""
                         style="width: 100%;margin-left: 0%;"
                         >
-                            <el-option
-                            v-for="item in optionsShuLei"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                            />
+                          <el-option label="Hash" :value="1" />
+                          <el-option label="随机" :value="2" />
+                          <el-option label="LRU" :value="3" />
+                          <el-option label="轮询" :value="4" />
+                          <el-option label="匹配第一个" :value="5" />
+                          <el-option label="匹配最后一个" :value="6" />
                         </el-select>
                     </el-form-item>
                 </el-col>
                 <el-col :span="8">
-                    <el-form-item label="阻塞策略:">
+                    <el-form-item label="阻塞策略:" prop="blockStrategy">
                         <el-select
-                        v-model="serzu"
+                        v-model="formJi.blockStrategy"
                         class="noBorSel"
                         placeholder=""
                         style="width: 100%;margin-left: 0%;"
                         >
-                            <el-option
-                            v-for="item in optionsShuLei"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                            />
+                          <el-option label="丢弃" :value="1" />
+                          <el-option label="覆盖" :value="2" />
+                          <el-option label="并行" :value="3" />
                         </el-select>
                     </el-form-item>
                 </el-col>
             </el-row>
             <el-row :gutter="48">
                 <el-col :span="8">
-                    <el-form-item label="触发类型:">
+                    <el-form-item label="触发类型:" prop="triggerType">
                         <el-select
-                        v-model="serzu"
+                        v-model="formJi.triggerType"
                         class="noBorSel"
                         placeholder=""
                         style="width: 100%;margin-left: 0%;"
                         >
-                            <el-option
-                            v-for="item in optionsShuLei"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                            />
+                          <el-option label="固定时间" :value="2" />
+                          <el-option label="CRON 表达式" :value="3" />
+                          <el-option label="工作流" :value="99" />
                         </el-select>
                     </el-form-item>
                 </el-col>
                 <el-col :span="8">
-                    <el-form-item label="间隔时长:">
+                    <el-form-item label="间隔时长:" prop="triggerInterval">
                          <el-input-number
-                            v-model="num"
+                            v-model="formJi.triggerInterval"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
                             :max="10"
                             controls-position="right"
-                            @change="handleChange"
+                            @CHANGE="handleChange"
                         />
                     </el-form-item>
                 </el-col>
             </el-row>
             <el-row :gutter="48">
                 <el-col :span="8">
-                    <el-form-item label="超时时间(秒):">
+                    <el-form-item label="超时时间(秒):" prop="executorTimeout">
                         <el-input-number
-                            v-model="num"
+                            v-model="formJi.executorTimeout"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -381,9 +335,9 @@
                     </el-form-item>
                 </el-col>
                 <el-col :span="8">
-                    <el-form-item label="最大重试次数:">
+                    <el-form-item label="最大重试次数:" prop="maxRetryTimes">
                          <el-input-number
-                            v-model="num"
+                            v-model="formJi.maxRetryTimes"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -396,9 +350,9 @@
             </el-row>
             <el-row :gutter="48">
                 <el-col :span="8">
-                    <el-form-item label="重试间隔:">
+                    <el-form-item label="重试间隔:" prop="retryInterval">
                         <el-input-number
-                            v-model="num"
+                            v-model="formJi.retryInterval"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -408,29 +362,12 @@
                         />
                     </el-form-item>
                 </el-col>
-                <el-col :span="8">
-                    <el-form-item label="告警通知:">
-                         <el-select
-                        v-model="serzu"
-                        class="noBorSel"
-                        placeholder=""
-                        style="width: 100%;margin-left: 0%;"
-                        >
-                            <el-option
-                            v-for="item in optionsShuLei"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                            />
-                        </el-select>
-                    </el-form-item>
-                </el-col>
             </el-row>
             <el-form-item label="描述:" >
-                <el-input v-model="formZu.dcNote" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
+                <el-input v-model="formJi.description" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
             </el-form-item>
         </div>
-        <div v-if="formJi.executorInfo=='内置执行器'" style="margin-top: 4%;">
+        <!-- <div v-if="formJi.executorInfoTy=='内置执行器'" style="margin-top: 4%;">
             <el-form-item label="请求参数:" >
                 <el-input
                 style="width: 75%"
@@ -488,7 +425,7 @@
             </el-form-item>
             <el-form-item label="接口超时时间">
                 <el-input-number
-                    v-model="num"
+                    v-model="formJi.retryInterval"
                     style="width: 75%;"
                     class="mx-4"
                     :min="1"
@@ -554,7 +491,7 @@
                 <el-col :span="8">
                     <el-form-item label="间隔时长:">
                          <el-input-number
-                            v-model="num"
+                            v-model="formJi.retryInterval"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -569,7 +506,7 @@
                 <el-col :span="8">
                     <el-form-item label="超时时间(秒):">
                         <el-input-number
-                            v-model="num"
+                            v-model="formJi.retryInterval"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -582,7 +519,7 @@
                 <el-col :span="8">
                     <el-form-item label="最大重试次数:">
                          <el-input-number
-                            v-model="num"
+                            v-model="formJi.retryInterval"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -597,7 +534,7 @@
                 <el-col :span="8">
                     <el-form-item label="重试间隔:">
                         <el-input-number
-                            v-model="num"
+                            v-model="formJi.retryInterval"
                             style="width: 100%;"
                             class="mx-4"
                             :min="1"
@@ -628,7 +565,7 @@
             <el-form-item label="描述:" >
                 <el-input v-model="formZu.dcNote" style="width: 75%;" placeholder="" type="textarea" :row="2" resize="none"/>
             </el-form-item>
-        </div>
+        </div> -->
         </el-form>
     <template #footer>
       <span class="dialog-footer">
@@ -642,30 +579,139 @@
       </span>
     </template>
   </el-dialog>
-  <el-dialog @close="clearFromTree" :title="titleTree" v-model="dialogVisibleTree" title="" width="30%" destroy-on-close :key="tableKey">
-    <el-form style="margin-left: 5%;margin-top: 2%;"  :model="formTree" class="demo-form-inline" ref="formRefTree" :rules="rulesTree">
-      <el-form-item label="名称:" prop="itemName" style="margin-left: -2%;">
-        <el-input v-model="formTree.itemName" style="width: 75%;" placeholder=""/>
-      </el-form-item>
-      <el-form-item label="父节点id:" prop="catePid" style="margin-left: -2%;">
-        <el-input v-model="formTree.catePid" style="width: 75%;" placeholder=""  resize="none"/>
-      </el-form-item>
-      <el-form-item label="排序:" prop="itemNo" style="margin-left: -2%;">
-        <el-input v-model="formTree.itemNo" style="width: 75%;" placeholder=""  resize="none"/>
-      </el-form-item>
-      <el-form-item label="备注:" prop="itemNotes" style=" ">
-        <el-input v-model="formTree.itemNotes" style="width: 75%;" placeholder=""  resize="none"/>
-      </el-form-item>
-    </el-form>
+  <el-dialog @close="clearFromTree"  v-model="dialogVisibleTree" title="" width="55%" destroy-on-close :key="tableKey">
+    <el-descriptions
+    class="margin-top"
+    :title="titleDe"
+    style="padding-top: 2%;"
+    :column="3"
+    :size="size"
+    border
+  >
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          任务名称
+        </div>
+      </template>
+      {{formJi.jobName}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          组名称
+        </div>
+      </template>
+      {{formJi.groupName}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          负责人
+        </div>
+      </template>
+      {{formJi.ownerName}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          状态
+        </div>
+      </template>
+      <el-tag size="small">{{formJi.jobStatus}}</el-tag>
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          任务类型
+        </div>
+      </template>
+      {{formJi.taskType}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          执行器名称
+        </div>
+      </template>
+      {{formJi.executorInfo}} 
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          方法参数
+        </div>
+      </template>
+      {{formJi.argsStr}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          路由策略
+        </div>
+      </template>
+      {{formJi.routeKey}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          阻塞策略
+        </div>
+      </template>
+      {{formJi.blockStrategy}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          触发类型
+        </div>
+      </template>
+      {{formJi.triggerType}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          间隔时长
+        </div>
+      </template>
+      {{formJi.triggerInterval}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          超时时间(秒)
+        </div>
+      </template>
+      {{formJi.executorTimeout}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          最大重试次数
+        </div>
+      </template>
+      {{formJi.maxRetryTimes}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          重试间隔
+        </div>
+      </template>
+      {{formJi.retryInterval}}
+    </el-descriptions-item>
+    <el-descriptions-item>
+      <template #label>
+        <div class="cell-item">
+          描述:
+        </div>
+      </template>
+      {{formJi.description}}
+    </el-descriptions-item>
+  </el-descriptions>
     <template #footer>
       <span class="dialog-footer">
-        <el-button size="mini" @click="dialogVisible = false">取消</el-button>
-        <el-button v-if="isAdd" type="primary" @click="addTree" size="mini">
-          提交
-        </el-button>
-        <el-button v-if="!isAdd" type="primary" @click="saveEditTree" size="mini">
-          提交
-        </el-button>
+        <el-button size="mini" type="primary" @click="dialogVisibleTree = false">确定</el-button>
       </span>
     </template>
   </el-dialog>
@@ -674,8 +720,12 @@
 import { Search,RefreshRight,Plus,Download,Upload,Delete,Setting,Minus} from '@element-plus/icons-vue'
 import { reactive } from 'vue'
 import Codemirror from 'codemirror-editor-vue3';
-import { addDataCate,getCateTree,getCateDe,editCate,delCate,addDataItem,getItem,getItemDe,editItem,delItem} from "@/api/service/cate";
+import { snailList,addSnail,snailDe,snailEdit,delSnamil,snailSta,snailTri } from "@/api/service/timing";
 import { ref, onMounted, onUnmounted, nextTick } from 'vue';
+const groupName= ref('')
+const jobName= ref('')
+const jobStatus= ref('')
+const executorInfo= ref('')
 const { proxy } = getCurrentInstance();
 const data =  ref([])
 const title =  ref([])
@@ -691,6 +741,7 @@ const dialogVisibleTree = ref(false)
 const isAdd = ref(false)
 const isAddTa = ref(false)
 const treeId = ref('');
+const titleDe = ref('')
 const parTag = ref([])
 const optionsTaskType = ref([
   {
@@ -741,11 +792,12 @@ const showTablepane = ref({
     gx:true,
 })
 const formJi = ref({
-  name:'',
-  version:'',
-  enname:'',
-  devlang:'',
-  intro:'',
+  jobName:'',
+  groupName:'',
+  jobStatus:'',
+  taskType:'',
+  executorInfo:'',
+  executorInfoTy:'',
   type:'',
   mdContact:'',
   mdUnit:'',
@@ -767,10 +819,21 @@ const formJi = ref({
   mdInNote:'',
   mdOutNote:''
 });
+const selectedRows = ref([])
 const activeTabKey = ref(0)
 const rulesJi = reactive({
-  name: [{ required: true, message: '必填', trigger: 'blur' }],
-  enname: [{ required: true, message: '必填', trigger: 'blur' }],
+  jobName: [{ required: true, message: '必填', trigger: 'blur' }],
+  groupName: [{ required: true, message: '必填', trigger: 'blur' }],
+  taskType: [{ required: true, message: '必填', trigger: 'blur' }],
+  jobStatus: [{ required: true, message: '必填', trigger: 'blur' }],
+  executorInfo: [{ required: true, message: '必填', trigger: 'blur' }],
+  routeKey: [{ required: true, message: '可选', trigger: 'blur' }],
+  blockStrategy: [{ required: true, message: '必填', trigger: 'blur' }],
+  triggerInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+  executorTimeout: [{ required: true, message: '必填', trigger: 'blur' }],
+  maxRetryTimes: [{ required: true, message: '必填', trigger: 'blur' }],
+  retryInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+  triggerType: [{ required: true, message: '必填', trigger: 'blur' }],
 });
 const formRefJi = ref();
 const formZu = ref({
@@ -807,10 +870,100 @@ const formRefTree = ref();
 
 const dropdownVisible = ref(false);
 
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+function snaliTrigger(row){
+  var par = {
+    jobId:row.id,
+    taskType:row.taskType
+  }
+  snailTri(par).then(res=>{
+    if(res.code===200){
+      proxy.$modal.msgSuccess(res.msg);
+    }
+  })
+}
 function showCode(){
-    nextTick(() => {
-        cmRef.value?.refresh(); // 关键调用
-    });
+  Object.keys(rulesJi).forEach(key => {
+      delete rulesJi[key];
+  });
+    if(formJi.value.executorInfoTy==='自定义执行器'){
+      Object.assign(rulesJi, {
+        jobName: [{ required: true, message: '必填', trigger: 'blur' }],
+        groupName: [{ required: true, message: '必填', trigger: 'blur' }],
+        taskType: [{ required: true, message: '必填', trigger: 'blur' }],
+        jobStatus: [{ required: true, message: '必填', trigger: 'blur' }],
+        executorInfo: [{ required: true, message: '必填', trigger: 'blur' }],
+        routeKey: [{ required: true, message: '可选', trigger: 'blur' }],
+        blockStrategy: [{ required: true, message: '必填', trigger: 'blur' }],
+        triggerInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+        executorTimeout: [{ required: true, message: '必填', trigger: 'blur' }],
+        maxRetryTimes: [{ required: true, message: '必填', trigger: 'blur' }],
+        retryInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+        triggerType: [{ required: true, message: '必填', trigger: 'blur' }],
+      });
+    }
+    if(formJi.value.executorInfoTy==='内置执行器'){
+      Object.assign(rulesJi, {
+        jobName: [{ required: true, message: '必填', trigger: 'blur' }],
+        groupName: [{ required: true, message: '必填', trigger: 'blur' }],
+        taskType: [{ required: true, message: '必填', trigger: 'blur' }],
+        jobStatus: [{ required: true, message: '必填', trigger: 'blur' }],
+        executorInfo: [{ required: true, message: '必填', trigger: 'blur' }],
+        routeKey: [{ required: true, message: '可选', trigger: 'blur' }],
+        blockStrategy: [{ required: true, message: '必填', trigger: 'blur' }],
+        triggerInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+        executorTimeout: [{ required: true, message: '必填', trigger: 'blur' }],
+        maxRetryTimes: [{ required: true, message: '必填', trigger: 'blur' }],
+        retryInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+        triggerType: [{ required: true, message: '必填', trigger: 'blur' }],
+      });
+    }
+}
+function delAll(){
+  var parDel = ''
+  selectedRows.value.forEach(item=>{
+    parDel = parDel + item.id + ','
+  })
+  parDel = parDel.slice(0, -1)
+  proxy.$modal.confirm('是否确认删除?').then(function () {
+    var par = {
+      jobIds:parDel
+    }
+    return delSnamil(par);
+  }).then(() => {
+    getTable();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+function showDe(row){
+  dialogVisibleTree.value = true
+  var par = {
+    jobId:row.id
+  }
+  snailDe(par).then(res=>{
+    formJi.value = res.data
+    if(formJi.value.jobStatus===0){
+      formJi.value.jobStatus = '启用'
+    }
+    if(formJi.value.jobStatus===1){
+      formJi.value.jobStatus = '关闭'
+    }
+  })
+}
+async function changejobStatus(row){
+  var par = {
+    jobId:row.id,
+    status:row.jobStatus===true?1:0
+  }
+  await snailSta(par).then(res=>{
+    formJi.value = res
+    if(res.code===200){
+      proxy.$modal.msgSuccess("修改成功");
+    }
+  })
+
 }
 const handleCheckboxClick = () => {
   // 1. 执行 checkbox 的切换逻辑(v-model 自动处理)
@@ -824,25 +977,35 @@ function delTag(index){
     parTag.value.splice(index,1)
 }
 function clearForm(){
-  formZu.value = {
-    itemName:'',
-    itemTp:'',
-    itemEn:'',
-    itemTp:'',
-    itemDataTp:'',
-    itemDefaultVal:'',
-    itemUnit:'',
-    itemNotes:'',
+  formJi.value = {
+    
   }
 }
+function formatTimestamp(ms) {
+  const date = new Date(ms);
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, '0'); // 补零
+  const day = String(date.getDate()).padStart(2, '0'); // 补零
+  return `${year}年${month}月${day}日`;
+}
 function getTable(){
   var par = {
-    pageNum:currentPage.value,
-    pageSize:15,
-    cateId:''
+    groupName:groupName.value,
+    executorInfo:executorInfo.value,
+    jobName:jobName.value,
+    jobStatus:jobStatus.value
   }
-  getItem(par).then(res=>{
+  snailList(par).then(res=>{
     tableData.value = res.rows
+    tableData.value.forEach(item=>{
+      if(item.jobStatus===0){
+        item.jobStatus = false
+      }
+      if(item.jobStatus===1){
+        item.jobStatus = true
+      }
+      item.nextTriggerAt = formatTimestamp(item.nextTriggerAt)
+    })
     total.value = res.total
   })
 }
@@ -855,15 +1018,13 @@ function showEdit(row){
   isAddTa.value = false
   title.value = '编辑'
   dialogVisible.value = true
-  getItemDe(row.dataId).then(res=>{
-    formZu.value = res.data
+  var par = {
+    jobId:row.id
+  }
+  snailDe(par).then(res=>{
+    formJi.value = res.data
   })
 }
-function showAddTree(){
-  isAdd.value = true
-  titleTree.value = '新增节点'
-  dialogVisibleTree.value = true
-}
 function clearFromTree(){
   formTree.value = {
     itemName:'',
@@ -872,24 +1033,27 @@ function clearFromTree(){
     itemNotes:''
   }
 }
-function getTree(){
-  getCateTree().then(res=>{
-    data.value = res.data
-  })
-}
 function addTa(){
-  formRefZu.value.validate(async (valid) => {
-    await addDataItem(formZu.value).then(res=>{
-      if(res.code===200){
-        proxy.$modal.msgSuccess("新增成功");
-        getTable()
-        dialogVisible.value = false
+  formRefJi.value.validate(async (valid) => {
+    if(valid){
+      if(formJi.value.argsStr){
+        formJi.value.argsStr = JSON.parse(formJi.value.argsStr)
       }
-    })
+      await addSnail(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$modal.msgSuccess("新增成功");
+          getTable()
+          dialogVisible.value = false
+        }
+      })
+    }
   });
 }
 function saveEditTa(){
-  editItem(formZu.value).then(res=>{
+  if(formJi.value.argsStr){
+    formJi.value.argsStr = JSON.parse(formJi.value.argsStr)
+  }
+  snailEdit(formJi.value).then(res=>{
     if(res.code===200){
       proxy.$modal.msgSuccess("修改成功");
       dialogVisible.value = false
@@ -899,56 +1063,16 @@ function saveEditTa(){
 }
 function delRow(row) {
   proxy.$modal.confirm('是否确认删除?').then(function () {
-    return delItem(row.dataId);
-  }).then(() => {
-    getTable();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {});
-};
-async function addTree(){
-  formRefTree.value.validate(async (valid) => {
-    await addDataCate(formTree.value).then(res=>{
-      if(res.code===200){
-        proxy.$modal.msgSuccess("新增成功");
-        getTree()
-        dialogVisibleTree.value = false
-      }
-    })
-  });
-}
-function saveEditTree(){
-  editCate(formTree.value).then(res=>{
-    if(res.code===200){
-      proxy.$modal.msgSuccess("修改成功");
-      dialogVisibleTree.value = false
-      getTree()
+    var par = {
+      jobIds:row.id
     }
-  })
-}
-function handleNodeClick(node, data){
-  treeId.value = data.id
-  getTable()
-}
-function delTree(node, data) {
-  proxy.$modal.confirm('是否确认删除?').then(function () {
-    return delCate(data.id);
+    return delSnamil(par);
   }).then(() => {
-    getTree();
+    getTable();
     proxy.$modal.msgSuccess("删除成功");
   }).catch(() => {});
 };
-function editTree(node, data){
-  console.log(data)
-  titleTree.value = '编辑'
-  isAdd.value = false
-  dialogVisibleTree.value = true
-  getCateDe(data.id).then(res=>{
-    formTree.value = res.data
-  })
-  console.log(node, data)
-}
 onMounted(() => {
-  getTree()
   getTable()
 });