Merge branch 'refs/heads/test-platform'
This commit is contained in:
@@ -5,13 +5,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<mapper namespace="com.solution.system.mapper.BehaviortreeMapper">
|
<mapper namespace="com.solution.system.mapper.BehaviortreeMapper">
|
||||||
|
|
||||||
<resultMap type="Behaviortree" id="BehaviortreeResult">
|
<resultMap type="Behaviortree" id="BehaviortreeResult">
|
||||||
<result property="id" column="id" />
|
<result property="id" column="id" />
|
||||||
<result property="name" column="name" />
|
<result property="name" column="name" />
|
||||||
<result property="description" column="description" />
|
<result property="description" column="description" />
|
||||||
<result property="createdAt" column="created_at" />
|
<result property="createdAt" column="created_at" />
|
||||||
<result property="updatedAt" column="updated_at" />
|
<result property="updatedAt" column="updated_at" />
|
||||||
<result property="englishName" column="english_name" />
|
<result property="englishName" column="english_name"/>
|
||||||
<result property="xmlContent" column="xml_content" />
|
<result property="xmlContent" column="xml_content" />
|
||||||
|
<result property="platformId" column="platform_id" />
|
||||||
|
<result property="scenarioId" column="scenario_id" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<select id="findOneByPlatformId" resultMap="BehaviortreeResult">
|
<select id="findOneByPlatformId" resultMap="BehaviortreeResult">
|
||||||
@@ -37,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectBehaviortreeById" parameterType="Long" resultMap="BehaviortreeResult">
|
<select id="selectBehaviortreeById" parameterType="Long" resultMap="BehaviortreeResult">
|
||||||
<include refid="selectBehaviortreeVo"/>
|
select id, name, description, created_at, updated_at, english_name,graph, xml_content ,platform_id, scenario_id from behaviortree
|
||||||
where id = #{id}
|
where id = #{id}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ export const findOneTreeByPlatformId = (platformId: number): Promise<BehaviorTre
|
|||||||
return req.get(`/system/behaviortree/platform/${platformId}`);
|
return req.get(`/system/behaviortree/platform/${platformId}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const findSubPlatforms = (treeId: number): Promise<BehaviorTreeDetailsResponse> => {
|
||||||
|
return req.get(`/system/behaviortree/underling/${treeId}`);
|
||||||
|
};
|
||||||
|
|
||||||
export const findOneTreeById = (id: number): Promise<BehaviorTreeDetailsResponse> => {
|
export const findOneTreeById = (id: number): Promise<BehaviorTreeDetailsResponse> => {
|
||||||
return req.get(`/system/behaviortree/${id}`);
|
return req.get(`/system/behaviortree/${id}`);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
<Properties
|
<Properties
|
||||||
v-if="graph"
|
v-if="graph"
|
||||||
:platforms="platforms"
|
:platforms="platforms"
|
||||||
|
:sub-platforms="subPlatforms"
|
||||||
:nodeCommands="nodeCommands"
|
:nodeCommands="nodeCommands"
|
||||||
:element="selectedNodeTaskElement"
|
:element="selectedNodeTaskElement"
|
||||||
:graph="(graph as any)"
|
:graph="(graph as any)"
|
||||||
@@ -75,7 +76,7 @@ import { createGraphTaskElement, createLineOptions, type GraphContainer, type Gr
|
|||||||
import { registerNodeElement } from './register';
|
import { registerNodeElement } from './register';
|
||||||
import { findAllBasicPlatforms, findAllNodeCommands } from '../api';
|
import { findAllBasicPlatforms, findAllNodeCommands } from '../api';
|
||||||
import type { NodeCommand, Platform } from '../types';
|
import type { NodeCommand, Platform } from '../types';
|
||||||
import { createTree, findOneTreeById, findOneTreeByPlatformId, updateTree } from './api';
|
import { createTree, findOneTreeById, findOneTreeByPlatformId, updateTree, findSubPlatforms } from './api';
|
||||||
import TressCard from './trees-card.vue';
|
import TressCard from './trees-card.vue';
|
||||||
import NodesCard from './nodes-card.vue';
|
import NodesCard from './nodes-card.vue';
|
||||||
|
|
||||||
@@ -112,6 +113,7 @@ export default defineComponent({
|
|||||||
const changed = ref<boolean>(false);
|
const changed = ref<boolean>(false);
|
||||||
const treesCardRef = ref<InstanceType<typeof TressCard> | null>(null);
|
const treesCardRef = ref<InstanceType<typeof TressCard> | null>(null);
|
||||||
const platforms = ref<Platform[]>([]);
|
const platforms = ref<Platform[]>([]);
|
||||||
|
const subPlatforms = ref<Platform[]>([]);
|
||||||
const nodeCommands = ref<NodeCommand[]>([])
|
const nodeCommands = ref<NodeCommand[]>([])
|
||||||
const currentScenarioId = ref<number | null>(null);
|
const currentScenarioId = ref<number | null>(null);
|
||||||
const currentPlatformId = ref<number | null>(null);
|
const currentPlatformId = ref<number | null>(null);
|
||||||
@@ -153,6 +155,27 @@ export default defineComponent({
|
|||||||
loadNodeCommands();
|
loadNodeCommands();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 加载下属平台
|
||||||
|
const loadSubPlatforms = (treeId: number) => {
|
||||||
|
console.log(treeId);
|
||||||
|
|
||||||
|
if (!treeId || treeId <= 0) {
|
||||||
|
subPlatforms.value = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
findSubPlatforms(treeId).then(r => {
|
||||||
|
if (r.data && Array.isArray(r.data)) {
|
||||||
|
subPlatforms.value = r.data as Platform[];
|
||||||
|
} else {
|
||||||
|
subPlatforms.value = [];
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
console.error('加载下属平台失败:', err);
|
||||||
|
subPlatforms.value = [];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// 处理拖动开始
|
// 处理拖动开始
|
||||||
const handleDragStart = (nm: NodeDragTemplate) => {
|
const handleDragStart = (nm: NodeDragTemplate) => {
|
||||||
draggedNodeData.value = nm;
|
draggedNodeData.value = nm;
|
||||||
@@ -267,6 +290,10 @@ export default defineComponent({
|
|||||||
graph: nodeGraph,
|
graph: nodeGraph,
|
||||||
};
|
};
|
||||||
currentTreeEditing.value = true;
|
currentTreeEditing.value = true;
|
||||||
|
|
||||||
|
// 加载下属平台
|
||||||
|
loadSubPlatforms(r.data.id);
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
initGraph();
|
initGraph();
|
||||||
});
|
});
|
||||||
@@ -343,6 +370,7 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
selectedModelNode.value = null;
|
selectedModelNode.value = null;
|
||||||
selectedNodeTaskElement.value = null;
|
selectedNodeTaskElement.value = null;
|
||||||
|
subPlatforms.value = []; // 重置下属平台
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
initGraph();
|
initGraph();
|
||||||
@@ -487,6 +515,7 @@ export default defineComponent({
|
|||||||
nodeCommands,
|
nodeCommands,
|
||||||
currentScenarioId,
|
currentScenarioId,
|
||||||
platforms,
|
platforms,
|
||||||
|
subPlatforms,
|
||||||
treesCardRef,
|
treesCardRef,
|
||||||
handleCreateTree,
|
handleCreateTree,
|
||||||
currentTreeEditing,
|
currentTreeEditing,
|
||||||
|
|||||||
@@ -101,7 +101,7 @@
|
|||||||
size="small"
|
size="small"
|
||||||
type="editable-card"
|
type="editable-card"
|
||||||
@edit="onEditParameterTab">
|
@edit="onEditParameterTab">
|
||||||
<a-tab-pane v-for="(grouped,index) in groupedParameters" :key="index" :tab="`平台 ${index + 1}`" :closable="true">
|
<a-tab-pane v-for="(grouped,index) in groupedParameters" :key="index" :tab="getPlatformTabName(index)" :closable="true">
|
||||||
<a-form-item v-for="setting in grouped" :label="setting.description">
|
<a-form-item v-for="setting in grouped" :label="setting.description">
|
||||||
<a-input-number v-if="setting.dataType === 'double'"
|
<a-input-number v-if="setting.dataType === 'double'"
|
||||||
v-model:value="setting.defaultValue"
|
v-model:value="setting.defaultValue"
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
<a-select :placeholder="`请选择${setting.description}`"
|
<a-select :placeholder="`请选择${setting.description}`"
|
||||||
allow-clear
|
allow-clear
|
||||||
v-else-if="setting.paramKey === 'platforms'" v-model:value="setting.defaultValue">
|
v-else-if="setting.paramKey === 'platforms'" v-model:value="setting.defaultValue">
|
||||||
<a-select-option v-for="pl in platforms" :value="pl.name">{{pl.description}}</a-select-option>
|
<a-select-option v-for="pl in getAvailablePlatforms()" :value="pl.name">{{pl.description}}</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
<a-select :placeholder="`请选择${setting.description}`"
|
<a-select :placeholder="`请选择${setting.description}`"
|
||||||
allow-clear
|
allow-clear
|
||||||
@@ -194,11 +194,13 @@ export default defineComponent({
|
|||||||
node: { type: [Object, null] as PropType<Node<NodeProperties> | null | undefined>, required: false },
|
node: { type: [Object, null] as PropType<Node<NodeProperties> | null | undefined>, required: false },
|
||||||
graph: { type: [Object, null] as PropType<Graph | null | undefined>, required: true },
|
graph: { type: [Object, null] as PropType<Graph | null | undefined>, required: true },
|
||||||
platforms: { type: Array as PropType<Platform[]>, required: true },
|
platforms: { type: Array as PropType<Platform[]>, required: true },
|
||||||
|
subPlatforms: { type: Array as PropType<Platform[]>, required: false, default: () => [] },
|
||||||
nodeCommands: { type: Array as PropType<NodeCommand[]>, required: true },
|
nodeCommands: { type: Array as PropType<NodeCommand[]>, required: true },
|
||||||
},
|
},
|
||||||
emits: ['update-element', 'update-tree'],
|
emits: ['update-element', 'update-tree'],
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const platforms = ref<Platform[]>(props.platforms ?? []);
|
const platforms = ref<Platform[]>(props.platforms ?? []);
|
||||||
|
const subPlatforms = ref<Platform[]>(props.subPlatforms ?? []);
|
||||||
const nodeCommands = ref<NodeCommand[]>(props.nodeCommands ?? []);
|
const nodeCommands = ref<NodeCommand[]>(props.nodeCommands ?? []);
|
||||||
|
|
||||||
const activeTopTabsKey = ref<string>('1');
|
const activeTopTabsKey = ref<string>('1');
|
||||||
@@ -299,6 +301,41 @@ export default defineComponent({
|
|||||||
multiableParameters.value = multiable === true && groupedParameters.value.length > 0;
|
multiableParameters.value = multiable === true && groupedParameters.value.length > 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 获取平台Tab显示名称
|
||||||
|
const getPlatformTabName = (index: number): string => {
|
||||||
|
if (!currentTree.value?.platformId) {
|
||||||
|
return `平台 ${index + 1}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找当前行为树绑定的平台
|
||||||
|
const currentPlatform = platforms.value.find(p => p.id === currentTree.value?.platformId);
|
||||||
|
if (!currentPlatform) {
|
||||||
|
return `平台 ${index + 1}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果有多个分组,显示平台名称和索引
|
||||||
|
if (groupedParameters.value.length > 1) {
|
||||||
|
return `${currentPlatform.name || '未知平台'}-${index + 1}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentPlatform.name || '平台';
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取可用的平台列表(包括当前平台和其下属平台)
|
||||||
|
const getAvailablePlatforms = (): Platform[] => {
|
||||||
|
if (!currentTree.value?.platformId) {
|
||||||
|
return platforms.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果有下属平台,返回下属平台列表
|
||||||
|
if (subPlatforms.value && subPlatforms.value.length > 0) {
|
||||||
|
return subPlatforms.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 否则返回所有平台
|
||||||
|
return platforms.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const resolveNode = (n?: Node | null | undefined) => {
|
const resolveNode = (n?: Node | null | undefined) => {
|
||||||
groupedParametersActiveTab.value = 0;
|
groupedParametersActiveTab.value = 0;
|
||||||
@@ -389,6 +426,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
watch(() => props.nodeCommands, (n: NodeCommand[] | null | undefined) => nodeCommands.value = n ?? [], { deep: true, immediate: true });
|
watch(() => props.nodeCommands, (n: NodeCommand[] | null | undefined) => nodeCommands.value = n ?? [], { deep: true, immediate: true });
|
||||||
watch(() => props.platforms, (n: Platform[] | null | undefined) => platforms.value = n ?? [], { deep: true, immediate: true });
|
watch(() => props.platforms, (n: Platform[] | null | undefined) => platforms.value = n ?? [], { deep: true, immediate: true });
|
||||||
|
watch(() => props.subPlatforms, (n: Platform[] | null | undefined) => subPlatforms.value = n ?? [], { deep: true, immediate: true });
|
||||||
|
|
||||||
onMounted(() => load());
|
onMounted(() => load());
|
||||||
|
|
||||||
@@ -400,6 +438,8 @@ export default defineComponent({
|
|||||||
multiableParameters,
|
multiableParameters,
|
||||||
onEditParameterTab,
|
onEditParameterTab,
|
||||||
groupedParameters,
|
groupedParameters,
|
||||||
|
getPlatformTabName,
|
||||||
|
getAvailablePlatforms,
|
||||||
actionSpaceColumns,
|
actionSpaceColumns,
|
||||||
activeTopTabsKey,
|
activeTopTabsKey,
|
||||||
activeBottomTabsKey,
|
activeBottomTabsKey,
|
||||||
|
|||||||
Reference in New Issue
Block a user