1. 问题审核界面新增场景信息编辑入口
2. 问题审核界面场景图片查询新增图片类型修改功能
| | |
| | | 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); |
| | | } |
| | | } |
| | | }; |
| | |
| | | <template> |
| | | <!-- dialogå
裹 --> |
| | | <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å
裹 --> |
| | | <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> |
| | | <!-- é»è®¤æ å
裹 --> |
| | |
| | | destroy-on-close |
| | | :close-on-press-escape="false" |
| | | > |
| | | <!-- <div class="main"> --> |
| | | <el-row justify="end" v-if="!readonly"> |
| | | <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="handleCancel" |
| | | >åæ¶</el-button |
| | | > |
| | | </div> |
| | | </el-row> |
| | | |
| | | <div class="center"> |
| | |
| | | :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)" |
| | |
| | | </el-row> |
| | | </el-scrollbar> |
| | | </div> |
| | | <!-- </div> --> |
| | | </el-dialog> |
| | | </template> |
| | | <script setup> |
| | |
| | | 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); |
| | |
| | | } |
| | | } |
| | | 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() { |
| | |
| | | emit('update:dialogVisible', false); |
| | | } |
| | | |
| | | // å¾çå³é®ç¹å»æ¶é´ |
| | | function showContextMenu(event, index) { |
| | | if (props.onContextMenu) { |
| | | event.preventDefault(); |
| | | props.onContextMenu(event, activeId.value, index); |
| | | } |
| | | } |
| | | |
| | | watch( |
| | | () => props.typeList, |
| | | (nV, oV) => { |
| | |
| | | }, |
| | | { 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 { |
| | |
| | | </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> |
| | |
| | | // 忢 type åï¼å½åé项æ¯å¦æ¸
空 |
| | | sourceInit: { |
| | | type: Boolean, |
| | | default: true |
| | | default: false |
| | | } |
| | | }, |
| | | emits: ['update:value'], |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // é£ç¾½çç®¡ç³»ç» |
| | | 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 }; |
| | |
| | | ref="deviceShowRef" |
| | | > |
| | | </CompDeviceShowTest> |
| | | <SceneEditDialog |
| | | v-model="sceneInfoDialog" |
| | | :sceneId="curSubtask.data ? curSubtask.data.sceneId : undefined" |
| | | ></SceneEditDialog> |
| | | </template> |
| | | |
| | | <script> |
| | |
| | | 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, |
| | | //å³ä¾§å
容æ å è½½ç¶æ |
| | |
| | | curProList: [], |
| | | //æä½æé® |
| | | buttons: [ |
| | | { |
| | | name: 'åºæ¯ä¿¡æ¯', |
| | | color: 'success', |
| | | // color: 'primary', |
| | | click: () => { |
| | | this.sceneInfoDialog = true; |
| | | } |
| | | }, |
| | | { |
| | | name: 'æ°å¢é®é¢', |
| | | // color: 'success', |
| | |
| | | this.mainLoading = true; |
| | | this.curProList = []; |
| | | this.curSubtask = {}; |
| | | this.sceneTypeId = formSearch.sceneTypeId |
| | | this.sceneTypeId = formSearch.sceneTypeId; |
| | | const param = { |
| | | topTaskId: formSearch.topTask.tguid, |
| | | sceneTypeId: formSearch.sceneTypeId |
| | |
| | | <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 |
| | | 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' |
| | | url: $fysp.imgUrl + e.extension1 + e.guid + '.jpg', |
| | | data: e |
| | | }; |
| | | const businesstype = e.businesstype; |
| | | const businesstypeid = e.businesstypeid; |
| | | if ( |
| | | typeList.find((item) => item.typeName == businesstype) != undefined |
| | | typeList.find((item) => item.typeId == businesstypeid) != |
| | | undefined |
| | | ) { |
| | | typeMap.get(businesstypeid).push(img); |
| | | } else { |
| | |
| | | } |
| | | this.typesList = typeList; |
| | | this.typesMap = typeMap; |
| | | }).finally(() => (this.loading = false)); |
| | | }) |
| | | .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> |
| | | <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> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | </el-form-item> |
| | | <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-form-item> |
| | | </el-form> |
| | | </el-row> |
| | | <ArbitraryPhoto |
| | | :max-select="maxSelectImgCount - fileList.length" |
| | | v-model:dialog-visible="anyPhotoDialog" |
| | |
| | | <!-- åºæ¯åºæ¬ä¿¡æ¯ç¼è¾ --> |
| | | <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> |
| | | <!-- åºå¿ --> |
| | |
| | | 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" |
| | |
| | | /> |
| | | </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" |
| | |
| | | /> |
| | | </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="èç³»çµè¯"> |
| | |
| | | </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" /> |
| | |
| | | </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(() => { |
| | |
| | | |
| | | 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: [ |
| | | { |
| | |
| | | */ |
| | | function parseSceneBaseInfo(param) { |
| | | const s = unref(param); |
| | | if (s) { |
| | | s._scenetype = { |
| | | label: s.type, |
| | | value: s.typeid + '' |
| | |
| | | }; |
| | | |
| | | s.online = s.extension1 != '0'; |
| | | } |
| | | |
| | | return s; |
| | | } |
| | |
| | | |
| | | 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'); |
| | |
| | | <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 /> |
| | | <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> |
| | |
| | | /> |
| | | </FormCol> |
| | | </el-row> |
| | | <el-divider /> |
| | | <div class="sub-title">设å¤ä¿¡æ¯</div> |
| | | <!-- <el-divider /> --> |
| | | <!-- <div class="sub-title">设å¤ä¿¡æ¯</div> |
| | | <el-row> |
| | | <FormCol> |
| | | <CompSceneDeviceInfo |
| | |
| | | :scene-type="formScene.typeid" |
| | | /> |
| | | </FormCol> |
| | | </el-row> |
| | | </el-row> --> |
| | | <el-divider /> |
| | | </template> |
| | | <div class="sub-title">åºæ¬ä¿¡æ¯</div> |
| | | <el-row> |
| | | <FormCol> |
| | | <CompSceneBaseInfo :model="formScene" /> |
| | | </FormCol> |
| | | </el-row> |
| | | <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'; |
| | |
| | | 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> |