Compare commits

..

12 Commits

Author SHA1 Message Date
807e1e016b 1 2026-08-21 14:47:42 +08:00
1f315a40da 1 2026-08-18 16:51:42 +08:00
42a07e2bf8 1 2026-08-16 17:06:45 +08:00
3a82078bd2 1 2026-08-14 18:12:25 +08:00
92f2584232 1 2026-08-12 10:16:35 +08:00
559a296c3a 导表 2026-08-11 15:25:32 +08:00
d5799d8d99 1 2026-08-07 10:37:51 +08:00
178a3e656f '1' 2026-06-01 14:48:17 +08:00
cfb6afcdce '1' 2026-05-21 09:24:15 +08:00
58abe588aa 1 2026-05-13 16:23:55 +08:00
46325ee801 Merge remote-tracking branch 'origin/main' into building-facility-object 2026-05-13 10:25:08 +08:00
c65235f377 feat: switch to building facility object 2026-05-11 10:30:14 +08:00
61 changed files with 1063 additions and 1875 deletions

View File

@ -1,86 +0,0 @@
---
name: gitnexus-cli
description: "Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: \"Index this repo\", \"Reanalyze the codebase\", \"Generate a wiki\""
---
# GitNexus CLI Commands
Commands below use `node .gitnexus/run.cjs <command>` — the project-local runner `gitnexus analyze` drops next to the index. It auto-selects an available runner at call time (global `gitnexus`, else `pnpm dlx`, else `npx`), so no package-manager assumption and no global install is required.
> **Not analyzed yet, or `node .gitnexus/run.cjs` reports `Cannot find module`** (the gitignored runner is absent — e.g. a fresh clone or `git clean`)? (Re)generate it with `npx gitnexus analyze` from the project root. On **npm 11.x**, if `npx` crashes during install (`node.target is null`), install once with `npm i -g gitnexus` (then `gitnexus analyze`) or use `pnpm --allow-build=@ladybugdb/core --allow-build=gitnexus --allow-build=tree-sitter dlx gitnexus@latest analyze`. See [#1939](https://github.com/abhigyanpatwari/GitNexus/issues/1939).
## Commands
### analyze — Build or refresh the index
```bash
node .gitnexus/run.cjs analyze
```
Run from the project root. This parses all source files, builds the knowledge graph, writes it to `.gitnexus/`, and generates CLAUDE.md / AGENTS.md context files.
| Flag | Effect |
| -------------- | ---------------------------------------------------------------- |
| `--force` | Force full re-index even if up to date |
| `--embeddings` | Enable embedding generation for semantic search (off by default) |
| `--drop-embeddings` | Drop existing embeddings on rebuild. By default, an `analyze` without `--embeddings` preserves them. |
| `--pdg` | Build the program-dependence layers used by `explain` and `pdg_query` (taint, CDG, and REACHING_DEF). |
**When to run:** First time in a project, after major code changes, or when `gitnexus://repo/{name}/context` reports the index is stale. In Claude Code, a PostToolUse hook detects staleness after `git commit` and `git merge` and notifies the agent to run `analyze` — the hook does not run analyze itself, to avoid blocking the agent for up to 120s and risking KuzuDB corruption on timeout.
### status — Check index freshness
```bash
node .gitnexus/run.cjs status
```
Shows whether the current repo has a GitNexus index, when it was last updated, and symbol/relationship counts. Use this to check if re-indexing is needed.
### clean — Delete the index
```bash
node .gitnexus/run.cjs clean
```
Deletes the `.gitnexus/` directory and unregisters the repo from the global registry. Use before re-indexing if the index is corrupt or after removing GitNexus from a project.
| Flag | Effect |
| --------- | ------------------------------------------------- |
| `--force` | Skip confirmation prompt |
| `--all` | Clean all indexed repos, not just the current one |
### wiki — Generate documentation from the graph
```bash
node .gitnexus/run.cjs wiki
```
Generates repository documentation from the knowledge graph using an LLM. Requires an API key (saved to `~/.gitnexus/config.json` on first use).
| Flag | Effect |
| ------------------- | ----------------------------------------- |
| `--force` | Force full regeneration |
| `--model <model>` | LLM model (default: minimax/minimax-m2.5) |
| `--base-url <url>` | LLM API base URL |
| `--api-key <key>` | LLM API key |
| `--concurrency <n>` | Parallel LLM calls (default: 3) |
| `--gist` | Publish wiki as a public GitHub Gist |
### list — Show all indexed repos
```bash
node .gitnexus/run.cjs list
```
Lists all repositories registered in `~/.gitnexus/registry.json`. The MCP `list_repos` tool provides the same information.
## After Indexing
1. **Read `gitnexus://repo/{name}/context`** to verify the index loaded
2. Use the other GitNexus skills (`exploring`, `debugging`, `impact-analysis`, `refactoring`) for your task
## Troubleshooting
- **"Not inside a git repository"**: Run from a directory inside a git repo
- **Index is stale after re-analyzing**: Restart Claude Code to reload the MCP server
- **Embeddings slow**: Omit `--embeddings` (it's off by default) or set `OPENAI_API_KEY` for faster API-based embedding

View File

@ -1,101 +0,0 @@
---
name: gitnexus-debugging
description: "Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: \"Why is X failing?\", \"Where does this error come from?\", \"Trace this bug\""
---
# Debugging with GitNexus
## When to Use
- "Why is this function failing?"
- "Trace where this error comes from"
- "Who calls this method?"
- "This endpoint returns 500"
- Investigating bugs, errors, or unexpected behavior
## Workflow
```
1. query({search_query: "<error or symptom>"}) → Find related execution flows
2. context({name: "<suspect>"}) → See callers/callees/processes
3. READ gitnexus://repo/{name}/process/{name} → Trace execution flow
4. cypher({statement: "MATCH path..."}) → Custom traces if needed
```
> If "Index is stale" → run `node .gitnexus/run.cjs analyze` in terminal.
## Checklist
```
- [ ] Understand the symptom (error message, unexpected behavior)
- [ ] query for error text or related code
- [ ] Identify the suspect function from returned processes
- [ ] context to see callers and callees
- [ ] Trace execution flow via process resource if applicable
- [ ] cypher for custom call chain traces if needed
- [ ] Read source files to confirm root cause
```
## Debugging Patterns
| Symptom | GitNexus Approach |
| -------------------- | ---------------------------------------------------------- |
| Error message | `query` for error text → `context` on throw sites |
| Wrong return value | `context` on the function → trace callees for data flow |
| Intermittent failure | `context` → look for external calls, async deps |
| Performance issue | `context` → find symbols with many callers (hot paths) |
| Recent regression | `detect_changes` to see what your changes affect |
| "How does A reach B?" | `trace` between the two symbols — shortest call chain in one call |
## Tools
**query** — find code related to error:
```
query({search_query: "payment validation error"})
→ Processes: CheckoutFlow, ErrorHandling
→ Symbols: validatePayment, handlePaymentError, PaymentException
```
**context** — full context for a suspect:
```
context({name: "validatePayment"})
→ Incoming calls: processCheckout, webhookHandler
→ Outgoing calls: verifyCard, fetchRates (external API!)
→ Processes: CheckoutFlow (step 3/7)
```
**cypher** — custom call chain traces:
```cypher
MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "validatePayment"})
RETURN [n IN nodes(path) | n.name] AS chain
```
**trace** — shortest call chain between two symbols ("how does A reach B?"), one call instead of chaining `context` hops:
```
trace({ from: "processCheckout", to: "fetchRates" })
→ status: ok, hopCount: 3
→ hops: processCheckout → validatePayment → verifyCard → fetchRates
→ edges: CALLS (1.0), CALLS (0.95), CALLS (1.0)
```
When no path exists, `trace` reports the furthest reachable node — exactly where the chain breaks (dynamic dispatch, reflection, or an external boundary).
## Example: "Payment endpoint returns 500 intermittently"
```
1. query({search_query: "payment error handling"})
→ Processes: CheckoutFlow, ErrorHandling
→ Symbols: validatePayment, handlePaymentError
2. context({name: "validatePayment"})
→ Outgoing calls: verifyCard, fetchRates (external API!)
3. READ gitnexus://repo/my-app/process/CheckoutFlow
→ Step 3: validatePayment → calls fetchRates (external)
4. Root cause: fetchRates calls external API without proper timeout
```

View File

@ -1,78 +0,0 @@
---
name: gitnexus-exploring
description: "Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: \"How does X work?\", \"What calls this function?\", \"Show me the auth flow\""
---
# Exploring Codebases with GitNexus
## When to Use
- "How does authentication work?"
- "What's the project structure?"
- "Show me the main components"
- "Where is the database logic?"
- Understanding code you haven't seen before
## Workflow
```
1. READ gitnexus://repos → Discover indexed repos
2. READ gitnexus://repo/{name}/context → Codebase overview, check staleness
3. query({search_query: "<what you want to understand>"}) → Find related execution flows
4. context({name: "<symbol>"}) → Deep dive on specific symbol
5. READ gitnexus://repo/{name}/process/{name} → Trace full execution flow
```
> If step 2 says "Index is stale" → run `node .gitnexus/run.cjs analyze` in terminal.
## Checklist
```
- [ ] READ gitnexus://repo/{name}/context
- [ ] query for the concept you want to understand
- [ ] Review returned processes (execution flows)
- [ ] context on key symbols for callers/callees
- [ ] READ process resource for full execution traces
- [ ] Read source files for implementation details
```
## Resources
| Resource | What you get |
| --------------------------------------- | ------------------------------------------------------- |
| `gitnexus://repo/{name}/context` | Stats, staleness warning (~150 tokens) |
| `gitnexus://repo/{name}/clusters` | All functional areas with cohesion scores (~300 tokens) |
| `gitnexus://repo/{name}/cluster/{name}` | Area members with file paths (~500 tokens) |
| `gitnexus://repo/{name}/process/{name}` | Step-by-step execution trace (~200 tokens) |
## Tools
**query** — find execution flows related to a concept:
```
query({search_query: "payment processing"})
→ Processes: CheckoutFlow, RefundFlow, WebhookHandler
→ Symbols grouped by flow with file locations
```
**context** — 360-degree view of a symbol:
```
context({name: "validateUser"})
→ Incoming calls: loginHandler, apiMiddleware
→ Outgoing calls: checkToken, getUserById
→ Processes: LoginFlow (step 2/5), TokenRefresh (step 1/3)
```
## Example: "How does payment processing work?"
```
1. READ gitnexus://repo/my-app/context → 918 symbols, 45 processes
2. query({search_query: "payment processing"})
→ CheckoutFlow: processPayment → validateCard → chargeStripe
→ RefundFlow: initiateRefund → calculateRefund → processRefund
3. context({name: "processPayment"})
→ Incoming: checkoutHandler, webhookHandler
→ Outgoing: validateCard, chargeStripe, saveTransaction
4. Read src/payments/processor.ts for implementation details
```

View File

@ -1,138 +0,0 @@
---
name: gitnexus-guide
description: "Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: \"What GitNexus tools are available?\", \"How do I use GitNexus?\""
---
# GitNexus Guide
Quick reference for all GitNexus MCP tools, resources, and the knowledge graph schema.
## Always Start Here
For any task involving code understanding, debugging, impact analysis, or refactoring:
1. **Read `gitnexus://repo/{name}/context`** — codebase overview + check index freshness
2. **Match your task to a skill below** and **read that skill file**
3. **Follow the skill's workflow and checklist**
> If step 1 warns the index is stale, run `node .gitnexus/run.cjs analyze` in the terminal first.
## Skills
| Task | Skill to read |
| -------------------------------------------- | ------------------- |
| Understand architecture / "How does X work?" | `gitnexus-exploring` |
| Blast radius / "What breaks if I change X?" | `gitnexus-impact-analysis` |
| Trace bugs / "Why is X failing?" | `gitnexus-debugging` |
| Rename / extract / split / refactor | `gitnexus-refactoring` |
| Tools, resources, schema reference | `gitnexus-guide` (this file) |
| Index, status, clean, wiki CLI commands | `gitnexus-cli` |
## Tools Reference
| Tool | What it gives you |
| ---------------- | ------------------------------------------------------------------------ |
| `query` | Process-grouped code intelligence — execution flows related to a concept |
| `context` | 360-degree symbol view — categorized refs, processes it participates in |
| `impact` | Symbol blast radius — what breaks at depth 1/2/3 with confidence |
| `trace` | Shortest path between two symbols — "how does A reach B?" in one call |
| `detect_changes` | Git-diff impact — what do your current changes affect |
| `rename` | Multi-file coordinated rename with confidence-tagged edits |
| `cypher` | Raw graph queries (read `gitnexus://repo/{name}/schema` first) |
| `explain` | Persisted taint findings — source→sink data flows (needs `analyze --pdg`) |
| `pdg_query` | Control/data dependence — what gates X (CDG) / where Y flows (REACHING_DEF); needs `analyze --pdg` |
| `check` | Check graph invariants such as circular imports |
| `route_map` | API route map — which components/hooks fetch which endpoints, and the handler files that serve them |
| `shape_check` | Response-shape drift — keys each route returns vs keys its consumers access (flags MISMATCH) |
| `api_impact` | Pre-change report for an API route — consumers, middleware, shape mismatches, risk level |
| `tool_map` | MCP/RPC tool definitions and the files that handle them |
| `group_list` | List configured multi-repo groups, or one group's config |
| `group_sync` | Rebuild a group's Contract Registry (cross-repo HTTP contract links); run after `group.yaml` changes or member re-index |
| `list_repos` | Discover indexed repos (paginated — `limit`/`offset`) |
### Paginating `list_repos`
`list_repos` is paginated so a large registry is not truncated by MCP/LLM token limits. It takes optional `limit` (default **50**, max **200**) and `offset`, and returns:
```jsonc
{
"repositories": [
{ "name": "...", "path": "...", "indexedAt": "...", "lastCommit": "...", "stats": { } }
],
"pagination": {
"total": 437,
"limit": 50,
"offset": 0,
"returned": 50,
"hasMore": true,
"nextOffset": 50
}
}
```
To enumerate **every** repository, keep calling with `offset` set to `pagination.nextOffset` until `hasMore` is `false`:
```text
list_repos {} → repos 150, nextOffset 50, hasMore true
list_repos { offset: 50 } → repos 51100, nextOffset 100, hasMore true
list_repos { offset: 400 } → repos 401437, hasMore false (done)
```
Notes: `offset``total` returns an empty page (with `total` still reported). Out-of-range or malformed `limit`/`offset` (non-integer, `limit` outside `[1, 200]`, `offset < 0`) are rejected with a clear error — `limit` above the max is rejected, not silently capped. The order is deterministic (lower-cased name, then path), so paging never skips or duplicates an entry while the registry is unchanged.
### Taint findings (`explain`)
`explain` returns taint findings recorded by `gitnexus analyze --pdg` — intra-procedural `TAINTED` edges plus cross-function `TAINT_PATH` hops where the interprocedural taint phase found a function-level source→sink chain. Each finding includes a sink category (command-injection, code-injection, path-traversal, sql-injection, xss), source/sink lines, and the ordered hop path with the variable carried on each hop.
- `explain {}` — enumerate all findings for the repo (bounded by `limit`, deterministic order)
- `explain { target: "src/vuln.ts" }` — findings in a file (suffix path match accepted)
- `explain { target: "runUserCommand" }` — findings in a function (resolved like `context`; ambiguous names return ranked candidates)
A repo indexed without `--pdg` returns a clear "no taint layer" note. Caveats: closure/callback, property/field, and implicit flows are not modeled, and interprocedural findings are function-level `TAINT_PATH` hops rather than statement-level path proof, so the absence of a finding is **not** proof of safety. `SANITIZES` (sanitizer-kill) edges are queryable via `cypher`.
### Control & data dependence (`pdg_query`)
`pdg_query` reads the control/data-dependence layers `gitnexus analyze --pdg` records (CDG + REACHING_DEF, basic-block granular) — the control/data analog of `explain`. It is **always anchored** (a `target` file path or symbol, resolved like `context`) and has two modes:
- `pdg_query { mode: "controls", target: "..." }` — CDG: "under what condition does X run?". Each edge is a controlling predicate block → dependent block with the branch sense (`'T'`/`'F'`) in `reason`; an edge into an early `return`/`throw` is flagged `guard: true` (guard-clause discovery — the sense depends on the predicate, so don't filter guards by a fixed label).
- `pdg_query { mode: "flows", target: "...", variable?: "..." }` — REACHING_DEF def→use edges within the function; pass `variable` to trace one binding.
A repo indexed without `--pdg` returns a "no PDG layer" note (or "status unknown" when the layer can't be confirmed). Intra-procedural only — cross-function flow is taint's domain (`explain`). The raw CDG/REACHING_DEF edges are also queryable via `cypher`. See the `gitnexus-pdg-query` skill for the full query surface.
### Shortest path between two symbols (`trace`)
`trace` answers "how does A reach B?" in one call — the shortest directed path over `CALLS` (plus `HAS_METHOD`, so a class-rooted trace descends into its methods) instead of chaining 38 `context`/`impact` hops by hand.
- `trace { from: "validateUser", to: "executeQuery" }` — shortest path between two symbols.
- Disambiguate common names with `from_uid`/`to_uid` (zero-ambiguity) or `from_file`/`to_file`; an ambiguous name returns ranked candidates.
- `maxDepth` (default 10, max 30) bounds the search; `includeTests` (default false) lets the traversal pass through test-file symbols.
Returns ordered `hops` (each `{ name, filePath, startLine }`) and an aligned `edges[]` of `{ relType, confidence }`, so call hops and containment (`HAS_METHOD`) hops stay distinguishable. When no path exists it reports the **furthest** reachable node (where the chain breaks) and sets `truncated: true` if a traversal cap was hit first. Every result carries a `status`: `ok` / `no_path` / `ambiguous` / `not_found` / `error`.
Cross-repo (experimental): pass `repo: "@groupName"` to trace across a group's member repos — the path may cross **one** `ContractLink` boundary (reported as a `CONTRACT_LINK` hop with the bridged contract in `crossings[]`). Omit `to` entirely to follow `from`'s outgoing HTTP call to whatever provider endpoint it lands on. Groups are configured via `group_list` / `group_sync`.
## Resources Reference
Lightweight reads (~100-500 tokens) for navigation:
| Resource | Content |
| ---------------------------------------------- | ----------------------------------------- |
| `gitnexus://repo/{name}/context` | Stats, staleness check |
| `gitnexus://repo/{name}/clusters` | All functional areas with cohesion scores |
| `gitnexus://repo/{name}/cluster/{clusterName}` | Area members |
| `gitnexus://repo/{name}/processes` | All execution flows |
| `gitnexus://repo/{name}/process/{processName}` | Step-by-step trace |
| `gitnexus://repo/{name}/schema` | Graph schema for Cypher |
## Graph Schema
**Nodes:** File, Folder, Function, Class, Interface, Method, CodeElement, Community, Process, Route, Tool, plus language-specific types (Struct, Enum, Trait, Impl, Namespace, Module, …) and BasicBlock (`--pdg` indexes only). The full node list lives in `gitnexus://repo/{name}/schema`.
**Edges (via CodeRelation.type):** CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, CONTAINS, MEMBER_OF, HAS_METHOD, HAS_PROPERTY, ACCESSES, METHOD_OVERRIDES, METHOD_IMPLEMENTS, STEP_IN_PROCESS, HANDLES_ROUTE, FETCHES, HANDLES_TOOL, ENTRY_POINT_OF, WRAPS, QUERIES, INJECTS, plus `--pdg`-only types (CFG, REACHING_DEF, TAINTED, SANITIZES, TAINT_PATH, CDG — zero rows on a default index).
Read `gitnexus://repo/{name}/schema` before writing Cypher — it is the authoritative schema for the indexed repo.
```cypher
MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunc"})
RETURN caller.name, caller.filePath
```

View File

@ -1,97 +0,0 @@
---
name: gitnexus-impact-analysis
description: "Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: \"Is it safe to change X?\", \"What depends on this?\", \"What will break?\""
---
# Impact Analysis with GitNexus
## When to Use
- "Is it safe to change this function?"
- "What will break if I modify X?"
- "Show me the blast radius"
- "Who uses this code?"
- Before making non-trivial code changes
- Before committing — to understand what your changes affect
## Workflow
```
1. impact({target: "X", direction: "upstream"}) → What depends on this
2. READ gitnexus://repo/{name}/processes → Check affected execution flows
3. detect_changes() → Map current git changes to affected flows
4. Assess risk and report to user
```
> If "Index is stale" → run `node .gitnexus/run.cjs analyze` in terminal.
## Checklist
```
- [ ] impact({target, direction: "upstream"}) to find dependents
- [ ] Review d=1 items first (these WILL BREAK)
- [ ] Check high-confidence (>0.8) dependencies
- [ ] READ processes to check affected execution flows
- [ ] detect_changes() for pre-commit check
- [ ] Assess risk level and report to user
```
## Understanding Output
| Depth | Risk Level | Meaning |
| ----- | ---------------- | ------------------------ |
| d=1 | **WILL BREAK** | Direct callers/importers |
| d=2 | LIKELY AFFECTED | Indirect dependencies |
| d=3 | MAY NEED TESTING | Transitive effects |
## Risk Assessment
| Affected | Risk |
| ------------------------------ | -------- |
| <5 symbols, few processes | LOW |
| 5-15 symbols, 2-5 processes | MEDIUM |
| >15 symbols or many processes | HIGH |
| Critical path (auth, payments) | CRITICAL |
## Tools
**impact** — the primary tool for symbol blast radius:
```
impact({
target: "validateUser",
direction: "upstream",
minConfidence: 0.8,
maxDepth: 3
})
→ d=1 (WILL BREAK):
- loginHandler (src/auth/login.ts:42) [CALLS, 100%]
- apiMiddleware (src/api/middleware.ts:15) [CALLS, 100%]
→ d=2 (LIKELY AFFECTED):
- authRouter (src/routes/auth.ts:22) [CALLS, 95%]
```
**detect_changes** — git-diff based impact analysis:
```
detect_changes({scope: "staged"})
→ Changed: 5 symbols in 3 files
→ Affected: LoginFlow, TokenRefresh, APIMiddlewarePipeline
→ Risk: MEDIUM
```
## Example: "What breaks if I change validateUser?"
```
1. impact({target: "validateUser", direction: "upstream"})
→ d=1: loginHandler, apiMiddleware (WILL BREAK)
→ d=2: authRouter, sessionManager (LIKELY AFFECTED)
2. READ gitnexus://repo/my-app/processes
→ LoginFlow and TokenRefresh touch validateUser
3. Risk: 2 direct callers, 2 processes = MEDIUM
```

View File

@ -1,121 +0,0 @@
---
name: gitnexus-refactoring
description: "Use when the user wants to rename, extract, split, move, or restructure code safely. Examples: \"Rename this function\", \"Extract this into a module\", \"Refactor this class\", \"Move this to a separate file\""
---
# Refactoring with GitNexus
## When to Use
- "Rename this function safely"
- "Extract this into a module"
- "Split this service"
- "Move this to a new file"
- Any task involving renaming, extracting, splitting, or restructuring code
## Workflow
```
1. impact({target: "X", direction: "upstream"}) → Map all dependents
2. query({search_query: "X"}) → Find execution flows involving X
3. context({name: "X"}) → See all incoming/outgoing refs
4. Plan update order: interfaces → implementations → callers → tests
```
> If "Index is stale" → run `node .gitnexus/run.cjs analyze` in terminal.
## Checklists
### Rename Symbol
```
- [ ] rename({symbol_name: "oldName", new_name: "newName", dry_run: true}) — preview all edits
- [ ] Review graph edits (high confidence) and text_search edits (review carefully)
- [ ] If satisfied: rename({..., dry_run: false}) — apply edits
- [ ] detect_changes() — verify only expected files changed
- [ ] Run tests for affected processes
```
### Extract Module
```
- [ ] context({name: target}) — see all incoming/outgoing refs
- [ ] impact({target, direction: "upstream"}) — find all external callers
- [ ] Define new module interface
- [ ] Extract code, update imports
- [ ] detect_changes() — verify affected scope
- [ ] Run tests for affected processes
```
### Split Function/Service
```
- [ ] context({name: target}) — understand all callees
- [ ] Group callees by responsibility
- [ ] impact({target, direction: "upstream"}) — map callers to update
- [ ] Create new functions/services
- [ ] Update callers
- [ ] detect_changes() — verify affected scope
- [ ] Run tests for affected processes
```
## Tools
**rename** — automated multi-file rename:
```
rename({symbol_name: "validateUser", new_name: "authenticateUser", dry_run: true})
→ 12 edits across 8 files
→ 10 graph edits (high confidence), 2 text_search edits (review)
→ Changes: [{file_path, edits: [{line, old_text, new_text, confidence}]}]
```
**impact** — map all dependents first:
```
impact({target: "validateUser", direction: "upstream"})
→ d=1: loginHandler, apiMiddleware, testUtils
→ Affected Processes: LoginFlow, TokenRefresh
```
**detect_changes** — verify your changes after refactoring:
```
detect_changes({scope: "all"})
→ Changed: 8 files, 12 symbols
→ Affected processes: LoginFlow, TokenRefresh
→ Risk: MEDIUM
```
**cypher** — custom reference queries:
```cypher
MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validateUser"})
RETURN caller.name, caller.filePath ORDER BY caller.filePath
```
## Risk Rules
| Risk Factor | Mitigation |
| ------------------- | ----------------------------------------- |
| Many callers (>5) | Use rename for automated updates |
| Cross-area refs | Use detect_changes after to verify scope |
| String/dynamic refs | query to find them |
| External/public API | Version and deprecate properly |
## Example: Rename `validateUser` to `authenticateUser`
```
1. rename({symbol_name: "validateUser", new_name: "authenticateUser", dry_run: true})
→ 12 edits: 10 graph (safe), 2 text_search (review)
→ Files: validator.ts, login.ts, middleware.ts, config.json...
2. Review text_search edits (config.json: dynamic reference!)
3. rename({symbol_name: "validateUser", new_name: "authenticateUser", dry_run: false})
→ Applied 12 edits across 8 files
4. detect_changes({scope: "all"})
→ Affected: LoginFlow, TokenRefresh
→ Risk: MEDIUM — run tests for these flows
```

Binary file not shown.

BIN
.gitnexus/lbug.wal Normal file

Binary file not shown.

View File

@ -1 +0,0 @@
[ 158ms] [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

View File

@ -1 +0,0 @@
[ 337ms] [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

View File

@ -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

View File

@ -1 +1 @@
[ 159ms] [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 [ 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

View File

@ -1,70 +0,0 @@
- 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=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]: 正在加载数据
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- generic [ref=e79]: 正在加载数据
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: 加载中

View File

@ -1,80 +0,0 @@
- 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 "建筑性质" [active] [ref=e23] [cursor=pointer]
- button "建设阶段" [ref=e28] [cursor=pointer]
- button "规划形式" [ref=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- dialog "建筑性质筛选" [ref=e94]:
- generic [ref=e95]:
- heading "建筑性质" [level=2] [ref=e96]
- button "关闭" [ref=e97] [cursor=pointer]: ×
- searchbox "搜索" [ref=e99]
- generic [ref=e100]: 未选择
- generic [ref=e101]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e103]:
- button "清空当前" [ref=e104] [cursor=pointer]
- button "取消" [ref=e105] [cursor=pointer]
- button "确认" [ref=e106] [cursor=pointer]

View File

@ -1,69 +0,0 @@
- 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=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"

View File

@ -1,86 +0,0 @@
- 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 "建筑性质" [active] [ref=e23] [cursor=pointer]
- button "建设阶段" [ref=e28] [cursor=pointer]
- button "规划形式" [ref=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- dialog "建筑性质筛选" [ref=e108]:
- generic [ref=e109]:
- heading "建筑性质" [level=2] [ref=e110]
- button "关闭" [ref=e111] [cursor=pointer]: ×
- searchbox "搜索" [ref=e113]
- generic [ref=e114]: 未选择
- tree [ref=e116]:
- treeitem [ref=e117]:
- button "公共建筑" [ref=e120] [cursor=pointer]
- treeitem [ref=e123]:
- button "民用建筑" [ref=e126] [cursor=pointer]
- treeitem [ref=e129]:
- button "工业建筑" [ref=e132] [cursor=pointer]
- generic [ref=e135]:
- button "清空当前" [ref=e136] [cursor=pointer]
- button "取消" [ref=e137] [cursor=pointer]
- button "确认" [ref=e138] [cursor=pointer]

View File

@ -1,82 +0,0 @@
- 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=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- dialog "建筑性质筛选" [ref=e108]:
- generic [ref=e109]:
- heading "建筑性质" [level=2] [ref=e110]
- button "关闭" [ref=e111] [cursor=pointer]: ×
- searchbox "搜索" [ref=e113]: 公共
- generic [ref=e114]: 已选 1 项
- tree [ref=e139]:
- treeitem [ref=e140]:
- button "公共建筑" [active] [pressed] [ref=e143] [cursor=pointer]
- generic [ref=e135]:
- button "清空当前" [ref=e136] [cursor=pointer]
- button "取消" [ref=e137] [cursor=pointer]
- button "确认" [ref=e138] [cursor=pointer]

View File

@ -1,72 +0,0 @@
- 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 "建筑性质 1" [pressed] [ref=e146] [cursor=pointer]:
- generic [ref=e27]: 建筑性质
- strong [ref=e147]: "1"
- button "建设阶段" [ref=e28] [cursor=pointer]
- button "规划形式" [ref=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- button "清空" [ref=e148] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e149]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"

View File

@ -1,89 +0,0 @@
- 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 "建筑性质 1" [active] [pressed] [ref=e146] [cursor=pointer]:
- generic [ref=e27]: 建筑性质
- strong [ref=e147]: "1"
- button "建设阶段" [ref=e28] [cursor=pointer]
- button "规划形式" [ref=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- button "清空" [ref=e148] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e149]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: "Expected property name or '}' in JSON at position 1 (line 1 column 2)"
- dialog "建筑性质筛选" [ref=e150]:
- generic [ref=e151]:
- heading "建筑性质" [level=2] [ref=e152]
- button "关闭" [ref=e153] [cursor=pointer]: ×
- searchbox "搜索" [ref=e155]
- generic [ref=e156]: 已选 1 项
- tree [ref=e158]:
- treeitem [ref=e159]:
- button "公共建筑" [pressed] [ref=e162] [cursor=pointer]
- treeitem [ref=e165]:
- button "民用建筑" [ref=e168] [cursor=pointer]
- treeitem [ref=e171]:
- button "工业建筑" [ref=e174] [cursor=pointer]
- generic [ref=e177]:
- button "清空当前" [ref=e178] [cursor=pointer]
- button "取消" [ref=e179] [cursor=pointer]
- button "确认" [ref=e180] [cursor=pointer]

View File

@ -1,70 +0,0 @@
- 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=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]: 正在加载数据
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- generic [ref=e79]: 正在加载数据
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: 加载中

View File

@ -1,85 +0,0 @@
- 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 "建筑性质" [active] [ref=e23] [cursor=pointer]
- button "建设阶段" [ref=e28] [cursor=pointer]
- button "规划形式" [ref=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e59]:
- figure "图表共有0个系列":
- generic [ref=e60]:
- img "interactive chart"
- region [ref=e61]
- toolbar "标注" [ref=e62]:
- button "库" [ref=e63] [cursor=pointer]
- button "指" [ref=e64] [cursor=pointer]
- button "均" [ref=e65] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e66]
- button "Text Tool" [disabled] [ref=e67]
- button "Shape Tool" [disabled] [ref=e68]
- button "Fibonacci Tool" [disabled] [ref=e69]
- button "全屏(F11)" [ref=e70] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e71]
- button "切换到表格" [ref=e72] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e73]:
- button "缩小" [disabled] [ref=e74]
- button "放大" [ref=e75] [cursor=pointer]
- button "左移" [disabled] [ref=e76]
- button "右移" [disabled] [ref=e77]
- button "重置" [disabled] [ref=e78]
- button "收起选择区" [expanded] [ref=e81] [cursor=pointer]
- complementary "选择内容" [ref=e85]:
- tablist "选择内容切换项" [ref=e86]:
- tab "自然地理区位" [selected] [ref=e87] [cursor=pointer]
- tab "设施类别" [ref=e88] [cursor=pointer]
- tab "建设阶段" [ref=e89] [cursor=pointer]
- tab "规划形式" [ref=e90] [cursor=pointer]
- generic [ref=e91]:
- generic [ref=e92]: 自然地理区位
- generic [ref=e93]: 接口待接入
- dialog "建筑性质筛选" [ref=e94]:
- generic [ref=e95]:
- heading "建筑性质" [level=2] [ref=e96]
- button "关闭" [ref=e97] [cursor=pointer]: ×
- searchbox "搜索" [ref=e99]
- generic [ref=e100]: 未选择
- tree [ref=e102]:
- treeitem [ref=e103]:
- button "公共建筑" [ref=e106] [cursor=pointer]
- treeitem [ref=e109]:
- button "民用建筑" [ref=e112] [cursor=pointer]
- treeitem [ref=e115]:
- button "工业建筑" [ref=e118] [cursor=pointer]
- generic [ref=e121]:
- button "清空当前" [ref=e122] [cursor=pointer]
- button "取消" [ref=e123] [cursor=pointer]
- button "确认" [ref=e124] [cursor=pointer]

View File

@ -1,68 +0,0 @@
- 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=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- button "纵坐标:造价(元)" [ref=e57] [cursor=pointer]: 造价(元)
- generic [ref=e58]:
- figure "图表共有0个系列":
- generic [ref=e59]:
- img "interactive chart"
- region [ref=e60]
- toolbar "标注" [ref=e61]:
- button "库" [ref=e62] [cursor=pointer]
- button "指" [ref=e63] [cursor=pointer]
- button "均" [ref=e64] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e65]
- button "Text Tool" [disabled] [ref=e66]
- button "Shape Tool" [disabled] [ref=e67]
- button "Fibonacci Tool" [disabled] [ref=e68]
- button "全屏(F11)" [ref=e69] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e70]
- button "切换到表格" [ref=e71] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e72]:
- button "缩小" [disabled] [ref=e73]
- button "放大" [ref=e74] [cursor=pointer]
- button "左移" [disabled] [ref=e75]
- button "右移" [disabled] [ref=e76]
- button "重置" [disabled] [ref=e77]
- button "收起选择区" [expanded] [ref=e78] [cursor=pointer]
- complementary "选择内容" [ref=e82]:
- tablist "选择内容切换项" [ref=e83]:
- tab "自然地理区位" [selected] [ref=e84] [cursor=pointer]
- tab "设施类别" [ref=e85] [cursor=pointer]
- tab "建设阶段" [ref=e86] [cursor=pointer]
- tab "规划形式" [ref=e87] [cursor=pointer]
- generic [ref=e88]:
- generic [ref=e89]: 自然地理区位
- generic [ref=e90]: 加载中

View File

@ -1,116 +0,0 @@
- 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=e35] [cursor=pointer]
- button "时间" [ref=e42] [cursor=pointer]
- button "面积" [ref=e46] [cursor=pointer]
- region "年度总费用图表" [ref=e54]:
- generic [ref=e55]:
- generic [ref=e58]:
- figure "图表共有0个系列":
- generic [ref=e59]:
- img "interactive chart"
- region [ref=e60]
- toolbar "标注" [ref=e61]:
- button "库" [ref=e62] [cursor=pointer]
- button "指" [ref=e63] [cursor=pointer]
- button "均" [ref=e64] [cursor=pointer]
- button "Line Tool" [disabled] [ref=e65]
- button "Text Tool" [disabled] [ref=e66]
- button "Shape Tool" [disabled] [ref=e67]
- button "Fibonacci Tool" [disabled] [ref=e68]
- button "全屏(F11)" [ref=e69] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e70]
- button "切换到趋势图" [active] [pressed] [ref=e91] [cursor=pointer]:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e72]:
- button "缩小" [disabled] [ref=e73]
- button "放大" [ref=e74] [cursor=pointer]
- button "左移" [disabled] [ref=e75]
- button "右移" [disabled] [ref=e76]
- button "重置" [disabled] [ref=e77]
- generic [ref=e93]:
- button "模板库" [ref=e94] [cursor=pointer]: 库
- button "指标树形" [ref=e95] [cursor=pointer]: 指
- button "切换到趋势图" [ref=e96] [cursor=pointer]: 表
- button "全屏" [ref=e97] [cursor=pointer]
- button "纵坐标:造价(元)" [ref=e100] [cursor=pointer]: 价
- generic [ref=e101]:
- grid [ref=e103]:
- rowgroup [ref=e104]:
- row [ref=e105]:
- columnheader "基准阀值" [ref=e106]: 基准阀值  
- columnheader "样本统计值" [ref=e108]: 样本统计值  
- row [ref=e110]:
- columnheader "年度" [ref=e111]:
- generic [ref=e113] [cursor=pointer]:
- generic:      
- columnheader "名称" [ref=e115]:
- generic [ref=e117] [cursor=pointer]:
- generic:      
- columnheader "低值(万元)" [ref=e119]:
- generic [ref=e121] [cursor=pointer]:
- generic:      
- columnheader "中心值(万元)" [ref=e123]:
- generic [ref=e125] [cursor=pointer]:
- generic:      
- columnheader "高值(万元)" [ref=e127]:
- generic [ref=e129] [cursor=pointer]:
- generic:      
- columnheader "最大值(万元)" [ref=e131]:
- generic [ref=e133] [cursor=pointer]:
- generic:      
- columnheader "最小值(万元)" [ref=e135]:
- generic [ref=e137] [cursor=pointer]:
- generic:      
- columnheader "平均值(万元)" [ref=e139]:
- generic [ref=e141] [cursor=pointer]:
- generic:      
- columnheader "中位数(万元)" [ref=e143]:
- generic [ref=e145] [cursor=pointer]:
- generic:      
- columnheader "标准差(万元)" [ref=e147]:
- generic [ref=e149] [cursor=pointer]:
- generic:      
- rowgroup [ref=e151]
- rowgroup
- rowgroup
- rowgroup
- text: 请选择右侧分类项
- text:     
- button "收起选择区" [expanded] [ref=e78] [cursor=pointer]
- complementary "选择内容" [ref=e82]:
- tablist "选择内容切换项" [ref=e83]:
- tab "自然地理区位" [selected] [ref=e84] [cursor=pointer]
- tab "设施类别" [ref=e85] [cursor=pointer]
- tab "建设阶段" [ref=e86] [cursor=pointer]
- tab "规划形式" [ref=e87] [cursor=pointer]
- generic [ref=e88]:
- generic [ref=e89]: 自然地理区位
- generic [ref=e90]: 接口待接入

View File

@ -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]: 加载中

View File

@ -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]: 加载中

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]: 加载中

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -0,0 +1,3 @@
[ 6918ms] [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=ae174d51:20102
[ 7315ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://127.0.0.1:5173/favicon.ico:0
[ 331036ms] [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=ae174d51:20102

View File

@ -1 +1,6 @@
[ 550538ms] [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=ae174d51:20102 [ 300ms] [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=ae174d51:20102
[ 1230ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://127.0.0.1:5173/favicon.ico:0
[ 40506ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=templateLibrary&currenttime=1778660578349&__random__=1778660578349:0
[ 40812ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=indicatorTree&templateId=3&currenttime=1778660578682&__random__=1778660578682:0
[ 52231ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=templateLibrary&currenttime=1778660590101&__random__=1778660590101:0
[ 53824ms] [ERROR] Failed to load resource: the server responded with a status of 401 () @ https://nest.zwgczx.com/api/v1/zw/getBuildingFunctionCostFilterTree?key=indicatorTree&templateId=3&currenttime=1778660591693&__random__=1778660591693:0

View File

@ -1,2 +0,0 @@
[ 136ms] [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=ae174d51:20102
[ 595ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://127.0.0.1:5173/favicon.ico:0

View File

@ -1,2 +0,0 @@
[ 221ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ http://127.0.0.1:5179/node_modules/.vite/deps/react-dom_client.js?v=eccfa23d:20102
[ 1056ms] [ERROR] Failed to load resource: the server responded with a status of 404 (Not Found) @ http://127.0.0.1:5179/favicon.ico:0

View File

@ -0,0 +1,84 @@
- 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]:
- img [ref=e7]
- generic [ref=e11]: 省市区
- button "自然地理区位" [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 自然地理区位
- button "设施类别" [ref=e17] [cursor=pointer]:
- img [ref=e18]
- generic [ref=e22]: 设施类别
- button "建筑功能" [ref=e23] [cursor=pointer]:
- img [ref=e24]
- generic [ref=e27]: 建筑功能
- button "建设阶段" [ref=e28] [cursor=pointer]:
- img [ref=e29]
- generic [ref=e34]: 建设阶段
- button "规划形式" [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e41]: 规划形式
- region "年度总费用图表" [ref=e42]:
- generic [ref=e43]:
- button "纵坐标:造价(元)" [ref=e45] [cursor=pointer]: 造价(元)
- generic [ref=e46]:
- figure "图表共有0个系列":
- generic [ref=e47]:
- img "interactive chart":
- generic:
- img
- img
- region [ref=e48]
- toolbar "标注" [ref=e49]:
- button "库" [ref=e50] [cursor=pointer]:
- generic:
- generic:
- button "树" [ref=e51] [cursor=pointer]:
- generic:
- generic:
- button "均" [ref=e52] [cursor=pointer]:
- generic:
- button "Line Tool" [disabled] [ref=e53]
- button "Text Tool" [disabled] [ref=e54]
- button "Shape Tool" [disabled] [ref=e55]
- button "Fibonacci Tool" [disabled] [ref=e56]
- button "全屏(F11)" [ref=e57] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e58]
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e59]:
- button "缩小" [disabled] [ref=e60]
- button "放大" [ref=e61] [cursor=pointer]
- button "左移" [disabled] [ref=e62]
- button "右移" [disabled] [ref=e63]
- button "重置" [disabled] [ref=e64]
- complementary "选择内容" [ref=e65]:
- tablist "选择内容切换项" [ref=e66]:
- tab "自然地理区位" [selected] [ref=e67] [cursor=pointer]
- tab "设施类别" [ref=e68] [cursor=pointer]
- tab "建筑功能" [ref=e69] [cursor=pointer]
- tab "建设阶段" [ref=e70] [cursor=pointer]
- tab "规划形式" [ref=e71] [cursor=pointer]
- generic [ref=e72]:
- generic [ref=e73]: 自然地理区位
- generic [ref=e74]: 加载中

View File

@ -0,0 +1,84 @@
- 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]:
- img [ref=e7]
- generic [ref=e11]: 省市区
- button "自然地理区位" [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 自然地理区位
- button "设施类别" [ref=e17] [cursor=pointer]:
- img [ref=e18]
- generic [ref=e22]: 设施类别
- button "建筑功能" [ref=e23] [cursor=pointer]:
- img [ref=e24]
- generic [ref=e27]: 建筑功能
- button "建设阶段" [ref=e28] [cursor=pointer]:
- img [ref=e29]
- generic [ref=e34]: 建设阶段
- button "规划形式" [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e41]: 规划形式
- region "年度总费用图表" [ref=e42]:
- generic [ref=e43]:
- button "纵坐标:造价(元)" [ref=e45] [cursor=pointer]: 造价(元)
- generic [ref=e46]:
- figure "图表共有0个系列":
- generic [ref=e47]:
- img "interactive chart":
- generic:
- img
- img
- region [ref=e48]
- toolbar "标注" [ref=e49]:
- button "库" [ref=e50] [cursor=pointer]:
- generic:
- generic:
- button "树" [ref=e51] [cursor=pointer]:
- generic:
- generic:
- button "均" [ref=e52] [cursor=pointer]:
- generic:
- button "Line Tool" [disabled] [ref=e53]
- button "Text Tool" [disabled] [ref=e54]
- button "Shape Tool" [disabled] [ref=e55]
- button "Fibonacci Tool" [disabled] [ref=e56]
- button "全屏(F11)" [ref=e57] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e58]
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e59]:
- button "缩小" [disabled] [ref=e60]
- button "放大" [ref=e61] [cursor=pointer]
- button "左移" [disabled] [ref=e62]
- button "右移" [disabled] [ref=e63]
- button "重置" [disabled] [ref=e64]
- complementary "选择内容" [ref=e65]:
- tablist "选择内容切换项" [ref=e66]:
- tab "自然地理区位" [selected] [ref=e67] [cursor=pointer]
- tab "设施类别" [ref=e68] [cursor=pointer]
- tab "建筑功能" [ref=e69] [cursor=pointer]
- tab "建设阶段" [ref=e70] [cursor=pointer]
- tab "规划形式" [ref=e71] [cursor=pointer]
- generic [ref=e72]:
- generic [ref=e73]: 自然地理区位
- generic [ref=e74]: 加载中

View File

@ -1,80 +0,0 @@
- 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]:
- img [ref=e7]
- generic [ref=e11]: 省市区
- button "自然地理区位" [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 自然地理区位
- button "设施类别" [ref=e17] [cursor=pointer]:
- img [ref=e18]
- generic [ref=e22]: 设施类别
- button "建设阶段" [ref=e23] [cursor=pointer]:
- img [ref=e24]
- generic [ref=e29]: 建设阶段
- button "规划形式" [ref=e30] [cursor=pointer]:
- img [ref=e31]
- generic [ref=e36]: 规划形式
- region "年度总费用图表" [ref=e37]:
- generic [ref=e38]:
- button "纵坐标:造价(元)" [ref=e40] [cursor=pointer]: 造价(元)
- generic [ref=e41]:
- figure "图表共有0个系列":
- generic [ref=e42]:
- img "interactive chart":
- generic:
- img
- img
- region [ref=e43]
- toolbar "标注" [ref=e44]:
- button "库" [ref=e45] [cursor=pointer]:
- generic:
- generic:
- button "树" [ref=e46] [cursor=pointer]:
- generic:
- generic:
- button "均" [ref=e47] [cursor=pointer]:
- generic:
- button "Line Tool" [disabled] [ref=e48]
- button "Text Tool" [disabled] [ref=e49]
- button "Shape Tool" [disabled] [ref=e50]
- button "Fibonacci Tool" [disabled] [ref=e51]
- button "全屏(F11)" [ref=e52] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e53]
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e54]:
- button "缩小" [disabled] [ref=e55]
- button "放大" [ref=e56] [cursor=pointer]
- button "左移" [disabled] [ref=e57]
- button "右移" [disabled] [ref=e58]
- button "重置" [disabled] [ref=e59]
- complementary "选择内容" [ref=e60]:
- tablist "选择内容切换项" [ref=e61]:
- tab "自然地理区位" [selected] [ref=e62] [cursor=pointer]
- tab "设施类别" [ref=e63] [cursor=pointer]
- tab "建设阶段" [ref=e64] [cursor=pointer]
- tab "规划形式" [ref=e65] [cursor=pointer]
- generic [ref=e66]:
- generic [ref=e67]: 自然地理区位
- generic [ref=e68]: 加载中

View File

@ -1,83 +0,0 @@
- 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]:
- img [ref=e7]
- generic [ref=e11]: 省市区
- button "自然地理区位" [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 自然地理区位
- button "设施类别" [ref=e17] [cursor=pointer]:
- img [ref=e18]
- generic [ref=e22]: 设施类别
- button "建设阶段" [ref=e23] [cursor=pointer]:
- img [ref=e24]
- generic [ref=e29]: 建设阶段
- button "规划形式" [ref=e30] [cursor=pointer]:
- img [ref=e31]
- generic [ref=e36]: 规划形式
- region "年度总费用图表" [ref=e37]:
- generic [ref=e38]:
- button "纵坐标:造价(元)" [ref=e40] [cursor=pointer]: 造价(元)
- generic [ref=e41]:
- figure "图表共有0个系列":
- generic [ref=e42]:
- img "interactive chart":
- generic:
- img
- img
- region [ref=e43]
- toolbar "标注" [ref=e44]:
- button "库" [disabled] [ref=e45] [cursor=pointer]:
- generic:
- generic:
- button "指" [disabled] [ref=e46] [cursor=pointer]:
- generic:
- generic:
- button "均" [disabled] [ref=e47] [cursor=pointer]:
- generic:
- button "Line Tool" [disabled] [ref=e48]
- button "Text Tool" [disabled] [ref=e49]
- button "Shape Tool" [disabled] [ref=e50]
- button "Fibonacci Tool" [disabled] [ref=e51]
- button "全屏(F11)" [disabled] [ref=e52] [cursor=pointer]
- button "Clear annotations" [disabled] [ref=e53]
- button "切换到表格" [disabled] [ref=e54] [cursor=pointer]:
- generic:
- generic:
- status:
- generic: 请选择右侧分类项
- toolbar "缩放" [ref=e55]:
- button "缩小" [disabled] [ref=e56]
- button "放大" [ref=e57] [cursor=pointer]
- button "左移" [disabled] [ref=e58]
- button "右移" [disabled] [ref=e59]
- button "重置" [disabled] [ref=e60]
- complementary "选择内容" [ref=e61]:
- tablist "选择内容切换项" [ref=e62]:
- tab "自然地理区位" [selected] [ref=e63] [cursor=pointer]
- tab "设施类别" [ref=e64] [cursor=pointer]
- tab "建设阶段" [ref=e65] [cursor=pointer]
- tab "规划形式" [ref=e66] [cursor=pointer]
- generic [ref=e67]:
- generic [ref=e68]: 自然地理区位
- generic [ref=e69]: Unexpected token '<', "<!doctype "... is not valid JSON

View File

@ -1,8 +0,0 @@
{
"topic_20260821-062201_c21eb2dbea49a53e": {
"stage": 1,
"userTurns": 1,
"basisHash": "10579074257f2c51",
"updatedAt": 1787293862779
}
}

View File

@ -1,3 +0,0 @@
{
"topic_20260821-062201_c21eb2dbea49a53e": 1787293321185
}

View File

@ -1,3 +0,0 @@
{
"topic_20260821-062201_c21eb2dbea49a53e": "auto"
}

View File

@ -1,3 +0,0 @@
{
"topic_20260821-062201_c21eb2dbea49a53e": "aggrid导出的时候数值不对现在…"
}

View File

@ -1,44 +0,0 @@
<!-- gitnexus:start -->
# GitNexus — Code Intelligence
This project is indexed by GitNexus as **agchart** (187 symbols, 490 relationships, 20 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
> Index stale? Run `node .gitnexus/run.cjs analyze` from the project root — it auto-selects an available runner. No `.gitnexus/run.cjs` yet? `npx gitnexus analyze` (npm 11 crash → `npm i -g gitnexus`; #1939).
## Always Do
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
- **MUST run `detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows. For regression review, compare against the default branch: `detect_changes({scope: "compare", base_ref: "main"})`.
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
- When exploring unfamiliar code, use `query({search_query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `context({name: "symbolName"})`.
- For security review, `explain({target: "fileOrSymbol"})` lists taint findings (source→sink flows; needs `analyze --pdg`).
## Never Do
- NEVER edit a function, class, or method without first running `impact` on it.
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
- NEVER rename symbols with find-and-replace — use `rename` which understands the call graph.
- NEVER commit changes without running `detect_changes()` to check affected scope.
## Resources
| Resource | Use for |
|----------|---------|
| `gitnexus://repo/agchart/context` | Codebase overview, check index freshness |
| `gitnexus://repo/agchart/clusters` | All functional areas |
| `gitnexus://repo/agchart/processes` | All execution flows |
| `gitnexus://repo/agchart/process/{name}` | Step-by-step execution trace |
## CLI
| Task | Read this skill file |
|------|---------------------|
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
<!-- gitnexus:end -->

View File

@ -1,44 +0,0 @@
<!-- gitnexus:start -->
# GitNexus — Code Intelligence
This project is indexed by GitNexus as **agchart** (187 symbols, 490 relationships, 20 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
> Index stale? Run `node .gitnexus/run.cjs analyze` from the project root — it auto-selects an available runner. No `.gitnexus/run.cjs` yet? `npx gitnexus analyze` (npm 11 crash → `npm i -g gitnexus`; #1939).
## Always Do
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
- **MUST run `detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows. For regression review, compare against the default branch: `detect_changes({scope: "compare", base_ref: "main"})`.
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
- When exploring unfamiliar code, use `query({search_query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `context({name: "symbolName"})`.
- For security review, `explain({target: "fileOrSymbol"})` lists taint findings (source→sink flows; needs `analyze --pdg`).
## Never Do
- NEVER edit a function, class, or method without first running `impact` on it.
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
- NEVER rename symbols with find-and-replace — use `rename` which understands the call graph.
- NEVER commit changes without running `detect_changes()` to check affected scope.
## Resources
| Resource | Use for |
|----------|---------|
| `gitnexus://repo/agchart/context` | Codebase overview, check index freshness |
| `gitnexus://repo/agchart/clusters` | All functional areas |
| `gitnexus://repo/agchart/processes` | All execution flows |
| `gitnexus://repo/agchart/process/{name}` | Step-by-step execution trace |
## CLI
| Task | Read this skill file |
|------|---------------------|
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
<!-- gitnexus:end -->

View File

@ -1,10 +1,10 @@
# 组团趋势图 # 建筑设施对象趋势图
这是一个基于 `React + AG Charts`组团趋势图页面,用来查看不同分类维度下的年度统计趋势,并通过右侧筛选条件联动图表结果。 这是一个基于 `React + AG Charts`建筑设施对象趋势图页面,用来查看不同分类维度下的年度统计趋势,并通过右侧筛选条件联动图表结果。
## 功能 ## 功能
- 左侧展示组团趋势图,支持最低值、最高值、平均值、中位数和数据量切换 - 左侧展示建筑设施对象趋势图,支持最低值、最高值、平均值、中位数和数据量切换
- 右侧展示分类树,支持按 `自然地理区位 / 设施类别 / 建设阶段 / 规划形式` 选择节点 - 右侧展示分类树,支持按 `自然地理区位 / 设施类别 / 建设阶段 / 规划形式` 选择节点
- 筛选条件支持 `省市区`,后端会根据 `uf_xzqy` 展开到区级 `id` 后再过滤 - 筛选条件支持 `省市区`,后端会根据 `uf_xzqy` 展开到区级 `id` 后再过滤
- 支持搜索筛选树节点,支持多条件叠加 - 支持搜索筛选树节点,支持多条件叠加

View File

@ -6,7 +6,7 @@
<title>AG Chart Service</title> <title>AG Chart Service</title>
</head> </head>
<body> <body>
<div id="ztChart"></div> <div id="sbChart"></div>
<script type="module" src="/src/main.tsx"></script> <script type="module" src="/src/main.tsx"></script>
</body> </body>
</html> </html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

View File

@ -1,14 +0,0 @@
{
"browser": {
"launchOptions": {
"headless": true,
"executablePath": "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
},
"contextOptions": {
"viewport": {
"width": 1440,
"height": 900
}
}
}
}

View File

@ -12,7 +12,7 @@ import {
} from 'ag-grid-community'; } from 'ag-grid-community';
import type { AgCartesianChartOptions } from 'ag-charts-community'; import type { AgCartesianChartOptions } from 'ag-charts-community';
import { ModuleRegistry } from 'ag-charts-community'; import { ModuleRegistry } from 'ag-charts-community';
import { Building2, CalendarRange, Construction, House, LayoutGrid, Library, LocateFixed, MapPinned, PanelRightClose, PanelRightOpen, Ruler, Waypoints } from 'lucide-react'; import { Building2, CalendarRange, Construction, House, LayoutGrid, Library, LocateFixed, MapPinned, PanelRightClose, PanelRightOpen, Ruler, SquareFunction, Waypoints } from 'lucide-react';
import { import {
AnnotationsModule, AnnotationsModule,
ContextMenuModule, ContextMenuModule,
@ -30,9 +30,9 @@ const API_BASE_URL = 'https://nest.zwgczx.com/api/v1';
// const API_BASE_URL = 'http://127.0.0.1:9089/api/v1'; // const API_BASE_URL = 'http://127.0.0.1:9089/api/v1';
const API_ROUTES = { const API_ROUTES = {
filterTree: '/zw/getBuildingFunctionCostFilterTree', filterTree: '/zw/getBuildingFacilityObjectFilterTree',
filterTreeSearch: '/zw/getBuildingFunctionCostFilterTreeSearch', filterTreeSearch: '/zw/getBuildingFacilityObjectFilterTreeSearch',
statsBatch: '/zw/getBuildingFunctionCostStatsBatch', statsBatch: '/zw/getBuildingFacilityObjectStatsBatch',
} as const; } as const;
const statisticOptions = [ const statisticOptions = [
@ -63,6 +63,7 @@ const metricShortLabels: Record<MetricKey, string> = {
const contentOptions = [ const contentOptions = [
{ key: 'geoLocation', label: '自然地理区位' }, { key: 'geoLocation', label: '自然地理区位' },
{ key: 'facilityType', label: '设施类别' }, { key: 'facilityType', label: '设施类别' },
{ key: 'buildingFunction', label: '建筑功能' },
{ key: 'constructionStage', label: '建设阶段' }, { key: 'constructionStage', label: '建设阶段' },
{ key: 'planningForm', label: '规划形式' }, { key: 'planningForm', label: '规划形式' },
] as const; ] as const;
@ -73,6 +74,7 @@ const filterOptions = [
{ key: 'region', label: '省市区', icon: MapPinned }, { key: 'region', label: '省市区', icon: MapPinned },
{ key: 'geoLocation', label: '自然地理区位', icon: LocateFixed }, { key: 'geoLocation', label: '自然地理区位', icon: LocateFixed },
{ key: 'facilityType', label: '设施类别', icon: Building2 }, { key: 'facilityType', label: '设施类别', icon: Building2 },
{ key: 'buildingFunction', label: '建筑功能', icon: SquareFunction },
{ key: 'buildingNature', label: '建筑性质', icon: House }, { key: 'buildingNature', label: '建筑性质', icon: House },
{ key: 'constructionStage', label: '建设阶段', icon: Construction }, { key: 'constructionStage', label: '建设阶段', icon: Construction },
{ key: 'planningForm', label: '规划形式', icon: LayoutGrid }, { key: 'planningForm', label: '规划形式', icon: LayoutGrid },
@ -114,6 +116,17 @@ const contentTreeConfigs = {
fieldid: '305426', fieldid: '305426',
defaultExpandedLevel: 3, defaultExpandedLevel: 3,
}, },
buildingFunction: {
endpoint: '/api/public/browser/data/256',
treeid: '95004',
fieldid: '305919',
defaultExpandedLevel: 0,
browserParams: {
workflowid: '182032',
wfid: '182032',
billid: '-1817',
},
},
constructionStage: { constructionStage: {
endpoint: '/api/public/browser/data/256', endpoint: '/api/public/browser/data/256',
treeid: '94007', treeid: '94007',
@ -135,8 +148,16 @@ const buildingNatureBrowserConfig = {
fieldid: '316390', fieldid: '316390',
searchbrowserid: '36523', searchbrowserid: '36523',
browserParams: { browserParams: {
requestid: '', isshowsearchtab: '1', workflowid: '182028', wfid: '182028', billid: '-1815', requestid: '',
f_weaver_belongto_userid: '', f_weaver_belongto_usertype: '', wf_isagent: '', wf_beagenter: '', wfCreater: '', isshowsearchtab: '1',
workflowid: '182028',
wfid: '182028',
billid: '-1815',
f_weaver_belongto_userid: '',
f_weaver_belongto_usertype: '',
wf_isagent: '',
wf_beagenter: '',
wfCreater: '',
}, },
} as const; } as const;
@ -180,6 +201,7 @@ type MetricKey = (typeof metricOptions)[number]['key'];
type ContentKey = (typeof contentOptions)[number]['key']; type ContentKey = (typeof contentOptions)[number]['key'];
type FilterKey = (typeof filterOptions)[number]['key']; type FilterKey = (typeof filterOptions)[number]['key'];
type RangeFilterKey = Extract<FilterKey, 'time' | 'area'>; type RangeFilterKey = Extract<FilterKey, 'time' | 'area'>;
type GroupKey = 'year';
type ChartViewKey = 'trend' | 'pivot'; type ChartViewKey = 'trend' | 'pivot';
type ApiBuildingFunctionStat = { type ApiBuildingFunctionStat = {
group_key?: string | number | null; group_key?: string | number | null;
@ -607,10 +629,6 @@ function isDefaultTemplateSelection(nodes: SelectedFilterNode[]) {
return nodes.length === 1 && nodes[0]?.id === defaultTemplateFilterNode.id; return nodes.length === 1 && nodes[0]?.id === defaultTemplateFilterNode.id;
} }
function isSameFilterSelection(a: SelectedFilterNode[], b: SelectedFilterNode[]) {
return a.length === b.length && a.every((node, index) => node.id === b[index]?.id);
}
function getDefaultIndicatorTreeFilterNodes(nodes: TreeNode[]): SelectedFilterNode[] { function getDefaultIndicatorTreeFilterNodes(nodes: TreeNode[]): SelectedFilterNode[] {
const defaultNode = nodes[0]; const defaultNode = nodes[0];
if (!defaultNode) return []; if (!defaultNode) return [];
@ -749,6 +767,7 @@ function App() {
const treeInitialLoadStartedRef = useRef<Record<ContentKey, boolean>>({ const treeInitialLoadStartedRef = useRef<Record<ContentKey, boolean>>({
geoLocation: false, geoLocation: false,
facilityType: false, facilityType: false,
buildingFunction: false,
constructionStage: false, constructionStage: false,
planningForm: false, planningForm: false,
}); });
@ -758,6 +777,7 @@ function App() {
region: false, region: false,
geoLocation: false, geoLocation: false,
facilityType: false, facilityType: false,
buildingFunction: false,
buildingNature: false, buildingNature: false,
constructionStage: false, constructionStage: false,
planningForm: false, planningForm: false,
@ -766,6 +786,7 @@ function App() {
}); });
const [statisticKey, setStatisticKey] = useState<StatisticKey>('avgValue'); const [statisticKey, setStatisticKey] = useState<StatisticKey>('avgValue');
const [metricKey, setMetricKey] = useState<MetricKey>('cost'); const [metricKey, setMetricKey] = useState<MetricKey>('cost');
const [groupKey, setGroupKey] = useState<GroupKey>('year');
const [chartViewKey, setChartViewKey] = useState<ChartViewKey>('trend'); const [chartViewKey, setChartViewKey] = useState<ChartViewKey>('trend');
const [workspaceFullscreen, setWorkspaceFullscreen] = useState(false); const [workspaceFullscreen, setWorkspaceFullscreen] = useState(false);
const [rightPanelCollapsed, setRightPanelCollapsed] = useState(false); const [rightPanelCollapsed, setRightPanelCollapsed] = useState(false);
@ -776,18 +797,21 @@ function App() {
const [treeByContent, setTreeByContent] = useState<Record<ContentKey, TreeNode[]>>({ const [treeByContent, setTreeByContent] = useState<Record<ContentKey, TreeNode[]>>({
geoLocation: [], geoLocation: [],
facilityType: [], facilityType: [],
buildingFunction: [],
constructionStage: [], constructionStage: [],
planningForm: [], planningForm: [],
}); });
const [treeLoadingByContent, setTreeLoadingByContent] = useState<Record<ContentKey, boolean>>({ const [treeLoadingByContent, setTreeLoadingByContent] = useState<Record<ContentKey, boolean>>({
geoLocation: false, geoLocation: false,
facilityType: false, facilityType: false,
buildingFunction: false,
constructionStage: false, constructionStage: false,
planningForm: false, planningForm: false,
}); });
const [treeErrorByContent, setTreeErrorByContent] = useState<Record<ContentKey, string | null>>({ const [treeErrorByContent, setTreeErrorByContent] = useState<Record<ContentKey, string | null>>({
geoLocation: null, geoLocation: null,
facilityType: null, facilityType: null,
buildingFunction: null,
constructionStage: null, constructionStage: null,
planningForm: null, planningForm: null,
}); });
@ -804,6 +828,7 @@ function App() {
region: [], region: [],
geoLocation: [], geoLocation: [],
facilityType: [], facilityType: [],
buildingFunction: [],
buildingNature: [], buildingNature: [],
constructionStage: [], constructionStage: [],
planningForm: [], planningForm: [],
@ -816,6 +841,7 @@ function App() {
region: false, region: false,
geoLocation: false, geoLocation: false,
facilityType: false, facilityType: false,
buildingFunction: false,
buildingNature: false, buildingNature: false,
constructionStage: false, constructionStage: false,
planningForm: false, planningForm: false,
@ -828,6 +854,7 @@ function App() {
region: null, region: null,
geoLocation: null, geoLocation: null,
facilityType: null, facilityType: null,
buildingFunction: null,
buildingNature: null, buildingNature: null,
constructionStage: null, constructionStage: null,
planningForm: null, planningForm: null,
@ -840,6 +867,7 @@ function App() {
region: [], region: [],
geoLocation: [], geoLocation: [],
facilityType: [], facilityType: [],
buildingFunction: [],
buildingNature: [], buildingNature: [],
constructionStage: [], constructionStage: [],
planningForm: [], planningForm: [],
@ -852,6 +880,7 @@ function App() {
region: false, region: false,
geoLocation: false, geoLocation: false,
facilityType: false, facilityType: false,
buildingFunction: false,
buildingNature: false, buildingNature: false,
constructionStage: false, constructionStage: false,
planningForm: false, planningForm: false,
@ -864,6 +893,7 @@ function App() {
region: null, region: null,
geoLocation: null, geoLocation: null,
facilityType: null, facilityType: null,
buildingFunction: null,
buildingNature: null, buildingNature: null,
constructionStage: null, constructionStage: null,
planningForm: null, planningForm: null,
@ -876,6 +906,7 @@ function App() {
region: [], region: [],
geoLocation: [], geoLocation: [],
facilityType: [], facilityType: [],
buildingFunction: [],
buildingNature: [], buildingNature: [],
constructionStage: [], constructionStage: [],
planningForm: [], planningForm: [],
@ -894,6 +925,7 @@ function App() {
region: 0, region: 0,
geoLocation: 0, geoLocation: 0,
facilityType: 0, facilityType: 0,
buildingFunction: 0,
buildingNature: 0, buildingNature: 0,
constructionStage: 0, constructionStage: 0,
planningForm: 0, planningForm: 0,
@ -1174,7 +1206,7 @@ function App() {
}, []); }, []);
const exportPivotGrid = useCallback(() => { const exportPivotGrid = useCallback(() => {
pivotGridApiRef.current?.exportDataAsCsv({ pivotGridApiRef.current?.exportDataAsCsv({
fileName: '组团统计表.csv', fileName: '建筑设施对象统计表.csv',
}); });
setGridContextMenuPosition(null); setGridContextMenuPosition(null);
}, []); }, []);
@ -1213,7 +1245,6 @@ function App() {
return { ...current, indicatorTree: defaultIndicatorTreeNodes }; return { ...current, indicatorTree: defaultIndicatorTreeNodes };
}); });
}, [defaultIndicatorTreeNodes]); }, [defaultIndicatorTreeNodes]);
const appliedFilterPayload = useMemo( const appliedFilterPayload = useMemo(
() => filterOptions () => filterOptions
.filter((option) => option.key !== 'time') .filter((option) => option.key !== 'time')
@ -1224,6 +1255,7 @@ function App() {
.filter((filter) => filter.nodes.length > 0), .filter((filter) => filter.nodes.length > 0),
[ [
appliedFilters.area, appliedFilters.area,
appliedFilters.buildingFunction,
appliedFilters.buildingNature, appliedFilters.buildingNature,
appliedFilters.constructionStage, appliedFilters.constructionStage,
appliedFilters.facilityType, appliedFilters.facilityType,
@ -1251,6 +1283,7 @@ function App() {
} }
const treeParams = { const treeParams = {
...browserTreeDefaults, ...browserTreeDefaults,
...('browserParams' in config ? config.browserParams : {}),
treeid: config.treeid, treeid: config.treeid,
cube_treeid: config.treeid, cube_treeid: config.treeid,
fieldid: config.fieldid, fieldid: config.fieldid,
@ -1292,17 +1325,54 @@ function App() {
searchbrowserid: buildingNatureBrowserConfig.searchbrowserid, searchbrowserid: buildingNatureBrowserConfig.searchbrowserid,
fieldid: buildingNatureBrowserConfig.fieldid, fieldid: buildingNatureBrowserConfig.fieldid,
}; };
const requestOptions: RequestInit = { credentials: 'include', signal, headers: { 'X-Requested-With': 'XMLHttpRequest' } }; const requestOptions: RequestInit = {
credentials: 'include',
signal,
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
};
if (!nodeId) { if (!nodeId) {
const conditionResponse = await fetch(`${buildingNatureBrowserConfig.conditionEndpoint}?${buildQuery(treeParams)}`, requestOptions); const conditionResponse = await fetch(
if (!conditionResponse.ok) throw new Error(`建筑性质浏览条件加载失败HTTP ${conditionResponse.status}`); `${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 const dataParams = nodeId
? { ...treeParams, type: '2', id: nodeId, isVirtual: '' } ? {
: { ...treeParams, pageSize: '10', current: '1', min: '1', max: '10' }; ...treeParams,
const response = await fetch(`${buildingNatureBrowserConfig.dataEndpoint}?${buildQuery(dataParams)}`, requestOptions); type: '2',
if (!response.ok) throw new Error(`建筑性质浏览数据加载失败HTTP ${response.status}`); id: nodeId,
return normalizeTreeRows(pickArray(await response.json())); 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) => ({ const normalizeBackendTree = (nodes: TreeNode[]): TreeNode[] => nodes.map((node) => ({
@ -1567,6 +1637,10 @@ function App() {
}); });
}; };
useEffect(() => {
ensureFilterTreeLoaded('indicatorTree');
}, [selectedTemplateId]);
const openFilterModal = (filterKey: FilterKey) => { const openFilterModal = (filterKey: FilterKey) => {
setFilterModalKey(filterKey); setFilterModalKey(filterKey);
if (isRangeFilterKey(filterKey)) { if (isRangeFilterKey(filterKey)) {
@ -1589,10 +1663,6 @@ function App() {
} }
}; };
useEffect(() => {
ensureFilterTreeLoaded('indicatorTree');
}, [selectedTemplateId]);
const closeFilterModal = () => { const closeFilterModal = () => {
if (filterModalKey) { if (filterModalKey) {
filterSearchRequestSeqRef.current[filterModalKey] += 1; filterSearchRequestSeqRef.current[filterModalKey] += 1;
@ -1816,7 +1886,7 @@ function App() {
: isIndicatorTreeFilterKey(filterKey) : isIndicatorTreeFilterKey(filterKey)
? defaultIndicatorTreeNodes ? defaultIndicatorTreeNodes
: []; : [];
if (isSameFilterSelection(appliedFilters[filterKey], nextNodes)) { if (appliedFilters[filterKey].length === nextNodes.length && appliedFilters[filterKey].every((node, index) => node.id === nextNodes[index]?.id)) {
return; return;
} }
setAppliedFilters((current) => { setAppliedFilters((current) => {
@ -1920,6 +1990,13 @@ function App() {
}); });
}, [activeContentKey, treeByContent]); }, [activeContentKey, treeByContent]);
useEffect(() => {
if (filterModalKey !== 'indicatorTree') return;
if (draftFilterNodes.length > 0) return;
if (defaultIndicatorTreeNodes.length === 0) return;
setDraftFilterNodes(defaultIndicatorTreeNodes);
}, [defaultIndicatorTreeNodes, draftFilterNodes.length, filterModalKey]);
useEffect(() => { useEffect(() => {
const controller = new AbortController(); const controller = new AbortController();
@ -1937,6 +2014,13 @@ function App() {
setLoadingHint('正在加载数据'); setLoadingHint('正在加载数据');
setLoadError(null); setLoadError(null);
try { try {
const hasAnyMissingNode = selectedContentNodes.some((node) => !chartDataBySelection[getSelectionKey(node.contentKey, node.id)]);
if (selectedContentNodes.length > 0 && !hasAnyMissingNode && chartSummaryBySelection[overallSummaryKey]) {
setLoading(false);
setLoadingHint('');
return;
}
const response = await fetch(`${API_BASE_URL}${API_ROUTES.statsBatch}`, { const response = await fetch(`${API_BASE_URL}${API_ROUTES.statsBatch}`, {
method: 'POST', method: 'POST',
signal: controller.signal, signal: controller.signal,
@ -1944,7 +2028,7 @@ function App() {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({ body: JSON.stringify({
groupBy: 'year', groupBy: groupKey,
metric: requestMetricKey, metric: requestMetricKey,
templateId: selectedTemplateId, templateId: selectedTemplateId,
filters: appliedFilterPayload, filters: appliedFilterPayload,
@ -1965,9 +2049,7 @@ function App() {
const summaries = (payload.data ?? []) const summaries = (payload.data ?? [])
.filter((item) => item.key && item.summary) .filter((item) => item.key && item.summary)
.map((item) => [item.key as string, normalizeStat(item.summary as ApiBuildingFunctionStat)] as const); .map((item) => [item.key as string, normalizeStat(item.summary as ApiBuildingFunctionStat)] as const);
const overallSummary = (payload.data ?? []) const overallSummary = (payload.data ?? []).find((item) => item.key === overallSummaryKey)?.summary;
.find((item) => item.key === overallSummaryKey)?.summary
?? (payload.data ?? []).find((item) => item.summary)?.summary;
setChartDataBySelection(Object.fromEntries(results)); setChartDataBySelection(Object.fromEntries(results));
setChartSummaryBySelection({ setChartSummaryBySelection({
...Object.fromEntries(summaries), ...Object.fromEntries(summaries),
@ -1989,7 +2071,7 @@ function App() {
return () => { return () => {
controller.abort(); controller.abort();
}; };
}, [appliedFilterPayload, chartQueryVersion, metricKey, requestMetricKey, selectedContentNodes, selectedTemplateId]); }, [appliedFilterPayload, chartQueryVersion, groupKey, metricKey, requestMetricKey, selectedContentNodes, selectedTemplateId]);
useEffect(() => { useEffect(() => {
const frame = chartFrameRef.current; const frame = chartFrameRef.current;
@ -2028,7 +2110,6 @@ function App() {
indicatorButton.classList.add('chart-indicator-button'); indicatorButton.classList.add('chart-indicator-button');
enableCustomToolbarButton(indicatorButton); enableCustomToolbarButton(indicatorButton);
setButtonAttribute(indicatorButton, 'aria-expanded', String(filterModalKey === 'indicatorTree')); setButtonAttribute(indicatorButton, 'aria-expanded', String(filterModalKey === 'indicatorTree'));
setButtonAttribute(indicatorButton, 'title', '指标树形');
} }
const button = getFullscreenButton(); const button = getFullscreenButton();
@ -2169,7 +2250,7 @@ function App() {
}, [chartViewKey, fitPivotGridColumns, metricKey, pivotGridRowData.length, rightPanelCollapsed]); }, [chartViewKey, fitPivotGridColumns, metricKey, pivotGridRowData.length, rightPanelCollapsed]);
const chartOptions = useMemo<AgCartesianChartOptions>(() => { const chartOptions = useMemo<AgCartesianChartOptions>(() => {
const trendData = groupNames.map((groupName) => { const visibleData = groupNames.map((groupName) => {
const row: Record<string, string | number | null> = { groupName }; const row: Record<string, string | number | null> = { groupName };
selectedContentNodes.forEach((node) => { selectedContentNodes.forEach((node) => {
const datum = visibleChartDataBySelection[getSelectionKey(node.contentKey, node.id)]?.find((item) => item.groupName === groupName); const datum = visibleChartDataBySelection[getSelectionKey(node.contentKey, node.id)]?.find((item) => item.groupName === groupName);
@ -2177,32 +2258,6 @@ function App() {
}); });
return row; return row;
}); });
const series = selectedContentNodes.map((node) => ({
type: 'line' as const,
xKey: 'groupName',
yKey: getSeriesValueKey(node.contentKey, node.id),
yName: `${node.label} ${seriesValueLabel}`,
stroke: node.color,
strokeWidth: 2,
connectMissingData: true,
marker: {
enabled: true,
fill: node.color,
stroke: node.color,
size: 5,
},
interpolation: {
type: 'smooth' as const,
},
tooltip: {
renderer: ({ datum, yKey, yName }: { datum: Record<string, unknown>; yKey: string; yName?: string }) => ({
title: yName ?? '',
data: [
{ label: selectedMetric.label, value: formatChartValue(Number(datum[yKey]), metricKey) },
],
}),
},
}));
return { return {
theme: { theme: {
@ -2232,7 +2287,7 @@ function App() {
bottom: 18, bottom: 18,
left: 24, left: 24,
}, },
data: trendData, data: visibleData,
zoom: { zoom: {
enabled: true, enabled: true,
anchorPointX: 'pointer', anchorPointX: 'pointer',
@ -2315,7 +2370,32 @@ function App() {
] as unknown as NonNullable<NonNullable<AgCartesianChartOptions['annotations']>['toolbar']>['buttons']), ] as unknown as NonNullable<NonNullable<AgCartesianChartOptions['annotations']>['toolbar']>['buttons']),
}, },
}, },
series, series: selectedContentNodes.map((node) => ({
type: 'line',
xKey: 'groupName',
yKey: getSeriesValueKey(node.contentKey, node.id),
yName: `${node.label} ${seriesValueLabel}`,
stroke: node.color,
strokeWidth: 2,
connectMissingData: true,
marker: {
enabled: true,
fill: node.color,
stroke: node.color,
size: 5,
},
interpolation: {
type: 'smooth',
},
tooltip: {
renderer: ({ datum, yKey, yName }) => ({
title: yName,
data: [
{ label: selectedMetric.label, value: formatChartValue(Number(datum[yKey]), metricKey) },
],
}),
},
})),
axes: { axes: {
x: { x: {
type: 'category', type: 'category',
@ -2390,6 +2470,7 @@ function App() {
statisticKey, statisticKey,
visibleChartDataBySelection, visibleChartDataBySelection,
]); ]);
const renderMetricSwitcher = (variant: 'chart' | 'grid') => ( const renderMetricSwitcher = (variant: 'chart' | 'grid') => (
<div className={`metric-switcher metric-switcher--${variant}`}> <div className={`metric-switcher metric-switcher--${variant}`}>
<button <button
@ -2473,6 +2554,7 @@ function App() {
region: [], region: [],
geoLocation: [], geoLocation: [],
facilityType: [], facilityType: [],
buildingFunction: [],
buildingNature: [], buildingNature: [],
constructionStage: [], constructionStage: [],
planningForm: [], planningForm: [],

View File

@ -2,8 +2,6 @@ import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client'; import { createRoot } from 'react-dom/client';
import { AllCommunityModule, ModuleRegistry } from 'ag-charts-community'; import { AllCommunityModule, ModuleRegistry } from 'ag-charts-community';
import App from './App'; import App from './App';
import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-quartz.css';
import './styles.css'; import './styles.css';
ModuleRegistry.registerModules([AllCommunityModule]); ModuleRegistry.registerModules([AllCommunityModule]);
@ -14,7 +12,7 @@ declare global {
} }
} }
const chartContainerId = 'ztChart'; const chartContainerId = 'sbChart';
const getRootRegistry = () => { const getRootRegistry = () => {
window.__chartReactRoots ??= new WeakMap<Element, ReturnType<typeof createRoot>>(); window.__chartReactRoots ??= new WeakMap<Element, ReturnType<typeof createRoot>>();

View File

@ -64,7 +64,7 @@ button {
position: relative; position: relative;
z-index: 1; z-index: 1;
display: grid; display: grid;
grid-template-columns: minmax(0, 7fr) minmax(320px, 3fr); grid-template-columns: minmax(540px, 52vw) 1fr;
grid-template-rows: auto minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr);
gap: 12px 28px; gap: 12px 28px;
height: 100vh; height: 100vh;
@ -251,7 +251,7 @@ button {
position: relative; position: relative;
z-index: 10; z-index: 10;
display: grid; display: grid;
grid-template-columns: minmax(0, 7fr) minmax(320px, 3fr); grid-template-columns: minmax(540px, 52vw) 1fr;
grid-template-rows: auto minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr);
gap: 12px 28px; gap: 12px 28px;
width: 100vw; width: 100vw;
@ -413,7 +413,7 @@ button {
font-size: 15px; font-size: 15px;
font-weight: 600; font-weight: 600;
line-height: 20px; line-height: 20px;
overflow: hidden; overflow: visible;
pointer-events: none; pointer-events: none;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;

View File

@ -1 +1 @@
$ vite --host 0.0.0.0 --port "5173" $ vite --host 0.0.0.0 --port "5174"

View File

@ -1,8 +1,8 @@
VITE v7.3.2 ready in 303 ms VITE v7.3.2 ready in 306 ms
➜ Local: http://localhost:5173/ ➜ Local: http://localhost:5174/
➜ Network: http://100.106.162.120:5173/ ➜ Network: http://100.106.162.120:5174/
➜ Network: http://192.168.1.155:5173/ ➜ Network: http://192.168.1.155:5174/
➜ Network: http://172.31.112.1:5173/ ➜ Network: http://172.31.112.1:5174/
 ➜ press h + enter to show help  ➜ press h + enter to show help

View File

@ -1,5 +1,6 @@
VITE v7.3.2 ready in 283 ms VITE v7.3.2 ready in 307 ms
➜ Local: http://127.0.0.1:5173/ ➜ Local: http://127.0.0.1:5173/
 ➜ press h + enter to show help  ➜ press h + enter to show help
16:10:18 [vite] (client) hmr update /src/App.tsx