Преглед изворни кода

😁增加作业触发器运行记录

zuohuaijun пре 2 година
родитељ
комит
af98fecdf8

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailInput.cs

@@ -17,7 +17,7 @@ public class JobDetailInput
     public string JobId { get; set; }
 }
 
-public class PageJobInput : BasePageInput
+public class PageJobDetailInput : BasePageInput
 {
     /// <summary>
     /// 作业Id

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Job/Dto/JobOutput.cs → Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailOutput.cs

@@ -9,7 +9,7 @@
 
 namespace Admin.NET.Core.Service;
 
-public class JobOutput
+public class JobDetailOutput
 {
     /// <summary>
     /// 作业信息

+ 23 - 0
Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerRecordInput.cs

@@ -0,0 +1,23 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core.Service;
+
+public class PageJobTriggerRecordInput : BasePageInput
+{
+    /// <summary>
+    /// 作业Id
+    /// </summary>
+    public string JobId { get; set; }
+
+    /// <summary>
+    /// 触发器Id
+    /// </summary>
+    public string TriggerId { get; set; }
+}

+ 17 - 2
Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs

@@ -17,18 +17,21 @@ public class SysJobService : IDynamicApiController, ITransient
 {
     private readonly SqlSugarRepository<SysJobDetail> _sysJobDetailRep;
     private readonly SqlSugarRepository<SysJobTrigger> _sysJobTriggerRep;
+    private readonly SqlSugarRepository<SysJobTriggerRecord> _sysJobTriggerRecordRep;
     private readonly SqlSugarRepository<SysJobCluster> _sysJobClusterRep;
     private readonly ISchedulerFactory _schedulerFactory;
     private readonly DynamicJobCompiler _dynamicJobCompiler;
 
     public SysJobService(SqlSugarRepository<SysJobDetail> sysJobDetailRep,
         SqlSugarRepository<SysJobTrigger> sysJobTriggerRep,
+        SqlSugarRepository<SysJobTriggerRecord> sysJobTriggerRecordRep,
         SqlSugarRepository<SysJobCluster> sysJobClusterRep,
         ISchedulerFactory schedulerFactory,
         DynamicJobCompiler dynamicJobCompiler)
     {
         _sysJobDetailRep = sysJobDetailRep;
         _sysJobTriggerRep = sysJobTriggerRep;
+        _sysJobTriggerRecordRep = sysJobTriggerRecordRep;
         _sysJobClusterRep = sysJobClusterRep;
         _schedulerFactory = schedulerFactory;
         _dynamicJobCompiler = dynamicJobCompiler;
@@ -38,12 +41,12 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 获取作业分页列表
     /// </summary>
     [DisplayName("获取作业分页列表")]
-    public async Task<SqlSugarPagedList<JobOutput>> PageJobDetail(PageJobInput input)
+    public async Task<SqlSugarPagedList<JobDetailOutput>> PageJobDetail(PageJobDetailInput input)
     {
         var jobDetails = await _sysJobDetailRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description))
-            .Select(d => new JobOutput
+            .Select(d => new JobDetailOutput
             {
                 JobDetail = d,
             }).ToPagedListAsync(input.Page, input.PageSize);
@@ -346,4 +349,16 @@ public class SysJobService : IDynamicApiController, ITransient
     {
         return await _sysJobClusterRep.GetListAsync();
     }
+
+    /// <summary>
+    /// 获取作业触发器运行记录分页列表
+    /// </summary>
+    [DisplayName("获取作业触发器运行记录分页列表")]
+    public async Task<SqlSugarPagedList<SysJobTriggerRecord>> PageJobTriggerRecord(PageJobTriggerRecordInput input)
+    {
+        return await _sysJobTriggerRecordRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.TriggerId), u => u.TriggerId.Contains(input.TriggerId))
+            .ToPagedListAsync(input.Page, input.PageSize);
+    }
 }

+ 30 - 14
Web/src/api-services/apis/sys-code-gen-config-api.ts

@@ -47,6 +47,7 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
          * @param {string} [dictTypeCode] 字典code
          * @param {string} [whetherRetract] 列表是否缩进(字典)
          * @param {string} [whetherRequired] 是否必填(字典)
+         * @param {string} [whetherSortable] 是否可排序(字典)
          * @param {string} [queryWhether] 是否是查询条件
          * @param {string} [queryType] 查询方式
          * @param {string} [whetherTable] 列表显示
@@ -62,7 +63,7 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysCodeGenConfigDetailGet: async (id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysCodeGenConfigDetailGet: async (id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysCodeGenConfig/detail`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -155,6 +156,10 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
                 localVarQueryParameter['WhetherRequired'] = whetherRequired;
             }
 
+            if (whetherSortable !== undefined) {
+                localVarQueryParameter['WhetherSortable'] = whetherSortable;
+            }
+
             if (queryWhether !== undefined) {
                 localVarQueryParameter['QueryWhether'] = queryWhether;
             }
@@ -240,6 +245,7 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
          * @param {string} [dictTypeCode] 字典code
          * @param {string} [whetherRetract] 列表是否缩进(字典)
          * @param {string} [whetherRequired] 是否必填(字典)
+         * @param {string} [whetherSortable] 是否可排序(字典)
          * @param {string} [queryWhether] 是否是查询条件
          * @param {string} [queryType] 查询方式
          * @param {string} [whetherTable] 列表显示
@@ -255,7 +261,7 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysCodeGenConfigListGet: async (id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysCodeGenConfigListGet: async (id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysCodeGenConfig/list`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -348,6 +354,10 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
                 localVarQueryParameter['WhetherRequired'] = whetherRequired;
             }
 
+            if (whetherSortable !== undefined) {
+                localVarQueryParameter['WhetherSortable'] = whetherSortable;
+            }
+
             if (queryWhether !== undefined) {
                 localVarQueryParameter['QueryWhether'] = queryWhether;
             }
@@ -490,6 +500,7 @@ export const SysCodeGenConfigApiFp = function(configuration?: Configuration) {
          * @param {string} [dictTypeCode] 字典code
          * @param {string} [whetherRetract] 列表是否缩进(字典)
          * @param {string} [whetherRequired] 是否必填(字典)
+         * @param {string} [whetherSortable] 是否可排序(字典)
          * @param {string} [queryWhether] 是否是查询条件
          * @param {string} [queryType] 查询方式
          * @param {string} [whetherTable] 列表显示
@@ -505,8 +516,8 @@ export const SysCodeGenConfigApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysCodeGenConfig>>> {
-            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options);
+        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysCodeGenConfig>>> {
+            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, whetherSortable, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -533,6 +544,7 @@ export const SysCodeGenConfigApiFp = function(configuration?: Configuration) {
          * @param {string} [dictTypeCode] 字典code
          * @param {string} [whetherRetract] 列表是否缩进(字典)
          * @param {string} [whetherRequired] 是否必填(字典)
+         * @param {string} [whetherSortable] 是否可排序(字典)
          * @param {string} [queryWhether] 是否是查询条件
          * @param {string} [queryType] 查询方式
          * @param {string} [whetherTable] 列表显示
@@ -548,8 +560,8 @@ export const SysCodeGenConfigApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListCodeGenConfig>>> {
-            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options);
+        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListCodeGenConfig>>> {
+            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, whetherSortable, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -599,6 +611,7 @@ export const SysCodeGenConfigApiFactory = function (configuration?: Configuratio
          * @param {string} [dictTypeCode] 字典code
          * @param {string} [whetherRetract] 列表是否缩进(字典)
          * @param {string} [whetherRequired] 是否必填(字典)
+         * @param {string} [whetherSortable] 是否可排序(字典)
          * @param {string} [queryWhether] 是否是查询条件
          * @param {string} [queryType] 查询方式
          * @param {string} [whetherTable] 列表显示
@@ -614,8 +627,8 @@ export const SysCodeGenConfigApiFactory = function (configuration?: Configuratio
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
-            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(axios, basePath));
+        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
+            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, whetherSortable, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -638,6 +651,7 @@ export const SysCodeGenConfigApiFactory = function (configuration?: Configuratio
          * @param {string} [dictTypeCode] 字典code
          * @param {string} [whetherRetract] 列表是否缩进(字典)
          * @param {string} [whetherRequired] 是否必填(字典)
+         * @param {string} [whetherSortable] 是否可排序(字典)
          * @param {string} [queryWhether] 是否是查询条件
          * @param {string} [queryType] 查询方式
          * @param {string} [whetherTable] 列表显示
@@ -653,8 +667,8 @@ export const SysCodeGenConfigApiFactory = function (configuration?: Configuratio
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
-            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(axios, basePath));
+        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
+            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, whetherSortable, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -697,6 +711,7 @@ export class SysCodeGenConfigApi extends BaseAPI {
      * @param {string} [dictTypeCode] 字典code
      * @param {string} [whetherRetract] 列表是否缩进(字典)
      * @param {string} [whetherRequired] 是否必填(字典)
+     * @param {string} [whetherSortable] 是否可排序(字典)
      * @param {string} [queryWhether] 是否是查询条件
      * @param {string} [queryType] 查询方式
      * @param {string} [whetherTable] 列表显示
@@ -713,8 +728,8 @@ export class SysCodeGenConfigApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysCodeGenConfigApi
      */
-    public async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
-        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
+        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, whetherSortable, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
@@ -737,6 +752,7 @@ export class SysCodeGenConfigApi extends BaseAPI {
      * @param {string} [dictTypeCode] 字典code
      * @param {string} [whetherRetract] 列表是否缩进(字典)
      * @param {string} [whetherRequired] 是否必填(字典)
+     * @param {string} [whetherSortable] 是否可排序(字典)
      * @param {string} [queryWhether] 是否是查询条件
      * @param {string} [queryType] 查询方式
      * @param {string} [whetherTable] 列表显示
@@ -753,8 +769,8 @@ export class SysCodeGenConfigApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysCodeGenConfigApi
      */
-    public async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
-        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, propertyName?: string, columnLength?: number, lowerPropertyName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, whetherSortable?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
+        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, propertyName, columnLength, lowerPropertyName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, whetherSortable, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 95 - 10
Web/src/api-services/apis/sys-job-api.ts

@@ -21,12 +21,14 @@ import { AddJobDetailInput } from '../models';
 import { AddJobTriggerInput } from '../models';
 import { AdminResultListSysJobCluster } from '../models';
 import { AdminResultListSysJobTrigger } from '../models';
-import { AdminResultSqlSugarPagedListJobOutput } from '../models';
+import { AdminResultSqlSugarPagedListJobDetailOutput } from '../models';
+import { AdminResultSqlSugarPagedListSysJobTriggerRecord } from '../models';
 import { DeleteJobDetailInput } from '../models';
 import { DeleteJobTriggerInput } from '../models';
 import { JobDetailInput } from '../models';
 import { JobTriggerInput } from '../models';
-import { PageJobInput } from '../models';
+import { PageJobDetailInput } from '../models';
+import { PageJobTriggerRecordInput } from '../models';
 import { UpdateJobDetailInput } from '../models';
 import { UpdateJobTriggerInput } from '../models';
 /**
@@ -412,11 +414,11 @@ export const SysJobApiAxiosParamCreator = function (configuration?: Configuratio
         /**
          * 
          * @summary 获取作业分页列表
-         * @param {PageJobInput} [body] 
+         * @param {PageJobDetailInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysJobPageJobDetailPost: async (body?: PageJobInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysJobPageJobDetailPost: async (body?: PageJobDetailInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysJob/pageJobDetail`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -457,6 +459,54 @@ export const SysJobApiAxiosParamCreator = function (configuration?: Configuratio
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 获取作业触发器运行记录分页列表
+         * @param {PageJobTriggerRecordInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysJobPageJobTriggerRecordPost: async (body?: PageJobTriggerRecordInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysJob/pageJobTriggerRecord`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 暂停所有作业
@@ -1044,17 +1094,31 @@ export const SysJobApiFp = function(configuration?: Configuration) {
         /**
          * 
          * @summary 获取作业分页列表
-         * @param {PageJobInput} [body] 
+         * @param {PageJobDetailInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysJobPageJobDetailPost(body?: PageJobInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListJobOutput>>> {
+        async apiSysJobPageJobDetailPost(body?: PageJobDetailInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListJobDetailOutput>>> {
             const localVarAxiosArgs = await SysJobApiAxiosParamCreator(configuration).apiSysJobPageJobDetailPost(body, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 获取作业触发器运行记录分页列表
+         * @param {PageJobTriggerRecordInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysJobPageJobTriggerRecordPost(body?: PageJobTriggerRecordInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListSysJobTriggerRecord>>> {
+            const localVarAxiosArgs = await SysJobApiAxiosParamCreator(configuration).apiSysJobPageJobTriggerRecordPost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 暂停所有作业
@@ -1282,13 +1346,23 @@ export const SysJobApiFactory = function (configuration?: Configuration, basePat
         /**
          * 
          * @summary 获取作业分页列表
-         * @param {PageJobInput} [body] 
+         * @param {PageJobDetailInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysJobPageJobDetailPost(body?: PageJobInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListJobOutput>> {
+        async apiSysJobPageJobDetailPost(body?: PageJobDetailInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListJobDetailOutput>> {
             return SysJobApiFp(configuration).apiSysJobPageJobDetailPost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 获取作业触发器运行记录分页列表
+         * @param {PageJobTriggerRecordInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysJobPageJobTriggerRecordPost(body?: PageJobTriggerRecordInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListSysJobTriggerRecord>> {
+            return SysJobApiFp(configuration).apiSysJobPageJobTriggerRecordPost(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 暂停所有作业
@@ -1485,14 +1559,25 @@ export class SysJobApi extends BaseAPI {
     /**
      * 
      * @summary 获取作业分页列表
-     * @param {PageJobInput} [body] 
+     * @param {PageJobDetailInput} [body] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysJobApi
      */
-    public async apiSysJobPageJobDetailPost(body?: PageJobInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListJobOutput>> {
+    public async apiSysJobPageJobDetailPost(body?: PageJobDetailInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListJobDetailOutput>> {
         return SysJobApiFp(this.configuration).apiSysJobPageJobDetailPost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 获取作业触发器运行记录分页列表
+     * @param {PageJobTriggerRecordInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysJobApi
+     */
+    public async apiSysJobPageJobTriggerRecordPost(body?: PageJobTriggerRecordInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListSysJobTriggerRecord>> {
+        return SysJobApiFp(this.configuration).apiSysJobPageJobTriggerRecordPost(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 暂停所有作业

+ 12 - 12
Web/src/api-services/models/admin-result-sql-sugar-paged-list-job-output.ts → Web/src/api-services/models/admin-result-sql-sugar-paged-list-job-detail-output.ts

@@ -12,24 +12,24 @@
  * Do not edit the class manually.
  */
 
-import { SqlSugarPagedListJobOutput } from './sql-sugar-paged-list-job-output';
+import { SqlSugarPagedListJobDetailOutput } from './sql-sugar-paged-list-job-detail-output';
 import {
-    SqlSugarPagedListJobOutput,
+    SqlSugarPagedListJobDetailOutput,
 } from ".";
 
 /**
  * 全局返回结果
  *
  * @export
- * @interface AdminResultSqlSugarPagedListJobOutput
+ * @interface AdminResultSqlSugarPagedListJobDetailOutput
  */
-export interface AdminResultSqlSugarPagedListJobOutput {
+export interface AdminResultSqlSugarPagedListJobDetailOutput {
 
     /**
      * 状态码
      *
      * @type {number}
-     * @memberof AdminResultSqlSugarPagedListJobOutput
+     * @memberof AdminResultSqlSugarPagedListJobDetailOutput
      */
     code?: number;
 
@@ -37,7 +37,7 @@ export interface AdminResultSqlSugarPagedListJobOutput {
      * 类型success、warning、error
      *
      * @type {string}
-     * @memberof AdminResultSqlSugarPagedListJobOutput
+     * @memberof AdminResultSqlSugarPagedListJobDetailOutput
      */
     type?: string | null;
 
@@ -45,21 +45,21 @@ export interface AdminResultSqlSugarPagedListJobOutput {
      * 错误信息
      *
      * @type {string}
-     * @memberof AdminResultSqlSugarPagedListJobOutput
+     * @memberof AdminResultSqlSugarPagedListJobDetailOutput
      */
     message?: string | null;
 
     /**
-     * @type {SqlSugarPagedListJobOutput}
-     * @memberof AdminResultSqlSugarPagedListJobOutput
+     * @type {SqlSugarPagedListJobDetailOutput}
+     * @memberof AdminResultSqlSugarPagedListJobDetailOutput
      */
-    result?: SqlSugarPagedListJobOutput;
+    result?: SqlSugarPagedListJobDetailOutput;
 
     /**
      * 附加数据
      *
      * @type {any}
-     * @memberof AdminResultSqlSugarPagedListJobOutput
+     * @memberof AdminResultSqlSugarPagedListJobDetailOutput
      */
     extras?: any | null;
 
@@ -67,7 +67,7 @@ export interface AdminResultSqlSugarPagedListJobOutput {
      * 时间
      *
      * @type {Date}
-     * @memberof AdminResultSqlSugarPagedListJobOutput
+     * @memberof AdminResultSqlSugarPagedListJobDetailOutput
      */
     time?: Date;
 }

+ 73 - 0
Web/src/api-services/models/admin-result-sql-sugar-paged-list-sys-job-trigger-record.ts

@@ -0,0 +1,73 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET 通用权限开发平台
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+import { SqlSugarPagedListSysJobTriggerRecord } from './sql-sugar-paged-list-sys-job-trigger-record';
+import {
+    SqlSugarPagedListSysJobTriggerRecord,
+} from ".";
+
+/**
+ * 全局返回结果
+ *
+ * @export
+ * @interface AdminResultSqlSugarPagedListSysJobTriggerRecord
+ */
+export interface AdminResultSqlSugarPagedListSysJobTriggerRecord {
+
+    /**
+     * 状态码
+     *
+     * @type {number}
+     * @memberof AdminResultSqlSugarPagedListSysJobTriggerRecord
+     */
+    code?: number;
+
+    /**
+     * 类型success、warning、error
+     *
+     * @type {string}
+     * @memberof AdminResultSqlSugarPagedListSysJobTriggerRecord
+     */
+    type?: string | null;
+
+    /**
+     * 错误信息
+     *
+     * @type {string}
+     * @memberof AdminResultSqlSugarPagedListSysJobTriggerRecord
+     */
+    message?: string | null;
+
+    /**
+     * @type {SqlSugarPagedListSysJobTriggerRecord}
+     * @memberof AdminResultSqlSugarPagedListSysJobTriggerRecord
+     */
+    result?: SqlSugarPagedListSysJobTriggerRecord;
+
+    /**
+     * 附加数据
+     *
+     * @type {any}
+     * @memberof AdminResultSqlSugarPagedListSysJobTriggerRecord
+     */
+    extras?: any | null;
+
+    /**
+     * 时间
+     *
+     * @type {Date}
+     * @memberof AdminResultSqlSugarPagedListSysJobTriggerRecord
+     */
+    time?: Date;
+}

+ 8 - 0
Web/src/api-services/models/code-gen-config.ts

@@ -168,6 +168,14 @@ export interface CodeGenConfig {
      */
     whetherRequired?: string | null;
 
+    /**
+     * 是否可排序(字典)
+     *
+     * @type {string}
+     * @memberof CodeGenConfig
+     */
+    whetherSortable?: string | null;
+
     /**
      * 是否是查询条件
      *

+ 8 - 4
Web/src/api-services/models/index.ts

@@ -52,13 +52,14 @@ export * from './admin-result-list-table-output';
 export * from './admin-result-login-output';
 export * from './admin-result-login-user-output';
 export * from './admin-result-object';
-export * from './admin-result-sql-sugar-paged-list-job-output';
+export * from './admin-result-sql-sugar-paged-list-job-detail-output';
 export * from './admin-result-sql-sugar-paged-list-open-access-output';
 export * from './admin-result-sql-sugar-paged-list-sys-code-gen';
 export * from './admin-result-sql-sugar-paged-list-sys-config';
 export * from './admin-result-sql-sugar-paged-list-sys-dict-data';
 export * from './admin-result-sql-sugar-paged-list-sys-dict-type';
 export * from './admin-result-sql-sugar-paged-list-sys-file';
+export * from './admin-result-sql-sugar-paged-list-sys-job-trigger-record';
 export * from './admin-result-sql-sugar-paged-list-sys-log-diff';
 export * from './admin-result-sql-sugar-paged-list-sys-log-ex';
 export * from './admin-result-sql-sugar-paged-list-sys-log-op';
@@ -138,7 +139,7 @@ export * from './iaction-result';
 export * from './jtoken';
 export * from './job-create-type-enum';
 export * from './job-detail-input';
-export * from './job-output';
+export * from './job-detail-output';
 export * from './job-trigger-input';
 export * from './log-input';
 export * from './log-level';
@@ -161,7 +162,8 @@ export * from './page-config-input';
 export * from './page-dict-data-input';
 export * from './page-dict-type-input';
 export * from './page-file-input';
-export * from './page-job-input';
+export * from './page-job-detail-input';
+export * from './page-job-trigger-record-input';
 export * from './page-log-input';
 export * from './page-notice-input';
 export * from './page-online-user-input';
@@ -179,13 +181,14 @@ export * from './role-org-input';
 export * from './role-output';
 export * from './send-subscribe-message-input';
 export * from './signature-input';
-export * from './sql-sugar-paged-list-job-output';
+export * from './sql-sugar-paged-list-job-detail-output';
 export * from './sql-sugar-paged-list-open-access-output';
 export * from './sql-sugar-paged-list-sys-code-gen';
 export * from './sql-sugar-paged-list-sys-config';
 export * from './sql-sugar-paged-list-sys-dict-data';
 export * from './sql-sugar-paged-list-sys-dict-type';
 export * from './sql-sugar-paged-list-sys-file';
+export * from './sql-sugar-paged-list-sys-job-trigger-record';
 export * from './sql-sugar-paged-list-sys-log-diff';
 export * from './sql-sugar-paged-list-sys-log-ex';
 export * from './sql-sugar-paged-list-sys-log-op';
@@ -215,6 +218,7 @@ export * from './sys-file-upload-signature-body';
 export * from './sys-job-cluster';
 export * from './sys-job-detail';
 export * from './sys-job-trigger';
+export * from './sys-job-trigger-record';
 export * from './sys-log-diff';
 export * from './sys-log-ex';
 export * from './sys-log-op';

+ 4 - 4
Web/src/api-services/models/job-output.ts → Web/src/api-services/models/job-detail-output.ts

@@ -22,13 +22,13 @@ import {
  * 
  *
  * @export
- * @interface JobOutput
+ * @interface JobDetailOutput
  */
-export interface JobOutput {
+export interface JobDetailOutput {
 
     /**
      * @type {SysJobDetail}
-     * @memberof JobOutput
+     * @memberof JobDetailOutput
      */
     jobDetail?: SysJobDetail;
 
@@ -36,7 +36,7 @@ export interface JobOutput {
      * 触发器集合
      *
      * @type {Array<SysJobTrigger>}
-     * @memberof JobOutput
+     * @memberof JobDetailOutput
      */
     jobTriggers?: Array<SysJobTrigger> | null;
 }

+ 9 - 9
Web/src/api-services/models/page-job-input.ts → Web/src/api-services/models/page-job-detail-input.ts

@@ -20,15 +20,15 @@ import {
  * 
  *
  * @export
- * @interface PageJobInput
+ * @interface PageJobDetailInput
  */
-export interface PageJobInput {
+export interface PageJobDetailInput {
 
     /**
      * 当前页码
      *
      * @type {number}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     page?: number;
 
@@ -36,7 +36,7 @@ export interface PageJobInput {
      * 页码容量
      *
      * @type {number}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     pageSize?: number;
 
@@ -44,7 +44,7 @@ export interface PageJobInput {
      * 排序字段
      *
      * @type {string}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     field?: string | null;
 
@@ -52,7 +52,7 @@ export interface PageJobInput {
      * 排序方向
      *
      * @type {string}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     order?: string | null;
 
@@ -60,7 +60,7 @@ export interface PageJobInput {
      * 降序排序
      *
      * @type {string}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     descStr?: string | null;
 
@@ -68,7 +68,7 @@ export interface PageJobInput {
      * 作业Id
      *
      * @type {string}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     jobId?: string | null;
 
@@ -76,7 +76,7 @@ export interface PageJobInput {
      * 描述信息
      *
      * @type {string}
-     * @memberof PageJobInput
+     * @memberof PageJobDetailInput
      */
     description?: string | null;
 }

+ 82 - 0
Web/src/api-services/models/page-job-trigger-record-input.ts

@@ -0,0 +1,82 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET 通用权限开发平台
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+import {
+    
+} from ".";
+
+/**
+ * 
+ *
+ * @export
+ * @interface PageJobTriggerRecordInput
+ */
+export interface PageJobTriggerRecordInput {
+
+    /**
+     * 当前页码
+     *
+     * @type {number}
+     * @memberof PageJobTriggerRecordInput
+     */
+    page?: number;
+
+    /**
+     * 页码容量
+     *
+     * @type {number}
+     * @memberof PageJobTriggerRecordInput
+     */
+    pageSize?: number;
+
+    /**
+     * 排序字段
+     *
+     * @type {string}
+     * @memberof PageJobTriggerRecordInput
+     */
+    field?: string | null;
+
+    /**
+     * 排序方向
+     *
+     * @type {string}
+     * @memberof PageJobTriggerRecordInput
+     */
+    order?: string | null;
+
+    /**
+     * 降序排序
+     *
+     * @type {string}
+     * @memberof PageJobTriggerRecordInput
+     */
+    descStr?: string | null;
+
+    /**
+     * 作业Id
+     *
+     * @type {string}
+     * @memberof PageJobTriggerRecordInput
+     */
+    jobId?: string | null;
+
+    /**
+     * 触发器Id
+     *
+     * @type {string}
+     * @memberof PageJobTriggerRecordInput
+     */
+    triggerId?: string | null;
+}

+ 13 - 13
Web/src/api-services/models/sql-sugar-paged-list-job-output.ts → Web/src/api-services/models/sql-sugar-paged-list-job-detail-output.ts

@@ -12,24 +12,24 @@
  * Do not edit the class manually.
  */
 
-import { JobOutput } from './job-output';
+import { JobDetailOutput } from './job-detail-output';
 import {
-    JobOutput,
+    JobDetailOutput,
 } from ".";
 
 /**
  * 分页泛型集合
  *
  * @export
- * @interface SqlSugarPagedListJobOutput
+ * @interface SqlSugarPagedListJobDetailOutput
  */
-export interface SqlSugarPagedListJobOutput {
+export interface SqlSugarPagedListJobDetailOutput {
 
     /**
      * 页码
      *
      * @type {number}
-     * @memberof SqlSugarPagedListJobOutput
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
     page?: number;
 
@@ -37,7 +37,7 @@ export interface SqlSugarPagedListJobOutput {
      * 页容量
      *
      * @type {number}
-     * @memberof SqlSugarPagedListJobOutput
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
     pageSize?: number;
 
@@ -45,7 +45,7 @@ export interface SqlSugarPagedListJobOutput {
      * 总条数
      *
      * @type {number}
-     * @memberof SqlSugarPagedListJobOutput
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
     total?: number;
 
@@ -53,23 +53,23 @@ export interface SqlSugarPagedListJobOutput {
      * 总页数
      *
      * @type {number}
-     * @memberof SqlSugarPagedListJobOutput
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
     totalPages?: number;
 
     /**
      * 当前页集合
      *
-     * @type {Array<JobOutput>}
-     * @memberof SqlSugarPagedListJobOutput
+     * @type {Array<JobDetailOutput>}
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
-    items?: Array<JobOutput> | null;
+    items?: Array<JobDetailOutput> | null;
 
     /**
      * 是否有上一页
      *
      * @type {boolean}
-     * @memberof SqlSugarPagedListJobOutput
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
     hasPrevPage?: boolean;
 
@@ -77,7 +77,7 @@ export interface SqlSugarPagedListJobOutput {
      * 是否有下一页
      *
      * @type {boolean}
-     * @memberof SqlSugarPagedListJobOutput
+     * @memberof SqlSugarPagedListJobDetailOutput
      */
     hasNextPage?: boolean;
 }

+ 83 - 0
Web/src/api-services/models/sql-sugar-paged-list-sys-job-trigger-record.ts

@@ -0,0 +1,83 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET 通用权限开发平台
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+import { SysJobTriggerRecord } from './sys-job-trigger-record';
+import {
+    SysJobTriggerRecord,
+} from ".";
+
+/**
+ * 分页泛型集合
+ *
+ * @export
+ * @interface SqlSugarPagedListSysJobTriggerRecord
+ */
+export interface SqlSugarPagedListSysJobTriggerRecord {
+
+    /**
+     * 页码
+     *
+     * @type {number}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    page?: number;
+
+    /**
+     * 页容量
+     *
+     * @type {number}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    pageSize?: number;
+
+    /**
+     * 总条数
+     *
+     * @type {number}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    total?: number;
+
+    /**
+     * 总页数
+     *
+     * @type {number}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    totalPages?: number;
+
+    /**
+     * 当前页集合
+     *
+     * @type {Array<SysJobTriggerRecord>}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    items?: Array<SysJobTriggerRecord> | null;
+
+    /**
+     * 是否有上一页
+     *
+     * @type {boolean}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    hasPrevPage?: boolean;
+
+    /**
+     * 是否有下一页
+     *
+     * @type {boolean}
+     * @memberof SqlSugarPagedListSysJobTriggerRecord
+     */
+    hasNextPage?: boolean;
+}

+ 8 - 0
Web/src/api-services/models/sys-code-gen-config.ts

@@ -200,6 +200,14 @@ export interface SysCodeGenConfig {
      */
     whetherRequired?: string | null;
 
+    /**
+     * 是否可排序(字典)
+     *
+     * @type {string}
+     * @memberof SysCodeGenConfig
+     */
+    whetherSortable?: string | null;
+
     /**
      * 是否是查询条件
      *

+ 105 - 0
Web/src/api-services/models/sys-job-trigger-record.ts

@@ -0,0 +1,105 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET 通用权限开发平台
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+import { TriggerStatus } from './trigger-status';
+import {
+    TriggerStatus,
+} from ".";
+
+/**
+ * 系统作业触发器运行记录表
+ *
+ * @export
+ * @interface SysJobTriggerRecord
+ */
+export interface SysJobTriggerRecord {
+
+    /**
+     * 雪花Id
+     *
+     * @type {number}
+     * @memberof SysJobTriggerRecord
+     */
+    id?: number;
+
+    /**
+     * 作业Id
+     *
+     * @type {string}
+     * @memberof SysJobTriggerRecord
+     */
+    jobId: string;
+
+    /**
+     * 触发器Id
+     *
+     * @type {string}
+     * @memberof SysJobTriggerRecord
+     */
+    triggerId: string;
+
+    /**
+     * 当前运行次数
+     *
+     * @type {number}
+     * @memberof SysJobTriggerRecord
+     */
+    numberOfRuns?: number;
+
+    /**
+     * 最近运行时间
+     *
+     * @type {Date}
+     * @memberof SysJobTriggerRecord
+     */
+    lastRunTime?: Date | null;
+
+    /**
+     * 下一次运行时间
+     *
+     * @type {Date}
+     * @memberof SysJobTriggerRecord
+     */
+    nextRunTime?: Date | null;
+
+    /**
+     * @type {TriggerStatus}
+     * @memberof SysJobTriggerRecord
+     */
+    status?: TriggerStatus;
+
+    /**
+     * 本次执行结果
+     *
+     * @type {string}
+     * @memberof SysJobTriggerRecord
+     */
+    result?: string | null;
+
+    /**
+     * 本次执行耗时
+     *
+     * @type {number}
+     * @memberof SysJobTriggerRecord
+     */
+    elapsedTime?: number;
+
+    /**
+     * 创建时间
+     *
+     * @type {Date}
+     * @memberof SysJobTriggerRecord
+     */
+    createdTime?: Date | null;
+}

+ 8 - 0
Web/src/api-services/models/sys-notice-user.ts

@@ -26,6 +26,14 @@ import {
  */
 export interface SysNoticeUser {
 
+    /**
+     * 雪花Id
+     *
+     * @type {number}
+     * @memberof SysNoticeUser
+     */
+    id?: number;
+
     /**
      * 通知公告Id
      *

+ 2 - 11
Web/src/views/system/job/component/editJobDetail.vue

@@ -102,7 +102,7 @@
 </template>
 
 <script lang="ts" setup name="sysEditJobDetail">
-import { reactive, ref, computed, onBeforeUnmount } from 'vue';
+import { reactive, ref, computed } from 'vue';
 import * as monaco from 'monaco-editor';
 import { JobScriptCode } from './JobScriptCode';
 
@@ -150,8 +150,6 @@ const isHttpCreateType = computed(() => {
 // 初始化monacoEditor对象
 var monacoEditor: any = null;
 const initMonacoEditor = () => {
-	if (monacoEditor) return;
-
 	monacoEditor = monaco.editor.create(monacoEditorRef.value, {
 		theme: 'vs-dark', // 主题 vs vs-dark hc-black
 		value: '', // 默认显示的值
@@ -178,13 +176,6 @@ const initMonacoEditor = () => {
 	});
 };
 
-// 组件卸载之前执行
-onBeforeUnmount(() => {
-	if (monacoEditor) {
-		monacoEditor.dispose();
-	}
-});
-
 // 打开弹窗
 const openDialog = (row: any) => {
 	state.selectedTabName = '0'; // 重置为第一个 tab 页
@@ -199,7 +190,7 @@ const openDialog = (row: any) => {
 
 	// 延迟拿值防止取不到
 	setTimeout(() => {
-		initMonacoEditor();
+		if (monacoEditor == null) initMonacoEditor();
 		monacoEditor.setValue(row.id == undefined ? JobScriptCode : state.ruleForm.scriptCode);
 	}, 1);
 };

+ 106 - 21
Web/src/views/system/job/index.vue

@@ -44,7 +44,7 @@
 			<el-table :data="state.jobData" style="width: 100%" v-loading="state.loading" border>
 				<el-table-column type="expand" fixed>
 					<template #default="scope">
-						<el-table style="margin-left: 48px; width: calc(100% - 48px)" :data="(scope.row as JobOutput).jobTriggers" border size="small">
+						<el-table style="margin-left: 48px; width: calc(100% - 48px)" :data="(scope.row as JobDetailOutput).jobTriggers" border size="small">
 							<el-table-column type="index" label="序号" width="55" align="center" fixed />
 							<el-table-column prop="triggerId" label="触发器编号" width="120" header-align="center" fixed show-overflow-tooltip />
 							<el-table-column prop="triggerType" label="类型" header-align="center" show-overflow-tooltip />
@@ -121,7 +121,7 @@
 					<template #default="scope">
 						<div style="display: flex; align-items: center">
 							<el-icon><timer /></el-icon>
-							<span style="margin-left: 5px">{{ (scope.row as JobOutput).jobDetail?.jobId }}</span>
+							<span style="margin-left: 5px">{{ (scope.row as JobDetailOutput).jobDetail?.jobId }}</span>
 						</div>
 					</template>
 				</el-table-column>
@@ -131,27 +131,27 @@
 				<el-table-column prop="jobDetail.description" label="描述" header-align="center" show-overflow-tooltip />
 				<el-table-column prop="jobDetail.concurrent" label="执行方式" width="90" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="success" v-if="(scope.row as JobOutput).jobDetail?.concurrent == true"> 并行 </el-tag>
+						<el-tag type="success" v-if="(scope.row as JobDetailOutput).jobDetail?.concurrent == true"> 并行 </el-tag>
 						<el-tag type="warning" v-else> 串行 </el-tag>
 					</template>
 				</el-table-column>
 				<el-table-column prop="jobDetail.createType" label="作业创建类型" width="110" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag type="info" v-if="(scope.row as JobOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_0"> 内置 </el-tag>
-						<el-tag type="warning" v-if="(scope.row as JobOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_1"> 脚本 </el-tag>
-						<el-tag type="success" v-if="(scope.row as JobOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_2"> HTTP请求 </el-tag>
+						<el-tag type="info" v-if="(scope.row as JobDetailOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_0"> 内置 </el-tag>
+						<el-tag type="warning" v-if="(scope.row as JobDetailOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_1"> 脚本 </el-tag>
+						<el-tag type="success" v-if="(scope.row as JobDetailOutput).jobDetail?.createType == JobCreateTypeEnum.NUMBER_2"> HTTP请求 </el-tag>
 					</template>
 				</el-table-column>
 				<!-- <el-table-column prop="jobDetail.includeAnnotations" label="扫描特性触发器" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-tag v-if="(scope.row as JobOutput).jobDetail?.includeAnnotations == true"> 是 </el-tag>
+						<el-tag v-if="(scope.row as JobDetailOutput).jobDetail?.includeAnnotations == true"> 是 </el-tag>
 						<el-tag v-else> 否 </el-tag>
 					</template>
 				</el-table-column> -->
 				<el-table-column prop="jobDetail.updatedTime" label="更新时间" width="130" align="center" show-overflow-tooltip />
 				<el-table-column prop="jobDetail.properties" label="额外数据" header-align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<span v-if="(scope.row as JobOutput).jobDetail?.createType != JobCreateTypeEnum.NUMBER_2"> {{ (scope.row as JobOutput).jobDetail?.properties }} </span>
+						<span v-if="(scope.row as JobDetailOutput).jobDetail?.createType != JobCreateTypeEnum.NUMBER_2"> {{ (scope.row as JobDetailOutput).jobDetail?.properties }} </span>
 						<div v-else style="text-align: center">
 							<el-popover placement="left" :width="400" trigger="hover">
 								<template #reference>
@@ -159,21 +159,24 @@
 								</template>
 								<el-descriptions title="Http 请求参数" :column="1" size="small" :border="true">
 									<el-descriptions-item label="请求地址" label-align="right" label-class-name="job-index-descriptions-label-style">
-										{{ getHttpJobMessage((scope.row as JobOutput).jobDetail?.properties).requestUri }}
+										{{ getHttpJobMessage((scope.row as JobDetailOutput).jobDetail?.properties).requestUri }}
 									</el-descriptions-item>
 									<el-descriptions-item label="请求方法" label-align="right" label-class-name="job-index-descriptions-label-style">
-										{{ getHttpMethodDesc(getHttpJobMessage((scope.row as JobOutput).jobDetail?.properties).httpMethod) }}
+										{{ getHttpMethodDesc(getHttpJobMessage((scope.row as JobDetailOutput).jobDetail?.properties).httpMethod) }}
 									</el-descriptions-item>
 									<el-descriptions-item label="请求报文体" label-align="right" label-class-name="job-index-descriptions-label-style">
-										{{ getHttpJobMessage((scope.row as JobOutput).jobDetail?.properties).body }}
+										{{ getHttpJobMessage((scope.row as JobDetailOutput).jobDetail?.properties).body }}
 									</el-descriptions-item>
 								</el-descriptions>
 							</el-popover>
 						</div>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="230" fixed="right" align="center" show-overflow-tooltip>
+				<el-table-column label="操作" width="260" fixed="right" align="center" show-overflow-tooltip>
 					<template #default="scope">
+						<el-tooltip content="执行记录">
+							<el-button size="small" type="primary" icon="ele-Timer" text @click="openJobTriggerRecord(scope.row)"> </el-button>
+						</el-tooltip>
 						<el-tooltip content="增加触发器">
 							<el-button size="small" type="primary" icon="ele-CirclePlus" text @click="openAddJobTrigger(scope.row)"> </el-button>
 						</el-tooltip>
@@ -211,6 +214,50 @@
 			/>
 		</el-card>
 
+		<el-drawer v-model="state.isVisibleDrawer" title="作业触发器运行记录" size="45%">
+			<el-card shadow="hover" style="margin: 8px; padding-bottom: 15px">
+				<el-table :data="state.triggerRecordData" style="width: 100%" v-loading="state.loading2" border>
+					<el-table-column type="index" label="序号" width="55" align="center" />
+					<el-table-column prop="jobId" label="作业编号" min-width="120" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="triggerId" label="触发器编号" min-width="120" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="numberOfRuns" label="当前运行次数" min-width="100" align="center" show-overflow-tooltip />
+					<el-table-column prop="lastRunTime" label="最近运行时间" min-width="130" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="nextRunTime" label="下一次运行时间" min-width="120" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="status" label="触发器状态" align="center" show-overflow-tooltip>
+						<template #default="scope">
+							<el-tag type="warning" effect="plain" v-if="(scope.row as SysJobTrigger).status == 0"> 积压 </el-tag>
+							<el-tag type="" effect="plain" v-if="(scope.row as SysJobTrigger).status == 1"> 就绪 </el-tag>
+							<el-tag type="success" effect="plain" v-if="(scope.row as SysJobTrigger).status == 2"> 正在运行 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 3"> 暂停 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 4"> 阻塞 </el-tag>
+							<el-tag type="" effect="plain" v-if="(scope.row as SysJobTrigger).status == 5"> 由失败进入就绪 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 6"> 归档 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 7"> 崩溃 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 8"> 超限 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 9"> 无触发时间 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 10"> 未启动 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 11"> 未知作业触发器 </el-tag>
+							<el-tag type="danger" effect="plain" v-if="(scope.row as SysJobTrigger).status == 12"> 未知作业处理程序 </el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="result" label="执行结果" header-align="center" show-overflow-tooltip />
+					<el-table-column prop="elapsedTime" label="耗时" min-width="80" align="center" show-overflow-tooltip />
+					<el-table-column prop="createdTime" label="创建时间" min-width="130" align="center" show-overflow-tooltip />
+				</el-table>
+				<el-pagination
+					v-model:currentPage="state.tableParams2.page"
+					v-model:page-size="state.tableParams2.pageSize"
+					:total="state.tableParams2.total"
+					:page-sizes="[10, 20, 50, 100]"
+					small
+					background
+					@size-change="handleSizeChange2"
+					@current-change="handleCurrentChange2"
+					layout="total, sizes, prev, pager, next, jumper"
+				/>
+			</el-card>
+		</el-drawer>
+
 		<EditJobDetail ref="editJobDetailRef" :title="state.editJobDetailTitle" @handleQuery="handleQuery" />
 		<EditJobTrigger ref="editJobTriggerRef" :title="state.editJobTriggerTitle" @handleQuery="handleQuery" />
 		<JobCluster ref="editJobClusterRef" />
@@ -228,7 +275,7 @@ import JobCluster from '/@/views/system/job/component/jobCluster.vue';
 
 import { getAPI } from '/@/utils/axios-utils';
 import { SysJobApi } from '/@/api-services/api';
-import { JobCreateTypeEnum, JobOutput, SysJobTrigger } from '/@/api-services/models';
+import { JobCreateTypeEnum, JobDetailOutput, SysJobTrigger } from '/@/api-services/models';
 
 const router = useRouter();
 const editJobDetailRef = ref<InstanceType<typeof EditJobDetail>>();
@@ -236,7 +283,7 @@ const editJobTriggerRef = ref<InstanceType<typeof EditJobTrigger>>();
 const editJobClusterRef = ref<InstanceType<typeof JobCluster>>();
 const state = reactive({
 	loading: false,
-	jobData: [] as Array<JobOutput>,
+	jobData: [] as Array<JobDetailOutput>,
 	queryParams: {
 		jobId: undefined,
 		description: undefined,
@@ -246,8 +293,17 @@ const state = reactive({
 		pageSize: 20,
 		total: 0 as any,
 	},
+	tableParams2: {
+		page: 1,
+		pageSize: 20,
+		total: 0 as any,
+	},
 	editJobDetailTitle: '',
 	editJobTriggerTitle: '',
+	loading2: false,
+	isVisibleDrawer: false,
+	triggerRecordData: [] as any,
+	currentJob: {} as any,
 });
 
 onMounted(async () => {
@@ -278,13 +334,13 @@ const openAddJobDetail = () => {
 };
 
 // 打开编辑作业页面
-const openEditJobDetail = (row: JobOutput) => {
+const openEditJobDetail = (row: JobDetailOutput) => {
 	state.editJobDetailTitle = '编辑作业';
 	editJobDetailRef.value?.openDialog(row.jobDetail);
 };
 
 // 删除作业
-const delJobDetail = (row: JobOutput) => {
+const delJobDetail = (row: JobDetailOutput) => {
 	ElMessageBox.confirm(`确定删除作业:【${row.jobDetail?.jobId}】?`, '提示', {
 		confirmButtonText: '确定',
 		cancelButtonText: '取消',
@@ -299,7 +355,7 @@ const delJobDetail = (row: JobOutput) => {
 };
 
 // 打开新增触发器页面
-const openAddJobTrigger = (row: JobOutput) => {
+const openAddJobTrigger = (row: JobDetailOutput) => {
 	state.editJobTriggerTitle = '添加触发器';
 	editJobTriggerRef.value?.openDialog({
 		jobId: row.jobDetail?.jobId,
@@ -357,25 +413,25 @@ const pauseAllJob = async () => {
 };
 
 // 执行某个作业
-const runJob = async (row: JobOutput) => {
+const runJob = async (row: JobDetailOutput) => {
 	await getAPI(SysJobApi).apiSysJobRunJobPost({ jobId: row.jobDetail?.jobId });
 	ElMessage.success('执行作业');
 };
 
 // 启动某个作业
-const startJob = async (row: JobOutput) => {
+const startJob = async (row: JobDetailOutput) => {
 	await getAPI(SysJobApi).apiSysJobStartJobPost({ jobId: row.jobDetail?.jobId });
 	ElMessage.success('启动作业');
 };
 
 // 暂停某个作业
-const pauseJob = async (row: JobOutput) => {
+const pauseJob = async (row: JobDetailOutput) => {
 	await getAPI(SysJobApi).apiSysJobPauseJobPost({ jobId: row.jobDetail?.jobId });
 	ElMessage.success('暂停作业');
 };
 
 // 取消某个作业
-const cancelJob = async (row: JobOutput) => {
+const cancelJob = async (row: JobDetailOutput) => {
 	await getAPI(SysJobApi).apiSysJobCancelJobPost({ jobId: row.jobDetail?.jobId });
 	ElMessage.success('取消作业');
 };
@@ -439,6 +495,35 @@ const getHttpMethodDesc = (httpMethodStr: string | undefined | null): string =>
 	}
 	return '';
 };
+
+// 打开作业触发器运行记录
+const openJobTriggerRecord = (row: any) => {
+	state.currentJob = row;
+	state.isVisibleDrawer = true;
+	handleQuery2();
+};
+
+// 作业触发器运行记录查询操作
+const handleQuery2 = async () => {
+	state.loading2 = true;
+	// let params = Object.assign(state.currentJob.jobDetail.jobId); //state.currentJob.jobTriggers[0].triggerId
+	var res = await getAPI(SysJobApi).apiSysJobPageJobTriggerRecordPost({ jobId: state.currentJob.jobDetail.jobId });
+	state.triggerRecordData = res.data.result?.items ?? [];
+	state.tableParams2.total = res.data.result?.total;
+	state.loading2 = false;
+};
+
+// 作业触发器运行记录-改变页面容量
+const handleSizeChange2 = (val: number) => {
+	state.tableParams2.pageSize = val;
+	handleQuery2();
+};
+
+// 作业触发器运行记录-改变页码序号
+const handleCurrentChange2 = (val: number) => {
+	state.tableParams2.page = val;
+	handleQuery2();
+};
 </script>
 
 <style>