Files
Message-Push-Nest/web/src/views/tabsTools/cronMessage/view/addCronMsgPopUp.vue
T
2025-01-01 12:37:26 +08:00

216 lines
6.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<el-dialog v-model="isShow" width="400px" :close-on-press-escape="false" :before-close="() => { }"
:show-close="false">
<template #header="">
<el-text class="mx-1">添加定时消息发送</el-text>
<el-tooltip placement="top">
<template #content>
可以定制一些定时消息通知完成一些简单的提醒事件
<br />
** 需要基于已经创建的发信任务进行绑定
</template>
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</template>
<div class="add-top">
<el-input v-model="currTaskInput.name" placeholder="请输入消息名称" size="small" class="nameInput"></el-input>
</div>
<div class="ins-area">
<div class="ins-add">
<el-autocomplete v-model="currSearchInputText" size="small" :fetch-suggestions="querySearchWayAsync"
placeholder="请输入消息名进行搜索" @select="handleSearchSelect" :clearable="true" value-key="name" />
<div class="store-area" v-if="isShowAddBox">
<div class="display-label">
<el-text class="mx-1" size="small">消息ID{{ currTaskTmp.id }}</el-text><br />
<el-text class="mx-1" size="small">消息名{{ currTaskTmp.name }}</el-text><br />
<el-text class="mx-1" size="small">消息创建时间{{ currTaskTmp.created_on }}</el-text><br />
</div>
<el-input v-model="currTaskInput.title" placeholder="请输入消息标题" size="small" class="msg-input"></el-input>
<el-input type="textarea" :rows="5" v-model="currTaskInput.content" placeholder="请输入消息内容" size="small"
class="msg-input"></el-input>
<el-input v-model="currTaskInput.cron" placeholder="请输入定时crontab表达式(linux形式)" size="small"
class="msg-input"></el-input>
<el-text v-if="currTaskInput.cron" class="mx-1" size="small">下次执行{{ parseCron(currTaskInput.cron) }}</el-text>
<el-input v-model="currTaskInput.url" placeholder="请输入消息详情url(可选)" size="small" class="msg-input"></el-input>
</div>
</div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleCancer()" size="small">取消</el-button>
<!-- <el-button type="primary" size="small" @click="cliclSendNow()">
立即发送
</el-button> -->
<el-button type="primary" size="small" @click="handleSubmit()">
确定添加
</el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { defineComponent, onMounted, watch, reactive, toRefs } from 'vue';
import { _ } from 'lodash';
import { QuestionFilled } from '@element-plus/icons-vue'
import { usePageState } from '@/store/page_sate.js';
import { request } from '@/api/api'
import { CONSTANT } from '@/constant'
import { CommonUtils } from "@/util/commonUtils.js";
import { parseCron } from "@/util/cron.js";
import { generateBizUniqueID } from "@/util/uuid.js";
import { ElMessage } from 'element-plus'
export default defineComponent({
components: {
QuestionFilled,
},
props: {
componentName: String
},
setup(props) {
const pageState = usePageState();
const state = reactive({
insTableData: [],
currSearchWaysData: [],
currSearchInputText: '',
isShow: false,
isShowAddBox: false,
searchway_id: '',
currTaskTmp: {},
currInsInput: {},
currInsInputContentType: 'text',
currTaskInput: {
name: '',
title: '',
content: '',
cron: '',
url: '',
id: generateBizUniqueID('C'),
},
sysKeptTaskIds: [CONSTANT.LOG_TASK_ID],
});
watch(pageState.ShowDialogData, (newValue, oldValue) => {
if (newValue[props.componentName]) {
state.isShow = pageState.ShowDialogData[props.componentName].isShow;
resetPageInitData();
}
});
const handleCancer = () => {
if (pageState.ShowDialogData[props.componentName]) {
pageState.ShowDialogData[props.componentName].isShow = false;
}
}
// 页面每次弹出,重置数据
const resetPageInitData = () => {
state.insTableData = [];
state.currInsInputContentType = 'text';
state.currInsInput = {};
state.currTaskTmp = {};
state.searchway_id = '';
state.currSearchInputText = '';
state.isShowAddBox = false;
state.currTaskInput = {
name: '',
id: generateBizUniqueID('C'),
}
}
const cliclSendNow = () => {
console.log('cliclSendNow');
}
// 匹配出当前搜索的消息数据
const matchSearchData = (way_name) => {
let result = {};
state.currSearchWaysData.forEach(element => {
if (element.name == way_name) {
result = element;
}
});
return result;
}
const handleSearchSelect = async () => {
let currTask = matchSearchData(state.currSearchInputText)
state.isShowAddBox = Boolean(currTask);
if (currTask) {
state.currTaskTmp = currTask;
}
}
const querySearchWayAsync = async (query, cb) => {
let params = { name: query };
const rsp = await request.get('/sendtasks/list', { params: params });
let tableData = await rsp.data.data.lists;
tableData = filtersysKeptTask(tableData);
cb(tableData);
state.currSearchWaysData = tableData;
}
const filtersysKeptTask = (data) => {
let result = data.filter(item => !state.sysKeptTaskIds.includes(item.id));
return result;
}
const getFinalData = () => {
state.currTaskInput.task_id = state.currTaskTmp.id;
return state.currTaskInput
}
const handleSubmit = async () => {
let postData = getFinalData();
const rsp = await request.post('/cronmessages/addone', postData);
if (await rsp.data.code == 200) {
ElMessage({ message: await rsp.data.msg, type: 'success' });
handleCancer();
window.location.reload();
}
}
return {
...toRefs(state), handleCancer, handleSubmit, querySearchWayAsync,
handleSearchSelect, CONSTANT, CommonUtils, parseCron,
cliclSendNow
};
},
});
</script>
<style scoped>
:deep(.el-autocomplete) {
width: 100%;
}
.msg-input {
/* width: 200px; */
margin: 5px 10px 5px 0;
}
.add-top {
margin-bottom: 20px;
margin-top: -20px;
}
.display-label {
margin-top: 10px;
margin-bottom: 10px;
}
</style>