This commit is contained in:
2026-03-27 09:23:04 +08:00
6 changed files with 115 additions and 9 deletions

View File

@@ -20,8 +20,11 @@ import com.solution.web.core.graph.GraphEdge;
import com.solution.web.core.graph.GraphNode; import com.solution.web.core.graph.GraphNode;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@Component @Component
@@ -98,10 +101,17 @@ public class BehaviortreeProcessor {
instanceKeyMap.put(node.getKey(), instance); instanceKeyMap.put(node.getKey(), instance);
if (node.hasParameters()) { if (node.hasParameters()) {
// 插入parameter nodeparameter if (node.isMultiable()) {
for (Templateparameterdef parameter : node.getParameters()) { List<Nodeparameter> nodeparameters = createMultiableNodeparameter(behaviortree, node, instance);
Nodeparameter nodeparameter = createNodeParameter(behaviortree, parameter, instance); for (Nodeparameter nodeparameter : nodeparameters) {
nodeparameterService.insertNodeparameter(nodeparameter); nodeparameterService.insertNodeparameter(nodeparameter);
}
} else {
// 插入parameter nodeparameter
for (Templateparameterdef parameter : node.getParameters()) {
Nodeparameter nodeparameter = createNodeParameter(behaviortree, parameter, instance);
nodeparameterService.insertNodeparameter(nodeparameter);
}
} }
} }
nodeKeyIndexMap.put(node.getKey(), index); nodeKeyIndexMap.put(node.getKey(), index);
@@ -148,6 +158,47 @@ public class BehaviortreeProcessor {
return connection; return connection;
} }
private List<Nodeparameter> createMultiableNodeparameter(Behaviortree behaviortree, GraphNode node,
Treenodeinstance instance) {
List<Nodeparameter> nodeparameters = new ArrayList<>();
Map<Long, List<String>> idValues = new HashMap<>();
List<String> tmpValues = null;
Map<Long, List<Templateparameterdef>> mappedValues = new HashMap<>();
List<Templateparameterdef> tmpDefs = null;
for (Templateparameterdef parameter : node.getParameters()) {
tmpDefs = mappedValues.get(parameter.getId() );
if (null == tmpDefs) {
tmpDefs = new ArrayList<>();
}
tmpDefs.add(parameter);
mappedValues.put(parameter.getId(), tmpDefs);
tmpValues = idValues.get(parameter.getId() );
if (null == tmpValues) {
tmpValues = new ArrayList<>();
}
tmpValues.add(parameter.getDefaultValue());
idValues.put(parameter.getId(), tmpValues);
}
int index = 0;
for (Long id : idValues.keySet()) {
tmpValues = idValues.get(id);
Nodeparameter nodeparameter = new Nodeparameter();
nodeparameter.setTreeId(behaviortree.getId());
nodeparameter.setNodeInstanceId(instance.getId());
nodeparameter.setParamDefId(id);
nodeparameter.setValue(StringUtils.collectionToCommaDelimitedString(tmpValues));
nodeparameter.setGroupIndex(index);
nodeparameters.add(nodeparameter);
index++;
}
return nodeparameters;
}
private Nodeparameter createNodeParameter(Behaviortree behaviortree, Templateparameterdef parameter, private Nodeparameter createNodeParameter(Behaviortree behaviortree, Templateparameterdef parameter,
Treenodeinstance instance) { Treenodeinstance instance) {
Nodeparameter nodeparameter = new Nodeparameter(); Nodeparameter nodeparameter = new Nodeparameter();
@@ -155,6 +206,7 @@ public class BehaviortreeProcessor {
nodeparameter.setNodeInstanceId(instance.getId()); nodeparameter.setNodeInstanceId(instance.getId());
nodeparameter.setParamDefId(parameter.getId()); nodeparameter.setParamDefId(parameter.getId());
nodeparameter.setValue(parameter.getDefaultValue()); nodeparameter.setValue(parameter.getDefaultValue());
nodeparameter.setGroupIndex(parameter.getGroupIndex());
return nodeparameter; return nodeparameter;
} }

View File

@@ -0,0 +1,21 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import { HttpRequestClient } from '@/utils/request';
import type { BasicResponse } from '@/types';
import type { PlatformListableResponse } from './types';
const req = HttpRequestClient.create<BasicResponse>({
baseURL: '/api',
});
export const findAllBasicPlatforms = (): Promise<PlatformListableResponse> => {
return req.get<PlatformListableResponse>('/system/firerule/platforms/basic');
};

View File

@@ -7,8 +7,9 @@
* that was distributed with this source code. * that was distributed with this source code.
*/ */
import { Graph, Node,Edge } from '@antv/x6'; import { Edge, Graph, Node } from '@antv/x6';
import type { Platform, PlatformComponent, PlatformRelation } from './types'; import type { PlatformRelation } from './types';
import type { Platform, PlatformComponent } from '../types';
import type { GraphTaskElement } from '../graph'; import type { GraphTaskElement } from '../graph';
/** /**

View File

@@ -37,6 +37,7 @@
</div> </div>
<Properties <Properties
v-if="graph" v-if="graph"
:platforms="platforms"
:element="selectedNodeTaskElement" :element="selectedNodeTaskElement"
:graph="graph as any" :graph="graph as any"
:node="selectedModelNode as any" :node="selectedModelNode as any"
@@ -65,7 +66,8 @@ import { createGraphTaskElementFromTemplate } from './utils';
import { createGraphTaskElement, createLineOptions, type GraphContainer, type GraphTaskElement, hasElements, hasRootElementNode, resolveGraph, useGraphCanvas } from '../graph'; import { createGraphTaskElement, createLineOptions, type GraphContainer, type GraphTaskElement, hasElements, hasRootElementNode, resolveGraph, useGraphCanvas } from '../graph';
import { registerNodeElement } from './register'; import { registerNodeElement } from './register';
import { findAllBasicPlatforms } from '../api';
import type { Platform } from '../types';
import { createTree, findOneTreeById, updateTree } from './api'; import { createTree, findOneTreeById, updateTree } 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';
@@ -100,6 +102,7 @@ export default defineComponent({
const selectedNodeTaskElement = ref<GraphTaskElement | null>(null); const selectedNodeTaskElement = ref<GraphTaskElement | null>(null);
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 { const {
handleGraphEvent, handleGraphEvent,
@@ -111,6 +114,13 @@ export default defineComponent({
resizeCanvas, resizeCanvas,
} = useGraphCanvas(); } = useGraphCanvas();
const loadPlatforms = () => {
platforms.value = [];
findAllBasicPlatforms().then(r => {
platforms.value = r.data ?? [];
});
};
// 处理拖动开始 // 处理拖动开始
const handleDragStart = (nm: NodeDragTemplate) => { const handleDragStart = (nm: NodeDragTemplate) => {
draggedNodeData.value = nm; draggedNodeData.value = nm;
@@ -393,6 +403,7 @@ export default defineComponent({
// 初始化 // 初始化
onMounted(() => { onMounted(() => {
init(); init();
loadPlatforms();
}); });
// 清理 // 清理
@@ -410,6 +421,7 @@ export default defineComponent({
}); });
return { return {
platforms,
treesCardRef, treesCardRef,
handleCreateTree, handleCreateTree,
currentTreeEditing, currentTreeEditing,

View File

@@ -103,9 +103,16 @@
@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="`平台 ${index + 1}`" :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'" v-model:value="setting.defaultValue" <a-input-number v-if="setting.dataType === 'double'"
v-model:value="setting.defaultValue"
:placeholder="setting.description" size="small" style="width:100%;" /> :placeholder="setting.description" size="small" style="width:100%;" />
<a-input v-else v-model:value="setting.defaultValue" :placeholder="setting.description" size="small" /> <a-select :placeholder="`请选择${setting.description}`"
allow-clear
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>
<a-input v-else v-model:value="setting.defaultValue"
:placeholder="setting.description" size="small" />
</a-form-item> </a-form-item>
</a-tab-pane> </a-tab-pane>
<!-- <template #leftExtra>--> <!-- <template #leftExtra>-->
@@ -154,6 +161,7 @@ import type { ElementParameter, ElementVariable, GraphTaskElement } from '../gra
import type { BehaviorTree } from './tree'; import type { BehaviorTree } from './tree';
import type { Graph, Node, NodeProperties } from '@antv/x6'; import type { Graph, Node, NodeProperties } from '@antv/x6';
import { generateKey } from '@/utils/strings'; import { generateKey } from '@/utils/strings';
import type { Platform } from '@/views/decision/types';
const actionSpaceColumns = [ const actionSpaceColumns = [
{ title: '序号', dataIndex: 'index', key: 'index', width: 40 }, { title: '序号', dataIndex: 'index', key: 'index', width: 40 },
@@ -170,9 +178,12 @@ export default defineComponent({
treeEditing: { type: Boolean as PropType<boolean>, required: true, default: false }, treeEditing: { type: Boolean as PropType<boolean>, required: true, default: false },
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 },
}, },
emits: ['update-element', 'update-tree'], emits: ['update-element', 'update-tree'],
setup(props, { emit }) { setup(props, { emit }) {
const platforms = ref<Platform[]>(props.platforms ?? []);
const activeTopTabsKey = ref<string>('1'); const activeTopTabsKey = ref<string>('1');
const activeBottomTabsKey = ref<string>('1'); const activeBottomTabsKey = ref<string>('1');
const activeBottomTabs2Key = ref<string>('1'); const activeBottomTabs2Key = ref<string>('1');
@@ -187,6 +198,8 @@ export default defineComponent({
const multiableParameters = ref<boolean>(false); const multiableParameters = ref<boolean>(false);
const groupedParametersActiveTab = ref<number>(0); const groupedParametersActiveTab = ref<number>(0);
console.error(platforms.value)
const createEmptyParameters = (): ElementParameter[] => { const createEmptyParameters = (): ElementParameter[] => {
try { try {
return JSON.parse(JSON.stringify(currentElement.value?.parameters ?? [])) as ElementParameter[]; return JSON.parse(JSON.stringify(currentElement.value?.parameters ?? [])) as ElementParameter[];
@@ -359,9 +372,12 @@ export default defineComponent({
watch(() => currentElement.value, () => updateNode(), { deep: true }); watch(() => currentElement.value, () => updateNode(), { deep: true });
watch(() => props.platforms, (n: Platform[] | null | undefined) => platforms.value = n ?? [], { deep: true, immediate: true });
onMounted(() => load()); onMounted(() => load());
return { return {
platforms,
addParameterTab, addParameterTab,
groupedParametersActiveTab, groupedParametersActiveTab,
multiableParameters, multiableParameters,

View File

@@ -18,6 +18,10 @@ export interface Platform {
[key: string]: unknown; [key: string]: unknown;
} }
export interface PlatformListableResponse extends ApiDataResponse<Platform[]> {
}
export interface PlatformComponent { export interface PlatformComponent {
id: number, id: number,
name: NullableString, name: NullableString,