File was renamed from src/components/scene/Editor.vue |
| | |
| | | <template>
|
| | | <div class="edit-rules-box">
|
| | | <p style="padding: 0">
|
| | | <b style="font-size: 14px; line-height: 28px;">策略配置</b>
|
| | | </p>
|
| | | <div class="sub-rules-box">
|
| | | <div style=" text-align: left;">
|
| | | <!-- <div style="margin-left:10px;margin-top: 4px;" v-show="index > 0">
|
| | | <el-select v-model="rule.rule_with_pre" placeholder="并列关系" size="mini">
|
| | | <el-option
|
| | | v-for="subitem in VideoManageData.Dictionary.RULECOMPUTEBETWEEN"
|
| | | :key="subitem.id"
|
| | | :label="subitem.name"
|
| | | :value="subitem.value"
|
| | | :title="subitem.name"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | </div>-->
|
| | | <div class="sdk-group">
|
| | | <transition-group name="fade" mode="out-in" appear>
|
| | | <div
|
| | | class="config-item"
|
| | | :class="{ init: index == 0 }"
|
| | | v-cloak
|
| | | v-for="(sdkItem, index) in sdkGroup"
|
| | | :key="index"
|
| | | >
|
| | | <div class="connection" v-if="index !== 0">
|
| | | <el-select
|
| | | v-model="sdkItem.rule_with_pre"
|
| | | size="mini"
|
| | | placeholder="选关系"
|
| | | @change="selConnection(sdkItem)"
|
| | | >
|
| | | <el-option value="&&" title="and/且" label="and/且"></el-option>
|
| | | <el-option value="||" title="or/或" label="or/或"></el-option>
|
| | | <el-option value="=>" title="—>/触发" label="—>/触发"></el-option>
|
| | | </el-select>
|
| | | <el-checkbox
|
| | | v-show="sdkItem.rule_with_pre == '=>'"
|
| | | v-model="sdkItem.is_save_anyhow"
|
| | | style="margin-left:30px"
|
| | | >保存过程数据</el-checkbox>
|
| | | </div>
|
| | | <div class="top-line">
|
| | | <div class="left">
|
| | | <div class="init-sdk">
|
| | | <el-select
|
| | | v-model="sdkItem.sdkObj"
|
| | | value-key="id"
|
| | | placeholder="选择算法"
|
| | | size="mini"
|
| | | @change="selectSDKOption(sdkItem, true, index)"
|
| | | >
|
| | | <el-option
|
| | | v-for="item in TaskMange.list1"
|
| | | :key="item.id"
|
| | | :label="item.sdk_name"
|
| | | :value="item"
|
| | | :title="item.sdk_name"
|
| | | v-show="!item.del_flag"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | </div>
|
| | | <div class="init-polygon">
|
| | | <el-select
|
| | | v-model="sdkItem.polygonObj"
|
| | | v-if="!isTemplate"
|
| | | value-key="polygonId"
|
| | | placeholder="选择区域"
|
| | | size="mini"
|
| | | @change="selectPolygonOption(sdkItem)"
|
| | | >
|
| | | <el-option
|
| | | v-for="subitem in allPolygonData"
|
| | | :key="subitem.id"
|
| | | :label="subitem.name"
|
| | | :value="subitem"
|
| | | :title="subitem.name"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | </div>
|
| | | </div>
|
| | | <div class="right">
|
| | | <span class="del" v-show="!hideDel" @click="delConfigItem(index)">
|
| | | <i class="iconfont iconshanchu"></i>
|
| | | </span>
|
| | | <span class="collapse" @click="collapseLine(index)">
|
| | | <i
|
| | | :class="
|
| | | sdkItem.isSpread
|
| | | ? 'el-icon-arrow-up'
|
| | | : 'el-icon-arrow-down'
|
| | | "
|
| | | ></i>
|
| | | </span>
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <div class="argums derive-line" v-show="sdkItem.isSpread">
|
| | | <div v-for="(arg, index) in sdkItem.defaultArg" :key="arg.sort">
|
| | | <div class="argums-item" v-if="arg.config.isShow">
|
| | | <div class="arg-name">
|
| | | <!-- <el-input
|
| | | v-model="arg.name"
|
| | | size="mini"
|
| | | :disabled="true"
|
| | | ></el-input>-->
|
| | | <el-select v-model="arg.name" size="mini" :disabled="true">
|
| | | <el-option :label="arg.name" :title="arg.name" :value="arg"></el-option>
|
| | | </el-select>
|
| | | </div>
|
| | | <div class="operator-name">
|
| | | <!-- <el-input
|
| | | v-if="arg.operators.length == 1"
|
| | | v-model="arg.operators[0].operator"
|
| | | :disabled="true"
|
| | | size="mini"
|
| | | ></el-input>-->
|
| | | <el-select
|
| | | :disabled="arg.operators.length==1"
|
| | | v-model="arg.operator"
|
| | | size="mini"
|
| | | @change="selOperator(sdkItem)"
|
| | | >
|
| | | <el-option
|
| | | v-for="operator in arg.operators"
|
| | | :key="operator.operator"
|
| | | :value="operator.operator"
|
| | | :label="operator.name"
|
| | | :title="operator.name"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | </div>
|
| | | <div class="arg-val">
|
| | | <div v-if="arg.operator == 'range'">
|
| | | <el-input
|
| | | class="range-min"
|
| | | v-model="arg.min"
|
| | | @blur="validateArgVal(arg, $event)"
|
| | | ></el-input>
|
| | | <span class="devide"></span>
|
| | | <el-input
|
| | | class="range-max"
|
| | | v-model="arg.max"
|
| | | @blur="validateArgVal(arg, $event)"
|
| | | ></el-input>
|
| | | <span>{{ arg.unit }}</span>
|
| | | </div>
|
| | | <div v-else>
|
| | | <el-select v-if="arg.type == 'option'" v-model="arg.sdk_arg_value">
|
| | | <el-option>请选择</el-option>
|
| | | </el-select>
|
| | | <el-input
|
| | | v-if="arg.type == 'value'"
|
| | | v-model="arg.sdk_arg_value"
|
| | | :placeholder="
|
| | | arg.default_value ? arg.default_value : ''
|
| | | "
|
| | | size="mini"
|
| | | :style="{ borderColor: tipColor }"
|
| | | @blur="validateArgVal(arg, $event)"
|
| | | ></el-input>
|
| | | <span>{{ arg.unit }}</span>
|
| | | </div>
|
| | | </div>
|
| | | <div
|
| | | class="optional"
|
| | | v-if="
|
| | | sdkItem.initAddOptional &&
|
| | | index == sdkItem.defaultArg.length - 1
|
| | | "
|
| | | >
|
| | | <span class="btn" @click="addOptionalArg(sdkItem)">
|
| | | <i class="iconfont iconhebingxingzhuang" style="font-size:16px"></i>
|
| | | </span>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | <div
|
| | | class="argums-item optional-line"
|
| | | v-for="optArgItem in sdkItem.optArg"
|
| | | :key="optArgItem.sort"
|
| | | >
|
| | | <div class="arg-name">
|
| | | <el-input
|
| | | v-if="sdkItem.optNames.length == 1"
|
| | | v-model="sdkItem.optNames[0].name"
|
| | | size="mini"
|
| | | :disabled="true"
|
| | | ></el-input>
|
| | | <el-select
|
| | | v-if="sdkItem.optNames.length > 1"
|
| | | v-model="optArgItem.name"
|
| | | size="mini"
|
| | | @change="selOptionalArg(sdkItem, optArgItem)"
|
| | | >
|
| | | <el-option
|
| | | v-for="optName in sdkItem.optNames"
|
| | | :disabled="optName.isSelected"
|
| | | :key="optName.sort"
|
| | | :label="optName.name"
|
| | | :title="optName.name"
|
| | | :value="optName.name"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | </div>
|
| | | <div class="operator-name">
|
| | | <!-- <el-input
|
| | | v-model="optArgItem.operators[0].operator"
|
| | | :disabled="true"
|
| | | size="mini"
|
| | | ></el-input>-->
|
| | |
|
| | | <el-select
|
| | | v-model="optArgItem.operator"
|
| | | size="mini"
|
| | | @change="selOperator(optArgItem)"
|
| | | >
|
| | | <el-option
|
| | | v-for="operatorItem in optArgItem.operators"
|
| | | :key="operatorItem.operator"
|
| | | :value="operatorItem.operator"
|
| | | :label="operatorItem.name"
|
| | | :title="operatorItem.name"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | </div>
|
| | | <div class="arg-val">
|
| | | <el-select
|
| | | v-if="optArgItem.type == 'option'"
|
| | | v-model="optArgItem.sdk_arg_value"
|
| | | :multiple="optArgItem.config.isMulti"
|
| | | collapse-tags
|
| | | size="mini"
|
| | | >
|
| | | <el-option
|
| | | v-for="one in optArgItem.valueOptions"
|
| | | :key="one.value"
|
| | | :value="one.value"
|
| | | :label="one.name"
|
| | | :title="one.name"
|
| | | ></el-option>
|
| | | </el-select>
|
| | | <el-input
|
| | | v-if="optArgItem.type == 'value'"
|
| | | v-model="optArgItem.sdk_arg_value"
|
| | | size="mini"
|
| | | @blur="$event => validateArgVal(optArgItem, $event)"
|
| | | ></el-input>
|
| | | <span>{{ optArgItem.unit }}</span>
|
| | | </div>
|
| | | <div class="optional">
|
| | | <span class="btn" @click="addOptionalArg(sdkItem)" v-show="sdkItem.isAddable">
|
| | | <i class="iconfont iconhebingxingzhuang" style="font-size:16px"></i>
|
| | | </span>
|
| | | <span class="btn" @click="delOptionalArg(sdkItem, optArgItem)">
|
| | | <i class="iconfont iconshanchu11" style="font-size:16px"></i>
|
| | | </span>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </transition-group>
|
| | | </div>
|
| | | <div class="btn-add" v-show="isAdd && this.sdkGroup.length < 4">
|
| | | <el-button size="mini" @click="addSdkItem">+ 添加算法</el-button>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | </template>
|
| | | <script>
|
| | | import {
|
| | | deleteCameraRules,
|
| | | updateRuleDefence,
|
| | | updateAlarmLevel
|
| | | } from '@/api/camera'
|
| | |
|
| | | export default {
|
| | | name: 'SceneRuleEditor',
|
| | | props: {
|
| | | Cameras: {
|
| | | type: Array,
|
| | | default: () => {
|
| | | return []
|
| | | }
|
| | | },
|
| | | isTemplate: {
|
| | | type: Boolean,
|
| | | default: false
|
| | | },
|
| | | isLinkRule: {
|
| | | type: Boolean,
|
| | | default: false
|
| | | },
|
| | | includeSdks: {
|
| | | type: Array
|
| | | },
|
| | | ruleList: {
|
| | | type: String,
|
| | | default: ''
|
| | | },
|
| | | onSubmitRule: {
|
| | | type: Function,
|
| | | default: () => false
|
| | | }
|
| | | },
|
| | | // computed: {
|
| | | // allPolygonData() {
|
| | | // let polygon = []
|
| | | // let cameras = [...this.Cameras]
|
| | |
|
| | | // for (let i = 0; i < cameras.length; i++) {
|
| | | // let polyOpt = cameras[i].polygonData.map(p => {
|
| | | // return {
|
| | | // defence_state: p.defence_state,
|
| | | // polygonId: p.id,
|
| | | // name: this.isLinkRule
|
| | | // ? cameras[i].cameraName + ':' + p.name
|
| | | // : p.name,
|
| | |
|
| | | // cameraId: cameras[i].cameraId
|
| | | // }
|
| | | // })
|
| | |
|
| | | // polygon = polygon.concat(polyOpt)
|
| | | // }
|
| | | // //添加场景初始化区域选项为'全部区域'
|
| | | // if (polygon.length > 0 && this.ruleList.length == 0) {
|
| | | // this.polygonObj = polygon[0];
|
| | | // this.sdkGroup[0].polygonObj = JSON.parse(JSON.stringify(this.polygonObj));
|
| | | // this.selectPolygonOption(this.sdkGroup[0])
|
| | | // }
|
| | | // return polygon
|
| | | // }
|
| | | // },
|
| | | watch: {
|
| | | Cameras: {
|
| | | handler(n, o) {
|
| | | debugger
|
| | | let polygon = []
|
| | | let cameras = [...n]
|
| | |
|
| | | for (let i = 0; i < cameras.length; i++) {
|
| | | let polyOpt = cameras[i].polygonData.map(p => {
|
| | | return {
|
| | | defence_state: p.defence_state,
|
| | | polygonId: p.id,
|
| | | name: this.isLinkRule
|
| | | ? cameras[i].cameraName + ':' + p.name
|
| | | : p.name,
|
| | |
|
| | | cameraId: cameras[i].cameraId
|
| | | }
|
| | | })
|
| | | polygon = polygon.concat(polyOpt)
|
| | |
|
| | | this.allPolygonData = polygon
|
| | | //添加场景初始化区域选项为'全部区域'
|
| | | debugger
|
| | | // if (polygon.length > 0 && this.ruleList == '') {
|
| | | // this.polygonObj = polygon[0]
|
| | | // this.sdkGroup[0].polygonObj = JSON.parse(
|
| | | // JSON.stringify(this.polygonObj)
|
| | | // )
|
| | |
|
| | | // this.selectPolygonOption(this.sdkGroup[0])
|
| | | // }
|
| | | }
|
| | | },
|
| | | deep: true
|
| | | },
|
| | | sdkGroup: {
|
| | | handler(newV, oldV) {
|
| | | if (newV) {
|
| | | debugger
|
| | | newV.forEach(sdk => {
|
| | | let rangeOne = sdk.defaultArg.find(
|
| | | arg => arg.operators[0].operator == 'range'
|
| | | )
|
| | | if (rangeOne) {
|
| | | debugger
|
| | | if (rangeOne.min.trim() && rangeOne.max.trim()) {
|
| | | if (Number(rangeOne.min) >= Number(rangeOne.max)) {
|
| | | this.$notify({
|
| | | type: 'error',
|
| | | message: '区间左侧不能大于或等于区间右侧的值'
|
| | | })
|
| | | rangeOne.valid = false
|
| | | }
|
| | | rangeOne.sdk_arg_value = rangeOne.min + ',' + rangeOne.max
|
| | | } else {
|
| | | rangeOne.sdk_arg_value = false;
|
| | | }
|
| | |
|
| | |
|
| | | }
|
| | | })
|
| | | let res = newV.find(item => {
|
| | | return JSON.stringify(item.sdkObj) == '{}'
|
| | | })
|
| | | if (!res) {
|
| | | this.isAdd = true
|
| | | this.hideDel = false
|
| | | } else {
|
| | | this.isAdd = false
|
| | | if (this.sdkGroup.length == 1) {
|
| | | this.hideDel = true
|
| | | } else {
|
| | | this.hideDel = false
|
| | | }
|
| | | }
|
| | | }
|
| | | },
|
| | | deep: true
|
| | | }
|
| | | // ruleList: {
|
| | | // handler(newVal, oldVal) {
|
| | | // debugger
|
| | | // this.editHandle(newVal)
|
| | | // }
|
| | |
|
| | | // }
|
| | | },
|
| | | mounted() {
|
| | | this.TaskMange.findAllSdk()
|
| | | //this.TaskMange.list1 = sdkJson.data;
|
| | |
|
| | | //this.editHandle(this.ruleList)
|
| | | },
|
| | | data() {
|
| | | return {
|
| | | // rule: {
|
| | | // sdk_id:'',
|
| | | // sdkObj: {},
|
| | | // polygonObj: {},
|
| | | // argDef: []
|
| | | // },
|
| | | hideDel: true,
|
| | | //isAddable: true,
|
| | | allPolygonData: [],
|
| | | group_id: '',
|
| | | baseSdkItem: {
|
| | | sdkObj: {},
|
| | | polygonObj: {},
|
| | | is_save_anyhow: true,
|
| | | rule_with_pre: '',
|
| | | isSpread: true,
|
| | | argDef: [],
|
| | | initAddOptional: false,
|
| | | defaultArg: [],
|
| | | optionalArg: [],
|
| | | optArg: [],
|
| | | optNames: [],
|
| | | isAddable: true
|
| | | },
|
| | | sdkGroup: [
|
| | | {
|
| | | sdkObj: {},
|
| | | polygonObj: {},
|
| | | is_save_anyhow: true,
|
| | | isSpread: true,
|
| | | argDef: [],
|
| | | initAddOptional: false,
|
| | | defaultArg: [],
|
| | | optionalArg: [],
|
| | | optArg: [],
|
| | | optNames: [],
|
| | | isAddable: true
|
| | | }
|
| | | ],
|
| | | polygonObj: {},
|
| | | isSpread: true,
|
| | | isAdd: false,
|
| | | tipColor: 'yellow',
|
| | | tasksTable: {},
|
| | | groupRules: [],
|
| | | sdksOption: [],
|
| | | baseRule: {
|
| | | camera_id: '',
|
| | | id: '',
|
| | | operator: '',
|
| | | operator_type: '',
|
| | | polygon_id: '',
|
| | | rule_with_pre: '',
|
| | | sdk_id: '',
|
| | | sdk_arg_alias: '',
|
| | | sdk_arg_value: '',
|
| | | sdk_arg_defaultValue: '',
|
| | | select_time_rule: '',
|
| | | sdk_arg_type: '',
|
| | | // task_id: "",
|
| | |
|
| | | polygonObj: {},
|
| | | taskObj: '',
|
| | |
|
| | | sdkObj: {},
|
| | | argObj: {},
|
| | | operatorObj: {},
|
| | | valueObj: {},
|
| | |
|
| | | sdksOptions: [],
|
| | | argsOptions: [],
|
| | | argType: '',
|
| | | computeOptions: [],
|
| | | valueOptions: [],
|
| | |
|
| | | sdkDesc: '',
|
| | | argDesc: '',
|
| | | operatorDesc: '',
|
| | | typeDesc: '',
|
| | | valueDesc: '',
|
| | |
|
| | | unit: '',
|
| | | value: '',
|
| | | valid: true
|
| | | }
|
| | | }
|
| | | },
|
| | | methods: {
|
| | | selConnection(sdkItem) {
|
| | | debugger
|
| | |
|
| | | },
|
| | | addSdkItem() {
|
| | | let itemTemp = JSON.parse(JSON.stringify(this.baseSdkItem));
|
| | | //初始化区域
|
| | | itemTemp.polygonObj = JSON.parse(JSON.stringify(this.allPolygonData[0]))
|
| | | this.selectPolygonOption(itemTemp)
|
| | | this.sdkGroup.push(itemTemp)
|
| | | },
|
| | | delConfigItem(index) {
|
| | | debugger
|
| | | // if(index != 0){
|
| | | // this.sdkGroup.splice(index,1);
|
| | | // }else{
|
| | | // //this.sdkGroup[0] = JSON.parse(JSON.stringify(this.baseSdkItem));
|
| | | // this.sdkGroup.splice(0,1,JSON.parse(JSON.stringify(this.baseSdkItem)));
|
| | | // }
|
| | |
|
| | | //删除逻辑:当只有一个算法时,删除会回到初始状态;有多个算法时,删除既移除整个算法项
|
| | | if (this.sdkGroup.length == 1) {
|
| | | let itemTemp = JSON.parse(JSON.stringify(this.baseSdkItem))
|
| | | itemTemp.polygonObj = JSON.parse(JSON.stringify(this.allPolygonData[0]));
|
| | | this.selectPolygonOption(itemTemp)
|
| | | this.sdkGroup.splice(index, 1, itemTemp)
|
| | | } else {
|
| | | this.sdkGroup.splice(index, 1)
|
| | | }
|
| | | },
|
| | | collapseLine(index) {
|
| | | // let one = this.sdkGroup.find(sdk=>{
|
| | | // return sdk.sdk_id == sdkId;
|
| | | // });
|
| | |
|
| | | this.sdkGroup[index].isSpread = !this.sdkGroup[index].isSpread
|
| | | },
|
| | | addOptionalArg(sdkItem) {
|
| | | debugger
|
| | | sdkItem.initAddOptional = false
|
| | | sdkItem.optArg.forEach(arg => {
|
| | | sdkItem.optNames.forEach(name => {
|
| | | if (arg.sort == name.sort) {
|
| | | name.isSelected = true
|
| | | }
|
| | | })
|
| | | }) //找到可选sdkItem.optNames的第一个对应的sdkItem.optionalArg push到sdkItem.optArg
|
| | | let oneNotSelected = sdkItem.optNames.find(name => !name.isSelected)
|
| | | if (oneNotSelected) {
|
| | | oneNotSelected.isSelected = true;
|
| | | }
|
| | |
|
| | | let argTemp = sdkItem.optionalArg.find(arg => {
|
| | | return arg.sort == oneNotSelected.sort
|
| | | })
|
| | |
|
| | | let copyArgTemp = JSON.parse(JSON.stringify(argTemp))
|
| | | if (copyArgTemp.type == 'option') {
|
| | | // let alias = copyArgTemp.alias;
|
| | | // console.log( this.VideoManageData.Dictionary[alias])
|
| | | // copyArgTemp.valueOptions = this.VideoManageData.Dictionary[alias].map(r => {
|
| | | // return {
|
| | | // name: r.name,
|
| | | // value: r.value
|
| | | // }
|
| | | // })
|
| | |
|
| | | this.setOptArgValueOptions(copyArgTemp)
|
| | | }
|
| | |
|
| | | if (copyArgTemp.default_value) {
|
| | | this.$set(copyArgTemp, 'sdk_arg_value', copyArgTemp.default_value)
|
| | | }
|
| | | sdkItem.optArg.push(copyArgTemp);
|
| | | if (sdkItem.optArg.length < sdkItem.optionalArg.length) {
|
| | | sdkItem.isAddable = true;
|
| | | } else {
|
| | | sdkItem.isAddable = false;
|
| | | }
|
| | | },
|
| | | delOptionalArg(sdkItem, optArgItem) {
|
| | | let index = sdkItem.optArg.findIndex(arg => arg.sort == optArgItem.sort)
|
| | | sdkItem.optArg.splice(index, 1)
|
| | | sdkItem.optNames.forEach(name => {
|
| | | if (name.sort == optArgItem.sort) {
|
| | | name.isSelected = false
|
| | | }
|
| | | })
|
| | | sdkItem.initAddOptional = sdkItem.optArg.length == 0 ? true : false;
|
| | | if (sdkItem.optArg.length < sdkItem.optionalArg.length) {
|
| | | sdkItem.isAddable = true;
|
| | | } else {
|
| | | sdkItem.isAddable = false;
|
| | | }
|
| | | },
|
| | | selOptionalArg(sdkItem, optArgItem) {
|
| | | debugger
|
| | | let newSort = 0
|
| | | sdkItem.optNames.forEach(name => {
|
| | | if (name.name == optArgItem.name) {
|
| | | //新切换的参数名
|
| | | name.isSelected = true
|
| | | newSort = name.sort
|
| | | } else if (name.sort == optArgItem.sort) {
|
| | | //切换前的参数名
|
| | | name.isSelected = false
|
| | | }
|
| | | })
|
| | | //根据新的参数sort找到其对应配置对象
|
| | | let argObj = sdkItem.optionalArg.find(arg => arg.sort == newSort)
|
| | | if (argObj.type == 'option') {
|
| | | this.setOptArgValueOptions(argObj);
|
| | | }
|
| | | debugger
|
| | | //替换新的参数配置对象
|
| | | sdkItem.optArg.forEach((arg, index) => {
|
| | | if (arg.sort == optArgItem.sort) {
|
| | | this.$set(sdkItem.optArg, index, JSON.parse(JSON.stringify(argObj)))
|
| | | }
|
| | | })
|
| | |
|
| | | console.log(argObj.valueOptions)
|
| | | },
|
| | | setOptArgValueOptions(optArg) {
|
| | | let alias = optArg.alias;
|
| | | console.log(this.VideoManageData.Dictionary[alias])
|
| | | optArg.valueOptions = this.VideoManageData.Dictionary[alias].map(r => {
|
| | | return {
|
| | | name: r.name,
|
| | | value: r.value
|
| | | }
|
| | | });
|
| | | },
|
| | | validateArgVal(sdkArgItem, e) {
|
| | | debugger
|
| | | if (typeof (sdkArgItem.sdk_arg_value) == 'string' && sdkArgItem.sdk_arg_value == '') {
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: '参数设定值不能为空!'
|
| | | })
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | return false
|
| | | }
|
| | | //输入非数字
|
| | |
|
| | | //范围是否合法
|
| | | if (sdkArgItem.range) {
|
| | | let leftHand = sdkArgItem.range.substr(0, 1)
|
| | | let rightHand = sdkArgItem.range.substr(sdkArgItem.range.length - 1, 1)
|
| | | let reg = /.*(\d+),(\d+).*/
|
| | | let res = sdkArgItem.range.match(reg)
|
| | | let min = Number(res[1]),
|
| | | max = Number(res[2])
|
| | | debugger
|
| | |
|
| | | //判断非区间类
|
| | | if (sdkArgItem.sdk_arg_value && sdkArgItem.operator != 'range') {
|
| | | if (leftHand == '(' && rightHand == ')') {
|
| | | if (
|
| | | Number(sdkArgItem.sdk_arg_value) <= min ||
|
| | | Number(sdkArgItem.sdk_arg_value) >= max
|
| | | ) {
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数设定值须大于${min},小于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | } else if (leftHand == '[' && rightHand == ')') {
|
| | | if (
|
| | | Number(sdkArgItem.sdk_arg_value) < min ||
|
| | | Number(sdkArgItem.sdk_arg_value) >= max
|
| | | ) {
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数设定值须大于等于${min},小于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | } else if (leftHand == '(' && rightHand == ']') {
|
| | | if (
|
| | | Number(sdkArgItem.sdk_arg_value) <= min ||
|
| | | Number(sdkArgItem.sdk_arg_value) > max
|
| | | ) {
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数设定值须大于${min},小于等于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | } else if (leftHand == '[' && rightHand == ']') {
|
| | | if (
|
| | | Number(sdkArgItem.sdk_arg_value) < min ||
|
| | | Number(sdkArgItem.sdk_arg_value) > max
|
| | | ) {
|
| | | sdkArgItem.valid = false
|
| | | this.showErrorColor(e)
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数设定值须大于等于${min},小于等于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | }
|
| | | } else if (sdkArgItem.min || sdkArgItem.max) {
|
| | | //判断区间类
|
| | | if (leftHand == '(' && rightHand == ')') {
|
| | | if (
|
| | | Number(sdkArgItem.min) <= min ||
|
| | | Number(sdkArgItem.min) >= max
|
| | | ) {
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数区间设定值须大于${min},小于${max}`
|
| | | });
|
| | | return false
|
| | | }
|
| | | } else if (leftHand == '[' && rightHand == ')') {
|
| | | if (Number(sdkArgItem.min) < min || Number(sdkArgItem.max) >= max) {
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数区间设定值须大于等于${min},小于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | } else if (leftHand == '(' && rightHand == ']') {
|
| | | if (Number(sdkArgItem.min) <= min || Number(sdkArgItem.max) > max) {
|
| | | sdkArgItem.valid = false
|
| | |
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数区间设定值须大于${min},小于等于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | } else if (leftHand == '[' && rightHand == ']') {
|
| | | if (Number(sdkArgItem.min) < min || Number(sdkArgItem.max) > max || Number(sdkArgItem.min) > max || Number(sdkArgItem.max) < min) {
|
| | | sdkArgItem.valid = false
|
| | | this.showErrorColor(e)
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: `参数区间设定值须大于等于${min},小于等于${max}`
|
| | | })
|
| | | return false
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | e.currentTarget.style.borderColor = ''
|
| | | return true
|
| | | },
|
| | | showErrorColor(e) {
|
| | | this.$nextTick(() => {
|
| | | e.currentTarget.style.borderColor = 'red'
|
| | | })
|
| | | },
|
| | | setSdksOptions(rule) {
|
| | | rule.sdksOptions = this.includeSdks
|
| | | },
|
| | | setOperator(rule) {
|
| | | rule.operator = rule.operatorObj.value
|
| | | rule.operatorDesc = rule.operatorObj.name
|
| | | },
|
| | | setValue(rule) {
|
| | | rule.valid = true
|
| | |
|
| | | if (rule.operator_type === 'option') {
|
| | | rule.sdk_arg_value = rule.valueObj.value ? rule.valueObj.value : ''
|
| | | rule.typeDesc = '被选项'
|
| | | rule.valueDesc = rule.valueObj.name ? rule.valueObj.name : ''
|
| | | } else {
|
| | | rule.typeDesc = '值'
|
| | | rule.valueDesc = rule.sdk_arg_value
|
| | | }
|
| | | this.valideArgValue(rule)
|
| | | },
|
| | | selectPolygonOption(rule) {
|
| | | debugger
|
| | | rule.polygon_id = rule.polygonObj.polygonId
|
| | | ? rule.polygonObj.polygonId
|
| | | : rule.polygon_id
|
| | | rule.camera_id = rule.polygonObj.cameraId
|
| | | ? rule.polygonObj.cameraId
|
| | | : rule.camera_id
|
| | | rule.group_id = this.group_id
|
| | | },
|
| | | //选择算法 resetArgs为true是添加为false是初始化编辑
|
| | | selectSDKOption(sdkItem, resetArgs) {
|
| | | debugger
|
| | | //sdkItem.sdk_id = sdkItem.sdkObj.id;
|
| | | if (resetArgs) {
|
| | | sdkItem.argDef = JSON.parse(sdkItem.sdkObj.argDef)
|
| | | console.log(sdkItem.argDef)
|
| | | //取出默认参数
|
| | | sdkItem.defaultArg = sdkItem.argDef.filter(
|
| | | arg => !arg.config.isOptional
|
| | | )
|
| | | //赋默认operator/值
|
| | | sdkItem.defaultArg.forEach(arg => {
|
| | | if (arg.operators.length == 1) {
|
| | | this.$set(arg, 'operator', arg.operators[0].operator)
|
| | |
|
| | | if (arg.operators[0].operator == 'range') {
|
| | | //区间值的处理
|
| | | debugger
|
| | | //this.$set(arg, 'sdk_arg_value', arg.min+','+arg.max)
|
| | | //this.$set(arg, 'sdk_arg_value', arg.range.substring(1,arg.range.length-1));
|
| | | }
|
| | | }
|
| | |
|
| | | if (arg.default_value) {
|
| | | //arg.sdk_arg_value = arg.default_value
|
| | | this.$set(arg, 'sdk_arg_value', arg.default_value)
|
| | | }
|
| | | })
|
| | | sdkItem.defaultArg
|
| | | //取出可选参数
|
| | | sdkItem.optionalArg = sdkItem.argDef.filter(
|
| | | arg => arg.config.isOptional
|
| | | )
|
| | | sdkItem.optNames = sdkItem.optionalArg.map(arg => ({
|
| | | name: arg.name,
|
| | | sort: arg.sort,
|
| | | isSelected: false
|
| | | }))
|
| | | debugger
|
| | | sdkItem.initAddOptional = sdkItem.optionalArg.length > 0 ? true : false
|
| | | sdkItem.optArg = []
|
| | | }
|
| | |
|
| | | //添加场景时,如果场景名称为空,就将选择的第一个算法名同步到场景名称
|
| | | if (this.sdkGroup[0] && resetArgs) {
|
| | | debugger
|
| | | this.$emit('sdkNameChange', this.sdkGroup[0].sdkObj.sdk_name)
|
| | | }
|
| | |
|
| | | // 选项切换时需要刷新arg菜单项
|
| | | this.selectArgTypeOption(sdkItem, resetArgs)
|
| | | },
|
| | |
|
| | | selectArgTypeOption(rule, resetAlias) {
|
| | | if (rule.sdk_arg_type == '') {
|
| | | return
|
| | | }
|
| | |
|
| | | if (resetAlias) {
|
| | | rule.sdk_arg_alias = ''
|
| | | }
|
| | |
|
| | | rule.argsOptions = rule.sdkObj.args
|
| | |
|
| | | // 根据arg类型显示参数, 当前全部归为 target
|
| | | // if (rule.sdkObj.args) {
|
| | | // rule.argsOptions = rule.sdkObj.args.filter(ele => {
|
| | | // return ele.arg_type === rule.sdk_arg_type
|
| | | // });
|
| | | // } else {
|
| | | // rule.argsOptions = [];
|
| | | // }
|
| | |
|
| | | rule.argObj = {}
|
| | | },
|
| | | //选择算法配置
|
| | | selOperator(rule) {
|
| | | debugger
|
| | | },
|
| | | selectArgsOption(rule, resetArgValue) {
|
| | | // rule.operator_type = "";
|
| | | // console.log(rule, '选择算法参数')
|
| | | rule.sdk_arg_alias = rule.argObj.alias
|
| | | rule.argDesc = rule.argObj.name
|
| | | rule.sdk_arg_defaultValue = rule.argObj.default_value
|
| | | rule.unit = rule.argObj.unit ? rule.argObj.unit : ''
|
| | | //rule.default_value = rule.argObj.default_value ? Number(rule.argObj.default_value) : 0;
|
| | |
|
| | | //console.log("置信度的默认值为",rule.sdk_arg_defaultValue)
|
| | | // 保存值类型
|
| | | rule.argType = rule.argObj.type
|
| | | if (rule.argType === 'option') {
|
| | | rule.operator_type = 'option'
|
| | | // 设置默认条件值
|
| | | this.VideoManageData.Dictionary.RULECOMPUTE.forEach(opt => {
|
| | | if (opt.value == '==') {
|
| | | rule.operatorObj = opt
|
| | | }
|
| | | })
|
| | |
|
| | | this.setOperator(rule)
|
| | |
|
| | | this.selectValueOption(rule)
|
| | | } else {
|
| | | // 设置默认条件值
|
| | | rule.operator_type = 'value'
|
| | | if (resetArgValue) {
|
| | | rule.sdk_arg_value = ''
|
| | |
|
| | | this.VideoManageData.Dictionary.RULECOMPUTE.forEach(opt => {
|
| | | if (opt.value == '>=') {
|
| | | rule.operatorObj = opt
|
| | | }
|
| | | })
|
| | | } else {
|
| | | // 编辑规则匹配
|
| | | this.VideoManageData.Dictionary.RULECOMPUTE.forEach(opt => {
|
| | | if (opt.value == rule.operator) {
|
| | | rule.operatorObj = opt
|
| | | }
|
| | | })
|
| | | }
|
| | | this.setOperator(rule)
|
| | | }
|
| | | },
|
| | | selectValueOption(rule) {
|
| | | if (rule.sdk_arg_alias === 'time_rule') {
|
| | | rule.valueOptions = this.VideoManageData.TimeRules.map(r => {
|
| | | return {
|
| | | name: r.name,
|
| | | value: r.id
|
| | | }
|
| | | })
|
| | | } else if (rule.sdk_arg_alias === 'compareBase') {
|
| | | rule.valueOptions = this.VideoManageData.TagList.map(r => {
|
| | | return {
|
| | | name: r.tableName,
|
| | | value: r.id
|
| | | }
|
| | | })
|
| | | } else {
|
| | | let ops = this.VideoManageData.Dictionary[rule.sdk_arg_alias]
|
| | | if (ops && ops instanceof Array) {
|
| | | rule.valueOptions = ops.map(r => {
|
| | | return {
|
| | | name: r.name,
|
| | | value: r.value
|
| | | }
|
| | | })
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | valideArgValue(rule) {
|
| | | if (rule.sdk_arg_value == '') {
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: '参数设定值不能为空!'
|
| | | })
|
| | | rule.valid = false
|
| | | return false
|
| | | }
|
| | |
|
| | | if (rule.argObj && rule.argObj.range) {
|
| | | // 如果设置了算法默认值,则判断不能小于该值
|
| | | if (rule.argObj.default_value) {
|
| | | if (
|
| | | parseInt(rule.sdk_arg_value) < parseInt(rule.sdk_arg_defaultValue)
|
| | | ) {
|
| | | rule.valid = false
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message:
|
| | | '参数设定值不能小于算法参数默认值 ' + rule.sdk_arg_defaultValue
|
| | | })
|
| | | rule.valueDesc = rule.sdk_arg_value = rule.argObj.default_value
|
| | | rule.valid = false
|
| | | return false
|
| | | }
|
| | | }
|
| | |
|
| | | // let re = /(?<=,).*?(?=]|\))/
|
| | | let re = /.*,(\d+)/
|
| | | let max = rule.argObj.range.match(re)[1]
|
| | | // console.log(max,'获取范围最大值')
|
| | | if (Number(rule.sdk_arg_value) > Number(max)) {
|
| | | rule.valid = false
|
| | | this.$notify({
|
| | | type: 'warning',
|
| | | message: '参数设定值不能大于' + max
|
| | | })
|
| | | return false
|
| | | }
|
| | | }
|
| | |
|
| | | return true
|
| | | },
|
| | | parataxis(rule_with_pre) {
|
| | | let relation = ''
|
| | | this.VideoManageData.Dictionary.RULECOMPUTEBETWEEN.forEach(pre => {
|
| | | if (pre.value === rule_with_pre) {
|
| | | relation = pre.name
|
| | | }
|
| | | })
|
| | |
|
| | | return relation
|
| | | },
|
| | |
|
| | | generatDescription() {
|
| | | let desc = ''
|
| | | this.groupRules.forEach((r, index) => {
|
| | | // console.log(r,index,'拼接')
|
| | | if (index === 0) {
|
| | | desc += r.sdkDesc + r.argDesc + r.operatorDesc + r.valueDesc + r.unit
|
| | | } else {
|
| | | desc +=
|
| | | ' ' +
|
| | | this.parataxis(r.rule_with_pre) +
|
| | | ' ' +
|
| | | r.sdkDesc +
|
| | | r.argDesc +
|
| | | r.operatorDesc +
|
| | | r.valueDesc +
|
| | | r.unit
|
| | | }
|
| | | })
|
| | | // console.log(desc,'拼接')
|
| | | return desc
|
| | | },
|
| | | createRule() {
|
| | | if (!this.isTemplate && this.Cameras.length > 0) {
|
| | | // 未选中摄像机或者未选中摄像机任务,不执行创建
|
| | | if (!this.Cameras[0].cameraId) return false
|
| | | }
|
| | | this.group_id = ''
|
| | | //this.addRule(0);
|
| | | },
|
| | |
|
| | | //清空配置并初始化
|
| | | cleanRule() {
|
| | | this.group_id = ''
|
| | | this.sdkGroup.splice(0, this.sdkGroup.length)
|
| | | this.addSdkItem();
|
| | | },
|
| | | addRule(index) {
|
| | | let newRule = JSON.parse(JSON.stringify(this.baseRule))
|
| | | newRule.sdksOptions = this.includeSdks
|
| | | if (!this.isLinkRule) {
|
| | | // 设置默认全部区域
|
| | | // if (!this.isTemplate) {
|
| | | // newRule.polygonObj = this.allPolygonData[0];
|
| | | // this.selectPolygonOption(newRule)
|
| | | // }
|
| | | // 设置算法
|
| | | // newRule.sdksOptions = this.includeSdks;
|
| | | // 设置默认算法
|
| | | // newRule.sdkObj = newRule.sdksOptions[0]
|
| | | // this.selectSDKOption(newRule, false)
|
| | | // newRule.sdk_arg_type = "target"
|
| | | // this.selectArgTypeOption(newRule, true)
|
| | | }
|
| | |
|
| | | // this.groupRules.push(newRule);
|
| | | // 插入到指定位置
|
| | | this.groupRules.splice(index + 1, 0, newRule)
|
| | | },
|
| | | editHandle(ruleTxt) {
|
| | | debugger
|
| | | // if (ruleTxt.length < 1) {
|
| | | // return
|
| | | // }
|
| | | let ruleInfo = JSON.parse(ruleTxt);
|
| | | debugger;
|
| | |
|
| | | //let ruleInfo = JSON.parse(ruleTxt)
|
| | | this.editRule(ruleInfo)
|
| | | // 如果是联动任务, 查询联动摄像机列表, 将树选中的列表更改为该条规则所需要的摄像机, 并备份当前的选中状态, 规则保存后恢复
|
| | | // if (this.isLinkRule) {
|
| | | // this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule = [...this.TreeDataPool.selectedNodes]
|
| | | // this.VideoRuleData.editLinkRuleRow = { ...ruleInfo }
|
| | |
|
| | | // this.TreeDataPool.selectedNodes = ruleInfo.group_rules.map(r => {
|
| | | // return r.camera_id
|
| | | // })
|
| | | // this.$nextTick(() => {
|
| | | // setTimeout(() => {
|
| | | // this.editRule(ruleInfo)
|
| | | // }, 1000)
|
| | | // })
|
| | | // } else {
|
| | | // this.editRule(ruleInfo)
|
| | | // }
|
| | | },
|
| | | editRule(ruleGroup) {
|
| | | debugger
|
| | | this.sdkGroup = []
|
| | | this.group_id = ''
|
| | |
|
| | | // this.sdkGroup = ruleGroup;
|
| | | // sdkGroup: [
|
| | | // {
|
| | | // sdkObj: {},
|
| | | // polygonObj: {},
|
| | | // is_save_anyhow: true,
|
| | | // isSpread: true,
|
| | | // argDef: [],
|
| | | // initAddOptional: false,
|
| | | // defaultArg: [],
|
| | | // optionalArg: [],
|
| | | // optArg: [],
|
| | | // optNames: []
|
| | | // }
|
| | | // ],
|
| | | ruleGroup.forEach(rule => {
|
| | | debugger
|
| | | let tempObj = {}
|
| | |
|
| | | if (rule.group_id && rule.group_id != '') {
|
| | | this.group_id = rule.group_id
|
| | | }
|
| | |
|
| | | // 填充区域选项列表
|
| | | this.allPolygonData.forEach(p => {
|
| | | if (p.polygonId === rule.polygon_id) {
|
| | | rule.polygonObj = p
|
| | | }
|
| | | })
|
| | |
|
| | | if (!rule.polygonObj) {
|
| | | rule.polygonObj = {
|
| | | cameraId: rule.camera_id,
|
| | | defence_state: 1,
|
| | | name: '未知区域',
|
| | | polygonId: rule.polygon_id
|
| | | }
|
| | | }
|
| | | console.log(rule)
|
| | |
|
| | | // 设置区域
|
| | | this.selectPolygonOption(rule)
|
| | |
|
| | | //算法对象,算法参数配置数组,(用于数据处理的)默认参数数组, 可选参数数组, 已配置的可选参数数组, (用于去重判断)存放可选参数名的数组
|
| | | let sdkObj = {},
|
| | | argDef = [],
|
| | | defaultArg = [],
|
| | | optionalArg = [],
|
| | | optArg = [],
|
| | | optNames = []
|
| | |
|
| | | sdkObj = this.TaskMange.list1.find(sdk => sdk.id == rule.sdk_id)
|
| | |
|
| | | argDef = JSON.parse(sdkObj.argDef)
|
| | | defaultArg = argDef.filter(arg => !arg.config.isOptional)
|
| | | optionalArg = argDef.filter(arg => arg.config.isOptional)
|
| | |
|
| | | rule.sdk_set.forEach(arg => {
|
| | | let optItem = optionalArg.find(oarg => {
|
| | | debugger
|
| | | if (oarg.sort == arg.sort) {
|
| | | return oarg
|
| | | }
|
| | | })
|
| | | if (optItem) {
|
| | | if (optItem.operators.length > 1) {
|
| | | optItem.operator = arg.operator
|
| | | //this.selOperator(optItem)
|
| | | }
|
| | |
|
| | | //赋值
|
| | | optItem.sdk_arg_value = arg.sdk_arg_value
|
| | | //if(arg.sdk_arg_value.indexOf(',')>0){
|
| | | //判断是否是多选值类型的参数
|
| | | let isMultiOne = optionalArg.find(oarg => oarg.sort == optItem.sort && optItem.config.isMulti)
|
| | | if (isMultiOne) {
|
| | | optItem.sdk_arg_value = arg.sdk_arg_value.split(',');
|
| | | }
|
| | |
|
| | | if (optItem.type == 'option') {
|
| | | this.setOptArgValueOptions(optItem)
|
| | | }
|
| | | optArg.push(optItem)
|
| | | } else {
|
| | | defaultArg.forEach(d => {
|
| | | if (d.sort == arg.sort) {
|
| | | if (arg.sdk_arg_value.indexOf(',') > 0) {
|
| | | //区间值
|
| | | d.min = arg.sdk_arg_value.split(',')[0];
|
| | | d.max = arg.sdk_arg_value.split(',')[1];
|
| | | d.operator = 'range'
|
| | | } else {
|
| | | d.sdk_arg_value = arg.sdk_arg_value
|
| | | }
|
| | | d.operator = arg.operator;
|
| | | }
|
| | | })
|
| | | }
|
| | | })
|
| | | optNames = optionalArg.map(arg => ({
|
| | | name: arg.name,
|
| | | sort: arg.sort,
|
| | | isSelected: false
|
| | | }))
|
| | |
|
| | | tempObj = {
|
| | | sdkObj,
|
| | | polygonObj: rule.polygonObj,
|
| | | rule_with_pre: rule.rule_with_pre,
|
| | | is_save_anyhow: rule.is_save_anyhow,
|
| | | isSpread: true,
|
| | | argDef,
|
| | | initAddOptional: false,
|
| | | optionalArg,
|
| | | optArg,
|
| | | defaultArg,
|
| | | optNames,
|
| | | isAddable: true,
|
| | | camera_id: rule.camera_id,
|
| | | polygon_id: rule.polygon_id
|
| | | }
|
| | | //回显是否显示添加可选参数
|
| | | tempObj.initAddOptional =
|
| | | tempObj.optArg.length == 0 && tempObj.optionalArg.length > 0
|
| | | ? true
|
| | | : false;
|
| | | debugger
|
| | | //回显是否显示可选参数添加按钮
|
| | | if (tempObj.optArg.length < tempObj.optionalArg.length) {
|
| | | tempObj.isAddable = true;
|
| | | } else {
|
| | | tempObj.isAddable = false;
|
| | | }
|
| | | //this.selectSDKOption(tempObj, false)
|
| | | debugger
|
| | | this.sdkGroup.push(tempObj)
|
| | | //设置算法
|
| | | })
|
| | | //this.$nextTick(() => {})
|
| | | },
|
| | | delRule(rule) {
|
| | | this.$confirm('提示:删除后,该条规则将失效,是否删除?', {
|
| | | center: true,
|
| | | cancelButtonClass: 'comfirm-class-cancle',
|
| | | confirmButtonClass: 'comfirm-class-sure'
|
| | | })
|
| | | .then(() => {
|
| | | deleteCameraRules({ groupId: rule.group_id }).then(res => {
|
| | | if (res && res.success) {
|
| | | this.$notify({
|
| | | type: 'success',
|
| | | message: '删除成功'
|
| | | })
|
| | | this.$emit('delete-rule')
|
| | | } else {
|
| | | this.$notify({
|
| | | type: 'error',
|
| | | message: '删除失败!'
|
| | | })
|
| | | }
|
| | | })
|
| | | })
|
| | | .catch(() => { })
|
| | | },
|
| | | submitRule() {
|
| | | debugger
|
| | | let groupRule = { rules: [] }
|
| | |
|
| | | let group_text = ''
|
| | | let validateFlag = false
|
| | |
|
| | | if (this.isTemplate) {
|
| | | groupRule.rules = this.groupRules.map(r => {
|
| | | return {
|
| | | sdk_id: r.sdk_id,
|
| | | sdk_arg_alias: r.sdk_arg_alias,
|
| | | operator: r.operator,
|
| | | operator_type: r.operator_type,
|
| | | sdk_arg_value: r.sdk_arg_value,
|
| | | sort: 1,
|
| | | rule_with_pre: r.rule_with_pre
|
| | | }
|
| | | })
|
| | | } else {
|
| | | //校验必填项
|
| | | let undefinished = this.sdkGroup.some((sdk, index) => {
|
| | | debugger
|
| | | //没有配置算法
|
| | | if (Object.keys(sdk.sdkObj).length == 0) {
|
| | | return sdk
|
| | | }
|
| | | //多于两项算法时,算法关系不能为空
|
| | | if (sdk.rule_with_pre === '' && index != 0) {
|
| | | return sdk
|
| | | }
|
| | | //表单提交前校验:所有算法的参数值不能为空,(有range的,要在range范围内)失焦时校验
|
| | | let defaultArgFlag = sdk.defaultArg.find(arg => !arg.sdk_arg_value)
|
| | | if (defaultArgFlag) {
|
| | | return sdk
|
| | | }
|
| | | //查找可选参数值是否都设置(多选值为数组类型)
|
| | | let optionalArgFlag = sdk.optArg.find(arg => {
|
| | | if (arg.sdk_arg_value instanceof Array) {
|
| | | if (arg.sdk_arg_value.length == 0) {
|
| | | return arg
|
| | | }
|
| | | } else {
|
| | | //区间类参数值最小,最大值是否都设置
|
| | | if (arg.operator == 'range') {
|
| | | debugger
|
| | | if (!arg.min.trim() && arg.max.trim()) {
|
| | | return arg
|
| | | }
|
| | | }
|
| | | if (!arg.sdk_arg_value) {
|
| | | return arg
|
| | | }
|
| | | }
|
| | | });
|
| | |
|
| | | if (optionalArgFlag) {
|
| | | return sdk
|
| | | }
|
| | | });
|
| | | if (undefinished) {
|
| | | this.$notify({
|
| | | type: 'error',
|
| | | message: '算法参数未完善,请完善后再保存'
|
| | | });
|
| | | return
|
| | | }
|
| | |
|
| | | //校验若算法关系为触发,则算法名不能重
|
| | | let sameSdk = this.sdkGroup.some((sdk, index) => {
|
| | | debugger
|
| | | if (sdk.index != 0 && sdk.rule_with_pre == '=>') {
|
| | | debugger
|
| | | if (sdk.sdkObj.id == this.sdkGroup[index - 1].sdkObj.id) {
|
| | | return sdk
|
| | | }
|
| | | }
|
| | | });
|
| | |
|
| | | if (sameSdk) {
|
| | | this.$notify({
|
| | | type: 'error',
|
| | | message: '算法关系为触发时,算法名不能重复'
|
| | | });
|
| | | return
|
| | | }
|
| | |
|
| | | if (!validateFlag && !sameSdk) {
|
| | | validateFlag = true
|
| | | }
|
| | |
|
| | | this.sdkGroup.forEach(sdk => {
|
| | | let tempObj = {
|
| | | sdk_id: sdk.sdkObj.id,
|
| | | camera_id: sdk.camera_id,
|
| | | group_id: '',
|
| | | is_save_anyhow: sdk.is_save_anyhow,
|
| | | polygon_id: sdk.polygon_id,
|
| | | rule_with_pre: sdk.rule_with_pre,
|
| | | sdk_set: []
|
| | | }
|
| | |
|
| | | let defaultArgs = sdk.defaultArg.map(arg => ({
|
| | | operator: arg.operator,
|
| | | operator_type: arg.type,
|
| | | sdk_arg_alias: arg.alias,
|
| | | sdk_arg_value: arg.sdk_arg_value,
|
| | | sort: arg.sort
|
| | | }))
|
| | |
|
| | | let defaultArgDesc = '( '
|
| | | sdk.defaultArg.forEach(arg => {
|
| | | if (arg.operator == 'range') {
|
| | | let valRange = '';
|
| | | debugger
|
| | | valRange = arg.sdk_arg_value.replace(',', '-');
|
| | | defaultArgDesc += `${arg.name}${arg.operators[0].name}${valRange}${arg.unit || ''}, `
|
| | | } else {
|
| | | defaultArgDesc += `${arg.name}${arg.operators[0].name}${
|
| | | arg.sdk_arg_value
|
| | | }${arg.unit || ''}, `
|
| | | }
|
| | |
|
| | | });
|
| | | debugger;
|
| | | defaultArgDesc = defaultArgDesc.substring(0, defaultArgDesc.length - 2)
|
| | | //defaultArgDesc = defaultArgDesc.substring(0,defaultArgDesc.length-3)+defaultArgDesc.substring(defaultArgDesc.length-1,defaultArgDesc.length);
|
| | | //defaultArgDesc = defaultArgDesc.substring(0,defaultArgDesc.length-1);
|
| | |
|
| | | //处理可选项参数
|
| | |
|
| | | let optArgs = sdk.optArg.map(arg => ({
|
| | | operator: arg.operator,
|
| | | operator_type: arg.type,
|
| | | sdk_arg_alias: arg.alias,
|
| | | sdk_arg_value: arg.sdk_arg_value,
|
| | | sort: arg.sort
|
| | | }));
|
| | | //将多选项的值拼成字符串
|
| | | optArgs.forEach(one => {
|
| | | if (one.sdk_arg_value instanceof Array) {
|
| | | one.sdk_arg_value = one.sdk_arg_value.join();
|
| | | }
|
| | | });
|
| | | let optArgDesc = ' '
|
| | | sdk.optArg.forEach(arg => {
|
| | | let val = '';
|
| | | let valRange = '';
|
| | |
|
| | |
|
| | | //处理下拉选值类型
|
| | | if (arg.type == 'option') {
|
| | | if (arg.sdk_arg_value instanceof Array) {
|
| | | //多选值
|
| | | let multiNames = '';
|
| | | arg.sdk_arg_value.forEach(val => {
|
| | | let opV = arg.valueOptions.find(opt => opt.value == val);
|
| | | multiNames += opV.name + ' ';
|
| | | })
|
| | | val = multiNames;
|
| | |
|
| | | } else {
|
| | | let res = arg.valueOptions.find(
|
| | | opt => opt.value == arg.sdk_arg_value
|
| | | );
|
| | |
|
| | | val = res.name;
|
| | | }
|
| | | //optArgDesc += `,${arg.name}${arg.operators[0].operator}${val}${arg.unit || ''}, `
|
| | | } else {
|
| | | //optArgDesc += `,${arg.name}${arg.operators[0].operator}${ arg.sdk_arg_value }${arg.unit || ''}, `
|
| | | }
|
| | |
|
| | | let operatorSelected = arg.operators.find(opr => opr.operator == arg.operator)
|
| | | optArgDesc += `,${arg.name}${operatorSelected.name}${
|
| | | arg.type == 'option' ? val : arg.sdk_arg_value
|
| | | }${arg.unit || ''}, `
|
| | | })
|
| | | optArgDesc = optArgDesc.substring(0, optArgDesc.length - 2) + optArgDesc.substring(optArgDesc.length - 1, optArgDesc.length);
|
| | | optArgDesc += ')'
|
| | | tempObj.sdk_set = defaultArgs.concat(optArgs)
|
| | |
|
| | | groupRule.rules.push(tempObj)
|
| | |
|
| | | let rule_with_pre = ''
|
| | | if (sdk.rule_with_pre) {
|
| | | switch (sdk.rule_with_pre) {
|
| | | case '&&':
|
| | | rule_with_pre = ' and '
|
| | | break
|
| | | case '||':
|
| | | rule_with_pre = ' or '
|
| | | break
|
| | | case '=>':
|
| | | rule_with_pre = ' -> '
|
| | | break
|
| | | default:
|
| | | rule_with_pre = ''
|
| | | }
|
| | | }
|
| | | debugger;
|
| | | group_text += `${rule_with_pre ? "<br/>" + rule_with_pre + "<br/>" : ""} <span style="background-color:RGB(183,183,183);">${
|
| | | sdk.sdkObj.sdk_name
|
| | | }</span> ${
|
| | | sdk.polygonObj.name
|
| | | } ${defaultArgDesc}${optArgDesc}`;
|
| | |
|
| | | if (
|
| | | group_text.charAt(group_text.length - 3) == ',' &&
|
| | | group_text.charAt(group_text.length - 2) == ' ' &&
|
| | | group_text.charAt(group_text.length - 1) == ')'
|
| | | ) {
|
| | | group_text =
|
| | | group_text.substring(0, group_text.length - 3) +
|
| | | group_text.substring(group_text.length - 2, group_text.length)
|
| | | }
|
| | | debugger
|
| | | })
|
| | | console.log(group_text)
|
| | | }
|
| | |
|
| | | groupRule.text = group_text
|
| | | groupRule.id = this.group_id
|
| | | return groupRule
|
| | |
|
| | | if (this.isLinkRule) {
|
| | | // 判断规则中至少包含两摄像机
|
| | | let cameraIds = Array.from(
|
| | | new Set(
|
| | | this.sdkGroup.map(r => {
|
| | | return r.camera_id
|
| | | })
|
| | | )
|
| | | )
|
| | | if (cameraIds.length < 2) {
|
| | | this.$notify({
|
| | | type: 'error',
|
| | | //message: '需要2个不同摄像机才能组成联动规则'
|
| | | message: '需要至少2个不同摄像机才能组成联动场景'
|
| | | })
|
| | | return
|
| | | }
|
| | |
|
| | | // 联动规则编辑后,恢复之前选中的摄像机
|
| | | // if (this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule.length) {
|
| | | // this.TreeDataPool.selectedNodes = this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule
|
| | | // this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule = []
|
| | | // }
|
| | | }
|
| | | //if(validateFlag){
|
| | | this.onSubmitRule(payload)
|
| | | //}
|
| | | }
|
| | | }
|
| | | }
|
| | | </script>
|
| | |
|
| | | <style lang="scss">
|
| | | .edit-rules-box {
|
| | | width: 100%;
|
| | | padding: 0px;
|
| | | box-sizing: border-box;
|
| | | .sub-rules-box {
|
| | | width: 71%;
|
| | | min-width: 1127.4px;
|
| | | min-height: 50px;
|
| | | border-top: 1px solid #eee;
|
| | | padding-top: 7px;
|
| | |
|
| | | box-sizing: border-box;
|
| | | padding-bottom: 38px;
|
| | | .task-rules-button {
|
| | | text-align: right;
|
| | | margin: 15px;
|
| | | }
|
| | | .config-item {
|
| | | background: #f8f9f8;
|
| | | padding: 15px 25px;
|
| | | margin-bottom: 52px;
|
| | | position: relative;
|
| | | .el-select {
|
| | | width: 225px !important;
|
| | | }
|
| | | .init-sdk {
|
| | | margin-right: 30px;
|
| | | }
|
| | | .connection {
|
| | | background: #fff;
|
| | | position: absolute;
|
| | | width: 100%;
|
| | | top: -40px;
|
| | | }
|
| | | .top-line {
|
| | | height: 30px;
|
| | | .left {
|
| | | float: left;
|
| | | display: flex;
|
| | | }
|
| | | .right {
|
| | | float: right;
|
| | | cursor: pointer;
|
| | | .del {
|
| | | margin-right: 10px;
|
| | | color: rgb(231, 76, 60);
|
| | | }
|
| | | .collapse {
|
| | | font-size: 13px;
|
| | | display: inline-block;
|
| | | padding: 5px;
|
| | | cursor: pointer;
|
| | | }
|
| | | }
|
| | | }
|
| | | .argums {
|
| | | position: relative;
|
| | | // width: calc(100% - 25px);
|
| | | // top: 43px;
|
| | | // left: 0;
|
| | | // padding-left: 25px;
|
| | | // background: #f8f9f8;
|
| | | .argums-item {
|
| | | display: flex;
|
| | | align-items: center;
|
| | | margin: 7px 0;
|
| | | .arg-name,
|
| | | .operator-name {
|
| | | margin-right: 30px;
|
| | | }
|
| | | .arg-val {
|
| | | width: 245px;
|
| | | span {
|
| | | margin-left: 6px;
|
| | | }
|
| | | .range-min,
|
| | | .range-max {
|
| | | width: 88px;
|
| | | .el-input__inner {
|
| | | height: 28px;
|
| | | }
|
| | | }
|
| | | .devide {
|
| | | display: inline-block;
|
| | | width: 30px;
|
| | | height: 1px;
|
| | | background: #c5c5c5;
|
| | | vertical-align: top;
|
| | | margin: 14px 10px 0;
|
| | | }
|
| | | }
|
| | | }
|
| | | .el-input {
|
| | | width: 225px;
|
| | | }
|
| | | }
|
| | | }
|
| | | .btn-add {
|
| | | margin: 0 25px 15px;
|
| | | margin-top: -38px;
|
| | | .el-button {
|
| | | width: 370px;
|
| | | cursor: pointer;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | .el-button--text {
|
| | | text-decoration: unset;
|
| | | }
|
| | | .el-input.is-disabled .el-input__inner {
|
| | | background: #fafafa;
|
| | | color: #606266;
|
| | | }
|
| | | p {
|
| | | text-align: left;
|
| | | // padding: 10px;
|
| | | box-sizing: border-box;
|
| | | }
|
| | |
|
| | | .task-blank {
|
| | | float: left;
|
| | | font-family: PingFangSC-Regular;
|
| | | font-size: 12px;
|
| | | color: #cccccc;
|
| | | margin-top: 5px;
|
| | | }
|
| | |
|
| | | .btn {
|
| | | cursor: pointer;
|
| | | color: #3d68e1;
|
| | | margin-left: 10px;
|
| | | font-size: 14px;
|
| | | }
|
| | | }
|
| | | </style>
|
| | | <template> |
| | | <div class="edit-rules-box"> |
| | | <p style="padding: 0"> |
| | | <b style="font-size: 14px; line-height: 28px;">策略配置</b> |
| | | </p> |
| | | <div class="sub-rules-box"> |
| | | <div style=" text-align: left;"> |
| | | <div class="sdk-group"> |
| | | <transition-group name="fade" mode="out-in" appear> |
| | | <div |
| | | class="config-item" |
| | | :class="{ init: index == 0 }" |
| | | v-cloak |
| | | v-for="(sdkItem, index) in sdkGroup" |
| | | :key="sdkItem.id" |
| | | > |
| | | <div class="connection" v-if="index !== 0"> |
| | | <el-select |
| | | v-model="sdkItem.rule_with_pre" |
| | | size="mini" |
| | | placeholder="选关系" |
| | | @change="selConnection(sdkItem)" |
| | | > |
| | | <el-option value="&&" title="and/且" label="and/且"></el-option> |
| | | <el-option value="||" title="or/或" label="or/或"></el-option> |
| | | <el-option value="=>" title="—>/触发" label="—>/触发"></el-option> |
| | | </el-select> |
| | | <el-checkbox |
| | | v-show="sdkItem.rule_with_pre == '=>'" |
| | | v-model="sdkItem.is_save_anyhow" |
| | | style="margin-left:30px" |
| | | >保存过程数据</el-checkbox> |
| | | </div> |
| | | <div class="top-line"> |
| | | <div class="left"> |
| | | <div class="init-sdk"> |
| | | <el-select |
| | | v-model="sdkItem.sdkObj" |
| | | value-key="id" |
| | | placeholder="选择算法" |
| | | size="mini" |
| | | @change="selectSDKOption(sdkItem, true, index)" |
| | | > |
| | | <el-option |
| | | v-for="item in TaskMange.list1" |
| | | :key="item.id" |
| | | :label="item.sdk_name" |
| | | :value="item" |
| | | :title="item.sdk_name" |
| | | v-show="!item.del_flag" |
| | | ></el-option> |
| | | </el-select> |
| | | </div> |
| | | <div class="init-polygon"> |
| | | <el-select |
| | | v-model="sdkItem.polygonObj" |
| | | v-if="!isTemplate" |
| | | value-key="polygonId" |
| | | placeholder="选择区域" |
| | | size="mini" |
| | | @change="selectPolygonOption(sdkItem)" |
| | | > |
| | | <el-option |
| | | v-for="subitem in allPolygonData" |
| | | :key="subitem.id" |
| | | :label="subitem.name" |
| | | :value="subitem" |
| | | :title="subitem.name" |
| | | ></el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="right"> |
| | | <span class="del" v-show="!hideDel" @click="delConfigItem(index)"> |
| | | <i class="iconfont iconshanchu"></i> |
| | | </span> |
| | | <span class="collapse" @click="collapseLine(index)"> |
| | | <i |
| | | :class=" |
| | | sdkItem.isSpread |
| | | ? 'el-icon-arrow-up' |
| | | : 'el-icon-arrow-down' |
| | | " |
| | | ></i> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="argums derive-line" v-show="sdkItem.isSpread"> |
| | | <div v-for="(arg, index) in sdkItem.defaultArg" :key="arg.sort"> |
| | | <div class="argums-item" v-if="arg.config.isShow"> |
| | | <div class="arg-name"> |
| | | <el-select v-model="arg.name" size="mini" :disabled="true"> |
| | | <el-option :label="arg.name" :title="arg.name" :value="arg"></el-option> |
| | | </el-select> |
| | | </div> |
| | | <div class="operator-name"> |
| | | <el-select |
| | | :disabled="arg.operators.length==1" |
| | | v-model="arg.operator" |
| | | size="mini" |
| | | @change="selOperator(sdkItem)" |
| | | > |
| | | <el-option |
| | | v-for="operator in arg.operators" |
| | | :key="operator.operator" |
| | | :value="operator.operator" |
| | | :label="operator.name" |
| | | :title="operator.name" |
| | | ></el-option> |
| | | </el-select> |
| | | </div> |
| | | <div class="arg-val"> |
| | | <div v-if="arg.operator == 'range'"> |
| | | <el-input |
| | | class="range-min" |
| | | v-model="arg.min" |
| | | @blur="validateArgVal(arg, $event)" |
| | | ></el-input> |
| | | <span class="devide"></span> |
| | | <el-input |
| | | class="range-max" |
| | | v-model="arg.max" |
| | | @blur="validateArgVal(arg, $event)" |
| | | ></el-input> |
| | | <span>{{ arg.unit }}</span> |
| | | </div> |
| | | <div v-else> |
| | | <el-select v-if="arg.type == 'option'" v-model="arg.sdk_arg_value"> |
| | | <el-option>请选择</el-option> |
| | | </el-select> |
| | | <el-input |
| | | v-if="arg.type == 'value'" |
| | | v-model="arg.sdk_arg_value" |
| | | :placeholder=" |
| | | arg.default_value ? arg.default_value : '' |
| | | " |
| | | size="mini" |
| | | :style="{ borderColor: tipColor }" |
| | | @blur="validateArgVal(arg, $event)" |
| | | ></el-input> |
| | | <span>{{ arg.unit }}</span> |
| | | </div> |
| | | </div> |
| | | <div |
| | | class="optional" |
| | | v-if=" |
| | | sdkItem.initAddOptional && |
| | | index == sdkItem.defaultArg.length - 1 |
| | | " |
| | | > |
| | | <span class="btn" @click="addOptionalArg(sdkItem)"> |
| | | <i class="iconfont iconhebingxingzhuang" style="font-size:16px"></i> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div |
| | | class="argums-item optional-line" |
| | | v-for="optArgItem in sdkItem.optArg" |
| | | :key="optArgItem.sort" |
| | | > |
| | | <div class="arg-name"> |
| | | <el-input |
| | | v-if="sdkItem.optNames.length == 1" |
| | | v-model="sdkItem.optNames[0].name" |
| | | size="mini" |
| | | :disabled="true" |
| | | ></el-input> |
| | | <el-select |
| | | v-if="sdkItem.optNames.length > 1" |
| | | v-model="optArgItem.name" |
| | | size="mini" |
| | | @change="selOptionalArg(sdkItem, optArgItem)" |
| | | > |
| | | <el-option |
| | | v-for="optName in sdkItem.optNames" |
| | | :disabled="optName.isSelected" |
| | | :key="optName.sort" |
| | | :label="optName.name" |
| | | :title="optName.name" |
| | | :value="optName.name" |
| | | ></el-option> |
| | | </el-select> |
| | | </div> |
| | | <div class="operator-name"> |
| | | <el-select |
| | | v-model="optArgItem.operator" |
| | | size="mini" |
| | | @change="selOperator(optArgItem)" |
| | | > |
| | | <el-option |
| | | v-for="operatorItem in optArgItem.operators" |
| | | :key="operatorItem.operator" |
| | | :value="operatorItem.operator" |
| | | :label="operatorItem.name" |
| | | :title="operatorItem.name" |
| | | ></el-option> |
| | | </el-select> |
| | | </div> |
| | | <div class="arg-val"> |
| | | <el-select |
| | | v-if="optArgItem.type == 'option'" |
| | | v-model="optArgItem.sdk_arg_value" |
| | | :multiple="optArgItem.config.isMulti" |
| | | collapse-tags |
| | | size="mini" |
| | | > |
| | | <el-option |
| | | v-for="one in optArgItem.valueOptions" |
| | | :key="one.value" |
| | | :value="one.value" |
| | | :label="one.name" |
| | | :title="one.name" |
| | | ></el-option> |
| | | </el-select> |
| | | <el-input |
| | | v-if="optArgItem.type == 'value'" |
| | | v-model="optArgItem.sdk_arg_value" |
| | | size="mini" |
| | | @blur="$event => validateArgVal(optArgItem, $event)" |
| | | ></el-input> |
| | | <span>{{ optArgItem.unit }}</span> |
| | | </div> |
| | | <div class="optional"> |
| | | <span class="btn" @click="addOptionalArg(sdkItem)" v-show="sdkItem.isAddable"> |
| | | <i class="iconfont iconhebingxingzhuang" style="font-size:16px"></i> |
| | | </span> |
| | | <span class="btn" @click="delOptionalArg(sdkItem, optArgItem)"> |
| | | <i class="iconfont iconshanchu11" style="font-size:16px"></i> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </transition-group> |
| | | </div> |
| | | <div class="btn-add" v-show="isAdd && this.sdkGroup.length < 4"> |
| | | <el-button size="mini" @click="addSdkItem">+ 添加算法</el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import { |
| | | deleteCameraRules, |
| | | updateRuleDefence, |
| | | updateAlarmLevel |
| | | } from '@/api/camera' |
| | | |
| | | export default { |
| | | name: 'SceneRuleEditor', |
| | | props: { |
| | | Cameras: { |
| | | type: Array, |
| | | default: () => { |
| | | return [] |
| | | } |
| | | }, |
| | | isTemplate: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | isLinkRule: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | includeSdks: { |
| | | type: Array |
| | | }, |
| | | ruleList: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | onSubmitRule: { |
| | | type: Function, |
| | | default: () => false |
| | | } |
| | | }, |
| | | |
| | | watch: { |
| | | Cameras: { |
| | | handler(n, o) { |
| | | |
| | | let polygon = [] |
| | | let cameras = [...n] |
| | | |
| | | for (let i = 0; i < cameras.length; i++) { |
| | | let polyOpt = cameras[i].polygonData.map(p => { |
| | | return { |
| | | defence_state: p.defence_state, |
| | | polygonId: p.id, |
| | | name: this.isLinkRule |
| | | ? cameras[i].cameraName + ':' + p.name |
| | | : p.name, |
| | | |
| | | cameraId: cameras[i].cameraId |
| | | } |
| | | }) |
| | | polygon = polygon.concat(polyOpt) |
| | | |
| | | this.allPolygonData = polygon |
| | | } |
| | | }, |
| | | deep: true |
| | | }, |
| | | sdkGroup: { |
| | | handler(newV, oldV) { |
| | | if (newV) { |
| | | |
| | | newV.forEach(sdk => { |
| | | let rangeOne = sdk.defaultArg.find( |
| | | arg => arg.operators[0].operator == 'range' |
| | | ) |
| | | if (rangeOne) { |
| | | |
| | | if (rangeOne.min.trim() && rangeOne.max.trim()) { |
| | | if (Number(rangeOne.min) >= Number(rangeOne.max)) { |
| | | this.$notify({ |
| | | type: 'error', |
| | | message: '区间左侧不能大于或等于区间右侧的值' |
| | | }) |
| | | rangeOne.valid = false |
| | | } |
| | | rangeOne.sdk_arg_value = rangeOne.min + ',' + rangeOne.max |
| | | } else { |
| | | rangeOne.sdk_arg_value = false; |
| | | } |
| | | |
| | | |
| | | } |
| | | }) |
| | | let res = newV.find(item => { |
| | | return JSON.stringify(item.sdkObj) == '{}' |
| | | }) |
| | | if (!res) { |
| | | this.isAdd = true |
| | | this.hideDel = false |
| | | } else { |
| | | this.isAdd = false |
| | | if (this.sdkGroup.length == 1) { |
| | | this.hideDel = true |
| | | } else { |
| | | this.hideDel = false |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | deep: true |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.TaskMange.findAllSdk() |
| | | }, |
| | | data() { |
| | | return { |
| | | hideDel: true, |
| | | //isAddable: true, |
| | | allPolygonData: [], |
| | | group_id: '', |
| | | baseSdkItem: { |
| | | sdkObj: {}, |
| | | polygonObj: {}, |
| | | is_save_anyhow: true, |
| | | rule_with_pre: '', |
| | | isSpread: true, |
| | | argDef: [], |
| | | initAddOptional: false, |
| | | defaultArg: [], |
| | | optionalArg: [], |
| | | optArg: [], |
| | | optNames: [], |
| | | isAddable: true |
| | | }, |
| | | sdkGroup: [ |
| | | { |
| | | sdkObj: {}, |
| | | polygonObj: {}, |
| | | is_save_anyhow: true, |
| | | isSpread: true, |
| | | argDef: [], |
| | | initAddOptional: false, |
| | | defaultArg: [], |
| | | optionalArg: [], |
| | | optArg: [], |
| | | optNames: [], |
| | | isAddable: true |
| | | } |
| | | ], |
| | | polygonObj: {}, |
| | | isSpread: true, |
| | | isAdd: false, |
| | | tipColor: 'yellow', |
| | | tasksTable: {}, |
| | | groupRules: [], |
| | | sdksOption: [], |
| | | baseRule: { |
| | | camera_id: '', |
| | | id: '', |
| | | operator: '', |
| | | operator_type: '', |
| | | polygon_id: '', |
| | | rule_with_pre: '', |
| | | sdk_id: '', |
| | | sdk_arg_alias: '', |
| | | sdk_arg_value: '', |
| | | sdk_arg_defaultValue: '', |
| | | select_time_rule: '', |
| | | sdk_arg_type: '', |
| | | // task_id: "", |
| | | |
| | | polygonObj: {}, |
| | | taskObj: '', |
| | | |
| | | sdkObj: {}, |
| | | argObj: {}, |
| | | operatorObj: {}, |
| | | valueObj: {}, |
| | | |
| | | sdksOptions: [], |
| | | argsOptions: [], |
| | | argType: '', |
| | | computeOptions: [], |
| | | valueOptions: [], |
| | | |
| | | sdkDesc: '', |
| | | argDesc: '', |
| | | operatorDesc: '', |
| | | typeDesc: '', |
| | | valueDesc: '', |
| | | |
| | | unit: '', |
| | | value: '', |
| | | valid: true |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | selConnection(sdkItem) { |
| | | |
| | | |
| | | }, |
| | | addSdkItem() { |
| | | let itemTemp = JSON.parse(JSON.stringify(this.baseSdkItem)); |
| | | //初始化区域 |
| | | itemTemp.polygonObj = JSON.parse(JSON.stringify(this.allPolygonData[0])) |
| | | this.selectPolygonOption(itemTemp) |
| | | this.sdkGroup.push(itemTemp) |
| | | }, |
| | | delConfigItem(index) { |
| | | //删除逻辑:当只有一个算法时,删除会回到初始状态;有多个算法时,删除既移除整个算法项 |
| | | if (this.sdkGroup.length == 1) { |
| | | let itemTemp = JSON.parse(JSON.stringify(this.baseSdkItem)) |
| | | itemTemp.polygonObj = JSON.parse(JSON.stringify(this.allPolygonData[0])); |
| | | this.selectPolygonOption(itemTemp) |
| | | this.sdkGroup.splice(index, 1, itemTemp) |
| | | } else { |
| | | this.sdkGroup.splice(index, 1) |
| | | } |
| | | }, |
| | | collapseLine(index) { |
| | | this.sdkGroup[index].isSpread = !this.sdkGroup[index].isSpread |
| | | }, |
| | | addOptionalArg(sdkItem) { |
| | | |
| | | sdkItem.initAddOptional = false |
| | | sdkItem.optArg.forEach(arg => { |
| | | sdkItem.optNames.forEach(name => { |
| | | if (arg.sort == name.sort) { |
| | | name.isSelected = true |
| | | } |
| | | }) |
| | | }) //找到可选sdkItem.optNames的第一个对应的sdkItem.optionalArg push到sdkItem.optArg |
| | | let oneNotSelected = sdkItem.optNames.find(name => !name.isSelected) |
| | | if (oneNotSelected) { |
| | | oneNotSelected.isSelected = true; |
| | | } |
| | | |
| | | let argTemp = sdkItem.optionalArg.find(arg => { |
| | | return arg.sort == oneNotSelected.sort |
| | | }) |
| | | |
| | | let copyArgTemp = JSON.parse(JSON.stringify(argTemp)) |
| | | if (copyArgTemp.type == 'option') { |
| | | this.setOptArgValueOptions(copyArgTemp) |
| | | } |
| | | |
| | | if (copyArgTemp.default_value) { |
| | | this.$set(copyArgTemp, 'sdk_arg_value', copyArgTemp.default_value) |
| | | } |
| | | sdkItem.optArg.push(copyArgTemp); |
| | | if (sdkItem.optArg.length < sdkItem.optionalArg.length) { |
| | | sdkItem.isAddable = true; |
| | | } else { |
| | | sdkItem.isAddable = false; |
| | | } |
| | | }, |
| | | delOptionalArg(sdkItem, optArgItem) { |
| | | let index = sdkItem.optArg.findIndex(arg => arg.sort == optArgItem.sort) |
| | | sdkItem.optArg.splice(index, 1) |
| | | sdkItem.optNames.forEach(name => { |
| | | if (name.sort == optArgItem.sort) { |
| | | name.isSelected = false |
| | | } |
| | | }) |
| | | sdkItem.initAddOptional = sdkItem.optArg.length == 0 ? true : false; |
| | | if (sdkItem.optArg.length < sdkItem.optionalArg.length) { |
| | | sdkItem.isAddable = true; |
| | | } else { |
| | | sdkItem.isAddable = false; |
| | | } |
| | | }, |
| | | selOptionalArg(sdkItem, optArgItem) { |
| | | |
| | | let newSort = 0 |
| | | sdkItem.optNames.forEach(name => { |
| | | if (name.name == optArgItem.name) { |
| | | //新切换的参数名 |
| | | name.isSelected = true |
| | | newSort = name.sort |
| | | } else if (name.sort == optArgItem.sort) { |
| | | //切换前的参数名 |
| | | name.isSelected = false |
| | | } |
| | | }) |
| | | //根据新的参数sort找到其对应配置对象 |
| | | let argObj = sdkItem.optionalArg.find(arg => arg.sort == newSort) |
| | | if (argObj.type == 'option') { |
| | | this.setOptArgValueOptions(argObj); |
| | | } |
| | | |
| | | //替换新的参数配置对象 |
| | | sdkItem.optArg.forEach((arg, index) => { |
| | | if (arg.sort == optArgItem.sort) { |
| | | this.$set(sdkItem.optArg, index, JSON.parse(JSON.stringify(argObj))) |
| | | } |
| | | }) |
| | | |
| | | console.log(argObj.valueOptions) |
| | | }, |
| | | setOptArgValueOptions(optArg) { |
| | | let alias = optArg.alias; |
| | | console.log(this.VideoManageData.Dictionary[alias]) |
| | | optArg.valueOptions = this.VideoManageData.Dictionary[alias].map(r => { |
| | | return { |
| | | name: r.name, |
| | | value: r.value |
| | | } |
| | | }); |
| | | }, |
| | | validateArgVal(sdkArgItem, e) { |
| | | |
| | | if (typeof (sdkArgItem.sdk_arg_value) == 'string' && sdkArgItem.sdk_arg_value == '') { |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: '参数设定值不能为空!' |
| | | }) |
| | | sdkArgItem.valid = false |
| | | |
| | | return false |
| | | } |
| | | //输入非数字 |
| | | |
| | | //范围是否合法 |
| | | if (sdkArgItem.range) { |
| | | let leftHand = sdkArgItem.range.substr(0, 1) |
| | | let rightHand = sdkArgItem.range.substr(sdkArgItem.range.length - 1, 1) |
| | | let reg = /.*(\d+),(\d+).*/ |
| | | let res = sdkArgItem.range.match(reg) |
| | | let min = Number(res[1]), |
| | | max = Number(res[2]) |
| | | |
| | | |
| | | //判断非区间类 |
| | | if (sdkArgItem.sdk_arg_value && sdkArgItem.operator != 'range') { |
| | | if (leftHand == '(' && rightHand == ')') { |
| | | if ( |
| | | Number(sdkArgItem.sdk_arg_value) <= min || |
| | | Number(sdkArgItem.sdk_arg_value) >= max |
| | | ) { |
| | | sdkArgItem.valid = false |
| | | |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数设定值须大于${min},小于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } else if (leftHand == '[' && rightHand == ')') { |
| | | if ( |
| | | Number(sdkArgItem.sdk_arg_value) < min || |
| | | Number(sdkArgItem.sdk_arg_value) >= max |
| | | ) { |
| | | sdkArgItem.valid = false |
| | | |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数设定值须大于等于${min},小于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } else if (leftHand == '(' && rightHand == ']') { |
| | | if ( |
| | | Number(sdkArgItem.sdk_arg_value) <= min || |
| | | Number(sdkArgItem.sdk_arg_value) > max |
| | | ) { |
| | | sdkArgItem.valid = false |
| | | |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数设定值须大于${min},小于等于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } else if (leftHand == '[' && rightHand == ']') { |
| | | if ( |
| | | Number(sdkArgItem.sdk_arg_value) < min || |
| | | Number(sdkArgItem.sdk_arg_value) > max |
| | | ) { |
| | | sdkArgItem.valid = false |
| | | this.showErrorColor(e) |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数设定值须大于等于${min},小于等于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } |
| | | } else if (sdkArgItem.min || sdkArgItem.max) { |
| | | //判断区间类 |
| | | if (leftHand == '(' && rightHand == ')') { |
| | | if ( |
| | | Number(sdkArgItem.min) <= min || |
| | | Number(sdkArgItem.min) >= max |
| | | ) { |
| | | sdkArgItem.valid = false |
| | | |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数区间设定值须大于${min},小于${max}` |
| | | }); |
| | | return false |
| | | } |
| | | } else if (leftHand == '[' && rightHand == ')') { |
| | | if (Number(sdkArgItem.min) < min || Number(sdkArgItem.max) >= max) { |
| | | sdkArgItem.valid = false |
| | | |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数区间设定值须大于等于${min},小于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } else if (leftHand == '(' && rightHand == ']') { |
| | | if (Number(sdkArgItem.min) <= min || Number(sdkArgItem.max) > max) { |
| | | sdkArgItem.valid = false |
| | | |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数区间设定值须大于${min},小于等于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } else if (leftHand == '[' && rightHand == ']') { |
| | | if (Number(sdkArgItem.min) < min || Number(sdkArgItem.max) > max || Number(sdkArgItem.min) > max || Number(sdkArgItem.max) < min) { |
| | | sdkArgItem.valid = false |
| | | this.showErrorColor(e) |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: `参数区间设定值须大于等于${min},小于等于${max}` |
| | | }) |
| | | return false |
| | | } |
| | | } |
| | | } |
| | | } |
| | | e.currentTarget.style.borderColor = '' |
| | | return true |
| | | }, |
| | | showErrorColor(e) { |
| | | this.$nextTick(() => { |
| | | e.currentTarget.style.borderColor = 'red' |
| | | }) |
| | | }, |
| | | setSdksOptions(rule) { |
| | | rule.sdksOptions = this.includeSdks |
| | | }, |
| | | setOperator(rule) { |
| | | rule.operator = rule.operatorObj.value |
| | | rule.operatorDesc = rule.operatorObj.name |
| | | }, |
| | | setValue(rule) { |
| | | rule.valid = true |
| | | |
| | | if (rule.operator_type === 'option') { |
| | | rule.sdk_arg_value = rule.valueObj.value ? rule.valueObj.value : '' |
| | | rule.typeDesc = '被选项' |
| | | rule.valueDesc = rule.valueObj.name ? rule.valueObj.name : '' |
| | | } else { |
| | | rule.typeDesc = '值' |
| | | rule.valueDesc = rule.sdk_arg_value |
| | | } |
| | | this.valideArgValue(rule) |
| | | }, |
| | | selectPolygonOption(rule) { |
| | | |
| | | rule.polygon_id = rule.polygonObj.polygonId |
| | | ? rule.polygonObj.polygonId |
| | | : rule.polygon_id |
| | | rule.camera_id = rule.polygonObj.cameraId |
| | | ? rule.polygonObj.cameraId |
| | | : rule.camera_id |
| | | rule.group_id = this.group_id |
| | | }, |
| | | //选择算法 resetArgs为true是添加为false是初始化编辑 |
| | | selectSDKOption(sdkItem, resetArgs) { |
| | | |
| | | //sdkItem.sdk_id = sdkItem.sdkObj.id; |
| | | if (resetArgs) { |
| | | sdkItem.argDef = JSON.parse(sdkItem.sdkObj.argDef) |
| | | console.log(sdkItem.argDef) |
| | | //取出默认参数 |
| | | sdkItem.defaultArg = sdkItem.argDef.filter( |
| | | arg => !arg.config.isOptional |
| | | ) |
| | | //赋默认operator/值 |
| | | sdkItem.defaultArg.forEach(arg => { |
| | | if (arg.operators.length == 1) { |
| | | this.$set(arg, 'operator', arg.operators[0].operator) |
| | | |
| | | if (arg.operators[0].operator == 'range') { |
| | | //区间值的处理 |
| | | |
| | | //this.$set(arg, 'sdk_arg_value', arg.min+','+arg.max) |
| | | //this.$set(arg, 'sdk_arg_value', arg.range.substring(1,arg.range.length-1)); |
| | | } |
| | | } |
| | | |
| | | if (arg.default_value) { |
| | | //arg.sdk_arg_value = arg.default_value |
| | | this.$set(arg, 'sdk_arg_value', arg.default_value) |
| | | } |
| | | }) |
| | | sdkItem.defaultArg |
| | | //取出可选参数 |
| | | sdkItem.optionalArg = sdkItem.argDef.filter( |
| | | arg => arg.config.isOptional |
| | | ) |
| | | sdkItem.optNames = sdkItem.optionalArg.map(arg => ({ |
| | | name: arg.name, |
| | | sort: arg.sort, |
| | | isSelected: false |
| | | })) |
| | | |
| | | sdkItem.initAddOptional = sdkItem.optionalArg.length > 0 ? true : false |
| | | sdkItem.optArg = [] |
| | | } |
| | | |
| | | //添加场景时,如果场景名称为空,就将选择的第一个算法名同步到场景名称 |
| | | if (this.sdkGroup[0] && resetArgs) { |
| | | |
| | | this.$emit('sdkNameChange', this.sdkGroup[0].sdkObj.sdk_name) |
| | | } |
| | | |
| | | // 选项切换时需要刷新arg菜单项 |
| | | this.selectArgTypeOption(sdkItem, resetArgs) |
| | | }, |
| | | |
| | | selectArgTypeOption(rule, resetAlias) { |
| | | if (rule.sdk_arg_type == '') { |
| | | return |
| | | } |
| | | |
| | | if (resetAlias) { |
| | | rule.sdk_arg_alias = '' |
| | | } |
| | | |
| | | rule.argsOptions = rule.sdkObj.args |
| | | rule.argObj = {} |
| | | }, |
| | | //选择算法配置 |
| | | selOperator(rule) { |
| | | |
| | | }, |
| | | selectArgsOption(rule, resetArgValue) { |
| | | // rule.operator_type = ""; |
| | | // console.log(rule, '选择算法参数') |
| | | rule.sdk_arg_alias = rule.argObj.alias |
| | | rule.argDesc = rule.argObj.name |
| | | rule.sdk_arg_defaultValue = rule.argObj.default_value |
| | | rule.unit = rule.argObj.unit ? rule.argObj.unit : '' |
| | | //rule.default_value = rule.argObj.default_value ? Number(rule.argObj.default_value) : 0; |
| | | |
| | | //console.log("置信度的默认值为",rule.sdk_arg_defaultValue) |
| | | // 保存值类型 |
| | | rule.argType = rule.argObj.type |
| | | if (rule.argType === 'option') { |
| | | rule.operator_type = 'option' |
| | | // 设置默认条件值 |
| | | this.VideoManageData.Dictionary.RULECOMPUTE.forEach(opt => { |
| | | if (opt.value == '==') { |
| | | rule.operatorObj = opt |
| | | } |
| | | }) |
| | | |
| | | this.setOperator(rule) |
| | | |
| | | this.selectValueOption(rule) |
| | | } else { |
| | | // 设置默认条件值 |
| | | rule.operator_type = 'value' |
| | | if (resetArgValue) { |
| | | rule.sdk_arg_value = '' |
| | | |
| | | this.VideoManageData.Dictionary.RULECOMPUTE.forEach(opt => { |
| | | if (opt.value == '>=') { |
| | | rule.operatorObj = opt |
| | | } |
| | | }) |
| | | } else { |
| | | // 编辑规则匹配 |
| | | this.VideoManageData.Dictionary.RULECOMPUTE.forEach(opt => { |
| | | if (opt.value == rule.operator) { |
| | | rule.operatorObj = opt |
| | | } |
| | | }) |
| | | } |
| | | this.setOperator(rule) |
| | | } |
| | | }, |
| | | selectValueOption(rule) { |
| | | if (rule.sdk_arg_alias === 'time_rule') { |
| | | rule.valueOptions = this.VideoManageData.TimeRules.map(r => { |
| | | return { |
| | | name: r.name, |
| | | value: r.id |
| | | } |
| | | }) |
| | | } else if (rule.sdk_arg_alias === 'compareBase') { |
| | | rule.valueOptions = this.VideoManageData.TagList.map(r => { |
| | | return { |
| | | name: r.tableName, |
| | | value: r.id |
| | | } |
| | | }) |
| | | } else { |
| | | let ops = this.VideoManageData.Dictionary[rule.sdk_arg_alias] |
| | | if (ops && ops instanceof Array) { |
| | | rule.valueOptions = ops.map(r => { |
| | | return { |
| | | name: r.name, |
| | | value: r.value |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | }, |
| | | |
| | | valideArgValue(rule) { |
| | | if (rule.sdk_arg_value == '') { |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: '参数设定值不能为空!' |
| | | }) |
| | | rule.valid = false |
| | | return false |
| | | } |
| | | |
| | | if (rule.argObj && rule.argObj.range) { |
| | | // 如果设置了算法默认值,则判断不能小于该值 |
| | | if (rule.argObj.default_value) { |
| | | if ( |
| | | parseInt(rule.sdk_arg_value) < parseInt(rule.sdk_arg_defaultValue) |
| | | ) { |
| | | rule.valid = false |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: |
| | | '参数设定值不能小于算法参数默认值 ' + rule.sdk_arg_defaultValue |
| | | }) |
| | | rule.valueDesc = rule.sdk_arg_value = rule.argObj.default_value |
| | | rule.valid = false |
| | | return false |
| | | } |
| | | } |
| | | |
| | | // let re = /(?<=,).*?(?=]|\))/ |
| | | let re = /.*,(\d+)/ |
| | | let max = rule.argObj.range.match(re)[1] |
| | | // console.log(max,'获取范围最大值') |
| | | if (Number(rule.sdk_arg_value) > Number(max)) { |
| | | rule.valid = false |
| | | this.$notify({ |
| | | type: 'warning', |
| | | message: '参数设定值不能大于' + max |
| | | }) |
| | | return false |
| | | } |
| | | } |
| | | |
| | | return true |
| | | }, |
| | | parataxis(rule_with_pre) { |
| | | let relation = '' |
| | | this.VideoManageData.Dictionary.RULECOMPUTEBETWEEN.forEach(pre => { |
| | | if (pre.value === rule_with_pre) { |
| | | relation = pre.name |
| | | } |
| | | }) |
| | | |
| | | return relation |
| | | }, |
| | | |
| | | generatDescription() { |
| | | let desc = '' |
| | | this.groupRules.forEach((r, index) => { |
| | | // console.log(r,index,'拼接') |
| | | if (index === 0) { |
| | | desc += r.sdkDesc + r.argDesc + r.operatorDesc + r.valueDesc + r.unit |
| | | } else { |
| | | desc += |
| | | ' ' + |
| | | this.parataxis(r.rule_with_pre) + |
| | | ' ' + |
| | | r.sdkDesc + |
| | | r.argDesc + |
| | | r.operatorDesc + |
| | | r.valueDesc + |
| | | r.unit |
| | | } |
| | | }) |
| | | // console.log(desc,'拼接') |
| | | return desc |
| | | }, |
| | | createRule() { |
| | | if (!this.isTemplate && this.Cameras.length > 0) { |
| | | // 未选中摄像机或者未选中摄像机任务,不执行创建 |
| | | if (!this.Cameras[0].cameraId) return false |
| | | } |
| | | this.group_id = '' |
| | | //this.addRule(0); |
| | | }, |
| | | |
| | | //清空配置并初始化 |
| | | cleanRule() { |
| | | this.group_id = '' |
| | | this.sdkGroup.splice(0, this.sdkGroup.length) |
| | | this.addSdkItem(); |
| | | }, |
| | | addRule(index) { |
| | | let newRule = JSON.parse(JSON.stringify(this.baseRule)) |
| | | newRule.sdksOptions = this.includeSdks |
| | | |
| | | // this.groupRules.push(newRule); |
| | | // 插入到指定位置 |
| | | this.groupRules.splice(index + 1, 0, newRule) |
| | | }, |
| | | editHandle(ruleTxt) { |
| | | |
| | | // if (ruleTxt.length < 1) { |
| | | // return |
| | | // } |
| | | let ruleInfo = JSON.parse(ruleTxt); |
| | | ; |
| | | |
| | | //let ruleInfo = JSON.parse(ruleTxt) |
| | | this.editRule(ruleInfo) |
| | | }, |
| | | editRule(ruleGroup) { |
| | | |
| | | this.sdkGroup = [] |
| | | this.group_id = '' |
| | | ruleGroup.forEach(rule => { |
| | | |
| | | let tempObj = {} |
| | | |
| | | if (rule.group_id && rule.group_id != '') { |
| | | this.group_id = rule.group_id |
| | | } |
| | | |
| | | // 填充区域选项列表 |
| | | this.allPolygonData.forEach(p => { |
| | | if (p.polygonId === rule.polygon_id) { |
| | | rule.polygonObj = p |
| | | } |
| | | }) |
| | | |
| | | if (!rule.polygonObj) { |
| | | rule.polygonObj = { |
| | | cameraId: rule.camera_id, |
| | | defence_state: 1, |
| | | name: '未知区域', |
| | | polygonId: rule.polygon_id |
| | | } |
| | | } |
| | | console.log(rule) |
| | | |
| | | // 设置区域 |
| | | this.selectPolygonOption(rule) |
| | | |
| | | //算法对象,算法参数配置数组,(用于数据处理的)默认参数数组, 可选参数数组, 已配置的可选参数数组, (用于去重判断)存放可选参数名的数组 |
| | | let sdkObj = {}, |
| | | argDef = [], |
| | | defaultArg = [], |
| | | optionalArg = [], |
| | | optArg = [], |
| | | optNames = [] |
| | | |
| | | sdkObj = this.TaskMange.list1.find(sdk => sdk.id == rule.sdk_id) |
| | | |
| | | argDef = JSON.parse(sdkObj.argDef) |
| | | defaultArg = argDef.filter(arg => !arg.config.isOptional) |
| | | optionalArg = argDef.filter(arg => arg.config.isOptional) |
| | | |
| | | rule.sdk_set.forEach(arg => { |
| | | let optItem = optionalArg.find(oarg => { |
| | | |
| | | if (oarg.sort == arg.sort) { |
| | | return oarg |
| | | } |
| | | }) |
| | | if (optItem) { |
| | | if (optItem.operators.length > 1) { |
| | | optItem.operator = arg.operator |
| | | //this.selOperator(optItem) |
| | | } |
| | | |
| | | //赋值 |
| | | optItem.sdk_arg_value = arg.sdk_arg_value |
| | | //if(arg.sdk_arg_value.indexOf(',')>0){ |
| | | //判断是否是多选值类型的参数 |
| | | let isMultiOne = optionalArg.find(oarg => oarg.sort == optItem.sort && optItem.config.isMulti) |
| | | if (isMultiOne) { |
| | | optItem.sdk_arg_value = arg.sdk_arg_value.split(','); |
| | | } |
| | | |
| | | if (optItem.type == 'option') { |
| | | this.setOptArgValueOptions(optItem) |
| | | } |
| | | optArg.push(optItem) |
| | | } else { |
| | | defaultArg.forEach(d => { |
| | | if (d.sort == arg.sort) { |
| | | if (arg.sdk_arg_value.indexOf(',') > 0) { |
| | | //区间值 |
| | | d.min = arg.sdk_arg_value.split(',')[0]; |
| | | d.max = arg.sdk_arg_value.split(',')[1]; |
| | | d.operator = 'range' |
| | | } else { |
| | | d.sdk_arg_value = arg.sdk_arg_value |
| | | } |
| | | d.operator = arg.operator; |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | optNames = optionalArg.map(arg => ({ |
| | | name: arg.name, |
| | | sort: arg.sort, |
| | | isSelected: false |
| | | })) |
| | | |
| | | tempObj = { |
| | | sdkObj, |
| | | polygonObj: rule.polygonObj, |
| | | rule_with_pre: rule.rule_with_pre, |
| | | is_save_anyhow: rule.is_save_anyhow, |
| | | isSpread: true, |
| | | argDef, |
| | | initAddOptional: false, |
| | | optionalArg, |
| | | optArg, |
| | | defaultArg, |
| | | optNames, |
| | | isAddable: true, |
| | | camera_id: rule.camera_id, |
| | | polygon_id: rule.polygon_id |
| | | } |
| | | //回显是否显示添加可选参数 |
| | | tempObj.initAddOptional = |
| | | tempObj.optArg.length == 0 && tempObj.optionalArg.length > 0 |
| | | ? true |
| | | : false; |
| | | |
| | | //回显是否显示可选参数添加按钮 |
| | | if (tempObj.optArg.length < tempObj.optionalArg.length) { |
| | | tempObj.isAddable = true; |
| | | } else { |
| | | tempObj.isAddable = false; |
| | | } |
| | | //this.selectSDKOption(tempObj, false) |
| | | |
| | | this.sdkGroup.push(tempObj) |
| | | //设置算法 |
| | | }) |
| | | //this.$nextTick(() => {}) |
| | | }, |
| | | delRule(rule) { |
| | | this.$confirm('提示:删除后,该条规则将失效,是否删除?', { |
| | | center: true, |
| | | cancelButtonClass: 'comfirm-class-cancle', |
| | | confirmButtonClass: 'comfirm-class-sure' |
| | | }) |
| | | .then(() => { |
| | | deleteCameraRules({ groupId: rule.group_id }).then(res => { |
| | | if (res && res.success) { |
| | | this.$notify({ |
| | | type: 'success', |
| | | message: '删除成功' |
| | | }) |
| | | this.$emit('delete-rule') |
| | | } else { |
| | | this.$notify({ |
| | | type: 'error', |
| | | message: '删除失败!' |
| | | }) |
| | | } |
| | | }) |
| | | }) |
| | | .catch(() => { }) |
| | | }, |
| | | submitRule() { |
| | | |
| | | let groupRule = { rules: [] } |
| | | |
| | | let group_text = '' |
| | | let validateFlag = false |
| | | |
| | | if (this.isTemplate) { |
| | | groupRule.rules = this.groupRules.map(r => { |
| | | return { |
| | | sdk_id: r.sdk_id, |
| | | sdk_arg_alias: r.sdk_arg_alias, |
| | | operator: r.operator, |
| | | operator_type: r.operator_type, |
| | | sdk_arg_value: r.sdk_arg_value, |
| | | sort: 1, |
| | | rule_with_pre: r.rule_with_pre |
| | | } |
| | | }) |
| | | } else { |
| | | //校验必填项 |
| | | let undefinished = this.sdkGroup.some((sdk, index) => { |
| | | |
| | | //没有配置算法 |
| | | if (Object.keys(sdk.sdkObj).length == 0) { |
| | | return sdk |
| | | } |
| | | //多于两项算法时,算法关系不能为空 |
| | | if (sdk.rule_with_pre === '' && index != 0) { |
| | | return sdk |
| | | } |
| | | //表单提交前校验:所有算法的参数值不能为空,(有range的,要在range范围内)失焦时校验 |
| | | let defaultArgFlag = sdk.defaultArg.find(arg => !arg.sdk_arg_value) |
| | | if (defaultArgFlag) { |
| | | return sdk |
| | | } |
| | | //查找可选参数值是否都设置(多选值为数组类型) |
| | | let optionalArgFlag = sdk.optArg.find(arg => { |
| | | if (arg.sdk_arg_value instanceof Array) { |
| | | if (arg.sdk_arg_value.length == 0) { |
| | | return arg |
| | | } |
| | | } else { |
| | | //区间类参数值最小,最大值是否都设置 |
| | | if (arg.operator == 'range') { |
| | | |
| | | if (!arg.min.trim() && arg.max.trim()) { |
| | | return arg |
| | | } |
| | | } |
| | | if (!arg.sdk_arg_value) { |
| | | return arg |
| | | } |
| | | } |
| | | }); |
| | | |
| | | if (optionalArgFlag) { |
| | | return sdk |
| | | } |
| | | }); |
| | | if (undefinished) { |
| | | this.$notify({ |
| | | type: 'error', |
| | | message: '算法参数未完善,请完善后再保存' |
| | | }); |
| | | return |
| | | } |
| | | |
| | | //校验若算法关系为触发,则算法名不能重 |
| | | let sameSdk = this.sdkGroup.some((sdk, index) => { |
| | | |
| | | if (sdk.index != 0 && sdk.rule_with_pre == '=>') { |
| | | |
| | | if (sdk.sdkObj.id == this.sdkGroup[index - 1].sdkObj.id) { |
| | | return sdk |
| | | } |
| | | } |
| | | }); |
| | | |
| | | if (sameSdk) { |
| | | this.$notify({ |
| | | type: 'error', |
| | | message: '算法关系为触发时,算法名不能重复' |
| | | }); |
| | | return |
| | | } |
| | | |
| | | if (!validateFlag && !sameSdk) { |
| | | validateFlag = true |
| | | } |
| | | |
| | | this.sdkGroup.forEach(sdk => { |
| | | let tempObj = { |
| | | sdk_id: sdk.sdkObj.id, |
| | | camera_id: sdk.camera_id, |
| | | group_id: '', |
| | | is_save_anyhow: sdk.is_save_anyhow, |
| | | polygon_id: sdk.polygon_id, |
| | | rule_with_pre: sdk.rule_with_pre, |
| | | sdk_set: [] |
| | | } |
| | | |
| | | let defaultArgs = sdk.defaultArg.map(arg => ({ |
| | | operator: arg.operator, |
| | | operator_type: arg.type, |
| | | sdk_arg_alias: arg.alias, |
| | | sdk_arg_value: arg.sdk_arg_value, |
| | | sort: arg.sort |
| | | })) |
| | | |
| | | let defaultArgDesc = '( ' |
| | | sdk.defaultArg.forEach(arg => { |
| | | if (arg.operator == 'range') { |
| | | let valRange = ''; |
| | | |
| | | valRange = arg.sdk_arg_value.replace(',', '-'); |
| | | defaultArgDesc += `${arg.name}${arg.operators[0].name}${valRange}${arg.unit || ''}, ` |
| | | } else { |
| | | defaultArgDesc += `${arg.name}${arg.operators[0].name}${ |
| | | arg.sdk_arg_value |
| | | }${arg.unit || ''}, ` |
| | | } |
| | | |
| | | }); |
| | | ; |
| | | defaultArgDesc = defaultArgDesc.substring(0, defaultArgDesc.length - 2) |
| | | //defaultArgDesc = defaultArgDesc.substring(0,defaultArgDesc.length-3)+defaultArgDesc.substring(defaultArgDesc.length-1,defaultArgDesc.length); |
| | | //defaultArgDesc = defaultArgDesc.substring(0,defaultArgDesc.length-1); |
| | | |
| | | //处理可选项参数 |
| | | |
| | | let optArgs = sdk.optArg.map(arg => ({ |
| | | operator: arg.operator, |
| | | operator_type: arg.type, |
| | | sdk_arg_alias: arg.alias, |
| | | sdk_arg_value: arg.sdk_arg_value, |
| | | sort: arg.sort |
| | | })); |
| | | //将多选项的值拼成字符串 |
| | | optArgs.forEach(one => { |
| | | if (one.sdk_arg_value instanceof Array) { |
| | | one.sdk_arg_value = one.sdk_arg_value.join(); |
| | | } |
| | | }); |
| | | let optArgDesc = ' ' |
| | | sdk.optArg.forEach(arg => { |
| | | let val = ''; |
| | | let valRange = ''; |
| | | |
| | | |
| | | //处理下拉选值类型 |
| | | if (arg.type == 'option') { |
| | | if (arg.sdk_arg_value instanceof Array) { |
| | | //多选值 |
| | | let multiNames = ''; |
| | | arg.sdk_arg_value.forEach(val => { |
| | | let opV = arg.valueOptions.find(opt => opt.value == val); |
| | | multiNames += opV.name + ' '; |
| | | }) |
| | | val = multiNames; |
| | | |
| | | } else { |
| | | let res = arg.valueOptions.find( |
| | | opt => opt.value == arg.sdk_arg_value |
| | | ); |
| | | |
| | | val = res.name; |
| | | } |
| | | //optArgDesc += `,${arg.name}${arg.operators[0].operator}${val}${arg.unit || ''}, ` |
| | | } else { |
| | | //optArgDesc += `,${arg.name}${arg.operators[0].operator}${ arg.sdk_arg_value }${arg.unit || ''}, ` |
| | | } |
| | | |
| | | let operatorSelected = arg.operators.find(opr => opr.operator == arg.operator) |
| | | optArgDesc += `,${arg.name}${operatorSelected.name}${ |
| | | arg.type == 'option' ? val : arg.sdk_arg_value |
| | | }${arg.unit || ''}, ` |
| | | }) |
| | | optArgDesc = optArgDesc.substring(0, optArgDesc.length - 2) + optArgDesc.substring(optArgDesc.length - 1, optArgDesc.length); |
| | | optArgDesc += ')' |
| | | tempObj.sdk_set = defaultArgs.concat(optArgs) |
| | | |
| | | groupRule.rules.push(tempObj) |
| | | |
| | | let rule_with_pre = '' |
| | | if (sdk.rule_with_pre) { |
| | | switch (sdk.rule_with_pre) { |
| | | case '&&': |
| | | rule_with_pre = ' and ' |
| | | break |
| | | case '||': |
| | | rule_with_pre = ' or ' |
| | | break |
| | | case '=>': |
| | | rule_with_pre = ' -> ' |
| | | break |
| | | default: |
| | | rule_with_pre = '' |
| | | } |
| | | } |
| | | ; |
| | | group_text += `${rule_with_pre ? "<br/>" + rule_with_pre + "<br/>" : ""} <span style="background-color:RGB(183,183,183);">${ |
| | | sdk.sdkObj.sdk_name |
| | | }</span> ${ |
| | | sdk.polygonObj.name |
| | | } ${defaultArgDesc}${optArgDesc}`; |
| | | |
| | | if ( |
| | | group_text.charAt(group_text.length - 3) == ',' && |
| | | group_text.charAt(group_text.length - 2) == ' ' && |
| | | group_text.charAt(group_text.length - 1) == ')' |
| | | ) { |
| | | group_text = |
| | | group_text.substring(0, group_text.length - 3) + |
| | | group_text.substring(group_text.length - 2, group_text.length) |
| | | } |
| | | |
| | | }) |
| | | console.log(group_text) |
| | | } |
| | | |
| | | groupRule.text = group_text |
| | | groupRule.id = this.group_id |
| | | return groupRule |
| | | |
| | | if (this.isLinkRule) { |
| | | // 判断规则中至少包含两摄像机 |
| | | let cameraIds = Array.from( |
| | | new Set( |
| | | this.sdkGroup.map(r => { |
| | | return r.camera_id |
| | | }) |
| | | ) |
| | | ) |
| | | if (cameraIds.length < 2) { |
| | | this.$notify({ |
| | | type: 'error', |
| | | //message: '需要2个不同摄像机才能组成联动规则' |
| | | message: '需要至少2个不同摄像机才能组成联动场景' |
| | | }) |
| | | return |
| | | } |
| | | } |
| | | //if(validateFlag){ |
| | | this.onSubmitRule(payload) |
| | | //} |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | .edit-rules-box { |
| | | width: 100%; |
| | | padding: 0px; |
| | | box-sizing: border-box; |
| | | .sub-rules-box { |
| | | width: 71%; |
| | | min-width: 1127.4px; |
| | | min-height: 50px; |
| | | border-top: 1px solid #eee; |
| | | padding-top: 7px; |
| | | |
| | | box-sizing: border-box; |
| | | padding-bottom: 38px; |
| | | .task-rules-button { |
| | | text-align: right; |
| | | margin: 15px; |
| | | } |
| | | .config-item { |
| | | background: #f8f9f8; |
| | | padding: 15px 25px; |
| | | margin-bottom: 52px; |
| | | position: relative; |
| | | .el-select { |
| | | width: 225px !important; |
| | | } |
| | | .init-sdk { |
| | | margin-right: 30px; |
| | | } |
| | | .connection { |
| | | background: #fff; |
| | | position: absolute; |
| | | width: 100%; |
| | | top: -40px; |
| | | } |
| | | .top-line { |
| | | height: 30px; |
| | | .left { |
| | | float: left; |
| | | display: flex; |
| | | } |
| | | .right { |
| | | float: right; |
| | | cursor: pointer; |
| | | .del { |
| | | margin-right: 10px; |
| | | color: rgb(231, 76, 60); |
| | | } |
| | | .collapse { |
| | | font-size: 13px; |
| | | display: inline-block; |
| | | padding: 5px; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | } |
| | | .argums { |
| | | position: relative; |
| | | // width: calc(100% - 25px); |
| | | // top: 43px; |
| | | // left: 0; |
| | | // padding-left: 25px; |
| | | // background: #f8f9f8; |
| | | .argums-item { |
| | | display: flex; |
| | | align-items: center; |
| | | margin: 7px 0; |
| | | .arg-name, |
| | | .operator-name { |
| | | margin-right: 30px; |
| | | } |
| | | .arg-val { |
| | | width: 245px; |
| | | span { |
| | | margin-left: 6px; |
| | | } |
| | | .range-min, |
| | | .range-max { |
| | | width: 88px; |
| | | .el-input__inner { |
| | | height: 28px; |
| | | } |
| | | } |
| | | .devide { |
| | | display: inline-block; |
| | | width: 30px; |
| | | height: 1px; |
| | | background: #c5c5c5; |
| | | vertical-align: top; |
| | | margin: 14px 10px 0; |
| | | } |
| | | } |
| | | } |
| | | .el-input { |
| | | width: 225px; |
| | | } |
| | | } |
| | | } |
| | | .btn-add { |
| | | margin: 0 25px 15px; |
| | | margin-top: -38px; |
| | | .el-button { |
| | | width: 370px; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .el-button--text { |
| | | text-decoration: unset; |
| | | } |
| | | .el-input.is-disabled .el-input__inner { |
| | | background: #fafafa; |
| | | color: #606266; |
| | | } |
| | | p { |
| | | text-align: left; |
| | | // padding: 10px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .task-blank { |
| | | float: left; |
| | | font-family: PingFangSC-Regular; |
| | | font-size: 12px; |
| | | color: #cccccc; |
| | | margin-top: 5px; |
| | | } |
| | | |
| | | .btn { |
| | | cursor: pointer; |
| | | color: #3d68e1; |
| | | margin-left: 10px; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | </style> |