<template>
<el-main>
	<el-row :gutter="15">
		<el-col :xl="6" :lg="6" :md="8" :sm="12" :xs="24" v-for="item in list" :key="item.id">
			<el-card class="task task-item" shadow="hover">
				<h2>{{item.title}}</h2>
				<ul>
					<li>
						<h4>任务类型</h4>
						<p>{{crontabType[item.type]}}</p>
					</li>
					<li>
						<h4>执行类</h4>
						<p>{{item.command}}</p>
					</li>
					<li>
						<h4>定时规则</h4>
						<p>{{item.expression}}</p>
					</li>
				</ul>
				<div class="bottom">
					<div class="state">
						<el-tag v-if="item.status==1">运行中</el-tag>
						<el-tag v-if="item.status==0" type="info">停用</el-tag>
					</div>
					<div class="handler">
						<el-popconfirm :title="item.status==1 ? '确定立即关闭吗？' : '确定立即执行吗？'" @confirm="run(item)">
							<template #reference>
								<el-button type="primary" :icon="item.status==1 ? 'el-icon-switch-button' : 'el-icon-caret-right'" circle></el-button>
							</template>
						</el-popconfirm>
						<el-dropdown trigger="click">
							<el-button type="primary" icon="el-icon-more" circle plain></el-button>
							<template #dropdown>
								<el-dropdown-menu>
									<el-dropdown-item @click="edit(item)">编辑</el-dropdown-item>
									<el-dropdown-item @click="logs(item)">日志</el-dropdown-item>
									<el-dropdown-item @click="del(item)" divided>删除</el-dropdown-item>
								</el-dropdown-menu>
							</template>
						</el-dropdown>
					</div>
				</div>
			</el-card>
		</el-col>
		<el-col :xl="6" :lg="6" :md="8" :sm="12" :xs="24">
			<el-card class="task task-add" shadow="none" @click="add">
				<el-icon><el-icon-plus /></el-icon>
				<p>添加计划任务</p>
			</el-card>
		</el-col>
	</el-row>
</el-main>

<save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></save-dialog>
<logs v-if="dialog.logs" ref="logsDialog" @closed="dialog.logs=false"></logs>
</template>

<script>
import saveDialog from './save'
import logs from './logs'

export default {
	name: 'system.crontab',
	components: {
		saveDialog,
		logs
	},
	provide() {
		return {
			list: this.list
		}
	},
	data() {
		return {
			dialog: {
				save: false,
				logs: false
			},
			crontabType: {1: '执行命令', 2: '执行类class', 3: '执行地址', 4: '执行shell'},
			list: []
		}
	},
	mounted() {
		this.getCrontabList()
	},
	methods: {
		async getCrontabList(){
			let res = await this.$API.system.crontab.list.get()
			if(res.code===1){
				this.list = res.data
			}
		},
		add(){
			this.dialog.save = true
			this.$nextTick(() => {
				this.$refs.saveDialog.open()
			})
		},
		edit(task){
			this.dialog.save = true
			this.$nextTick(() => {
				this.$refs.saveDialog.open('edit').setData(task)
			})
		},
		del(task){
			this.$confirm(`确认删除 ${task.title} 计划任务吗？`,'提示', {
				type: 'warning',
				confirmButtonText: '删除',
				confirmButtonClass: 'el-button--danger'
			}).then(async () => {
				let res = await this.$API.system.crontab.delete.post({id: task.id})
				if(res.code===1){
					this.$message.success('操作成功')
					this.getCrontabList()
				}
			}).catch(() => {
				//取消
			})
		},
		logs(row){
			this.dialog.logs = true
			this.$nextTick(() => {
				this.$refs.logsDialog.open().setData(row)
			})
		},
		async run(task){
			let res = await this.$API.system.crontab.reload.post({id: task.id, status: task.status == 1 ? 0 : 1})
			if(res.code===1){
				this.$message.success('已成功执行计划任务')
				this.getCrontabList()
			}
		},
		//本地更新数据
		handleSuccess(){
			this.getCrontabList()
		}
	}
}
</script>

<style scoped>
.task {height: 240px;}
.task-item h2 {font-size: 15px;color: #3c4a54;padding-bottom:15px;}
.task-item li {list-style-type:none;margin-bottom: 10px;}
.task-item li h4 {font-size: 12px;font-weight: normal;color: #999;}
.task-item li p {margin-top: 5px;}
.task-item .bottom {border-top: 1px solid #EBEEF5;text-align: right;padding-top:10px;display: flex;justify-content: space-between;align-items: center;}

.task-add {display: flex;flex-direction: column;align-items: center;justify-content: center;text-align: center;cursor: pointer;color: #999;}
.task-add:hover {color: #409EFF;}
.task-add i {font-size: 30px;}
.task-add p {font-size: 12px;margin-top: 20px;}
</style>
