Browse Source

将地图存进文件系统,去掉 lcc_model_floor / lcc_model_world 表

master
修宁 6 months ago
parent
commit
86289e3512
  1. 27
      src/core/manager/EnvManager.ts
  2. 77
      src/core/manager/WorldModel.ts
  3. 21
      src/editor/ModelMain.vue
  4. 12
      src/editor/OpenProject.vue
  5. 50
      src/editor/menus/FileMenu.ts
  6. 9
      src/types/Model.d.ts

27
src/core/manager/EnvManager.ts

@ -133,7 +133,7 @@ export default class EnvManager {
system.showErrorDialog('EnvManager is already running, cannot start again.') system.showErrorDialog('EnvManager is already running, cannot start again.')
return return
} }
const payload = env.env_payload const payload = env.envConfig
const brokerUrl = payload?.mqtt?.websocket const brokerUrl = payload?.mqtt?.websocket
const username = payload?.mqtt?.username const username = payload?.mqtt?.username
const password = payload?.mqtt?.password const password = payload?.mqtt?.password
@ -205,15 +205,11 @@ export default class EnvManager {
} }
static CURRENT_ALL_ENV: EnvInfo[]
/** /**
* *
* @param worldId ID * @param worldId ID
* @param envName
* @param isVirtual
*/ */
static async createEnv(worldId: string, envName: string, isVirtual: boolean) { static async createEnv(worldId: string) {
throw new Error('Method not implemented.') throw new Error('Method not implemented.')
} }
@ -228,25 +224,8 @@ export default class EnvManager {
const res = await Request.request.post('/api/workbench/EnvController@getAllEnv', { const res = await Request.request.post('/api/workbench/EnvController@getAllEnv', {
worldId: worldId worldId: worldId
}) })
if (res.success) {
EnvManager.CURRENT_ALL_ENV = res.data
for (const env of res.data) {
// payload 转换为 json 数据
if (env.env_payload) {
try {
env.env_payload = JSON.parse(env.env_payload)
} catch (e) {
console.error('解析环境负载失败:', e)
env.env_payload = {}
}
}
}
return res
}
EnvManager.CURRENT_ALL_ENV = [] return res.data
return res
} }
/** /**

77
src/core/manager/WorldModel.ts

@ -1,6 +1,6 @@
import _ from 'lodash' import _ from 'lodash'
import { reactive } from 'vue' import { reactive } from 'vue'
import { Request } from "@ease-forge/shared"; import { Request } from '@ease-forge/shared'
import EventBus from '@/runtime/EventBus' import EventBus from '@/runtime/EventBus'
import StateManager from '@/core/manager/StateManager.ts' import StateManager from '@/core/manager/StateManager.ts'
import { getQueryParams, setQueryParam } from '@/utils/webutils.ts' import { getQueryParams, setQueryParam } from '@/utils/webutils.ts'
@ -15,6 +15,7 @@ export interface WorldModelState {
catalog: Catalog // 当前世界模型目录数据 catalog: Catalog // 当前世界模型目录数据
server: string // 当前楼层服务器地址 server: string // 当前楼层服务器地址
project_uuid: string // 当前楼层所在项目ID project_uuid: string // 当前楼层所在项目ID
project_label: string // 项目名称
catalogCode: string // 当前楼层的目录代码 catalogCode: string // 当前楼层的目录代码
stateManagerId: string // 当前楼层的状态管理器id stateManagerId: string // 当前楼层的状态管理器id
@ -163,12 +164,10 @@ export default class WorldModel {
/** /**
* *
*/ */
async loadWorldFromRemoting(veryBigData) { async loadWorldFromRemoting(lccModelWorld) {
const worldData = veryBigData const worldData = lccModelWorld
const catalog = veryBigData.catalog const catalog = lccModelWorld.directoryData
const items = veryBigData.items delete lccModelWorld.directoryData
delete veryBigData.catalog
delete veryBigData.items
this.state.isOpened = true this.state.isOpened = true
this.state.worldData = worldData this.state.worldData = worldData
@ -176,65 +175,33 @@ export default class WorldModel {
// 没有打开楼层,不加载 this.state.infos // 没有打开楼层,不加载 this.state.infos
// 没有打开楼层,不加载 this.state.isChanged // 没有打开楼层,不加载 this.state.isChanged
this.state.catalog = catalog this.state.catalog = catalog
this.state.server = veryBigData.server this.state.server = lccModelWorld.server
this.state.project_uuid = veryBigData.project_uuid this.state.project_uuid = lccModelWorld.projectUuid
// 没有打开楼层,不加载 this.state.catalogCode // 没有打开楼层,不加载 this.state.catalogCode
this.state.isDraft = false this.state.isDraft = false
await localforage.setItem('_____veryBigItemsData', items)
} }
/** /**
* *
*/ */
async getCatalogData(catalogCode: string): Promise<VData> { async getCatalogData(catalogCode: string): Promise<VData> {
if(true) { const items = await Request.request.get('/api/workbench/LccModelManager@getFloor', { params: { catalogCode, project_uuid: this.state.project_uuid } })
const res = await Request.request.get("/api/workbench/LccModelManager@getFloor", { params: {catalogCode,project_uuid:this.state.project_uuid} }); if (!items) {
let items :Array<any>=[]; system.showErrorDialog('can\'t get floor data')
if(res?.items) items = JSON.parse(res.items) ?? []; return Promise.reject('can\'t get floor data')
const vdata: any = {
items: items as ItemJson[],
infos: {catalogCode, t: "floor" },
isChanged: false,
catalog: _.cloneDeep(this.state.catalog),
server: this.state.server,
project_uuid: this.state.project_uuid,
catalogCode: catalogCode,
worldData: _.cloneDeep(this.state.worldData)
}
return Promise.resolve(vdata)
}
const _____veryBigItemsData: any = await localforage.getItem('_____veryBigItemsData')
if (!_____veryBigItemsData) {
return Promise.reject('楼层数据未加载, catalogCode=' + catalogCode)
} }
const vdata: any = {
const floor = _.find(_____veryBigItemsData, r => r.catalogCode === this.state.catalogCode && r.t === 'floor') items: items as ItemJson[],
if (floor) { infos: { catalogCode, t: 'floor' },
if (!floor.items) { isChanged: false,
floor.items = [] catalog: _.cloneDeep(this.state.catalog),
} server: this.state.server,
project_uuid: this.state.project_uuid,
const items = _.cloneDeep(floor.items) catalogCode: catalogCode,
delete floor.items worldData: _.cloneDeep(this.state.worldData)
console.log("floor", floor);
//@ts-ignore
const vdata: VData = {
items: items as ItemJson[],
infos: floor,
isChanged: false,
catalog: _.cloneDeep(this.state.catalog),
server: this.state.server,
project_uuid: this.state.project_uuid,
catalogCode: catalogCode,
worldData: _.cloneDeep(this.state.worldData)
}
console.log('从服务器返回数据, 一共' + vdata.items.length + '个')
return Promise.resolve(vdata)
} }
return Promise.reject('楼层不存在, catalogCode=' + catalogCode) return Promise.resolve(vdata)
} }
clear() { clear() {

21
src/editor/ModelMain.vue

@ -11,11 +11,11 @@
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
<div v-if="isModelOpen" style="display: flex; flex-direction: row; align-items: center; margin-right: 10px;"> <div v-if="isModelOpen" style="display: flex; flex-direction: row; align-items: center; margin-right: 10px;">
<div class="field-block" style="margin-right: 5px;"> <div class="field-block" style="margin-right: 5px;">
<el-select style="width:130px;" placeholder="运行环境" <el-select style="width:180px;" placeholder="运行环境"
v-model="worldModelState.runState.currentEnvId"> v-model="worldModelState.runState.currentEnvId">
<el-option v-for="env in envList" :key="env.env_id" :label="env.env_name" :value="env.env_id"></el-option> <el-option v-for="env in envList" :key="env.envId" :label="env.envName" :value="env.envId"></el-option>
<template #footer> <template #footer>
<el-button size="small" type="primary" plain>创建运行环境</el-button> <el-button size="small" type="primary" @click="createEnv" plain>创建虚拟环境</el-button>
<el-button size="small" :icon="renderIcon('Refresh')" @click="reloadEnvList" /> <el-button size="small" :icon="renderIcon('Refresh')" @click="reloadEnvList" />
</template> </template>
</el-select> </el-select>
@ -32,12 +32,12 @@
v-if="!worldModelState.runState.isRunning" v-if="!worldModelState.runState.isRunning"
:disabled="!worldModelState.runState.currentEnvId" :disabled="!worldModelState.runState.currentEnvId"
:loading="worldModelState.runState.isLoading" :loading="worldModelState.runState.isLoading"
@click="startEnv">启动仿真 @click="startEnv">启动服务
</el-button> </el-button>
<el-button :icon="renderIcon('Stop')" type="danger" plain <el-button :icon="renderIcon('Stop')" type="danger" plain
v-if="worldModelState.runState.isRunning" v-if="worldModelState.runState.isRunning"
:loading="worldModelState.runState.isLoading" :loading="worldModelState.runState.isLoading"
@click="stopEnv">停止仿真 @click="stopEnv">停止服务
</el-button> </el-button>
</div> </div>
</div> </div>
@ -302,7 +302,7 @@ export default {
renderIcon, renderIcon,
getWidgetBySide, getWidgetBySide,
startEnv() { startEnv() {
const env = this.envList.find(env => env.env_id === this.worldModelState.runState.currentEnvId) const env = this.envList.find(env => env.envId === this.worldModelState.runState.currentEnvId)
if (env) { if (env) {
this.currentViewport.envManager.start(env) this.currentViewport.envManager.start(env)
} }
@ -310,10 +310,15 @@ export default {
stopEnv() { stopEnv() {
this.currentViewport.envManager.stop() this.currentViewport.envManager.stop()
}, },
createEnv() {
EnvManager.createEnv(this.worldModelState.project_uuid).then(() => {
this.reloadEnvList()
})
},
reloadEnvList() { reloadEnvList() {
EnvManager.getAllEnv(this.worldModelState.project_uuid) EnvManager.getAllEnv(this.worldModelState.project_uuid)
.then(res => { .then(envList => {
this.envList = res.data this.envList = envList
}) })
}, },
toHome() { toHome() {

12
src/editor/OpenProject.vue

@ -50,14 +50,8 @@ const data: OpenProjectData = {
// //
rowSelection: 'single', rowSelection: 'single',
columnDefs: [ columnDefs: [
{ field: 'id', headerName: 'id', editable: false }, { field: 'projectUuid', headerName: '项目编号', editable: false, flex: 1 },
{ field: 'projectUuid', headerName: '项目编号', editable: false }, { field: 'projectLabel', headerName: '项目标题', editable: false, flex: 1 }
{ field: 'projectLabel', headerName: '项目标题', editable: false },
{ field: 'projectVersion', headerName: '项目版本', editable: false },
{ field: 'createAt', headerName: '创建时间', editable: false },
{ field: 'createBy', headerName: '创建人', editable: false },
{ field: 'updateAt', headerName: '最后更新时间', editable: false },
{ field: 'updateBy', headerName: '更新人', editable: false }
], ],
onGridReady(event: GridReadyEvent) { onGridReady(event: GridReadyEvent) {
data.api = event.api data.api = event.api
@ -69,7 +63,7 @@ onMounted(loadData)
function loadData() { function loadData() {
Request.request.post('/api/workbench/LccModelManager@projectList').then(res => { Request.request.post('/api/workbench/LccModelManager@projectList').then(res => {
state.grid1Data = res.records state.grid1Data = res.data
}) })
} }

50
src/editor/menus/FileMenu.ts

@ -60,35 +60,12 @@ export default defineMenu((menus) => {
[ [
{ {
name: 'open', label: '打开', icon: SvgCode.open, order: 1, tip: 'Ctrl+O', name: 'open', label: '打开', icon: SvgCode.open, order: 1, tip: 'Ctrl+O',
click2: async () => {
worldModel.state.isOpened = false
worldModel.state.isDraft = false
worldModel.state.catalog = []
worldModel.state.catalogCode = ''
worldModel.state.stateManagerId = ''
setQueryParam('store', '')
system.showLoading()
try {
await nextTick()
const res = await import('@/example/example1')
worldModel.state.isDraft = false
await worldModel.loadWorldFromRemoting(res.default)
} finally {
system.clearLoading()
}
},
click: async () => { click: async () => {
let dialog: any = null let dialog: any = null
system.showDialog(createVNode(OpenProject, { system.showDialog(createVNode(OpenProject, {
onCancel: () => dialog?.onClose(), onCancel: () => dialog?.onClose(),
onOpen: async row => { onOpen: async lccModelWorld => {
dialog?.onClose() dialog?.onClose()
const veryBigData = JSON.parse(row.otherData)
veryBigData.catalog = JSON.parse(row.directoryData)
if (!veryBigData.items) veryBigData.items = []
worldModel.state.isOpened = false worldModel.state.isOpened = false
worldModel.state.isDraft = false worldModel.state.isDraft = false
worldModel.state.catalog = [] worldModel.state.catalog = []
@ -99,7 +76,7 @@ export default defineMenu((menus) => {
try { try {
await nextTick() await nextTick()
worldModel.state.isDraft = false worldModel.state.isDraft = false
await worldModel.loadWorldFromRemoting(veryBigData) await worldModel.loadWorldFromRemoting(lccModelWorld)
} finally { } finally {
system.clearLoading() system.clearLoading()
} }
@ -124,22 +101,35 @@ export default defineMenu((menus) => {
{ {
name: 'save', label: '保存', icon: SvgCode.save, order: 2, tip: 'Ctrl+S', name: 'save', label: '保存', icon: SvgCode.save, order: 2, tip: 'Ctrl+S',
click: async () => { click: async () => {
if (!worldModel.state.runState.currentEnvId) {
system.showErrorDialog('请先选择环境')
return
}
system.showLoading('正在保存模型数据...')
const viewport: Viewport = window['viewport'] const viewport: Viewport = window['viewport']
const vdata: any = await viewport.stateManager.save() const vdata: any = await viewport.stateManager.save()
console.log(system.json5.stringify(vdata.items))
system.showLoading('正在保存模型数据...') for (const item of vdata.items) {
// 将 items 中的 _rid 属性删除
if (item._rid) {
delete item._rid
}
}
try { try {
await Request.request.post('/api/workbench/LccModelManager@addOrUpdateFloor', { await Request.request.post('/api/workbench/LccModelManager@addOrUpdateFloor', {
projectUuid: worldModel.state.project_uuid, projectUuid: worldModel.state.project_uuid,
catalogCode: worldModel.state.catalogCode, catalogCode: worldModel.state.catalogCode,
envId: 1, envId: worldModel.state.runState.currentEnvId,
items: JSON.stringify(vdata.items) items: JSON.stringify(vdata.items, null, 2)
}) })
// console.log(JSON.stringify(worldModel.state)); // console.log(JSON.stringify(worldModel.state));
await Request.request.post('/api/workbench/LccModelManager@addOrUpdateWorld', { await Request.request.post('/api/workbench/LccModelManager@addOrUpdateWorld', {
projectUuid: worldModel.state.project_uuid, projectUuid: worldModel.state.project_uuid,
projectLabel: worldModel.state.project_label,
directoryData: JSON.stringify(worldModel.state.catalog), directoryData: JSON.stringify(worldModel.state.catalog),
envId: 1, envId: worldModel.state.runState.currentEnvId,
otherData: JSON.stringify(worldModel.state.worldData) otherData: JSON.stringify(worldModel.state.worldData)
}) })
system.msg('保存成功', 'success') system.msg('保存成功', 'success')

9
src/types/Model.d.ts

@ -212,11 +212,10 @@ declare function msg(str: string, type: MSG_TYPE = 1): void
* *
*/ */
interface EnvInfo { interface EnvInfo {
env_id: number envId: number
world_id: string envName: string
env_name: string isVirtual: boolean
is_virtual: boolean envConfig: any
env_payload: any
} }

Loading…
Cancel
Save