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