hanbaoshan
2020-08-03 2385c7389f9f222be2daf9c01e3c1270c89fa230
src/pages/cameraAccess/components/scene/Editor.vue
@@ -5,6 +5,17 @@
    </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
@@ -12,7 +23,7 @@
              :class="{ init: index == 0 }"
              v-cloak
              v-for="(sdkItem, index) in sdkGroup"
              :key="sdkItem.id"
              :key="index"
            >
              <div class="connection" v-if="index !== 0">
                <el-select
@@ -90,11 +101,22 @@
                <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"
@@ -184,6 +206,12 @@
                    </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"
@@ -278,11 +306,39 @@
      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]
@@ -301,6 +357,16 @@
          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
@@ -308,26 +374,25 @@
    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
                }
                // 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;
              }
            }
          })
@@ -349,12 +414,28 @@
      },
      deep: true
    }
    // ruleList: {
    //   handler(newVal, oldVal) {
    //     debugger
    //     this.editHandle(newVal)
    //   }
    // }
  },
  mounted() {
    this.TaskMange.findAllSdk()
    this.TaskMange.findAllSdk({installed:true})
    //this.TaskMange.list1 = sdkJson.data;
    //this.editHandle(this.ruleList)
  },
  data() {
    return {
      // rule: {
      //   sdk_id:'',
      //   sdkObj: {},
      //   polygonObj: {},
      //   argDef: []
      // },
      hideDel: true,
      //isAddable: true,
      allPolygonData: [],
@@ -438,7 +519,7 @@
  },
  methods: {
    selConnection(sdkItem) {
      debugger
    },
    addSdkItem() {
@@ -449,6 +530,14 @@
      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))
@@ -456,14 +545,22 @@
        this.selectPolygonOption(itemTemp)
        this.sdkGroup.splice(index, 1, itemTemp)
      } else {
        this.sdkGroup.splice(index, 1)
        if(this.sdkGroup[index+1] && this.sdkGroup[index+1].rule_with_pre){
          this.sdkGroup[index+1].rule_with_pre = '';
        }
        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 => {
@@ -483,6 +580,15 @@
      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)
      }
@@ -512,7 +618,7 @@
      }
    },
    selOptionalArg(sdkItem, optArgItem) {
      debugger
      let newSort = 0
      sdkItem.optNames.forEach(name => {
        if (name.name == optArgItem.name) {
@@ -529,7 +635,7 @@
      if (argObj.type == 'option') {
        this.setOptArgValueOptions(argObj);
      }
      debugger
      //替换新的参数配置对象
      sdkItem.optArg.forEach((arg, index) => {
        if (arg.sort == optArgItem.sort) {
@@ -550,7 +656,7 @@
      });
    },
    validateArgVal(sdkArgItem, e) {
      debugger
      if (typeof (sdkArgItem.sdk_arg_value) == 'string' && sdkArgItem.sdk_arg_value == '') {
        this.$notify({
          type: 'warning',
@@ -570,7 +676,7 @@
        let res = sdkArgItem.range.match(reg)
        let min = Number(res[1]),
          max = Number(res[2])
        debugger
        //判断非区间类
        if (sdkArgItem.sdk_arg_value && sdkArgItem.operator != 'range') {
@@ -704,7 +810,7 @@
      this.valideArgValue(rule)
    },
    selectPolygonOption(rule) {
      debugger
      rule.polygon_id = rule.polygonObj.polygonId
        ? rule.polygonObj.polygonId
        : rule.polygon_id
@@ -715,7 +821,7 @@
    },
    //选择算法 resetArgs为true是添加为false是初始化编辑
    selectSDKOption(sdkItem, resetArgs) {
      debugger
      //sdkItem.sdk_id = sdkItem.sdkObj.id;
      if (resetArgs) {
        sdkItem.argDef = JSON.parse(sdkItem.sdkObj.argDef)
@@ -731,7 +837,7 @@
            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));
            }
@@ -752,14 +858,14 @@
          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)
      }
@@ -777,11 +883,21 @@
      }
      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 = "";
@@ -951,28 +1067,74 @@
    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 = ''
      ruleGroup.forEach(rule => {
      // 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 != '') {
@@ -1015,7 +1177,6 @@
        rule.sdk_set.forEach(arg => {
          let optItem = optionalArg.find(oarg => {
            if (oarg.sort == arg.sort) {
              return oarg
            }
@@ -1082,7 +1243,7 @@
          tempObj.optArg.length == 0 && tempObj.optionalArg.length > 0
            ? true
            : false;
        debugger
        //回显是否显示可选参数添加按钮
        if (tempObj.optArg.length < tempObj.optionalArg.length) {
          tempObj.isAddable = true;
@@ -1090,7 +1251,7 @@
          tempObj.isAddable = false;
        }
        //this.selectSDKOption(tempObj, false)
        debugger
        this.sdkGroup.push(tempObj)
        //设置算法
      })
@@ -1121,7 +1282,7 @@
        .catch(() => { })
    },
    submitRule() {
      debugger
      let groupRule = { rules: [] }
      let group_text = ''
@@ -1142,7 +1303,7 @@
      } else {
        //校验必填项
        let undefinished = this.sdkGroup.some((sdk, index) => {
          debugger
          //没有配置算法
          if (Object.keys(sdk.sdkObj).length == 0) {
            return sdk
@@ -1165,7 +1326,7 @@
            } else {
              //区间类参数值最小,最大值是否都设置
              if (arg.operator == 'range') {
                debugger
                if (!arg.min.trim() && arg.max.trim()) {
                  return arg
                }
@@ -1180,19 +1341,35 @@
            return sdk
          }
        });
        if (undefinished) {
          this.$notify({
            type: 'error',
            message: '算法参数未完善,请完善后再保存'
          });
          return
          return false
        }
        //校验区间左侧值是否小于右侧值
        let illegalRange = this.sdkGroup.some((sdk,index)=>{
          let rangeArg = sdk.defaultArg.find(arg=>arg.operator=='range');
          if(rangeArg){
            if (Number(rangeArg.max) <= Number(rangeArg.min)) {
              return sdk
            }
          }
        });
        if(illegalRange){
          this.$notify({
            type: 'error',
            message: '区间左侧不能大于或等于区间右侧的值'
          });
          return false
        }
        //校验若算法关系为触发,则算法名不能重
        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
            }
@@ -1204,7 +1381,7 @@
            type: 'error',
            message: '算法关系为触发时,算法名不能重复'
          });
          return
          return false
        }
        if (!validateFlag && !sameSdk) {
@@ -1234,7 +1411,7 @@
          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 {
@@ -1244,7 +1421,7 @@
            }
          });
          ;
          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);
@@ -1320,7 +1497,7 @@
                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>  ${
@@ -1336,7 +1513,7 @@
              group_text.substring(0, group_text.length - 3) +
              group_text.substring(group_text.length - 2, group_text.length)
          }
          debugger
        })
        console.log(group_text)
      }
@@ -1362,6 +1539,12 @@
          })
          return
        }
        // 联动规则编辑后,恢复之前选中的摄像机
        // if (this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule.length) {
        //   this.TreeDataPool.selectedNodes = this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule
        //   this.VideoRuleData.treeSelectedNodesBackupOnEditLinkRule = []
        // }
      }
      //if(validateFlag){
      this.onSubmitRule(payload)
@@ -1372,6 +1555,9 @@
</script>
<style lang="scss">
body{
  font-size: 12px;
}
.edit-rules-box {
  width: 100%;
  padding: 0px;