jch-config-editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +260 -0
- package/dist/components/Canvas/index.d.ts +4 -0
- package/dist/components/Canvas/index.js +759 -0
- package/dist/components/ConfigEditor/index.d.ts +33 -0
- package/dist/components/ConfigEditor/index.js +146 -0
- package/dist/components/MaterialPanel/index.d.ts +2 -0
- package/dist/components/MaterialPanel/index.js +102 -0
- package/dist/components/NodeRenderer/index.d.ts +13 -0
- package/dist/components/NodeRenderer/index.js +375 -0
- package/dist/components/PropertyPanel/index.d.ts +4 -0
- package/dist/components/PropertyPanel/index.js +542 -0
- package/dist/config-editor.css +1 -0
- package/dist/config-editor.es.js +3421 -0
- package/dist/config-editor.es.js.map +1 -0
- package/dist/config-editor.umd.js +20 -0
- package/dist/config-editor.umd.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +12 -0
- package/dist/jch-config-editor.css +1 -0
- package/dist/store/editorStore.d.ts +35 -0
- package/dist/store/editorStore.js +304 -0
- package/dist/types/index.d.ts +164 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/initData.d.ts +4 -0
- package/dist/utils/initData.js +164 -0
- package/dist/vite.svg +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-editor.es.js","sources":["../node_modules/.pnpm/@babel+runtime@7.28.6/node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/.pnpm/@rc-component+pagination@1.2.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/pagination/lib/locale/zh_CN.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/common.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/date-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/calendar/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/locale/zh_CN.js","../node_modules/.pnpm/zustand@5.0.11_@types+react@19.2.14_immer@11.1.4_react@19.2.4/node_modules/zustand/esm/middleware/immer.mjs","../src/store/editorStore.ts","../src/utils/initData.ts","../src/components/MaterialPanel/index.tsx","../src/components/NodeRenderer/index.tsx","../src/components/Canvas/index.tsx","../src/components/PropertyPanel/index.tsx","../src/components/ConfigEditor/index.tsx"],"sourcesContent":["function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n // Options\n items_per_page: '条/页',\n jump_to: '跳至',\n jump_to_confirm: '确定',\n page: '页',\n // Pagination\n prev_page: '上一页',\n next_page: '下一页',\n prev_5: '向前 5 页',\n next_5: '向后 5 页',\n prev_3: '向前 3 页',\n next_3: '向后 3 页',\n page_size: '页码'\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.commonLocale = void 0;\nvar commonLocale = exports.commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _common = require(\"./common\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar locale = _objectSpread(_objectSpread({}, _common.commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/picker/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../../time-picker/locale/zh_CN\"));\n// 统一合并为完整的 Locale\nconst locale = {\n lang: {\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周'],\n ..._zh_CN.default\n },\n timePickerLocale: {\n ..._zh_CN2.default\n }\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"../../date-picker/locale/zh_CN\"));\nvar _default = exports.default = _zh_CN.default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/pagination/lib/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../calendar/locale/zh_CN\"));\nvar _zh_CN3 = _interopRequireDefault(require(\"../date-picker/locale/zh_CN\"));\nvar _zh_CN4 = _interopRequireDefault(require(\"../time-picker/locale/zh_CN\"));\nconst typeTemplate = '${label}不是一个有效的${type}';\nconst localeValues = {\n locale: 'zh-cn',\n Pagination: _zh_CN.default,\n DatePicker: _zh_CN3.default,\n TimePicker: _zh_CN4.default,\n Calendar: _zh_CN2.default,\n // locales for all components\n global: {\n placeholder: '请选择',\n close: '关闭',\n sortable: '可排序'\n },\n Table: {\n filterTitle: '筛选',\n filterConfirm: '确定',\n filterReset: '重置',\n filterEmptyText: '无筛选项',\n filterCheckAll: '全选',\n filterSearchPlaceholder: '在筛选项中搜索',\n emptyText: '暂无数据',\n selectAll: '全选当页',\n selectInvert: '反选当页',\n selectNone: '清空所有',\n selectionAll: '全选所有',\n sortTitle: '排序',\n expand: '展开行',\n collapse: '关闭行',\n triggerDesc: '点击降序',\n triggerAsc: '点击升序',\n cancelSort: '取消排序'\n },\n Modal: {\n okText: '确定',\n cancelText: '取消',\n justOkText: '知道了'\n },\n Tour: {\n Next: '下一步',\n Previous: '上一步',\n Finish: '结束导览'\n },\n Popconfirm: {\n cancelText: '取消',\n okText: '确定'\n },\n Transfer: {\n titles: ['', ''],\n searchPlaceholder: '请输入搜索内容',\n itemUnit: '项',\n itemsUnit: '项',\n remove: '删除',\n selectCurrent: '全选当页',\n removeCurrent: '删除当页',\n selectAll: '全选所有',\n deselectAll: '取消全选',\n removeAll: '删除全部',\n selectInvert: '反选当页'\n },\n Upload: {\n uploading: '文件上传中',\n removeFile: '删除文件',\n uploadError: '上传错误',\n previewFile: '预览文件',\n downloadFile: '下载文件'\n },\n Empty: {\n description: '暂无数据'\n },\n Icon: {\n icon: '图标'\n },\n Text: {\n edit: '编辑',\n copy: '复制',\n copied: '复制成功',\n expand: '展开',\n collapse: '收起'\n },\n Form: {\n optional: '(可选)',\n defaultValidateMessages: {\n default: '字段验证错误${label}',\n required: '请输入${label}',\n enum: '${label}必须是其中一个[${enum}]',\n whitespace: '${label}不能为空字符',\n date: {\n format: '${label}日期格式无效',\n parse: '${label}不能转换为日期',\n invalid: '${label}是一个无效日期'\n },\n types: {\n string: typeTemplate,\n method: typeTemplate,\n array: typeTemplate,\n object: typeTemplate,\n number: typeTemplate,\n date: typeTemplate,\n boolean: typeTemplate,\n integer: typeTemplate,\n float: typeTemplate,\n regexp: typeTemplate,\n email: typeTemplate,\n url: typeTemplate,\n hex: typeTemplate\n },\n string: {\n len: '${label}须为${len}个字符',\n min: '${label}最少${min}个字符',\n max: '${label}最多${max}个字符',\n range: '${label}须在${min}-${max}字符之间'\n },\n number: {\n len: '${label}必须等于${len}',\n min: '${label}最小值为${min}',\n max: '${label}最大值为${max}',\n range: '${label}须在${min}-${max}之间'\n },\n array: {\n len: '须为${len}个${label}',\n min: '最少${min}个${label}',\n max: '最多${max}个${label}',\n range: '${label}数量须在${min}-${max}之间'\n },\n pattern: {\n mismatch: '${label}与模式不匹配${pattern}'\n }\n }\n },\n QRCode: {\n expired: '二维码过期',\n refresh: '点击刷新',\n scanned: '已扫描'\n },\n ColorPicker: {\n presetEmpty: '暂无',\n transparent: '无色',\n singleColor: '单色',\n gradientColor: '渐变色'\n }\n};\nvar _default = exports.default = localeValues;","module.exports = require('../lib/locale/zh_CN');","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...args) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...args);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","import { create } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { nanoid } from 'nanoid';\n// @ts-ignore - 导入 csstype 用于类型推断\nimport type {} from 'csstype';\nimport type { \n EditorState, \n Node, \n Material,\n NodeStatus,\n EditorEvent, \n EventType,\n SchemeJSON,\n NodeStyle,\n ContentInfo,\n ControlInfo\n} from '../types';\n\n// 初始状态\nconst initialState: EditorState = {\n nodes: [],\n materials: [],\n selectedNodeId: null,\n selectedStatusId: null,\n viewport: {\n scale: 1,\n positionX: 0,\n positionY: 0,\n },\n history: {\n past: [],\n future: [],\n },\n mode: 'select',\n lineDrawing: {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n },\n};\n\n// 创建事件\nconst createEvent = (type: EventType, targetId?: string, payload?: any): EditorEvent => ({\n id: nanoid(),\n type,\n targetId,\n payload,\n timestamp: Date.now(),\n});\n\n// Store 接口\ninterface EditorStore extends EditorState {\n // 节点操作\n addNode: (node: Omit<Node, 'id'>, autoSelect?: boolean) => void;\n updateNode: (id: string, updates: Partial<Node>) => void;\n updateNodeStyle: (id: string, style: Partial<NodeStyle>) => void;\n updateNodeContent: (id: string, content: Partial<ContentInfo>) => void;\n updateNodeControl: (id: string, control: Partial<ControlInfo>) => void;\n removeNode: (id: string) => void;\n selectNode: (id: string | null) => void;\n \n // 状态操作(新架构)\n addStatus: (nodeId: string, status: Omit<NodeStatus, 'id'>) => void;\n removeStatus: (nodeId: string, statusId: string) => void;\n updateStatus: (nodeId: string, statusId: string, updates: Partial<NodeStatus>) => void;\n selectStatus: (statusId: string | null) => void;\n evaluateCurrentStatus: (nodeId: string, data: any) => string | undefined;\n \n // 物料库操作\n addMaterial: (material: Omit<Material, 'id'>) => void;\n updateMaterial: (id: string, updates: Partial<Material>) => void;\n removeMaterial: (id: string) => void;\n \n // 视口操作\n setViewport: (viewport: Partial<EditorState['viewport']>) => void;\n \n // 模式切换\n setMode: (mode: EditorState['mode']) => void;\n \n // 线条绘制操作\n startLineDrawing: (material: Material) => void;\n updateLineDrawing: (endPoint: { x: number; y: number }) => void;\n endLineDrawing: () => void;\n cancelLineDrawing: () => void;\n \n // 历史操作\n undo: () => void;\n redo: () => void;\n \n // 导入导出\n exportScheme: () => SchemeJSON;\n importScheme: (scheme: SchemeJSON) => void;\n \n // 事件记录\n recordEvent: (event: EditorEvent) => void;\n}\n\nexport const useEditorStore = create<EditorStore>()(\n immer((set, get) => ({\n ...initialState,\n\n // ========== 节点操作 ==========\n addNode: (node, autoSelect = true) => {\n set((state) => {\n const newNode = {\n ...node,\n id: nanoid(),\n } as Node;\n state.nodes.push(newNode);\n if (autoSelect) {\n state.selectedNodeId = newNode.id;\n state.history.past.push(createEvent('NODE_SELECT', newNode.id));\n }\n });\n },\n\n updateNode: (id, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node, updates);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, updates));\n }\n });\n },\n\n updateNodeStyle: (id, style) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.normalStyle, style);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { normalStyle: style }));\n }\n });\n },\n\n updateNodeContent: (id, content) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.contentInfo, content);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { contentInfo: content }));\n }\n });\n },\n\n updateNodeControl: (id, control) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.controlInfo, control);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { controlInfo: control }));\n }\n });\n },\n\n removeNode: (id) => {\n set((state) => {\n const index = state.nodes.findIndex((n) => n.id === id);\n if (index !== -1) {\n state.nodes.splice(index, 1);\n if (state.selectedNodeId === id) {\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n }\n state.history.past.push(createEvent('NODE_DELETE', id));\n }\n });\n },\n\n selectNode: (id) => {\n set((state) => {\n state.selectedNodeId = id;\n state.selectedStatusId = null;\n if (id) {\n state.history.past.push(createEvent('NODE_SELECT', id));\n }\n });\n },\n\n // ========== 状态操作 ==========\n addStatus: (nodeId, status) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n };\n\n node.contentInfo.statusList.push(newStatus);\n state.history.past.push(createEvent('MATERIAL_STATUS_CHANGE', nodeId, { statusId: newStatus.id }));\n });\n },\n\n removeStatus: (nodeId, statusId) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const index = node.contentInfo.statusList.findIndex((s) => s.id === statusId);\n if (index !== -1) {\n node.contentInfo.statusList.splice(index, 1);\n if (node.contentInfo.currentStatusId === statusId) {\n node.contentInfo.currentStatusId = undefined;\n }\n if (state.selectedStatusId === statusId) {\n state.selectedStatusId = null;\n }\n }\n });\n },\n\n updateStatus: (nodeId, statusId, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const status = node.contentInfo.statusList.find((s) => s.id === statusId);\n if (status) {\n Object.assign(status, updates);\n }\n });\n },\n\n selectStatus: (statusId) => {\n set((state) => {\n state.selectedStatusId = statusId;\n });\n },\n\n evaluateCurrentStatus: (nodeId, data) => {\n const state = get();\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return undefined;\n\n for (const status of node.contentInfo.statusList) {\n try {\n const fn = new Function('data', 'bindCodes', 'status', status.expression);\n const result = fn(data, status.bindCodes, status);\n if (result === true) {\n return status.id;\n }\n } catch (error) {\n console.warn('状态表达式执行失败:', status.name, error);\n }\n }\n\n return undefined;\n },\n\n // ========== 物料库操作 ==========\n addMaterial: (material) => {\n set((state) => {\n const newMaterial = {\n ...material,\n id: nanoid(),\n };\n state.materials.push(newMaterial as Material);\n state.history.past.push(createEvent('MATERIAL_ADD', newMaterial.id));\n });\n },\n\n updateMaterial: (id, updates) => {\n set((state) => {\n const material = state.materials.find((m) => m.id === id);\n if (material) {\n Object.assign(material, updates);\n }\n });\n },\n\n removeMaterial: (id) => {\n set((state) => {\n const index = state.materials.findIndex((m) => m.id === id);\n if (index !== -1) {\n state.materials.splice(index, 1);\n }\n });\n },\n\n // ========== 视口操作 ==========\n setViewport: (viewport) => {\n set((state) => {\n Object.assign(state.viewport, viewport);\n });\n },\n\n // ========== 模式切换 ==========\n setMode: (mode) => {\n set((state) => {\n state.mode = mode;\n });\n },\n\n // ========== 线条绘制操作 ==========\n startLineDrawing: (material) => {\n set((state) => {\n state.mode = 'line-draw';\n state.lineDrawing = {\n isDrawing: true,\n material,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n updateLineDrawing: (endPoint) => {\n set((state) => {\n if (state.lineDrawing.isDrawing) {\n state.lineDrawing.endPoint = endPoint;\n }\n });\n },\n\n endLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n cancelLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n // ========== 历史操作 ==========\n undo: () => {\n set((state) => {\n const lastEvent = state.history.past.pop();\n if (lastEvent) {\n state.history.future.push(lastEvent);\n }\n });\n },\n\n redo: () => {\n set((state) => {\n const nextEvent = state.history.future.pop();\n if (nextEvent) {\n state.history.past.push(nextEvent);\n }\n });\n },\n\n recordEvent: (event) => {\n set((state) => {\n state.history.past.push(event);\n state.history.future = [];\n });\n },\n\n // ========== 导入导出 ==========\n exportScheme: () => {\n const state = get();\n return {\n version: '1.1.0',\n nodes: state.nodes,\n materials: state.materials,\n viewport: state.viewport,\n metadata: {\n name: '未命名组态',\n description: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n };\n },\n\n importScheme: (scheme) => {\n set((state) => {\n state.nodes = scheme.nodes || [];\n state.materials = scheme.materials || [];\n state.viewport = scheme.viewport || initialState.viewport;\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n state.history = { past: [], future: [] };\n });\n },\n }))\n);\n","import type { Material, Node, NodeStatus } from '../types';\nimport { nanoid } from 'nanoid';\n\n// 初始化物料库数据\nexport const initMaterials: Material[] = [\n // 基础形状\n {\n id: nanoid(),\n name: '矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#1890ff\" rx=\"4\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"#52c41a\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆角矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#faad14\" rx=\"20\"/></svg>`)}`,\n },\n \n // 设备图标\n {\n id: nanoid(),\n name: '阀门',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><path d=\"M10 20 L30 10 L50 20 L50 40 L30 50 L10 40 Z\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><circle cx=\"30\" cy=\"30\" r=\"8\" fill=\"#1890ff\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '泵',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><circle cx=\"30\" cy=\"35\" r=\"20\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"25\" y=\"5\" width=\"10\" height=\"15\" fill=\"#595959\"/><path d=\"M30 20 L30 35 M20 30 Q30 45 40 30\" stroke=\"#595959\" stroke-width=\"2\" fill=\"none\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '罐体',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"80\"><ellipse cx=\"30\" cy=\"10\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"5\" y=\"10\" width=\"50\" height=\"60\" fill=\"#f0f0f0\" stroke=\"#595959\" stroke-width=\"2\"/><ellipse cx=\"30\" cy=\"70\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/></svg>`)}`,\n },\n \n // 文本\n {\n id: nanoid(),\n name: '文本标签',\n type: 'TEXT',\n content: {\n label: '标签',\n value: '值',\n labelStyle: {\n fontSize: 14,\n fontWeight: 'bold',\n color: '#262626',\n textAlign: 'left',\n },\n valueStyle: {\n fontSize: 14,\n fontWeight: 'normal',\n color: '#1890ff',\n textAlign: 'left',\n },\n },\n },\n \n // 线条 - 通用线条物料,通过属性配置实现不同线型\n {\n id: nanoid(),\n name: '线条',\n type: 'LINE',\n config: {\n thickness: 2,\n lineWeight: 2,\n color: '#262626',\n lineType: 'solid',\n },\n },\n];\n\n// 创建默认状态\nexport const createDefaultStatus = (material: Material): NodeStatus => ({\n id: nanoid(),\n name: '默认状态',\n expression: 'return true;',\n material: { ...material, id: nanoid() },\n bindCodes: [],\n});\n\n// 创建默认节点\nexport const createDefaultNode = (\n x: number,\n y: number,\n material?: Material\n): Node => {\n // 如果是群组物料,创建群组节点\n if (material?.type === 'CUSTOM' && material.config?.nodes) {\n const children = material.config.nodes.map((childNode: Node) => ({\n ...childNode,\n id: nanoid(), // 重新生成子节点ID\n }));\n \n // 计算群组边界\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n \n children.forEach((child: Node) => {\n const cx = child.normalStyle.x || 0;\n const cy = child.normalStyle.y || 0;\n const cw = child.normalStyle.width || 0;\n const ch = child.normalStyle.height || 0;\n minX = Math.min(minX, cx);\n minY = Math.min(minY, cy);\n maxX = Math.max(maxX, cx + cw);\n maxY = Math.max(maxY, cy + ch);\n });\n \n // 调整子节点位置为相对坐标,并移除 scale 避免双重缩放\n const relativeChildren = children.map((child: Node) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (child.normalStyle.x || 0) - minX,\n y: (child.normalStyle.y || 0) - minY,\n scale: undefined, // 移除 scale,由父级容器统一控制\n },\n }));\n \n return {\n id: nanoid(),\n name: material.name || '群组节点',\n type: 'group',\n normalStyle: {\n width: maxX - minX,\n height: maxY - minY,\n x,\n y,\n // 不设置背景和边框,由 NodeRenderer 控制\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children: relativeChildren,\n } as Node;\n }\n\n // 普通节点\n return {\n id: nanoid(),\n name: '新节点',\n type: 'normal',\n normalStyle: {\n width: 120,\n height: 100,\n x,\n y,\n background: 'transparent',\n padding: 8,\n },\n contentInfo: {\n statusList: material ? [createDefaultStatus(material)] : [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Collapse, Upload, Button, List, Empty, Typography, Image, Tag } from \"antd\";\nimport { UploadOutlined, DeleteOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { Material } from \"../../types\";\n\nconst { Panel } = Collapse;\nconst { Text } = Typography;\n\nexport const MaterialPanel: React.FC = () => {\n const {\n materials,\n addMaterial,\n removeMaterial,\n selectedStatusId,\n selectStatus,\n mode,\n lineDrawing,\n startLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n const [activeKeys, setActiveKeys] = useState<string[]>([\n \"basic\",\n \"device\",\n \"text\",\n \"line\",\n ]);\n\n // 初始化默认物料\n // useEffect(() => {\n // if (materials.length === 0) {\n // initMaterials.forEach((m) => addMaterial(m));\n // }\n // }, []);\n\n // 处理 SVG 上传\n const handleUpload = (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n addMaterial({\n name: file.name.replace(\".svg\", \"\"),\n type: \"IMAGE\",\n src,\n } as Material);\n };\n reader.readAsDataURL(file);\n return false;\n };\n\n // 按类型分组物料\n const groupedMaterials = {\n basic: materials.filter((m) =>\n [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name),\n ),\n device: materials.filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name) &&\n m.name !== \"自定义\"),\n ),\n text: materials.filter((m) => m.type === \"TEXT\"),\n line: materials.filter((m) => m.type === \"LINE\"),\n group: materials.filter((m) => m.type === \"CUSTOM\" && m.config?.nodes),\n custom: materials.filter(\n (m) =>\n (m.type === \"CUSTOM\" && !m.config?.nodes) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\", \"阀门\", \"泵\", \"罐体\"].includes(m.name)),\n ),\n };\n\n // 处理拖拽开始\n const handleDragStart = (e: React.DragEvent, material: Material) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/json\", JSON.stringify(material));\n const dragImage = e.currentTarget.querySelector(\n \".material-preview\",\n ) as HTMLElement;\n if (dragImage) {\n e.dataTransfer.setDragImage(dragImage, 20, 20);\n }\n };\n\n // 处理线条物料点击(进入绘制模式)\n const handleLineMaterialClick = (material: Material) => {\n if (material.type === \"LINE\") {\n startLineDrawing(material);\n }\n };\n\n // 渲染物料项\n const renderMaterialItem = (material: Material, isLineMode: boolean = false) => {\n // 物料库中的物料不再被\"选中\",而是用于拖拽创建节点或在属性面板中选择绑定到状态\n const isSelected = false;\n // 确保 isLineMode 是布尔值\n const isLineMaterial = isLineMode === true;\n // 只有当前物料是正在绘制的那条线时才显示\"绘制中\"\n const isDrawingLine = mode === \"line-draw\" && isLineMaterial && lineDrawing.material?.id === material.id;\n\n return (\n <List.Item\n key={material.id}\n draggable={!isLineMaterial}\n onDragStart={(e) => handleDragStart(e, material)}\n onClick={() => isLineMaterial && handleLineMaterialClick(material)}\n className={`\n rounded-lg transition-all duration-200 select-none\n ${isLineMaterial ? \"cursor-pointer\" : \"cursor-move\"}\n ${isSelected ? \"bg-blue-100 ring-2 ring-blue-400\" : \"hover:bg-gray-100\"}\n ${isDrawingLine ? \"bg-blue-50 ring-2 ring-blue-400\" : \"\"}\n `}\n actions={[\n isLineMaterial ? (\n <Button\n key=\"draw\"\n type=\"text\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleLineMaterialClick(material);\n }}\n >\n 绘制\n </Button>\n ) : null,\n <Button\n key=\"delete\"\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n removeMaterial(material.id);\n }}\n />,\n ].filter(Boolean)}>\n <div className={`flex items-center gap-3 w-full py-2 ${isLineMaterial ? \"\" : \"pointer-events-none\"}`}>\n <div className=\"material-preview w-12 h-12 flex items-center justify-center bg-white rounded border border-gray-200\">\n {material.type === \"IMAGE\" && (material as any).src ? (\n <Image\n src={(material as any).src}\n alt={material.name}\n width={40}\n height={40}\n preview={false}\n />\n ) : material.type === \"TEXT\" ? (\n <span className=\"text-xs text-gray-500\">T</span>\n ) : material.type === \"LINE\" ? (\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n ) : material.type === \"CUSTOM\" && material.config?.nodes ? (\n <span className=\"text-xs text-blue-500 font-bold\">G</span>\n ) : (\n <span className=\"text-xs text-gray-500\">?</span>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <Text strong className=\"block truncate\">\n {material.name}\n </Text>\n <div className=\"flex items-center gap-1\">\n <Text type=\"secondary\" className=\"text-xs\">\n {material.type}\n </Text>\n {isDrawingLine && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制中\n </Tag>\n )}\n </div>\n </div>\n </div>\n </List.Item>\n );\n };\n\n return (\n <div className=\"h-full flex flex-col bg-white border-r border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">物料库</h3>\n <Text type=\"secondary\" className=\"text-sm\">\n 拖拽物料到画布创建节点\n </Text>\n </div>\n\n <div className=\"p-3 border-b border-gray-200\">\n <Upload\n accept=\".svg\"\n beforeUpload={handleUpload}\n showUploadList={false}>\n <Button icon={<UploadOutlined />} block type=\"dashed\">\n 上传 SVG\n </Button>\n </Upload>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2\">\n <Collapse\n activeKey={activeKeys}\n onChange={(keys) => setActiveKeys(keys as string[])}\n ghost\n expandIconPosition=\"end\">\n <Panel header=\"基础形状\" key=\"basic\">\n <List\n dataSource={groupedMaterials.basic}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <List\n dataSource={groupedMaterials.device}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <List\n dataSource={groupedMaterials.text}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel \n header={\n <div className=\"flex items-center justify-between\">\n <span>线条</span>\n {mode === \"line-draw\" && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制模式\n </Tag>\n )}\n </div>\n } \n key=\"line\">\n <List\n dataSource={groupedMaterials.line}\n renderItem={(item) => renderMaterialItem(item, true)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n {mode === \"line-draw\" && (\n <div className=\"mt-2 p-2 bg-blue-50 rounded text-xs text-blue-600\">\n <div>点击线条物料开始绘制</div>\n <div>点击画布确定起点和终点</div>\n </div>\n )}\n </Panel>\n\n {groupedMaterials.group.length > 0 && (\n <Panel header=\"群组\" key=\"group\">\n <List\n dataSource={groupedMaterials.group}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n\n {groupedMaterials.custom.length > 0 && (\n <Panel header=\"自定义\" key=\"custom\">\n <List\n dataSource={groupedMaterials.custom}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n </Collapse>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <Text type=\"secondary\" className=\"text-xs\">\n {mode === \"line-draw\" ? (\n <>\n 💡 提示:点击绘制线段,可连续绘制多段线,双击结束绘制,ESC 取消\n </>\n ) : (\n <>\n 💡 提示:拖拽物料到画布创建节点,点击线条物料进入绘制模式\n </>\n )}\n </Text>\n </div>\n </div>\n );\n};\n","import React, { useMemo, useState, useCallback, useRef, useEffect } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { Node, Material, NodeStatus, LineMaterial } from \"../../types\";\nimport { Image, Typography } from \"antd\";\n\nconst { Text } = Typography;\n\ninterface NodeRendererProps {\n node: Node;\n isSelected?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void;\n // 外部数据,用于状态表达式计算\n data?: any;\n // 更新节点回调\n onUpdateNode?: (nodeId: string, updates: Partial<Node>) => void;\n // 当前缩放比例\n scale?: number;\n}\n\n// 执行状态表达式\nconst evaluateStatusExpression = (status: NodeStatus, data?: any): boolean => {\n try {\n //生成函数所需要的参数列表\n const params =\n data && Array.isArray(data)\n ? data.map((d: any, index: number) => d.paramsName)\n : [\"A\"]; //大写英文字符\n const fn = new Function(...params, status.expression);\n const result = fn(...data.map((d: any) => d.value));\n console.log(\n `Evaluating status [${status.name}] with data:`,\n data,\n \"Result:\",\n result,\n );\n return result === true;\n } catch (error) {\n console.warn(`状态表达式执行失败 [${status.name}]:`, error);\n return false;\n }\n};\n\n// 找到第一个满足条件的状态\nconst findActiveStatus = (\n statusList: NodeStatus[],\n data?: any,\n): NodeStatus | undefined => {\n for (const status of statusList) {\n console.log(status, \"status\");\n let bindData: Record<string, any>[] = [];\n if (Array.isArray(data)) {\n console.log(status.bindCodes, \"bindCodes\");\n bindData = data.filter((d: any) =>\n status.bindCodes?.includes(d.paramsCode),\n );\n } else {\n bindData = data;\n }\n if (evaluateStatusExpression(status, bindData)) {\n return status;\n }\n }\n return undefined;\n};\n\n// 从数据中获取字段值\nconst getDataValue = (\n data: any,\n valueSourceCode?: string,\n): { value: any; unit?: string } => {\n if (!valueSourceCode || !data) {\n return { value: undefined };\n }\n\n // 数据是数组格式:查找 paramsCode 匹配的项\n if (Array.isArray(data)) {\n const dataItem = data.find((d) => d.paramsCode === valueSourceCode);\n if (dataItem) {\n return {\n value: dataItem.value,\n unit: dataItem.unit,\n };\n }\n }\n // 数据是对象格式:直接取字段\n else if (typeof data === \"object\" && valueSourceCode in data) {\n return {\n value: data[valueSourceCode],\n unit: data.unit,\n };\n }\n\n return { value: undefined };\n};\n\n// 格式化数值,根据小数位配置\nconst formatValue = (value: any, decimals?: number): string => {\n if (value === undefined || value === null) return \"\";\n \n // -1 表示不格式化\n if (decimals === -1) return String(value);\n \n // 检查是否为有效数值\n const num = Number(value);\n if (isNaN(num)) return String(value);\n \n // 格式化小数位\n return num.toFixed(decimals ?? 2);\n};\n\n// 渲染物料\nconst renderMaterial = (material: Material, data?: any, isSelected?: boolean, node?: Node) => {\n switch (material.type) {\n case \"IMAGE\":\n const imageMaterial = material as any;\n return (\n <div className=\"w-full h-full flex items-center justify-center overflow-hidden\">\n {imageMaterial.src ? (\n <img\n src={imageMaterial.src}\n alt={material.name}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div className=\"w-full h-full bg-gray-200 flex items-center justify-center\">\n <span className=\"text-gray-400 text-xs\">无图片</span>\n </div>\n )}\n </div>\n );\n\n case \"TEXT\":\n const textMaterial = material as any;\n const {\n label,\n value: configValue,\n valueSourceCode,\n unit: configUnit,\n decimals,\n labelStyle,\n valueStyle,\n customStyle,\n } = textMaterial.content || {};\n\n // 如果有 valueSourceCode,从数据中获取值\n const { value: dataValue, unit: dataUnit } = valueSourceCode\n ? getDataValue(data, valueSourceCode)\n : { value: undefined, unit: undefined };\n\n // 优先使用数据中的值,否则使用配置的默认值\n const rawValue = dataValue !== undefined ? dataValue : configValue;\n // 格式化数值\n const displayValue = formatValue(rawValue, decimals);\n // 优先使用配置的单位,否则使用数据中的单位\n const displayUnit = configUnit || dataUnit || \"\";\n\n return (\n <div\n className=\"w-full h-full flex flex-col justify-center gap-1\"\n style={{ ...customStyle }}>\n {label && (\n <Text\n style={{\n fontSize: 14,\n fontWeight: \"bold\",\n color: \"#262626\",\n textAlign: \"left\",\n ...labelStyle,\n }}>\n {label}\n </Text>\n )}\n {displayValue !== undefined && displayValue !== null && (\n <Text\n style={{\n fontSize: 14,\n color: \"#1890ff\",\n textAlign: \"left\",\n ...valueStyle,\n }}>\n {displayValue}\n {displayUnit ? ` ${displayUnit}` : \"\"}\n </Text>\n )}\n </div>\n );\n\n case \"LINE\":\n const lineMaterial = material as any;\n const {\n thickness = 2,\n color = \"#d9d9d9\",\n dashed = false,\n lineType = dashed ? \"dashed\" : \"solid\",\n lineWeight = thickness,\n // 起点和终点的相对坐标\n startX = 0,\n startY = 0,\n endX = 100,\n endY = 0,\n } = lineMaterial.config || {};\n\n // 根据线型计算 dash array\n const getDashArray = (type: string): string => {\n const baseWeight = Math.max(lineWeight, 1);\n switch (type) {\n case \"solid\":\n return \"\";\n case \"dashed\":\n return `${baseWeight * 8},${baseWeight * 4}`;\n case \"center\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"phantom\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"dot\":\n return `${baseWeight},${baseWeight * 3}`;\n case \"dash-dot\":\n return `${baseWeight * 8},${baseWeight * 3},${baseWeight},${baseWeight * 3}`;\n default:\n return \"\";\n }\n };\n\n const dashArray = getDashArray(lineType);\n \n // 选中时高亮颜色\n const strokeColor = isSelected ? \"#1890ff\" : color;\n\n // 直接使用保存的相对坐标画线\n // 这和预览线的逻辑一模一样:从起点画到终点\n return (\n <div className=\"w-full h-full relative\" style={{ overflow: \"visible\" }}>\n <svg\n className=\"absolute top-0 left-0\"\n width=\"100%\"\n height=\"100%\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}>\n {/* 看不见的宽线用于捕获点击事件 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke=\"transparent\"\n strokeWidth={Math.max(lineWeight, 10)}\n strokeLinecap=\"round\"\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n onClick={(e) => {\n e.stopPropagation();\n // 触发父容器的点击\n const parent = (e.target as Element).closest('[data-node-id]');\n if (parent) {\n (parent as HTMLElement).click();\n }\n }}\n />\n {/* 实际显示的线 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke={strokeColor}\n strokeWidth={lineWeight}\n strokeDasharray={dashArray}\n strokeLinecap=\"butt\"\n style={{ pointerEvents: \"none\" }}\n />\n </svg>\n </div>\n );\n\n case \"CUSTOM\":\n const customMaterial = material as any;\n if (customMaterial.render) {\n return customMaterial.render({});\n }\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">自定义组件</span>\n </div>\n );\n\n default:\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">未知类型</span>\n </div>\n );\n }\n};\n\nconst NodeRendererComponent: React.FC<NodeRendererProps> = ({\n node,\n isSelected = false,\n onClick,\n onMouseDown,\n data,\n onUpdateNode,\n scale: canvasScale = 1,\n}) => {\n const { normalStyle, contentInfo, controlInfo } = node;\n const { statusList } = contentInfo;\n const { isClickable, isDraggable } = controlInfo;\n \n // 线条端点拖拽状态\n const [draggingPoint, setDraggingPoint] = useState<'start' | 'end' | null>(null);\n const [dragStartPos, setDragStartPos] = useState({ x: 0, y: 0 });\n const nodeRef = useRef<HTMLDivElement>(null);\n\n // 计算当前应该显示的状态(完全由表达式决定)\n const currentStatus = useMemo(() => {\n if (statusList.length === 0) return undefined;\n\n // 执行状态表达式,找到第一个返回 true 的状态\n const activeStatus = findActiveStatus(statusList, data);\n if (activeStatus) return activeStatus;\n\n // 如果没有状态满足条件,返回第一个状态作为默认\n return statusList[0];\n }, [statusList, data]);\n\n // 获取当前状态绑定的物料\n const currentMaterial = currentStatus?.material;\n\n // 判断当前物料是否是线条\n const isLine = currentMaterial?.type === 'LINE';\n \n // 获取线条配置\n const lineConfig = isLine ? (currentMaterial as LineMaterial).config : null;\n \n // 计算缩放比例\n const nodeScale = normalStyle.scale ?? 1;\n const scaledWidth = (normalStyle.width || 100) * nodeScale;\n const scaledHeight = (normalStyle.height || 100) * nodeScale;\n \n // 处理端点拖拽开始\n const handlePointMouseDown = useCallback((e: React.MouseEvent, point: 'start' | 'end') => {\n e.stopPropagation();\n e.preventDefault();\n setDraggingPoint(point);\n setDragStartPos({ x: e.clientX, y: e.clientY });\n }, []);\n \n // 处理端点拖拽\n useEffect(() => {\n if (!draggingPoint || !isLine || !lineConfig || !onUpdateNode) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n // 计算鼠标移动的偏移量(考虑画布缩放)\n const dx = (e.clientX - dragStartPos.x) / canvasScale;\n const dy = (e.clientY - dragStartPos.y) / canvasScale;\n \n // 获取当前的起止坐标\n const currentStartX = lineConfig.startX || 0;\n const currentStartY = lineConfig.startY || 0;\n const currentEndX = lineConfig.endX || 0;\n const currentEndY = lineConfig.endY || 0;\n \n let newStartX = currentStartX;\n let newStartY = currentStartY;\n let newEndX = currentEndX;\n let newEndY = currentEndY;\n let newNodeX = normalStyle.x || 0;\n let newNodeY = normalStyle.y || 0;\n \n if (draggingPoint === 'start') {\n // 拖拽起点\n newStartX = currentStartX + dx;\n newStartY = currentStartY + dy;\n \n // 如果起点移出了节点左上边界,调整节点位置和坐标\n if (newStartX < 0) {\n newNodeX += newStartX;\n newEndX -= newStartX;\n newStartX = 0;\n }\n if (newStartY < 0) {\n newNodeY += newStartY;\n newEndY -= newStartY;\n newStartY = 0;\n }\n } else {\n // 拖拽终点\n newEndX = currentEndX + dx;\n newEndY = currentEndY + dy;\n \n // 如果终点移出了节点左上边界,调整节点位置和坐标\n if (newEndX < 0) {\n newNodeX += newEndX;\n newStartX -= newEndX;\n newEndX = 0;\n }\n if (newEndY < 0) {\n newNodeY += newEndY;\n newStartY -= newEndY;\n newEndY = 0;\n }\n }\n \n // 重新计算节点大小\n const minNodeSize = Math.max((lineConfig.lineWeight || 2) * 2, 4);\n const maxX = Math.max(newStartX, newEndX);\n const maxY = Math.max(newStartY, newEndY);\n const newWidth = Math.max(maxX, minNodeSize);\n const newHeight = Math.max(maxY, minNodeSize);\n \n // 更新节点\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: newNodeX,\n y: newNodeY,\n width: newWidth,\n height: newHeight,\n },\n contentInfo: {\n ...contentInfo,\n statusList: statusList.map(s => ({\n ...s,\n material: s.material.type === 'LINE' ? {\n ...s.material,\n config: {\n ...lineConfig,\n startX: newStartX,\n startY: newStartY,\n endX: newEndX,\n endY: newEndY,\n },\n } : s.material,\n })),\n },\n });\n \n // 更新拖拽起始位置\n setDragStartPos({ x: e.clientX, y: e.clientY });\n };\n \n const handleMouseUp = () => {\n setDraggingPoint(null);\n };\n \n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [draggingPoint, dragStartPos, isLine, lineConfig, node.id, normalStyle, contentInfo, statusList, onUpdateNode, canvasScale]);\n \n // 判断是否为群组节点\n const isGroup = node.type === 'group';\n\n // 样式计算\n const containerStyle: CSSProperties = {\n position: \"absolute\",\n left: normalStyle.x || 0,\n top: normalStyle.y || 0,\n width: scaledWidth,\n height: scaledHeight,\n // 群组节点不显示背景和边框,只作为容器\n background: isGroup ? 'transparent' : (normalStyle.background || \"transparent\"),\n backgroundImage: isGroup ? undefined : (normalStyle.backgroundImage\n ? `url(${normalStyle.backgroundImage})`\n : undefined),\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n padding: Array.isArray(normalStyle.padding)\n ? normalStyle.padding.join(\"px \") + \"px\"\n : normalStyle.padding,\n margin: Array.isArray(normalStyle.margin)\n ? normalStyle.margin.join(\"px \") + \"px\"\n : normalStyle.margin,\n borderRadius: isGroup ? undefined : normalStyle.borderRadius,\n // 线条物料选中时不显示边框,而是通过高亮线条颜色来表示\n // 群组节点选中时显示边框,平时不显示\n border: isSelected && !isLine\n ? \"2px solid #1890ff\"\n : isLine \n ? \"none\" \n : isGroup\n ? \"none\"\n : normalStyle.border || \"1px dashed transparent\",\n // 线条节点本身不捕获点击,让内部 SVG 处理\n pointerEvents: isLine ? \"none\" : \"auto\",\n opacity: normalStyle.opacity ?? 1,\n transform: normalStyle.transform,\n zIndex: isSelected ? 1000 : (normalStyle.zIndex ?? 1),\n cursor: isDraggable && !draggingPoint ? \"move\" : isClickable ? \"pointer\" : \"default\",\n boxSizing: \"border-box\",\n // 线条和群组节点使用 visible overflow,避免裁剪子节点\n overflow: isLine || isGroup ? \"visible\" : \"hidden\",\n };\n \n // 获取线条端点位置用于显示拖拽手柄\n const startPointPos = lineConfig ? { x: lineConfig.startX || 0, y: lineConfig.startY || 0 } : { x: 0, y: 0 };\n const endPointPos = lineConfig ? { x: lineConfig.endX || 0, y: lineConfig.endY || 0 } : { x: 0, y: 0 };\n\n return (\n <div\n ref={nodeRef}\n data-node-id={node.id}\n style={containerStyle}\n onClick={(e) => {\n e.stopPropagation();\n if (isClickable && onClick && !draggingPoint) {\n onClick(e);\n }\n }}\n onMouseDown={(e) => {\n if (isDraggable && onMouseDown && !draggingPoint) {\n onMouseDown(e);\n }\n }}>\n {/* 选中时的调整手柄 */}\n {isSelected && !isLine && (\n <>\n {/* 群组节点不显示四角手柄 */}\n {!isGroup && (\n <>\n {/* 四角手柄 */}\n <div className=\"absolute -top-1 -left-1 w-2 h-2 bg-white border border-blue-500 rounded-full\" />\n <div className=\"absolute -top-1 -right-1 w-2 h-2 bg-white border border-blue-500 rounded-full\" />\n <div className=\"absolute -bottom-1 -left-1 w-2 h-2 bg-white border border-blue-500 rounded-full\" />\n <div className=\"absolute -bottom-1 -right-1 w-2 h-2 bg-white border border-blue-500 rounded-full\" />\n </>\n )}\n\n {/* 节点名称和当前状态标签 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name} {currentStatus ? `(${currentStatus.name})` : \"\"}\n </div>\n </>\n )}\n \n {/* 线条端点拖拽手柄 */}\n {isSelected && isLine && lineConfig && onUpdateNode && (\n <>\n {/* 起点拖拽手柄 */}\n <div\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: startPointPos.x - 6,\n top: startPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'start')}\n title=\"拖拽调整起点\"\n />\n {/* 终点拖拽手柄 */}\n <div\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: endPointPos.x - 6,\n top: endPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'end')}\n title=\"拖拽调整终点\"\n />\n \n {/* 节点名称 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name}\n </div>\n </>\n )}\n\n {/* 渲染当前状态绑定的物料 */}\n <div className=\"w-full h-full relative\">\n {currentMaterial ? (\n <div className=\"w-full h-full\">\n {renderMaterial(currentMaterial, data, isSelected, node)}\n </div>\n ) : !isGroup ? (\n // 只有非群组节点才显示\"无状态\"\n <div className=\"w-full h-full flex items-center justify-center text-gray-300 text-xs\">\n 无状态\n </div>\n ) : null}\n </div>\n\n {/* 渲染群组节点的子节点 */}\n {node.type === 'group' && node.children && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {node.children.map(childNode => (\n <div key={childNode.id} className=\"pointer-events-auto\">\n <NodeRenderer\n node={childNode}\n isSelected={false}\n data={data}\n onUpdateNode={onUpdateNode}\n scale={canvasScale}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )\n};\n\n// 使用 React.memo 避免不必要的重渲染,提高拖拽性能\n// 注意:只在节点位置、选中状态、缩放比例变化时才重渲染\n// 忽略 data、onClick、onMouseDown、onUpdateNode 等频繁变化的 props\nexport const NodeRenderer = React.memo(NodeRendererComponent, (prevProps, nextProps) => {\n const nodeA = prevProps.node;\n const nodeB = nextProps.node;\n \n // 比较节点位置和尺寸\n const nodeStyleEqual = \n nodeA.id === nodeB.id &&\n nodeA.normalStyle.x === nodeB.normalStyle.x &&\n nodeA.normalStyle.y === nodeB.normalStyle.y &&\n nodeA.normalStyle.width === nodeB.normalStyle.width &&\n nodeA.normalStyle.height === nodeB.normalStyle.height;\n \n // 比较其他关键 props\n const otherPropsEqual =\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.scale === nextProps.scale;\n \n return nodeStyleEqual && otherPropsEqual;\n});\n","import React, { useRef, useCallback, useState, useEffect } from \"react\";\nimport {\n TransformWrapper,\n TransformComponent,\n type ReactZoomPanPinchRef,\n} from \"react-zoom-pan-pinch\";\nimport {\n Button,\n Space,\n Tooltip,\n Empty,\n Modal,\n Form,\n Input,\n Collapse,\n} from \"antd\";\nimport {\n ZoomInOutlined,\n ZoomOutOutlined,\n UndoOutlined,\n RedoOutlined,\n SelectOutlined,\n DragOutlined,\n EyeOutlined,\n DeleteOutlined,\n ExperimentOutlined,\n CloseOutlined,\n GroupOutlined,\n AppstoreAddOutlined,\n SaveOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { NodeRenderer } from \"../NodeRenderer\";\nimport { createDefaultNode, createDefaultStatus } from \"../../utils/initData\";\nimport type { Node, Material, LineMaterial, GroupNode } from \"../../types\";\nimport { nanoid } from \"nanoid\";\n\nconst { Panel } = Collapse;\nconst { TextArea } = Input;\n\nexport const Canvas: React.FC<{ defaultTestData?: any }> = ({\n defaultTestData,\n}) => {\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n \n const {\n nodes,\n selectedNodeId,\n selectedStatusId,\n mode,\n lineDrawing,\n viewport,\n setViewport,\n addNode,\n selectNode,\n updateNode,\n removeNode,\n undo,\n redo,\n setMode,\n startLineDrawing,\n updateLineDrawing,\n endLineDrawing,\n cancelLineDrawing,\n addMaterial,\n } = useEditorStore();\n\n // 使用 ref 存储拖拽状态,避免频繁触发 useEffect 重新绑定事件\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragOffsetRef = useRef({ x: 0, y: 0, newX: 0, newY: 0 });\n const draggingNodeRef = useRef<Node | null>(null);\n \n // 用于强制刷新(实际拖拽逻辑使用 ref)\n const [, forceUpdate] = useState({});\n const [isDragOver, setIsDragOver] = useState(false);\n \n // 线条绘制状态\n const [linePreview, setLinePreview] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n isDrawing: boolean;\n }>({ start: null, end: null, isDrawing: false });\n\n // 框选状态\n const [isBoxSelecting, setIsBoxSelecting] = useState(false);\n const [selectionBox, setSelectionBox] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n }>({ start: null, end: null });\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n \n // 使用 ref 存储状态,避免 useEffect 依赖它们导致频繁重新绑定事件\n const nodesRef = useRef<Node[]>(nodes);\n const selectionBoxRef = useRef<{ start: { x: number; y: number } | null; end: { x: number; y: number } | null }>({ start: null, end: null });\n const isBoxSelectingRef = useRef(isBoxSelecting);\n \n // 同步 nodes 到 ref\n useEffect(() => {\n nodesRef.current = nodes;\n }, [nodes]);\n \n // 同步 selectionBox 到 ref\n useEffect(() => {\n selectionBoxRef.current = selectionBox;\n }, [selectionBox]);\n \n // 同步 isBoxSelecting 到 ref\n useEffect(() => {\n isBoxSelectingRef.current = isBoxSelecting;\n }, [isBoxSelecting]);\n\n // 数据模拟面板\n const [dataModalVisible, setDataModalVisible] = useState(false);\n \n // 编辑模式:数据只渲染一次,使用 ref 避免重渲染\n // 预览模式:数据实时更新\n const testDataRef = useRef(defaultTestData);\n const [previewData, setPreviewData] = useState<any>(defaultTestData);\n const [dataInput, setDataInput] = useState(\n JSON.stringify(defaultTestData, null, 2),\n );\n const [dataError, setDataError] = useState<string | null>(null);\n \n // 根据模式处理数据更新\n useEffect(() => {\n if (mode === 'preview') {\n // 预览模式:实时更新数据\n setPreviewData(defaultTestData);\n }\n // 编辑模式:只更新 ref,不触发重渲染\n testDataRef.current = defaultTestData;\n \n // 只在弹窗关闭时更新输入框\n if (!dataModalVisible) {\n setDataInput(JSON.stringify(defaultTestData, null, 2));\n }\n }, [defaultTestData, dataModalVisible, mode]);\n // 同步视口状态\n const handleTransform = useCallback(() => {\n const state = transformRef.current?.state;\n if (state) {\n setViewport({ \n scale: state.scale, \n positionX: state.positionX, \n positionY: state.positionY \n });\n }\n }, [setViewport]);\n\n // 处理画布点击\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent) => {\n if (isDraggingRef.current) return;\n \n // 框选拖拽过程中不处理点击(避免清除选择)\n if (isBoxSelecting && selectionBox.start) return;\n\n if (\n e.target === canvasRef.current ||\n (e.target as HTMLElement).dataset?.canvas === \"true\"\n ) {\n selectNode(null);\n }\n },\n [selectNode, isBoxSelecting, selectionBox.start],\n );\n\n // 处理拖拽悬停\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n if (!isDragOver) {\n setIsDragOver(true);\n }\n },\n [isDragOver],\n );\n\n // 处理拖拽离开\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n // 处理放置\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (!canvasRef.current || mode !== \"select\") return;\n\n try {\n const data = e.dataTransfer.getData(\"application/json\");\n if (!data) return;\n\n const material = JSON.parse(data);\n\n const rect = canvasRef.current.getBoundingClientRect();\n // 优先使用 transformRef 中的实时状态\n const currentTransform = transformRef.current?.state;\n const scale = currentTransform?.scale ?? viewport.scale;\n const positionX = currentTransform?.positionX ?? viewport.positionX;\n const positionY = currentTransform?.positionY ?? viewport.positionY;\n \n const x = (e.clientX - rect.left - positionX) / scale - 50;\n const y = (e.clientY - rect.top - positionY) / scale - 50;\n\n const newNode = createDefaultNode(x, y, material);\n addNode(newNode);\n } catch (error) {\n console.error(\"Failed to parse dropped material:\", error);\n }\n },\n [mode, viewport, addNode],\n );\n\n // 处理节点拖拽开始\n const handleNodeMouseDown = useCallback(\n (e: React.MouseEvent, node: Node) => {\n if (mode !== \"select\" || !node.controlInfo.isDraggable) return;\n\n e.stopPropagation();\n selectNode(node.id);\n\n // 使用 ref 存储拖拽状态,避免触发重渲染\n isDraggingRef.current = true;\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n dragOffsetRef.current = {\n x: node.normalStyle.x || 0,\n y: node.normalStyle.y || 0,\n newX: node.normalStyle.x || 0,\n newY: node.normalStyle.y || 0,\n };\n draggingNodeRef.current = node;\n \n // 阻止文本选中\n e.preventDefault();\n },\n [mode, selectNode],\n );\n\n // 获取鼠标在画布上的坐标(考虑缩放和平移)\n const getCanvasPosition = useCallback(\n (clientX: number, clientY: number) => {\n if (!canvasRef.current) {\n console.log('[getCanvasPosition] canvas ref not ready');\n return { x: 0, y: 0 };\n }\n \n // 获取 canvas 元素在屏幕上的位置(已经包含变换)\n const canvasRect = canvasRef.current.getBoundingClientRect();\n \n // 从 transformRef 获取 scale\n const scale = transformRef.current?.state?.scale ?? 1;\n \n // 计算鼠标相对于 canvas 左上角的屏幕坐标\n const mouseXInCanvas = clientX - canvasRect.left;\n const mouseYInCanvas = clientY - canvasRect.top;\n \n // canvas 的逻辑尺寸是 1920x1080\n // canvasRect 是视觉尺寸 = 1920 * scale\n // 所以转换比例 = 逻辑尺寸 / 视觉尺寸 = 1920 / (1920 * scale) = 1 / scale\n const x = mouseXInCanvas * (1920 / canvasRect.width);\n const y = mouseYInCanvas * (1080 / canvasRect.height);\n \n const result = { x: Math.round(x), y: Math.round(y) };\n console.log('[getCanvasPosition]', { clientX, clientY, canvasRect, scale, result });\n return result;\n },\n [],\n );\n\n // 创建线条节点\n const createLineNode = useCallback(\n (start: { x: number; y: number }, end: { x: number; y: number }, continueDrawing: boolean = true) => {\n if (!lineDrawing.material) return;\n\n const material = lineDrawing.material as LineMaterial;\n const config = material.config || {};\n const lineWeight = config.lineWeight || config.thickness || 2;\n \n // 节点位置:覆盖起点和终点的最小矩形左上角\n const x = Math.min(start.x, end.x);\n const y = Math.min(start.y, end.y);\n \n // 起点和终点相对于节点左上角的坐标\n const relativeStartX = Math.round(start.x - x);\n const relativeStartY = Math.round(start.y - y);\n const relativeEndX = Math.round(end.x - x);\n const relativeEndY = Math.round(end.y - y);\n \n // 节点大小:刚好包含整条线\n const minNodeSize = Math.max(lineWeight * 2, 4);\n const nodeWidth = Math.max(Math.abs(start.x - end.x), minNodeSize);\n const nodeHeight = Math.max(Math.abs(start.y - end.y), minNodeSize);\n \n // 创建线条物料的复制,只保留关键参数\n const lineMaterial: LineMaterial = {\n ...material,\n id: nanoid(),\n config: {\n // 只保留关键配置:颜色、线宽、线型\n color: config.color,\n lineWeight,\n thickness: lineWeight,\n lineType: config.lineType,\n // 起止位置(相对于节点)\n startX: relativeStartX,\n startY: relativeStartY,\n endX: relativeEndX,\n endY: relativeEndY,\n },\n };\n\n // 创建节点\n const newNode: Node = {\n id: nanoid(),\n name: `${material.name}_${Date.now()}`,\n type: 'normal',\n normalStyle: {\n width: nodeWidth,\n height: nodeHeight,\n x,\n y,\n background: 'transparent',\n },\n contentInfo: {\n statusList: [createDefaultStatus(lineMaterial)],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n\n // 绘制线条时不自动选中节点,避免属性面板弹出影响绘制\n addNode(newNode, false);\n \n if (continueDrawing) {\n // 继续绘制下一条线段,以当前终点作为新起点\n const nextStart = { x: end.x, y: end.y };\n setLinePreview({\n start: nextStart,\n end: { ...nextStart },\n isDrawing: true,\n });\n } else {\n // 结束绘制\n setLinePreview({ start: null, end: null, isDrawing: false });\n endLineDrawing();\n }\n },\n [lineDrawing.material, addNode, endLineDrawing],\n );\n\n // 处理画布鼠标按下\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent) => {\n // 使用 ref 获取最新状态,避免闭包问题\n const currentIsBoxSelecting = isBoxSelectingRef.current;\n \n console.log('[handleCanvasMouseDown]', { button: e.button, mode, isBoxSelecting: currentIsBoxSelecting, isBoxSelectingState: isBoxSelecting, lineDrawingMaterial: !!lineDrawing.material });\n console.log('[handleCanvasMouseDown] ref values:', { isBoxSelectingRef: isBoxSelectingRef.current, selectionBoxRef: selectionBoxRef.current });\n \n // 只处理左键\n if (e.button !== 0) return;\n\n // 框选模式\n if (currentIsBoxSelecting) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setSelectionBox({ start: pos, end: pos });\n setSelectedNodeIds([]);\n return;\n }\n\n // 普通选择模式:让 TransformWrapper 处理画布平移,不阻止事件\n if (mode === \"select\" && !lineDrawing.material) {\n // 不处理,让事件冒泡给 TransformWrapper 进行平移\n return;\n }\n\n // 线条绘制模式\n if (mode !== \"line-draw\" || !lineDrawing.material) {\n console.log('[handleCanvasMouseDown] not in line-draw mode or no material');\n return;\n }\n\n const pos = getCanvasPosition(e.clientX, e.clientY);\n console.log('[handleCanvasMouseDown] drawing at', pos, 'isDrawing:', linePreview.isDrawing);\n \n if (!linePreview.isDrawing) {\n // 开始绘制\n setLinePreview({\n start: pos,\n end: pos,\n isDrawing: true,\n });\n } else {\n // 绘制线段,继续绘制下一条(连续绘制模式)\n if (linePreview.start) {\n createLineNode(linePreview.start, pos, true);\n }\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, getCanvasPosition, createLineNode],\n );\n\n // 处理双击结束绘制\n const handleCanvasDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (mode !== \"line-draw\" || !lineDrawing.material) return;\n \n if (linePreview.isDrawing && linePreview.start) {\n // 绘制最后一条线段并结束绘制\n const pos = getCanvasPosition(e.clientX, e.clientY);\n createLineNode(linePreview.start, pos, false);\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, getCanvasPosition, createLineNode],\n );\n\n // 处理框选 - 判断节点是否在选择框内\n const getNodesInSelectionBox = useCallback(() => {\n if (!selectionBox.start || !selectionBox.end) return [];\n \n const minX = Math.min(selectionBox.start.x, selectionBox.end.x);\n const maxX = Math.max(selectionBox.start.x, selectionBox.end.x);\n const minY = Math.min(selectionBox.start.y, selectionBox.end.y);\n const maxY = Math.max(selectionBox.start.y, selectionBox.end.y);\n \n return nodes.filter(node => {\n const nodeX = node.normalStyle.x || 0;\n const nodeY = node.normalStyle.y || 0;\n const nodeWidth = node.normalStyle.width || 0;\n const nodeHeight = node.normalStyle.height || 0;\n \n // 检查节点中心点是否在选择框内\n const centerX = nodeX + nodeWidth / 2;\n const centerY = nodeY + nodeHeight / 2;\n \n return centerX >= minX && centerX <= maxX && centerY >= minY && centerY <= maxY;\n }).map(node => node.id);\n }, [selectionBox, nodes]);\n\n // 组合选中节点\n const handleGroupNodes = useCallback(() => {\n if (selectedNodeIds.length < 2) return;\n\n const selectedNodes = nodes.filter(n => selectedNodeIds.includes(n.id));\n if (selectedNodes.length < 2) return;\n\n // 计算边界框\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n selectedNodes.forEach(node => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n const w = node.normalStyle.width || 0;\n const h = node.normalStyle.height || 0;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + w);\n maxY = Math.max(maxY, y + h);\n });\n\n // 调整子节点位置为相对坐标,并移除 scale 避免双重缩放\n const children = selectedNodes.map(node => ({\n ...node,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - minX,\n y: (node.normalStyle.y || 0) - minY,\n scale: undefined, // 移除 scale,由父级容器统一控制\n },\n }));\n\n // 创建群组节点\n const groupNode: GroupNode = {\n id: nanoid(),\n name: `群组_${Date.now()}`,\n type: 'group',\n normalStyle: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n // 不设置背景和边框,由 NodeRenderer 控制\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children,\n };\n\n // 删除原子节点并添加群组节点\n selectedNodeIds.forEach(id => removeNode(id));\n addNode(groupNode);\n setSelectedNodeIds([]);\n selectNode(groupNode.id);\n }, [selectedNodeIds, nodes, addNode, removeNode, selectNode]);\n\n // 保存群组到物料库\n const handleSaveGroupToMaterial = useCallback(() => {\n if (!selectedNodeId) return;\n \n const selectedNode = nodes.find(n => n.id === selectedNodeId);\n if (!selectedNode || selectedNode.type !== 'group') return;\n\n // 创建群组物料\n const groupMaterial: Material = {\n id: nanoid(),\n name: `群组_${selectedNode.name || Date.now()}`,\n type: 'CUSTOM',\n config: {\n nodes: selectedNode.children,\n },\n };\n\n addMaterial(groupMaterial);\n \n // 显示成功提示\n console.log('[Canvas] 群组已保存到物料库:', groupMaterial.name);\n }, [selectedNodeId, nodes, addMaterial]);\n\n // 对齐选中的节点\n const handleAlignNodes = useCallback((direction: 'left' | 'right' | 'top' | 'bottom') => {\n if (selectedNodeIds.length < 2) return;\n\n // 获取选中的非群组节点\n const selectedNodes = selectedNodeIds\n .map(id => nodes.find(n => n.id === id))\n .filter((n): n is Node => !!n && n.type !== 'group');\n\n if (selectedNodes.length < 2) return;\n\n // 计算对齐基准值\n let alignValue: number;\n switch (direction) {\n case 'left':\n alignValue = Math.min(...selectedNodes.map(n => n.normalStyle.x || 0));\n break;\n case 'right':\n alignValue = Math.max(...selectedNodes.map(n => (n.normalStyle.x || 0) + (n.normalStyle.width || 0)));\n break;\n case 'top':\n alignValue = Math.min(...selectedNodes.map(n => n.normalStyle.y || 0));\n break;\n case 'bottom':\n alignValue = Math.max(...selectedNodes.map(n => (n.normalStyle.y || 0) + (n.normalStyle.height || 0)));\n break;\n default:\n return;\n }\n\n // 更新每个节点的位置\n selectedNodes.forEach(node => {\n let newX = node.normalStyle.x || 0;\n let newY = node.normalStyle.y || 0;\n\n switch (direction) {\n case 'left':\n newX = alignValue;\n break;\n case 'right':\n newX = alignValue - (node.normalStyle.width || 0);\n break;\n case 'top':\n newY = alignValue;\n break;\n case 'bottom':\n newY = alignValue - (node.normalStyle.height || 0);\n break;\n }\n\n updateNode(node.id, {\n normalStyle: {\n ...node.normalStyle,\n x: newX,\n y: newY,\n },\n });\n });\n }, [selectedNodeIds, nodes, updateNode]);\n\n // 处理鼠标移动(线条绘制预览和框选)\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n // 使用 ref 获取最新状态,避免闭包问题\n const currentIsBoxSelecting = isBoxSelectingRef.current;\n const currentSelectionBox = selectionBoxRef.current;\n \n // 框选处理\n if (currentIsBoxSelecting && currentSelectionBox.start) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setSelectionBox(prev => ({ ...prev, end: pos }));\n \n // 实时更新选中的节点\n const box = {\n start: currentSelectionBox.start,\n end: pos,\n };\n const minX = Math.min(box.start.x, box.end.x);\n const maxX = Math.max(box.start.x, box.end.x);\n const minY = Math.min(box.start.y, box.end.y);\n const maxY = Math.max(box.start.y, box.end.y);\n \n // 使用 ref 获取最新 nodes,避免依赖导致的重新绑定\n const selectedIds = nodesRef.current.filter(node => {\n const nodeX = node.normalStyle.x || 0;\n const nodeY = node.normalStyle.y || 0;\n const nodeWidth = node.normalStyle.width || 0;\n const nodeHeight = node.normalStyle.height || 0;\n const centerX = nodeX + nodeWidth / 2;\n const centerY = nodeY + nodeHeight / 2;\n return centerX >= minX && centerX <= maxX && centerY >= minY && centerY <= maxY;\n }).map(node => node.id);\n \n setSelectedNodeIds(selectedIds);\n return;\n }\n\n // 节点拖拽 - 直接操作 DOM,不触发 React 重渲染\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n if (!canvasRef.current) return;\n \n // 获取 canvas 的视觉尺寸\n const canvasRect = canvasRef.current.getBoundingClientRect();\n \n // 计算转换比例(与 getCanvasPosition 保持一致)\n const scaleX = 1920 / canvasRect.width;\n const scaleY = 1080 / canvasRect.height;\n \n // 计算鼠标位移(屏幕像素)并转换为画布坐标位移\n const screenDx = e.clientX - dragStartRef.current.x;\n const screenDy = e.clientY - dragStartRef.current.y;\n const canvasDx = screenDx * scaleX;\n const canvasDy = screenDy * scaleY;\n\n const newX = dragOffsetRef.current.x + canvasDx;\n const newY = dragOffsetRef.current.y + canvasDy;\n \n // 直接操作 DOM,不触发 React 重渲染\n const nodeEl = document.querySelector(`[data-node-id=\"${selectedNodeId}\"]`) as HTMLElement;\n if (nodeEl) {\n nodeEl.style.left = `${newX}px`;\n nodeEl.style.top = `${newY}px`;\n }\n \n // 同时更新 ref 中的位置,用于拖拽结束时保存\n dragOffsetRef.current.newX = newX;\n dragOffsetRef.current.newY = newY;\n }\n \n // 线条绘制预览\n if (mode === 'line-draw' && linePreview.isDrawing) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setLinePreview((prev) => ({\n ...prev,\n end: pos,\n }));\n }\n };\n\n const handleMouseUp = () => {\n // 拖拽结束,将最终位置同步到 store\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n const newX = dragOffsetRef.current.newX ?? dragOffsetRef.current.x;\n const newY = dragOffsetRef.current.newY ?? dragOffsetRef.current.y;\n \n updateNode(selectedNodeId, {\n normalStyle: {\n ...draggingNodeRef.current.normalStyle,\n x: newX,\n y: newY,\n },\n });\n }\n \n // 使用 ref 更新拖拽状态\n isDraggingRef.current = false;\n draggingNodeRef.current = null;\n forceUpdate({}); // 触发一次渲染更新鼠标样式\n // 结束框选(使用 ref 获取最新状态)\n if (isBoxSelectingRef.current) {\n setSelectionBox({ start: null, end: null });\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // ESC 取消线条绘制\n if (e.key === 'Escape' && mode === 'line-draw') {\n setLinePreview({ start: null, end: null, isDrawing: false });\n cancelLineDrawing();\n }\n };\n\n // 始终监听事件,在 handler 内部根据 ref 判断状态\n // 避免 ref 变化无法触发 useEffect 重新执行的问题\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n // 移除了 isDragging, dragStart, dragOffset, nodes, selectionBox, isBoxSelecting\n // 使用 ref 替代这些状态,避免拖拽时频繁重新绑定事件导致卡顿\n }, [\n selectedNodeId,\n updateNode,\n mode,\n linePreview.isDrawing,\n getCanvasPosition,\n cancelLineDrawing,\n ]);\n\n // 键盘快捷键\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Delete\" && selectedNodeId) {\n removeNode(selectedNodeId);\n }\n if (e.ctrlKey && e.key === \"z\") {\n e.preventDefault();\n undo();\n }\n if (e.ctrlKey && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n // ESC 取消线条绘制\n if (e.key === \"Escape\" && mode === \"line-draw\") {\n setLinePreview({ start: null, end: null, isDrawing: false });\n cancelLineDrawing();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [selectedNodeId, removeNode, undo, redo, mode, cancelLineDrawing]);\n\n // 应用测试数据\n const handleApplyData = () => {\n try {\n const parsed = JSON.parse(dataInput);\n testDataRef.current = parsed;\n // 同时更新预览数据\n setPreviewData(parsed);\n setDataError(null);\n setDataModalVisible(false);\n } catch (error) {\n setDataError(\"JSON 格式错误,请检查输入\");\n }\n };\n\n // 工具栏按钮\n const toolbarButtons = [\n {\n icon: <SelectOutlined />,\n title: \"选择模式\",\n active: mode === \"select\",\n onClick: () => {\n setMode(\"select\");\n setIsBoxSelecting(false);\n },\n },\n {\n icon: <DragOutlined />,\n title: \"拖拽模式\",\n active: mode === \"drag\",\n onClick: () => {\n setMode(\"drag\");\n setIsBoxSelecting(false);\n },\n },\n {\n icon: <EyeOutlined />,\n title: \"预览模式\",\n active: mode === \"preview\",\n onClick: () => {\n setMode(\"preview\");\n setIsBoxSelecting(false);\n },\n },\n ];\n\n const actionButtons = [\n {\n icon: <UndoOutlined />,\n title: \"撤销 (Ctrl+Z)\",\n onClick: undo,\n },\n {\n icon: <RedoOutlined />,\n title: \"重做 (Ctrl+Y)\",\n onClick: redo,\n },\n {\n icon: <GroupOutlined />,\n title: \"框选模式\",\n active: isBoxSelecting,\n onClick: () => {\n setIsBoxSelecting(!isBoxSelecting);\n setMode(\"select\");\n setSelectedNodeIds([]);\n },\n },\n {\n icon: <AppstoreAddOutlined />,\n title: \"组合选中节点\",\n disabled: selectedNodeIds.length < 2,\n onClick: handleGroupNodes,\n },\n {\n icon: <AlignLeftOutlined />,\n title: \"左对齐\",\n disabled: selectedNodeIds.filter(id => nodes.find(n => n.id === id)?.type !== 'group').length < 2,\n onClick: () => handleAlignNodes('left'),\n },\n {\n icon: <AlignRightOutlined />,\n title: \"右对齐\",\n disabled: selectedNodeIds.filter(id => nodes.find(n => n.id === id)?.type !== 'group').length < 2,\n onClick: () => handleAlignNodes('right'),\n },\n {\n icon: <VerticalAlignTopOutlined />,\n title: \"上对齐\",\n disabled: selectedNodeIds.filter(id => nodes.find(n => n.id === id)?.type !== 'group').length < 2,\n onClick: () => handleAlignNodes('top'),\n },\n {\n icon: <VerticalAlignBottomOutlined />,\n title: \"下对齐\",\n disabled: selectedNodeIds.filter(id => nodes.find(n => n.id === id)?.type !== 'group').length < 2,\n onClick: () => handleAlignNodes('bottom'),\n },\n {\n icon: <SaveOutlined />,\n title: \"保存群组到物料库\",\n disabled: !selectedNodeId || nodes.find(n => n.id === selectedNodeId)?.type !== 'group',\n onClick: handleSaveGroupToMaterial,\n },\n {\n icon: <ExperimentOutlined />,\n title: \"数据模拟\",\n type: \"primary\" as const,\n onClick: () => setDataModalVisible(true),\n },\n {\n icon: <DeleteOutlined />,\n title: \"删除选中 (Delete)\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: () => {\n if (selectedNodeId) {\n removeNode(selectedNodeId);\n } else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach(id => removeNode(id));\n setSelectedNodeIds([]);\n }\n },\n },\n ];\n\n return (\n <div className=\"flex-1 flex flex-col h-full bg-gray-100\">\n {/* 顶部工具栏 */}\n <div className=\"h-12 bg-white border-b border-gray-200 flex items-center justify-between px-4\">\n <Space>\n {toolbarButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={btn.active ? \"primary\" : \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n />\n </Tooltip>\n ))}\n </Space>\n\n <Space>\n {actionButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={btn.type || \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n disabled={btn.disabled}\n />\n </Tooltip>\n ))}\n </Space>\n </div>\n\n {/* 画布区域 */}\n <div ref={wrapperRef} className=\"flex-1 relative\">\n <TransformWrapper\n ref={transformRef}\n initialScale={1}\n initialPositionX={0}\n initialPositionY={0}\n minScale={0.5}\n maxScale={5}\n onTransformed={handleTransform}\n limitToBounds={false}\n centerZoomedOut={false}\n panning={{\n disabled: false,\n velocityDisabled: true,\n }}\n wheel={{\n disabled: false,\n step: 0.1,\n }}\n pinch={{\n disabled: false,\n }}\n doubleClick={{\n disabled: true,\n }}>\n {({ zoomIn, zoomOut, resetTransform }) => (\n <>\n {/* 缩放控制 */}\n <div className=\"absolute bottom-4 right-4 z-10 bg-white rounded-lg shadow-lg p-2\">\n <Space direction=\"vertical\">\n <Tooltip title=\"放大\">\n <Button\n icon={<ZoomInOutlined />}\n onClick={() => zoomIn()}\n />\n </Tooltip>\n <Tooltip title=\"缩小\">\n <Button\n icon={<ZoomOutOutlined />}\n onClick={() => zoomOut()}\n />\n </Tooltip>\n <Tooltip title=\"重置视图\">\n <Button onClick={() => resetTransform()}>100%</Button>\n </Tooltip>\n <div className=\"text-center text-xs text-gray-500\">\n {Math.round(viewport.scale * 100)}%\n </div>\n </Space>\n </div>\n\n <TransformComponent\n wrapperStyle={{ width: \"100%\", height: \"100%\", position: \"relative\" }}\n contentStyle={{ width: \"100%\", height: \"100%\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n {/* 画布背景 */}\n <div\n ref={canvasRef}\n data-canvas=\"true\"\n className={`\n relative bg-white\n ${isDragOver ? \"ring-4 ring-blue-400 ring-opacity-50\" : \"\"}\n ${mode === \"line-draw\" ? \"cursor-crosshair\" : \"\"}\n `}\n style={{\n width: 1920,\n height: 1080,\n flexShrink: 0,\n }}\n onClick={handleCanvasClick}\n onMouseDown={handleCanvasMouseDown}\n onDoubleClick={handleCanvasDoubleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}>\n {/* SVG 网格背景 - 随缩放自动铺满 */}\n <svg\n className=\"absolute top-0 left-0 pointer-events-none\"\n width=\"1920\"\n height=\"1080\"\n >\n <defs>\n <pattern\n id=\"grid\"\n width=\"20\"\n height=\"20\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e8e8e8\"\n strokeWidth=\"1\"\n />\n </pattern>\n </defs>\n <rect width=\"1920\" height=\"1080\" fill=\"url(#grid)\" />\n </svg>\n \n {/* 中心标记 */}\n <div className=\"absolute left-1/2 top-1/2 w-4 h-4 -ml-2 -mt-2 border border-blue-300 rounded-full opacity-50\" />\n\n {/* 拖拽提示 */}\n {isDragOver && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"bg-blue-500 text-white px-6 py-3 rounded-lg shadow-lg text-lg font-medium\">\n 释放以添加节点\n </div>\n </div>\n )}\n\n {/* 线条绘制提示 */}\n {mode === \"line-draw\" && (\n <div className=\"absolute top-4 left-1/2 -translate-x-1/2 z-50 pointer-events-none\">\n <div className=\"bg-blue-500 text-white px-4 py-2 rounded-lg shadow-lg text-sm font-medium flex items-center gap-2\">\n <span>线条绘制模式</span>\n <span className=\"text-blue-200\">|</span>\n <span className=\"text-blue-100\">\n {linePreview.isDrawing \n ? \"点击绘制下一条线段,双击结束绘制\" \n : \"点击确定起点\"}\n </span>\n <span className=\"text-blue-200\">|</span>\n <span className=\"text-blue-100 text-xs\">ESC 取消</span>\n </div>\n </div>\n )}\n\n {/* 线条绘制预览 */}\n {mode === \"line-draw\" && linePreview.isDrawing && linePreview.start && linePreview.end && (\n <svg\n className=\"absolute top-0 left-0 pointer-events-none\"\n style={{ \n zIndex: 1000, \n width: 1920, \n height: 1080,\n overflow: 'visible'\n }}>\n <line\n x1={linePreview.start.x}\n y1={linePreview.start.y}\n x2={linePreview.end.x}\n y2={linePreview.end.y}\n stroke=\"#1890ff\"\n strokeWidth={2}\n strokeDasharray=\"5,5\"\n />\n {/* 起点标记 */}\n <circle\n cx={linePreview.start.x}\n cy={linePreview.start.y}\n r={4}\n fill=\"#1890ff\"\n />\n {/* 终点标记 */}\n <circle\n cx={linePreview.end.x}\n cy={linePreview.end.y}\n r={4}\n fill=\"#1890ff\"\n stroke=\"#fff\"\n strokeWidth={2}\n />\n </svg>\n )}\n\n {/* 框选选择框 */}\n {isBoxSelecting && selectionBox.start && selectionBox.end && (\n <div\n className=\"absolute border-2 border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(selectionBox.start.x, selectionBox.end.x),\n top: Math.min(selectionBox.start.y, selectionBox.end.y),\n width: Math.abs(selectionBox.end.x - selectionBox.start.x),\n height: Math.abs(selectionBox.end.y - selectionBox.start.y),\n zIndex: 999,\n }}\n />\n )}\n\n {/* 渲染所有节点 */}\n {nodes.map((node) => (\n <NodeRenderer\n key={node.id}\n node={node}\n isSelected={\n (selectedNodeId === node.id || selectedNodeIds.includes(node.id)) && mode !== \"preview\"\n }\n onClick={() => {\n if (isBoxSelecting) return;\n selectNode(node.id);\n }}\n onMouseDown={(e) => handleNodeMouseDown(e, node)}\n data={mode === 'preview' ? previewData : testDataRef.current}\n onUpdateNode={updateNode}\n scale={transformRef.current?.state?.scale ?? 1}\n />\n ))}\n\n {/* 空状态提示 */}\n {nodes.length === 0 && !isDragOver && mode !== \"line-draw\" && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Empty\n description={\n <span>拖拽左侧物料库中的物料到画布以创建节点</span>\n }\n />\n </div>\n )}\n </div>\n </TransformComponent>\n </>\n )}\n </TransformWrapper>\n </div>\n\n {/* 状态栏 */}\n <div className=\"h-8 bg-white border-t border-gray-200 flex items-center justify-between px-4 text-xs text-gray-500\">\n <span>\n 节点数: {nodes.length} | 选中节点: {selectedNodeId ? \"是\" : \"否\"} |\n 选中状态: {selectedStatusId || \"无\"}\n </span>\n <span>\n 位置: ({Math.round(viewport.positionX)},{\" \"}\n {Math.round(viewport.positionY)}) | 缩放:{\" \"}\n {Math.round(viewport.scale * 100)}%\n </span>\n </div>\n\n {/* 数据模拟弹窗 */}\n <Modal\n title=\"数据模拟\"\n open={dataModalVisible}\n onOk={handleApplyData}\n onCancel={() => setDataModalVisible(false)}\n width={600}\n okText=\"应用\"\n cancelText=\"取消\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-gray-500\">\n 输入测试数据(JSON格式),用于状态表达式计算。状态表达式可以使用{\" \"}\n <code>data</code> 变量访问这些数据。\n </p>\n\n <Form layout=\"vertical\">\n <Form.Item\n label=\"测试数据\"\n validateStatus={dataError ? \"error\" : \"\"}\n help={dataError}>\n <TextArea\n value={dataInput}\n onChange={(e) => {\n setDataInput(e.target.value);\n setDataError(null);\n }}\n rows={10}\n placeholder={`{\n \"running\": true,\n \"temperature\": 25,\n \"pressure\": 1.5\n}`}\n />\n </Form.Item>\n </Form>\n\n <Collapse ghost>\n <Panel header=\"使用示例\" key=\"examples\">\n <div className=\"space-y-2 text-sm\">\n <p>\n <strong>状态A(运行中):</strong>\n </p>\n <code className=\"bg-gray-100 px-2 py-1 rounded\">\n return data.running === true;\n </code>\n\n <p className=\"mt-2\">\n <strong>状态B(高温报警):</strong>\n </p>\n <code className=\"bg-gray-100 px-2 py-1 rounded\">\n return data.temperature > 80;\n </code>\n\n <p className=\"mt-2\">\n <strong>状态C(默认):</strong>\n </p>\n <code className=\"bg-gray-100 px-2 py-1 rounded\">\n return true;\n </code>\n </div>\n </Panel>\n </Collapse>\n </div>\n </Modal>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Form,\n Input,\n InputNumber,\n Select,\n Switch,\n Collapse,\n Button,\n Empty,\n Tabs,\n Space,\n Divider,\n ColorPicker,\n Tag,\n Modal,\n} from \"antd\";\nimport {\n PlusOutlined,\n DeleteOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n CopyOutlined,\n EditOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport type {\n Material,\n TextMaterial,\n LineMaterial,\n NodeStatus,\n Node,\n GroupNode,\n} from \"../../types\";\nimport { nanoid } from \"nanoid\";\n\nconst { Panel } = Collapse;\nconst { TabPane } = Tabs;\nconst { Option } = Select;\nconst { TextArea } = Input;\n\n// 数据选项类型\ninterface DataOption {\n paramsCode: string;\n paramsName: string;\n unit?: string;\n [key: string]: any;\n}\n\n// ==================== 物料编辑器组件 ====================\n\ninterface MaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\n// TEXT 物料编辑器\nconst TextMaterialEditor: React.FC<MaterialEditorProps> = ({\n material,\n onSave,\n bindCodes = [],\n dataOptions = [],\n}) => {\n const textMaterial = material as TextMaterial;\n const content = textMaterial.content || {};\n\n const [formData, setFormData] = useState({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n\n useEffect(() => {\n setFormData({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: any) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n // 当选择值来源时,自动从数据选项中获取单位\n const handleValueSourceChange = (code: string) => {\n const selectedOption = dataOptions.find((opt) => opt.paramsCode === code);\n const autoUnit = selectedOption?.paramsUnit || \"\";\n\n setFormData((prev) => ({\n ...prev,\n valueSourceCode: code,\n unit: autoUnit,\n value: selectedOption?.[\"value\"] || \"\",\n }));\n\n // 延迟保存以确保状态更新\n setTimeout(() => {\n onSave({\n content: {\n ...content,\n valueSourceCode: code,\n value: selectedOption?.[\"value\"] || \"\",\n unit: autoUnit,\n },\n } as Partial<Material>);\n }, 0);\n };\n\n const handleSave = () => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n };\n\n // 筛选出已绑定的数据选项\n const boundDataOptions = dataOptions.filter((opt) =>\n bindCodes.includes(opt.paramsCode),\n );\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>文本内容</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"标签文本 (label)\">\n <Input\n value={formData.label}\n onChange={(e) => handleChange(\"label\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"输入标签文本\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"值来源\"\n help=\"从绑定的数据中选择字段,优先级高于手动输入的值\">\n <Select\n value={formData.valueSourceCode || undefined}\n onChange={handleValueSourceChange}\n placeholder=\"选择数据字段(可选)\"\n allowClear\n style={{ width: \"100%\" }}\n fieldNames={{\n value: \"paramsCode\",\n label: \"paramsName\",\n }}\n options={boundDataOptions}\n />\n </Form.Item>\n\n <Form.Item\n label={formData.valueSourceCode ? \"默认值(备用)\" : \"值文本\"}\n help={\n formData.valueSourceCode\n ? \"已绑定数据源,实际值将来自数据字段,此处仅设置无数据时的备用显示\"\n : \"手动输入显示的值\"\n }>\n <Input\n value={formData.value}\n onChange={(e) => handleChange(\"value\", e.target.value)}\n onBlur={handleSave}\n placeholder={\n formData.valueSourceCode\n ? \"数据字段无值时显示此备用值\"\n : \"输入值文本\"\n }\n disabled={!!formData.valueSourceCode}\n variant={formData.valueSourceCode ? \"filled\" : undefined}\n />\n </Form.Item>\n\n <Form.Item label=\"单位\" help=\"优先从绑定数据自动获取,也可手动输入\">\n <Input\n value={formData.unit}\n onChange={(e) => handleChange(\"unit\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"单位(如°C、%、MPa等)\"\n suffix={\n formData.valueSourceCode && boundDataOptions.length > 0 ? (\n <Tag color=\"blue\" style={{ marginRight: -8 }}>\n 自动\n </Tag>\n ) : null\n }\n />\n </Form.Item>\n\n <Form.Item\n label=\"保留小数位\"\n help=\"数值格式化时保留的小数位数,-1表示不格式化\">\n <InputNumber\n value={formData.decimals}\n onChange={(v) => handleChange(\"decimals\", v ?? 2)}\n onBlur={handleSave}\n min={-1}\n max={10}\n style={{ width: \"100%\" }}\n />\n </Form.Item>\n </Form>\n\n <Divider>标签样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.labelFontSize}\n onChange={(v) => handleChange(\"labelFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.labelFontWeight}\n onChange={(v) => {\n handleChange(\"labelFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.labelColor}\n onChange={(color) =>\n handleChange(\"labelColor\", color.toHexString())\n }\n onChangeComplete={() => handleSave()}\n />\n <Input\n value={formData.labelColor}\n onChange={(e) => handleChange(\"labelColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#262626\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n\n <Divider>值样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.valueFontSize}\n onChange={(v) => handleChange(\"valueFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.valueFontWeight}\n onChange={(v) => {\n handleChange(\"valueFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.valueColor}\n onChange={(color) =>\n handleChange(\"valueColor\", color.toHexString())\n }\n onChangeComplete={() => handleSave()}\n />\n <Input\n value={formData.valueColor}\n onChange={(e) => handleChange(\"valueColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\n// IMAGE 物料编辑器\nconst ImageMaterialEditor: React.FC<MaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const [formData, setFormData] = useState({\n name: material.name,\n src: (material as any).src || \"\",\n });\n\n useEffect(() => {\n setFormData({\n name: material.name,\n src: (material as any).src || \"\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: any) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleSave = () => {\n onSave({\n name: formData.name,\n src: formData.src,\n } as Partial<Material>);\n };\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>图片属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"图片名称\">\n <Input\n value={formData.name}\n onChange={(e) => handleChange(\"name\", e.target.value)}\n onBlur={handleSave}\n />\n </Form.Item>\n\n <Form.Item label=\"图片地址 (src)\">\n <TextArea\n value={formData.src}\n onChange={(e) => handleChange(\"src\", e.target.value)}\n onBlur={handleSave}\n rows={4}\n placeholder=\"输入图片 URL 或 Data URI\"\n />\n </Form.Item>\n </Form>\n </div>\n );\n};\n\n// LINE 物料编辑器\nconst LineMaterialEditor: React.FC<MaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const lineConfig = (material as LineMaterial).config || {};\n\n const [formData, setFormData] = useState({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n\n useEffect(() => {\n setFormData({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n }, [material.id]);\n\n // 立即保存,使用新的配置值\n const handleSaveWithValues = (newValues: Partial<typeof formData>) => {\n const newFormData = { ...formData, ...newValues };\n setFormData(newFormData);\n \n // 保留原有配置,更新所有属性\n onSave({\n config: {\n ...lineConfig,\n thickness: newFormData.lineWeight,\n lineWeight: newFormData.lineWeight,\n color: newFormData.color,\n lineType: newFormData.lineType,\n startX: newFormData.startX,\n startY: newFormData.startY,\n endX: newFormData.endX,\n endY: newFormData.endY,\n },\n } as Partial<Material>);\n };\n\n // 线型选项\n const lineTypeOptions = [\n { value: \"solid\", label: \"实线\", desc: \"连续实线\" },\n { value: \"dashed\", label: \"虚线\", desc: \"长划间隔\" },\n { value: \"center\", label: \"点画线(中心线)\", desc: \"长点-短点交替\" },\n { value: \"phantom\", label: \"假想线\", desc: \"长划-双点交替\" },\n { value: \"dot\", label: \"点线\", desc: \"密集点状\" },\n { value: \"dash-dot\", label: \"画点线\", desc: \"长划-点交替\" },\n ];\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>线条属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"线型\" help=\"选择线条样式\">\n <Select\n value={formData.lineType}\n onChange={(v) => handleSaveWithValues({ lineType: v })}>\n {lineTypeOptions.map((opt) => (\n <Option key={opt.value} value={opt.value}>\n <div className=\"flex flex-col\">\n <span>{opt.label}</span>\n <span className=\"text-xs text-gray-400\">{opt.desc}</span>\n </div>\n </Option>\n ))}\n </Select>\n </Form.Item>\n\n <Form.Item label=\"线宽(像素)\">\n <InputNumber\n value={formData.lineWeight}\n onChange={(v) => handleSaveWithValues({ lineWeight: v || 2 })}\n min={1}\n max={20}\n style={{ width: 120 }}\n />\n </Form.Item>\n\n <Form.Item label=\"颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.color}\n onChange={(color) => handleSaveWithValues({ color: color.toHexString() })}\n />\n <Input\n value={formData.color}\n onChange={(e) => handleSaveWithValues({ color: e.target.value })}\n placeholder=\"#d9d9d9\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n\n <Divider>起止位置(相对节点)</Divider>\n \n <Form layout=\"vertical\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Form.Item label=\"起点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.startX}\n onChange={(v) => handleSaveWithValues({ startX: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"起点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.startY}\n onChange={(v) => handleSaveWithValues({ startY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.endX}\n onChange={(v) => handleSaveWithValues({ endX: v ?? 100 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.endY}\n onChange={(v) => handleSaveWithValues({ endY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n </div>\n \n <Form.Item label=\"快速对齐\" className=\"mt-4\">\n <Space>\n <Button \n size=\"small\" \n onClick={() => {\n // 水平对齐:保持起点不变,终点Y与起点相同\n handleSaveWithValues({ endY: formData.startY });\n }}\n title=\"将线条变为水平线\">\n 水平\n </Button>\n <Button \n size=\"small\" \n onClick={() => {\n // 垂直对齐:保持起点不变,终点X与起点相同\n handleSaveWithValues({ endX: formData.startX });\n }}\n title=\"将线条变为垂直线\">\n 垂直\n </Button>\n <Button \n size=\"small\"\n onClick={() => {\n // 交换起点和终点\n handleSaveWithValues({ \n startX: formData.endX,\n startY: formData.endY,\n endX: formData.startX,\n endY: formData.startY,\n });\n }}\n title=\"交换起点和终点\">\n 反向\n </Button>\n </Space>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\n// 群组节点子节点状态编辑器\ninterface GroupNodeStatusEditorProps {\n node: GroupNode;\n updateNode: (nodeId: string, updates: Partial<Node>) => void;\n materials: Material[];\n}\n\nconst GroupNodeStatusEditor: React.FC<GroupNodeStatusEditorProps> = ({\n node,\n updateNode,\n materials,\n}) => {\n // 获取可用的物料列表(排除群组类型)\n const availableMaterials = materials.filter(m => m.type !== 'CUSTOM' || !m.config?.nodes);\n\n // 更新子节点的状态列表\n const handleUpdateChildStatusList = (childId: string, newStatusList: NodeStatus[]) => {\n const newChildren = node.children?.map(child => {\n if (child.id === childId) {\n return {\n ...child,\n contentInfo: {\n ...child.contentInfo,\n statusList: newStatusList,\n },\n };\n }\n return child;\n });\n\n updateNode(node.id, {\n children: newChildren,\n } as Partial<Node>);\n };\n\n // 添加状态到子节点\n const handleAddChildStatus = (childId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `状态${child.contentInfo.statusList.length + 1}`,\n expression: child.contentInfo.statusList.length === 0 ? 'return true;' : 'return false;',\n material: { ...availableMaterials[0], id: nanoid() } as Material,\n bindCodes: [],\n };\n\n handleUpdateChildStatusList(childId, [...child.contentInfo.statusList, newStatus]);\n };\n\n // 删除子节点的状态\n const handleDeleteChildStatus = (childId: string, statusId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.filter(s => s.id !== statusId);\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更新子节点的某个状态\n const handleUpdateChildStatus = (childId: string, statusId: string, updates: Partial<NodeStatus>) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.map(s => {\n if (s.id === statusId) {\n return { ...s, ...updates } as NodeStatus;\n }\n return s;\n });\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 移动子节点状态\n const handleMoveChildStatus = (childId: string, statusId: string, direction: 'up' | 'down') => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const index = child.contentInfo.statusList.findIndex(s => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...child.contentInfo.statusList];\n if (direction === 'up' && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [newStatusList[index - 1], newStatusList[index]];\n } else if (direction === 'down' && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [newStatusList[index + 1], newStatusList[index]];\n }\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更换子节点状态的物料\n const handleChangeChildStatusMaterial = (childId: string, statusId: string, materialId: string) => {\n const selectedMaterial = materials.find(m => m.id === materialId);\n if (!selectedMaterial) return;\n\n handleUpdateChildStatus(childId, statusId, {\n material: { ...selectedMaterial, id: nanoid() },\n });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"p-3 bg-blue-50 border border-blue-200 rounded-lg mb-4\">\n <div className=\"text-sm text-blue-700\">\n <strong>群组节点</strong>:为每个子节点配置多个状态和绑定\n </div>\n </div>\n\n <Collapse ghost>\n {node.children?.map((child, childIndex) => (\n <Panel\n key={child.id}\n header={\n <div className=\"flex items-center justify-between w-full pr-4\">\n <span className=\"font-medium text-sm\">子节点 {childIndex + 1}</span>\n <Tag color=\"blue\" style={{ fontSize: '12px', padding: '0 4px' }}>\n {child.contentInfo.statusList.length} 个状态\n </Tag>\n </div>\n }>\n <div className=\"space-y-3\">\n {/* 添加状态按钮 */}\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-sm text-gray-600\">状态列表</span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={() => handleAddChildStatus(child.id)}\n >\n 添加状态\n </Button>\n </div>\n\n {child.contentInfo.statusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost>\n {child.contentInfo.statusList.map((status, statusIndex) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{statusIndex + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">{status.material.type}</Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={statusIndex === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'up');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={statusIndex === child.contentInfo.statusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'down');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteChildStatus(child.id, status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n {/* 状态名称 */}\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { name: e.target.value })}\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n {/* 执行表达式 */}\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={status.expression}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { expression: e.target.value })}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n {/* 绑定数据源 */}\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) => handleUpdateChildStatus(child.id, status.id, { bindCodes: value })}\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n {/* 更换物料 */}\n <Form.Item label=\"更换物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Select\n placeholder=\"选择新物料\"\n style={{ width: 150 }}\n value={undefined}\n onChange={(value) => value && handleChangeChildStatusMaterial(child.id, status.id, value)}\n options={availableMaterials.map(m => ({\n value: m.id,\n label: `${m.name} (${m.type})`,\n }))}\n />\n </div>\n </Form.Item>\n\n {/* 物料属性编辑 */}\n <Divider style={{ margin: '12px 0' }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) => {\n const newMaterial = { ...status.material, ...updates } as Material;\n handleUpdateChildStatus(child.id, status.id, { material: newMaterial });\n }}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n </Panel>\n ))}\n </Collapse>\n </div>\n );\n};\n\n// 统一的物料编辑器\nconst MaterialPropertyEditor: React.FC<MaterialEditorProps> = ({\n material,\n onSave,\n bindCodes,\n dataOptions,\n}) => {\n switch (material.type) {\n case \"TEXT\":\n return (\n <TextMaterialEditor\n material={material}\n onSave={onSave}\n bindCodes={bindCodes}\n dataOptions={dataOptions}\n />\n );\n case \"IMAGE\":\n return <ImageMaterialEditor material={material} onSave={onSave} />;\n case \"LINE\":\n return <LineMaterialEditor material={material} onSave={onSave} />;\n default:\n return (\n <div className=\"text-center text-gray-400 py-8\">\n 暂不支持编辑此类型的物料\n </div>\n );\n }\n};\n\n// ==================== 主面板组件 ====================\n\nexport const PropertyPanel: React.FC<{ defaultTestData?: any }> = ({\n defaultTestData,\n}) => {\n const {\n nodes,\n selectedNodeId,\n updateNode,\n updateNodeStyle,\n updateNodeControl,\n updateNodeContent,\n materials, // 物料库,用于创建状态时选择物料\n addStatus,\n removeStatus,\n updateStatus,\n selectedStatusId,\n selectStatus,\n } = useEditorStore();\n\n const [form] = Form.useForm();\n const [activeTab, setActiveTab] = useState(\"basic\");\n const [materialModalVisible, setMaterialModalVisible] = useState(false);\n const [editingStatusId, setEditingStatusId] = useState<string | null>(null);\n const [editingExpressions, setEditingExpressions] = useState<\n Record<string, string>\n >({});\n // 使用 useMemo 获取选中的节点\n const selectedNode = React.useMemo(() => {\n return nodes.find((n) => n.id === selectedNodeId);\n }, [nodes, selectedNodeId]);\n\n // 获取当前节点的状态列表\n const currentStatusList = selectedNode?.contentInfo.statusList || [];\n\n // 获取当前选中的状态\n const selectedStatus = React.useMemo(() => {\n if (!selectedNode || !selectedStatusId) return null;\n return (\n selectedNode.contentInfo.statusList.find(\n (s) => s.id === selectedStatusId,\n ) || null\n );\n }, [selectedNode, selectedStatusId]);\n\n // 表单值变化时更新节点\n const handleValuesChange = (changedValues: any, _allValues: any) => {\n if (!selectedNodeId) return;\n\n if (changedValues.normalStyle) {\n updateNodeStyle(selectedNodeId, changedValues.normalStyle);\n }\n\n if (changedValues.name !== undefined) {\n updateNode(selectedNodeId, { name: changedValues.name });\n }\n\n if (changedValues.controlInfo) {\n updateNodeControl(selectedNodeId, changedValues.controlInfo);\n }\n };\n\n // 当选中节点变化时,重置表单\n useEffect(() => {\n if (selectedNode) {\n form.setFieldsValue({\n name: selectedNode.name,\n normalStyle: {\n width: 100,\n height: 100,\n x: 0,\n y: 0,\n padding: 8,\n background: \"transparent\",\n borderRadius: 0,\n opacity: 1,\n ...selectedNode.normalStyle,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n ...selectedNode.controlInfo,\n },\n });\n // 取消选中状态\n selectStatus(null);\n }\n }, [selectedNode?.id, form, selectStatus]);\n\n // ========== 状态管理 ==========\n\n // 添加状态\n const handleAddStatus = () => {\n if (!selectedNodeId || !selectedNode) return;\n\n // 打开物料选择弹窗\n setEditingStatusId(\"new\");\n setMaterialModalVisible(true);\n };\n\n // 从物料库选择物料创建状态\n const handleSelectMaterialForStatus = (material: Material) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `${material.name}_状态${currentStatusList.length + 1}`,\n expression:\n currentStatusList.length === 0 ? \"return true;\" : \"return false;\",\n material: { ...material, id: nanoid() }, // 复制物料并生成新ID\n bindCodes: [],\n };\n\n if (editingStatusId === \"new\") {\n // 添加新状态\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, {\n statusList: newStatusList as NodeStatus[],\n });\n } else if (editingStatusId) {\n // 更新现有状态的物料\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === editingStatusId) {\n return { ...s, material: { ...material, id: nanoid() } };\n }\n return s;\n });\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n }\n\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n };\n\n // 删除状态\n const handleDeleteStatus = (statusId: string) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.filter((s) => s.id !== statusId) ||\n [];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n\n if (selectedStatusId === statusId) {\n selectStatus(null);\n }\n };\n\n // 更新状态\n const handleUpdateStatus = (\n statusId: string,\n updates: Partial<NodeStatus>,\n ) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.map((s) => {\n if (s.id === statusId) {\n return { ...s, ...updates };\n }\n return s;\n }) || [];\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n // 复制状态\n const handleCopyStatus = (status: NodeStatus) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n name: `${status.name}_复制`,\n expression: \"return false;\",\n };\n\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n // 移动状态\n const handleMoveStatus = (statusId: string, direction: \"up\" | \"down\") => {\n if (!selectedNodeId || !selectedNode) return;\n\n const index = currentStatusList.findIndex((s) => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...currentStatusList];\n if (direction === \"up\" && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [\n newStatusList[index - 1],\n newStatusList[index],\n ];\n } else if (direction === \"down\" && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [\n newStatusList[index + 1],\n newStatusList[index],\n ];\n }\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n // 更改状态的物料\n const handleChangeStatusMaterial = (statusId: string) => {\n setEditingStatusId(statusId);\n setMaterialModalVisible(true);\n };\n\n // 更新状态绑定物料的属性\n const handleUpdateStatusMaterial = (\n statusId: string,\n updates: Partial<Material>,\n ) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === statusId) {\n return {\n ...s,\n material: { ...s.material, ...updates } as Material,\n };\n }\n return s;\n });\n\n updateNodeContent(selectedNodeId, {\n statusList: newStatusList as NodeStatus[],\n });\n };\n\n if (!selectedNode) {\n return (\n <div className=\"h-full flex items-center justify-center bg-white border-l border-gray-200\">\n <Empty description=\"请选择一个节点\" />\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col bg-white border-l border-gray-200\">\n {/* 标题 */}\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">属性面板</h3>\n <p className=\"text-sm text-gray-500\">编辑选中节点的属性</p>\n </div>\n\n {/* 属性表单 */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n <Tabs activeKey={activeTab} onChange={setActiveTab}>\n <TabPane tab=\"基础\" key=\"basic\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n initialValues={{\n name: selectedNode.name,\n }}>\n {/* 节点名称 */}\n <Form.Item label=\"节点名称\" name=\"name\">\n <Input placeholder=\"输入节点名称\" />\n </Form.Item>\n\n <Collapse ghost defaultActiveKey={[\"position\", \"size\", \"style\"]}>\n {/* 位置 */}\n <Panel header=\"位置\" key=\"position\">\n <Space>\n <Form.Item label=\"X\" name={[\"normalStyle\", \"x\"]}>\n <InputNumber />\n </Form.Item>\n <Form.Item label=\"Y\" name={[\"normalStyle\", \"y\"]}>\n <InputNumber />\n </Form.Item>\n </Space>\n </Panel>\n\n {/* 尺寸 */}\n <Panel header=\"尺寸\" key=\"size\">\n <Space>\n <Form.Item label=\"宽度\" name={[\"normalStyle\", \"width\"]}>\n <InputNumber min={10} />\n </Form.Item>\n <Form.Item label=\"高度\" name={[\"normalStyle\", \"height\"]}>\n <InputNumber min={10} />\n </Form.Item>\n </Space>\n </Panel>\n\n {/* 样式 */}\n <Panel header=\"样式\" key=\"style\">\n <Form.Item\n label=\"背景色\"\n name={[\"normalStyle\", \"background\"]}>\n <Input placeholder=\"transparent, #fff, url(...)\" />\n </Form.Item>\n\n <Form.Item label=\"内边距\" name={[\"normalStyle\", \"padding\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item\n label=\"圆角\"\n name={[\"normalStyle\", \"borderRadius\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item \n label=\"缩放比例\" \n name={[\"normalStyle\", \"scale\"]}\n help=\"等比缩放节点的宽高\">\n <InputNumber min={0.1} max={5} step={0.1} />\n </Form.Item>\n\n <Form.Item label=\"透明度\" name={[\"normalStyle\", \"opacity\"]}>\n <InputNumber min={0} max={1} step={0.1} />\n </Form.Item>\n\n <Form.Item label=\"层级\" name={[\"normalStyle\", \"zIndex\"]}>\n <InputNumber />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n </TabPane>\n\n <TabPane tab=\"状态\" key=\"status\">\n {/* 群组节点:子节点状态配置 */}\n {selectedNode.type === 'group' && selectedNode.children ? (\n <GroupNodeStatusEditor\n node={selectedNode}\n updateNode={updateNode}\n materials={materials}\n />\n ) : (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"font-medium\">\n 状态列表\n <Tag color=\"blue\" className=\"ml-2\">\n {currentStatusList.length}\n </Tag>\n </span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={handleAddStatus}>\n 添加状态\n </Button>\n </div>\n\n <p className=\"text-xs text-gray-500 mb-3\">\n 节点根据状态表达式计算结果显示对应物料,第一个返回 true\n 的状态为当前状态\n </p>\n\n {/* 当前状态显示 */}\n {currentStatusList.length > 0 && (\n <div className=\"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm text-gray-600\">当前状态:</span>\n <span className=\"ml-2 text-sm font-medium text-blue-600\">\n 由表达式自动计算\n </span>\n <span className=\"ml-2 text-xs text-gray-400\">\n (返回 true 的第一个状态)\n </span>\n </div>\n </div>\n <div className=\"mt-2 text-xs text-gray-500\">\n 提示: 使用画布工具栏的\"数据模拟\"按钮可以测试状态表达式\n </div>\n </div>\n )}\n\n {currentStatusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost>\n {currentStatusList.map((status, index) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">\n {index + 1}\n </span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">\n {status.material.type}\n </Tag>\n {/* {index === 0 && (\n <Tag color=\"success\" className=\"text-xs ml-1\">\n 默认\n </Tag>\n )} */}\n </div>\n }\n extra={\n <Space\n size=\"small\"\n onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={index === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"up\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={index === currentStatusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"down\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleCopyStatus(status);\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteStatus(status.id);\n }}\n />\n </Space>\n }>\n <Form layout=\"vertical\">\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) =>\n handleUpdateStatus(status.id, {\n name: e.target.value,\n })\n }\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\">\n <TextArea\n value={\n editingExpressions[status.id] ?? status.expression\n }\n onChange={(e) =>\n setEditingExpressions((prev) => ({\n ...prev,\n [status.id]: e.target.value,\n }))\n }\n onBlur={(e) => {\n handleUpdateStatus(status.id, {\n expression: e.target.value,\n });\n setEditingExpressions((prev) => {\n const newState = { ...prev };\n delete newState[status.id];\n return newState;\n });\n }}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) =>\n handleUpdateStatus(status.id, {\n bindCodes: value,\n })\n }\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n fieldNames={{\n value: \"paramsCode\",\n label: \"paramsName\",\n }}\n options={defaultTestData}\n />\n </Form.Item>\n\n <Form.Item label=\"绑定物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Button\n type=\"link\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={() =>\n handleChangeStatusMaterial(status.id)\n }>\n 更换物料\n </Button>\n </div>\n </Form.Item>\n\n {/* 状态物料属性编辑 */}\n <Divider style={{ margin: \"12px 0\" }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">\n 物料属性\n </span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) =>\n handleUpdateStatusMaterial(status.id, updates)\n }\n bindCodes={status.bindCodes || []}\n dataOptions={defaultTestData || []}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n )}\n </TabPane>\n\n <TabPane tab=\"控制\" key=\"control\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}>\n <Form.Item\n label=\"可拖拽\"\n name={[\"controlInfo\", \"isDraggable\"]}\n valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可点击\"\n name={[\"controlInfo\", \"isClickable\"]}\n valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可调整大小\"\n name={[\"controlInfo\", \"isResizable\"]}\n valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可选中\"\n name={[\"controlInfo\", \"isSelectable\"]}\n valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n </Form>\n </TabPane>\n </Tabs>\n </div>\n\n {/* 底部信息 */}\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <div className=\"text-xs text-gray-500\">\n <div>节点 ID: {selectedNode.id.slice(0, 8)}...</div>\n <div>状态数: {currentStatusList.length}</div>\n </div>\n </div>\n\n {/* 物料选择弹窗 */}\n <Modal\n title=\"选择物料\"\n open={materialModalVisible}\n onCancel={() => {\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n }}\n footer={null}\n width={600}>\n <div className=\"max-h-[400px] overflow-y-auto\">\n <Collapse\n ghost\n defaultActiveKey={[\"basic\", \"device\", \"text\", \"line\"]}>\n <Panel header=\"基础形状\" key=\"basic\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}>\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center\">\n {(material as any).src ? (\n <img\n src={(material as any).src}\n alt={material.name}\n className=\"w-10 h-10 object-contain\"\n />\n ) : (\n <span className=\"text-xs\">{material.name[0]}</span>\n )}\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name)),\n )\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}>\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center\">\n {(material as any).src ? (\n <img\n src={(material as any).src}\n alt={material.name}\n className=\"w-10 h-10 object-contain\"\n />\n ) : (\n <span className=\"text-xs\">{material.name[0]}</span>\n )}\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"TEXT\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}>\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <span className=\"text-lg font-bold text-gray-500\">\n T\n </span>\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"线条\" key=\"line\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"LINE\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}>\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n </Collapse>\n </div>\n </Modal>\n </div>\n );\n};\n","import React, { useEffect, useCallback } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport {\n Layout,\n Button,\n Space,\n Tooltip,\n Modal,\n message,\n ConfigProvider,\n} from \"antd\";\nimport { DownloadOutlined, UploadOutlined } from \"@ant-design/icons\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { MaterialPanel } from \"../MaterialPanel\";\nimport { Canvas } from \"../Canvas\";\nimport { PropertyPanel } from \"../PropertyPanel\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { SchemeJSON } from \"../../types\";\n\nconst { Header, Sider, Content } = Layout;\n\nexport interface ConfigEditorProps {\n /** 初始 scheme 数据 */\n initialScheme?: SchemeJSON;\n /** scheme 变化回调 */\n onChange?: (scheme: SchemeJSON) => void;\n /** 是否只读模式 */\n readonly?: boolean;\n /** 自定义头部内容 */\n headerExtra?: React.ReactNode;\n /** 样式类名 */\n className?: string;\n /** 内联样式 */\n style?: CSSProperties;\n /** 画布默认宽度 */\n defaultCanvasWidth?: number;\n /** 画布默认高度 */\n defaultCanvasHeight?: number;\n /** 是否显示头部 */\n showHeader?: boolean;\n /** 是否显示物料面板 */\n showMaterialPanel?: boolean;\n /** 是否显示属性面板 */\n showPropertyPanel?: boolean;\n /** 自定义物料列表 */\n customMaterials?: any[];\n /** 实时数据 */\n defaultTestData?: any[];\n}\n\nexport const ConfigEditor: React.FC<ConfigEditorProps> = ({\n initialScheme,\n onChange,\n readonly = false,\n headerExtra,\n className = \"\",\n style,\n showHeader = true,\n showMaterialPanel = true,\n showPropertyPanel = true,\n customMaterials,\n}) => {\n const [importModalVisible, setImportModalVisible] = React.useState(false);\n const [jsonInput, setJsonInput] = React.useState(\"\");\n const [defaultTestData, setDefaultTestData] = React.useState([\n {\n paramsCode: \"001\",\n paramsName: \"通频速度有效值\",\n value: 25,\n paramsUnit: \"mm/s\",\n },\n {\n paramsCode: \"002\",\n paramsName: \"通频加速度有效值\",\n value: 1.5,\n paramsUnit: \"m/s²\",\n },\n ]);\n const { exportScheme, importScheme, nodes, materials, addMaterial } =\n useEditorStore();\n const internalRef = React.useRef<any>(null);\n const initializedRef = React.useRef(false);\n // useEffect(() => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // internalRef.current = setInterval(() => {\n // setDefaultTestData([\n // {\n // paramsCode: \"001\",\n // paramsName: \"通频速度有效值\",\n // value: 25 + Math.random() * 5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"mm/s\",\n // },\n // {\n // paramsCode: \"002\",\n // paramsName: \"通频加速度有效值\",\n // value: 1.5 + Math.random() * 0.5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"m/s²\",\n // },\n // ]);\n // }, 1000);\n // return () => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // };\n // }, []);\n // 初始化\n useEffect(() => {\n // 防止 React 18 严格模式下重复执行\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n // 加载默认物料\n if (materials.length === 0) {\n initMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载自定义物料\n if (customMaterials && customMaterials.length > 0) {\n customMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载初始 scheme\n if (initialScheme) {\n importScheme(initialScheme);\n }\n }, []);\n\n // 监听变化并回调\n useEffect(() => {\n if (onChange) {\n const scheme = exportScheme();\n onChange(scheme);\n }\n }, [nodes, onChange]);\n\n // 导出 JSON\n const handleExport = useCallback(() => {\n const scheme = exportScheme();\n const dataStr = JSON.stringify(scheme, null, 2);\n const dataUri =\n \"data:application/json;charset=utf-8,\" + encodeURIComponent(dataStr);\n\n const exportFileDefaultName = `scheme_${Date.now()}.json`;\n\n const linkElement = document.createElement(\"a\");\n linkElement.setAttribute(\"href\", dataUri);\n linkElement.setAttribute(\"download\", exportFileDefaultName);\n linkElement.click();\n\n message.success(\"导出成功!\");\n }, [exportScheme]);\n\n // 导入 JSON\n const handleImport = useCallback(() => {\n try {\n const scheme: SchemeJSON = JSON.parse(jsonInput);\n importScheme(scheme);\n setImportModalVisible(false);\n setJsonInput(\"\");\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"JSON 格式错误,请检查输入\");\n }\n }, [jsonInput, importScheme]);\n\n // 处理文件导入\n const handleFileImport = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const scheme: SchemeJSON = JSON.parse(content);\n importScheme(scheme);\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"文件格式错误\");\n }\n };\n reader.readAsText(file);\n return false;\n },\n [importScheme],\n );\n\n // 导出 scheme 方法(供外部 ref 调用)\n const getScheme = useCallback(() => {\n return exportScheme();\n }, [exportScheme]);\n\n // 暴露给父组件\n React.useImperativeHandle(\n (React as any).useRef?.(),\n () => ({\n getScheme,\n exportScheme,\n importScheme,\n }),\n [getScheme, exportScheme, importScheme],\n );\n\n console.log(\"defaultTestData\", defaultTestData);\n\n return (\n <ConfigProvider locale={zhCN}>\n <Layout\n className={`h-full w-full overflow-hidden ${className}`}\n style={style}>\n {/* 顶部导航 */}\n {showHeader && (\n <Header className=\"bg-white border-b border-gray-200 px-4 flex items-center justify-between flex-shrink-0\">\n <div className=\"flex items-center gap-4\">\n <div className=\"text-xl font-bold text-blue-600\">组态编辑器</div>\n <div className=\"text-sm text-gray-500\">{nodes.length} 个节点</div>\n </div>\n\n <Space>\n {headerExtra}\n {!readonly && (\n <>\n <Tooltip title=\"导出 JSON\">\n <Button icon={<DownloadOutlined />} onClick={handleExport}>\n 导出\n </Button>\n </Tooltip>\n\n <Tooltip title=\"导入 JSON\">\n <Button\n icon={<UploadOutlined />}\n onClick={() => setImportModalVisible(true)}>\n 导入\n </Button>\n </Tooltip>\n </>\n )}\n </Space>\n </Header>\n )}\n\n {/* 主体内容 */}\n <Layout>\n {/* 左侧物料面板 */}\n {showMaterialPanel && !readonly && (\n <Sider width={280} className=\"bg-white\" theme=\"light\">\n <MaterialPanel />\n </Sider>\n )}\n\n {/* 中间画布 */}\n <Content className=\"bg-gray-100 relative\">\n <Canvas defaultTestData={defaultTestData} />\n </Content>\n\n {/* 右侧属性面板 */}\n {showPropertyPanel && !readonly && (\n <Sider width={360} className=\"bg-white\" theme=\"light\">\n <PropertyPanel defaultTestData={defaultTestData} />\n </Sider>\n )}\n </Layout>\n\n {/* 导入弹窗 */}\n <Modal\n title=\"导入组态方案\"\n open={importModalVisible}\n onOk={handleImport}\n onCancel={() => {\n setImportModalVisible(false);\n setJsonInput(\"\");\n }}\n width={600}>\n <div className=\"space-y-4\">\n <div>\n <p className=\"mb-2\">选择 JSON 文件导入:</p>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFileImport(file);\n }}\n className=\"block w-full text-sm text-gray-500\n file:mr-4 file:py-2 file:px-4\n file:rounded-full file:border-0\n file:text-sm file:font-semibold\n file:bg-blue-50 file:text-blue-700\n hover:file:bg-blue-100\"\n />\n </div>\n\n <div className=\"text-center text-gray-400\">或</div>\n\n <div>\n <p className=\"mb-2\">粘贴 JSON 内容:</p>\n <textarea\n value={jsonInput}\n onChange={(e) => setJsonInput(e.target.value)}\n placeholder=\"粘贴 JSON 内容...\"\n className=\"w-full h-48 p-3 border border-gray-300 rounded-lg font-mono text-sm resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </Modal>\n </Layout>\n </ConfigProvider>\n );\n};\n\nexport default ConfigEditor;\n"],"names":["_interopRequireDefault","e","module","zh_CN","locale","common","_common","require$$0","_typeof","o","ownKeys","r","t","_objectSpread","_defineProperty","obj","key","value","_toPropertyKey","i","_toPrimitive","_zh_CN","require$$1","_zh_CN2","_zh_CN3","_zh_CN4","typeTemplate","localeValues","immerImpl","initializer","set","get","store","updater","replace","args","nextState","produce","immer","initialState","createEvent","type","targetId","payload","nanoid","useEditorStore","create","node","autoSelect","state","newNode","id","updates","n","style","content","control","index","nodeId","status","newStatus","statusId","s","data","error","material","newMaterial","m","viewport","mode","endPoint","lastEvent","nextEvent","event","scheme","initMaterials","createDefaultStatus","createDefaultNode","x","y","children","childNode","minX","minY","maxX","maxY","child","cx","cy","cw","ch","relativeChildren","Panel","Collapse","Text","Typography","MaterialPanel","materials","addMaterial","removeMaterial","selectedStatusId","selectStatus","lineDrawing","startLineDrawing","cancelLineDrawing","activeKeys","setActiveKeys","useState","handleUpload","file","reader","src","groupedMaterials","handleDragStart","dragImage","handleLineMaterialClick","renderMaterialItem","isLineMode","isLineMaterial","isDrawingLine","jsx","List","Button","EditOutlined","DeleteOutlined","Image","jsxs","Tag","Upload","UploadOutlined","keys","item","Empty","Fragment","evaluateStatusExpression","params","d","result","findActiveStatus","statusList","bindData","getDataValue","valueSourceCode","dataItem","formatValue","decimals","num","renderMaterial","isSelected","imageMaterial","textMaterial","label","configValue","configUnit","labelStyle","valueStyle","customStyle","dataValue","dataUnit","displayValue","displayUnit","lineMaterial","thickness","color","dashed","lineType","lineWeight","startX","startY","endX","endY","dashArray","baseWeight","strokeColor","parent","customMaterial","NodeRendererComponent","onClick","onMouseDown","onUpdateNode","canvasScale","normalStyle","contentInfo","controlInfo","isClickable","isDraggable","draggingPoint","setDraggingPoint","dragStartPos","setDragStartPos","nodeRef","useRef","currentStatus","useMemo","activeStatus","currentMaterial","isLine","lineConfig","nodeScale","scaledWidth","scaledHeight","handlePointMouseDown","useCallback","point","useEffect","handleMouseMove","dx","dy","currentStartX","currentStartY","currentEndX","currentEndY","newStartX","newStartY","newEndX","newEndY","newNodeX","newNodeY","minNodeSize","newWidth","newHeight","handleMouseUp","isGroup","containerStyle","startPointPos","endPointPos","NodeRenderer","React","prevProps","nextProps","nodeA","nodeB","nodeStyleEqual","otherPropsEqual","TextArea","Input","Canvas","defaultTestData","transformRef","canvasRef","wrapperRef","nodes","selectedNodeId","setViewport","addNode","selectNode","updateNode","removeNode","undo","redo","setMode","updateLineDrawing","endLineDrawing","isDraggingRef","dragStartRef","dragOffsetRef","draggingNodeRef","forceUpdate","isDragOver","setIsDragOver","linePreview","setLinePreview","isBoxSelecting","setIsBoxSelecting","selectionBox","setSelectionBox","selectedNodeIds","setSelectedNodeIds","nodesRef","selectionBoxRef","isBoxSelectingRef","dataModalVisible","setDataModalVisible","testDataRef","previewData","setPreviewData","dataInput","setDataInput","dataError","setDataError","handleTransform","handleCanvasClick","handleDragOver","handleDragLeave","handleDrop","rect","currentTransform","scale","positionX","positionY","handleNodeMouseDown","getCanvasPosition","clientX","clientY","canvasRect","mouseXInCanvas","mouseYInCanvas","createLineNode","start","end","continueDrawing","config","relativeStartX","relativeStartY","relativeEndX","relativeEndY","nodeWidth","nodeHeight","nextStart","handleCanvasMouseDown","currentIsBoxSelecting","pos","handleCanvasDoubleClick","nodeX","nodeY","centerX","centerY","handleGroupNodes","selectedNodes","w","h","groupNode","handleSaveGroupToMaterial","selectedNode","groupMaterial","handleAlignNodes","direction","alignValue","newX","newY","currentSelectionBox","prev","box","selectedIds","scaleX","scaleY","screenDx","screenDy","canvasDx","canvasDy","nodeEl","handleKeyDown","handleApplyData","parsed","toolbarButtons","SelectOutlined","DragOutlined","EyeOutlined","actionButtons","UndoOutlined","RedoOutlined","GroupOutlined","AppstoreAddOutlined","AlignLeftOutlined","AlignRightOutlined","VerticalAlignTopOutlined","VerticalAlignBottomOutlined","SaveOutlined","ExperimentOutlined","Space","btn","Tooltip","TransformWrapper","zoomIn","zoomOut","resetTransform","ZoomInOutlined","ZoomOutOutlined","TransformComponent","Modal","Form","TabPane","Tabs","Option","Select","TextMaterialEditor","onSave","bindCodes","dataOptions","formData","setFormData","handleChange","field","handleValueSourceChange","code","selectedOption","opt","autoUnit","handleSave","boundDataOptions","Divider","InputNumber","v","ColorPicker","ImageMaterialEditor","LineMaterialEditor","handleSaveWithValues","newValues","newFormData","lineTypeOptions","GroupNodeStatusEditor","availableMaterials","handleUpdateChildStatusList","childId","newStatusList","newChildren","handleAddChildStatus","c","handleDeleteChildStatus","handleUpdateChildStatus","handleMoveChildStatus","handleChangeChildStatusMaterial","materialId","selectedMaterial","childIndex","PlusOutlined","statusIndex","ArrowUpOutlined","ArrowDownOutlined","MaterialPropertyEditor","PropertyPanel","updateNodeStyle","updateNodeControl","updateNodeContent","addStatus","removeStatus","updateStatus","form","activeTab","setActiveTab","materialModalVisible","setMaterialModalVisible","editingStatusId","setEditingStatusId","editingExpressions","setEditingExpressions","currentStatusList","handleValuesChange","changedValues","_allValues","handleAddStatus","handleSelectMaterialForStatus","handleDeleteStatus","handleUpdateStatus","handleCopyStatus","handleMoveStatus","handleChangeStatusMaterial","handleUpdateStatusMaterial","CopyOutlined","newState","Switch","Header","Sider","Content","Layout","ConfigEditor","initialScheme","onChange","readonly","headerExtra","className","showHeader","showMaterialPanel","showPropertyPanel","customMaterials","importModalVisible","setImportModalVisible","jsonInput","setJsonInput","setDefaultTestData","exportScheme","importScheme","initializedRef","handleExport","dataStr","dataUri","exportFileDefaultName","linkElement","message","handleImport","handleFileImport","getScheme","ConfigProvider","zhCN","DownloadOutlined"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
|