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