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