From d1ce79c837650689ab47bbf587d076743fcb3a5f Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期一, 19 五月 2025 17:25:38 +0800
Subject: [PATCH] 1. 问题审核界面新增场景信息编辑入口 2. 问题审核界面场景图片查询新增图片类型修改功能

---
 src/views/fysp/scene/SceneEditDialog.vue                |  139 +++++++--
 src/views/fysp/check/components/ArbitraryPhoto.vue      |  248 +++++++++++++++--
 src/components/FYImageSelectDialog.vue                  |  117 ++-----
 src/enum/mediaFile.js                                   |   93 ++++++
 src/views/fysp/check/ProCheck.vue                       |   28 +
 src/components/CompGenericWrapper.vue                   |   22 +
 src/components/ToolBar.vue                              |   10 
 src/views/fysp/check/components/CompProblemAddOrUpd.vue |   12 
 src/api/fysp/mediafileApi.js                            |   27 +
 src/views/fysp/scene/CompSceneBaseInfo.vue              |  116 +++++--
 src/components/search-option/FYOptionScene.vue          |    2 
 11 files changed, 607 insertions(+), 207 deletions(-)

diff --git a/src/api/fysp/mediafileApi.js b/src/api/fysp/mediafileApi.js
index ac05464..eb2c27b 100644
--- a/src/api/fysp/mediafileApi.js
+++ b/src/api/fysp/mediafileApi.js
@@ -1,15 +1,18 @@
 import { $fysp } from '../index';
 
 export default {
-    /**
-    * 鑾峰彇宸℃煡涓殑浠绘剰鍥剧墖
-    */
-    getRoutineByStGuid(stGuid) {
-        const params = `?stGuid=${stGuid}`;
-        return $fysp.get(`mediafile/routine${params}`).then((res) => res.data);
-    },
-    getRoutineByiGuid(iGuid) {
-        const params = `?iGuid=${iGuid}`;
-        return $fysp.get(`mediafile/routine${params}`).then((res) => res.data);
-    }
-}
\ No newline at end of file
+  /**
+   * 鑾峰彇宸℃煡涓殑浠绘剰鍥剧墖
+   */
+  getRoutineByStGuid(stGuid) {
+    const params = `?stGuid=${stGuid}`;
+    return $fysp.get(`mediafile/routine${params}`).then((res) => res.data);
+  },
+  getRoutineByiGuid(iGuid) {
+    const params = `?iGuid=${iGuid}`;
+    return $fysp.get(`mediafile/routine${params}`).then((res) => res.data);
+  },
+  updateMediaFile(mediafile) {
+    return $fysp.post('mediafile', mediafile).then((res) => res.data);
+  }
+};
diff --git a/src/components/CompGenericWrapper.vue b/src/components/CompGenericWrapper.vue
index 2b038a6..041acd6 100644
--- a/src/components/CompGenericWrapper.vue
+++ b/src/components/CompGenericWrapper.vue
@@ -1,14 +1,28 @@
 <template>
   <!-- dialog鍖呰9 -->
-  <el-dialog v-if="currType == 'dialog'" :title="title" :model-value="visible" @opened="$emit('update:visible', true)"
-    @closed="$emit('update:visible', false)" destroy-on-close>
+  <el-dialog
+    v-if="currType == 'dialog'"
+    :title="title"
+    :model-value="visible"
+    @opened="$emit('update:visible', true)"
+    @closed="$emit('update:visible', false)"
+    destroy-on-close
+  >
     <div v-if="visible">
       <slot name="content"></slot>
     </div>
   </el-dialog>
   <!-- drawer鍖呰9 -->
-  <el-drawer v-if="currType == 'drawer'" :title="title" size="45%" direction="ltr" :model-value="visible"
-    @opened="$emit('update:visible', true)" @closed="$emit('update:visible', false)" destroy-on-close>
+  <el-drawer
+    v-if="currType == 'drawer'"
+    :title="title"
+    size="45%"
+    direction="ltr"
+    :model-value="visible"
+    @opened="$emit('update:visible', true)"
+    @closed="$emit('update:visible', false)"
+    destroy-on-close
+  >
     <slot name="content"></slot>
   </el-drawer>
   <!-- 榛樿鏃犲寘瑁� -->
diff --git a/src/components/FYImageSelectDialog.vue b/src/components/FYImageSelectDialog.vue
index 04bc1b3..6e283c3 100644
--- a/src/components/FYImageSelectDialog.vue
+++ b/src/components/FYImageSelectDialog.vue
@@ -8,21 +8,25 @@
     destroy-on-close
     :close-on-press-escape="false"
   >
-    <!-- <div class="main"> -->
-    <el-row justify="end" v-if="!readonly">
-      <el-text size="small" type="info" class="m-r-8"
-        >鏈�澶氶�夋嫨{{ maxSelect }}寮犲浘鐗�</el-text
-      >
-      <el-button
-        size="small"
-        type="primary"
-        @click="handleSubmit"
-        :disabled="selectedImgUrlList.length == 0"
-        >纭畾</el-button
-      >
-      <el-button size="small" type="primary" @click="handleCancel"
-        >鍙栨秷</el-button
-      >
+    <el-row justify="end">
+      <el-text v-if="onContextMenu != undefined" size="small" type="info">{{
+        `锛�${contextMenuStr}锛塦
+      }}</el-text>
+      <div v-if="!readonly">
+        <el-text size="small" type="info" class="m-r-8"
+          >鏈�澶氶�夋嫨{{ maxSelect }}寮犲浘鐗�</el-text
+        >
+        <el-button
+          size="small"
+          type="primary"
+          @click="handleSubmit"
+          :disabled="selectedImgUrlList.length == 0"
+          >纭畾</el-button
+        >
+        <el-button size="small" type="primary" @click="handleCancel"
+          >鍙栨秷</el-button
+        >
+      </div>
     </el-row>
 
     <div class="center">
@@ -49,8 +53,11 @@
             :class="[img.isSelect ? 'selected' : 'noActive', 'image']"
             fit="cover"
             :src="img.url"
-            :preview-src-list="readonly ? typeImgMap.get(activeId).map((v) => v.url) : []"
+            :preview-src-list="
+              readonly ? typeImgMap.get(activeId).map((v) => v.url) : []
+            "
             :initial-index="i"
+            @contextmenu="(e) => showContextMenu(e, i)"
             @click="onSelect(img, i)"
             @load="onOneImgLoadSuccess(img)"
             @error="onOneImgLoadError(img)"
@@ -61,7 +68,6 @@
         </el-row>
       </el-scrollbar>
     </div>
-    <!-- </div> -->
   </el-dialog>
 </template>
 <script setup>
@@ -86,21 +92,25 @@
     type: Boolean,
     default: false
   },
-  defaultFile: {
-    type: Array,
-    default: () => []
-  },
   // 鍥剧墖鍙�夋暟閲忥紝褰撲紶鍏ユ暟瀛楁椂锛屼唬琛ㄥ浘鐗囨暟閲�
   maxSelect: {
     type: Number,
     default: 3
+  },
+  // 鍥剧墖鍙抽敭鐐瑰嚮浜嬩欢
+  onContextMenu: {
+    type: Function
+  },
+  contextMenuStr: {
+    type: String,
+    default: '鍙抽敭鐐瑰嚮鍥剧墖瑙﹀彂棰濆鎿嶄綔'
   }
 });
 
 const emit = defineEmits(['submit', 'cancel', 'update:dialogVisible']);
 
 const activeId = ref('');
-// const typeImgMap = ref(new Map());
+
 const selectedImgUrlList = ref([]);
 
 let loadedImgCount = ref(0);
@@ -158,20 +168,6 @@
   }
 }
 function handleOpen() {
-  // if (props.typeImgMap.get(activeId.value) == undefined) {
-  //     return;
-  //   }
-  //   props.typeImgMap.get(activeId.value).forEach((i) => {
-  //     if (i.isSelect == true) {
-  //       return;
-  //     }
-  //     props.defaultFile.forEach((imgItem) => {
-  //       if (imgItem.url == i.url) {
-  //         i.isSelect = true;
-  //         selectedImgUrlList.value.push(i);
-  //       }
-  //     });
-  //   });
   emit('update:dialogVisible', true);
 }
 function handleClose() {
@@ -189,6 +185,14 @@
   emit('update:dialogVisible', false);
 }
 
+// 鍥剧墖鍙抽敭鐐瑰嚮鏃堕棿
+function showContextMenu(event, index) {
+  if (props.onContextMenu) {
+    event.preventDefault();
+    props.onContextMenu(event, activeId.value, index);
+  }
+}
+
 watch(
   () => props.typeList,
   (nV, oV) => {
@@ -198,47 +202,6 @@
   },
   { immediate: true }
 );
-// watch(
-//   () => props.defaultFile,
-//   (nV, oV) => {
-//     if (props.typeImgMap.get(activeId.value) == undefined) {
-//       return;
-//     }
-//     props.typeImgMap.get(activeId.value).forEach((i) => {
-//       if (i.isSelect == true) {
-//         return;
-//       }
-//       nV.forEach((imgItem) => {
-//         if (imgItem.url == i.url) {
-//           i.isSelect = true;
-//           selectedImgUrlList.value.push(i);
-//         }
-//       });
-//     });
-//   },
-//   { deep: true, immediate: true }
-// );
-
-// watch(
-//   () => props.typeImgMap,
-//   (newMap, oldMap) => {
-//     if (newMap.get(activeId.value) == undefined) {
-//       return;
-//     }
-//     newMap.get(activeId.value).forEach((i) => {
-//       if (i.isSelect == true) {
-//         return;
-//       }
-//       props.defaultFile.forEach((imgItem) => {
-//         if (imgItem.url == i.url) {
-//           i.isSelect = true;
-//           selectedImgUrlList.value.push(i);
-//         }
-//       });
-//     });
-//   },
-//   { immediate: true }
-// );
 </script>
 <style scoped>
 .center {
diff --git a/src/components/ToolBar.vue b/src/components/ToolBar.vue
index 7f4452e..29487a5 100644
--- a/src/components/ToolBar.vue
+++ b/src/components/ToolBar.vue
@@ -18,9 +18,13 @@
     </el-row>
     <el-row class="tag-group" v-if="title">
       <el-space>
-        <el-tag v-for="(d, i) in descriptions" :key="i" :type="d.type" size="small">{{
-          d.name + ': ' + d.value
-        }}</el-tag>
+        <el-tag
+          v-for="(d, i) in descriptions"
+          :key="i"
+          :type="d.type"
+          size="small"
+          >{{ d.name + ': ' + d.value }}</el-tag
+        >
       </el-space>
     </el-row>
   </div>
diff --git a/src/components/search-option/FYOptionScene.vue b/src/components/search-option/FYOptionScene.vue
index d9df528..cbf4697 100644
--- a/src/components/search-option/FYOptionScene.vue
+++ b/src/components/search-option/FYOptionScene.vue
@@ -41,7 +41,7 @@
     // 鍒囨崲 type 鍚庯紝褰撳墠閫夐」鏄惁娓呯┖
     sourceInit: {
       type: Boolean,
-      default: true
+      default: false
     }
   },
   emits: ['update:value'],
diff --git a/src/enum/mediaFile.js b/src/enum/mediaFile.js
new file mode 100644
index 0000000..4b4e048
--- /dev/null
+++ b/src/enum/mediaFile.js
@@ -0,0 +1,93 @@
+// 椋炵窘鐩戠绯荤粺
+function enumMediaFile(sceneType, allOption = true) {
+  let l;
+  switch (parseInt(sceneType)) {
+    case 5:
+      l = _enumMediaFile_restaurant();
+      break;
+    default:
+      l = _enumMediaFile_common();
+      break;
+  }
+  if (!allOption) {
+    l.shift();
+  }
+
+  return l;
+}
+
+function _enumMediaFile_common() {
+  return [
+    {
+      label: '鍏ㄩ儴',
+      value: null
+    },
+    {
+      label: '甯歌璁板綍',
+      value: 5
+    },
+    {
+      label: '鐩戞祴璁惧',
+      value: 3
+    },
+    {
+      label: '閾墝',
+      value: 7
+    }
+  ];
+}
+
+function _enumMediaFile_restaurant() {
+  return [
+    {
+      label: '鍏ㄩ儴',
+      value: null
+    },
+    {
+      label: '甯歌璁板綍',
+      value: 5
+    },
+    {
+      label: '鎵╁睍绫讳竴',
+      value: 51
+    },
+    {
+      label: '鎵╁睍绫讳簩',
+      value: 52
+    },
+    {
+      label: '鎵╁睍绫讳笁',
+      value: 53
+    },
+    {
+      label: '鎵╁睍绫诲洓',
+      value: 54
+    },
+    {
+      label: '鎵╁睍绫讳簲',
+      value: 55
+    },
+    {
+      label: '鎵╁睍绫诲叚',
+      value: 56
+    },
+    {
+      label: '鎵╁睍绫讳竷',
+      value: 57
+    },
+    {
+      label: '鎵╁睍绫诲叓',
+      value: 58
+    },
+    {
+      label: '鎵╁睍绫讳節',
+      value: 59
+    },
+    {
+      label: '鎵╁睍绫诲崄',
+      value: 60
+    }
+  ];
+}
+
+export { enumMediaFile };
diff --git a/src/views/fysp/check/ProCheck.vue b/src/views/fysp/check/ProCheck.vue
index 8090280..dedfd26 100644
--- a/src/views/fysp/check/ProCheck.vue
+++ b/src/views/fysp/check/ProCheck.vue
@@ -21,7 +21,7 @@
       ></SideList>
     </template>
     <template #main>
-      <el-scrollbar >
+      <el-scrollbar>
         <ToolBar
           :title="curSubtask.title"
           :descriptions="proStatus"
@@ -72,6 +72,10 @@
     ref="deviceShowRef"
   >
   </CompDeviceShowTest>
+  <SceneEditDialog
+    v-model="sceneInfoDialog"
+    :sceneId="curSubtask.data ? curSubtask.data.sceneId : undefined"
+  ></SceneEditDialog>
 </template>
 
 <script>
@@ -82,22 +86,26 @@
 import CompProblemCard from './components/CompProblemCard.vue';
 import CompSubTaskStatistic from './components/CompSubTaskStatistic.vue';
 import CompDeviceShowTest from './components/CompDeviceShowTest.vue';
+import SceneEditDialog from '@/views/fysp/scene/SceneEditDialog.vue';
 export default {
   components: {
     CompProblemCard,
     CompSubTaskStatistic,
     CompProblemAddOrUpd,
     ArbitraryPhoto,
-    CompDeviceShowTest
+    CompDeviceShowTest,
+    SceneEditDialog
   },
   data() {
     return {
-      // 璁惧鍥�
+      // 璁惧鍥惧璇濇
       deviceShowDialog: false,
-      // 浠绘剰鍥�
+      // 浠绘剰鍥惧璇濇
       anyPhotoDialog: false,
-      // 鏂板闂
+      // 鏂板闂瀵硅瘽妗�
       proAddOrUpdDialogVisible: false,
+      // 鍩烘湰淇℃伅瀵硅瘽妗�
+      sceneInfoDialog: false,
       //宸︿晶鑿滃崟鏍忓姞杞界姸鎬�
       sideLoading: false,
       //鍙充晶鍐呭鏍忓姞杞界姸鎬�
@@ -116,6 +124,14 @@
       curProList: [],
       //鎿嶄綔鎸夐挳
       buttons: [
+        {
+          name: '鍦烘櫙淇℃伅',
+          color: 'success',
+          // color: 'primary',
+          click: () => {
+            this.sceneInfoDialog = true;
+          }
+        },
         {
           name: '鏂板闂',
           // color: 'success',
@@ -168,7 +184,7 @@
       this.mainLoading = true;
       this.curProList = [];
       this.curSubtask = {};
-      this.sceneTypeId = formSearch.sceneTypeId
+      this.sceneTypeId = formSearch.sceneTypeId;
       const param = {
         topTaskId: formSearch.topTask.tguid,
         sceneTypeId: formSearch.sceneTypeId
diff --git a/src/views/fysp/check/components/ArbitraryPhoto.vue b/src/views/fysp/check/components/ArbitraryPhoto.vue
index 52034e9..55b11a5 100644
--- a/src/views/fysp/check/components/ArbitraryPhoto.vue
+++ b/src/views/fysp/check/components/ArbitraryPhoto.vue
@@ -1,64 +1,252 @@
 <template>
   <FYImageSelectDialog
+    v-bind="$attrs"
     v-loading="loading"
     title="鍦烘櫙鍥剧墖"
     :typeList="typesList"
     :typeImgMap="typesMap"
+    :onContextMenu="showContextMenu"
+    contextMenuStr="鍙抽敭鐐瑰嚮鍥剧墖淇敼鍒嗙被"
   ></FYImageSelectDialog>
+  <!-- <div
+    
+    @click="closeContextMenu"
+    @contextmenu="closeContextMenu"
+    class="container"
+  > -->
+  <div v-if="showMenu" ref="menu" :style="menuStyle" class="context-menu">
+    <template v-for="(item, index) in menuItems" :key="index">
+      <el-popover v-if="item.children" placement="right-start" trigger="hover">
+        <template #reference>
+          <el-row justify="space-between" class="menu-item">
+            <span>{{ item.label }}</span>
+            <el-icon><ArrowRight /></el-icon>
+          </el-row>
+        </template>
+        <div
+          v-for="(item1, index1) in item.children"
+          :key="index1"
+          class="menu-item"
+          @click.stop="handleMenuItem(item1)"
+        >
+          {{ item1.label }}
+        </div>
+      </el-popover>
+
+      <div class="menu-item" @click.stop="handleMenuItem(item)" v-else>
+        {{ item.label }}
+      </div>
+    </template>
+  </div>
+  <!-- </div> -->
 </template>
 <script>
 import mediafileApi from '@/api/fysp/mediafileApi.js';
 import { $fysp } from '@/api/index.js';
+import { enumMediaFile } from '@/enum/mediaFile.js';
+
 export default {
   props: {
     subtask: {
-      type: Object,
-      efault: {}
+      type: Object
     }
   },
   data() {
     return {
-      // 鏃犳暟鎹�
       typesList: [],
       typesMap: new Map(),
       loading: true,
+      // 鍙抽敭鍥剧墖寮瑰嚭鑿滃崟鎺у埗
+      showMenu: false,
+      menuStyle: undefined,
+      // menuItems: [
+      //   { label: '澶嶅埗鍥剧墖', action: 'copy' },
+      //   {
+      //     label: '绉诲姩鍒�',
+      //     children: [
+      //       {
+      //         action: 'move',
+      //         label: v.typeName,
+      //         value: v.typeId
+      //       }
+      //     ]
+      //   }
+      // ],
+      closeContextMenuListenr: undefined,
+      // 鍙抽敭閫変腑鐨勫浘鐗�
+      selectedFile: undefined,
+      selectedIndex: undefined,
+      selectedTypeId: undefined
     };
+  },
+  computed: {
+    menuItems() {
+      const sceneTypeId = this.subtask.sceneTypeId;
+      const items = enumMediaFile(sceneTypeId, false)
+        .filter((v) => {
+          return v.value != this.selectedTypeId;
+        })
+        .map((v) => {
+          return {
+            action: 'move',
+            label: v.label,
+            value: v.value
+          };
+        });
+      return [
+        // { label: '澶嶅埗鍥剧墖', action: 'copy' },
+        { label: '绉诲姩鍒�', children: items }
+      ];
+    }
   },
   mounted() {
     this.getGroupImgs();
+    this.closeContextMenuListenr = (event) => {
+      if (
+        this.$refs.menu &&
+        !this.$refs.menu.contains(event.target) &&
+        this.showMenu
+      ) {
+        // 濡傛灉鐐瑰嚮涓嶆槸鍦ㄨ彍鍗曞唴閮ㄤ笖鑿滃崟鏄彲瑙佺殑
+        this.showMenu = false; // 闅愯棌鑿滃崟
+      }
+    };
+    document.addEventListener('click', this.closeContextMenuListenr);
+  },
+  unmounted() {
+    document.removeEventListener('click', this.closeContextMenuListenr);
   },
   methods: {
     // 鍥剧墖鍒嗙被
     getGroupImgs() {
-      mediafileApi.getRoutineByStGuid(this.subtask.stGuid).then((res) => {
-        this.loading = true
-        let typeList = [];
-        let typeMap = new Map();
-        const data = res.data;
-        for (const e of data) {
-          let img = {
-            url: $fysp.imgUrl + e.extension1 + e.guid + '.jpg'
-          };
-          const businesstype = e.businesstype;
-          const businesstypeid = e.businesstypeid;
-          if (
-            typeList.find((item) => item.typeName == businesstype) != undefined
-          ) {
-            typeMap.get(businesstypeid).push(img);
-          } else {
-            typeList.push({
-              typeId: businesstypeid,
-              typeName: businesstype
-            });
-            typeMap.set(businesstypeid, [img]);
+      mediafileApi
+        .getRoutineByStGuid(this.subtask.stGuid)
+        .then((res) => {
+          this.loading = true;
+          let typeList = [];
+          let typeMap = new Map();
+          const data = res.data;
+          for (const e of data) {
+            let img = {
+              url: $fysp.imgUrl + e.extension1 + e.guid + '.jpg',
+              data: e
+            };
+            const businesstype = e.businesstype;
+            const businesstypeid = e.businesstypeid;
+            if (
+              typeList.find((item) => item.typeId == businesstypeid) !=
+              undefined
+            ) {
+              typeMap.get(businesstypeid).push(img);
+            } else {
+              typeList.push({
+                typeId: businesstypeid,
+                typeName: businesstype
+              });
+              typeMap.set(businesstypeid, [img]);
+            }
           }
-        }
-        this.typesList = typeList;
-        this.typesMap = typeMap;
-      }).finally(() => (this.loading = false));
+          this.typesList = typeList;
+          this.typesMap = typeMap;
+        })
+        .finally(() => (this.loading = false));
+    },
+    // 鍥剧墖鍙抽敭鐐瑰嚮浜嬩欢
+    showContextMenu(event, typeId, index) {
+      this.showMenu = true;
+      this.menuStyle = {
+        left: `${event.clientX}px`,
+        top: `${event.clientY}px`
+      };
+      this.selectedTypeId = typeId;
+      this.selectedIndex = index;
+      this.selectedFile = this.typesMap.get(typeId)[index];
+    },
+    closeContextMenu() {
+      this.showMenu = false;
+    },
+    handleMenuItem(item) {
+      switch (item.action) {
+        case 'copy':
+          break;
+        case 'move':
+          this.selectedFile.data.businesstypeid = item.value;
+          this.selectedFile.data.businesstype = item.label;
+          this.changeMediaFileType(this.selectedFile);
+          break;
+        default:
+          break;
+      }
+      this.closeContextMenu();
+    },
+    changeMediaFileType() {
+      this.selectedFile.loading = true;
+      const file = this.selectedFile.data;
+      return mediafileApi
+        .updateMediaFile(file)
+        .then((res) => {
+          if (res == 1) {
+            const m = this.typesMap
+              .get(this.selectedTypeId)
+              .splice(this.selectedIndex, 1);
+            if (!this.typesMap.has(file.businesstypeid)) {
+              this.typesList.push({
+                typeId: file.businesstypeid,
+                typeName: file.businesstype
+              });
+              this.typesMap.set(file.businesstypeid, m);
+            } else {
+              this.typesMap.get(file.businesstypeid).push(m[0]);
+            }
+          }
+        })
+        .finally(() => (this.selectedFile.loading = false));
+
+      // setTimeout(() => {
+      //   const m = this.typesMap
+      //     .get(this.selectedTypeId)
+      //     .splice(this.selectedIndex, 1);
+      //   if (!this.typesMap.has(file.businesstypeid)) {
+      //     this.typesList.push({
+      //       typeId: file.businesstypeid,
+      //       typeName: file.businesstype
+      //     });
+      //     this.typesMap.set(file.businesstypeid, m);
+      //   } else {
+      //     this.typesMap.get(file.businesstypeid).push(m[0]);
+      //   }
+      //   this.selectedFile.loading = false;
+      // }, 2000);
     }
   }
 };
 </script>
-<style scoped></style>
- 
\ No newline at end of file
+<style scoped>
+.container {
+  /* background-color: rgba(19, 211, 67, 0.514); */
+  position: fixed;
+  left: 0;
+  top: 0;
+  height: 100vh;
+  width: 100vw;
+  z-index: 10000;
+}
+.context-menu {
+  position: fixed;
+  background: white;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  min-width: 200px;
+  z-index: 10001;
+}
+
+.menu-item {
+  padding: 8px 16px;
+  cursor: pointer;
+  transition: background 0.2s;
+}
+
+.menu-item:hover {
+  background-color: #f0f0f0;
+}
+</style>
diff --git a/src/views/fysp/check/components/CompProblemAddOrUpd.vue b/src/views/fysp/check/components/CompProblemAddOrUpd.vue
index b1e49ff..ad0049c 100644
--- a/src/views/fysp/check/components/CompProblemAddOrUpd.vue
+++ b/src/views/fysp/check/components/CompProblemAddOrUpd.vue
@@ -163,13 +163,13 @@
               </el-col>
             </el-row>
           </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="onSubmit" v-show="!readonly"
-              >淇濆瓨</el-button
-            >
-            <el-button @click="onCancel" v-show="!readonly">鍙栨秷</el-button>
-          </el-form-item>
         </el-form>
+        <el-row justify="end">
+          <el-button type="primary" @click="onSubmit" v-show="!readonly"
+            >淇濆瓨</el-button
+          >
+          <el-button @click="onCancel" v-show="!readonly">鍙栨秷</el-button>
+        </el-row>
         <ArbitraryPhoto
           :max-select="maxSelectImgCount - fileList.length"
           v-model:dialog-visible="anyPhotoDialog"
diff --git a/src/views/fysp/scene/CompSceneBaseInfo.vue b/src/views/fysp/scene/CompSceneBaseInfo.vue
index 8f8b68d..bf4ce56 100644
--- a/src/views/fysp/scene/CompSceneBaseInfo.vue
+++ b/src/views/fysp/scene/CompSceneBaseInfo.vue
@@ -1,19 +1,26 @@
 <!-- 鍦烘櫙鍩烘湰淇℃伅缂栬緫 -->
 <template>
-  <FYForm :form-info="formInfo" :rules="rules" :useReset="true" @submit="submit" @cancel="cancel">
+  <FYForm
+    :form-info="formInfo"
+    :rules="rules"
+    :useReset="true"
+    @submit="submit"
+    @cancel="cancel"
+  >
     <template #form-item="{ formObj }">
       <el-form-item label="鍦烘櫙鍚嶇О" prop="name">
-        <el-input clearable show-word-limit v-model="formObj.name" placeholder="鍦烘櫙鍚嶇О" />
+        <el-input
+          clearable
+          show-word-limit
+          v-model="formObj.name"
+          placeholder="鍦烘櫙鍚嶇О"
+        />
       </el-form-item>
-      <!-- <el-form-item label="鍦烘櫙绫诲瀷" prop="_scenetype">
-        <el-select v-model="formObj._scenetype" placeholder="鍦烘櫙绫诲瀷">
-          <el-option v-for="s in sceneTypes" :key="s.value" :label="s.label" :value="s" />
-        </el-select>
-      </el-form-item> -->
       <!-- 鍦烘櫙绫诲瀷 -->
       <FYOptionScene
         :allOption="false"
         :type="2"
+        :initValue="false"
         v-model:value="formObj._scenetype"
       ></FYOptionScene>
       <!-- 鍖哄幙 -->
@@ -25,10 +32,14 @@
         v-model:value="formObj._locations"
       ></FYOptionLocation>
       <el-form-item label="鍦板潃" prop="location">
-        <el-input show-word-limit clearable v-model="formObj.location" placeholder="鍦板潃" />
+        <el-input
+          show-word-limit
+          clearable
+          v-model="formObj.location"
+          placeholder="鍦板潃"
+        />
       </el-form-item>
       <el-form-item label="缁忓害" prop="longitude">
-        <!-- <el-input type="number" v-model="formObj.longitude" placeholder="缁忓害" /> -->
         <el-input-number
           v-model="formObj.longitude"
           :precision="6"
@@ -37,7 +48,6 @@
         />
       </el-form-item>
       <el-form-item label="绾害" prop="latitude">
-        <!-- <el-input type="number" v-model="formObj.latitude" placeholder="绾害" /> -->
         <el-input-number
           v-model="formObj.latitude"
           :precision="6"
@@ -46,7 +56,12 @@
         />
       </el-form-item>
       <el-form-item label="鑱旂郴浜�" prop="contacts">
-        <el-input show-word-limit clearable v-model="formObj.contacts" placeholder="鑱旂郴浜�" />
+        <el-input
+          show-word-limit
+          clearable
+          v-model="formObj.contacts"
+          placeholder="鑱旂郴浜�"
+        />
       </el-form-item>
       <el-form-item label="鑱旂郴鐢佃瘽" prop="contactst">
         <el-input type="tel" v-model="formObj.contactst" placeholder="鑱旂郴鐢佃瘽">
@@ -59,7 +74,9 @@
       </el-form-item>
       <el-form-item label="鐘舵��" prop="online">
         <el-switch v-model="formObj.online" />
-        <span style="margin-left: 16px">{{ formObj.online ? '鍦ㄧ嚎' : '涓嬬嚎' }}</span>
+        <span style="margin-left: 16px">{{
+          formObj.online ? '鍦ㄧ嚎' : '涓嬬嚎'
+        }}</span>
       </el-form-item>
       <el-form-item label="缂栧彿" prop="index">
         <el-input-number readonly v-model="formObj.index" :step="1" :min="0" />
@@ -69,21 +86,31 @@
 </template>
 
 <script setup>
-import { defineProps, defineEmits, reactive, ref, unref, watch, computed } from 'vue';
+import {
+  defineProps,
+  defineEmits,
+  reactive,
+  ref,
+  unref,
+  watch,
+  computed
+} from 'vue';
 import { enumScene } from '@/enum/scene';
 import sceneApi from '@/api/fysp/sceneApi';
 
 const props = defineProps({
   //鍦烘櫙鍩烘湰淇℃伅
   model: {
-    type: Object,
-    default: () => {
-      return {};
-    }
+    type: Object
+    // default: () => {
+    //   return {};
+    // }
   },
   //鏄垱寤烘垨鑰呮洿鏂板満鏅�
   create: Boolean
 });
+
+// const formInfo = ref();
 
 // 鍦烘櫙鍩烘湰淇℃伅锛屽仛鐩稿簲鐨勬暟鎹牸寮忓寲
 const formInfo = computed(() => {
@@ -92,7 +119,16 @@
 
 const emit = defineEmits(['onSubmit', 'onCancel']);
 
-const sceneTypes = ref(enumScene(2, false));
+// watch(
+//   () => props.model,
+//   (nV, oV) => {
+//     if (nV != oV && nV) {
+//       formInfo.value = parseSceneBaseInfo(nV);
+      
+//     }
+//   }
+// );
+
 const rules = reactive({
   name: [
     {
@@ -138,23 +174,25 @@
  */
 function parseSceneBaseInfo(param) {
   const s = unref(param);
-  s._scenetype = {
-    label: s.type,
-    value: s.typeid + ''
-  };
+  if (s) {
+    s._scenetype = {
+      label: s.type,
+      value: s.typeid + ''
+    };
 
-  s._locations = {
-    pCode: s.provincecode,
-    pName: s.provincename,
-    cCode: s.citycode,
-    cName: s.cityname,
-    dCode: s.districtcode,
-    dName: s.districtname,
-    tCode: s.towncode,
-    tName: s.townname
-  };
+    s._locations = {
+      pCode: s.provincecode,
+      pName: s.provincename,
+      cCode: s.citycode,
+      cName: s.cityname,
+      dCode: s.districtcode,
+      dName: s.districtname,
+      tCode: s.towncode,
+      tName: s.townname
+    };
 
-  s.online = s.extension1 != '0';
+    s.online = s.extension1 != '0';
+  }
 
   return s;
 }
@@ -187,12 +225,12 @@
   const a = v.value._locations;
   v.value.provincecode = a.pCode;
   v.value.provincename = a.pName;
-  v.value.citycode     = a.cCode;
-  v.value.cityname     = a.cName;
+  v.value.citycode = a.cCode;
+  v.value.cityname = a.cName;
   v.value.districtcode = a.dCode;
   v.value.districtname = a.dName;
-  v.value.towncode     = a.tCode;
-  v.value.townname     = a.tName;
+  v.value.towncode = a.tCode;
+  v.value.townname = a.tName;
 
   // 鍦烘櫙绫诲瀷淇℃伅濉厖
   const b = v.value._scenetype;
@@ -204,7 +242,9 @@
 
   v.value.updatedate = new Date().toISOString();
 
-  return props.create ? createScene(v.value, success, fail) : updateScene(v.value, success, fail);
+  return props.create
+    ? createScene(v.value, success, fail)
+    : updateScene(v.value, success, fail);
 }
 function cancel() {
   emit('onCancel');
diff --git a/src/views/fysp/scene/SceneEditDialog.vue b/src/views/fysp/scene/SceneEditDialog.vue
index b730af4..5f237cf 100644
--- a/src/views/fysp/scene/SceneEditDialog.vue
+++ b/src/views/fysp/scene/SceneEditDialog.vue
@@ -1,31 +1,29 @@
 <template>
-  <el-dialog>
-    <div class="sub-title">璐︽埛淇℃伅</div>
-    <el-row>
-      <FormCol>
-        <CompUserInfo :form-info="formUser" />
-      </FormCol>
-    </el-row>
-    <el-divider />
-    <div class="sub-title">鍩烘湰淇℃伅</div>
-    <el-row>
-      <FormCol>
-        <CompSceneBaseInfo :model="formScene" />
-      </FormCol>
-    </el-row>
-    <template v-if="formScene.typeid == 1">
-      <el-divider />
-      <div class="sub-title">宸ュ湴淇℃伅</div>
-      <el-row>
-        <FormCol>
-          <CompSceneConstructionInfo
-            showStyle="form"
-            :form-info="formSubScene"
-          />
-        </FormCol>
-      </el-row>
-      <el-divider />
-      <div class="sub-title">璁惧淇℃伅</div>
+  <el-dialog
+    :model-value="modelValue"
+    @update:model-value="handleDialogChange"
+    top="2vh"
+    class="dialog-wrapper"
+    v-loading="loading"
+  >
+    <el-scrollbar
+      ref="scrollbarRef"
+      height="86vh"
+      v-loading="loading"
+      :always="true"
+    >
+      <template v-if="formScene && formScene.typeid == 1">
+        <div class="sub-title">宸ュ湴淇℃伅</div>
+        <el-row>
+          <FormCol>
+            <CompSceneConstructionInfo
+              showStyle="form"
+              :form-info="formSubScene"
+            />
+          </FormCol>
+        </el-row>
+        <!-- <el-divider /> -->
+        <!-- <div class="sub-title">璁惧淇℃伅</div>
       <el-row>
         <FormCol>
           <CompSceneDeviceInfo
@@ -33,12 +31,27 @@
             :scene-type="formScene.typeid"
           />
         </FormCol>
+      </el-row> -->
+        <el-divider />
+      </template>
+      <div class="sub-title">鍩烘湰淇℃伅</div>
+      <el-row>
+        <FormCol>
+          <CompSceneBaseInfo :model="formScene" />
+        </FormCol>
       </el-row>
-    </template>
+      <el-divider />
+      <div class="sub-title">璐︽埛淇℃伅</div>
+      <el-row>
+        <FormCol>
+          <CompUserInfo :form-info="formUser" />
+        </FormCol>
+      </el-row>
+    </el-scrollbar>
   </el-dialog>
 </template>
 <script setup>
-import { ref } from 'vue';
+import { ref, watch } from 'vue';
 
 import sceneApi from '@/api/fysp/sceneApi';
 import userApi from '@/api/fysp/userApi';
@@ -48,11 +61,77 @@
 import CompUserInfo from '../user/CompUserInfo.vue';
 
 const props = defineProps({
+  modelValue: Boolean,
   sceneId: String
 });
 
+const emits = defineEmits(['update:modelValue']);
+
 const formUser = ref({});
-const formScene = ref({});
+const formScene = ref();
 const formSubScene = ref({});
 const formSceneDevice = ref({});
+const loading = ref(false);
+const scrollbarRef = ref();
+
+watch(
+  () => [props.modelValue, props.sceneId],
+  (nV, oV) => {
+    if (nV[0] && nV[1]) {
+      fetchSceneInfo();
+    }
+  }
+);
+
+function handleDialogChange(value) {
+  formUser.value = {};
+  formScene.value = undefined;
+  formSubScene.value = {};
+  formSceneDevice.value = {};
+
+  emits('update:modelValue', value);
+}
+
+function fetchSceneInfo() {
+  const sid = props.sceneId;
+  loading.value = true;
+  sceneApi
+    .getSceneDetail(sid)
+    .then((res) => {
+      userApi
+        .getUserByScene(sid)
+        .then((user) => {
+          //鍦烘櫙
+          if (res.data.scense) formScene.value = res.data.scense;
+          if (res.data.subScene) {
+            formSubScene.value = res.data.subScene;
+          } else {
+            formSubScene.value = {
+              sGuid: formScene.value.guid
+            };
+          }
+          if (res.data.sceneDevice) {
+            formSceneDevice.value = res.data.sceneDevice;
+          } else {
+            formSceneDevice.value = {
+              sGuid: formScene.value.guid
+            };
+          }
+          //璐︽埛
+          if (user) {
+            formUser.value = user;
+          } else {
+            formUser.value = {
+              dguid: sid
+            };
+          }
+        })
+        .finally(() => {
+          loading.value = false;
+          scrollbarRef.value.setScrollTop(0);
+        });
+    })
+    .catch(() => (loading.value = false));
+}
 </script>
+<style scoped></style>

--
Gitblit v1.9.3