From e37e45cfe1123928dba5d9c5a427b0ee497b7ad6 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期二, 23 八月 2022 03:21:32 +0800
Subject: [PATCH] 修复算法配置的字段内容

---
 src/views/hashrate/CameraManage/CameraRules/index.vue | 1174 ++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 769 insertions(+), 405 deletions(-)

diff --git a/src/views/hashrate/CameraManage/CameraRules/index.vue b/src/views/hashrate/CameraManage/CameraRules/index.vue
index 2b05257..e32fd39 100644
--- a/src/views/hashrate/CameraManage/CameraRules/index.vue
+++ b/src/views/hashrate/CameraManage/CameraRules/index.vue
@@ -6,7 +6,7 @@
           <!-- 鍦烘櫙鍙婅鍒� -->
           <div class="left-top-left">
             <div class="title">鍦烘櫙</div>
-            <slide-scene :sceneData="Camera.rules"></slide-scene>
+            <slide-scene :sceneData="Camera.allSceneRule"></slide-scene>
           </div>
 
           <!-- 绠楀姏淇℃伅杩涘害鏉� -->
@@ -25,6 +25,7 @@
             :InValidCount="`${PollData.RealTimeInvalid}`"
             :RunningCount="`${PollData.RealTimeRun}`"
             :NoDeal="`${PollData.RealTimeNoDeal}`"
+            image="realTime (2).png"
           ></HashrateCard>
 
           <!-- 杞绠楀姏淇℃伅 -->
@@ -36,71 +37,176 @@
             :InValidCount="`${PollData.PollInvalid}`"
             :RunningCount="`${PollData.PollRun}`"
             :NoDeal="`${PollData.PollNoDeal}`"
+            image="polling.png"
           ></HashrateCard>
         </div>
       </div>
 
       <!-- 缁樺埗鍖哄煙canvas -->
       <div class="right">
-        <div class="title">缁樺埗鍖哄煙</div>
-        <div class="button draw" @click="drawBaseImg">缁樺埗鍖哄煙</div>
-        <polygon-canvas
-          class="cavas"
-          ref="canvas"
-          v-if="showCanvas"
-          v-loading="loading"
-          element-loading-text="鍒锋柊涓紝璇风◢绛�..."
-          element-loading-background="rgba(0, 0, 0, 0.8)"
-          :isShowDrawArrow="false"
-          :disabled="false"
-          :snapshot_url="Camera.baseImg"
-          :canvasDataShow="Camera.canvasData"
-          :currentCameraId="Camera.cameraId"
-          :loading="Camera.loading"
-          :canvasWidth="canvasWidth"
-          :canvasHeight="canvasHeight"
-          @fromCanvas="getCanvasData"
-          @changeLoading="changeLoading"
-          @refresh="refresh"
-        ></polygon-canvas>
+        <div class="draw-box" v-if="!TreeDataPool.multiple">
+          <div class="title">缁樺埗鍖哄煙</div>
+          <div class="button draw" @click="drawBaseImg">缁樺埗鍖哄煙</div>
+          <polygon-canvas
+            class="cavas"
+            ref="canvas"
+            v-if="showCanvas"
+            v-loading="loading"
+            element-loading-text="鍒锋柊涓紝璇风◢绛�..."
+            element-loading-background="rgba(0, 0, 0, 0.8)"
+            :isShowDrawArrow="false"
+            :disabled="false"
+            :snapshot_url="Camera.baseImg"
+            :canvasDataShow="Camera.canvasData"
+            :currentCamera="Camera"
+            :loading="Camera.loading"
+            :canvasWidth="canvasWidth"
+            :canvasHeight="canvasHeight"
+            @fromCanvas="getCanvasData"
+            @changeLoading="changeLoading"
+            @refresh="refresh"
+          ></polygon-canvas>
+        </div>
+
+        <div class="draw-box" v-else>
+          <div class="title">鏌ョ湅鍖哄煙</div>
+          <div class="img-box">
+            <span class="camera-tip" v-show="swipercanvasData.length == 0">鏆傛棤鍖哄煙锛岃鑷冲皯閫夋嫨2涓憚鍍忔満</span>
+            <!-- swiper 灞曠ず -->
+            <swiper ref="swiper" :options="swiperOption" class="swiper-box-container2">
+              <swiper-slide v-for="(data, index) in swipercanvasData" :key="index">
+                <!--  <b
+                  class="video-title"
+                  style="font-size: 14px; margin-top: -10px"
+                  >{{ data.name }}</b
+                > -->
+                <polygon-canvas
+                  ref="canvas"
+                  v-loading="loading"
+                  element-loading-text="鍒锋柊涓紝璇风◢绛�..."
+                  element-loading-background="rgba(0, 0, 0, 0.8)"
+                  :divId="data.camera.cameraId"
+                  :isShowDrawArrow="true"
+                  :isLink="true"
+                  :disabled="false"
+                  :loading="data.loading"
+                  :snapshot_url="data.baseImg"
+                  :canvasDataShow="data.canvasData"
+                  :currentCamera="data.camera"
+                  @changeLoading="changeLoading"
+                  @refresh="refresh2"
+                ></polygon-canvas>
+              </swiper-slide>
+            </swiper>
+            <div class="swiper-pre-border" v-show="swipercanvasData.length > 1">
+              <div class="icon-btn" slot="button-prev">
+                <i class="iconfont">&#xe618;</i>
+              </div>
+            </div>
+            <div class="swiper-next-border" v-show="swipercanvasData.length > 1">
+              <div class="icon-btn" slot="button-next">
+                <i class="iconfont">&#xe623;</i>
+              </div>
+            </div>
+          </div>
+        </div>
       </div>
     </div>
 
     <!-- 鐙珛鍦烘櫙鍖哄煙 -->
-    <div class="SeparateRules">
+    <div class="SeparateRules" @click="selectMultiple(false)">
       <div class="title">鐙珛鍦烘櫙</div>
       <div class="control">
-        <i class="iconfont" @click="showSdkBox = true">&#xe650;</i>
-        <i class="iconfont">&#xe64e;</i>
-        <i class="iconfont">&#xe64f;</i>
+        <el-tooltip class="item" effect="dark" content="绠楁硶浜嬩欢" placement="top">
+          <i class="iconfont" @click="openSdkBox($event)">&#xe650;</i>
+        </el-tooltip>
+        <el-tooltip class="item" effect="dark" content="鏁版嵁娴佷紶" placement="top">
+          <i class="iconfont">&#xe64e;</i>
+        </el-tooltip>
+        <el-tooltip class="item" effect="dark" content="妯℃澘鍔╂墜" placement="top">
+          <i class="iconfont">&#xe64f;</i>
+        </el-tooltip>
       </div>
 
       <div class="content">
         <!-- 鎽勫儚鏈� -->
-        <CameraBox
-          :camera="Camera"
-          id="separate_camera"
-          @addSeparateRule="addSeparateRule"
-        ></CameraBox>
+        <CameraBox :camera="Camera" id="separate_camera" @addSeparateRule="addSeparateRule"></CameraBox>
 
         <!-- 鍦烘櫙鍖哄煙 -->
-        <div class="RuleArea">
+        <div class="RuleArea" v-if="show">
           <template v-if="SeparateRules.length > 0">
             <RuleItem
               v-for="(item, index) in SeparateRules"
               :key="index"
               :rule="item"
               :id="'rule_' + index"
-              @edit="editSeparateRules(item, index)"
+              :ruleType="'separate'"
+              :cameraId="Camera.cameraId"
+              @edit="editRules(item, index, 'separate')"
               @addSdk="addSdk('separate', index)"
-              @backToOrigin="backToOrigin($event, item)"
+              @backToOrigin="backToOrigin('separate', index)"
+              @editSdk="editSdk($event, 'separate', index)"
+              @deletRule="deletRule('separate', index)"
             ></RuleItem>
           </template>
 
           <div class="empty" v-else>
-            <img src="/images/hashrate/鐙珛鍦烘櫙绌洪〉闈�.png" alt="" />
+            <img src="/images/hashrate/s_empty.png" alt="" />
             <div class="des">鏆傛棤鐙珛鍦烘櫙</div>
           </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="linkageRule" @click="selectMultiple(true)">
+      <div class="title">鑱斿姩鍦烘櫙</div>
+      <div class="control">
+        <el-tooltip class="item" effect="dark" content="绠楁硶浜嬩欢" placement="top">
+          <i class="iconfont" @click="showSdkBox = true">&#xe650;</i>
+        </el-tooltip>
+        <el-tooltip class="item" effect="dark" content="鏁版嵁娴佷紶" placement="top">
+          <i class="iconfont">&#xe64e;</i>
+        </el-tooltip>
+        <el-tooltip class="item" effect="dark" content="妯℃澘鍔╂墜" placement="top">
+          <i class="iconfont">&#xe64f;</i>
+        </el-tooltip>
+      </div>
+      <template v-if="linkageRule.length > 0">
+        <div class="content" v-for="(item, index) in linkageRule" :key="index">
+          <!-- 鎽勫儚鏈� -->
+          <LinkageCameraBox
+            :cameras="item.cameraIds"
+            @addLinkageRule="addLinkageRule(item.cameraIds, item.camera_polygons)"
+          ></LinkageCameraBox>
+          <div class="Anchor" :id="'linkage_camera' + index"></div>
+
+          <!-- 鍦烘櫙鍖哄煙 -->
+          <div class="RuleArea" v-if="show">
+            <RuleItem
+              :ruleType="'linkage'"
+              :rule="item"
+              @edit="editRules(item, index, 'linkage')"
+              @addSdk="addSdk('linkage', index)"
+              @backToOrigin="backToOrigin('linkage', index, item.cameraIds)"
+              @editSdk="editSdk($event, 'linkage', index)"
+              @deletRule="deletRule('linkage', index)"
+              :id="'linkage_' + index"
+            ></RuleItem>
+          </div>
+        </div>
+      </template>
+
+      <div class="empty" v-if="linkageRule.length <= 0 && !TreeDataPool.multiple">
+        <img src="/images/hashrate/l_empty.png" alt="" />
+        <div class="des">鏆傛棤鑱斿姩鍦烘櫙</div>
+      </div>
+
+      <div class="newCameraArea" v-if="linkageRule.length <= 0 && TreeDataPool.multiple">
+        <LinkageCameraBox :cameras="CarmerasId" @addLinkageRule="addLinkageRule(CarmerasId)"></LinkageCameraBox>
+
+        <div class="empty">
+          <img src="/images/hashrate/l_empty.png" alt="" />
+          <div class="des">鏆傛棤鑱斿姩鍦烘櫙</div>
         </div>
       </div>
     </div>
@@ -110,7 +216,7 @@
       :type="ruleType"
       :editData="editData"
       v-if="showAddBox"
-      @close="showAddBox = false"
+      @close="closeAddBox"
       @save="getNewRule"
     ></AddRuleBox>
 
@@ -118,181 +224,48 @@
 
     <SdkSettingBox
       v-if="showSdkSettingBox"
-      @close="showSdkSettingBox = false"
+      @close="closeSettingBox"
       @getNewSdk="getNewSdk"
-      :Cameras="[Camera]"
+      @getEditSdk="getEditSdk"
+      :editSdk="editSdkObj.sdk"
+      :linkEditCamera="ruleType === 'linkage' && editSdkObj ? editSdkObj.camera_polygons : null"
+      :Cameras="ruleType === 'linkage' ? addData.cameras : [Camera]"
     ></SdkSettingBox>
 
     <!-- 閬僵灞� -->
     <div class="mask" v-if="showAddBox || showSdkSettingBox"></div>
-
-    <div class="bottom" style="display: none">
-      <div class="devide"></div>
-      <div class="bottom-right">
-        <div class="draw-and-time-box">
-          <div class="draw-box">
-            <div class="draw-box-title">
-              <b style="font-size: 14px">缁樺埗鍖哄煙</b>
-              <span
-                class="el-dropdown-link"
-                @click="drawBaseImg"
-                style="position: relative; top: 5px; cursor: pointer"
-              >
-                <i class="iconfont iconbianji1" style="font-size: 28px"></i>
-              </span>
-            </div>
-            <div style="width: 590px; height: 16px">
-              <!--  <b style="font-size: 14px">{{
-                Camera.camearInfo.alias
-                  ? Camera.camearInfo.alias
-                  : Camera.camearInfo.name
-              }}</b> -->
-            </div>
-            <div class="img-box">
-              <template v-if="TreeDataPool.treeActiveName == 'camera'">
-                <polygon-canvas
-                  class="cavas"
-                  ref="canvas"
-                  v-if="showCanvas"
-                  v-loading="loading"
-                  element-loading-text="鍒锋柊涓紝璇风◢绛�..."
-                  element-loading-background="rgba(0, 0, 0, 0.8)"
-                  :isShowDrawArrow="false"
-                  :disabled="false"
-                  :snapshot_url="Camera.baseImg"
-                  :canvasDataShow="Camera.canvasData"
-                  :currentCameraId="Camera.cameraId"
-                  :loading="Camera.loading"
-                  :canvasWidth="canvasWidth"
-                  :canvasHeight="canvasHeight"
-                  @fromCanvas="getCanvasData"
-                  @changeLoading="changeLoading"
-                  @refresh="refresh"
-                ></polygon-canvas>
-              </template>
-              <template v-else>
-                <div style="width: 100%" v-loading="getStackFileLoading">
-                  <swiper
-                    ref="swiper"
-                    :auto-update="true"
-                    :options="canvasSwiperOption"
-                    @slideChange="swiperSlideChange"
-                    class="swiper-box-container2"
-                    style="width: 100%"
-                  >
-                    <swiper-slide
-                      v-for="(data, index) in swipercanvasData"
-                      :key="index"
-                    >
-                      <div>
-                        <b
-                          class="video-title"
-                          style="font-size: 14px; margin-top: -10px"
-                          >{{ data.name }}</b
-                        >
-                        <polygon-canvas
-                          class="cavas"
-                          ref="canvas"
-                          v-if="showCanvas"
-                          v-loading="loading"
-                          element-loading-text="鍒锋柊涓紝璇风◢绛�..."
-                          element-loading-background="rgba(0, 0, 0, 0.8)"
-                          :isShowDrawArrow="false"
-                          :isShowRefresh="false"
-                          :sourceType="data.type"
-                          :disabled="false"
-                          :snapshot_url="data.baseImg"
-                          :canvasDataShow="Camera.canvasData"
-                          :currentCameraId="data.stackId"
-                          :loading="data.loading"
-                          :canvasWidth="canvasWidth"
-                          :canvasHeight="canvasHeight"
-                          @fromCanvas="getCanvasData"
-                          @changeLoading="changeLoading"
-                        ></polygon-canvas>
-                      </div>
-                    </swiper-slide>
-                  </swiper>
-                  <div
-                    class="swiper-local-prev"
-                    v-show="swipercanvasData.length > 1"
-                    @click="prevClick"
-                  >
-                    <div class="icon-btn" slot="button-prev">
-                      <i class="iconfont iconzuo"></i>
-                    </div>
-                  </div>
-                  <div
-                    class="swiper-local-next"
-                    v-show="swipercanvasData.length > 1"
-                    @click="nextClick"
-                  >
-                    <div class="icon-btn" slot="button-next">
-                      <i class="iconfont iconyou1"></i>
-                    </div>
-                  </div>
-                </div>
-              </template>
-            </div>
-          </div>
-          <div style="float: left; width: calc(10% - 90px); height: 100%"></div>
-          <div
-            class="time-box"
-            style="
-              width: calc(90% + 90px - 576px);
-              overflow-x: auto;
-              overflow-y: hidden;
-            "
-          >
-            <p style="text-align: left; padding: 10px; box-sizing: border-box">
-              <b style="font-size: 14px">鏃堕棿娈�</b>
-            </p>
-            <time-slider ref="timeSlider" :type="'sep'" />
-          </div>
-        </div>
-
-        <scene-rule
-          :seletedCameras="[Camera]"
-          :tableRuleList="Camera.rules"
-          :onSaveScene="saveSceneRule"
-          @delete-rule="delScenRule"
-        ></scene-rule>
-      </div>
-    </div>
   </div>
 </template>
 
 <script>
-import { jsPlumb } from "jsplumb";
+import { jsPlumb } from "jsplumb"
 
-import { savePolygon } from "@/api/polygon";
+import { savePolygon } from "@/api/polygon"
 
-import { pasteRules } from "@/api/task";
+import { pasteRules } from "@/api/task"
+import { getCameraSceneRule } from "@/api/scene"
 
-import { saveCameraScene, getLinkSceneRule } from "@/api/scene";
+import { saveCameraScene, getLinkSceneRule } from "@/api/scene"
 
-import { changeRunType } from "@/api/pollConfig";
-import { findAllFileByStackId } from "@/api/localVedio";
-import VideoRuleData from "@/Pool/VideoRuleData";
+import { changeRunType } from "@/api/pollConfig"
+import { findAllFileByStackId } from "@/api/localVedio"
+import VideoRuleData from "@/Pool/VideoRuleData"
 
-import TimeSlider from "./components/TimeSlider";
-import polygonCanvas from "@/components/canvas";
-import Sysinfo from "@/components/subComponents/SystemInfo";
-import SceneRule from "./components/SceneRule";
-import SlideScene from "./components/scene/SlideScene";
-import HashrateCard from "@/views/hashrate/CameraManage/CameraRules/components/HashrateCard";
-import CameraBox from "@/views/hashrate/CameraManage/CameraRules/components/CameraBox";
-import RuleItem from "@/views/hashrate/CameraManage/CameraRules/components/RuleItem";
-import AddRuleBox from "@/views/hashrate/CameraManage/CameraRules/components/AddRuleBox";
-import SdkBox from "@/views/hashrate/CameraManage/CameraRules/components/SdkBox";
-import SdkSettingBox from "@/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox";
+import polygonCanvas from "@/components/canvas"
+import Sysinfo from "@/components/subComponents/SystemInfo"
+import SlideScene from "./components/scene/SlideScene"
+import HashrateCard from "@/views/hashrate/CameraManage/CameraRules/components/HashrateCard"
+import CameraBox from "@/views/hashrate/CameraManage/CameraRules/components/CameraBox"
+import LinkageCameraBox from "@/views/hashrate/CameraManage/CameraRules/components/LinkageCameraBox"
+import RuleItem from "@/views/hashrate/CameraManage/CameraRules/components/RuleItem"
+import AddRuleBox from "@/views/hashrate/CameraManage/CameraRules/components/AddRuleBox"
+import SdkBox from "@/views/hashrate/CameraManage/CameraRules/components/SdkBox"
+import SdkSettingBox from "@/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox"
 
 export default {
   components: {
-    TimeSlider,
     polygonCanvas,
     Sysinfo,
-    SceneRule,
     SlideScene,
     HashrateCard,
     CameraBox,
@@ -300,26 +273,33 @@
     AddRuleBox,
     SdkBox,
     SdkSettingBox,
+    LinkageCameraBox
   },
   directives: {
     focus: {
-      inserted: function (el) {
-        el.querySelector("input").focus();
-      },
-    },
+      inserted: function(el) {
+        el.querySelector("input").focus()
+      }
+    }
   },
   computed: {
     cameraType() {
-      return this.TreeDataPool.treeActiveName === "camera"
-        ? "camera"
-        : "dataStack";
+      return this.TreeDataPool.treeActiveName === "camera" ? "camera" : "dataStack"
     },
     selectedCameraIds() {
-      return this.TreeDataPool.selectedNodes;
+      return this.TreeDataPool.selectedNodes
     },
+    CarmerasId() {
+      let arr = []
+      this.Carmeras.forEach((item) => {
+        arr.push(item.cameraId)
+      })
+      return arr
+    }
   },
   data() {
     return {
+      show: true,
       loading: false,
       Camera: new VideoRuleData(),
       Carmeras: [],
@@ -329,20 +309,39 @@
         grabCursor: true,
         pagination: {
           el: ".swiper-pagination",
-          type: "fraction",
+          type: "fraction"
         },
         navigation: {
           nextEl: ".swiper-local-next",
-          prevEl: ".swiper-local-prev",
-        },
+          prevEl: ".swiper-local-prev"
+        }
       },
       plumbIns: null,
+      plumbIns2: null,
       showAddBox: false,
       ruleType: "",
       showSdkBox: false,
       showSdkSettingBox: false,
       editData: {},
       addData: {},
+      editSdkObj: {},
+      connectArr: [],
+      swipercanvasData: [],
+      swiperOption: {
+        grabCursor: true,
+        pagination: {
+          el: ".swiper-pagination",
+          type: "fraction"
+        },
+        navigation: {
+          nextEl: ".swiper-pre-border",
+          prevEl: ".swiper-next-border"
+        }
+      },
+      showNewLinkage: false,
+      newLinkageIds: [],
+      newLinkPlg: null,
+
       // swiperOption: {
       //   slidesPerView: 5,
       //   spaceBetween: 8,
@@ -357,368 +356,384 @@
       // },
       tableRuleList: [],
       SeparateRules: [], //鐙珛鍦烘櫙
+      linkageRule: [], //鑱斿姩鍦烘櫙
       cameraId: "",
-      showSysInfo: false,
+      showSysInfo: true,
       showCanvas: true,
       canvasWidth: 568,
       canvasHeight: 320,
       stackId: "",
       swiperIndex: 0,
-      swipercanvasData: [],
       stackFilesPage: 1,
-      stackFilesSize: 5,
-    };
+      stackFilesSize: 5
+    }
   },
   created() {
-    document.querySelector("html").style["min-width"] = "1920px";
+    document.querySelector("html").style["min-width"] = "1920px"
     // 鍒濆鍖栬繛绾垮彉閲�
-    this.plumbIns = jsPlumb.getInstance();
+    this.plumbIns = jsPlumb.getInstance()
   },
   mounted() {
-    this.PollData.statistics();
+    // this.PollData.statistics();
+    this.TaskMange.findAllSdk()
   },
   destroyed() {
-    document.querySelector("html").style["min-width"] = "1280px";
+    document.querySelector("html").style["min-width"] = "1280px"
   },
   watch: {
     "Camera.cameraId": {
       handler(n, o) {
         if (n) {
           if (this.TreeDataPool.treeActiveName == "dataStack") {
-            this.stackFilesPage = 1;
-            this.stackFilesSize = 5;
-            this.stackId = n;
+            this.stackFilesPage = 1
+            this.stackFilesSize = 5
+            this.stackId = n
             if (this.stackId) {
-              this.swipercanvasData = [];
-              this.getStackFiles();
+              this.swipercanvasData = []
+              this.getStackFiles()
             }
           }
         }
-      },
+      }
     },
+    Carmeras: {
+      handler(newVal, oldVal) {
+        this.setSwiperData()
+      },
+      deep: true
+    }
   },
   methods: {
     prevClick() {
       if (this.swiperIndex == 0) {
         if (this.stackFilesPage > 1) {
-          this.stackFilesPage--;
-          this.getStackFiles(true);
+          this.stackFilesPage--
+          this.getStackFiles(true)
         } else {
           this.$message({
             type: "info",
-            message: "褰撳墠宸叉槸绗竴椤�",
-          });
+            message: "褰撳墠宸叉槸绗竴椤�"
+          })
         }
       }
     },
     nextClick() {
       if (this.swiperIndex == this.swipercanvasData.length - 1) {
-        this.stackFilesPage++;
-        this.getStackFiles(true);
+        this.stackFilesPage++
+        this.getStackFiles(true)
       }
     },
     getStackFiles(onClick = false) {
-      this.getStackFileLoading = true;
-      let _this = this;
+      this.getStackFileLoading = true
+      let _this = this
       findAllFileByStackId({
         name: "",
         stackId: this.stackId,
         page: this.stackFilesPage,
         size: this.stackFilesSize,
-        type: 0,
+        type: 0
       })
         .then((res) => {
           if (res && res.success) {
             if (res.data.dataList.length > 0) {
-              this.swipercanvasData = [];
+              this.swipercanvasData = []
               this.swipercanvasData = res.data.dataList.map((item) => {
                 return {
                   name: item.name,
                   stackId: item.stack_id,
                   baseImg:
-                    item.type == 2
-                      ? `/files/${item.path.substr(
-                          item.path.lastIndexOf("/") + 1
-                        )}`
-                      : item.snapshot_url,
+                    item.type == 2 ? `/files/${item.path.substr(item.path.lastIndexOf("/") + 1)}` : item.snapshot_url,
                   type: item.type,
                   id: item.id,
-                  loading: false,
-                };
-              });
-              this.swiperIndex = 0;
-              this.$refs.swiper.swiper.activeIndex = 0;
+                  loading: false
+                }
+              })
+              this.swiperIndex = 0
+              this.$refs.swiper.swiper.activeIndex = 0
             } else {
               if (onClick) {
                 this.$message({
                   type: "warning",
-                  message: "宸叉棤鏇村鏁版嵁!",
-                });
+                  message: "宸叉棤鏇村鏁版嵁!"
+                })
               }
             }
           } else {
             this.$message({
               type: "error",
-              message: "鏁版嵁璇锋眰澶辫触,璇风◢鍚庨噸璇�!",
-            });
+              message: "鏁版嵁璇锋眰澶辫触,璇风◢鍚庨噸璇�!"
+            })
           }
-          this.getStackFileLoading = false;
+          this.getStackFileLoading = false
         })
         .catch((e) => {
-          this.getStackFileLoading = false;
-        });
-    },
-    swiperSlideChange() {
-      this.swiperIndex = this.$refs.swiper.swiper.activeIndex;
+          this.getStackFileLoading = false
+        })
     },
 
     drawBaseImg() {
       if (Array.isArray(this.$refs.canvas)) {
         if (this.$refs.canvas.length > 0) {
-          this.$refs.canvas[0].showModal();
+          this.$refs.canvas[0].showModal()
         }
       } else {
-        this.$refs.canvas.showModal();
+        this.$refs.canvas.showModal()
       }
     },
+
     getCanvasData(data) {
-      let polyon = { ...data };
-      polyon.camera_id = this.Camera.cameraId;
+      let polyon = { ...data }
+      polyon.camera_id = this.Camera.cameraId
       savePolygon(polyon).then((rsp) => {
-        this.Camera.getPolygon();
+        this.Camera.getPolygon()
         //this.Camera.getCameraTask();
-      });
+      })
+    },
+    setSwiperData() {
+      let swipers = []
+      let carmeras = this.Carmeras
+      for (let i = 0; i < carmeras.length; i++) {
+        swipers = swipers.concat({
+          camera: {
+            cameraId: carmeras[i].cameraId,
+            cameraName: carmeras[i].cameraName,
+            type: carmeras[i].type,
+            rtsp: carmeras[i].rtsp
+          },
+          baseImg: carmeras[i].baseImg ? carmeras[i].baseImg : undefined,
+          canvasData: carmeras[i].canvasData,
+          loading: carmeras[i].loading
+        })
+      }
+      this.swipercanvasData = swipers
     },
     refresh(url) {
-      this.Camera.baseImg = url;
+      this.Camera.baseImg = url
     },
+    refresh2(url, id) {
+      this.swipercanvasData.forEach((data) => {
+        if (data.cameraId == id) {
+          data.baseImg = url
+        }
+      })
+    },
+
     // 鍒濆鍖栨憚鍍忔満淇℃伅锛岀埗缁勪欢璋冪敤
     async initCameraData(id) {
-      //鑾峰彇鐙珛鍦烘櫙
-      let newCamera = new VideoRuleData();
-      if (id && id !== "") {
-        this.loading = false;
-        newCamera.cameraId = id;
-        await newCamera.update();
+      if (!id) {
+        return
       }
 
-      this.Camera = newCamera;
-      this.SeparateRules = this.Camera.rules;
+      this.plumbIns.deleteEveryConnection()
+      this.connectArr.forEach((item) => {
+        item.deleteEveryConnection()
+      })
+      //鑾峰彇鐙珛鍦烘櫙
+      let newCamera = new VideoRuleData()
+      if (id && id !== "") {
+        this.loading = false
+        newCamera.cameraId = id
+        await newCamera.update()
+      }
+
+      this.Camera = newCamera
+      this.SeparateRules = this.Camera.rules
 
       this.$nextTick(() => {
-        this.connectLine();
-      });
+        this.connectLine()
+      })
 
-      this.$refs.timeSlider.activeTab = this.VideoManageData.TimeRules[0].id;
-      this.showSysInfo = true;
+      this.showSysInfo = true
       // 鍒ゆ柇姝e湪鎵ц瀹炴椂鎴栬�呰疆璇换鍔�
       this.PollData.CameraList.forEach((element) => {
         if (element.id === newCamera.cameraId) {
-          this.runType = element.run_type;
+          this.runType = element.run_type
         }
-      });
-
-      // 鑾峰彇娣峰悎鍦烘櫙
-      this.showRules(id);
+      })
     },
 
     // 鑾峰彇娣峰悎鍦烘櫙
     showRules(id) {
-      let rules = [];
-
-      //澶氶�夋憚鍍忔満妯″紡
-      if (this.selectedCameraIds.length && this.TreeDataPool.multiple) {
-        getLinkSceneRule({ cameraIds: this.selectedCameraIds })
-          .then((rsp) => {
-            if (rsp && rsp.success) {
-              rules = rsp.data;
-              // 缁熶竴瑙勫垯缂栬緫鐨勬暟鎹粨鏋�
-              for (let i = 0; i < rules.length; i++) {
-                rules[i].group_rules = rules[i].rules;
-              }
-            }
-          })
-          .catch(() => {});
-
-        //鍗曢�夋憚鍍忔満妯″紡
-      } else if (id) {
-        getLinkSceneRule({ cameraIds: [id] })
-          .then((rsp) => {
-            if (rsp && rsp.success) {
-              rules = rsp.data;
-              // 缁熶竴瑙勫垯缂栬緫鐨勬暟鎹粨鏋�
-              for (let i = 0; i < rules.length; i++) {
-                rules[i].group_rules = rules[i].rules;
-              }
-
-              this.$set(this.Camera, "rules", this.Camera.rules.concat(rules));
-            }
-          })
-          .catch(() => {});
+      if (!id) {
+        return
       }
+      if (typeof id === "string") {
+        id = [id]
+      }
+      let rules = []
+
+      getLinkSceneRule({ cameraIds: id })
+        .then((rsp) => {
+          if (rsp && rsp.success) {
+            rules = rsp.data.rules
+
+            this.linkageRule = rules
+
+            this.$nextTick(() => {
+              this.connectLine2()
+            })
+          }
+        })
+        .catch(() => {})
     },
 
     saveSceneRule(groupRule) {
-      const payload = { ...groupRule };
-      payload.cameraIds = [this.Camera.cameraId];
-      let _this = this;
+      const payload = { ...groupRule }
+      payload.cameraIds = [this.Camera.cameraId]
+      let _this = this
       saveCameraScene(payload).then((rsp) => {
         if (rsp && rsp.success) {
-          this.Camera.update();
+          this.Camera.update()
           this.$notify({
             type: "success",
-            message: "绛栫暐淇濆瓨鎴愬姛锛�",
-          });
+            message: "绛栫暐淇濆瓨鎴愬姛锛�"
+          })
           //鍒锋柊宸︿晶鏍�
 
-          _this.$root.$children[0].$children[0].querySearchAsync("camera");
+          _this.$root.$children[0].$children[0].querySearchAsync("camera")
         }
-      });
+      })
     },
     delScenRule() {
-      this.Camera.update();
+      this.Camera.update()
     },
     changeLoading(params) {
-      this.loading = params;
+      this.loading = params
     },
     //鏄惁杩涜瑙嗛鍒嗘瀽澶勭悊
     pollEnable(row) {
-      let val = 0;
+      let val = 0
       if (row) {
         if (this.PollData.RealTimeSum < this.PollData.channelTotal) {
-          this.Camera.dealWay = true;
-          val = 1;
+          this.Camera.dealWay = true
+          val = 1
         } else {
-          this.Camera.dealWay = false;
-          val = 0;
+          this.Camera.dealWay = false
+          val = 0
         }
       } else {
-        this.Camera.dealWay = false;
-        val = -1;
+        this.Camera.dealWay = false
+        val = -1
       }
       if (this.Camera.cameraId && this.Camera.cameraId !== undefined) {
-        debugger;
         changeRunType({
           camera_ids: [this.Camera.cameraId],
-          run_type: val,
+          run_type: val
         }).then((rsp) => {
           if (rsp && rsp.success) {
             this.$notify({
               type: "success",
-              message: "閰嶇疆鎴愬姛",
-            });
+              message: "閰嶇疆鎴愬姛"
+            })
           } else {
             this.$notify({
               type: "error",
-              message: "閰嶇疆澶辫触",
-            });
+              message: "閰嶇疆澶辫触"
+            })
           }
-          this.TreeDataPool.fetchTreeData();
-        });
+          this.TreeDataPool.fetchTreeData()
+        })
       }
-      this.PollData.statisticTaskInfo();
+      this.PollData.statisticTaskInfo()
     },
     //瀹炴椂銆佽疆璇㈠垏鎹�
     changePoll(row) {
       //鍒ゆ柇鏄柊澧炶繕鏄洿鏂�
-      debugger;
       if (this.Camera.cameraId && this.Camera.cameraId !== undefined) {
         if (this.PollData.RealTimeSum < this.PollData.channelTotal) {
           if (row.value) {
-            this.Camera.dealWay = true;
+            this.Camera.dealWay = true
           } else {
-            this.Camera.dealWay = false;
+            this.Camera.dealWay = false
           }
-          debugger;
           changeRunType({
             camera_ids: [this.Camera.cameraId],
-            run_type: this.Camera.dealWay ? 1 : 0,
+            run_type: this.Camera.dealWay ? 1 : 0
           }).then((rsp) => {
             if (rsp && rsp.success) {
               this.$notify({
                 type: "success",
-                message: "閰嶇疆鎴愬姛",
-              });
+                message: "閰嶇疆鎴愬姛"
+              })
             } else {
               this.$notify({
                 type: "error",
-                message: "閰嶇疆澶辫触",
-              });
+                message: "閰嶇疆澶辫触"
+              })
             }
-          });
+          })
         } else {
           if (this.Camera.dealWay) {
-            this.Camera.dealWay = false;
-            debugger;
+            this.Camera.dealWay = false
             changeRunType({
               camera_ids: [this.Camera.cameraId],
-              run_type: this.Camera.dealWay ? 1 : 0,
+              run_type: this.Camera.dealWay ? 1 : 0
             }).then((rsp) => {
               if (rsp && rsp.success) {
                 this.$notify({
                   type: "success",
-                  message: "閰嶇疆鎴愬姛",
-                });
+                  message: "閰嶇疆鎴愬姛"
+                })
               } else {
                 this.$notify({
                   type: "error",
-                  message: "閰嶇疆澶辫触",
-                });
+                  message: "閰嶇疆澶辫触"
+                })
               }
-            });
+            })
           }
         }
-        this.TreeDataPool.fetchTreeData();
-        this.PollData.statisticTaskInfo();
+        this.TreeDataPool.fetchTreeData()
+        this.PollData.statisticTaskInfo()
       }
     },
     //澶嶅埗
     ctrlC() {
-      this.TreeDataPool.ctrlCameraId = this.Camera.cameraId;
-      this.TreeDataPool.ctrlCameraName = this.Camera.cameraName;
+      this.TreeDataPool.ctrlCameraId = this.Camera.cameraId
+      this.TreeDataPool.ctrlCameraName = this.Camera.cameraName
       this.$notify({
         type: "success",
-        message: "澶嶅埗绠楁硶鎴愬姛锛�",
-      });
+        message: "澶嶅埗绠楁硶鎴愬姛锛�"
+      })
     },
     ctrlV() {
       if (this.Camera.cameraId === this.TreeDataPool.ctrlCameraId) {
         this.$notify({
           type: "warning",
-          message: "涓嶈兘绮樿创鏈憚鍍忔満鐨勭畻娉曞埌鏈憚鍍忔満锛�",
-        });
-        return false;
+          message: "涓嶈兘绮樿创鏈憚鍍忔満鐨勭畻娉曞埌鏈憚鍍忔満锛�"
+        })
+        return false
       }
       pasteRules({
         sourceId: this.TreeDataPool.ctrlCameraId,
-        targetIds: [this.Camera.cameraId],
+        targetIds: [this.Camera.cameraId]
       })
         .then((res) => {
           if (res && res.success) {
             this.$notify({
               type: "success",
-              message: "绮樿创绠楁硶鎴愬姛锛�",
-            });
-            this.initCameraData(this.Camera.cameraId);
+              message: "绮樿创绠楁硶鎴愬姛锛�"
+            })
+            this.initCameraData(this.Camera.cameraId)
           } else {
             this.$notify({
               type: "error",
-              message: "绮樿创绠楁硶澶辫触锛�",
-            });
+              message: "绮樿创绠楁硶澶辫触锛�"
+            })
           }
         })
         .catch((err) => {
           this.$notify({
             type: "error",
-            message: "绮樿创绠楁硶澶辫触锛�",
-          });
-        });
+            message: "绮樿创绠楁硶澶辫触锛�"
+          })
+        })
     },
 
     //杩炴帴鐙珛鍦烘櫙杩炵嚎
     connectLine() {
       //娓呴櫎涔嬪墠鐨勮繛绾�
-      this.plumbIns.deleteEveryConnection();
+      this.plumbIns.deleteEveryConnection()
 
       for (let index = 0; index < this.SeparateRules.length; index++) {
         this.plumbIns.connect({
@@ -733,79 +748,295 @@
           paintStyle: { stroke: "#0065FF", strokeWidth: 2 }, // connector
           endpointStyle: {
             fill: "#fff",
-            outlineStroke: "#0065FF",
-          }, // endpoint
-        });
+            outlineStroke: "#0065FF"
+          } // endpoint
+        })
+      }
+    },
+
+    connectLine2() {
+      this.connectArr.forEach((item) => {
+        item.deleteEveryConnection()
+      })
+
+      for (let index = 0; index < this.linkageRule.length; index++) {
+        const plumbIns = jsPlumb.getInstance()
+
+        plumbIns.connect({
+          // 瀵瑰簲涓婅堪鍩烘湰姒傚康
+          source: `linkage_camera${index}`,
+          target: `linkage_${index}`,
+          anchor: ["Left", "Right"],
+          connector: ["Straight"],
+          endpoints: [["Blank", { cssClass: "sourcePoint" }], "Blank"],
+          overlays: [["Arrow", { width: 8, length: 8, location: 1 }]], // overlay
+          // 娣诲姞鏍峰紡
+          paintStyle: { stroke: "#0065FF", strokeWidth: 2 }, // connector
+          endpointStyle: {
+            fill: "#fff",
+            outlineStroke: "#0065FF"
+          } // endpoint
+        })
+
+        this.connectArr.push(plumbIns)
       }
     },
 
     //娣诲姞鐙珛鍦烘櫙
     addSeparateRule() {
-      this.ruleType = "separate";
-      this.showAddBox = true;
+      this.ruleType = "separate"
+      this.showAddBox = true
+    },
+
+    addLinkageRule(ids, camera_polygons) {
+      if (ids.length < 2) {
+        this.$message({
+          message: "璇疯嚦灏戦�夋嫨涓ゅ彴鎽勫儚鏈�",
+          type: "warning"
+        })
+        return
+      }
+      this.newLinkageIds = ids
+      this.ruleType = "linkage"
+      this.showAddBox = true
+      this.newLinkPlg = camera_polygons
     },
 
     //鍥炲~鏂扮殑鐙珛鍦烘櫙
     getNewRule(newRule) {
+      //鏂板鍦烘櫙
       if (newRule.action === "add") {
-        this.SeparateRules.push(newRule.data);
-        this.showAddBox = false;
-        this.$nextTick(() => {
-          this.connectLine();
-        });
+        newRule.data.rules = []
+        newRule.data.cameraIds = [this.Camera.cameraId]
+        newRule.data.enable = true
+        //鐙珛鍦烘櫙
+        if (this.ruleType == "separate") {
+          this.SeparateRules.push(newRule.data)
+          this.$nextTick(() => {
+            this.connectLine()
+          })
+        } else {
+          //鑱斿姩鍦烘櫙
+          if (this.newLinkPlg) {
+            newRule.data.camera_polygons = this.newLinkPlg
+          }
+          newRule.data.cameraIds = this.newLinkageIds
+          this.linkageRule.push(newRule.data)
+          this.$nextTick(() => {
+            this.connectLine2()
+          })
+        }
+
+        this.showAddBox = false
+
+        //缂栬緫鍦烘櫙
       } else if (newRule.action === "edit") {
-        this.SeparateRules[newRule.data.index].alarm_level =
-          newRule.data.alarm_level;
-        this.SeparateRules[newRule.data.index].scene_name =
-          newRule.data.scene_name;
-        this.SeparateRules[newRule.data.index].desc = newRule.data.desc;
-        this.SeparateRules[newRule.data.index].template_id =
-          newRule.data.template_id;
-        this.SeparateRules[newRule.data.index].time_rule_id =
-          newRule.data.time_rule_id;
-        this.SeparateRules[newRule.data.index].voiceId = newRule.data.voiceId;
-        this.showAddBox = false;
+        //鐙珛鍦烘櫙
+        if (this.ruleType == "separate") {
+          this.SeparateRules[newRule.data.index].alarm_level = newRule.data.alarm_level
+          this.SeparateRules[newRule.data.index].scene_name = newRule.data.scene_name
+          this.SeparateRules[newRule.data.index].desc = newRule.data.desc
+          this.SeparateRules[newRule.data.index].template_id = newRule.data.template_id
+          this.SeparateRules[newRule.data.index].time_rule_id = newRule.data.time_rule_id
+          this.SeparateRules[newRule.data.index].voiceId = newRule.data.voiceId
+        } else {
+          //鑱斿姩鍦烘櫙
+          this.linkageRule[newRule.data.index].alarm_level = newRule.data.alarm_level
+          this.linkageRule[newRule.data.index].scene_name = newRule.data.scene_name
+          this.linkageRule[newRule.data.index].desc = newRule.data.desc
+          this.linkageRule[newRule.data.index].template_id = newRule.data.template_id
+          this.linkageRule[newRule.data.index].time_rule_id = newRule.data.time_rule_id
+          this.linkageRule[newRule.data.index].voiceId = newRule.data.voiceId
+        }
+
+        this.showAddBox = false
+        this.$forceUpdate()
       }
+      this.editData = {}
     },
 
     //淇敼鐙珛鍦烘櫙
-    editSeparateRules(item, index) {
+    editRules(item, index, type) {
+      this.ruleType = type
       this.editData = {
-        type: "separate",
+        type,
         rule: item,
-        index,
-      };
-      this.addSeparateRule();
+        index
+      }
+      this.showAddBox = true
     },
 
     //娣诲姞绠楁硶
     addSdk(type, index) {
+      this.editSdkObj = {}
+      this.ruleType = type
       this.addData = {
         type,
-        index,
-      };
-      this.showSdkBox = false;
-      this.showSdkSettingBox = true;
+        index
+      }
+      if (this.addData.type === "linkage") {
+        this.addData.cameras = []
+        if (this.linkageRule[index].camera_polygons && this.linkageRule[index].camera_polygons.length > 0) {
+          this.linkageRule[index].camera_polygons.forEach((camera) => {
+            this.addData.cameras.push({
+              polygonData: camera.polygon,
+              cameraName: camera.camera_name,
+              cameraId: camera.camera_id
+            })
+          })
+        } else {
+          this.linkageRule[index].camera_polygons = []
+          this.Carmeras.forEach((camera) => {
+            this.addData.cameras.push({
+              polygonData: camera.polygonData,
+              cameraName: camera.cameraName,
+              cameraId: camera.cameraId
+            })
+            this.linkageRule[index].camera_polygons.push({
+              polygon: camera.polygonData,
+              camera_name: camera.cameraName,
+              camera_id: camera.cameraId
+            })
+          })
+        }
+      }
+      this.showSdkBox = false
+      this.showSdkSettingBox = true
     },
 
     //娣诲姞绠楁硶鍥炶皟
     getNewSdk(newRule) {
+      //鐙珛鍦烘櫙
       if (this.addData.type === "separate") {
         if (this.SeparateRules[this.addData.index].rules.length > 0) {
-          newRule.rule_with_pre = "&&";
+          newRule.rule_with_pre = "&&"
+          newRule.is_save_anyhow = true
         }
-        this.SeparateRules[this.addData.index].rules.push(newRule);
+
+        this.SeparateRules[this.addData.index].rules.push(newRule)
       }
-      this.addData = {};
+
+      //鑱斿姩鍦烘櫙
+      else {
+        if (this.linkageRule[this.addData.index].rules.length > 0) {
+          newRule.rule_with_pre = "&&"
+          newRule.is_save_anyhow = true
+        }
+        this.linkageRule[this.addData.index].rules.push(newRule)
+      }
+
+      this.addData = {}
+      this.showSdkSettingBox = false
+      this.TaskMange.findAllSdk({ installed: true })
+
+      this.show = false
+      this.$nextTick(() => {
+        this.show = true
+      })
     },
 
-    backToOrigin(e, item) {
-      e = item;
-      console.log(e);
-      this.$forceUpdate();
+    //鍙栨秷淇敼
+    async backToOrigin(type, index, ids) {
+      if (type === "separate") {
+        const rsp = await getCameraSceneRule({
+          cameraId: this.Camera.cameraId
+        })
+        if (rsp && rsp.success) {
+          let rules = rsp.data.rules ? rsp.data.rules : []
+          rules.forEach((item) => {
+            item.cameraIds = rsp.data.cameraInfo.id
+          })
+          if (rules[index]) {
+            this.SeparateRules[index] = rules[index]
+          } else {
+            this.SeparateRules.splice(index, 1)
+          }
+        }
+        this.$forceUpdate()
+        this.connectLine()
+      } else {
+        getLinkSceneRule({ cameraIds: ids }).then((rsp) => {
+          if (rsp && rsp.success) {
+            let rules = rsp.data.rules ? rsp.data.rules : []
+            if (rules[index]) {
+              this.linkageRule[index] = rules[index]
+            } else {
+              this.linkageRule.splice(index, 1)
+            }
+            this.$forceUpdate()
+            this.connectLine2()
+          }
+          console.log("澶辫触")
+        })
+      }
     },
-  },
-};
+
+    // 缂栬緫绠楁硶
+    editSdk(sdkIndex, type, ruleIndex) {
+      this.addData = {}
+      this.ruleType = type
+      if (type === "separate") {
+        this.editSdkObj = {
+          ruleIndex,
+          sdkIndex,
+          type,
+          sdk: this.SeparateRules[ruleIndex].rules[sdkIndex]
+        }
+      } else {
+        this.editSdkObj = {
+          ruleIndex,
+          sdkIndex,
+          type,
+          camera_polygons: this.linkageRule[ruleIndex].camera_polygons,
+          sdk: this.linkageRule[ruleIndex].rules[sdkIndex]
+        }
+      }
+
+      this.showSdkBox = false
+      this.showSdkSettingBox = true
+    },
+
+    deletRule(type, index) {
+      if (type === "separate") {
+        this.SeparateRules.splice(index, 1)
+      } else {
+        this.linkageRule.splice(index, 1)
+      }
+    },
+
+    getEditSdk(newRule) {
+      if (this.editSdkObj.type === "separate") {
+        this.SeparateRules[this.editSdkObj.ruleIndex].rules[this.editSdkObj.sdkIndex] = newRule
+      } else {
+        this.linkageRule[this.editSdkObj.ruleIndex].rules[this.editSdkObj.sdkIndex] = newRule
+      }
+      this.editSdkObj = {}
+      this.showSdkSettingBox = false
+    },
+
+    closeAddBox() {
+      this.showAddBox = false
+      this.editData = {}
+    },
+
+    closeSettingBox() {
+      this.showSdkSettingBox = false
+      this.editSdkObj = {}
+    },
+
+    openSdkBox(e) {
+      e.stopPropagation()
+      this.showSdkBox = true
+    },
+
+    selectMultiple(val) {
+      if (!val) {
+        this.Carmeras = []
+      }
+      this.TreeDataPool.multiple = val
+    }
+  }
+}
 </script>
 
 <style lang="scss" scoped>
@@ -905,7 +1136,7 @@
     .control {
       position: absolute;
       display: flex;
-      justify-content: end;
+      justify-content: flex-end;
       top: 20px;
       right: 20px;
 
@@ -956,6 +1187,96 @@
     }
   }
 
+  .linkageRule {
+    position: relative;
+    box-sizing: border-box;
+    padding: 20px;
+    margin: 24px 0;
+    background: rgba($color: #fff, $alpha: 0.9);
+
+    .control {
+      position: absolute;
+      display: flex;
+      justify-content: flex-end;
+      top: 20px;
+      right: 20px;
+
+      i {
+        margin-left: 10px;
+        font-size: 24px;
+        color: #0065ff;
+        cursor: pointer;
+
+        &:hover {
+          color: rgb(0, 51, 255);
+        }
+      }
+    }
+
+    .content {
+      position: relative;
+      display: flex;
+      margin-top: 10px;
+
+      .Anchor {
+        position: absolute;
+        left: 232px;
+        top: 100px;
+      }
+    }
+
+    .empty {
+      width: 1516px;
+      height: 198px;
+      border: 1px solid #c0c5cc;
+      border-radius: 5px;
+      text-align: center;
+      background: #eff4f9;
+      img {
+        margin-top: 14px;
+        width: 250px;
+        height: 150px;
+      }
+
+      .des {
+        margin-top: 2px;
+        color: #666;
+      }
+    }
+
+    .newCameraArea {
+      display: flex;
+      .empty {
+        margin-left: 60px;
+        width: 1220px;
+        height: 198px;
+        border: 1px solid #c0c5cc;
+        border-radius: 5px;
+        text-align: center;
+        background: #f0f5fa;
+        img {
+          margin-top: 14px;
+          width: 250px;
+          height: 150px;
+        }
+
+        .des {
+          margin-top: 2px;
+          color: #666;
+        }
+      }
+    }
+
+    ::v-deep .sourcePoint {
+      margin-top: -4px;
+      margin-left: -6px;
+      width: 4px !important;
+      height: 4px !important;
+      border-radius: 50%;
+      border: 2px solid #0065ff;
+    }
+  }
+
   .mask {
     position: absolute;
     top: 0;
@@ -966,5 +1287,48 @@
     opacity: 0.2;
     z-index: 1;
   }
+
+  .swiper-box-container2 {
+    margin: 0;
+    margin-top: -13px;
+    width: 568px;
+  }
+
+  .img-box {
+    position: relative;
+
+    .swiper-pre-border ::v-deep {
+      position: absolute;
+      bottom: 146px;
+      left: 10px;
+      cursor: pointer;
+      z-index: 1;
+
+      i {
+        font-size: 32px;
+        color: rgb(229, 229, 229);
+      }
+    }
+
+    .swiper-next-border ::v-deep {
+      position: absolute;
+      bottom: 146px;
+      right: 58px;
+      cursor: pointer;
+      z-index: 1;
+
+      i {
+        font-size: 32px;
+        color: rgb(229, 229, 229);
+      }
+    }
+
+    .swiper-button-disabled ::v-deep {
+      cursor: not-allowed;
+      i {
+        color: rgb(245, 245, 245);
+      }
+    }
+  }
 }
 </style>

--
Gitblit v1.8.0