<!-- 任务管理-日志信息查询 --> <template> <div id="daily"> <h5> 任务名称:{{ taskText }} <span @click="taskGo" class="pull-right">返回任务管理列表</span> </h5> <xfTable ref="table" @currentChange="currentChange" :btnAuthority="authority" @sizeSee="sizeChange" @taskDaily="taskDaily" @cancel="cancel" > </xfTable> <!-- 数据添加 --> <el-dialog :title="modelHead" :visible.sync="dataEdit" :close-on-click-modal="closeOnClick" :lock-scroll="closeOnClick" width="50%" :modal="closeOnClick" @close="modelClose" class="model_body" > <p>任务进度:</p> <el-progress :percentage="percentage" :color="customColors" class="m-b-20" ></el-progress> <p> 任务状态:<span :style="{ color: taskColor }">{{ taskStatus }}</span> </p> <div class="scrollShow"> <p v-for="(item, index) in recordIds" :key="index" class="m-b-10 zhixing" > {{ index + 1 }} : {{ item.excuteDate | dateReset }} {{ item.taskRecordDetailNow }} </p> </div> <span slot="footer" class="dialog-footer"> <el-button @click="modelClose">关 闭</el-button> </span> </el-dialog> </div> </template> <script> import project from "../../mixins/project"; var moment = require("moment"); import { notify } from "../../util/item"; import { setInterval, clearInterval } from "timers"; /*负责导出组件*/ export default { name: "daily", data() { return { deleteId: "taskId", //标记删除字段 modelHead: "", taskText: "", dataEdit: false, center: true, taskColor: "", scrollLock: false, closeOnClick: false, taskId: "", deleteList: [], taskStatus: "", timeoutDaily: "", percentage: 0, customColors: [ { color: "#f56c6c", percentage: 20 }, { color: "#e6a23c", percentage: 40 }, { color: "#C32CD5", percentage: 60 }, { color: "#23D767", percentage: 80 }, { color: "#209EF4", percentage: 100 } ], recordIds: [], loadOption: { menuWidth: 150, menu: true, column: [ { label: "任务触发时间", prop: "tringgerTime", formatter: function(row, value, text, column) { if (value === null) { return ""; } return moment(value).format("YYYY-MM-DD HH:mm:ss"); } }, { label: "触发类型", prop: "tringgerType", formatter: function(row, value, text, column) { switch (value) { case "TASK_CRON": return "Cron触发"; break; default: return "手动触发"; } } }, { label: "任务状态", prop: "status", formatter: function(row, value, text, column) { switch (value) { case "WAITING": return "等待中"; break; case "RUNNING": return "执行中"; break; case "CANCELED": return "取消执行"; break; case "ERROR": return "执行异常"; break; case "STOP": return "停止"; break; default: return "执行完毕"; } } }, { label: "修改时间", prop: "updated", formatter: function(row, value, text, column) { if (value === null) { return ""; } return moment(value).format("YYYY-MM-DD HH:mm:ss"); } } ] } }; }, mixins: [project], props: {}, created() { this.authorityMeth("daily"); }, mounted() { this.dailyParams(this.$route.query); }, filters: { dateReset(val) { /** * 更新时间 */ if (val === null) { return ""; } return moment(val).format("YYYY-MM-DD HH:mm:ss"); } }, beforeDestroy() { this.clearDaily(); }, methods: { dailyParams(newVal) { //默认第一页数据 this.page.currentPage = 1; this.page.pageSize = 10; this.taskId = newVal.taskId; this.taskText = newVal.taskName; this.modelHead = `正在执行任务 : ${newVal.taskName}`; this.getLists(newVal.taskId); }, modelClose() { // 关闭模态框 this.dataEdit = false; this.clearDaily(); }, clearDaily() { // 清空定时查询追加增量信息 let _this = this, flages = this.timeoutDaily ? true : false; if (flages) { clearTimeout(_this.timeoutDaily); } }, taskDaily(row, index) { /** * 任务详情 */ this.dataEdit = true; this.getDailyTask(row["recordId"]); }, async cancel(row, index) { /** * 取消 */ let datas = { params: { recordId: row["recordId"] } }; let response = await this.$http.get(this.nozzle.taskCancelTask, datas); notify(response); this.getLists(); }, taskGo() { // 返回任务管理列表 this.clearDaily(); this.$emit("daily"); this.$router.push({ path: "/quality/dataProcess/scheduledTasks" }); }, async getDailyTask(recordId = "") { /** * 获取任务记录,查看 */ this.percentage = 0; this.deleteList = []; let datas = { params: { taskRecordId: recordId } }; let response = await this.$http.get(this.nozzle.getTaskRecordStep, datas); this.recordIds = response.data.data ? response.data.data : []; let lastData = this.recordIds[this.recordIds.length - 1]; if (this.recordIds.length > 0 && lastData["status"] !== "DONE") { // 任务状态不为空,则进行定时查询 if (lastData["status"] === "ERROR") { this.percentage = ~~lastData["percentage"]; return; } this.$notify({ type: "success", message: "任务执行中,请稍后..." }); this.setTimeoutGetTask(recordId, lastData["excuteDate"]); } // 最后一个参数 if (this.recordIds.length > 0) { this.percentage = ~~lastData["percentage"]; this.taskStatus = lastData["status"]; // 字体标记 this.taskColor = this.customColors[this.choiceColor(this.percentage)][ "color" ]; } }, scrollBottom() { // 滚动到底部 this.$nextTick(() => { let scr = document.querySelector(".scrollShow"); scr.scrollTop = scr.scrollHeight; }); }, choiceColor(num) { num = +num; if (0 <= num && num <= 20) { return 0; } else if (20 < num && num <= 40) { return 1; } else if (40 < num && num <= 60) { return 2; } else if (60 < num && num <= 80) { return 3; } else if (80 < num && num <= 100) { return 4; } }, async setTimeoutGetTask(recordId, lastTime) { // 定时获取任务,关闭则清除定时器 let datas = { params: { taskRecordId: recordId, lastExcuteTime: moment(lastTime).format("YYYY-MM-DD HH:mm:ss") } }; this.timeoutDaily = setTimeout(() => { let response = this.$http .get(this.nozzle.getTaskRecordCacheInc, datas) .then(response => { // if (response.data.code === 200) { // response.data.message = '任务执行中,请稍后...' // } // notify(response); let res = response.data.data ? response.data.data : []; // 成功渲染数据 if (response.data.code === 200) { this.recordIds = [...this.recordIds, ...res]; // 进度条 this.percentage = res.length === 0 ? this.percentage : ~~res[res.length - 1]["percentage"]; this.taskStatus = res.length === 0 ? this.taskStatus : res[res.length - 1]["status"]; this.scrollBottom(); } if (res.length !== 0) { if ( res[res.length - 1]["status"] === "DONE" || res[res.length - 1]["status"] === "ERROR" ) { // 最后一个参数,清理定时器 this.clearDaily(); this.$notify({ type: "success", message: "任务执行完毕..." }); } } else { // 已每条最新数据作为查询条件 this.setTimeoutGetTask( recordId, res.length === 0 ? lastTime : [res.length - 1]["excuteDate"] ); } }); }, 3000); }, async getLists(taskId = this.taskId) { /** * 获取日志记录 */ if (taskId === "") { taskId = this.taskId; } this.deleteList = []; let datas = { params: { taskId: taskId, pageNo: this.page.currentPage, pageSize: this.page.pageSize } }; // 获取数据返回状态 日志 let response = await this.getTableData( datas, this.nozzle.queryRecordByTaskId ); this.rendering(response); } } }; </script> <style scoped> h5 { padding: 10px; font-size: 18px; color: var(--white) !important; } h5 span { cursor: pointer; text-decoration: underline; color: #409eff; } #daily { height: 98%; /* background: #fff; */ padding: 20px; } .scrollShow { height: 450px; overflow-y: auto; } .zhixing { padding-left: 5px !important; line-height: 24px; } .model_body p { padding: 5px 0; font-size: 16px; } </style>