zhangzengfei
2020-07-30 d6bf6c38fe15510aac8e56569ca0450fb8656c89
src/pages/cameraAccess/components/scene/Editor.vue
File was renamed from src/components/scene/Editor.vue
@@ -1,1675 +1,1510 @@
<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 +=
            '&nbsp;&nbsp;&nbsp;' +
            this.parataxis(r.rule_with_pre) +
            '&nbsp;&nbsp;&nbsp;' +
            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 +=
            '&nbsp;&nbsp;&nbsp;' +
            this.parataxis(r.rule_with_pre) +
            '&nbsp;&nbsp;&nbsp;' +
            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>