<!-- 任务列表 - 数据任务 && 数据补遗 编辑界面 --> <template> <div id="dailyWindow"> <h2 class="text-center sectionH2"> <span class="pull-left" @click="gohistory"> < 返回 </span> {{ modelH }} </h2> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm" > <el-row class="basicB"> <p class="formJcDoc">基本信息</p> <el-col :span="15" class="m-t-20 p-l-22"> <el-form-item label="任务名称:" prop="taskName"> <el-input v-model="ruleForm.taskName" placeholder="请输入任务名称" ></el-input> </el-form-item> </el-col> <el-col :span="15" class="p-l-22"> <el-form-item label="任务描述:" style="margin:5px 0 17px 0"> <el-input type="textarea" v-model="ruleForm.taskDetail" placeholder="请输入任务描述" ></el-input> </el-form-item> </el-col> </el-row> <!-- 连接 --> <el-row class="basicB m-t-24"> <p class="formJcDoc">连接</p> <el-col :span="7" class="m-t-20 p-l-22"> <el-form-item label="连接:" prop="taskParams.dataBase"> <el-select @change="dataSourceChange" v-model="ruleForm.taskParams.dataBase" placeholder="请选择连接" > <el-option v-for="(item, index) in datasSources" :key="index" :label="item.value" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="7" class="m-t-20 p-l-22"> <el-form-item label="数据表:" prop="taskParams.tableName"> <el-autocomplete @select="dataSourceTable" class="inline-input w130" v-model="ruleForm.taskParams.tableName" :fetch-suggestions="querySearch" placeholder="请选择数据表" > </el-autocomplete> </el-form-item> </el-col> <el-col :span="1" class="text-right m-t-30"> <div class="aboutType"> <el-tooltip class="item" effect="dark" content="数据处理任务将直接更新表中的数据" placement="top-start" > <span><i class="iconfont icon-49"></i></span> </el-tooltip> </div> </el-col> <el-col :span="15" class="p-l-22"> <el-form-item label="过滤条件:"> <el-input type="textarea" v-model="ruleForm.taskParams.queryConditions" placeholder="请输入过滤条件" > </el-input> <div class="aboutType"> <span ><i class="iconfont icon-49"></i >SQL过滤条件,对站点进行过滤</span > <!-- <el-button @click.native='detectionTest' type='primary' size="mini" class='dataSourceTest'>连接测试</el-button> --> </div> <div :class="{ 'el-form-itemSuccess': sourceStatus, 'el-form-item__error': !sourceStatus }" v-show="sourceErrorStatus" > {{ sourceError }} </div> </el-form-item> </el-col> </el-row> <!-- 数据处理 --> <el-row class="basicB m-t-24"> <p class="formJcDoc">数据处理</p> <!-- 数据自动检测和阈值检测 --> <el-form-item v-if="!addendum" style="margin-left:-120px;"> <el-col :span="14" class="p-l-22 m-t-20" style="height:28px;"> <el-form-item label="检测方式:" prop="taskParams.detectionType"> <el-select @change="detectionTypeChange" v-model="ruleForm.taskParams.detectionType" placeholder=" 阈值检测" > <el-option v-for="(item, index) in testJC" :key="index" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="1" class="text-right m-t-10" style="display: inline-block; transform: translatey(10px);" > <div class="aboutType "> <el-tooltip class="item" effect="dark" content="阈值检测是需要指定异常值的范围,阈值检测将使用随机值替换异常值;自动检测只需要指定检测字段,由系统自动根据算法检测异常值,将使用预测值替换异常值" placement="top-start" > <span><i class="iconfont icon-49"></i> </span> </el-tooltip> </div> </el-col> </el-form-item> <!-- 补遗数据 --> <el-row class="p-l-22 m-t-24"> <el-col :span="15" v-if="addendum"> <el-form-item label="主键字段:" prop="taskParams.primaryKey"> <el-select v-model="ruleForm.taskParams.primaryKey" placeholder="请选择主键字段" > <el-option v-for="(item, index) in sourcesKeysField" :key="item + 666" :label="item" :value="item" > </el-option> </el-select> </el-form-item> </el-col> </el-row> <!-- 数据处理之 阈值检测和自动检测 --> <el-row class="p-l-22"> <el-col :span="15"> <el-form-item label="标识字段:" prop="taskParams.markField"> <el-select v-model="ruleForm.taskParams.markField" placeholder="请选择标识字段" > <el-option v-for="(item, index) in sourcesField" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> </el-row> <el-row class="p-l-22"> <el-col :span="7"> <el-form-item label="时间字段:" prop="taskParams.tt"> <el-select v-model="ruleForm.taskParams.tt" placeholder="请选择时间字段" > <el-option v-for="(item, index) in sourcesField" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="7" class="p-l-22"> <el-form-item :label="timeDataText + ':'" prop="taskParams.interval" > <el-input type="number" v-model.number="ruleForm.taskParams.interval" :placeholder="'请输入' + timeDataText" > </el-input> </el-form-item> </el-col> <el-col :span="1" class="text-right"> <div class="aboutType m-t-10"> <el-tooltip class="item" effect="dark" :content="'时间序列需要指定时间字段,以及' + timeDataText" placement="top-start" > <span><i class="iconfont icon-49"></i> </span> </el-tooltip> </div> </el-col> <el-col :span="14"> <el-form-item label="补遗时间:" prop="taskParams.timeArray"> <el-date-picker :editable="false" v-model="ruleForm.taskParams.timeArray" type="datetimerange" range-separator=" ~ " start-placeholder="开始日期" end-placeholder="结束日期" > </el-date-picker> </el-form-item> </el-col> <el-col :span="1" class="text-right"> <div class="aboutType m-t-10"> <el-tooltip class="item" effect="dark" content="补遗时间指定了数据异常检测和补遗的时间段" placement="top-start" > <span><i class="iconfont icon-49"></i> </span> </el-tooltip> </div> </el-col> </el-row> <!-- 数据补遗表单 --> <div v-if="addendum"> <el-row v-for="(items, indexs) in ruleForm.taskParams.addendum" :key="indexs + 99" class="p-l-22" > <el-col :span="7"> <el-form-item label="补遗字段:" prop="taskParams.addendum[0].factor" > <el-select v-model="items.factor" placeholder="请选择补遗字段"> <el-option v-for="(item, index) in sourcesField" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="7" class="p-l-22"> <el-form-item label="补遗值:" prop="taskParams.addendum[0].value" > <el-input type="number" v-model.number="items.value" placeholder="请输入补遗值" ></el-input> </el-form-item> </el-col> <el-col :span="1" class="addendumNames text-right"> <i @click="deleteAutoIcons('addendum', indexs)" class="iconfont icon-qiyong deleteIcon" ></i> </el-col> </el-row> <div class="aboutType conditiona"> <span @click="addendumAdd" ><i class="iconfont icon-jia"></i> 添加补遗字段</span > </div> </div> <div v-if="!addendum"> <!-- 阈值检测 --> <el-row v-show="threshold" v-for="(items, indexs) in ruleForm.taskParams.mapList" :key="indexs" class="p-l-22" > <el-col :span="7"> <el-form-item label="检测字段:"> <el-select v-model="items.factor" placeholder="请选择检测字段"> <el-option v-for="(item, index) in sourcesField" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="7" class="yzFlex l-h-40"> <span class="fzs addendumNames" style="margin-top:0" >取值范围</span > <el-input type="number" v-model.number="items.minVal" placeholder="下限值" ></el-input> <span style="padding:0 10px;" class="addendumNames"> ~ </span> <el-input type="number" v-model.number="items.maxVal" placeholder="上限值" ></el-input> </el-col> <el-col :span="1" class="addendumNames text-right"> <i @click="deleteAutoIcons('mapList', indexs)" class="iconfont icon-qiyong deleteIcon" ></i> </el-col> </el-row> <!-- 自动检测 --> <div v-show="automatic" v-for="(items, indexs) in ruleForm.taskParams.autoMapList" :key="indexs + 299" > <el-row class="p-l-22"> <el-col :span="7"> <el-form-item label="检测字段:"> <el-select v-model="items.factor" placeholder="请选择检测字段" > <el-option v-for="(item, index) in sourcesField" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="7" class="p-l-22"> <el-form-item label="关联字段:" class="multiSelected"> <el-select v-model="items.multiples" multiple placeholder="请选择关联字段" > <el-option v-for="item in sourcesField" :key="item.value + 1" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="1" class="addendumNames text-right"> <i @click="deleteAutoIcons('autoMapList', indexs)" class="iconfont icon-qiyong deleteIcon" ></i> </el-col> </el-row> </div> <!-- 条件检测 --> <div v-show="condition"> <el-row class="p-l-22"> <el-col :span="14"> <el-form-item label="异常条件:"> <el-input v-model="ruleForm.taskParams.abnormalCondition" placeholder="请输入异常条件" ></el-input> </el-form-item> </el-col> <el-col :span="1" class="text-right"> <div class="aboutType m-t-10"> <el-tooltip class="item" effect="dark" content="异常条件指定了异常数据的判定条件" placement="top-start" > <span><i class="iconfont icon-49"></i> </span> </el-tooltip> </div> </el-col> </el-row> </div> <!-- 条件检测 --> <div v-show="condition" v-for="(items, indexs) in ruleForm.taskParams.conditionList" :key="indexs + 399" > <el-row class="p-l-22"> <el-col :span="7"> <el-form-item label="更新字段:"> <el-select v-model="items.updateField" placeholder="请选择更新字段" > <el-option v-for="(item, index) in sourcesField" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="7" class="p-l-22"> <el-form-item label="更新值:" class="multiSelected"> <el-input v-model="items.updateValue" placeholder="请输入更新值" ></el-input> </el-form-item> </el-col> <el-col :span="1" class="addendumNames text-right"> <i @click="deleteAutoIcons('conditionList', indexs)" class="iconfont icon-qiyong deleteIcon" ></i> </el-col> </el-row> </div> <!-- 阈值检测 --> <div class="aboutType conditiona" v-show="threshold"> <span @click="filterCondition" ><i class="iconfont icon-jia"></i> 添加检测字段</span > </div> <!-- 自动检测 --> <div class="aboutType conditiona" v-show="automatic"> <span @click="filterAutoCondition" ><i class="iconfont icon-jia"></i> 添加自动检测字段</span > </div> <!-- 条件检测 --> <div class="aboutType conditiona" v-show="condition"> <span @click="conditionAdd" ><i class="iconfont icon-jia"></i> 添加检测字段</span > </div> </div> <!-- 备份数据库 --> <el-row class="p-l-22"> <el-col :span="15"> <el-form-item label="更新策略:" prop="taskParams.updateStatus"> <el-select v-model="ruleForm.taskParams.updateStatus" placeholder="请选择" @change="isUpdateS" > <el-option v-for="item in updateStatu" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> </el-row> <el-row v-if="bgcData" class="p-l-22"> <el-col :span="7"> <el-form-item label="数据源:" prop="taskParams.backupDatabase"> <el-select @change="dataSourceChangeDatabase" v-model="ruleForm.taskParams.backupDatabase" placeholder="请选择数据源" > <el-option v-for="(item, index) in datasSources" :key="index" :label="item.value" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="8" class="p-l-22"> <el-form-item label="数据表:" prop="taskParams.backupTableName"> <el-autocomplete class="inline-input w130" v-model="ruleForm.taskParams.backupTableName" :fetch-suggestions="querySearchs" placeholder="请选择数据表" > </el-autocomplete> </el-form-item> </el-col> </el-row> <!-- 消息队列 --> <div class="p-l-22" v-if="bgcData"> <el-row> <el-col :span="15"> <el-form-item label="写入队列:" prop="taskParams.writeQueue"> <el-select v-model="ruleForm.taskParams.writeQueue" placeholder="请选择" @change="writeQueChange" > <el-option v-for="item in writeQueueDatas" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> </el-row> <el-row v-if="writeQue"> <el-col :span="7"> <el-form-item label="消息连接:"> <el-select @change="sqlSourceShow" v-model="ruleForm.taskParams.queueDataSource" placeholder="请选择消息连接" > <el-option v-for="(item, index) in addSourceMap" :key="index" :label="item.value" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="8" class="p-l-22"> <el-form-item label="队列名称:"> <el-select class="inline-input w130" v-model="ruleForm.taskParams.queueName" placeholder="请选择队列名称" > <el-option v-for="(item, index) in addSourceValue1" :key="index" :label="item.value" :value="item.value" > </el-option> </el-select> </el-form-item> </el-col> </el-row> </div> </el-row> <!-- 调度配置 --> <el-row class="basicB m-t-24"> <p class="formJcDoc">调度配置</p> <el-form-item label="周期类型:" class="p-l-22 m-t-20"> <el-radio-group @change="executeChange" v-model="ruleForm.isTemp"> <el-radio label="Y">临时任务</el-radio> <el-radio label="N">周期任务</el-radio> </el-radio-group> </el-form-item> <el-row v-if="cronExpree" class="p-l-22"> <el-col :span="15"> <el-form-item label="cron表达式选项:" prop="cronExpression"> <el-input v-model="ruleForm.cronExpression" placeholder="请输入cron表达式" ></el-input> <div class="aboutType"> <span :class="{ 'el-form-itemSuccess': cronStatus, 'el-form-item__error': !cronStatus }" v-show="cronErrorStatus" > {{ cronError }} </span> <el-button type="primary" size="mini" class="dataSourceTest" @click="cronTest" >cron表达式测试</el-button > </div> </el-form-item> </el-col> </el-row> <div class="text-left p-l-22 m-b-20"> <el-button type="primary" v-show="editAdd" @click="submitForm('ruleForm', 1)" >添 加</el-button > <el-button type="primary" v-show="!editAdd" @click="submitForm('ruleForm', 2)" >修 改</el-button > <el-button @click="gohistory">取 消</el-button> </div> </el-row> </el-form> </div> </template> <script> import project from "../../mixins/project"; var moment = require("moment"); import { notify } from "../../util/item"; import devisor from "../../util/devisor"; export default { name: "dailyModel", data() { return { modelHead: ["添加任务信息", "修改任务信息", "任务信息数据补遗"], modelH: "", dataSelect: false, testJC: [ { value: 1, label: "阈值检测", enName: "thresholdDetectionService" }, { value: 2, label: "自动检测", enName: "automaticDetectionService" }, { value: 3, label: "条件检测", enName: "conditionDetectionService" } ], updateStatu: [ { value: 0, label: "更新源表" }, { value: 1, label: "插入新表" } ], writeQueueDatas: [ { value: 0, label: "否" }, { value: 1, label: "是" } ], sourcesField: [], addSourceValue1: [], addSourceMap: [], sourcesKeysField: [], dailyFlage: false, addendum: false, bgcData: false, writeQue: false, timeDataText: "", sourceErrorStatus: false, //连接错误信息展示 cronErrorStatus: false, //连接错误信息展示 sourceError: "", //连接类型状态 cronError: "", //cron类型信息 sourceStatus: false, //连接是否测试通过 cronStatus: false, //cron表达式是否测试通过 threshold: true, //阈值检测 automatic: false, //自动检测 condition: false, //条件检测 cronExpree: false, datasSources: [], datasSourceTypes: [], datasSourceTypesData: [], ruleForm: { taskType: "", //任务类型 taskDetail: "", //任务名称 taskName: "", //任务名称 taskParams: { timeArray: "", //时间字段 dataBase: "", //连接 tableName: "", // 表名 primaryKey: "", // 主键字段 tt: "", // 时间字段 markField: "", // 标识字段 time: "", // 补遗时间 interval: "", // 数据间隔 detectionType: 1, //检测方式(阈值1 自动检测2) detectionTypeService: "", //检测方式(名称) mapList: [ { factor: "", //检测字段 minVal: "", //小于阈值 maxVal: "" //大于阈值 } ], addendum: [ { factor: "", //补遗字段 value: "" //补遗值 } ], //补遗字段 autoMapList: [ { factor: "", //检测字段 multiples: [] //检测字段 } ], abnormalCondition: "", //异常条件 conditionList: [ { updateField: "", //更新字段 updateValue: "" //更新值 } ], queryConditions: "", //过滤条件 updateStatus: 0, //是否处理更新策略 backupDatabase: "", //备份数据库 backupTableName: "", //备份数据表 writeQueue: 0, //选择消息队列 queueDataSource: "", //队列连接 queueName: "" //队列名称 }, cronExpression: "", //cron表达式 isTemp: "Y" //cron表达式类型 }, rules: { taskName: [ { required: true, message: "请输入任务名称", trigger: "blur" } ], taskParams: { tableName: [ { required: true, message: "请选择数据表", trigger: "change" } ], backupDatabase: [ { required: true, message: "请选择备份数据表", trigger: "change" } ], updateStatus: [ { required: true, message: "请选择更新策略", trigger: "change" } ], writeQueue: [ { required: true, message: "请选择消息队列", trigger: "change" } ], backupTableName: [ { required: true, message: "请选择备份连接", trigger: "change" } ], timeArray: [ { required: true, message: "请选择补遗时间", trigger: "change" } ], queryConditions: [ { required: true, message: "请输入过滤条件", trigger: "blur" } ], dataBase: [ { required: true, message: "请选择连接", trigger: "change" } ], primaryKey: [ { required: true, message: "请选择主键", trigger: "change" } ], tt: [ { required: true, message: "请选择时间字段", trigger: "change" } ], markField: [ { required: true, message: "请选择标识字段", trigger: "change" } ], interval: [ { required: true, message: "请选择数据间隔", trigger: "change" } ], addendum: [ { value: [ { required: true, message: "请输入补遗字段", trigger: "blur" } ], factor: [ { required: true, message: "请选择数据间隔", trigger: "change" } ] } ], //检测方式(阈值1 自动检测2) mapList: [ { factor: [ { required: true, message: "请选择检测字段", trigger: "change" } ], //检测字段 minVal: [ { required: true, message: "请输入小于阈值", trigger: "blur" } ], //小于阈值 maxVal: [ { required: true, message: "请输入大于阈值", trigger: "blur" } ] //大于阈值 } ], autoMapList: [ { factor: [ { required: true, message: "请选择检测字段", trigger: "change" } ], //检测字段 multiples: [ { required: true, message: "请选择关联字段", trigger: "change" } ] //检测字段 } ], detectionType: [ { required: true, message: "请选择检测方式", trigger: "change" } ] }, cronExpression: [ { required: true, message: "请选择cron表达式执行周期", trigger: "change" } ], taskType: [ { required: true, message: "请选择任务类型", trigger: "change" } ] }, dialogVisible: false, loading: false, dailyParams: {}, center: true, editAdd: true, scrollLock: false, closeOnClick: false, deleteList: [], ruleFormEdit: { taskType: "", //任务类型 taskDetail: "", //任务名称 taskName: "", //任务名称 disable: false, taskParams: { timeArray: "", //时间字段 dataBase: "", //连接 tableName: "", // 表名 primaryKey: "", // 主键字段 tt: "", // 时间字段 time: "", // 补遗时间 interval: "", // 数据间隔 detectionType: 1, //检测方式(阈值1 自动检测2) detectionTypeService: "", //检测方式(名称) mapList: [ { factor: "", //检测字段 minVal: "", //小于阈值 maxVal: "" //大于阈值 } ], addendum: [ { factor: "", //补遗字段 value: "" //补遗值 } ], //补遗字段 autoMapList: [ { factor: "", //检测字段 multiples: [] //检测字段 } ], abnormalCondition: "", //异常条件 conditionList: [ { updateField: "", //更新字段 updateValue: "" //更新值 } ], queryConditions: "", //过滤条件 updateStatus: 0, //是否处理到备份数据库 backupDatabase: "", //备份数据库 backupTableName: "", //备份数据表 writeQueue: 0, //选择消息队列 queueDataSource: "", //队列连接 queueName: "" //队列名称 }, cronExpression: "", //cron表达式 isTemp: "Y" //cron表达式类型 } //修改数据 }; }, mixins: [project], mounted() { this.dataSourceChanges(); this.dataSourceChangesRabbitMq(); this.startInit(this.$route.query.headTitle); }, methods: { startInit(headTitle = 0) { // 初始化进入页面,进行刷新 this.timeDataText = "时间间隔"; this.ruleForm.taskType = this.$route.query.taskType; if (headTitle === "1") { // 数据修改 this.handleEdit(this.$route.query.taskId); } else if (headTitle === "0") { // 数据新增 this.editAdd = true; // this.clearFormVal(); this.addendum = false; } else if (headTitle === "2") { // 数据补遗 this.ruleForm.taskParams.detectionType = 0; this.ruleForm.taskParams.detectionTypeService = "dataAddendumService"; this.editAdd = true; this.addendum = true; this.timeDataText = "数据间隔"; } // 添加数据类型 this.modelH = this.modelHead[headTitle]; }, gohistory() { // 返回上一页 this.$router.push({ path: "/quality/dataProcess/scheduledTasks" }); }, detectionTypeChange(val) { // 自动检测和阈值检测窗口数值变化 switch (val) { case 1: // 阈值检测 this.threshold = true; this.condition = false; this.automatic = false; break; case 2: // 自动检测 this.threshold = false; this.condition = false; this.automatic = true; break; default: // 条件检测 this.threshold = false; this.condition = true; this.automatic = false; break; } }, isUpdateS(val = 0) { // 是否备份数据到数据库 this.ruleForm.taskParams.updateStatus = val; if (val === 0) { this.bgcData = false; } else { this.bgcData = true; } }, writeQueChange(val) { // 是否写入队列 if (val === 0) { this.writeQue = false; } else { this.writeQue = true; } }, querySearch(queryString, cb) { var restaurants = this.datasSourceTypes; var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants; // 调用 callback 返回建议列表的数据 if (results.length !== 0) { for (let item of results.values()) { item["value"] = item["value"]; } } cb(results); }, querySearchs(queryString, cb) { // 备份数据库内容 var restaurants = this.datasSourceTypesData; var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants; // 调用 callback 返回建议列表的数据 if (results.length !== 0) { for (let item of results.values()) { item["value"] = item["value"]; } } cb(results); }, createFilter(queryString) { return restaurant => { return restaurant.value.indexOf(queryString) !== -1; }; }, async cronTest() { // cron表达式检测 const datas = await this.getHttpDatas(this.nozzle.checkCron, { cronStr: this.ruleForm.cronExpression }); if (datas === true) { this.cronStatus = true; this.cronError = "cron表达式测试成功"; } else { this.cronError = "操作失败"; this.cronStatus = false; } this.cronErrorStatus = true; }, async detectionTest() { // 连接测试 const datas = await this.getHttpDatas( this.nozzle.testConnectionFilterCondition, { dataSourceName: this.ruleForm.taskParams.dataBase, tableName: this.ruleForm.taskParams.tableName, sqlCondition: this.ruleForm.taskParams.queryConditions } ); // 连接是否测试通过 if (datas === true) { this.sourceError = "连接测试成功"; this.sourceStatus = true; } else { this.sourceError = datas; this.sourceStatus = false; } this.sourceErrorStatus = true; }, filterCondition() { /** * 添加检测字段,修改时刻,渲染并进行赋值 */ this.ruleForm.taskParams.mapList.push({ factor: "", minVal: "", maxVal: "" }); }, addendumAdd() { /** * 添加检测字段,修改时刻,渲染并进行赋值 */ this.ruleForm.taskParams.addendum.push({ factor: "", value: "" }); }, conditionAdd() { /** * 添加条件检测字段,修改时刻,渲染并进行赋值 */ this.ruleForm.taskParams.conditionList.push({ updateField: "", updateValue: "" }); }, filterAutoCondition() { /** * 添加自动检测字段,修改时刻,渲染并进行赋值 */ this.ruleForm.taskParams.autoMapList.push({ factor: "", multiples: [] //检测字段 }); }, deleteAutoIcons(fieldName, index) { // 删除字段 this.ruleForm.taskParams[fieldName].splice(index, 1); }, async dataSourceChanges() { // 连接列表渲染 let datas = await this.getHttpDatas(this.nozzle.queryDataSrouceName, { dbType: "Relational" }); let dataBase = []; for (let item of datas.values()) { dataBase.push({ value: item }); } this.datasSources = dataBase; }, async dataSourceChange(val) { // 数据表内容获取以及填充 this.ruleForm["taskParams"]["tableName"] = ""; if (this.ruleForm["taskParams"]["detectionType"] == 1) { let mapList = this.ruleForm["taskParams"]["mapList"]; if (mapList.length !== 0) { for (let item of mapList.values()) { item["factor"] = ""; } } } else { this.ruleForm["taskParams"]["factor"] = ""; } let datas = await this.getHttpDatas( this.nozzle.getAllTableNameByDateSourceName, { dataSourceName: val, pageSize: 999999, pageNo: 1 } ); let dataBase = []; for (let item of datas.list.values()) { dataBase.push({ value: item }); } this.datasSourceTypes = dataBase; }, async dataSourceTable( val, dataBase = this.ruleForm.taskParams.dataBase, dif = 1 ) { // 数据表内容变化发生改变 if (typeof val === "object") { val = val["value"]; } this.sourceFieldChange(dataBase, val, dif); // 清空字段名 this.ruleForm.taskParams.tt = ""; this.ruleForm.taskParams.markField = ""; }, async dataSourceChangeDatabase(val) { // 备份数据表 this.ruleForm["taskParams"]["backupTableName"] = ""; let datas = await this.getHttpDatas( this.nozzle.getAllTableNameByDateSourceName, { dataSourceName: val, pageSize: 999999, pageNo: 1 } ); let dataBase = []; for (let item of datas.list.values()) { dataBase.push({ value: item }); } this.datasSourceTypesData = dataBase; }, async sourceFieldChange(dataSourceName, tableName, dif = 1) { // 检测字段填充 // 下拉框改变状态,则进行数据清空 if (dif === 1) { this.multiples = []; this.ruleForm["taskParams"]["factor"] = ""; let mapList = this.ruleForm["taskParams"]["mapList"]; if (mapList.length !== 0) { for (let item of mapList.values()) { item["factor"] = ""; } } } const datas = await this.getHttpDatas( this.nozzle.getDataStructureByTableName, { dataSourceName: dataSourceName, tableName: tableName } ); if (datas["list"].length !== 0) { let newDatas = []; for (let item of datas["list"].values()) { newDatas.push({ value: item["columnName"], label: devisor[item["columnName"].toLowerCase()] }); } this.sourcesField = newDatas; this.sourcesKeysField = this.enOrChin(datas["primaryKeys"]); } else { this.sourcesField = []; this.sourcesKeysField = []; } }, enOrChin(datas = []) { // 英文转换成中文 if (datas.length !== 0) { let newDevisor = []; for (const item of datas.values()) { newDevisor.push({ label: devisor[item.toLowerCase()], value: item }); } return newDevisor; } }, executeChange(value) { /** * 时间执行方法 */ if (value === "N") { // 周期任务 this.cronExpree = true; } else { // 临时任务 this.ruleForm.cronExpression = ""; this.cronExpree = false; } }, typeQf(datas) { // 数据处理类型区分 if (datas["taskParams"]["detectionType"] === 2) { // 自动检测 datas["taskParams"]["mapList"] = []; datas["taskParams"]["conditionList"] = []; } else if (datas["taskParams"]["detectionType"] === 1) { // 阈值检测 datas["taskParams"]["autoMapList"] = []; datas["taskParams"]["conditionList"] = []; } else if (datas["taskParams"]["detectionType"] === 3) { // 条件检测 datas["taskParams"]["autoMapList"] = []; datas["taskParams"]["mapList"] = []; } else { // 数据补遗 datas["taskParams"]["mapList"] = []; } }, addParameter(api) { // 新增数据传值 let datas = Object.assign({}, this.ruleForm); // 清除其他检测方案数据 this.typeQf(datas); datas["taskParams"]["time"] = moment(datas["taskParams"]["timeArray"][0]).format( "YYYY-MM-DD HH:mm:ss" ) + " ~ " + moment(datas["taskParams"]["timeArray"][1]).format( "YYYY-MM-DD HH:mm:ss" ); if (datas["taskParams"]["detectionType"] !== 0) { // 除去数据补遗参数,填写英文名称 datas["taskParams"]["detectionTypeService"] = this.testJC[ datas["taskParams"]["detectionType"] - 1 ]["enName"]; } datas["taskParams"] = JSON.stringify(datas["taskParams"]); // 新增数据传值 this.$http.post(api, datas).then(response => { notify(response); this.$emit("getLists"); this.$router.push({ path: "/quality/dataProcess/scheduledTasks" }); }); }, async editParameter(api) { // 修改数据传值 let datas = Object.assign({}, this.ruleForm); this.typeQf(datas); datas["taskId"] = this.ruleFormEdit["taskId"]; datas["taskParams"]["time"] = moment(datas["taskParams"]["timeArray"][0]).format( "YYYY-MM-DD HH:mm:ss" ) + " ~ " + moment(datas["taskParams"]["timeArray"][1]).format( "YYYY-MM-DD HH:mm:ss" ); if (datas["taskParams"]["detectionType"] !== 0) { // 除去数据补遗参数,填写英文名称 datas["taskParams"]["detectionTypeService"] = this.testJC[ datas["taskParams"]["detectionType"] - 1 ]["enName"]; } datas["taskParams"] = typeof datas["taskParams"] === "string" ? datas["taskParams"] : JSON.stringify(datas["taskParams"]); const response = await this.$http.put(api, datas); this.$emit("getLists"); this.$router.push({ path: "/quality/dataProcess/scheduledTasks" }); }, submitForm(formName, dif) { // 添加数据,修改数据传值 let api = ""; this.$refs[formName].validate(valid => { if (valid) { // 选择站点编号 // 连接和cron表达式那个数据 // if (!this.sourceStatus) { // this.$notify({ // type: "warning", // message: '连接需要测试通过才可进行数据处理' // }) // return // } // if (!this.cronStatus && this.ruleForm.isTemp === 'N') { // this.$notify({ // type: "warning", // message: 'cron表达式需要测试才可进行数据处理' // }) // return // } // 增加数据和修改数据处理 if (dif === 1) { api = this.nozzle.taskAdd; this.addParameter(api); } else { api = this.nozzle.taskEdit; this.editParameter(api); } } else { console.log("error submit!!"); return false; } }); }, resetClear(item, keys) { // 递归清空复杂数据类型的值 for (let items of Object.keys(this.ruleForm[item])) { if (items === keys) { this.ruleForm[item][items] = []; } else { this.ruleForm[item][items] = ""; } } }, clearFormVal() { this.ruleForm["isTemp"] = "Y"; this.ruleForm["taskParams"]["detectionType"] = 1; // 状态 this.executeChange("Y"); // 默认阈值检测 this.detectionTypeChange(1); }, modelAdd() { // 添加数据按钮 this.dataSelect = true; }, traversalEdit(data) { // 通过修改数据进行遍历,填充修改数据窗口 /** * @param {Object} data 表内连接,单行数据 * @param {String} dif 连接请求 */ // 启用,禁用,执行数据启动 this.dataSourceChange(data["taskParam"]["dataBase"]); this.dataSourceChangeDatabase(data["taskParam"]["dataBase"]); // 获取调度配置 this.executeChange(data["isTemp"]); // 获取检测字段 this.dataSourceTable( data["taskParam"]["tableName"], data["taskParam"]["dataBase"], 2 ); this.detectionTypeChange(data["taskParam"]["detectionType"]); let { keys } = Object; for (let items of keys(this.ruleForm)) { if (items === "taskParams") { // 数据表和检测字段获取 this.ruleForm["taskParams"] = data["taskParam"]; } else { this.ruleForm[items] = data[items]; } } this.ruleForm["disabled"] = data["disabled"]; // 数据补遗修改 if (this.ruleForm.taskParams.detectionType === 0) { this.addendum = true; this.timeDataText = "数据间隔"; } this.isUpdateS(data["taskParam"]["updateStatus"]); this.writeQueChange(data["taskParam"]["writeQueue"]); }, async editFill(taskId) { // 修改窗口数据填充 const datas = await this.getHttpDatas(this.nozzle.queryTaskByTaskId, { taskId: taskId }); this.traversalEdit(datas); // 使用申明修改对象接收当前修改的参数值 this.ruleFormEdit = Object.assign({}, this.ruleForm); this.ruleFormEdit["taskId"] = datas["taskId"]; }, handleEdit(taskId) { // 行内点击修改 this.editAdd = false; // 修改状态提示标签 this.cronErrorStatus = false; this.sourceErrorStatus = false; this.sourceStatus = false; this.cronStatus = false; this.editFill(taskId); }, deleteUserLise(ids) { // 删除用户 let datas = { params: { taskIds: ids } }; this.asyncDelete(datas, this.nozzle.taskDelete); }, async dataSourceChangesRabbitMq(dif, dis) { /** * 消息队列渲染 */ let dbTypeName = "rabbitMq"; let datas = await this.getHttpDatas(this.nozzle.queryDataSrouceName, { dbType: dbTypeName }); let dataBase = []; for (let item of datas.values()) { dataBase.push({ value: item }); } this.addSourceMap = dataBase; }, async sqlSourceShow(val) { // 连接改变,获取队列名称 let nowApi = ""; // 消息队列 nowApi = this.nozzle.getQueues; let datas = await this.getHttpDatas(nowApi, { dataSourceName: val, pageSize: 999999, pageNo: 1 }); let dataBase = []; for (let item of datas.values()) { dataBase.push({ value: item }); } this.addSourceValue1 = dataBase; } } }; </script> <style scoped> #dailyWindow .el-date-editor .el-range__icon, .el-date-editor .el-range-separator { line-height: 23px; } #dailyWindow .fzs { display: inline-block; width: 330px; text-align: right; padding-right: 10px; } #dailyWindow .w60 { width: 60%; } #dailyWindow .datainterval { width: 26%; } #dailyWindow .yzFlex { display: flex; justify-content: space-around; } #dailyWindow .dataSourceTest { float: right; margin-top: 5px; } #dailyWindow .conditiona { padding: 0px 0 10px 141px; } #dailyWindow .addendumNames { line-height: 40px; color: var(--digtext) !important; } #dailyWindow .el-autocomplete { width: 100%; } #dailyWindow .icon-qiyong:before { color: red; cursor: pointer; } #dailyWindow .el-form-itemSuccess { color: #63e06e; font-size: 12px; line-height: 1; padding-top: 4px; position: absolute; top: 100%; left: 0; } #dailyWindow .pull-left { float: left; color: #1890ff !important; font-size: 14px; line-height: 23px; cursor: pointer; } #dailyWindow .sectionH2 { font-size: 16px; color: #000; padding-bottom: 12px; } /* #dailyWindow .basicB { box-shadow: 2px 2px 9px 0px #ccc; background-color: #fff; } */ #dailyWindow .el-form-item { margin-bottom: 12px; } </style>