fix: 物模型BUG解决

This commit is contained in:
wangshuaiswim 2023-03-20 16:16:57 +08:00
parent 5d27993d0f
commit 2a7eeccdb2
8 changed files with 42 additions and 32 deletions

View File

@ -8,34 +8,34 @@
</span> </span>
<span> <span>
<a-dropdown> <a-dropdown>
<!-- <AIcon type="MoreOutline" /> -->
<more-outlined /> <more-outlined />
<template #overlay> <template #overlay>
<a-menu> <j-menu>
<a-menu-item v-for="item in symbolList.filter((t: SymbolType, i: number) => i > 6)" :key="item.key" <j-menu-item v-for="item in symbolList.filter((t: SymbolType, i: number) => i > 6)" :key="item.key"
@click="addOperatorValue(item.value)"> @click="addOperatorValue(item.value)">
{{ item.value }} {{ item.value }}
</a-menu-item> </j-menu-item>
</a-menu> </j-menu>
</template> </template>
</a-dropdown> </a-dropdown>
</span> </span>
</div> </div>
<div class="right"> <div class="right">
<span v-if="mode !== 'advance'"> <span v-if="mode !== 'advance'">
<a-tooltip :title="!id ? '请先输入标识' : '设置属性规则'"> <j-tooltip :title="!id ? '请先输入标识' : '设置属性规则'">
<fullscreen-outlined :class="!id ? 'disabled' : ''" @click="fullscreenClick" /> <AIcon type="FullscreenOutlined" :class="!id ? 'disabled' : ''" @click="fullscreenClick" />
</a-tooltip> <!-- <fullscreen-outlined :class="!id ? 'disabled' : ''" @click="fullscreenClick" /> -->
</j-tooltip>
</span> </span>
</div> </div>
</div> </div>
<div class="editor"> <div class="editor">
<MonacoEditor v-if="loading" v-model:model-value="_value" theme="vs" ref="editor" /> <JMonacoEditor v-if="loading" v-model:model-value="_value" theme="vs" ref="editor" lang="javascript"/>
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts" name="Editor"> <script setup lang="ts" name="Editor">
import { FullscreenOutlined, MoreOutlined } from '@ant-design/icons-vue';
import MonacoEditor from '@/components/MonacoEditor/index.vue';
interface Props { interface Props {
mode?: 'advance' | 'simple'; mode?: 'advance' | 'simple';

View File

@ -30,7 +30,7 @@
]"> ]">
<j-input v-model:value="_value[index].name" size="small"></j-input> <j-input v-model:value="_value[index].name" size="small"></j-input>
</j-form-item> </j-form-item>
<value-type-form v-model:value="_value[index].valueType" :name="name.concat([index, 'valueType'])" isSub <value-type-form v-model:value="_value[index].valueType" :name="name.concat([index, 'valueType'])" :isSub="isSub"
key="json_sub"></value-type-form> key="json_sub"></value-type-form>
</div> </div>
</template> </template>
@ -69,6 +69,10 @@ const props = defineProps({
name: { name: {
type: Array as PropType<(string | number)[]>, type: Array as PropType<(string | number)[]>,
default: () => ([]) default: () => ([])
},
isSub: {
type: Boolean,
default: true
} }
}) })

View File

@ -33,7 +33,7 @@
<j-form-item label="输入参数" name="inputs" :rules="[ <j-form-item label="输入参数" name="inputs" :rules="[
{ validator: (_rule: Rule, val: Record<any, any>[]) => validateJson(_rule, val, '输入参数', false) }, { validator: (_rule: Rule, val: Record<any, any>[]) => validateJson(_rule, val, '输入参数', false) },
]"> ]">
<JsonParam v-model:value="value.inputs" :name="['inputs']"></JsonParam> <JsonParam v-model:value="value.inputs" :name="['inputs']" :is-sub="false"></JsonParam>
</j-form-item> </j-form-item>
<value-type-form :name="['output']" v-model:value="value.output" key="function" title="输出参数" :required="false"></value-type-form> <value-type-form :name="['output']" v-model:value="value.output" key="function" title="输出参数" :required="false"></value-type-form>
</template> </template>

View File

@ -109,7 +109,7 @@ const save = reactive({
if (props?.type === 'device') { if (props?.type === 'device') {
instanceStore.refresh(id as string) instanceStore.refresh(id as string)
} else { } else {
productStore.refresh(id as string) productStore.getDetail(id as string)
} }
// Store.set(SystemConst.REFRESH_METADATA_TABLE, true); // Store.set(SystemConst.REFRESH_METADATA_TABLE, true);
if (deploy) { if (deploy) {
@ -125,7 +125,7 @@ const save = reactive({
} }
// Store.set('product-deploy', deploy); // Store.set('product-deploy', deploy);
} else { } else {
save.resetMetadata(); // save.resetMetadata();
message.success({ message.success({
key: 'metadata', key: 'metadata',
content: '操作成功!', content: '操作成功!',
@ -133,9 +133,9 @@ const save = reactive({
} }
metadataStore.set('edit', false) metadataStore.set('edit', false)
metadataStore.set('item', {}) metadataStore.set('item', {})
if (instanceStore.detail) { // if (props?.type === 'device' && instanceStore.detail) {
instanceStore.detail.independentMetadata = true; // instanceStore.detail.independentMetadata = true;
} // }
} }
} else { } else {
message.error('操作失败!'); message.error('操作失败!');

View File

@ -44,7 +44,7 @@
}"> }">
<AIcon type="EditOutlined" /> <AIcon type="EditOutlined" />
</PermissionButton> </PermissionButton>
<PermissionButton :has-permission="`${permission}:delete`" type="link" key="delete" style="padding: 0" <PermissionButton :has-permission="`${permission}:delete`" type="link" key="delete" style="padding: 0" danger
:pop-confirm="{ :pop-confirm="{
title: '确认删除?', onConfirm: async () => { title: '确认删除?', onConfirm: async () => {
await removeItem(record); await removeItem(record);

View File

@ -18,7 +18,7 @@
<j-tabs @change="handleConvertMetadata" destroy-inactive-tab-pane> <j-tabs @change="handleConvertMetadata" destroy-inactive-tab-pane>
<j-tab-pane v-for="item in codecs" :key="item.id" :tab="item.name"> <j-tab-pane v-for="item in codecs" :key="item.id" :tab="item.name">
<div class="cat-panel"> <div class="cat-panel">
<MonacoEditor v-model="value" theme="vs" style="height: 100%"></MonacoEditor> <JMonacoEditor v-model="value" theme="vs" style="height: 100%" lang="javascript"></JMonacoEditor>
</div> </div>
</j-tab-pane> </j-tab-pane>
</j-tabs> </j-tabs>

View File

@ -17,8 +17,7 @@
<j-form-item label="选择产品" v-bind="validateInfos.copy" v-if="formModel.type === 'copy'"> <j-form-item label="选择产品" v-bind="validateInfos.copy" v-if="formModel.type === 'copy'">
<j-select :options="productList" v-model:value="formModel.copy" option-filter-prop="label"></j-select> <j-select :options="productList" v-model:value="formModel.copy" option-filter-prop="label"></j-select>
</j-form-item> </j-form-item>
<j-form-item label="物模型类型" v-bind="validateInfos.metadata" <j-form-item label="物模型类型" v-bind="validateInfos.metadata" v-if="type === 'device' || formModel.type === 'import'">
v-if="type === 'device' || formModel.type === 'import'">
<j-select v-model:value="formModel.metadata"> <j-select v-model:value="formModel.metadata">
<j-select-option value="jetlinks">Jetlinks物模型</j-select-option> <j-select-option value="jetlinks">Jetlinks物模型</j-select-option>
<j-select-option value="alink">阿里云物模型TSL</j-select-option> <j-select-option value="alink">阿里云物模型TSL</j-select-option>
@ -34,16 +33,23 @@
<j-form-item label="文件上传" v-bind="validateInfos.upload" v-if="formModel.metadataType === 'file'"> <j-form-item label="文件上传" v-bind="validateInfos.upload" v-if="formModel.metadataType === 'file'">
<j-input v-model:value="formModel.upload"> <j-input v-model:value="formModel.upload">
<template #addonAfter> <template #addonAfter>
<j-upload v-model:file-list="fileList" :before-upload="beforeUpload" accept=".json" <j-upload v-model:file-list="fileList" :before-upload="beforeUpload" accept=".json" :show-upload-list="false"
:show-upload-list="false" :action="FILE_UPLOAD" @change="fileChange" :action="FILE_UPLOAD" @change="fileChange" :headers="{ 'X-Access-Token': getToken() }">
:headers="{ 'X-Access-Token': getToken()}">
<AIcon type="UploadOutlined" class="upload-button" /> <AIcon type="UploadOutlined" class="upload-button" />
</j-upload> </j-upload>
</template> </template>
</j-input> </j-input>
</j-form-item> </j-form-item>
<j-form-item label="物模型" v-bind="validateInfos.import" v-if="formModel.metadataType === 'script'"> <j-form-item v-bind="validateInfos.import" v-if="formModel.metadataType === 'script'">
<MonacoEditor v-model="formModel.import" theme="vs" style="height: 300px"></MonacoEditor> <template #label>
<j-space>
物模型
<j-tooltip title="在线编辑器中编写物模型脚本">
<AIcon type="QuestionCircleOutlined" style="color: rgb(136, 136, 136);"/>
</j-tooltip>
</j-space>
</template>
<JMonacoEditor v-model="formModel.import" theme="vs" style="height: 300px" lang="javascript"></JMonacoEditor>
</j-form-item> </j-form-item>
</j-form> </j-form>
</j-modal> </j-modal>
@ -60,7 +66,6 @@ import { useInstanceStore } from '@/store/instance'
import { useProductStore } from '@/store/product'; import { useProductStore } from '@/store/product';
import { FILE_UPLOAD } from '@/api/comm'; import { FILE_UPLOAD } from '@/api/comm';
import { getToken } from '@/utils/comm'; import { getToken } from '@/utils/comm';
import MonacoEditor from '@/components/MonacoEditor/index.vue'
import { useMetadataStore } from '@/store/metadata'; import { useMetadataStore } from '@/store/metadata';
const route = useRoute() const route = useRoute()
@ -250,7 +255,7 @@ const handleImport = async () => {
resp = await modify(id as string, params) resp = await modify(id as string, params)
} }
loading.value = false loading.value = false
if (resp.status === 200) { if (resp.success) {
if (props?.type === 'device') { if (props?.type === 'device') {
const detail = instanceStore.current const detail = instanceStore.current
detail.metadata = paramsDevice detail.metadata = paramsDevice
@ -290,9 +295,10 @@ const handleImport = async () => {
padding: 10px; padding: 10px;
} }
} }
.upload-button { .upload-button {
width: 37px; width: 37px;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
margin: 0 -11px; margin: 0 -11px;
} }

View File

@ -2,7 +2,7 @@
<j-card> <j-card>
<div class='device-detail-metadata' style="position: relative;"> <div class='device-detail-metadata' style="position: relative;">
<div class="tips"> <div class="tips">
<j-tooltip v-if="type === 'device'" :title="instanceStore.detail?.independentMetadata && type === 'device' <j-tooltip :title="instanceStore.detail?.independentMetadata && type === 'device'
? '该设备已脱离产品物模型,修改产品物模型对该设备无影响' ? '该设备已脱离产品物模型,修改产品物模型对该设备无影响'
: '设备会默认继承产品的物模型,修改设备物模型后将脱离产品物模型'"> : '设备会默认继承产品的物模型,修改设备物模型后将脱离产品物模型'">
<div class="ellipsis"> <div class="ellipsis">
@ -84,11 +84,11 @@ const resetMetadata = async () => {
<style scoped lang="less"> <style scoped lang="less">
.device-detail-metadata { .device-detail-metadata {
.tips { .tips {
width: calc(100% - 670px); // width: calc(100% - 670px);
position: absolute; position: absolute;
top: 12px; top: 12px;
z-index: 1; z-index: 1;
margin-left: 380px; margin-left: 420px;
font-weight: 100; font-weight: 100;
} }