feat(flow):优化事件监听与发送节点编辑器

- 为EventListenEditor和EventSendEditor组件添加node属性传参
- 修改queryEventItemBySceneId调用方式,支持更多查询参数
- 更新事件选择逻辑,兼容新旧数据格式处理
- 修复事件选项key值,使用topic替代topicId避免重复
master
钟良源 3 months ago
parent 05f3b6f47f
commit 309fbf95a2

@ -41,9 +41,9 @@ const LocalNodeEditor: React.FC<NodeEditorProps> = ({
case 'CYCLE': // 周期 case 'CYCLE': // 周期
return <CycleEditor nodeData={nodeData} updateNodeData={updateNodeData} />; return <CycleEditor nodeData={nodeData} updateNodeData={updateNodeData} />;
case 'EVENTLISTENE': // 事件接收 case 'EVENTLISTENE': // 事件接收
return <EventListenEditor nodeData={nodeData} updateNodeData={updateNodeData} />; return <EventListenEditor nodeData={nodeData} updateNodeData={updateNodeData} node={node} />;
case 'EVENTSEND': // 事件发送 case 'EVENTSEND': // 事件发送
return <EventSendEditor nodeData={nodeData} updateNodeData={updateNodeData} />; return <EventSendEditor nodeData={nodeData} updateNodeData={updateNodeData} node={node} />;
case 'JSON2STR': // JSON转字符串 case 'JSON2STR': // JSON转字符串
return <JsonToStringEditor nodeData={nodeData} updateNodeData={updateNodeData} />; return <JsonToStringEditor nodeData={nodeData} updateNodeData={updateNodeData} />;
case 'STR2JSON': // 字符串转JSON case 'STR2JSON': // 字符串转JSON

@ -7,12 +7,17 @@ import { useDispatch, useSelector } from 'react-redux';
import { queryEventItemBySceneId } from '@/api/event'; import { queryEventItemBySceneId } from '@/api/event';
import ParamsTable from '@/components/FlowEditor/nodeEditors/components/ParamsTable'; import ParamsTable from '@/components/FlowEditor/nodeEditors/components/ParamsTable';
const EventListenEditor: React.FC<NodeEditorProps> = ({ nodeData, updateNodeData }) => { const EventListenEditor: React.FC<NodeEditorProps> = ({ node, nodeData, updateNodeData }) => {
const [eventList, setEventList] = useState<any[]>(); const [eventList, setEventList] = useState<any[]>();
const { currentAppData } = useSelector(state => state.ideContainer); const { currentAppData } = useSelector(state => state.ideContainer);
const getEventList = async () => { const getEventList = async () => {
const res = await queryEventItemBySceneId(currentAppData.sceneId); const params = {
nodeId: node.id,
appId: currentAppData.id,
sceneId: currentAppData.sceneId
};
const res = await queryEventItemBySceneId(params);
setEventList(res.data); setEventList(res.data);
}; };

@ -27,25 +27,30 @@ const EventSelect: React.FC<EventSelectProps> = ({ nodeData, eventList, type, on
const [form] = Form.useForm(); const [form] = Form.useForm();
const [showModal, setShowModal] = useState(false); const [showModal, setShowModal] = useState(false);
const [currentEvent, setCurrentEvent] = useState<any>(null); const [currentEvent, setCurrentEvent] = useState<any>(null);
const { currentAppData } = useSelector(state => state.ideContainer); const { currentAppData, eventListOld } = useSelector(state => state.ideContainer);
useEffect(() => { useEffect(() => {
if (nodeData && eventList && eventList.length > 0) { if (nodeData && eventList && eventList.length > 0) {
setOptions(eventList.filter(item => !item.topic.includes('**empty**'))); setOptions(eventList.filter(item => !item.topic.includes('**empty**')));
try { try {
// 数据是JSON字符串标识是接口回来的
const customDef = JSON.parse(nodeData.component?.customDef); const customDef = JSON.parse(nodeData.component?.customDef);
// 先判断topic是不是**empty**是就不设置currentevent // 先判断topic是不是**empty**是就不设置currentevent
if (customDef.topic && customDef.topic.includes('**empty**')) { if (customDef.topic && customDef.topic.includes('**empty**')) setCurrentEvent(null);
setCurrentEvent(null);
}
else { else {
setCurrentEvent(eventList.find(item => customDef.topic === item.topic)); if (!customDef.eventId) {
setCurrentEvent(eventList.find(item => customDef.topic === item.topic));
}
else {
const currentItem = eventListOld.find(item => customDef.eventId === item.eventId);
console.log('1', currentItem);
setCurrentEvent(currentItem.topic);
}
} }
} catch (e) { } catch (e) {
// 数据是普通对象标识是当前操作数据
// 先判断topic是不是**empty**是就不设置currentevent // 先判断topic是不是**empty**是就不设置currentevent
if (nodeData.component?.customDef?.topic && nodeData.component?.customDef?.topic.includes('**empty**')) { if (nodeData.component?.customDef?.topic && nodeData.component?.customDef?.topic.includes('**empty**')) setCurrentEvent(null);
setCurrentEvent(null);
}
else { else {
setCurrentEvent(eventList.find(item => nodeData.component?.customDef.topic === item.topic)); setCurrentEvent(eventList.find(item => nodeData.component?.customDef.topic === item.topic));
} }
@ -80,10 +85,11 @@ const EventSelect: React.FC<EventSelectProps> = ({ nodeData, eventList, type, on
}; };
const handelSelect = (e) => { const handelSelect = (e) => {
console.log('e:', e);
const data = { const data = {
type: typeMap[type], type: typeMap[type],
customDef: { customDef: {
eventId: null, eventId: e.eventId,
name: e.name, name: e.name,
topic: e.topic topic: e.topic
} }
@ -123,8 +129,8 @@ const EventSelect: React.FC<EventSelectProps> = ({ nodeData, eventList, type, on
)} )}
dropdownMenuStyle={{ maxHeight: 300 }} dropdownMenuStyle={{ maxHeight: 300 }}
> >
{options.map((option) => ( {options.map((option, index) => (
<Option key={option.topicId} value={option}> <Option key={option.topic} value={option}>
{option.name} {option.name}
</Option> </Option>
))} ))}

@ -12,7 +12,7 @@ const EventSendEditor: React.FC<NodeEditorProps> = ({ nodeData, updateNodeData }
const { currentAppData } = useSelector(state => state.ideContainer); const { currentAppData } = useSelector(state => state.ideContainer);
const getEventList = async () => { const getEventList = async () => {
const res = await queryEventItemBySceneId(currentAppData.sceneId); const res = await queryEventItemBySceneId({sceneId:currentAppData.sceneId});
setEventList(res.data); setEventList(res.data);
}; };

@ -193,10 +193,18 @@ const formatFooter = (data: any, eventListOld = []) => {
return cronstrue.toString(intervalSeconds, { locale: 'zh_CN' }); return cronstrue.toString(intervalSeconds, { locale: 'zh_CN' });
case 'EVENTSEND': case 'EVENTSEND':
case 'EVENTLISTENE': case 'EVENTLISTENE':
const { eventId, topic, name } = isJSON(data.customDef) ? JSON.parse(data.customDef) : data.customDef; const parsedData = isJSON(data.customDef) ? JSON.parse(data.customDef) : null;
if (topic.includes('**empty**')) return ''; // 数据是JSON字符串标识是接口回来的数据是普通对象标识是当前操作
const currentEvent = eventListOld.length > 0 ? eventListOld.find(item => item.eventId === eventId) : { name: '无' }; if (parsedData) {
return `事件: ${name || currentEvent.name}`; const { eventId, topic, name } = parsedData;
if (topic.includes('**empty**')) return '';
const currentEvent = eventListOld.length > 0 ? eventListOld.find(item => item.eventId === eventId) : { name: '无' };
return `事件: ${currentEvent.name}`;
}
else {
const { name } = data.customDef;
return `事件: ${name}`;
}
case 'BASIC': case 'BASIC':
return data.compIdentifier ? `当前实例:${data.compIdentifier}` : ''; return data.compIdentifier ? `当前实例:${data.compIdentifier}` : '';
default: default:

Loading…
Cancel
Save