From 42a07e2bf86393835ae72909cf79cd8eb7727489 Mon Sep 17 00:00:00 2001 From: wintsa Date: Sun, 16 Aug 2026 17:06:45 +0800 Subject: [PATCH] 1 --- .../console-2026-08-16T07-50-01-138Z.log | 2 + .../console-2026-08-16T08-57-04-043Z.log | 1 + .../page-2026-08-16T07-49-38-636Z.yml | 0 .../page-2026-08-16T07-50-01-755Z.yml | 69 +++++++++ .../page-2026-08-16T07-51-13-733Z.yml | 70 +++++++++ .../page-2026-08-16T07-51-32-990Z.yml | 87 +++++++++++ .../page-2026-08-16T07-51-52-763Z.yml | 87 +++++++++++ .../page-2026-08-16T07-51-56-594Z.yml | 87 +++++++++++ .../page-2026-08-16T08-56-45-305Z.yml | 0 .../page-2026-08-16T08-57-04-463Z.yml | 70 +++++++++ .../page-2026-08-16T08-57-34-346Z.yml | 85 +++++++++++ .../page-2026-08-16T08-58-07-167Z.yml | 85 +++++++++++ .../page-2026-08-16T08-58-11-020Z.yml | 85 +++++++++++ src/App.tsx | 139 +++++++++++++++--- 14 files changed, 850 insertions(+), 17 deletions(-) create mode 100644 .playwright-cli/console-2026-08-16T07-50-01-138Z.log create mode 100644 .playwright-cli/console-2026-08-16T08-57-04-043Z.log create mode 100644 .playwright-cli/page-2026-08-16T07-49-38-636Z.yml create mode 100644 .playwright-cli/page-2026-08-16T07-50-01-755Z.yml create mode 100644 .playwright-cli/page-2026-08-16T07-51-13-733Z.yml create mode 100644 .playwright-cli/page-2026-08-16T07-51-32-990Z.yml create mode 100644 .playwright-cli/page-2026-08-16T07-51-52-763Z.yml create mode 100644 .playwright-cli/page-2026-08-16T07-51-56-594Z.yml create mode 100644 .playwright-cli/page-2026-08-16T08-56-45-305Z.yml create mode 100644 .playwright-cli/page-2026-08-16T08-57-04-463Z.yml create mode 100644 .playwright-cli/page-2026-08-16T08-57-34-346Z.yml create mode 100644 .playwright-cli/page-2026-08-16T08-58-07-167Z.yml create mode 100644 .playwright-cli/page-2026-08-16T08-58-11-020Z.yml diff --git a/.playwright-cli/console-2026-08-16T07-50-01-138Z.log b/.playwright-cli/console-2026-08-16T07-50-01-138Z.log new file mode 100644 index 0000000..938b5d4 --- /dev/null +++ b/.playwright-cli/console-2026-08-16T07-50-01-138Z.log @@ -0,0 +1,2 @@ +[ 344ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5173/node_modules/.vite/deps/react-dom_client.js?v=9a31a45b:20102 +[ 72434ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5173/node_modules/.vite/deps/react-dom_client.js?v=9a31a45b:20102 diff --git a/.playwright-cli/console-2026-08-16T08-57-04-043Z.log b/.playwright-cli/console-2026-08-16T08-57-04-043Z.log new file mode 100644 index 0000000..9b257ed --- /dev/null +++ b/.playwright-cli/console-2026-08-16T08-57-04-043Z.log @@ -0,0 +1 @@ +[ 167ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5173/node_modules/.vite/deps/react-dom_client.js?v=9a31a45b:20102 diff --git a/.playwright-cli/page-2026-08-16T07-49-38-636Z.yml b/.playwright-cli/page-2026-08-16T07-49-38-636Z.yml new file mode 100644 index 0000000..e69de29 diff --git a/.playwright-cli/page-2026-08-16T07-50-01-755Z.yml b/.playwright-cli/page-2026-08-16T07-50-01-755Z.yml new file mode 100644 index 0000000..7a0ad36 --- /dev/null +++ b/.playwright-cli/page-2026-08-16T07-50-01-755Z.yml @@ -0,0 +1,69 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer] + - button "自然地理区位" [ref=e12] [cursor=pointer] + - button "设施类别" [ref=e17] [cursor=pointer] + - button "建筑功能" [ref=e23] [cursor=pointer] + - button "建筑性质" [ref=e28] [cursor=pointer] + - button "建设阶段" [ref=e33] [cursor=pointer] + - button "规划形式" [ref=e40] [cursor=pointer] + - button "时间" [ref=e47] [cursor=pointer] + - button "面积" [ref=e51] [cursor=pointer] + - region "年度总费用图表" [ref=e59]: + - generic [ref=e60]: + - button "纵坐标:造价(元)" [ref=e62] [cursor=pointer]: 造价(元) + - generic [ref=e63]: + - figure "图表,共有0个系列": + - generic [ref=e64]: + - img "interactive chart" + - region [ref=e65] + - toolbar "标注" [ref=e66]: + - button "库" [ref=e67] [cursor=pointer] + - button "指" [ref=e68] [cursor=pointer] + - button "均" [ref=e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=e70] + - button "Text Tool" [disabled] [ref=e71] + - button "Shape Tool" [disabled] [ref=e72] + - button "Fibonacci Tool" [disabled] [ref=e73] + - button "全屏(F11)" [ref=e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e75] + - button "切换到表格" [ref=e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e77]: + - button "缩小" [disabled] [ref=e78] + - button "放大" [ref=e79] [cursor=pointer] + - button "左移" [disabled] [ref=e80] + - button "右移" [disabled] [ref=e81] + - button "重置" [disabled] [ref=e82] + - button "收起选择区" [expanded] [ref=e83] [cursor=pointer] + - complementary "选择内容" [ref=e87]: + - tablist "选择内容切换项" [ref=e88]: + - tab "自然地理区位" [selected] [ref=e89] [cursor=pointer] + - tab "设施类别" [ref=e90] [cursor=pointer] + - tab "建设阶段" [ref=e91] [cursor=pointer] + - tab "规划形式" [ref=e92] [cursor=pointer] + - generic [ref=e93]: + - generic [ref=e94]: 自然地理区位 + - generic [ref=e95]: 加载中 \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T07-51-13-733Z.yml b/.playwright-cli/page-2026-08-16T07-51-13-733Z.yml new file mode 100644 index 0000000..640b8af --- /dev/null +++ b/.playwright-cli/page-2026-08-16T07-51-13-733Z.yml @@ -0,0 +1,70 @@ +- main [ref=f1e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=f1e4]: + - generic "筛选条件" [ref=f1e5]: + - button "省市区" [ref=f1e6] [cursor=pointer] + - button "自然地理区位" [ref=f1e12] [cursor=pointer] + - button "设施类别" [ref=f1e17] [cursor=pointer] + - button "建筑功能" [ref=f1e23] [cursor=pointer] + - button "建筑性质" [ref=f1e28] [cursor=pointer] + - button "建设阶段" [ref=f1e33] [cursor=pointer] + - button "规划形式" [ref=f1e40] [cursor=pointer] + - button "时间" [ref=f1e47] [cursor=pointer] + - button "面积" [ref=f1e51] [cursor=pointer] + - region "年度总费用图表" [ref=f1e59]: + - generic [ref=f1e60]: + - button "纵坐标:造价(元)" [ref=f1e62] [cursor=pointer]: 造价(元) + - generic [ref=f1e63]: + - figure "图表,共有0个系列": + - generic [ref=f1e64]: + - img "interactive chart" + - region [ref=f1e65] + - toolbar "标注" [ref=f1e66]: + - button "库" [ref=f1e67] [cursor=pointer] + - button "指" [ref=f1e68] [cursor=pointer] + - button "均" [ref=f1e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=f1e70] + - button "Text Tool" [disabled] [ref=f1e71] + - button "Shape Tool" [disabled] [ref=f1e72] + - button "Fibonacci Tool" [disabled] [ref=f1e73] + - button "全屏(F11)" [ref=f1e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=f1e75] + - button "切换到表格" [ref=f1e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=f1e77]: + - button "缩小" [disabled] [ref=f1e78] + - button "放大" [ref=f1e79] [cursor=pointer] + - button "左移" [disabled] [ref=f1e80] + - button "右移" [disabled] [ref=f1e81] + - button "重置" [disabled] [ref=f1e82] + - button "收起选择区" [expanded] [ref=f1e83] [cursor=pointer] + - complementary "选择内容" [ref=f1e87]: + - tablist "选择内容切换项" [ref=f1e88]: + - tab "自然地理区位" [selected] [ref=f1e89] [cursor=pointer] + - tab "设施类别" [ref=f1e90] [cursor=pointer] + - tab "建筑功能" [ref=f1e91] [cursor=pointer] + - tab "建设阶段" [ref=f1e92] [cursor=pointer] + - tab "规划形式" [ref=f1e93] [cursor=pointer] + - generic [ref=f1e94]: + - generic [ref=f1e95]: 自然地理区位 + - generic [ref=f1e96]: 加载中 \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T07-51-32-990Z.yml b/.playwright-cli/page-2026-08-16T07-51-32-990Z.yml new file mode 100644 index 0000000..be958ee --- /dev/null +++ b/.playwright-cli/page-2026-08-16T07-51-32-990Z.yml @@ -0,0 +1,87 @@ +- main [ref=f1e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=f1e4]: + - generic "筛选条件" [ref=f1e5]: + - button "省市区" [ref=f1e6] [cursor=pointer] + - button "自然地理区位" [ref=f1e12] [cursor=pointer] + - button "设施类别" [ref=f1e17] [cursor=pointer] + - button "建筑功能" [ref=f1e23] [cursor=pointer] + - button "建筑性质" [active] [ref=f1e28] [cursor=pointer] + - button "建设阶段" [ref=f1e33] [cursor=pointer] + - button "规划形式" [ref=f1e40] [cursor=pointer] + - button "时间" [ref=f1e47] [cursor=pointer] + - button "面积" [ref=f1e51] [cursor=pointer] + - region "年度总费用图表" [ref=f1e59]: + - generic [ref=f1e60]: + - button "纵坐标:造价(元)" [ref=f1e62] [cursor=pointer]: 造价(元) + - generic [ref=f1e63]: + - figure "图表,共有0个系列": + - generic [ref=f1e64]: + - img "interactive chart" + - region [ref=f1e65] + - toolbar "标注" [ref=f1e66]: + - button "库" [ref=f1e67] [cursor=pointer] + - button "指" [ref=f1e68] [cursor=pointer] + - button "均" [ref=f1e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=f1e70] + - button "Text Tool" [disabled] [ref=f1e71] + - button "Shape Tool" [disabled] [ref=f1e72] + - button "Fibonacci Tool" [disabled] [ref=f1e73] + - button "全屏(F11)" [ref=f1e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=f1e75] + - button "切换到表格" [ref=f1e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=f1e77]: + - button "缩小" [disabled] [ref=f1e78] + - button "放大" [ref=f1e79] [cursor=pointer] + - button "左移" [disabled] [ref=f1e80] + - button "右移" [disabled] [ref=f1e81] + - button "重置" [disabled] [ref=f1e82] + - button "收起选择区" [expanded] [ref=f1e83] [cursor=pointer] + - complementary "选择内容" [ref=f1e87]: + - tablist "选择内容切换项" [ref=f1e88]: + - tab "自然地理区位" [selected] [ref=f1e89] [cursor=pointer] + - tab "设施类别" [ref=f1e90] [cursor=pointer] + - tab "建筑功能" [ref=f1e91] [cursor=pointer] + - tab "建设阶段" [ref=f1e92] [cursor=pointer] + - tab "规划形式" [ref=f1e93] [cursor=pointer] + - generic [ref=f1e94]: + - generic [ref=f1e95]: 自然地理区位 + - generic [ref=f1e96]: 接口待接入 + - dialog "建筑性质筛选" [ref=f1e97]: + - generic [ref=f1e98]: + - heading "建筑性质" [level=2] [ref=f1e99] + - button "关闭" [ref=f1e100] [cursor=pointer]: × + - searchbox "搜索" [ref=f1e102] + - generic [ref=f1e103]: 未选择 + - tree [ref=f1e105]: + - treeitem [ref=f1e106]: + - button "公共建筑" [ref=f1e109] [cursor=pointer] + - treeitem [ref=f1e112]: + - button "民用建筑" [ref=f1e115] [cursor=pointer] + - treeitem [ref=f1e118]: + - button "工业建筑" [ref=f1e121] [cursor=pointer] + - generic [ref=f1e124]: + - button "清空当前" [ref=f1e125] [cursor=pointer] + - button "取消" [ref=f1e126] [cursor=pointer] + - button "确认" [ref=f1e127] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T07-51-52-763Z.yml b/.playwright-cli/page-2026-08-16T07-51-52-763Z.yml new file mode 100644 index 0000000..80449ab --- /dev/null +++ b/.playwright-cli/page-2026-08-16T07-51-52-763Z.yml @@ -0,0 +1,87 @@ +- main [ref=f1e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=f1e4]: + - generic "筛选条件" [ref=f1e5]: + - button "省市区" [ref=f1e6] [cursor=pointer] + - button "自然地理区位" [ref=f1e12] [cursor=pointer] + - button "设施类别" [ref=f1e17] [cursor=pointer] + - button "建筑功能" [ref=f1e23] [cursor=pointer] + - button "建筑性质" [ref=f1e28] [cursor=pointer] + - button "建设阶段" [ref=f1e33] [cursor=pointer] + - button "规划形式" [ref=f1e40] [cursor=pointer] + - button "时间" [ref=f1e47] [cursor=pointer] + - button "面积" [ref=f1e51] [cursor=pointer] + - region "年度总费用图表" [ref=f1e59]: + - generic [ref=f1e60]: + - button "纵坐标:造价(元)" [ref=f1e62] [cursor=pointer]: 造价(元) + - generic [ref=f1e63]: + - figure "图表,共有0个系列": + - generic [ref=f1e64]: + - img "interactive chart" + - region [ref=f1e65] + - toolbar "标注" [ref=f1e66]: + - button "库" [ref=f1e67] [cursor=pointer] + - button "指" [ref=f1e68] [cursor=pointer] + - button "均" [ref=f1e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=f1e70] + - button "Text Tool" [disabled] [ref=f1e71] + - button "Shape Tool" [disabled] [ref=f1e72] + - button "Fibonacci Tool" [disabled] [ref=f1e73] + - button "全屏(F11)" [ref=f1e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=f1e75] + - button "切换到表格" [ref=f1e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=f1e77]: + - button "缩小" [disabled] [ref=f1e78] + - button "放大" [ref=f1e79] [cursor=pointer] + - button "左移" [disabled] [ref=f1e80] + - button "右移" [disabled] [ref=f1e81] + - button "重置" [disabled] [ref=f1e82] + - button "收起选择区" [expanded] [ref=f1e83] [cursor=pointer] + - complementary "选择内容" [ref=f1e87]: + - tablist "选择内容切换项" [ref=f1e88]: + - tab "自然地理区位" [selected] [ref=f1e89] [cursor=pointer] + - tab "设施类别" [ref=f1e90] [cursor=pointer] + - tab "建筑功能" [ref=f1e91] [cursor=pointer] + - tab "建设阶段" [ref=f1e92] [cursor=pointer] + - tab "规划形式" [ref=f1e93] [cursor=pointer] + - generic [ref=f1e94]: + - generic [ref=f1e95]: 自然地理区位 + - generic [ref=f1e96]: 接口待接入 + - dialog "建筑性质筛选" [ref=f1e97]: + - generic [ref=f1e98]: + - heading "建筑性质" [level=2] [ref=f1e99] + - button "关闭" [ref=f1e100] [cursor=pointer]: × + - searchbox "搜索" [ref=f1e102] + - generic [ref=f1e103]: 已选 1 项 + - tree [ref=f1e105]: + - treeitem [ref=f1e106]: + - button "公共建筑" [active] [pressed] [ref=f1e109] [cursor=pointer] + - treeitem [ref=f1e112]: + - button "民用建筑" [ref=f1e115] [cursor=pointer] + - treeitem [ref=f1e118]: + - button "工业建筑" [ref=f1e121] [cursor=pointer] + - generic [ref=f1e124]: + - button "清空当前" [ref=f1e125] [cursor=pointer] + - button "取消" [ref=f1e126] [cursor=pointer] + - button "确认" [ref=f1e127] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T07-51-56-594Z.yml b/.playwright-cli/page-2026-08-16T07-51-56-594Z.yml new file mode 100644 index 0000000..4aa6a32 --- /dev/null +++ b/.playwright-cli/page-2026-08-16T07-51-56-594Z.yml @@ -0,0 +1,87 @@ +- main [ref=f1e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=f1e4]: + - generic "筛选条件" [ref=f1e5]: + - button "省市区" [ref=f1e6] [cursor=pointer] + - button "自然地理区位" [ref=f1e12] [cursor=pointer] + - button "设施类别" [ref=f1e17] [cursor=pointer] + - button "建筑功能" [ref=f1e23] [cursor=pointer] + - button "建筑性质" [ref=f1e28] [cursor=pointer] + - button "建设阶段" [ref=f1e33] [cursor=pointer] + - button "规划形式" [ref=f1e40] [cursor=pointer] + - button "时间" [ref=f1e47] [cursor=pointer] + - button "面积" [ref=f1e51] [cursor=pointer] + - region "年度总费用图表" [ref=f1e59]: + - generic [ref=f1e60]: + - button "纵坐标:造价(元)" [ref=f1e62] [cursor=pointer]: 造价(元) + - generic [ref=f1e63]: + - figure "图表,共有0个系列": + - generic [ref=f1e64]: + - img "interactive chart" + - region [ref=f1e65] + - toolbar "标注" [ref=f1e66]: + - button "库" [ref=f1e67] [cursor=pointer] + - button "指" [ref=f1e68] [cursor=pointer] + - button "均" [ref=f1e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=f1e70] + - button "Text Tool" [disabled] [ref=f1e71] + - button "Shape Tool" [disabled] [ref=f1e72] + - button "Fibonacci Tool" [disabled] [ref=f1e73] + - button "全屏(F11)" [ref=f1e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=f1e75] + - button "切换到表格" [ref=f1e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=f1e77]: + - button "缩小" [disabled] [ref=f1e78] + - button "放大" [ref=f1e79] [cursor=pointer] + - button "左移" [disabled] [ref=f1e80] + - button "右移" [disabled] [ref=f1e81] + - button "重置" [disabled] [ref=f1e82] + - button "收起选择区" [expanded] [ref=f1e83] [cursor=pointer] + - complementary "选择内容" [ref=f1e87]: + - tablist "选择内容切换项" [ref=f1e88]: + - tab "自然地理区位" [selected] [ref=f1e89] [cursor=pointer] + - tab "设施类别" [ref=f1e90] [cursor=pointer] + - tab "建筑功能" [ref=f1e91] [cursor=pointer] + - tab "建设阶段" [ref=f1e92] [cursor=pointer] + - tab "规划形式" [ref=f1e93] [cursor=pointer] + - generic [ref=f1e94]: + - generic [ref=f1e95]: 自然地理区位 + - generic [ref=f1e96]: 接口待接入 + - dialog "建筑性质筛选" [ref=f1e97]: + - generic [ref=f1e98]: + - heading "建筑性质" [level=2] [ref=f1e99] + - button "关闭" [ref=f1e100] [cursor=pointer]: × + - searchbox "搜索" [ref=f1e102] + - generic [ref=f1e103]: 已选 1 项 + - tree [ref=f1e105]: + - treeitem [ref=f1e106]: + - button "公共建筑" [ref=f1e109] [cursor=pointer] + - treeitem [ref=f1e112]: + - button "民用建筑" [active] [pressed] [ref=f1e115] [cursor=pointer] + - treeitem [ref=f1e118]: + - button "工业建筑" [ref=f1e121] [cursor=pointer] + - generic [ref=f1e124]: + - button "清空当前" [ref=f1e125] [cursor=pointer] + - button "取消" [ref=f1e126] [cursor=pointer] + - button "确认" [ref=f1e127] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T08-56-45-305Z.yml b/.playwright-cli/page-2026-08-16T08-56-45-305Z.yml new file mode 100644 index 0000000..e69de29 diff --git a/.playwright-cli/page-2026-08-16T08-57-04-463Z.yml b/.playwright-cli/page-2026-08-16T08-57-04-463Z.yml new file mode 100644 index 0000000..af12a74 --- /dev/null +++ b/.playwright-cli/page-2026-08-16T08-57-04-463Z.yml @@ -0,0 +1,70 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer] + - button "自然地理区位" [ref=e12] [cursor=pointer] + - button "设施类别" [ref=e17] [cursor=pointer] + - button "建筑功能" [ref=e23] [cursor=pointer] + - button "建筑性质" [ref=e28] [cursor=pointer] + - button "建设阶段" [ref=e33] [cursor=pointer] + - button "规划形式" [ref=e40] [cursor=pointer] + - button "时间" [ref=e47] [cursor=pointer] + - button "面积" [ref=e51] [cursor=pointer] + - region "年度总费用图表" [ref=e59]: + - generic [ref=e60]: + - button "纵坐标:造价(元)" [ref=e62] [cursor=pointer]: 造价(元) + - generic [ref=e63]: + - figure "图表,共有0个系列": + - generic [ref=e64]: + - img "interactive chart" + - region [ref=e65] + - toolbar "标注" [ref=e66]: + - button "库" [ref=e67] [cursor=pointer] + - button "指" [ref=e68] [cursor=pointer] + - button "均" [ref=e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=e70] + - button "Text Tool" [disabled] [ref=e71] + - button "Shape Tool" [disabled] [ref=e72] + - button "Fibonacci Tool" [disabled] [ref=e73] + - button "全屏(F11)" [ref=e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e75] + - button "切换到表格" [ref=e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e77]: + - button "缩小" [disabled] [ref=e78] + - button "放大" [ref=e79] [cursor=pointer] + - button "左移" [disabled] [ref=e80] + - button "右移" [disabled] [ref=e81] + - button "重置" [disabled] [ref=e82] + - button "收起选择区" [expanded] [ref=e83] [cursor=pointer] + - complementary "选择内容" [ref=e87]: + - tablist "选择内容切换项" [ref=e88]: + - tab "自然地理区位" [selected] [ref=e89] [cursor=pointer] + - tab "设施类别" [ref=e90] [cursor=pointer] + - tab "建筑功能" [ref=e91] [cursor=pointer] + - tab "建设阶段" [ref=e92] [cursor=pointer] + - tab "规划形式" [ref=e93] [cursor=pointer] + - generic [ref=e94]: + - generic [ref=e95]: 自然地理区位 + - generic [ref=e96]: 加载中 \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T08-57-34-346Z.yml b/.playwright-cli/page-2026-08-16T08-57-34-346Z.yml new file mode 100644 index 0000000..a9178e7 --- /dev/null +++ b/.playwright-cli/page-2026-08-16T08-57-34-346Z.yml @@ -0,0 +1,85 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer] + - button "自然地理区位" [ref=e12] [cursor=pointer] + - button "设施类别" [ref=e17] [cursor=pointer] + - button "建筑功能" [ref=e23] [cursor=pointer] + - button "建筑性质" [active] [ref=e28] [cursor=pointer] + - button "建设阶段" [ref=e33] [cursor=pointer] + - button "规划形式" [ref=e40] [cursor=pointer] + - button "时间" [ref=e47] [cursor=pointer] + - button "面积" [ref=e51] [cursor=pointer] + - region "年度总费用图表" [ref=e59]: + - generic [ref=e60]: + - button "纵坐标:造价(元)" [ref=e62] [cursor=pointer]: 造价(元) + - generic [ref=e63]: + - figure "图表,共有0个系列": + - generic [ref=e64]: + - img "interactive chart" + - region [ref=e65] + - toolbar "标注" [ref=e66]: + - button "库" [ref=e67] [cursor=pointer] + - button "指" [ref=e68] [cursor=pointer] + - button "均" [ref=e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=e70] + - button "Text Tool" [disabled] [ref=e71] + - button "Shape Tool" [disabled] [ref=e72] + - button "Fibonacci Tool" [disabled] [ref=e73] + - button "全屏(F11)" [ref=e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e75] + - button "切换到表格" [ref=e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e77]: + - button "缩小" [disabled] [ref=e78] + - button "放大" [ref=e79] [cursor=pointer] + - button "左移" [disabled] [ref=e80] + - button "右移" [disabled] [ref=e81] + - button "重置" [disabled] [ref=e82] + - button "收起选择区" [expanded] [ref=e83] [cursor=pointer] + - complementary "选择内容" [ref=e87]: + - tablist "选择内容切换项" [ref=e88]: + - tab "自然地理区位" [selected] [ref=e89] [cursor=pointer] + - tab "设施类别" [ref=e90] [cursor=pointer] + - tab "建筑功能" [ref=e91] [cursor=pointer] + - tab "建设阶段" [ref=e92] [cursor=pointer] + - tab "规划形式" [ref=e93] [cursor=pointer] + - generic [ref=e94]: + - generic [ref=e95]: 自然地理区位 + - generic [ref=e96]: 接口待接入 + - dialog "建筑性质筛选" [ref=e97]: + - generic [ref=e98]: + - heading "建筑性质" [level=2] [ref=e99] + - button "关闭" [ref=e100] [cursor=pointer]: × + - searchbox "搜索" [ref=e102] + - generic [ref=e103]: 未选择 + - tree [ref=e105]: + - treeitem [ref=e106]: + - button "公共建筑" [ref=e109] [cursor=pointer] + - treeitem [ref=e112]: + - button "民用建筑" [ref=e115] [cursor=pointer] + - generic [ref=e118]: + - button "清空当前" [ref=e119] [cursor=pointer] + - button "取消" [ref=e120] [cursor=pointer] + - button "确认" [ref=e121] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T08-58-07-167Z.yml b/.playwright-cli/page-2026-08-16T08-58-07-167Z.yml new file mode 100644 index 0000000..7cc69e2 --- /dev/null +++ b/.playwright-cli/page-2026-08-16T08-58-07-167Z.yml @@ -0,0 +1,85 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer] + - button "自然地理区位" [ref=e12] [cursor=pointer] + - button "设施类别" [ref=e17] [cursor=pointer] + - button "建筑功能" [ref=e23] [cursor=pointer] + - button "建筑性质" [ref=e28] [cursor=pointer] + - button "建设阶段" [ref=e33] [cursor=pointer] + - button "规划形式" [ref=e40] [cursor=pointer] + - button "时间" [ref=e47] [cursor=pointer] + - button "面积" [ref=e51] [cursor=pointer] + - region "年度总费用图表" [ref=e59]: + - generic [ref=e60]: + - button "纵坐标:造价(元)" [ref=e62] [cursor=pointer]: 造价(元) + - generic [ref=e63]: + - figure "图表,共有0个系列": + - generic [ref=e64]: + - img "interactive chart" + - region [ref=e65] + - toolbar "标注" [ref=e66]: + - button "库" [ref=e67] [cursor=pointer] + - button "指" [ref=e68] [cursor=pointer] + - button "均" [ref=e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=e70] + - button "Text Tool" [disabled] [ref=e71] + - button "Shape Tool" [disabled] [ref=e72] + - button "Fibonacci Tool" [disabled] [ref=e73] + - button "全屏(F11)" [ref=e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e75] + - button "切换到表格" [ref=e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e77]: + - button "缩小" [disabled] [ref=e78] + - button "放大" [ref=e79] [cursor=pointer] + - button "左移" [disabled] [ref=e80] + - button "右移" [disabled] [ref=e81] + - button "重置" [disabled] [ref=e82] + - button "收起选择区" [expanded] [ref=e83] [cursor=pointer] + - complementary "选择内容" [ref=e87]: + - tablist "选择内容切换项" [ref=e88]: + - tab "自然地理区位" [selected] [ref=e89] [cursor=pointer] + - tab "设施类别" [ref=e90] [cursor=pointer] + - tab "建筑功能" [ref=e91] [cursor=pointer] + - tab "建设阶段" [ref=e92] [cursor=pointer] + - tab "规划形式" [ref=e93] [cursor=pointer] + - generic [ref=e94]: + - generic [ref=e95]: 自然地理区位 + - generic [ref=e96]: 接口待接入 + - dialog "建筑性质筛选" [ref=e97]: + - generic [ref=e98]: + - heading "建筑性质" [level=2] [ref=e99] + - button "关闭" [ref=e100] [cursor=pointer]: × + - searchbox "搜索" [ref=e102] + - generic [ref=e103]: 已选 1 项 + - tree [ref=e105]: + - treeitem [ref=e106]: + - button "公共建筑" [active] [pressed] [ref=e109] [cursor=pointer] + - treeitem [ref=e112]: + - button "民用建筑" [ref=e115] [cursor=pointer] + - generic [ref=e118]: + - button "清空当前" [ref=e119] [cursor=pointer] + - button "取消" [ref=e120] [cursor=pointer] + - button "确认" [ref=e121] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-08-16T08-58-11-020Z.yml b/.playwright-cli/page-2026-08-16T08-58-11-020Z.yml new file mode 100644 index 0000000..c546d64 --- /dev/null +++ b/.playwright-cli/page-2026-08-16T08-58-11-020Z.yml @@ -0,0 +1,85 @@ +- main [ref=e3]: + - generic: + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - generic: 众为数字化管理平台 + - region "年度费用模板" [ref=e4]: + - generic "筛选条件" [ref=e5]: + - button "省市区" [ref=e6] [cursor=pointer] + - button "自然地理区位" [ref=e12] [cursor=pointer] + - button "设施类别" [ref=e17] [cursor=pointer] + - button "建筑功能" [ref=e23] [cursor=pointer] + - button "建筑性质" [ref=e28] [cursor=pointer] + - button "建设阶段" [ref=e33] [cursor=pointer] + - button "规划形式" [ref=e40] [cursor=pointer] + - button "时间" [ref=e47] [cursor=pointer] + - button "面积" [ref=e51] [cursor=pointer] + - region "年度总费用图表" [ref=e59]: + - generic [ref=e60]: + - button "纵坐标:造价(元)" [ref=e62] [cursor=pointer]: 造价(元) + - generic [ref=e63]: + - figure "图表,共有0个系列": + - generic [ref=e64]: + - img "interactive chart" + - region [ref=e65] + - toolbar "标注" [ref=e66]: + - button "库" [ref=e67] [cursor=pointer] + - button "指" [ref=e68] [cursor=pointer] + - button "均" [ref=e69] [cursor=pointer] + - button "Line Tool" [disabled] [ref=e70] + - button "Text Tool" [disabled] [ref=e71] + - button "Shape Tool" [disabled] [ref=e72] + - button "Fibonacci Tool" [disabled] [ref=e73] + - button "全屏(F11)" [ref=e74] [cursor=pointer] + - button "Clear annotations" [disabled] [ref=e75] + - button "切换到表格" [ref=e76] [cursor=pointer]: + - generic: 趋 + - status: + - generic: 请选择右侧分类项 + - toolbar "缩放" [ref=e77]: + - button "缩小" [disabled] [ref=e78] + - button "放大" [ref=e79] [cursor=pointer] + - button "左移" [disabled] [ref=e80] + - button "右移" [disabled] [ref=e81] + - button "重置" [disabled] [ref=e82] + - button "收起选择区" [expanded] [ref=e83] [cursor=pointer] + - complementary "选择内容" [ref=e87]: + - tablist "选择内容切换项" [ref=e88]: + - tab "自然地理区位" [selected] [ref=e89] [cursor=pointer] + - tab "设施类别" [ref=e90] [cursor=pointer] + - tab "建筑功能" [ref=e91] [cursor=pointer] + - tab "建设阶段" [ref=e92] [cursor=pointer] + - tab "规划形式" [ref=e93] [cursor=pointer] + - generic [ref=e94]: + - generic [ref=e95]: 自然地理区位 + - generic [ref=e96]: 接口待接入 + - dialog "建筑性质筛选" [ref=e97]: + - generic [ref=e98]: + - heading "建筑性质" [level=2] [ref=e99] + - button "关闭" [ref=e100] [cursor=pointer]: × + - searchbox "搜索" [ref=e102] + - generic [ref=e103]: 已选 1 项 + - tree [ref=e105]: + - treeitem [ref=e106]: + - button "公共建筑" [ref=e109] [cursor=pointer] + - treeitem [ref=e112]: + - button "民用建筑" [active] [pressed] [ref=e115] [cursor=pointer] + - generic [ref=e118]: + - button "清空当前" [ref=e119] [cursor=pointer] + - button "取消" [ref=e120] [cursor=pointer] + - button "确认" [ref=e121] [cursor=pointer] \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 7c2e66e..58e4618 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -12,7 +12,7 @@ import { } from 'ag-grid-community'; import type { AgCartesianChartOptions } from 'ag-charts-community'; import { ModuleRegistry } from 'ag-charts-community'; -import { Building2, CalendarRange, Construction, LayoutGrid, Library, LocateFixed, MapPinned, PanelRightClose, PanelRightOpen, Ruler, SquareFunction, Waypoints } from 'lucide-react'; +import { Building2, CalendarRange, Construction, House, LayoutGrid, Library, LocateFixed, MapPinned, PanelRightClose, PanelRightOpen, Ruler, SquareFunction, Waypoints } from 'lucide-react'; import { AnnotationsModule, ContextMenuModule, @@ -75,6 +75,7 @@ const filterOptions = [ { key: 'geoLocation', label: '自然地理区位', icon: LocateFixed }, { key: 'facilityType', label: '设施类别', icon: Building2 }, { key: 'buildingFunction', label: '建筑功能', icon: SquareFunction }, + { key: 'buildingNature', label: '建筑性质', icon: House }, { key: 'constructionStage', label: '建设阶段', icon: Construction }, { key: 'planningForm', label: '规划形式', icon: LayoutGrid }, { key: 'time', label: '时间', icon: CalendarRange }, @@ -140,6 +141,26 @@ const contentTreeConfigs = { }, } as const; +const buildingNatureBrowserConfig = { + conditionEndpoint: '/api/public/browser/condition/256', + dataEndpoint: '/api/public/browser/data/256', + treeid: '95504', + fieldid: '316390', + searchbrowserid: '36523', + browserParams: { + requestid: '', + isshowsearchtab: '1', + workflowid: '182028', + wfid: '182028', + billid: '-1815', + f_weaver_belongto_userid: '', + f_weaver_belongto_usertype: '', + wf_isagent: '', + wf_beagenter: '', + wfCreater: '', + }, +} as const; + const chartLineColors = ['#0078a8', '#d14d72', '#1f8f4d', '#d96f23', '#6b5cc8', '#0d7680', '#9a6b12', '#b24b38']; const defaultTemplateFilterNode = { id: '3', @@ -603,12 +624,16 @@ function isIndicatorTreeFilterKey(filterKey: FilterKey): filterKey is 'indicator return filterKey === 'indicatorTree'; } +function isBuildingNatureFilterKey(filterKey: FilterKey): filterKey is 'buildingNature' { + return filterKey === 'buildingNature'; +} + function isRangeFilterKey(filterKey: FilterKey): filterKey is RangeFilterKey { return filterKey === 'time' || filterKey === 'area'; } function isSingleSelectFilterKey(filterKey: FilterKey) { - return isTemplateFilterKey(filterKey) || isIndicatorTreeFilterKey(filterKey); + return isTemplateFilterKey(filterKey) || isIndicatorTreeFilterKey(filterKey) || isBuildingNatureFilterKey(filterKey); } function getDefaultTemplateFilterNodes(): SelectedFilterNode[] { @@ -768,6 +793,7 @@ function App() { geoLocation: false, facilityType: false, buildingFunction: false, + buildingNature: false, constructionStage: false, planningForm: false, time: false, @@ -818,6 +844,7 @@ function App() { geoLocation: [], facilityType: [], buildingFunction: [], + buildingNature: [], constructionStage: [], planningForm: [], time: [], @@ -830,6 +857,7 @@ function App() { geoLocation: false, facilityType: false, buildingFunction: false, + buildingNature: false, constructionStage: false, planningForm: false, time: false, @@ -842,6 +870,7 @@ function App() { geoLocation: null, facilityType: null, buildingFunction: null, + buildingNature: null, constructionStage: null, planningForm: null, time: null, @@ -854,6 +883,7 @@ function App() { geoLocation: [], facilityType: [], buildingFunction: [], + buildingNature: [], constructionStage: [], planningForm: [], time: [], @@ -866,6 +896,7 @@ function App() { geoLocation: false, facilityType: false, buildingFunction: false, + buildingNature: false, constructionStage: false, planningForm: false, time: false, @@ -878,6 +909,7 @@ function App() { geoLocation: null, facilityType: null, buildingFunction: null, + buildingNature: null, constructionStage: null, planningForm: null, time: null, @@ -890,6 +922,7 @@ function App() { geoLocation: [], facilityType: [], buildingFunction: [], + buildingNature: [], constructionStage: [], planningForm: [], time: [], @@ -908,6 +941,7 @@ function App() { geoLocation: 0, facilityType: 0, buildingFunction: 0, + buildingNature: 0, constructionStage: 0, planningForm: 0, time: 0, @@ -1032,7 +1066,7 @@ function App() { ); const pivotGridPinnedBottomRowData = useMemo( () => { - if (hasTimeFilter) return []; + if (selectedContentNodes.length === 0 || hasTimeFilter) return []; const datum = chartSummaryBySelection[overallSummaryKey] ?? selectedContentNodes .map((node) => chartSummaryBySelection[getSelectionKey(node.contentKey, node.id)]) @@ -1243,6 +1277,7 @@ function App() { [ appliedFilters.area, appliedFilters.buildingFunction, + appliedFilters.buildingNature, appliedFilters.constructionStage, appliedFilters.facilityType, appliedFilters.geoLocation, @@ -1302,6 +1337,65 @@ function App() { return normalizeTreeRows(rows); }; + const fetchBuildingNatureFilterTree = async (nodeId?: string, signal?: AbortSignal) => { + const treeParams = { + ...browserTreeDefaults, + ...buildingNatureBrowserConfig.browserParams, + treeid: buildingNatureBrowserConfig.treeid, + cube_treeid: buildingNatureBrowserConfig.treeid, + searchbrowserid: buildingNatureBrowserConfig.searchbrowserid, + fieldid: buildingNatureBrowserConfig.fieldid, + }; + const requestOptions: RequestInit = { + credentials: 'include', + signal, + headers: { + 'X-Requested-With': 'XMLHttpRequest', + }, + }; + + if (!nodeId) { + const conditionResponse = await fetch( + `${buildingNatureBrowserConfig.conditionEndpoint}?${buildQuery(treeParams)}`, + requestOptions, + ); + if (!conditionResponse.ok) { + throw new Error(`建筑性质浏览条件加载失败:HTTP ${conditionResponse.status}`); + } + const conditionPayload = await conditionResponse.json() as { status?: boolean; msg?: string }; + if (conditionPayload.status === false) { + throw new Error(conditionPayload.msg || '建筑性质浏览条件加载失败'); + } + } + + const dataParams = nodeId + ? { + ...treeParams, + type: '2', + id: nodeId, + isVirtual: '', + } + : { + ...treeParams, + pageSize: '10', + current: '1', + min: '1', + max: '10', + }; + const dataResponse = await fetch( + `${buildingNatureBrowserConfig.dataEndpoint}?${buildQuery(dataParams)}`, + requestOptions, + ); + if (!dataResponse.ok) { + throw new Error(`建筑性质浏览数据加载失败:HTTP ${dataResponse.status}`); + } + const dataPayload = await dataResponse.json() as { status?: boolean; msg?: string }; + if (dataPayload.status === false) { + throw new Error(dataPayload.msg || '建筑性质浏览数据加载失败'); + } + return normalizeTreeRows(pickArray(dataPayload)); + }; + const normalizeBackendTree = (nodes: TreeNode[]): TreeNode[] => nodes.map((node) => ({ ...node, hasChildren: node.children.length > 0 || node.hasChildren, @@ -1342,7 +1436,7 @@ function App() { }; const fetchTemplateLibraryTree = async (signal?: AbortSignal) => { - const response = await fetch(`${API_BASE_URL}/zw/getBuildingFunctionCostFilterTree?${buildQuery({ key: 'templateLibrary' })}`, { + const response = await fetch(`${API_BASE_URL}${API_ROUTES.filterTree}?${buildQuery({ key: 'templateLibrary' })}`, { signal, headers: { 'X-Requested-With': 'XMLHttpRequest', @@ -1357,7 +1451,7 @@ function App() { }; const fetchIndicatorTree = async (signal?: AbortSignal) => { - const response = await fetch(`${API_BASE_URL}/zw/getBuildingFunctionCostFilterTree?${buildQuery({ key: 'indicatorTree', templateId: selectedTemplateId })}`, { + const response = await fetch(`${API_BASE_URL}${API_ROUTES.filterTree}?${buildQuery({ key: 'indicatorTree', templateId: selectedTemplateId })}`, { signal, headers: { 'X-Requested-With': 'XMLHttpRequest', @@ -1415,6 +1509,12 @@ function App() { }; const loadFilterTree = async (filterKey: FilterKey, keyword?: string, signal?: AbortSignal) => { + if (isBuildingNatureFilterKey(filterKey)) { + const nodes = filterTreeByKey.buildingNature.length > 0 + ? filterTreeByKey.buildingNature + : await fetchBuildingNatureFilterTree(undefined, signal); + return keyword?.trim() ? filterTreeNodesByKeyword(nodes, keyword) : nodes; + } if (filterKey === 'region') { const nodes = await fetchRegionFilterTree(signal); return keyword?.trim() ? filterTreeNodesByKeyword(nodes, keyword) : nodes; @@ -1621,7 +1721,7 @@ function App() { return; } - if (isTemplateFilterKey(filterKey) || filterKey === 'indicatorTree') { + if (isTemplateFilterKey(filterKey) || filterKey === 'indicatorTree' || isBuildingNatureFilterKey(filterKey)) { filterSearchTimerRef.current = window.setTimeout(() => { setFilterSearchLoadingByKey((current) => ({ ...current, [filterKey]: true })); setFilterSearchErrorByKey((current) => ({ ...current, [filterKey]: null })); @@ -1678,10 +1778,13 @@ function App() { })), })); - if (node.loaded || !isContentFilterKey(filterModalKey)) return; + if (node.loaded || (!isContentFilterKey(filterModalKey) && !isBuildingNatureFilterKey(filterModalKey))) return; const currentFilterKey = filterModalKey; - fetchContentTree(currentFilterKey, nodeId) + const childRequest = isBuildingNatureFilterKey(currentFilterKey) + ? fetchBuildingNatureFilterTree(nodeId) + : fetchContentTree(currentFilterKey, nodeId); + childRequest .then((children) => { setFilterTreeByKey((current) => ({ ...current, @@ -1921,6 +2024,11 @@ function App() { async function loadStats() { if (selectedContentNodes.length === 0) { setChartDataBySelection({}); + setChartSummaryBySelection({}); + setLoading(false); + setLoadingHint(''); + setLoadError(null); + return; } setLoading(true); @@ -1957,21 +2065,17 @@ function App() { } const payload = (await response.json()) as { data?: ApiBuildingFunctionStatBatchItem[] }; const results = (payload.data ?? []) - .filter((item) => item.key) + .filter((item) => item.key && item.key !== overallSummaryKey) .map((item) => [item.key as string, (item.data ?? []).map(normalizeStat).slice(0, 36)] as const); const summaries = (payload.data ?? []) .filter((item) => item.key && item.summary) .map((item) => [item.key as string, normalizeStat(item.summary as ApiBuildingFunctionStat)] as const); - const overallSummary = (payload.data ?? []).find((item) => item.summary)?.summary; - setChartDataBySelection((current) => ({ - ...current, - ...Object.fromEntries(results), - })); - setChartSummaryBySelection((current) => ({ - ...current, + const overallSummary = (payload.data ?? []).find((item) => item.key === overallSummaryKey)?.summary; + setChartDataBySelection(Object.fromEntries(results)); + setChartSummaryBySelection({ ...Object.fromEntries(summaries), ...(overallSummary ? { [overallSummaryKey]: normalizeStat(overallSummary) } : {}), - })); + }); } catch (error) { if (controller.signal.aborted) return; setLoadError(error instanceof Error ? error.message : '接口请求失败'); @@ -2472,6 +2576,7 @@ function App() { geoLocation: [], facilityType: [], buildingFunction: [], + buildingNature: [], constructionStage: [], planningForm: [], time: [],