Sfoglia il codice sorgente

定时任务优化

zyp 5 giorni fa
parent
commit
e2c24c3db6

+ 9 - 7
src/api/monitor/jobLog.js

@@ -9,19 +9,21 @@ export function listJobLog(query) {
   })
 }
 
-// 删除调度日志
-export function delJobLog(jobLogId) {
+// 删除调度日志(支持 tenantId 参数,切换对应租户库执行删除)
+export function delJobLog(jobLogIds, tenantId) {
   return request({
-    url: '/monitor/jobLog/' + jobLogId,
-    method: 'delete'
+    url: '/monitor/jobLog/' + jobLogIds,
+    method: 'delete',
+    params: tenantId ? { tenantId } : {}
   })
 }
 
-// 清空调度日志
-export function cleanJobLog() {
+// 清空调度日志(支持 tenantId,仅清空指定租户的日志)
+export function cleanJobLog(tenantId) {
   return request({
     url: '/monitor/jobLog/clean',
-    method: 'delete'
+    method: 'delete',
+    params: tenantId ? { tenantId } : {}
   })
 }
 

+ 16 - 0
src/router/index.js

@@ -170,6 +170,22 @@ export const constantRoutes = [
       }
     ]
   },
+  // SaaS 自定义:系统配置 > 定时任务(模板管理) 对应的 “调度日志” 菜单 path 为 'jobLog'(短路径,与 'job' 平级)
+  // 添加此隐藏路由确保 router.push({ path: '/jobLog' }) 或从菜单点击时能正确加载日志页,并高亮父菜单“定时任务”
+  {
+    path: '/jobLog',
+    component: Layout,
+    hidden: true,
+    redirect: '/jobLog/index',
+    children: [
+      {
+        path: 'index',
+        component: (resolve) => require(['@/views/monitor/job/log'], resolve),
+        name: 'SaaSJobLog',
+        meta: { title: '调度日志', activeMenu: '/job' }
+      }
+    ]
+  },
   {
     path: '/tool/gen-edit',
     component: Layout,

+ 12 - 1
src/views/admin/tenantMenu/index.vue

@@ -20,6 +20,16 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="显示状态" prop="visible">
+        <el-select v-model="queryParams.visible" placeholder="显示状态" clearable size="small">
+          <el-option
+            v-for="dict in visibleOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -318,7 +328,8 @@ export default {
       // 查询参数
       queryParams: {
         menuName: undefined,
-        visible: undefined
+        visible: "0",
+        status: undefined
       },
       // 表单参数
       form: {},

+ 6 - 1
src/views/monitor/job/index.vue

@@ -79,6 +79,7 @@
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']">修改</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']">删除</el-button>
+          <el-button size="mini" type="text" icon="el-icon-s-operation" @click="handleRowJobLog(scope.row)" v-hasPermi="['monitor:job:query']">日志</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -340,7 +341,11 @@ export default {
     },
     handleShowCron() { this.expression = this.form.cronExpression; this.openCron = true; },
     crontabFill(value) { this.form.cronExpression = value; },
-    handleJobLog() { this.$router.push({ path: '/monitor/job-log/index' }); },
+    handleJobLog() { this.$router.push({ path: '/jobLog' }); },
+    // 表格行内“日志”按钮:跳转日志页并预填任务名称,便于快速查看该模板在各租户的执行记录(再在日志页选择租户)
+    handleRowJobLog(row) {
+      this.$router.push({ path: '/jobLog', query: { jobName: row.jobName } });
+    },
     // Bean 注册表
     handleTaskRegistry() { this.openRegistry = true; },
     initRegistry() { this.registryQueryParams.pageNum = 1; this.getRegistryList(); },

+ 50 - 5
src/views/monitor/job/log.vue

@@ -1,6 +1,24 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <!-- SaaS 平台专用:选择租户后,后端会临时切换数据源到该租户库查询其 sys_job_log(租户任务的执行日志实际落在各自租户库) -->
+      <el-form-item label="租户" prop="tenantId">
+        <el-select
+          v-model="queryParams.tenantId"
+          placeholder="全部(主库/平台日志)"
+          clearable
+          size="small"
+          style="width: 240px"
+          @change="handleQuery"
+        >
+          <el-option
+            v-for="t in tenantOptions"
+            :key="t.id"
+            :label="t.tenantCode + ' (ID:' + t.id + ')'"
+            :value="t.id"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="任务名称" prop="jobName">
         <el-input
           v-model="queryParams.jobName"
@@ -186,6 +204,7 @@
 
 <script>
 import { listJobLog, delJobLog, exportJobLog, cleanJobLog } from "@/api/monitor/jobLog";
+import { tenantList } from "@/api/tenant/tenant";
 
 export default {
   name: "JobLog",
@@ -215,17 +234,39 @@ export default {
       statusOptions: [],
       // 任务组名字典
       jobGroupOptions: [],
+      // 租户选项(用于平台后台跨租户查看各租户的调度执行日志)
+      tenantOptions: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         jobName: undefined,
         jobGroup: undefined,
-        status: undefined
+        status: undefined,
+        tenantId: undefined   // SaaS 平台专用:选择后后端会切换到该租户数据源查询 sys_job_log
       }
     };
   },
   created() {
+    // 支持从“定时任务”页面跳转时携带 ?jobName=xxx (或 jobGroup) 自动筛选对应任务的日志
+    // 即使当前“任务日志”按钮未传参,未来若加 per-row “日志”按钮可直接 push({path:'/jobLog', query:{jobName: row.jobName}})
+    const q = this.$route.query || {};
+    if (q.jobName) {
+      this.queryParams.jobName = q.jobName;
+    }
+    if (q.jobGroup) {
+      this.queryParams.jobGroup = q.jobGroup;
+    }
+    if (q.tenantId) {
+      this.queryParams.tenantId = Number(q.tenantId);
+    }
+
+    // 加载活跃租户列表(用于平台管理员筛选查看不同租户的定时任务执行日志)
+    // 注意:只有平台总后台(fs-admin)有权限看到全部租户;租户自身后台通常只看到本租户日志(走自身 ds)
+    tenantList({ status: 1 }).then(response => {
+      this.tenantOptions = response.rows || response.data || [];
+    }).catch(() => {});
+
     this.getList();
     this.getDicts("sys_common_status").then(response => {
       this.statusOptions = response.data;
@@ -248,7 +289,7 @@ export default {
     // 返回按钮
     handleClose() {
       this.$store.dispatch("tagsView/delView", this.$route);
-      this.$router.push({ path: "/monitor/job" });
+      this.$router.push({ path: "/job" });
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -258,6 +299,7 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.dateRange = [];
+      this.queryParams.tenantId = undefined;
       this.resetForm("queryForm");
       this.handleQuery();
     },
@@ -274,12 +316,13 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const jobLogIds = this.ids;
+      const tenantId = this.queryParams.tenantId;
       this.$confirm('是否确认删除调度日志编号为"' + jobLogIds + '"的数据项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
         }).then(function() {
-          return delJobLog(jobLogIds);
+          return delJobLog(jobLogIds, tenantId);
         }).then(() => {
           this.getList();
           this.msgSuccess("删除成功");
@@ -287,12 +330,14 @@ export default {
     },
     /** 清空按钮操作 */
     handleClean() {
-      this.$confirm("是否确认清空所有调度日志数据项?", "警告", {
+      const tenantId = this.queryParams.tenantId;
+      const tip = tenantId ? ("是否确认清空租户ID=" + tenantId + " 的所有调度日志数据项?") : "是否确认清空当前数据源的所有调度日志数据项?";
+      this.$confirm(tip, "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
         }).then(function() {
-          return cleanJobLog();
+          return cleanJobLog(tenantId);
         }).then(() => {
           this.getList();
           this.msgSuccess("清空成功");

+ 12 - 1
src/views/saas/tenantMenu/index.vue

@@ -20,6 +20,16 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="显示状态" prop="visible">
+        <el-select v-model="queryParams.visible" placeholder="显示状态" clearable size="small">
+          <el-option
+            v-for="dict in visibleOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -314,7 +324,8 @@ export default {
       // 查询参数
       queryParams: {
         menuName: undefined,
-        visible: undefined
+        visible: "0",
+        status: undefined
       },
       // 表单参数
       form: {},