|
@@ -0,0 +1,813 @@
|
|
|
+/**
|
|
|
+@author:fugy
|
|
|
+@date:2018.09.18
|
|
|
+@info:项目报警条目添加与编辑
|
|
|
+ */
|
|
|
+<template>
|
|
|
+<div class="edit-box">
|
|
|
+ <h5 class="title">添加报警条目</h5>
|
|
|
+ <div class="form-box">
|
|
|
+ <el-form
|
|
|
+ label-width="150px"
|
|
|
+ :model="formValue"
|
|
|
+ :rules="rules"
|
|
|
+ ref="ruleForm">
|
|
|
+ <el-form-item label="适用对象类" prop="objTypeRules">
|
|
|
+ <span class="infoStar">*</span>
|
|
|
+ <v-obj-type ref="objType" :objType="objTypeComValue" :disabled='true' width='400px'></v-obj-type>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警条目编码" prop="code">
|
|
|
+ <el-input
|
|
|
+ placeholder="请输入不超过10位的数字"
|
|
|
+ v-model="formValue.code"
|
|
|
+ clearable>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警条目名称" prop="name">
|
|
|
+ <el-input
|
|
|
+ placeholder="名称不超过30个字"
|
|
|
+ v-model="formValue.name"
|
|
|
+ clearable>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警分类">
|
|
|
+ <v-alarm-class
|
|
|
+ ref="alarm-class"
|
|
|
+ :isAddBtn='true'
|
|
|
+ :options='alarmClassArr'
|
|
|
+ :value='alarmClassValue'
|
|
|
+ @change="alarmClassChange"
|
|
|
+ @add='alarmClassAdd'
|
|
|
+ ></v-alarm-class>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="严重程度" prop="level">
|
|
|
+ <el-select v-model="formValue.level" clearable placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in levelSelectArr"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <div class="level_describe">
|
|
|
+ <p>S 严重故障:会导致停机、设备损坏等问题的严重故障;计入设备、系统故障时间统计;</p>
|
|
|
+ <p>A 故障 :会导致运行故障,但不会引起严重的系统问题,影响范围有限。例如单个污水坑报警;计入设备、系统故障时间统计;</p>
|
|
|
+ <p>B 一般问题: 不会导致停机, 但对安全运行会造成风险的一般报警, 例如房间温度过高, 传感器不正常等; 不计入故障时间统计;</p>
|
|
|
+ <p>C 预警: 提前预判故障或问题, 发出警告, 例如算范判断的管道脏堵、 换热器效率下降等; 不计入故障时间统计;</p>
|
|
|
+ <p>D 数据问题: 断数、 云服务故障等我们的系统产生的问题; 不计入故障时间统计;</p>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ :rows="3"
|
|
|
+ placeholder="不超过100字"
|
|
|
+ v-model="formValue.remark">
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警触发时所转问题">
|
|
|
+ <el-select
|
|
|
+ v-model="formValue.hasProblem"
|
|
|
+ clearable
|
|
|
+ placeholder="请选择"
|
|
|
+ :disabled="formValue.objTypeRules.length==0"
|
|
|
+ @change="hasProblemHandle">
|
|
|
+ <el-option
|
|
|
+ v-for="item in hasProblemArr"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ <span v-show="hasProblemInfo">问题为: {{hasProblemInfo}}</span>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警所用算法" prop="aligothmType">
|
|
|
+ <el-select
|
|
|
+ :disabled="formValue.objTypeRules.length==0"
|
|
|
+ style="width: 300px;"
|
|
|
+ v-model="formValue.aligothmType"
|
|
|
+ clearable
|
|
|
+ placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in aligothmTypeArr"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="取值信息点" prop="funcid">
|
|
|
+ <span class="infoStar">*</span>
|
|
|
+ <span>{{selectInfoBtn}}</span>
|
|
|
+ </el-form-item>
|
|
|
+ <!-- 阈值算法 -->
|
|
|
+ <div v-if="formValue.aligothmType == 'threshold'" class="threshold-box">
|
|
|
+ <el-form-item label="报警诊断启动前提" prop="aligothmTypeInfo.precondition" :rules="rules.precondition">
|
|
|
+ <el-radio-group class="precondition" v-model="formValue.aligothmTypeInfo.precondition">
|
|
|
+ <p><el-radio label="running" :disabled="!isRunStatus">只有当设备处于运行状态才启动报警诊断</el-radio></p>
|
|
|
+ <p><el-radio label="runningEnergy" :disabled="!isElecConsumP">只有当设备的运行能耗大于
|
|
|
+ <el-input
|
|
|
+ style="width: 200px; margin: 0 10px;"
|
|
|
+ placeholder="请输入"
|
|
|
+ v-model="formValue.aligothmTypeInfo.energyupper"
|
|
|
+ :disabled="formValue.aligothmTypeInfo.precondition!='runningEnergy'">
|
|
|
+ <template slot="append">kwh</template>
|
|
|
+ </el-input>时才启动报警诊断</el-radio></p>
|
|
|
+ <p><el-radio label="any">设备在任何状态下都启动报警诊断</el-radio></p>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警诊断日期及时间" prop="aligothmTypeInfo.dateSet" :rules="rules.dateSet">
|
|
|
+ <p>
|
|
|
+ <span style="margin: 0 10px;">日期设定</span>
|
|
|
+ <el-radio-group v-model="formValue.aligothmTypeInfo.dateSet">
|
|
|
+ <el-radio label="all">全部日期</el-radio>
|
|
|
+ <el-radio label="workday">仅工作日</el-radio>
|
|
|
+ <el-radio label="weekday">仅周末</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </p>
|
|
|
+ <p>
|
|
|
+ <span style="margin: 0 10px;">时间设定</span>
|
|
|
+ <el-radio-group v-model="formValue.aligothmTypeInfo.timeSet" @change="timeRadioHandle">
|
|
|
+ <el-radio label="all">全部时间</el-radio>
|
|
|
+ <el-radio label="customed">自定义时间段</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ <el-time-picker
|
|
|
+ v-if="formValue.aligothmTypeInfo.timeSet=='customed'"
|
|
|
+ style="margin-left: 10px;"
|
|
|
+ is-range
|
|
|
+ v-model="customTimeRange"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始时间"
|
|
|
+ end-placeholder="结束时间"
|
|
|
+ placeholder="选择时间范围"
|
|
|
+ format="HH:mm"
|
|
|
+ size="small"
|
|
|
+ value-format="HHmm"
|
|
|
+ @change="timeRangeHandle">
|
|
|
+ </el-time-picker>
|
|
|
+ </p>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警值持续时间要求" prop="aligothmTypeInfo.errorlastperiod" :rules="rules.errorlastperiod">
|
|
|
+ <p>异常数据持续超过
|
|
|
+ <el-input
|
|
|
+ style="width: 200px; margin: 0 10px;"
|
|
|
+ placeholder="请输入"
|
|
|
+ v-model="formValue.aligothmTypeInfo.errorlastperiod">
|
|
|
+ <template slot="append">秒</template>
|
|
|
+ </el-input>时产生报警
|
|
|
+ </p>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="报警门限值设定方法" prop="aligothmTypeInfo.thresholdSetType" :rules="rules.thresholdSetType">
|
|
|
+ <p>
|
|
|
+ <el-select v-model="formValue.aligothmTypeInfo.thresholdSetTypeInfo.type" clearable placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in thresholdSetTypeInfoArr"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </p>
|
|
|
+ </el-form-item>
|
|
|
+ <el-radio-group class="precondition precondition-left" v-model="formValue.aligothmTypeInfo.thresholdSetType" @change="thresholdSetTypeChange">
|
|
|
+ <p><el-radio label="customed">手动设定报警门限值
|
|
|
+ <el-form-item prop="aligothmTypeInfo.thresholdSetType" :rules="rules.verifyUpperLower">
|
|
|
+ <p style="margin-left: 10px;">
|
|
|
+ <el-input
|
|
|
+ v-if="formValue.aligothmTypeInfo.thresholdSetTypeInfo.type != 'upper'"
|
|
|
+ style="width: 200px; margin: 0 10px;"
|
|
|
+ placeholder="请输入"
|
|
|
+ v-model="formValue.aligothmTypeInfo.thresholdSetTypeInfo.lower">
|
|
|
+ <template slot="append">{{unit || "单位"}}</template>
|
|
|
+ </el-input>
|
|
|
+ <span v-if="formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'upperLower'">至</span>
|
|
|
+ <el-input
|
|
|
+ v-if="formValue.aligothmTypeInfo.thresholdSetTypeInfo.type != 'lower'"
|
|
|
+ style="width: 200px; margin: 0 10px;"
|
|
|
+ placeholder="请输入"
|
|
|
+ v-model="formValue.aligothmTypeInfo.thresholdSetTypeInfo.upper">
|
|
|
+ <template slot="append">{{unit || "单位"}}</template>
|
|
|
+ </el-input>
|
|
|
+ <!-- 浮动范围
|
|
|
+ <el-input
|
|
|
+ style="width: 150px; margin: 0 10px;"
|
|
|
+ placeholder="请输入"
|
|
|
+ v-model="formValue.aligothmTypeInfo.thresholdSetTypeInfo.rangefrom">
|
|
|
+ <template slot="append">%</template>
|
|
|
+ </el-input> -->
|
|
|
+ </p>
|
|
|
+ </el-form-item>
|
|
|
+ </el-radio>
|
|
|
+ </p>
|
|
|
+ <p>
|
|
|
+ <el-radio label="compareInfoCode">指定数据字典中信息点进行比对
|
|
|
+ <el-form-item prop="aligothmTypeInfo.thresholdSetType" :rules="rules.verifyCompareInfo">
|
|
|
+ <el-button @click="selectRatedInfoHandle('lower')"
|
|
|
+ v-if="formValue.aligothmTypeInfo.thresholdSetTypeInfo.type != 'upper'"
|
|
|
+ :disabled="formValue.aligothmTypeInfo.thresholdSetType != 'compareInfoCode'">{{selectRatedInfoLowerBtn}}</el-button>
|
|
|
+ <el-button @click="selectRatedInfoHandle('upper')"
|
|
|
+ v-if="formValue.aligothmTypeInfo.thresholdSetTypeInfo.type != 'lower'"
|
|
|
+ :disabled="formValue.aligothmTypeInfo.thresholdSetType != 'compareInfoCode'">{{selectRatedInfoUpperBtn}}</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-radio>
|
|
|
+
|
|
|
+ </p>
|
|
|
+ <p><el-radio label="compareHistory">使用历史值进行对比</el-radio></p>
|
|
|
+ </el-radio-group>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ <div class="btn-box">
|
|
|
+ <el-button class="edit-btn" type="primary" :loading="btnLoading" @click="saveHandle('ruleForm')">保存</el-button>
|
|
|
+ <el-button @click="cancelHandle()">取消</el-button>
|
|
|
+ </div>
|
|
|
+ <!-- 所转问题弹窗 -->
|
|
|
+ <v-has-problem
|
|
|
+ :hasProblemVisibleFlag="hasProblemVisibleFlag"
|
|
|
+ :objTypeValue="startCascadeValue"
|
|
|
+ :startCascadeValue="startCascadeValue"
|
|
|
+ :endCascadeValue="endCascadeValue"
|
|
|
+ @has-problem-handle="hasProblemEmitHandle"
|
|
|
+ @has-problem-close="hasProblemCloseHandle">
|
|
|
+ </v-has-problem>
|
|
|
+ <!-- 选择额定信息点 -->
|
|
|
+ <v-select-rated-info
|
|
|
+ :selectRatedInfoFlag="selectRatedInfoFlag"
|
|
|
+ :objTypeValue="startCascadeValue"
|
|
|
+ :infoPointArr="infoPointArr"
|
|
|
+ :selectRatedInfoCheckedCode="selectRatedInfoCheckedCode"
|
|
|
+ @select-info-handle="selectRatedInfoEmitHandle">
|
|
|
+ </v-select-rated-info>
|
|
|
+</div>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+import fixedApi from '../fixedalarmitem/api';
|
|
|
+import alarmApi from '@/api/alarm'
|
|
|
+//components
|
|
|
+import vHasProblem from './hasproblem'; //所转问题弹窗
|
|
|
+// import vSelectInfo from './selectinfo'; //选择信息点
|
|
|
+import vSelectRatedInfo from './selectratedinfo'; //选择技术信息点
|
|
|
+import vObjType from '@/components/alarm/ObjType'
|
|
|
+import vAlarmClass from '@/components/alarm/AlarmClass'
|
|
|
+export default {
|
|
|
+ name: 'edit',
|
|
|
+ data () {
|
|
|
+ /******校验规则部分****** */
|
|
|
+ // 报警编码值code校验
|
|
|
+ let validatorCode = (rules, value, callback) => {
|
|
|
+ let num = Number(value);
|
|
|
+ if(isNaN(num)){
|
|
|
+ callback(new Error('请输入数字'));
|
|
|
+ } else {
|
|
|
+ let reg = /^\d{1,10}$/
|
|
|
+ if(reg.test(num)){
|
|
|
+ callback()
|
|
|
+ }else{
|
|
|
+ callback(new Error('请输入不超过10位的数字'));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // 报警诊断启动前提
|
|
|
+ let validatorPrecondition = (rules, value, callback) => {
|
|
|
+ if(value === 'runningEnergy') {
|
|
|
+ let reg = /^[1-9]\d*$/;
|
|
|
+ if(reg.test(this.formValue.aligothmTypeInfo.energyupper)) {
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('请输入正整数'));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // 报警持续要求时间
|
|
|
+ let validatorErrorLastPeriod = (rules, value, callback) => {
|
|
|
+ if(value == 0) {
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ let reg = /^[1-9]\d{0,3}$/;
|
|
|
+ if(reg.test(value)) {
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('请输入不超4位正整数'));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let validatorupperLower = (rules, value, callback) => {
|
|
|
+ if(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'upperLower' && this.formValue.aligothmTypeInfo.thresholdSetType == "customed" ) { // 上下限
|
|
|
+ if(/^-?\d{1,8}(?:\.\d{1,3})?$/.test(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lower)
|
|
|
+ && /^-?\d{1,8}(?:\.\d{1,3})?$/.test(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upper)){
|
|
|
+ let lower = Number(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lower)
|
|
|
+ let upper = Number(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upper)
|
|
|
+ if(lower > upper) {
|
|
|
+ callback(new Error('下限大于上限'));
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback(new Error('整数最多8位,小数最多3位'));
|
|
|
+ }
|
|
|
+ } else if (this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'upper' && this.formValue.aligothmTypeInfo.thresholdSetType == "customed"){ //上限
|
|
|
+ if(/^-?\d{1,8}(?:\.\d{1,3})?$/.test(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upper)){
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('整数最多8位,小数最多3位'));
|
|
|
+ }
|
|
|
+ } else if (this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'lower' && this.formValue.aligothmTypeInfo.thresholdSetType == "customed"){ //下限
|
|
|
+ if(/^-?\d{1,8}(?:\.\d{1,3})?$/.test(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lower)){
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('整数最多8位,小数最多3位'));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let validatorcompareInfo = (rules, value, callback) => {
|
|
|
+ if( this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'upperLower' && this.formValue.aligothmTypeInfo.thresholdSetType == "compareInfoCode") { // 上下限
|
|
|
+ if(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lowerCompareInfocode && this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upperCompareInfocode){
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('请选择信息点'));
|
|
|
+ }
|
|
|
+ } else if (this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'upper' && this.formValue.aligothmTypeInfo.thresholdSetType == "compareInfoCode"){ //上限
|
|
|
+ if(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upperCompareInfocode){
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('请选择信息点'));
|
|
|
+ }
|
|
|
+ } else if (this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.type == 'lower' && this.formValue.aligothmTypeInfo.thresholdSetType == "compareInfoCode"){ //下限
|
|
|
+ if(this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lowerCompareInfocode){
|
|
|
+ callback()
|
|
|
+ } else {
|
|
|
+ callback(new Error('请选择信息点'));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return {
|
|
|
+ /********************* */
|
|
|
+ objTypeComValue: [],
|
|
|
+ /********************* */
|
|
|
+ projectId: null, //项目id
|
|
|
+ hasProblemVisibleFlag: false, //所转问题的弹窗的flag
|
|
|
+ slectInfoFlag: false, //选择信息点的flag
|
|
|
+ selectRatedInfoFlag: false, //选择额定信息点的flag
|
|
|
+ btnLoading: false, //按钮loading
|
|
|
+ formValue: {
|
|
|
+ objType: null, //对象类型,project,floor,space,system,facility, **必须
|
|
|
+ objTypeRules:[],
|
|
|
+ category: null, //系统或者设备的category 例如:选系统或者设备时加上前面加上专业编号 其他对象类型为空
|
|
|
+ code: null, //报警条目编码 **必须
|
|
|
+ name: null, //报警条目名称 **必须
|
|
|
+ alarmCategory: undefined, //报警分类
|
|
|
+ level: null, //严重程度 S A B C D 五级
|
|
|
+ funcid:[{ //信息点信息,污水坑算法时不用传
|
|
|
+ funcidId: null, //对应信息点id
|
|
|
+ funcidName: null //对应信息点名称
|
|
|
+ }],
|
|
|
+ hasProblem: null, //'1转问题,0不转问题',int类型
|
|
|
+ problemId: null, //问题id,hasProblem为1时此项不为空' ,
|
|
|
+ remark: null, //备注
|
|
|
+ aligothmType: "none", //算法类型,不需要算法,none 阈值threshold,污水坑sump
|
|
|
+ aligothmTypeInfo: {
|
|
|
+ precondition: null,//前提,running(只有当设备处于运行状态时才启动报警诊断),runningEnergy(只有当设备运行能耗大于时启动),any(任何情况都启动)
|
|
|
+ energyupper: 40, // precondition为runningEnergy时不为空,int类型
|
|
|
+ dateSet: "all", //日期设定,all,workday,weekday
|
|
|
+ timeSet: "all", //时间设定,all,customed
|
|
|
+ startTime: null, //自定义时间设定开始时间hhss,timeSet为customed时不为空
|
|
|
+ endTime: null, //自定义时间设定结束时间hhss,timeSet为customed时不为空
|
|
|
+ errorlastperiod: 0, //异常持续时间,单位秒,
|
|
|
+ thresholdSetType: "customed", //门限设置方式,customed,compareInfoCode,compareHistory
|
|
|
+ compareInfocode: null, //比对信息点thresholdSetType为compareInfoCode时必须
|
|
|
+ thresholdSetTypeInfo:{
|
|
|
+ type: "upperLower", //aligothmType为threshold时必须 upperLower,upper,lower
|
|
|
+ lower: 0, //下限
|
|
|
+ upper: 0, //上限
|
|
|
+ rangefrom: 0, //浮动范围,不是必须
|
|
|
+ lowerCompareInfocode: null,
|
|
|
+ upperCompareInfocode: null,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ rules: { //表单的规则
|
|
|
+ objTypeRules: [{ required:true, message: '请选择对象类', trigger: 'change'}],
|
|
|
+ code: [{ required:true, message: '请填写条目编码', trigger: 'blur'},
|
|
|
+ {validator: validatorCode, trigger: 'blur'}],
|
|
|
+ name: [{ required:true, message: '请填写条目名称', trigger: 'blur'},
|
|
|
+ { min: 1, max: 30, message: '不超过30个字', trigger: 'blur'}],
|
|
|
+ level: [{ required:true, message: '请选择严重程度', trigger: 'change'}],
|
|
|
+ aligothmType: [{ required:true, message: '请选择报警所用算法', trigger: 'change'}],
|
|
|
+ precondition: [{ required:true, message: '请选择报警诊断前提', trigger: 'change'},
|
|
|
+ {validator: validatorPrecondition, trigger: 'blur'}],
|
|
|
+ dateSet: [{ required:true, message: '请选择日期和时间', trigger: 'blur'}],
|
|
|
+ errorlastperiod: [{ required:true, message: '请选择报警持续时间', trigger: 'blur'},
|
|
|
+ {validator: validatorErrorLastPeriod, trigger: 'blur'}],
|
|
|
+ verifyUpperLower: [
|
|
|
+ {validator: validatorupperLower, trigger: 'blur'}],
|
|
|
+ verifyCompareInfo: [
|
|
|
+ {validator: validatorcompareInfo, trigger: 'blur'}
|
|
|
+ ]
|
|
|
+
|
|
|
+ },
|
|
|
+ levelSelectArr: [ //严重级别的下拉数据
|
|
|
+ {
|
|
|
+ label: "S",
|
|
|
+ value: "S",
|
|
|
+ },{
|
|
|
+ label: "A",
|
|
|
+ value: "A",
|
|
|
+ },{
|
|
|
+ label: "B",
|
|
|
+ value: "B",
|
|
|
+ },{
|
|
|
+ label: "C",
|
|
|
+ value: "C",
|
|
|
+ },{
|
|
|
+ label: "D",
|
|
|
+ value: "D",
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ hasProblemArr: [ //报警触发时所转问题的下拉数据
|
|
|
+ {
|
|
|
+ label: "不转问题",
|
|
|
+ value: "0",
|
|
|
+ },{
|
|
|
+ label: "选择问题",
|
|
|
+ value: "1",
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ aligothmTypeArr: [
|
|
|
+ {
|
|
|
+ label: "直接从点位值判断,不需要算法",
|
|
|
+ value: "none"
|
|
|
+ }, {
|
|
|
+ label: "使用阈值算法",
|
|
|
+ value: "threshold",
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ thresholdSetTypeInfoArr: [ //阈值算法的报警们限值设定方式的上下限的数组
|
|
|
+ {
|
|
|
+ label: '上下限',
|
|
|
+ value: 'upperLower'
|
|
|
+ },{
|
|
|
+ label: '上限',
|
|
|
+ value: 'upper'
|
|
|
+ },{
|
|
|
+ label: '下限',
|
|
|
+ value: 'lower'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ // objTypeOptions: [{ //选择适用对象类的级联框
|
|
|
+ // value: 'building',
|
|
|
+ // label: '建筑',
|
|
|
+ // },{
|
|
|
+ // value: 'floor',
|
|
|
+ // label: '楼层',
|
|
|
+ // },{
|
|
|
+ // value: 'space',
|
|
|
+ // label: '空间',
|
|
|
+ // },{
|
|
|
+ // value: 'system',
|
|
|
+ // label: '系统类',
|
|
|
+ // children: []
|
|
|
+ // },{
|
|
|
+ // value: 'facility',
|
|
|
+ // label: '设备类',
|
|
|
+ // children: []
|
|
|
+ // }],
|
|
|
+ startCascadeValue: null, //级联第一级
|
|
|
+ endCascadeValue: null, //级联最后一级
|
|
|
+ infoPointArr:[], //信息点总数组
|
|
|
+ hasProblemInfo: null, //所转问题详情
|
|
|
+ selectInfoBtn: null,
|
|
|
+ customTimeRange: [new Date(), new Date()], //自定义时间段
|
|
|
+ selectRatedInfoUpperBtn: '请选择上限信息点', //选择固定的信息点
|
|
|
+ selectRatedInfoLowerBtn: '请选择下限信息点',
|
|
|
+ selectRatedInfoCodeFlag: null, //选择信息点的flag
|
|
|
+ selectRatedInfoCheckedCode: null, //被选中的信息点
|
|
|
+ unit: null, //阈值算法的单位
|
|
|
+ isRunStatus: false, //是否有RunStatus的信息点
|
|
|
+ isElecConsumP: false, //是否有ElecConsumP的信息点
|
|
|
+ createStatus: false, //创建状态
|
|
|
+ //业务管理v1.1升级
|
|
|
+ alarmClassArr:[], //报警分类的下拉数据
|
|
|
+ alarmClassValue: '', //绑定的value
|
|
|
+ }
|
|
|
+ },
|
|
|
+ components: {
|
|
|
+ vHasProblem,
|
|
|
+ vSelectRatedInfo,
|
|
|
+ vObjType,
|
|
|
+ vAlarmClass
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ //保存
|
|
|
+ saveHandle(formName) {
|
|
|
+ this.$refs[formName].validate((valid) => {
|
|
|
+ this.btnLoading = true;
|
|
|
+ if (valid) {
|
|
|
+ let params = {
|
|
|
+ type: "customed", //报警条目类别,fixed 固定,customed 自定义 **必须
|
|
|
+ projectId: this.projectId, //项目id,自定义类别时不为空
|
|
|
+ code: this.formValue.code, //报警条目编码 code和name可以只传一个
|
|
|
+ name: this.formValue.name //报警条目名称
|
|
|
+ }
|
|
|
+ fixedApi.isExisted(params).then(res => {
|
|
|
+ if(res.result == 'success') {
|
|
|
+ if(res.name || res.code){
|
|
|
+ this.$message({
|
|
|
+ message: '报警编码或报警条目重复',
|
|
|
+ type: 'warning'
|
|
|
+ });
|
|
|
+ let name = this.formValue.name;
|
|
|
+ let code = this.formValue.code;
|
|
|
+ if(res.name) {
|
|
|
+ this.formValue.name = null;
|
|
|
+ }
|
|
|
+ if(res.code){
|
|
|
+ this.formValue.code = null;
|
|
|
+ }
|
|
|
+ this.$refs[formName].validate((valid) => {
|
|
|
+ this.formValue.name = name;
|
|
|
+ this.formValue.code = code;
|
|
|
+ })
|
|
|
+ this.btnLoading = false;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //调保存接口
|
|
|
+ this.formValue.type = "customed";
|
|
|
+ this.formValue.projectId = this.projectId;
|
|
|
+ let param = this.formValue;
|
|
|
+ fixedApi.save(param).then(res => {
|
|
|
+ if(res.result === "success"){
|
|
|
+ this.$message({
|
|
|
+ message: '保存成功',
|
|
|
+ type: 'success'
|
|
|
+ });
|
|
|
+ this.btnLoading = false;
|
|
|
+ this.$router.push("/projectinit/projectalarmitem?projectId=" +this.projectId)
|
|
|
+ } else {
|
|
|
+ this.btnLoading = false;
|
|
|
+ this.$message({
|
|
|
+ message: '网络连接超时,请重新提交',
|
|
|
+ type: 'error'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this.$message({
|
|
|
+ message: '页面有必填项,请填写后提交!',
|
|
|
+ type: 'warning'
|
|
|
+ });
|
|
|
+ this.btnLoading = false;
|
|
|
+ console.log('error submit!!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 取消
|
|
|
+ cancelHandle () {
|
|
|
+ this.$router.push("/projectinit/projectalarmitem?projectId=" +this.projectId)
|
|
|
+ },
|
|
|
+ // 获取对象类
|
|
|
+ // getObjTypeData() {
|
|
|
+ // fixedApi.getObjectType().then(res => {
|
|
|
+ // let {sysArr, devArr} = res;
|
|
|
+ // this.objTypeOptions[3].children = sysArr;
|
|
|
+ // this.objTypeOptions[4].children = devArr;
|
|
|
+ // });
|
|
|
+ // },
|
|
|
+ // 获取信息的数组接口
|
|
|
+ getInfoPointArr(type) {
|
|
|
+ if(this.startCascadeValue == "system") {
|
|
|
+ type = type.substring(2, 4);
|
|
|
+ }
|
|
|
+ if(this.startCascadeValue == "facility") {
|
|
|
+ type = type.substring(2, 6);
|
|
|
+ }
|
|
|
+ let params = {
|
|
|
+ type: type,
|
|
|
+ }
|
|
|
+ fixedApi.getInfoListData(params).then((res) => {
|
|
|
+ let data = res;
|
|
|
+ this.infoPointArr = data;
|
|
|
+ let RunStatusArr = data.filter((ele, index) => {
|
|
|
+ return ele.infoPointCode == "RunStatus"
|
|
|
+ });
|
|
|
+ let ElecConsumPArr = data.filter((ele, index) => {
|
|
|
+ return ele.infoPointCode == "ElecConsumP"
|
|
|
+ });
|
|
|
+ this.isRunStatus = RunStatusArr[0] ? true : false;
|
|
|
+ this.isElecConsumP = ElecConsumPArr[0] ? true : false;
|
|
|
+ }).catch(err => {
|
|
|
+ throw err;
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 时间日期radiochange事件
|
|
|
+ timeRadioHandle(val) {
|
|
|
+ if(val == "customed") {
|
|
|
+ let startTime = this.customTimeRange[0];
|
|
|
+ let endTime = this.customTimeRange[1];
|
|
|
+ this.formValue.aligothmTypeInfo.startTime = "" + startTime.getHours() + startTime.getMinutes();;
|
|
|
+ this.formValue.aligothmTypeInfo.endTime = "" + endTime.getHours() + endTime.getMinutes();
|
|
|
+ } else {
|
|
|
+ this.formValue.aligothmTypeInfo.startTime = null;
|
|
|
+ this.formValue.aligothmTypeInfo.endTime = null;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 时间日期区间change事件
|
|
|
+ timeRangeHandle(timeArr) {
|
|
|
+ if(timeArr) {
|
|
|
+ this.formValue.aligothmTypeInfo.startTime = timeArr[0];
|
|
|
+ this.formValue.aligothmTypeInfo.endTime = timeArr[1];
|
|
|
+ } else {
|
|
|
+ this.formValue.aligothmTypeInfo.startTime = null;
|
|
|
+ this.formValue.aligothmTypeInfo.endTime = null;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //报警门限值change事件
|
|
|
+ thresholdSetTypeChange(val) {
|
|
|
+ this.formValue.aligothmTypeInfo.compareInfocode = null;
|
|
|
+ },
|
|
|
+ // 填写默认值
|
|
|
+ getDefaultValue(){
|
|
|
+ let creatParams = this.$route.query;
|
|
|
+ if(creatParams){
|
|
|
+
|
|
|
+ // 处理对象类
|
|
|
+ let objArr = [];
|
|
|
+ objArr[0] = creatParams.startCascadeValue;
|
|
|
+ this.startCascadeValue = creatParams.startCascadeValue;
|
|
|
+ this.endCascadeValue = creatParams.startCascadeValue;
|
|
|
+ if(creatParams.startCascadeValue == 'system') {
|
|
|
+ this.endCascadeValue = creatParams.endCascadeValue;
|
|
|
+ objArr[1] = creatParams.endCascadeValue.substring(0, 2);
|
|
|
+ objArr[2] = creatParams.endCascadeValue.substring(0, 4);
|
|
|
+ }
|
|
|
+ if (creatParams.startCascadeValue == 'facility') {
|
|
|
+ this.endCascadeValue = creatParams.endCascadeValue;
|
|
|
+ objArr[1] = creatParams.endCascadeValue.substring(0, 2);
|
|
|
+ objArr[2] = creatParams.endCascadeValue.substring(0, 4);
|
|
|
+ objArr[3] = creatParams.endCascadeValue.substring(0, 6);
|
|
|
+ }
|
|
|
+ if(creatParams.startCascadeValue == 'space') {
|
|
|
+ this.endCascadeValue = creatParams.endCascadeValue;
|
|
|
+ objArr = ['space', creatParams.endCascadeValue];
|
|
|
+ }
|
|
|
+ this.createStatus = true;
|
|
|
+ this.formValue.objTypeRules = objArr;
|
|
|
+ this.objTypeComValue = objArr;
|
|
|
+ this.formValue.objType = creatParams.startCascadeValue;
|
|
|
+ this.formValue.category = creatParams.endCascadeValue;
|
|
|
+ this.formValue.name = creatParams.infoPointName;
|
|
|
+ // 信息点
|
|
|
+ this.selectInfoBtn = creatParams.infoPointName;
|
|
|
+ this.formValue.funcid[0].funcidId = creatParams.infoPointCode;
|
|
|
+ this.formValue.funcid[0].funcidName = creatParams.infoPointName
|
|
|
+ // 单位
|
|
|
+ this.unit = creatParams.unit || "单位"
|
|
|
+ // 获取信息点
|
|
|
+ let infoParam = creatParams.startCascadeValue == 'space' ? 'space' : this.endCascadeValue;
|
|
|
+ this.getInfoPointArr(infoParam);
|
|
|
+ } else {
|
|
|
+ window.history.go(-1);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /***************************组件回调时间************************************** */
|
|
|
+ //触发问题下拉事件
|
|
|
+ hasProblemHandle(value) {
|
|
|
+ if(value == 1){
|
|
|
+ this.hasProblemVisibleFlag = !this.hasProblemVisibleFlag;
|
|
|
+ } else {
|
|
|
+ this.hasProblemInfo = null;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //触发所转问题的回调事件
|
|
|
+ hasProblemEmitHandle(name, id) {
|
|
|
+ this.hasProblemInfo = name + '---' + id;
|
|
|
+ this.formValue.problemId = id;
|
|
|
+ },
|
|
|
+ //触发所转问题的关闭事件
|
|
|
+ hasProblemCloseHandle(radioValue) {
|
|
|
+ if(!radioValue){
|
|
|
+ this.formValue.hasProblem = null;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //选择技术信息点的点击事件
|
|
|
+ selectRatedInfoHandle(flag) {
|
|
|
+ this.selectRatedInfoCodeFlag = flag; //标记是上限 or 下限
|
|
|
+ if (flag == "lower") {
|
|
|
+ this.selectRatedInfoCheckedCode = this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lowerCompareInfocode;
|
|
|
+ } else {
|
|
|
+ this.selectRatedInfoCheckedCode = this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upperCompareInfocode;
|
|
|
+ }
|
|
|
+ this.selectRatedInfoFlag = !this.selectRatedInfoFlag;
|
|
|
+ },
|
|
|
+ //选择技术信息点的回填事件
|
|
|
+ selectRatedInfoEmitHandle(name, code) {
|
|
|
+ if (this.selectRatedInfoCodeFlag == "lower") {
|
|
|
+ this.selectRatedInfoLowerBtn = name + '---' + code;
|
|
|
+ this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.lowerCompareInfocode = code;
|
|
|
+ } else {
|
|
|
+ this.selectRatedInfoUpperBtn = name + '---' + code;
|
|
|
+ this.formValue.aligothmTypeInfo.thresholdSetTypeInfo.upperCompareInfocode = code;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ init() {
|
|
|
+ this.projectId = this.$route.query.projectId;
|
|
|
+ // 填写默认值
|
|
|
+ this.getDefaultValue();
|
|
|
+ //获取报警分类的列表
|
|
|
+ this.getAlarmClassList()
|
|
|
+ },
|
|
|
+ /**v1.1********************************* */
|
|
|
+ //获取报警分类
|
|
|
+ async getAlarmClassList() {
|
|
|
+ let params = {
|
|
|
+ criteria: {
|
|
|
+ projectId: {$in:[this.projectId,"0"]}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let res = await alarmApi.alarmClassList(params)
|
|
|
+ this.alarmClassArr = res
|
|
|
+ },
|
|
|
+ //报警分类的change
|
|
|
+ alarmClassChange(val) {
|
|
|
+ this.formValue.alarmCategory = val || undefined
|
|
|
+ },
|
|
|
+ //报警分类添加
|
|
|
+ async alarmClassAdd(val) {
|
|
|
+ let params = {
|
|
|
+ projectId: this.projectId,
|
|
|
+ category: val
|
|
|
+ }
|
|
|
+ let res = await alarmApi.createAlarmClass(params)
|
|
|
+ if(res.result == 'success') {
|
|
|
+ this.$message({
|
|
|
+ message: '添加成功',
|
|
|
+ type: 'success'
|
|
|
+ });
|
|
|
+ this.$refs['alarm-class'].visible = false
|
|
|
+ await this.getAlarmClassList()
|
|
|
+ this.alarmClassValue = val
|
|
|
+ this.formValue.alarmCategory = val
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.init()
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+</script>
|
|
|
+<style lang='less' scoped>
|
|
|
+.edit-box{
|
|
|
+ .title {text-align: center;}
|
|
|
+ .form-box {
|
|
|
+ margin-top:20px;
|
|
|
+ margin-left:20%;
|
|
|
+ width: 50%;
|
|
|
+ .infoStar{
|
|
|
+ color: #f56c6c;
|
|
|
+ position: absolute;
|
|
|
+ left: -93px;
|
|
|
+ }
|
|
|
+ .threshold-box{
|
|
|
+ .precondition-left{
|
|
|
+ padding-left:150px;
|
|
|
+ }
|
|
|
+ .precondition{
|
|
|
+ p{
|
|
|
+ margin:10px 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ .level_describe {
|
|
|
+ color: #b2b2b2;
|
|
|
+ p {
|
|
|
+ line-height: 24px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .btn-box{
|
|
|
+ margin-top: 10px;
|
|
|
+ text-align: center;
|
|
|
+ .edit-btn{
|
|
|
+ margin-right: 50px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|
|
|
+<style>
|
|
|
+.edit-box .form-box .threshold-box .precondition-left .el-form-item__content{margin-left: 0px!important}
|
|
|
+</style>
|