Browse Source

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

master
修宁 6 months ago
parent
commit
86289e3512
  1. 27
      src/core/manager/EnvManager.ts
  2. 61
      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.')
return
}
const payload = env.env_payload
const payload = env.envConfig
const brokerUrl = payload?.mqtt?.websocket
const username = payload?.mqtt?.username
const password = payload?.mqtt?.password
@ -205,15 +205,11 @@ export default class EnvManager {
}
static CURRENT_ALL_ENV: EnvInfo[]
/**
*
* @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.')
}
@ -228,25 +224,8 @@ export default class EnvManager {
const res = await Request.request.post('/api/workbench/EnvController@getAllEnv', {
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
return res.data
}
/**

61
src/core/manager/WorldModel.ts

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

21
src/editor/ModelMain.vue

@ -11,11 +11,11 @@
<div style="flex-grow: 1;"></div>
<div v-if="isModelOpen" style="display: flex; flex-direction: row; align-items: center; margin-right: 10px;">
<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">
<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>
<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" />
</template>
</el-select>
@ -32,12 +32,12 @@
v-if="!worldModelState.runState.isRunning"
:disabled="!worldModelState.runState.currentEnvId"
:loading="worldModelState.runState.isLoading"
@click="startEnv">启动仿真
@click="startEnv">启动服务
</el-button>
<el-button :icon="renderIcon('Stop')" type="danger" plain
v-if="worldModelState.runState.isRunning"
:loading="worldModelState.runState.isLoading"
@click="stopEnv">停止仿真
@click="stopEnv">停止服务
</el-button>
</div>
</div>
@ -302,7 +302,7 @@ export default {
renderIcon,
getWidgetBySide,
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) {
this.currentViewport.envManager.start(env)
}
@ -310,10 +310,15 @@ export default {
stopEnv() {
this.currentViewport.envManager.stop()
},
createEnv() {
EnvManager.createEnv(this.worldModelState.project_uuid).then(() => {
this.reloadEnvList()
})
},
reloadEnvList() {
EnvManager.getAllEnv(this.worldModelState.project_uuid)
.then(res => {
this.envList = res.data
.then(envList => {
this.envList = envList
})
},
toHome() {

12
src/editor/OpenProject.vue

@ -50,14 +50,8 @@ const data: OpenProjectData = {
//
rowSelection: 'single',
columnDefs: [
{ field: 'id', headerName: 'id', editable: false },
{ field: 'projectUuid', headerName: '项目编号', editable: false },
{ 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 }
{ field: 'projectUuid', headerName: '项目编号', editable: false, flex: 1 },
{ field: 'projectLabel', headerName: '项目标题', editable: false, flex: 1 }
],
onGridReady(event: GridReadyEvent) {
data.api = event.api
@ -69,7 +63,7 @@ onMounted(loadData)
function loadData() {
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',
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 () => {
let dialog: any = null
system.showDialog(createVNode(OpenProject, {
onCancel: () => dialog?.onClose(),
onOpen: async row => {
onOpen: async lccModelWorld => {
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.isDraft = false
worldModel.state.catalog = []
@ -99,7 +76,7 @@ export default defineMenu((menus) => {
try {
await nextTick()
worldModel.state.isDraft = false
await worldModel.loadWorldFromRemoting(veryBigData)
await worldModel.loadWorldFromRemoting(lccModelWorld)
} finally {
system.clearLoading()
}
@ -124,22 +101,35 @@ export default defineMenu((menus) => {
{
name: 'save', label: '保存', icon: SvgCode.save, order: 2, tip: 'Ctrl+S',
click: async () => {
if (!worldModel.state.runState.currentEnvId) {
system.showErrorDialog('请先选择环境')
return
}
system.showLoading('正在保存模型数据...')
const viewport: Viewport = window['viewport']
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 {
await Request.request.post('/api/workbench/LccModelManager@addOrUpdateFloor', {
projectUuid: worldModel.state.project_uuid,
catalogCode: worldModel.state.catalogCode,
envId: 1,
items: JSON.stringify(vdata.items)
envId: worldModel.state.runState.currentEnvId,
items: JSON.stringify(vdata.items, null, 2)
})
// console.log(JSON.stringify(worldModel.state));
await Request.request.post('/api/workbench/LccModelManager@addOrUpdateWorld', {
projectUuid: worldModel.state.project_uuid,
projectLabel: worldModel.state.project_label,
directoryData: JSON.stringify(worldModel.state.catalog),
envId: 1,
envId: worldModel.state.runState.currentEnvId,
otherData: JSON.stringify(worldModel.state.worldData)
})
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 {
env_id: number
world_id: string
env_name: string
is_virtual: boolean
env_payload: any
envId: number
envName: string
isVirtual: boolean
envConfig: any
}

Loading…
Cancel
Save