From 98a44975b0c4755e2a709d5ef7f912809af09860 Mon Sep 17 00:00:00 2001 From: hwh <332078369@qq.com> Date: 星期一, 24 六月 2024 15:03:06 +0800 Subject: [PATCH] 定时任务页面 --- Wms/Utility/Job/SchedulerCenter.cs | 34 ++++ HTML/views/SystemSettings/Job.html | 342 ++++++++++++++++++++++++++++++++++++++++++++++++ Wms/Utility/Entity/JobInfoEntity.cs | 5 Wms/Wms/Controllers/JobController.cs | 17 + 4 files changed, 390 insertions(+), 8 deletions(-) diff --git a/HTML/views/SystemSettings/Job.html b/HTML/views/SystemSettings/Job.html new file mode 100644 index 0000000..627ced1 --- /dev/null +++ b/HTML/views/SystemSettings/Job.html @@ -0,0 +1,342 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <title>瀹氭椂浠诲姟鍒楄〃</title> + <meta name="renderer" content="webkit"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + <meta name="viewport" + content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> + <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all"> + <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all"> + <script> + // 杩欓噷鏄渶瑕佸湪椤甸潰娓叉煋涔嬪墠鎵ц鐨勪唬鐮� + document.addEventListener("DOMContentLoaded", function () { + + //鑾峰彇table榛樿鏄剧ず鏁� + pageCntFirst(); + }); + </script> +</head> + +<body id="body"> + <div class="layui-fluid" style="padding-bottom: 0; "> + <div class="layui-card"> + <div class="layui-form layui-card-header layuiadmin-card-header-auto" style="border-bottom:1px solid #CCC" + id="top"> + <div class="layui-form-item"> + <div class="layui-inline"> + <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-submit + lay-filter="LAY-app-contlist-add"> + <i class="layui-icon layui-icon-add-1 layuiadmin-button-btn"></i>娣诲姞 + </button> + </div> + </div> + </div> + + <div id="center"></div> + + <div class="layui-card-body"> + <table id="LAY-app-content-list" lay-filter="LAY-app-content-list"></table> + </div> + </div> + </div> + <script src="../../layuiadmin/layui/layui.js"></script> + <script src="../../js/public.js"></script> + <script src="../../js/jquery-3.5.1.min.js"></script> + <script src="../../js/jquery.cookie.js"></script> + <script type="text/html" id="toolBar"> + <!-- d浠h〃鐨勬槸layui 寮曟搸妯℃澘涓墍浣跨敤鐨勫崟涓暟鎹� --> + {{# if(d.TriggerState ==0){ }} + <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="Pause"> + <i class="layui-icon layui-icon-pause"></i>鏆傚仠</a> + {{# } }} + {{# if(d.TriggerState ==1){ }} + <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="Play"> + <i class="layui-icon layui-icon-play"></i>寮�濮�</a> + {{# } }} + <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>缂栬緫</a> + <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</a> + <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail"><i + class="layui-icon layui-icon-log"></i>鏃ュ織</a> + <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="execute"><i + class="layui-icon layui-icon-triangle-r"></i>鎵ц</a> + </script> + <script> + layui.config({ + base: '../../layuiadmin/' //闈欐�佽祫婧愭墍鍦ㄨ矾寰� + }).extend({ + index: 'lib/index' //涓诲叆鍙fā鍧� + }).use(['index', 'table', 'laypage', 'layer'], function () { + var table = layui.table, + form = layui.form, + laypage = layui.laypage, + layer = layui.layer; + var h1 = GetTableHeight(); + refreshTable("", "", "", "", ""); + var tableIns; + + function refreshTable(MenuName, Type, Msg, MenuNo, ParentNo) { + var param = { + MenuName: MenuName, + Type: Type, + Msg: Msg, + MenuNo: MenuNo, + ParentNo: ParentNo, + }; + ParentNo = '绯荤粺璁剧疆'; //妯″潡鍚嶇О + var url = "/Job/GetAllJob"; + sendData(IP + url, {}, 'get', function (res) { + + // console.log(res.data) + if (res.code == 200) //鎴愬姛 + { + var list = res.data; + $.extend(infoOptions, { + data: list + }); + tableIns = table.render(infoOptions); + + } + else //涓嶆垚鍔� + { + layer.msg('鑾峰彇浠诲姟鍒楄〃淇℃伅澶辫触锛�', { + icon: 2, + time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { }); + } + }); + + } + var infoOptions = { + elem: '#LAY-app-content-list', + height: h1, + id: 'LAY-app-content-list', + page: false, + limit: pageCnt, + limits: pageLimits, + even: true, + cols: + [[ + { + title: '搴忓彿', type: 'numbers', fixed: 'left', width: 65 + }, + { + field: 'Name', title: '浠诲姟鍚嶇О', align: 'center', fixed: 'left', width: 100 + }, + { + field: 'JobType', title: '绫诲瀷', align: 'center', fixed: 'left', width: 80, templet: function (d) { + if (d.JobType == 1) { + return 'Http' + } else if (d.JobType == 2) { + return '鍐呯疆' + } else if (d.JobType == 3) { + return '鐑姞杞�' + } + } + }, + { + field: 'RunNumber', title: '瑙﹀彂娆℃暟', align: 'center', width: 100 + }, + { + field: 'DisplayState', title: '鐘舵��', align: 'center', width: 80 + }, + // { + // field: 'TriggerState', title: '鐘舵��', align: 'center', width: 80, templet: function (d) { + // switch (d.TriggerState) { + // case 0: + // return '姝e父' + // case 1: + // return '鏆傚仠' + // case 2: + // return '瀹屾垚' + // case 3: + // return '寮傚父' + // case 4: + // return '闃诲' + // case 5: + // return '涓嶅瓨鍦�' + // default: + // return '鏈煡'; + // } + // } + // }, + { + field: 'PreviousFireTime', title: '涓婃鎵ц鏃堕棿', align: 'center', width: 170, templet: function (d) { + return formatDateTime(d.PreviousFireTime) + } + }, + { + field: 'NextFireTime', title: '涓嬫鎵ц鏃堕棿', align: 'center', width: 170, templet: function (d) { + return formatDateTime(d.NextFireTime) + } + }, + { + field: 'Description', title: '鎻忚堪', align: 'center' + }, + { + field: 'caozuo', title: '鎿嶄綔', fixed: 'right', width: 340, align: 'left', toolbar: "#toolBar" + } + ]] + }; + + table.on('tool(LAY-app-content-list)', function (obj) { + var data = obj.data; + switch (obj.event) { + case "execute": + sendData(IP + "/Job/TriggerJob", { Name: data.Name, Group: data.GroupName }, 'post', function (res) { + console.log(res); + if (res.code == 200) { //鎴愬姛 + layer.msg(res.msg, { + icon: 1, + time: 3000 //1绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + doing = true; + }); + } else { //涓嶆垚鍔� + layer.msg(res.msg, { + icon: 2, + time: 3000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + doing = true; + }); + } + layer.close(index); + }); + break; + case "edit": + break; + case "del": + sendData(IP + "/Job/RemoveJob", { Name: data.Name, Group: data.GroupName }, 'post', function (res) { + console.log(res); + if (res.code == 200) { //鎴愬姛 + layer.msg(res.msg, { + icon: 1, + time: 3000 //1绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } else { //涓嶆垚鍔� + layer.msg(res.msg, { + icon: 2, + time: 3000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } + layer.close(index); + }); + break; + case "detail": + sendData(IP + "/Job/GetJobLogs", { Name: data.Name, Group: data.GroupName }, 'post', function (res) { + console.log(res); + if (res.code == 200) { //鎴愬姛 + layer.open({ + type: 1, + area: ['80%', '80%'], // 瀹介珮 + content: res.data.join('\n') + }); + } else { //涓嶆垚鍔� + layer.msg(res.msg, { + icon: 2, + time: 3000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } + layer.close(index); + }); + break; + case "Play": + sendData(IP + "/Job/ResumeJob", { Name: data.Name, Group: data.GroupName }, 'post', function (res) { + console.log(res); + if (res.code == 200) { //鎴愬姛 + layer.msg(res.msg, { + icon: 1, + time: 3000 //1绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } else { //涓嶆垚鍔� + layer.msg(res.msg, { + icon: 2, + time: 3000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } + layer.close(index); + }); + break; + case "Pause": + sendData(IP + "/Job/StopJob", { Name: data.Name, Group: data.GroupName }, 'post', function (res) { + console.log(res); + if (res.code == 200) { //鎴愬姛 + layer.msg(res.msg, { + icon: 1, + time: 3000 //1绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } else { //涓嶆垚鍔� + layer.msg(res.msg, { + icon: 2, + time: 3000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級 + }, function () { + refreshTable("", "", "", "", ""); + doing = true; + }); + } + layer.close(index); + }); + break; + } + }); + + //鐩戝惉鎼滅储 + form.on('submit(LAY-app-contlist-search)', function (data) { + // console.log(data) + var MenuName = data.field.MenuName; + var Type = data.field.Type; + var Msg = data.field.Msg; + var MenuNo = data.field.MenuNo; + //MenuName, Type, Msg, MenuNo,ParentNo + refreshTable(MenuName, Type, Msg, MenuNo); + }); + + var doing = true; + + // $('.layui-btn.layuiadmin-btn-list').on('click', function() { + // var type = $(this).data('type'); + // active[type] ? active[type].call(this) : ''; + // }); + }); + function formatDateTime(inputDateTime) { + // 鍒涘缓涓�涓棩鏈熷璞★紝鐢ㄤ簬瑙f瀽杈撳叆鐨勬棩鏈熸椂闂村瓧绗︿覆 + let date = new Date(inputDateTime); + + // 鎻愬彇骞淬�佹湀銆佹棩銆佹椂銆佸垎銆佺 + let year = date.getFullYear(); + let month = ('0' + (date.getMonth() + 1)).slice(-2); // 鏈堜唤浠�0寮�濮嬶紝闇�瑕佸姞1锛屽苟纭繚涓や綅鏁� + let day = ('0' + date.getDate()).slice(-2); // 鏃ラ渶瑕佺‘淇濅袱浣嶆暟 + let hours = ('0' + date.getHours()).slice(-2); // 灏忔椂闇�瑕佺‘淇濅袱浣嶆暟 + let minutes = ('0' + date.getMinutes()).slice(-2); // 鍒嗛挓闇�瑕佺‘淇濅袱浣嶆暟 + let seconds = ('0' + date.getSeconds()).slice(-2); // 绉掗挓闇�瑕佺‘淇濅袱浣嶆暟 + + // 鎷兼帴鎴愭墍闇�鐨勬牸寮� + let formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + + return formattedDateTime; + } + </script> + +</body> + +</html> \ No newline at end of file diff --git a/Wms/Utility/Entity/JobInfoEntity.cs b/Wms/Utility/Entity/JobInfoEntity.cs index 082c403..2d731a9 100644 --- a/Wms/Utility/Entity/JobInfoEntity.cs +++ b/Wms/Utility/Entity/JobInfoEntity.cs @@ -26,6 +26,11 @@ public string Name { get; set; } /// <summary> + /// 浠诲姟缁勫悕 + /// </summary> + public string GroupName { get; set; } + + /// <summary> /// 涓嬫鎵ц鏃堕棿 /// </summary> public DateTime? NextFireTime { get; set; } diff --git a/Wms/Utility/Job/SchedulerCenter.cs b/Wms/Utility/Job/SchedulerCenter.cs index 8ee31a7..13871e4 100644 --- a/Wms/Utility/Job/SchedulerCenter.cs +++ b/Wms/Utility/Job/SchedulerCenter.cs @@ -357,12 +357,38 @@ if (jobType == JobTypeEnum.Url) triggerAddress = jobDetail.JobDataMap.GetString(Constant.REQUESTURL); else if (jobType == JobTypeEnum.BuiltIn) - triggerAddress = jobDetail.JobDataMap.GetString(Constant.BuiltIn); + triggerAddress = jobDetail.JobDataMap.GetString(Constant.CLASSNAME); + var lastErrMsg = string.Empty; + try + { + lastErrMsg = jobDetail.JobDataMap.GetString(Constant.EXCEPTION); + } + catch (Exception) + { + } + var requestType = string.Empty; + try + { + requestType = jobDetail.JobDataMap.GetString(Constant.REQUESTTYPE); + } + catch (Exception) + { + + } + long runNumber = 0; + try + { + runNumber = jobDetail.JobDataMap.GetLong(Constant.RUNNUMBER); + } + catch (Exception) + { + + } jobInfo.JobInfoList.Add(new JobInfo() { Name = jobKey.Name, - LastErrMsg = jobDetail.JobDataMap.GetString(Constant.EXCEPTION), + LastErrMsg = lastErrMsg, TriggerAddress = triggerAddress, TriggerState = await scheduler.GetTriggerState(triggers.Key), PreviousFireTime = triggers.GetPreviousFireTimeUtc()?.LocalDateTime, @@ -371,8 +397,8 @@ Interval = interval, EndTime = triggers.EndTimeUtc?.LocalDateTime, Description = jobDetail.Description, - RequestType = jobDetail.JobDataMap.GetString(Constant.REQUESTTYPE), - RunNumber = jobDetail.JobDataMap.GetLong(Constant.RUNNUMBER), + RequestType = requestType, + RunNumber = runNumber, JobType = (long)jobType //(triggers as SimpleTriggerImpl)?.TimesTriggered //CronTriggerImpl 涓病鏈� TimesTriggered 鎵�浠ヨ嚜宸盧UNNUMBER璁板綍 diff --git a/Wms/Wms/Controllers/JobController.cs b/Wms/Wms/Controllers/JobController.cs index e7f8e2e..2875076 100644 --- a/Wms/Wms/Controllers/JobController.cs +++ b/Wms/Wms/Controllers/JobController.cs @@ -7,14 +7,16 @@ using Utility.Entity; using Utility; using Model.ModelVm; +using Microsoft.AspNetCore.Authorization; namespace Wms.Controllers { /// <summary> /// 浠诲姟璋冨害 /// </summary> - [Route("api/[controller]/[Action]")] - [EnableCors("AllowSameDomain")] //鍏佽璺ㄥ煙 + [Route("api/[controller]/[action]")] + [ApiController] + [Authorize] [ServiceFilter(typeof(ApiResponseActionFilter))] public class JobController : ControllerBase { @@ -153,9 +155,16 @@ /// </summary> /// <returns></returns> [HttpGet] - public async Task<List<JobInfoEntity>> GetAllJob() + public async Task<List<JobInfo>> GetAllJob() { - return await scheduler.GetAllJobAsync(); + var list = await scheduler.GetAllJobAsync(); + var listJob = new List<JobInfo>(); + foreach (var mod in list) + { + mod.JobInfoList.ForEach(s => s.GroupName = mod.GroupName); + listJob.AddRange(mod.JobInfoList); + } + return listJob; } /// <summary> -- Gitblit v1.8.0